Streams memungkinkan kamu memproses data secara bertahap (chunk by chunk) tanpa harus memuat semuanya ke memori.
4 tipe Stream di Node.js:
- Readable — sumber data (membaca file, HTTP request)
- Writable — tujuan data (menulis file, HTTP response)
- Duplex — bisa baca dan tulis (TCP socket)
- Transform — ubah data saat melewati stream (kompresi, enkripsi)
Membaca file besar dengan Stream:
import { createReadStream } from "fs";
const stream = createReadStream("file-besar.csv", { encoding: "utf-8" });
stream.on("data", (chunk) => {
console.log("Chunk diterima:", chunk.length, "bytes");
});
stream.on("end", () => {
console.log("Selesai membaca file");
});
stream.on("error", (err) => {
console.error("Error:", err.message);
});
pipe() — menghubungkan stream:
import { createReadStream, createWriteStream } from "fs";
import { createGzip } from "zlib";
// Baca file → kompresi → tulis file baru
createReadStream("input.txt")
.pipe(createGzip())
.pipe(createWriteStream("input.txt.gz"));
Buffer — data binary mentah:
// Buat Buffer dari string
const buf = Buffer.from("Halo Dunia", "utf-8");
console.log(buf); // <Buffer 48 61 6c 6f 20 44 75 6e 69 61>
console.log(buf.toString()); // "Halo Dunia"
console.log(buf.length); // 10 bytes
// Buffer.alloc — buat buffer kosong
const emptyBuf = Buffer.alloc(1024); // 1KB buffer
Backpressure — saat consumer lebih lambat dari producer:
const readable = createReadStream("huge-file.dat");
const writable = createWriteStream("output.dat");
readable.on("data", (chunk) => {
const canWrite = writable.write(chunk);
if (!canWrite) {
readable.pause(); // Pause jika buffer penuh
}
});
writable.on("drain", () => {
readable.resume(); // Lanjutkan setelah buffer kosong
});
Streaming HTTP response:
app.get("/download", (req, res) => {
const stream = createReadStream("large-file.zip");
res.setHeader("Content-Type", "application/octet-stream");
stream.pipe(res); // Langsung stream ke client
});
Kapan pakai Streams:
- File besar (CSV, video, log)
- Upload/download file
- Transformasi data real-time
- Menghindari memory overflow