Re: [whatwg/streams] 'Splitter' stream? (#1030)

A bit late to the party, but I gave it a go. 😁

This is basically a regular pipe loop, but the `writer` can be switched out in the middle.
```javascript
let counter = 0;
let readable = new ReadableStream(/* ... */); // this is probably an input argument
let writable = createOutputStream(counter);
let reader = readable.getReader();
let writer = writable.getWriter();
try {
  while (true) {
    await writer.ready;
    const { done, value } = await reader.read();
    if (done) {
      // all chunks have been read, we're done
      writer.close();
      break;
    }
    if (shouldSplit(value)) {
      // create and switch to a new output stream
      writer.close().catch(() => {});
      writer.releaseLock();
      counter++;
      writable = createOutputStream(counter);
      writer = writable.getWriter();
    }
    // write chunk to current output stream
    writer.write(value).catch(() => {});
  }
} catch (e) {
  // read or write failed, propagate to the other end
  reader.cancel(e).catch(() => {});
  writer.abort(e).catch(() => {});
} finally {
  // just in case someone else wants to use the readable afterwards
  reader.releaseLock();
  writer.releaseLock();
}

function shouldSplit(chunk) {
  return string.includes(thePattern);
}

function createOutputStream(counter) {
  const transform = new TransformStream();
  transform.readable
    .pipeThrough(createMyRemainingTransforms())
    .pipeTo(createMyWritableFileStream(counter));
  return transform.writable;
  // equivalent, but less obvious:
  const { readable, writable } = createMyRemainingTransforms();
  readable.pipeTo(createMyWritableFileStream(counter));
  return writable;
}
```
There's probably a way to replace the loop with some clever `.pipeTo()` calls, but I'll leave that as an exercise for the reader. 😛

-- 
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#issuecomment-688861815

Received on Tuesday, 8 September 2020 13:22:13 UTC