workerjs

Server Web Workers for node.js that work

npm install workerjs
2 downloads in the last day
12 downloads in the last week
18 downloads in the last month

workerjs

Server Web Workers for node.js that work.

build status

Installation

This module is installed via npm:

$ npm install workerjs

Background

Web Workers are part of the HTML 5 spec and:

defines an API that allows Web application authors to spawn background workers running scripts in parallel to their main page. This allows for thread-like operation with message-passing as the coordination mechanism

In effect, it allows you to get the benefit of multi-talking and multi-threading in single-threaded Javascript, as well as the safety of the event loop.

You can achieve this in node.js using the child_process.fork method, but then you have to use a different API.

This module normalizes the Web Worker API for server-side javascript in node.js with the hopes that we can build more multi-tasking modules built on the Web Worker standard that will work on both the server and the client-side using browserify.

Example Usage

By using Web Workers you can do CPU-intensive operations without blocking the event-loop and incoming IO:

// app.js - run with "node app.js"
var worker = new Worker('/path/to/fibworker.js');
worker.onmessage = function (msg) {
  expect(msg.data).to.equal(1346269);
};
worker.postMessage(30);
// fibworker.js - CPU web worker code
self.onmessage = function (msg) {
  self.postMessage(fibo(msg.data));
};

function fibo (n) {
  return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}

Node Mode - allowing require()

I've also added a "node-friendly" option that allows the Web Worker to use require() and other node.js conventions. To use this, just pass a boolean value of true through to the second argument of the Worker contructor:

// app.js - run with "node app.js"
var worker = new Worker('/path/to/gammaworker.js', true);
worker.addEventListener('message', function (msg) {
  expect(msg.data).to.equal(87178291200.00021);
  done();
});
worker.postMessage(15);
// gammaworker.js - uses require
var gamma = require('gamma');
self.onmessage = function (msg) {
  postMessage(gamma(msg.data));
};

Also, if you provide a module.exports function it will be executed as an entry point of the web worker. This emulates the browserify transform behaviour in webworkify:

// app.js - run with "node app.js"
var worker = new Worker('/path/to/gammaworker2.js', true);
worker.addEventListener('message', function (msg) {
  expect(msg.data).to.equal(87178291200.00021);
  done();
});
worker.postMessage(15);
// gammaworker2.js - uses require
var gamma = require('gamma');

module.exports = function () {
  postMessage(gamma(msg.data));
};
npm loves you