UNPKG

12.9 kBTypeScriptView Raw
1declare module 'worker_threads' {
2 import { Blob } from 'node:buffer';
3 import { Context } from 'vm';
4 import { EventEmitter } from 'events';
5 import { EventLoopUtilityFunction } from 'perf_hooks';
6 import { FileHandle } from 'fs/promises';
7 import { Readable, Writable } from 'stream';
8 import { URL } from 'url';
9 import { X509Certificate } from 'crypto';
10
11 const isMainThread: boolean;
12 const parentPort: null | MessagePort;
13 const resourceLimits: ResourceLimits;
14 const SHARE_ENV: unique symbol;
15 const threadId: number;
16 const workerData: any;
17
18 class MessageChannel {
19 readonly port1: MessagePort;
20 readonly port2: MessagePort;
21 }
22
23 interface WorkerPerformance {
24 eventLoopUtilization: EventLoopUtilityFunction;
25 }
26
27 type TransferListItem = ArrayBuffer | MessagePort | FileHandle | X509Certificate | Blob;
28
29 class MessagePort extends EventEmitter {
30 close(): void;
31 postMessage(value: any, transferList?: ReadonlyArray<TransferListItem>): void;
32 ref(): void;
33 unref(): void;
34 start(): void;
35
36 addListener(event: "close", listener: () => void): this;
37 addListener(event: "message", listener: (value: any) => void): this;
38 addListener(event: "messageerror", listener: (error: Error) => void): this;
39 addListener(event: string | symbol, listener: (...args: any[]) => void): this;
40
41 emit(event: "close"): boolean;
42 emit(event: "message", value: any): boolean;
43 emit(event: "messageerror", error: Error): boolean;
44 emit(event: string | symbol, ...args: any[]): boolean;
45
46 on(event: "close", listener: () => void): this;
47 on(event: "message", listener: (value: any) => void): this;
48 on(event: "messageerror", listener: (error: Error) => void): this;
49 on(event: string | symbol, listener: (...args: any[]) => void): this;
50
51 once(event: "close", listener: () => void): this;
52 once(event: "message", listener: (value: any) => void): this;
53 once(event: "messageerror", listener: (error: Error) => void): this;
54 once(event: string | symbol, listener: (...args: any[]) => void): this;
55
56 prependListener(event: "close", listener: () => void): this;
57 prependListener(event: "message", listener: (value: any) => void): this;
58 prependListener(event: "messageerror", listener: (error: Error) => void): this;
59 prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
60
61 prependOnceListener(event: "close", listener: () => void): this;
62 prependOnceListener(event: "message", listener: (value: any) => void): this;
63 prependOnceListener(event: "messageerror", listener: (error: Error) => void): this;
64 prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
65
66 removeListener(event: "close", listener: () => void): this;
67 removeListener(event: "message", listener: (value: any) => void): this;
68 removeListener(event: "messageerror", listener: (error: Error) => void): this;
69 removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
70
71 off(event: "close", listener: () => void): this;
72 off(event: "message", listener: (value: any) => void): this;
73 off(event: "messageerror", listener: (error: Error) => void): this;
74 off(event: string | symbol, listener: (...args: any[]) => void): this;
75 }
76
77 interface WorkerOptions {
78 /**
79 * List of arguments which would be stringified and appended to
80 * `process.argv` in the worker. This is mostly similar to the `workerData`
81 * but the values will be available on the global `process.argv` as if they
82 * were passed as CLI options to the script.
83 */
84 argv?: any[];
85 env?: NodeJS.Dict<string> | typeof SHARE_ENV;
86 eval?: boolean;
87 workerData?: any;
88 stdin?: boolean;
89 stdout?: boolean;
90 stderr?: boolean;
91 execArgv?: string[];
92 resourceLimits?: ResourceLimits;
93 /**
94 * Additional data to send in the first worker message.
95 */
96 transferList?: TransferListItem[];
97 /**
98 * @default true
99 */
100 trackUnmanagedFds?: boolean;
101 }
102
103 interface ResourceLimits {
104 /**
105 * The maximum size of a heap space for recently created objects.
106 */
107 maxYoungGenerationSizeMb?: number;
108 /**
109 * The maximum size of the main heap in MB.
110 */
111 maxOldGenerationSizeMb?: number;
112 /**
113 * The size of a pre-allocated memory range used for generated code.
114 */
115 codeRangeSizeMb?: number;
116 /**
117 * The default maximum stack size for the thread. Small values may lead to unusable Worker instances.
118 * @default 4
119 */
120 stackSizeMb?: number;
121 }
122
123 class Worker extends EventEmitter {
124 readonly stdin: Writable | null;
125 readonly stdout: Readable;
126 readonly stderr: Readable;
127 readonly threadId: number;
128 readonly resourceLimits?: ResourceLimits;
129 readonly performance: WorkerPerformance;
130
131 /**
132 * @param filename The path to the Worker’s main script or module.
133 * Must be either an absolute path or a relative path (i.e. relative to the current working directory) starting with ./ or ../,
134 * or a WHATWG URL object using file: protocol. If options.eval is true, this is a string containing JavaScript code rather than a path.
135 */
136 constructor(filename: string | URL, options?: WorkerOptions);
137
138 postMessage(value: any, transferList?: ReadonlyArray<TransferListItem>): void;
139 ref(): void;
140 unref(): void;
141 /**
142 * Stop all JavaScript execution in the worker thread as soon as possible.
143 * Returns a Promise for the exit code that is fulfilled when the `exit` event is emitted.
144 */
145 terminate(): Promise<number>;
146
147 /**
148 * Returns a readable stream for a V8 snapshot of the current state of the Worker.
149 * See `v8.getHeapSnapshot()` for more details.
150 *
151 * If the Worker thread is no longer running, which may occur before the
152 * `'exit'` event is emitted, the returned `Promise` will be rejected
153 * immediately with an `ERR_WORKER_NOT_RUNNING` error
154 */
155 getHeapSnapshot(): Promise<Readable>;
156
157 addListener(event: "error", listener: (err: Error) => void): this;
158 addListener(event: "exit", listener: (exitCode: number) => void): this;
159 addListener(event: "message", listener: (value: any) => void): this;
160 addListener(event: "messageerror", listener: (error: Error) => void): this;
161 addListener(event: "online", listener: () => void): this;
162 addListener(event: string | symbol, listener: (...args: any[]) => void): this;
163
164 emit(event: "error", err: Error): boolean;
165 emit(event: "exit", exitCode: number): boolean;
166 emit(event: "message", value: any): boolean;
167 emit(event: "messageerror", error: Error): boolean;
168 emit(event: "online"): boolean;
169 emit(event: string | symbol, ...args: any[]): boolean;
170
171 on(event: "error", listener: (err: Error) => void): this;
172 on(event: "exit", listener: (exitCode: number) => void): this;
173 on(event: "message", listener: (value: any) => void): this;
174 on(event: "messageerror", listener: (error: Error) => void): this;
175 on(event: "online", listener: () => void): this;
176 on(event: string | symbol, listener: (...args: any[]) => void): this;
177
178 once(event: "error", listener: (err: Error) => void): this;
179 once(event: "exit", listener: (exitCode: number) => void): this;
180 once(event: "message", listener: (value: any) => void): this;
181 once(event: "messageerror", listener: (error: Error) => void): this;
182 once(event: "online", listener: () => void): this;
183 once(event: string | symbol, listener: (...args: any[]) => void): this;
184
185 prependListener(event: "error", listener: (err: Error) => void): this;
186 prependListener(event: "exit", listener: (exitCode: number) => void): this;
187 prependListener(event: "message", listener: (value: any) => void): this;
188 prependListener(event: "messageerror", listener: (error: Error) => void): this;
189 prependListener(event: "online", listener: () => void): this;
190 prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
191
192 prependOnceListener(event: "error", listener: (err: Error) => void): this;
193 prependOnceListener(event: "exit", listener: (exitCode: number) => void): this;
194 prependOnceListener(event: "message", listener: (value: any) => void): this;
195 prependOnceListener(event: "messageerror", listener: (error: Error) => void): this;
196 prependOnceListener(event: "online", listener: () => void): this;
197 prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
198
199 removeListener(event: "error", listener: (err: Error) => void): this;
200 removeListener(event: "exit", listener: (exitCode: number) => void): this;
201 removeListener(event: "message", listener: (value: any) => void): this;
202 removeListener(event: "messageerror", listener: (error: Error) => void): this;
203 removeListener(event: "online", listener: () => void): this;
204 removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
205
206 off(event: "error", listener: (err: Error) => void): this;
207 off(event: "exit", listener: (exitCode: number) => void): this;
208 off(event: "message", listener: (value: any) => void): this;
209 off(event: "messageerror", listener: (error: Error) => void): this;
210 off(event: "online", listener: () => void): this;
211 off(event: string | symbol, listener: (...args: any[]) => void): this;
212 }
213
214 interface BroadcastChannel extends NodeJS.RefCounted {}
215
216 /**
217 * See https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel
218 */
219 class BroadcastChannel {
220 readonly name: string;
221 onmessage: (message: unknown) => void;
222 onmessageerror: (message: unknown) => void;
223
224 constructor(name: string);
225
226 close(): void;
227 postMessage(message: unknown): void;
228 }
229
230 /**
231 * Mark an object as not transferable.
232 * If `object` occurs in the transfer list of a `port.postMessage()` call, it will be ignored.
233 *
234 * In particular, this makes sense for objects that can be cloned, rather than transferred,
235 * and which are used by other objects on the sending side. For example, Node.js marks
236 * the `ArrayBuffer`s it uses for its Buffer pool with this.
237 *
238 * This operation cannot be undone.
239 */
240 function markAsUntransferable(object: object): void;
241
242 /**
243 * Transfer a `MessagePort` to a different `vm` Context. The original `port`
244 * object will be rendered unusable, and the returned `MessagePort` instance will
245 * take its place.
246 *
247 * The returned `MessagePort` will be an object in the target context, and will
248 * inherit from its global `Object` class. Objects passed to the
249 * `port.onmessage()` listener will also be created in the target context
250 * and inherit from its global `Object` class.
251 *
252 * However, the created `MessagePort` will no longer inherit from
253 * `EventEmitter`, and only `port.onmessage()` can be used to receive
254 * events using it.
255 */
256 function moveMessagePortToContext(port: MessagePort, context: Context): MessagePort;
257
258 /**
259 * Receive a single message from a given `MessagePort`. If no message is available,
260 * `undefined` is returned, otherwise an object with a single `message` property
261 * that contains the message payload, corresponding to the oldest message in the
262 * `MessagePort`’s queue.
263 */
264 function receiveMessageOnPort(port: MessagePort): { message: any } | undefined;
265
266 type Serializable = string | object | number | boolean | bigint;
267
268 /**
269 * @param key Any arbitrary, cloneable JavaScript value that can be used as a {Map} key.
270 * @experimental
271 */
272 function getEnvironmentData(key: Serializable): Serializable;
273
274 /**
275 * @param key Any arbitrary, cloneable JavaScript value that can be used as a {Map} key.
276 * @param value Any arbitrary, cloneable JavaScript value that will be cloned
277 * and passed automatically to all new `Worker` instances. If `value` is passed
278 * as `undefined`, any previously set value for the `key` will be deleted.
279 * @experimental
280 */
281 function setEnvironmentData(key: Serializable, value: Serializable): void;
282}