Socket
Socket
Sign inDemoInstall

jest-worker

Package Overview
Dependencies
9
Maintainers
2
Versions
170
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    jest-worker

Module for executing heavy tasks under forked processes in parallel, by providing a `Promise` based interface, minimum overhead, and bound workers.


Version published
Weekly downloads
56M
decreased by-1.24%
Maintainers
2
Install size
182 kB
Created
Weekly downloads
 

Package description

What is jest-worker?

The jest-worker npm package is a module designed to make it easy to move heavy processing tasks to child processes, thus enabling better use of multi-core systems and improving the performance of Node.js applications. It is primarily used to parallelize work across processes and manage communication between the main thread and worker threads.

What are jest-worker's main functionalities?

Creating a Worker Pool

This feature allows you to create a pool of workers that can execute functions from a specified module file. The 'heavyTask.js' module would export the functions that you want to run on separate threads.

const { Worker } = require('jest-worker');
const worker = new Worker(require.resolve('./heavyTask.js'));
const result = await worker.myHeavyTask(args);

Sending and Receiving Data

With jest-worker, you can send data to worker threads for processing and receive the processed data back in the main thread. The 'dataProcessor.js' module would contain the 'processData' function that handles the data processing logic.

const { Worker } = require('jest-worker');
const worker = new Worker(require.resolve('./dataProcessor.js'));
const processedData = await worker.processData(rawData);

Ending Worker Processes

This feature allows you to properly shut down the worker processes once you're done with them, freeing up system resources.

const { Worker } = require('jest-worker');
const worker = new Worker(require.resolve('./task.js'));
// ... use the worker
await worker.end();

Other packages similar to jest-worker

Changelog

Source

jest 22.0.0

