Transform Lines in a Readable Stream

Process a text stream line by line with a transform, keeping partial chunks buffered so splitting on newlines does not corrupt records.

JavascriptCli Tooling

Code

snippet
import { Transform } from "node:stream";

export function createLineTransformer(handler) {
  let buffer = "";
  return new Transform({
    transform(chunk, _encoding, callback) {
      buffer += chunk.toString("utf8");
      let index;
      while ((index = buffer.indexOf("\n")) !== -1) {
        const line = buffer.slice(0, index);
        buffer = buffer.slice(index + 1);
        this.push(handler(line) + "\n");
      }
      callback();
    },
    flush(callback) {
      if (buffer.length > 0) this.push(handler(buffer));
      callback();
    },
  });
}