- From: Ken Cooper <notifications@github.com>
- Date: Sun, 08 Mar 2020 09:30:07 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/issues/1030@github.com>
I'm needing a 'splitter' WritableStream that divvies input based on some criteria, sequentially generating multiple output ReadableStreams, each created by a factory function that gets called when the input calls for it. The specific scenario is a log file splitter, which splits a readable based on an input pattern such that anytime the pattern is seen, subsequent chunks are available from a new ReadableStream that after some transforms ultimately pipesTo a writable file stream (output1.log, output2.log, etc.). A usage example of the API I had in mind looks something like this: ``` let counter = 0; readable.pipeTo(new WritableStream(new StreamSplitter( (chunk: string) => { return string.includes(thePattern); }, () => { counter++; return new ReadableStream() .pipeThrough(createMyRemainingTransforms()) .pipeTo(createMyWritableFileStream(counter); } ))); ``` First, is there a better approach to this? And second, I'm scratching my head implementing StreamSplitter. My thought was to create it something like this, but I'm stuck on how to create a writable/readable pair such that writes to a writer are automatically forwarded to the readable: ``` export class StreamSplitter implements UnderlyingSink { private _writable: WritableStream; constructor(readonly shouldSplit: (chunk:any) => boolean, readonly createReadable: () => ReadableStream) { } private createNewReadable() { if (this._writable) { this._writable.getWriter().close(); } const readable = this.createReadable(); // ??? // How do we create a writable and readable pair // such that every write to the writable goes to the readable? } start(controller: any) { this.createNewReadable(); } write(chunk: any, controller: any) { if (this.shouldSplit(chunk)) { this.createNewReadable(); } this._writable.getWriter().write(chunk); } close() { this._writable.getWriter().close(); } abort(error: any) { this._writable.getWriter().abort(); } } ``` Any thoughts? Love the piping metaphor, but still very confused. -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/whatwg/streams/issues/1030
Received on Sunday, 8 March 2020 16:30:21 UTC