import {Stream, Transform, Readable, Writable, ReadableStream } from 'ts-stream' type Chunker = (size: number) => Transform> const chunker: Chunker = (size: number) => (r: Readable, w: Writable>) => { var buffer: T[] = new Array() r.result().then(_ => { if (buffer.length > 0) { w.write(buffer) } w.end() }) r.forEach(s => { buffer.push(s) if (buffer.length === size) { w.write(buffer) buffer = [] } }) } export type Sink = (s: ReadableStream) => Promise declare module './stream' { interface Stream { chunk(size: number): ReadableStream> sink(sink: Sink): Promise } interface ReadableStream { chunk(size: number): ReadableStream> sink(sink: Sink): Promise } } // Hack Stream.prototype.chunk = function (size: number) { return this.transform(chunker(size)) } Stream.prototype.sink = function(sink) { return sink(this) }