Re: [whatwg/streams] Transferable streams: the double transfer problem (#1063)

left a ball of roller coster and created more issues thats need to be fixed, don't sound like an easy task to write spec and working cross multiple threads and pipes 😅 

so here is rough workaround for those who stubble up on this issue and seeks for a solution that works right now that I myself have adapted into one of my libraries 

<details>
<summary>MessageChannel solution</summary>

```js
// this method pass the readableStream into a messageChannel in order to create a more direct communication

var worker = new Worker(`data:text/javascript,onmessage = evt => postMessage(evt.data, [evt.data]);`);
var rs = new ReadableStream({
  start(c) {
    c.enqueue('a')
    c.enqueue('b')
    c.enqueue('c')
    c.close()
  }
})
// send the transferable readableStream
// to a messageChannel port
var mc = new MessageChannel()
mc.port1.postMessage(rs, [rs])
mc.port1.close()
// post the port instead of the transfered stream
worker.postMessage(mc.port2, [mc.port2])
worker.onmessage = evt => { 
  var port = evt.data
  // now you can terminate the worker since you now got a messageChannel port that you can listen to instead.
  // the web worker don't have anything to do with the transfered readableStream anymore
  worker.terminate()
  port.onmessage = evt => {
    port.close()
    port.onmessage = null
    // sucess
    evt.data.pipeTo(new WritableStream({
      write(x) {
        console.log(x)
      },
      close() {
        console.log('closed')
      }
    }))
  }
}
```

<details>

-- 
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/1063#issuecomment-674055631

Received on Friday, 14 August 2020 12:43:16 UTC