- From: Adam Rice <notifications@github.com>
- Date: Mon, 23 Apr 2018 05:32:10 +0000 (UTC)
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/issues/244/383458980@github.com>
Assuming we want chunks to be transferred where possible, rather that copied, we have three main options on the table:
### 1. **Opportunistic greedy transfer.**
Any part of the chunk that is transferable is transferred, everything else is copied. Example:
`{ name: 'carpool', value: new Uint8Array([1, 2, 3, 4]) }`
Here `name` is copied and `value` is transferred.
**Advantages:**
* Easy to use
**Disadvantages:**
* "Opportunistic greedy transfer" algorithm needs to be specified somewhere.
* Can lead to surprising behaviour for deeply-nested objects, for example:
`{ thirdPartyObject: { internalThing: Uint8Array } }`
Here the author has nested an object from third-party code inside their own object. The nested object
contains a transferrable field, and is unexpectedly broken by being passed as a chunk. In general
passing arbitrary third-party objects as chunks is not going to work well, so maybe this is okay.
### 2. **Provided by strategy.**
An extra function is added to the strategy which provides a list of objects that are to be transferred when the stream is transferred. Example
`strategy = { transfer(chunk) { return [chunk.value]; } }`
would transfer the `value` property of any chunk, and copy everything else.
**Advantages:**
* Easy to understand
* Allows re-use of existing postMessage machinery--no extra algorithm needs to be standardised.
**Disadvantages:**
* The `transfer()` function cannot itself be transferred, which means that if a stream is transferred twice it will lose its ability to transfer chunks.
* Developers who want to be able to transfer arbitrary objects are going to have to write a lot of code.
### 3. **New meta-protocol.**
Objects which are capable of being transferred contain metadata saying how to do it. Example:
`{ name: 'fitboot', value: new Uint8Array([3,5,7]), [Symbol.transfer]: ? }`
**Advantages:**
* A general solution which can be made to work for `postMessage()` too.
**Disadvantages:**
* There's no way to explicitly say that the top-level object is transferable.
* Not clear what the meta-protocol should be.
* Probably requires the most standards and implementation work of any of the options.
--
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-383458980
Received on Monday, 23 April 2018 05:32:41 UTC