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
- Un stream de lectura emite trozos; el iterador async los consume.
pipelinepropaga los errores y cierra todo.- Los streams son la razón de que Node procese archivos más grandes que la memoria.
Palabras clave y builtins usados aquí
awaitconstforfromimportletof
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.
Paso 1 de 2 en Streams y líneas; paso 5 de 18 en Node.js.