securityos/node_modules/comlink/structured-clone-table.md

28 lines
3.4 KiB
Markdown
Raw Normal View History

2024-09-06 15:32:35 +00:00
# Behavior of [Structured Clone]
[Structured clone] is JavaScripts algorithm to create “deep copies” of values. It is used for `postMessage()` and therefore is used extensively under the hood with Comlink. By default, every function parameter and function return value is structured cloned. Here is a table of how the structured clone algorithm handles different kinds of values. Or to phrase it differently: If you pass a value from the left side as a parameter into a proxyd function, the actual function code will get what is listed on the right side.
| Input | Output | Notes |
| -------------------------- | :------------: | -------------------------------------------------------------------------------------------- |
| `[1,2,3]` | `[1,2,3]` | Full copy |
| `{a: 1, b: 2}` | `{a: 1, b: 2}` | Full copy |
| `{a: 1, b() { return 2; }` | `{a: 1}` | Full copy, functions omitted |
| `new MyClass()` | `{...}` | Just the properties |
| `Map` | `Map` | [`Map`][map] is structured cloneable |
| `Set` | `Set` | [`Set`][set] is structured cloneable |
| `ArrayBuffer` | `ArrayBuffer` | [`ArrayBuffer`][arraybuffer] is structured cloneable |
| `Uint32Array` | `Uint32Array` | [`Uint32Array`][uint32array] and all the other typed arrays are structured cloneable |
| `Event` | ❌ | |
| Any DOM element | ❌ | |
| `MessagePort` | ❌ | Only transferable, not structured cloneable |
| `Request` | ❌ | |
| `Response` | ❌ | |
| `ReadableStream` | ❌ | [Streams are planned to be transferable][transferable streams], but not structured cloneable |
[structured clone]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm
[map]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
[set]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
[arraybuffer]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
[uint32array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array
[transferable streams]: https://github.com/whatwg/streams/blob/master/transferable-streams-explainer.md