Problem Statement
Design a streaming file copy handling backpressure; show types for pipe vs manual read/write with drain.
Explanation
Prefer `readable.pipe(writable)` for simplicity—Node handles backpressure. For manual control, pause when `write()` returns false and resume on `drain`. Always handle `error` and `close`.
Code Solution
SolutionRead Only
import { createReadStream, createWriteStream } from 'node:fs';
import { ReadStream, WriteStream } from 'node:fs';
function copyPipe(src: string, dst: string) {
const r: ReadStream = createReadStream(src);
const w: WriteStream = createWriteStream(dst);
r.pipe(w).on('error', console.error);
}
function copyManual(src: string, dst: string) {
const r: ReadStream = createReadStream(src);
const w: WriteStream = createWriteStream(dst);
r.on('data', (chunk: Buffer) => {
const canContinue = w.write(chunk);
if (!canContinue) r.pause();
});
w.on('drain', () => r.resume());
r.on('end', () => w.end());
r.on('error', e => w.destroy(e));
w.on('error', e => r.destroy(e));
}