typestar

Streams en JavaScript

Leer un archivo por trozos, y el pipeline que conecta las etapas.

import { createReadStream, createWriteStream } from "node:fs";
import { mkdtemp, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { pipeline } from "node:stream/promises";
import { Transform } from "node:stream";

const dir = await mkdtemp(join(tmpdir(), "stream-"));
const source = join(dir, "in.txt");
await writeFile(source, "one\ntwo\nthree\n");

let bytes = 0;
for await (const chunk of createReadStream(source, { highWaterMark: 4 })) {
  bytes += chunk.length;
}
console.log("read", bytes, "bytes in chunks");

const upper = new Transform({
  transform(chunk, _encoding, done) {
    done(null, chunk.toString().toUpperCase());
  },
});
await pipeline(createReadStream(source), upper,
               createWriteStream(join(dir, "out.txt")));
console.log("piped");

Cómo funciona

  1. Un stream de lectura emite trozos; el iterador async los consume.
  2. pipeline propaga los errores y cierra todo.
  3. Los streams son la razón de que Node procese archivos más grandes que la memoria.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
25
Caracteres a escribir
806
Tokens
185
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 106 segundos.

Escribe este fragmento

Paso 1 de 2 en Streams y líneas; paso 5 de 18 en Node.js.

← Anterior Siguiente →