|
| 1 | +# Worker |
| 2 | + |
| 3 | +<!--introduced_in=REPLACEME--> |
| 4 | + |
| 5 | +> Stability: 1 - Experimental |
| 6 | +
|
| 7 | +## Class: MessageChannel |
| 8 | +<!-- YAML |
| 9 | +added: REPLACEME |
| 10 | +--> |
| 11 | + |
| 12 | +Instances of the `worker.MessageChannel` class represent an asynchronous, |
| 13 | +two-way communications channel. |
| 14 | +The `MessageChannel` has no methods of its own. `new MessageChannel()` |
| 15 | +yields an object with `port1` and `port2` properties, which refer to linked |
| 16 | +[`MessagePort`][] instances. |
| 17 | + |
| 18 | +```js |
| 19 | +const { MessageChannel } = require('worker'); |
| 20 | + |
| 21 | +const { port1, port2 } = new MessageChannel(); |
| 22 | +port1.on('message', (message) => console.log('received', message)); |
| 23 | +port2.postMessage({ foo: 'bar' }); |
| 24 | +// prints: received { foo: 'bar' } |
| 25 | +``` |
| 26 | + |
| 27 | +## Class: MessagePort |
| 28 | +<!-- YAML |
| 29 | +added: REPLACEME |
| 30 | +--> |
| 31 | + |
| 32 | +* Extends: {EventEmitter} |
| 33 | + |
| 34 | +Instances of the `worker.MessagePort` class represent one end of an |
| 35 | +asynchronous, two-way communications channel. It can be used to transfer |
| 36 | +structured data, memory regions and other `MessagePort`s between different |
| 37 | +[`Worker`][]s. |
| 38 | + |
| 39 | +With the exception of `MessagePort`s being [`EventEmitter`][]s rather |
| 40 | +than `EventTarget`s, this implementation matches [browser `MessagePort`][]s. |
| 41 | + |
| 42 | +### Event: 'close' |
| 43 | +<!-- YAML |
| 44 | +added: REPLACEME |
| 45 | +--> |
| 46 | + |
| 47 | +The `'close'` event is emitted once either side of the channel has been |
| 48 | +disconnected. |
| 49 | + |
| 50 | +### Event: 'message' |
| 51 | +<!-- YAML |
| 52 | +added: REPLACEME |
| 53 | +--> |
| 54 | + |
| 55 | +* `value` {any} The transmitted value |
| 56 | + |
| 57 | +The `'message'` event is emitted for any incoming message, containing the cloned |
| 58 | +input of [`port.postMessage()`][]. |
| 59 | + |
| 60 | +Listeners on this event will receive a clone of the `value` parameter as passed |
| 61 | +to `postMessage()` and no further arguments. |
| 62 | + |
| 63 | +### port.close() |
| 64 | +<!-- YAML |
| 65 | +added: REPLACEME |
| 66 | +--> |
| 67 | + |
| 68 | +Disables further sending of messages on either side of the connection. |
| 69 | +This method can be called once you know that no further communication |
| 70 | +will happen over this `MessagePort`. |
| 71 | + |
| 72 | +### port.postMessage(value[, transferList]) |
| 73 | +<!-- YAML |
| 74 | +added: REPLACEME |
| 75 | +--> |
| 76 | + |
| 77 | +* `value` {any} |
| 78 | +* `transferList` {Object[]} |
| 79 | + |
| 80 | +Sends a JavaScript value to the receiving side of this channel. |
| 81 | +`value` will be transferred in a way which is compatible with |
| 82 | +the [HTML structured clone algorithm][]. In particular, it may contain circular |
| 83 | +references and objects like typed arrays that the `JSON` API is not able |
| 84 | +to stringify. |
| 85 | + |
| 86 | +`transferList` may be a list of `ArrayBuffer` objects. |
| 87 | +After transferring, they will not be usable on the sending side of the channel |
| 88 | +anymore (even if they are not contained in `value`). |
| 89 | + |
| 90 | +`value` may still contain `ArrayBuffer` instances that are not in |
| 91 | +`transferList`; in that case, the underlying memory is copied rather than moved. |
| 92 | + |
| 93 | +For more information on the serialization and deserialization mechanisms |
| 94 | +behind this API, see the [serialization API of the `v8` module][v8.serdes]. |
| 95 | + |
| 96 | +Because the object cloning uses the structured clone algorithm, |
| 97 | +non-enumerable properties, property accessors, and object prototypes are |
| 98 | +not preserved. In particular, [`Buffer`][] objects will be read as |
| 99 | +plain [`Uint8Array`][]s on the receiving side. |
| 100 | + |
| 101 | +The message object will be cloned immediately, and can be modified after |
| 102 | +posting without having side effects. |
| 103 | + |
| 104 | +### port.ref() |
| 105 | +<!-- YAML |
| 106 | +added: REPLACEME |
| 107 | +--> |
| 108 | + |
| 109 | +Opposite of `unref()`. Calling `ref()` on a previously `unref()`ed port will |
| 110 | +*not* let the program exit if it's the only active handle left (the default |
| 111 | +behavior). If the port is `ref()`ed, calling `ref()` again will have no effect. |
| 112 | + |
| 113 | +If listeners are attached or removed using `.on('message')`, the port will |
| 114 | +be `ref()`ed and `unref()`ed automatically depending on whether |
| 115 | +listeners for the event exist. |
| 116 | + |
| 117 | +### port.start() |
| 118 | +<!-- YAML |
| 119 | +added: REPLACEME |
| 120 | +--> |
| 121 | + |
| 122 | +Starts receiving messages on this `MessagePort`. When using this port |
| 123 | +as an event emitter, this will be called automatically once `'message'` |
| 124 | +listeners are attached. |
| 125 | + |
| 126 | +### port.unref() |
| 127 | +<!-- YAML |
| 128 | +added: REPLACEME |
| 129 | +--> |
| 130 | + |
| 131 | +Calling `unref()` on a port will allow the thread to exit if this is the only |
| 132 | +active handle in the event system. If the port is already `unref()`ed calling |
| 133 | +`unref()` again will have no effect. |
| 134 | + |
| 135 | +If listeners are attached or removed using `.on('message')`, the port will |
| 136 | +be `ref()`ed and `unref()`ed automatically depending on whether |
| 137 | +listeners for the event exist. |
| 138 | + |
| 139 | +[`Buffer`]: buffer.html |
| 140 | +[`EventEmitter`]: events.html |
| 141 | +[`MessagePort`]: #worker_class_messageport |
| 142 | +[`port.postMessage()`]: #worker_port_postmessage_value_transferlist |
| 143 | +[v8.serdes]: v8.html#v8_serialization_api |
| 144 | +[`Uint8Array`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array |
| 145 | +[browser `MessagePort`]: https://developer.mozilla.org/en-US/docs/Web/API/MessagePort |
| 146 | +[HTML structured clone algorithm]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm |
0 commit comments