[whatwg/streams] Possible to undo .pipeTo()? (#1055)

Originally asked on StackOverflow several days ago: https://stackoverflow.com/q/62814526/4896937


`readableStream.pipeTo(writableStream)` is a neat way of piping a `ReadableStream` to a `WritableStream`. This would appear to be more convenient than obtaining `readableStream.getReader()` and manually gluing it to `writableStream.getWriter()` or directly to underlying functionality.

I have a use case where I am provided a `ReadableStream` object which may eventually need to "go away" and be replaced by a new `ReadableStream` object. It would be nice to use a single custom `WritableStream` to wrap the functionality which these `ReadableStream` objects interface with and pipe them together for as long as needed, but have not found how to "undo" the piping process.

**Q: Is it possible to "undo"/"break"/"teardown" a pipe created with `.pipeTo()`, or are pipes "permanent" and not appropriate for this use case?**

Example using [Serial API](https://wicg.github.io/serial/), where I would like to be able to call `doConnectPort()` and then `doDisconnectPort()` repeatedly:

``` lang-js
var customWritable = new WritableStream(…);
var port;

async function doConnectPort() {
  port = await navigator.serial.requestPort();
  await port.open({ baudrate: …});
  await port.readable.pipeTo(customWritable);
}

async function doDisconnectPort() {
  // What to do here? Can't close the port yet—port.readable is still locked!
  await port.close();
}
```

Currently, I manually glue things together and clean up when it's time to disconnect the port:

``` lang-js
var port;
var portReader;

async function doConnectPort() {
  port = await navigator.serial.requestPort();
  await port.open({ baudrate: …});
  portReader = port.readable.getReader();
  while (true) {
    const { value, done } = await portReader.read();
    if (done) {
      break;
    }
    // do something with value
  }
}

async function doDisconnectPort() {
  await portReader.cancel();
  await portReader.releaseLock();
  await port.close();
}
```

-- 
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/1055

Received on Thursday, 16 July 2020 17:15:38 UTC