- From: Adam Rice <notifications@github.com>
 - Date: Mon, 23 Apr 2018 19:56:49 -0700
 - To: whatwg/streams <streams@noreply.github.com>
 - Cc: Subscribed <subscribed@noreply.github.com>
 - Message-ID: <whatwg/streams/issues/244/383787420@github.com>
 
> For (3), I'm assuming the protocol would be a function of some sort. (Either one that returns the transferable parts, or one that somehow "does the transfer".) Doesn't that reintroduce
> 
> > The transfer() function cannot itself be transferred, which means that if a stream is transferred twice it will lose its ability to transfer chunks.
> 
> to (3) as well?
I've been wondering whether a meta-protocol as simple as
`[Symbol.transferKeys] : ['value']`
could work. For a nested object you'd end up with something like
```javascript
{
  key: 'outer',
  value: {
    label: 'car',
    data: new Uint8Array([1, 2]),
    [Symbol.transferKeys]: ['data']
  },
  [Symbol.transferKeys]: ['value']
}
```
It seems overly simplistic, but I haven't come up with a case where it wouldn't work yet.
> To me, the transfer-twice problem is the worst issue here. Everything else in the disadvantages columns seems solvable.
Thinking about it further, I realised it can be a problem even with a single transfer. Consider these steps:
1. Create a WritableStream on the main thread, with `transfer(chunk) { return [chunk.value]; }` in its strategy.
2. Transfer it to a Worker
3. Call `ws.getWriter().write({value: new Uint8Array([1, 2])})` in the Worker.
The intent is that `value` gets transferred rather than copied, but since the `transfer()` function cannot be executed in the Worker, `value` has to be copied to transfer the chunk to the main thread.
-- 
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/244#issuecomment-383787420
Received on Tuesday, 24 April 2018 02:57:51 UTC