Streams & Buffers — Node.js

Streams memungkinkan kamu memproses data secara bertahap (chunk by chunk) tanpa harus memuat semuanya ke memori. 4 tipe Stream di Node.js: Readable — sumber dat

Streams memungkinkan kamu memproses data secara bertahap (chunk by chunk) tanpa harus memuat semuanya ke memori.

4 tipe Stream di Node.js:

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:

Yang akan kamu pelajari