hermes-worker

1.2.4 • Public • Published

Hermes Worker

Lint and test NPM Version License

Hermes Worker is a small library made to simplify WebWorker usage.

In a nutshell, it is a tool which can be used by a web page for computation and which returns the result when it is ready.

Install

Add the package to your project as a dependency:

npm install hermes-worker

Please note that current version does not work with NodeJS (Blob not available)

Example

const HermesWorker = require("hermes-worker");

// Code to be run on worker side
const workerFunction = () => {
    // Expose a function
    hermes.on("add", (a, b) => {
        return a + b;
    });

    // Finish worker initialization
    hermes.ready();
}

// Create a worker
const hermes = new HermesWorker(workerFunction, {});

// Call function "add" and retrieve answer
hermes.call("add", [1, 2]).then(result => {
    console.log(result); // result === 3
});

Features

  • Simple communication between page and worker
  • Instantiate worker from url or function
  • Multiple instances of the same worker
  • Single external scripts import shared between worker instances
  • Serialize data between page and worker
  • Add custom serializers

Usage

Instantiate worker from url

script.js

const HermesWorker = require("hermes-worker");

// Create a worker
const hermes = new HermesWorker("workerFile.js", {});

// Call function "add" and retrieve answer
hermes.call("add", [1, 2]).then(result => {
    console.log(result); // result === 3
});

workerFile.js

// Code to be run in worker side
// Expose a function
hermes.on("add", (a, b) => {
    return a + b;
});

// Finish worker initialization
hermes.ready();

Multiple instances of the same worker

const HermesWorker = require("hermes-worker");

const workerFunction = () => {
    const fibo = (n) => {
        if (n === 0 || n === 1) {
            return 1;
        }
        return fibo(n - 1) + fibo(n - 2);
    }
    hermes.on("fibo", (n) => fibo(n));
    hermes.on("hello", () => {
        console.log(`Hello world from instance ${hermes.config.threadInstance}`)
    })
    hermes.ready();
}

// Create two workers with same code
const hermes = new HermesWorker(workerFunction, {
    threadInstances: 2
});

// Run by first instance
hermes.call("fibo", [12]);

// Run by second instance
hermes.call("fibo", [34]);

hermes.call("hello"); // Output => "Hello world from instance 0"
hermes.call("hello"); // Output => "Hello world from instance 1"

Imports scripts

const HermesWorker = require("hermes-worker");

const workerFunction = () => {
    /** HERE BABYLON IS DEFINED **/
    hermes.on("length", (x, y) => {
        return new BABYLON.Vector2(x, y).length();
    });

    hermes.ready();
};

// Create a worker
const hermes = new HermesWorker(workerFunction, {
    scripts: [
        "https://cdn.babylonjs.com/babylon.js"
    ]
});

hermes.call("length", [1, 0]).then(result => {
    console.log(result); // result === 1
});

Serialization

Data passed between page and worker are serialized to avoid data loss.

List of handled types:

  • Number
  • Number[]
  • String
  • String[]
  • Object
  • Object[]
  • Error
  • TypedArray
  • ImageData
  • ArrayBuffer
  • DataView

You can also create your own serializer

const HermesWorker = require("hermes-worker");

// Caution: Hermes only reads `serialize` and `unserialize` keys
const BabylonSerializer = {
    serialize: (args) => {
        return args.map((arg) => {
            if (arg instanceof BABYLON.Vector2) {
                return {
                    _x: arg.x,
                    _y: arg.y,
                    __type__: "BABYLON.Vector2",
                };
            }
            return arg;
        });
    },
    unserialize: (args) => {
        return args => args.map((arg) => {
            if (arg.__type__ === "BABYLON.Vector2") {
                return new BABYLON.Vector2(arg._x, arg._y);
            }
            return arg;
        });
    },
};

const workerFunction = () => {
    hermes.on("length", (vector) => {
        return vector.length();
    });

    hermes.ready();
};

const hermes = new HermesWorker(workerFunction, {
    scripts: ["https://cdn.babylonjs.com/babylon.js"],
    serializers: [
        BabylonSerializer,
    ],
});

hermes.call("length", [new BABYLON.Vector2(2, 0)]).then(result => {
    console.log(result); // result === 2
});

Changelog

  • v1.0.0: Initial release
  • v1.0.1: Add latest file in npm
  • v1.1.0:
    • Clean Serializer
    • Fix bug transferable
  • v1.2.0:
    • Throw error on unsupported type are send
    • Add possibility to use offscreencanvas

Versions

Current Tags

  • Version
    Downloads (Last 7 Days)
    • Tag
  • 1.2.4
    305
    • latest

Version History

Package Sidebar

Install

npm i hermes-worker

Weekly Downloads

305

Version

1.2.4

License

BSD-3-Clause

Unpacked Size

52.2 kB

Total Files

10

Last publish

Collaborators

  • damienfern
  • wanadmin
  • clementlvsr
  • flozz
  • baptistedonaux
  • come
  • jbghoul
  • vserain