This repository has been archived by the owner on Aug 31, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 97
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
worker: implement
MessagePort
and MessageChannel
Implement `MessagePort` and `MessageChannel` along the lines of the DOM classes of the same names. `MessagePort`s initially support transferring only `ArrayBuffer`s.
- Loading branch information
Showing
11 changed files
with
978 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
'use strict'; | ||
|
||
const EventEmitter = require('events'); | ||
const util = require('util'); | ||
|
||
const { MessagePort, MessageChannel } = process.binding('messaging'); | ||
util.inherits(MessagePort, EventEmitter); | ||
|
||
const debug = util.debuglog('worker'); | ||
|
||
// A MessagePort consists a handle (that wraps around an | ||
// uv_async_t) which can receive information from other threads and emits | ||
// .onmessage events, and a function used for sending data to a MessagePort | ||
// in some other thread. | ||
function onmessage(payload, flag) { | ||
debug(`[${process.threadId}] received message`, flag, payload); | ||
// Emit the flag and deserialized object to userland. | ||
if (flag === 0 || flag === undefined) | ||
this.emit('message', payload); | ||
else | ||
this.emit('flaggedMessage', flag, payload); | ||
} | ||
|
||
Object.defineProperty(MessagePort.prototype, 'onmessage', { | ||
enumerable: false, | ||
configurable: true, | ||
get() { return onmessage; }, | ||
set(value) { | ||
Object.defineProperty(this, { | ||
writable: true, | ||
enumerable: true, | ||
configurable: true, | ||
value | ||
}); | ||
this.ref(); | ||
this.start(); | ||
} | ||
}); | ||
|
||
function oninit() { | ||
setupPortReferencing(this, this, 'message'); | ||
} | ||
|
||
Object.defineProperty(MessagePort.prototype, 'oninit', { | ||
enumerable: false, | ||
writable: false, | ||
value: oninit | ||
}); | ||
|
||
function onclose() { | ||
this.emit('close'); | ||
} | ||
|
||
Object.defineProperty(MessagePort.prototype, 'onclose', { | ||
enumerable: false, | ||
writable: false, | ||
value: onclose | ||
}); | ||
|
||
function setupPortReferencing(port, eventEmitter, eventName) { | ||
// Keep track of whether there are any workerMessage listeners: | ||
// If there are some, ref() the channel so it keeps the event loop alive. | ||
// If there are none or all are removed, unref() the channel so the worker | ||
// can shutdown gracefully. | ||
port.unref(); | ||
eventEmitter.on('newListener', (name) => { | ||
if (name === eventName && eventEmitter.listenerCount(eventName) === 0) { | ||
port.ref(); | ||
port.start(); | ||
} | ||
}); | ||
eventEmitter.on('removeListener', (name) => { | ||
if (name === eventName && eventEmitter.listenerCount(eventName) === 0) { | ||
port.stop(); | ||
port.unref(); | ||
} | ||
}); | ||
} | ||
|
||
module.exports = { | ||
MessagePort, | ||
MessageChannel | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
'use strict'; | ||
|
||
const { MessagePort, MessageChannel } = require('internal/worker'); | ||
|
||
module.exports = { MessagePort, MessageChannel }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.