JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 196731
  • Score
    100M100P100Q160772F
  • License BSD-3-Clause

Tiny WebWorker for Server

Package Exports

  • tiny-worker

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (tiny-worker) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

tiny-worker

Tiny WebWorker for Server

require() is available for flexible inline Worker scripts. Optional parameters args Array & options Object; see child_process.fork() documentation.

build status

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

  1. I have an orphaned child process that lives on past the parent process' lifespan
  • Most likely a SIGTERM or SIGINT is not reaching the child process
  1. How do I insure all process are terminated?
  • In your core script register a listener for SIGTERM or SIGINT via process.on() which terminates (all) worker process(es) and then gracefully shutdowns via process.exit(0);
  1. Why SIGTERM or SIGINT?
  • Unix/BSD will work with SIGTERM, but if you also need to support Windows use SIGINT

License

Copyright (c) 2019 Jason Mulligan Licensed under the BSD-3 license