Fixes

  • [jest-resolve] Use module.builtinModules as BUILTIN_MODULES when it exists
  • [jest-worker] Remove debug and inspect flags from the arguments sent to the child (#5068)
  • [jest-config] Use all --testPathPattern and <regexForTestFiles> args in testPathPattern (#5066)
  • [jest-cli] Do not support --watch inside non-version-controlled environments (#5060)
  • [jest-config] Escape Windows path separator in testPathPattern CLI arguments (#5054)
  • [jest-jasmine] Register sourcemaps as node environment to improve performance with jsdom (#5045)
  • [pretty-format] Do not call toJSON recursively (#5044)
  • [pretty-format] Fix errors when identity-obj-proxy mocks CSS Modules (#4935)
  • [babel-jest] Fix support for namespaced babel version 7 (#4918)
  • [expect] fix .toThrow for promises (#4884)
  • [jest-docblock] pragmas should preserve urls (#4837)
  • [jest-cli] Check if npm_lifecycle_script calls Jest directly (#4629)
  • [jest-cli] Fix --showConfig to show all configs (#4494)
  • [jest-cli] Throw if maxWorkers doesn't have a value (#4591)
  • [jest-cli] Use fs.realpathSync.native if available (#5031)
  • [jest-config] Fix --passWithNoTests (#4639)
  • [jest-config] Support rootDir tag in testEnvironment (#4579)
  • [jest-editor-support] Fix --showConfig to support jest 20 and jest 21 (#4575)
  • [jest-editor-support] Fix editor support test for node 4 (#4640)
  • [jest-mock] Support mocking constructor in mockImplementationOnce (#4599)
  • [jest-runtime] Fix manual user mocks not working with custom resolver (#4489)
  • [jest-util] Fix runOnlyPendingTimers for setTimeout inside setImmediate (#4608)
  • [jest-message-util] Always remove node internals from stacktraces (#4695)
  • [jest-resolve] changes method of determining builtin modules to include missing builtins (#4740)
  • [pretty-format] Prevent error in pretty-format for window in jsdom test env (#4750)
  • [jest-resolve] Preserve module identity for symlinks (#4761)
  • [jest-config] Include error message for preset json (#4766)
  • [pretty-format] Throw PrettyFormatPluginError if a plugin halts with an exception (#4787)
  • [expect] Keep the stack trace unchanged when PrettyFormatPluginError is thrown by pretty-format (#4787)
  • [jest-environment-jsdom] Fix asynchronous test will fail due to timeout issue. (#4669)
  • [jest-cli] Fix --onlyChanged path case sensitivity on Windows platform (#4730)
  • [jest-runtime] Use realpath to match transformers (#5000)
  • [expect] [BREAKING] Replace identity equality with Object.is in toBe matcher (#4917)

Features

  • [jest-message-util] Add codeframe to test assertion failures (#5087)
  • [jest-config] Add Global Setup/Teardown options (#4716)
  • [jest-config] Add testEnvironmentOptions to apply to jsdom options or node context. (#5003)
  • [jest-jasmine2] Update Timeout error message to jest.timeout and display current timeout value (#4990)
  • [jest-runner] Enable experimental detection of leaked contexts (#4895)
  • [jest-cli] Add combined coverage threshold for directories. (#4885)
  • [jest-mock] Add timestamps to mock state. (#4866)
  • [eslint-plugin-jest] Add prefer-to-have-length lint rule. (#4771)
  • [jest-environment-jsdom] [BREAKING] Upgrade to JSDOM@11 (#4770)
  • [jest-environment-*] [BREAKING] Add Async Test Environment APIs, dispose is now teardown (#4506)
  • [jest-cli] Add an option to clear the cache (#4430)
  • [babel-plugin-jest-hoist] Improve error message, that the second argument of jest.mock must be an inline function (#4593)
  • [jest-snapshot] [BREAKING] Concatenate name of test and snapshot (#4460)
  • [jest-cli] [BREAKING] Fail if no tests are found (#3672)
  • [jest-diff] Highlight only last of odd length leading spaces (#4558)
  • [jest-docblock] Add docblock.print() (#4517)
  • [jest-docblock] Add strip (#4571)
  • [jest-docblock] Preserve leading whitespace in docblock comments (#4576)
  • [jest-docblock] remove leading newlines from parswWithComments().comments (#4610)
  • [jest-editor-support] Add Snapshots metadata (#4570)
  • [jest-editor-support] Adds an 'any' to the typedef for updateFileWithJestStatus (#4636)
  • [jest-editor-support] Better monorepo support (#4572)
  • [jest-environment-jsdom] Add simple rAF polyfill in jsdom environment to work with React 16 (#4568)
  • [jest-environment-node] Implement node Timer api (#4622)
  • [jest-jasmine2] Add testPath to reporter callbacks (#4594)
  • [jest-mock] Added support for naming mocked functions with .mockName(value) and .mockGetName() (#4586)
  • [jest-runtime] Add module.loaded, and make module.require not enumerable (#4623)
  • [jest-runtime] Add module.parent (#4614)
  • [jest-runtime] Support sourcemaps in transformers (#3458)
  • [jest-snapshot] [BREAKING] Add a serializer for jest.fn to allow a snapshot of a jest mock (#4668)
  • [jest-worker] Initial version of parallel worker abstraction, say hello! (#4497)
  • [jest-jasmine2] Add testLocationInResults flag to add location information per spec to test results (#4782)
  • [jest-environment-jsdom] Update JSOM to 11.4, which includes built-in support for requestAnimationFrame (#4919)
  • [jest-cli] Hide watch usage output when running on non-interactive environments (#4958)
  • [jest-snapshot] Promises support for toThrowErrorMatchingSnapshot (#4946)
  • [jest-cli] Explain which snapshots are obsolete (#5005)

Chore & Maintenance

  • [docs] Add guide of using with puppeteer (#5093)
  • [jest-util] jest-util should not depend on jest-mock (#4992)
  • [*] [BREAKING] Drop support for Node.js version 4 (#4769)
  • [docs] Wrap code comments at 80 characters (#4781)
  • [eslint-plugin-jest] Removed from the Jest core repo, and moved to https://github.com/jest-community/eslint-plugin-jest (#4867)
  • [babel-jest] Explicitly bump istanbul to newer versions (#4616)
  • [expect] Upgrade mocha and rollup for browser testing (#4642)
  • [docs] Add info about coveragePathIgnorePatterns (#4602)
  • [docs] Add Vuejs series of testing with Jest (#4648)
  • [docs] Mention about optional done argument in test function (#4556)
  • [jest-cli] Bump node-notifier version (#4609)
  • [jest-diff] Simplify highlight for leading and trailing spaces (#4553)
  • [jest-get-type] Add support for date (#4621)
  • [jest-matcher-utils] Call chalk.inverse for trailing spaces (#4578)
  • [jest-runtime] Add .advanceTimersByTime; keep .runTimersToTime() as an alias.
  • [docs] Include missing dependency in TestEnvironment sample code
  • [docs] Add clarification for hook execution order
  • [docs] Update expect.anything() sample code (#5007)

Readme

Source

jest-worker

Module for executing heavy tasks under forked processes in parallel, by providing a Promise based interface, minimum overhead, and bound workers.

The module works by providing an absolute path of the module to be loaded in all forked processes. Files relative to a node module are also accepted. All methods are exposed on the parent process as promises, so they can be await'ed. Child (worker) methods can either be synchronous or asynchronous.

The module also implements support for bound workers. Binding a worker means that, based on certain parameters, the same task will always be executed by the same worker. The way bound workers work is by using the returned string of the computeWorkerKey method. If the string was used before for a task, the call will be queued to the related worker that processed the task earlier; if not, it will be executed by the first available worker, then sticked to the worker that executed it; so the next time it will be processed by the same worker. If you have no preference on the worker executing the task, but you have defined a computeWorkerKey method because you want some of the tasks to be sticked, you can return null from it.

The list of exposed methods can be explicitly provided via the exposedMethods option. If it is not provided, it will be obtained by requiring the child module into the main process, and analyzed via reflection. Check the "minimal example" section for a valid one.

Install

$ yarn add jest-worker

Example

This example covers the minimal usage:

File parent.js

import Worker from 'jest-worker';

async function main() {
  const worker = new Worker(require.resolve('./worker'));
  const result = await worker.hello('Alice'); // "Hello, Alice"
}

main();

File worker.js

export function hello(param) {
  return 'Hello, ' + param;
}

API

The only exposed method is a constructor (Worker) that is initialized by passing the worker path, plus an options object.

workerPath: string (required)

Node module name or absolute path of the file to be loaded in the child processes. Use require.resolve to transform a relative path into an absolute one.

options: Object (optional)

exposedMethods: $ReadOnlyArray<string> (optional)

List of method names that can be called on the child processes from the parent process. You cannot expose any method named like a public Worker method, or starting with _. If you use method auto-discovery, then these methods will not be exposed, even if they exist.

numWorkers: number (optional)

Amount of workers to spwan. Defaults to the number of CPUs minus 1.

maxRetries: number (optional)

Maximum amount of times that a dead child can be re-spawned, per call. Defaults to 3, pass Infinity to allow endless retries.

forkOptions: Object (optional)

Allow customizing all options passed to childProcess.fork. By default, some values are set (cwd, env and execArgv), but you can override them and customize the rest. For a list of valid values, check the Node documentation.

computeWorkerKey: (method: string, ...args: Array<any>) => ?string (optional)

Every time a method exposed via the API is called, computeWorkerKey is also called in order to bound the call to a worker. This is useful for workers that are able to cache the result or part of it. You bound calls to a worker by making computeWorkerKey return the same identifier for all different calls. If you do not want to bind the call to any worker, return null.

The callback you provide is called with the method name, plus all the rest of the arguments of the call. Thus, you have full control to decide what to return. Check a practical example on bound workers under the "bound worker usage" section.

By default, no process is bound to any worker.

Worker

The returned Worker instance has all the exposed methods, plus some additional ones to interact with the workers itself:

getStdout(): Readable

Returns a ReadableStream where the standard output of all workers is piped. Note that the silent option of the child workers must be set to true to make it work. This is the default set by jest-worker, but keep it in mind when overriding options through forkOptions.

getStderr(): Readable

Returns a ReadableStream where the standard error of all workers is piped. Note that the silent option of the child workers must be set to true to make it work. This is the default set by jest-worker, but keep it in mind when overriding options through forkOptions.

end()

Finishes the workers by killing all workers. No further calls can be done to the Worker instance.

More examples

Standard usage

This example covers the standard usage:

File parent.js

import Worker from 'jest-worker';

async function main() {
  const myWorker = new Worker(require.resolve('./worker'), {
    exposedMethods: ['foo', 'bar'],
    numWorkers: 4,
  });

  console.log(await myWorker.foo('Alice')); // "Hello from foo: Alice"
  console.log(await myWorker.bar('Bob')); // "Hello from bar: Bob"

  myWorker.end();
}

main();

File worker.js

export function foo(param) {
  return 'Hello from foo: ' + param;
}

export function bar(param) {
  return 'Hello from bar: ' + param;
}

Bound worker usage:

This example covers the usage with a computeWorkerKey method:

File parent.js

import Worker from 'jest-worker';

async function main() {
  const myWorker = new Worker(require.resolve('./worker'), {
    computeWorkerKey: (method, filename) => filename,
  });

  // Transform the given file, within the first available worker.
  console.log(await myWorker.transform('/tmp/foo.js'));

  // Wait a bit.
  await sleep(10000);

  // Transform the same file again. Will immediately return because the
  // transformed file is cached in the worker, and `computeWorkerKey` ensures
  // the same worker that processed the file the first time will process it now.
  console.log(await myWorker.transform('/tmp/foo.js'));

  myWorker.end();
}

main();

File worker.js

import babel from 'babel-core';

const cache = Object.create(null);

export function transform(filename) {
  if (cache[filename]) {
    return cache[filename];
  }

  // jest-worker can handle both immediate results and thenables. If a
  // thenable is returned, it will be await'ed until it resolves.
  return new Promise((resolve, reject) => {
    babel.transformFile(filename, (err, result) => {
      if (err) {
        reject(err);
      } else {
        resolve((cache[filename] = result));
      }
    });
  });
}

FAQs

Last updated on 18 Dec 2017

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc