| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- /**
- * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- /// <reference types="node" />
- import type {EventEmitter} from 'events';
- import type {ForkOptions} from 'child_process';
- import type {ResourceLimits} from 'worker_threads';
- declare const CHILD_MESSAGE_CALL = 1;
- declare const CHILD_MESSAGE_END = 2;
- declare const CHILD_MESSAGE_INITIALIZE = 0;
- declare type ChildMessage =
- | ChildMessageInitialize
- | ChildMessageCall
- | ChildMessageEnd;
- declare type ChildMessageCall = [
- typeof CHILD_MESSAGE_CALL,
- boolean,
- string,
- Array<unknown>,
- ];
- declare type ChildMessageEnd = [typeof CHILD_MESSAGE_END, boolean];
- declare type ChildMessageInitialize = [
- typeof CHILD_MESSAGE_INITIALIZE,
- boolean,
- string,
- // file
- Array<unknown> | undefined,
- // setupArgs
- MessagePort_2 | undefined,
- ];
- declare type ComputeTaskPriorityCallback = (
- method: string,
- ...args: Array<unknown>
- ) => number;
- declare type ExcludeReservedKeys<K> = Exclude<K, ReservedKeys>;
- /**
- * First-in, First-out task queue that manages a dedicated pool
- * for each worker as well as a shared queue. The FIFO ordering is guaranteed
- * across the worker specific and shared queue.
- */
- export declare class FifoQueue implements TaskQueue {
- private _workerQueues;
- private _sharedQueue;
- enqueue(task: QueueChildMessage, workerId?: number): void;
- dequeue(workerId: number): QueueChildMessage | null;
- }
- declare type FunctionLike = (...args: any) => unknown;
- declare type HeapItem = {
- priority: number;
- };
- export declare type JestWorkerFarm<T extends Record<string, unknown>> =
- Worker_2 & WorkerModule<T>;
- export declare function messageParent(
- message: unknown,
- parentProcess?: NodeJS.Process,
- ): void;
- declare type MessagePort_2 = typeof EventEmitter & {
- postMessage(message: unknown): void;
- };
- declare type MethodLikeKeys<T> = {
- [K in keyof T]: T[K] extends FunctionLike ? K : never;
- }[keyof T];
- declare class MinHeap<TItem extends HeapItem> {
- private _heap;
- peek(): TItem | null;
- add(item: TItem): void;
- poll(): TItem | null;
- }
- declare type OnCustomMessage = (message: Array<unknown> | unknown) => void;
- declare type OnEnd = (err: Error | null, result: unknown) => void;
- declare type OnStart = (worker: WorkerInterface) => void;
- declare type PoolExitResult = {
- forceExited: boolean;
- };
- /**
- * Priority queue that processes tasks in natural ordering (lower priority first)
- * according to the priority computed by the function passed in the constructor.
- *
- * FIFO ordering isn't guaranteed for tasks with the same priority.
- *
- * Worker specific tasks with the same priority as a non-worker specific task
- * are always processed first.
- */
- export declare class PriorityQueue implements TaskQueue {
- private _computePriority;
- private _queue;
- private _sharedQueue;
- constructor(_computePriority: ComputeTaskPriorityCallback);
- enqueue(task: QueueChildMessage, workerId?: number): void;
- _enqueue(task: QueueChildMessage, queue: MinHeap<QueueItem>): void;
- dequeue(workerId: number): QueueChildMessage | null;
- _getWorkerQueue(workerId: number): MinHeap<QueueItem>;
- }
- export declare interface PromiseWithCustomMessage<T> extends Promise<T> {
- UNSTABLE_onCustomMessage?: (listener: OnCustomMessage) => () => void;
- }
- declare type Promisify<T extends FunctionLike> = ReturnType<T> extends Promise<
- infer R
- >
- ? (...args: Parameters<T>) => Promise<R>
- : (...args: Parameters<T>) => Promise<ReturnType<T>>;
- declare type QueueChildMessage = {
- request: ChildMessageCall;
- onStart: OnStart;
- onEnd: OnEnd;
- onCustomMessage: OnCustomMessage;
- };
- declare type QueueItem = {
- task: QueueChildMessage;
- priority: number;
- };
- declare type ReservedKeys =
- | 'end'
- | 'getStderr'
- | 'getStdout'
- | 'setup'
- | 'teardown';
- export declare interface TaskQueue {
- /**
- * Enqueues the task in the queue for the specified worker or adds it to the
- * queue shared by all workers
- * @param task the task to queue
- * @param workerId the id of the worker that should process this task or undefined
- * if there's no preference.
- */
- enqueue(task: QueueChildMessage, workerId?: number): void;
- /**
- * Dequeues the next item from the queue for the specified worker
- * @param workerId the id of the worker for which the next task should be retrieved
- */
- dequeue(workerId: number): QueueChildMessage | null;
- }
- /**
- * The Jest farm (publicly called "Worker") is a class that allows you to queue
- * methods across multiple child processes, in order to parallelize work. This
- * is done by providing an absolute path to a module that will be loaded on each
- * of the child processes, and bridged to the main process.
- *
- * Bridged methods are specified by using the "exposedMethods" property of the
- * "options" object. This is an array of strings, where each of them corresponds
- * to the exported name in the loaded module.
- *
- * You can also control the amount of workers by using the "numWorkers" property
- * of the "options" object, and the settings passed to fork the process through
- * the "forkOptions" property. The amount of workers defaults to the amount of
- * CPUS minus one.
- *
- * Queueing calls can be done in two ways:
- * - Standard method: calls will be redirected to the first available worker,
- * so they will get executed as soon as they can.
- *
- * - Sticky method: if a "computeWorkerKey" method is provided within the
- * config, the resulting string of this method will be used as a key.
- * Every time this key is returned, it is guaranteed that your job will be
- * processed by the same worker. This is specially useful if your workers
- * are caching results.
- */
- declare class Worker_2 {
- private _ending;
- private _farm;
- private _options;
- private _workerPool;
- constructor(workerPath: string, options?: WorkerFarmOptions);
- private _bindExposedWorkerMethods;
- private _callFunctionWithArgs;
- getStderr(): NodeJS.ReadableStream;
- getStdout(): NodeJS.ReadableStream;
- end(): Promise<PoolExitResult>;
- }
- export {Worker_2 as Worker};
- declare type WorkerCallback = (
- workerId: number,
- request: ChildMessage,
- onStart: OnStart,
- onEnd: OnEnd,
- onCustomMessage: OnCustomMessage,
- ) => void;
- export declare type WorkerFarmOptions = {
- computeWorkerKey?: (method: string, ...args: Array<unknown>) => string | null;
- enableWorkerThreads?: boolean;
- exposedMethods?: ReadonlyArray<string>;
- forkOptions?: ForkOptions;
- maxRetries?: number;
- numWorkers?: number;
- resourceLimits?: ResourceLimits;
- setupArgs?: Array<unknown>;
- taskQueue?: TaskQueue;
- WorkerPool?: new (
- workerPath: string,
- options?: WorkerPoolOptions,
- ) => WorkerPoolInterface;
- workerSchedulingPolicy?: WorkerSchedulingPolicy;
- };
- declare interface WorkerInterface {
- send(
- request: ChildMessage,
- onProcessStart: OnStart,
- onProcessEnd: OnEnd,
- onCustomMessage: OnCustomMessage,
- ): void;
- waitForExit(): Promise<void>;
- forceExit(): void;
- getWorkerId(): number;
- getStderr(): NodeJS.ReadableStream | null;
- getStdout(): NodeJS.ReadableStream | null;
- }
- declare type WorkerModule<T> = {
- [K in keyof T as Extract<
- ExcludeReservedKeys<K>,
- MethodLikeKeys<T>
- >]: T[K] extends FunctionLike ? Promisify<T[K]> : never;
- };
- declare type WorkerOptions_2 = {
- forkOptions: ForkOptions;
- resourceLimits: ResourceLimits;
- setupArgs: Array<unknown>;
- maxRetries: number;
- workerId: number;
- workerData?: unknown;
- workerPath: string;
- };
- export declare interface WorkerPoolInterface {
- getStderr(): NodeJS.ReadableStream;
- getStdout(): NodeJS.ReadableStream;
- getWorkers(): Array<WorkerInterface>;
- createWorker(options: WorkerOptions_2): WorkerInterface;
- send: WorkerCallback;
- end(): Promise<PoolExitResult>;
- }
- export declare type WorkerPoolOptions = {
- setupArgs: Array<unknown>;
- forkOptions: ForkOptions;
- resourceLimits: ResourceLimits;
- maxRetries: number;
- numWorkers: number;
- enableWorkerThreads: boolean;
- };
- declare type WorkerSchedulingPolicy = 'round-robin' | 'in-order';
- export {};
|