Tiny WebWorker for Server
require() is available for flexible inline Worker scripts. Optional parameters args Array & options Object; see child_process.fork() documentation.
Example
Creating a Worker from a file
The worker script:
onmessage = function (ev) { postMessage(ev.data); };
The core script:
var Worker = require("tiny-worker"); var worker = new Worker("repeat.js"); worker.onmessage = function (ev) { console.log(ev.data); worker.terminate(); }; worker.postMessage("Hello World!");
Enable ES6 import/export within Worker file
The worker helper script (helper.js):
export const dataFormatter = (data) => { return `${data} World!`; };
The worker script (repeat.js):
import { dataFormatter } from "./helper"; onmessage = function (ev) { const data = dataFormatter(ev.data); postMessage(data); };
The core script:
var Worker = require("tiny-worker"); var worker = new Worker("repeat.js", [], {esm: true}); worker.onmessage = function (ev) { console.log(ev.data); worker.terminate(); }; worker.postMessage("Hello");
Creating a Worker from a Function
var Worker = require("tiny-worker"); var worker = new Worker(function () { self.onmessage = function (ev) { postMessage(ev.data); }; }); worker.onmessage = function (ev) { console.log(ev.data); worker.terminate(); }; worker.postMessage("Hello World!");
Debugging
To be able to debug a child process, it must have a differnt debug port than the parent.
Tiny worker does this by adding a random port within a range to the parents debug port.
The default Range is [1, 300], it can be changed with the setRange(min, max) method.
To disable any automatic port redirection set options.noDebugRedirection = true.
automatic redirection
//parent is started with '--debug=1234' var Worker = require("tiny-worker"); Worker.setRange(2, 20); var worker = new Worker(function () { postMessage(process.debugPort); }); worker.onmessage = function (ev) { console.log(ev.data); //prints any number between 1236 and 1254 worker.terminate(); }
manual redirection
//parent is started with '--debug=1234' var Worker = require("tiny-worker"); var worker = new Worker(function () { postMessage(process.debugPort); }, [], {noDebugRedirection: true, execArgv: ["--debug=1235"]}); worker.onmessage = function (ev) { console.log(ev.data); //prints 1235 worker.terminate(); }
Properties
onmessage
Message handler, accepts an Event
onerror
Error handler, accepts an Event
API
addEventListener(event, fn)
Adds an event listener
postMessage()
Broadcasts a message to the Worker
terminate()
Terminates the Worker
static setRange(min, max)
Sets range for debug ports, only affects current process. Returns true if successful.
FAQ
- I have an orphaned child process that lives on past the parent process' lifespan
- Most likely a
SIGTERMorSIGINTis not reaching the child process
- How do I insure all process are terminated?
- In your core script register a listener for
SIGTERMorSIGINTviaprocess.on()which terminates (all) worker process(es) and then gracefully shutdowns viaprocess.exit(0);
- Why
SIGTERMorSIGINT?
- Unix/BSD will work with
SIGTERM, but if you also need to support Windows useSIGINT
License
Copyright (c) 2019 Jason Mulligan Licensed under the BSD-3 license