1declare module "worker_threads" {
2    import { Context } from "vm";
3    import { EventEmitter } from "events";
4    import { Readable, Writable } from "stream";
5
6    const isMainThread: boolean;
7    const parentPort: null | MessagePort;
8    const threadId: number;
9    const workerData: any;
10
11    class MessageChannel {
12        readonly port1: MessagePort;
13        readonly port2: MessagePort;
14    }
15
16    class MessagePort extends EventEmitter {
17        close(): void;
18        postMessage(value: any, transferList?: Array<ArrayBuffer | MessagePort>): void;
19        ref(): void;
20        unref(): void;
21        start(): void;
22
23        addListener(event: "close", listener: () => void): this;
24        addListener(event: "message", listener: (value: any) => void): this;
25        addListener(event: string | symbol, listener: (...args: any[]) => void): this;
26
27        emit(event: "close"): boolean;
28        emit(event: "message", value: any): boolean;
29        emit(event: string | symbol, ...args: any[]): boolean;
30
31        on(event: "close", listener: () => void): this;
32        on(event: "message", listener: (value: any) => void): this;
33        on(event: string | symbol, listener: (...args: any[]) => void): this;
34
35        once(event: "close", listener: () => void): this;
36        once(event: "message", listener: (value: any) => void): this;
37        once(event: string | symbol, listener: (...args: any[]) => void): this;
38
39        prependListener(event: "close", listener: () => void): this;
40        prependListener(event: "message", listener: (value: any) => void): this;
41        prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
42
43        prependOnceListener(event: "close", listener: () => void): this;
44        prependOnceListener(event: "message", listener: (value: any) => void): this;
45        prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
46
47        removeListener(event: "close", listener: () => void): this;
48        removeListener(event: "message", listener: (value: any) => void): this;
49        removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
50
51        off(event: "close", listener: () => void): this;
52        off(event: "message", listener: (value: any) => void): this;
53        off(event: string | symbol, listener: (...args: any[]) => void): this;
54    }
55
56    interface WorkerOptions {
57        eval?: boolean;
58        workerData?: any;
59        stdin?: boolean;
60        stdout?: boolean;
61        stderr?: boolean;
62        execArgv?: string[];
63    }
64
65    class Worker extends EventEmitter {
66        readonly stdin: Writable | null;
67        readonly stdout: Readable;
68        readonly stderr: Readable;
69        readonly threadId: number;
70
71        constructor(filename: string, options?: WorkerOptions);
72
73        postMessage(value: any, transferList?: Array<ArrayBuffer | MessagePort>): void;
74        ref(): void;
75        unref(): void;
76        /**
77         * Stop all JavaScript execution in the worker thread as soon as possible.
78         * Returns a Promise for the exit code that is fulfilled when the `exit` event is emitted.
79         */
80        terminate(): Promise<number>;
81        /**
82         * Transfer a `MessagePort` to a different `vm` Context. The original `port`
83         * object will be rendered unusable, and the returned `MessagePort` instance will
84         * take its place.
85         *
86         * The returned `MessagePort` will be an object in the target context, and will
87         * inherit from its global `Object` class. Objects passed to the
88         * `port.onmessage()` listener will also be created in the target context
89         * and inherit from its global `Object` class.
90         *
91         * However, the created `MessagePort` will no longer inherit from
92         * `EventEmitter`, and only `port.onmessage()` can be used to receive
93         * events using it.
94         */
95        moveMessagePortToContext(port: MessagePort, context: Context): MessagePort;
96
97        /**
98         * Receive a single message from a given `MessagePort`. If no message is available,
99         * `undefined` is returned, otherwise an object with a single `message` property
100         * that contains the message payload, corresponding to the oldest message in the
101         * `MessagePort`’s queue.
102         */
103        receiveMessageOnPort(port: MessagePort): {} | undefined;
104
105        addListener(event: "error", listener: (err: Error) => void): this;
106        addListener(event: "exit", listener: (exitCode: number) => void): this;
107        addListener(event: "message", listener: (value: any) => void): this;
108        addListener(event: "online", listener: () => void): this;
109        addListener(event: string | symbol, listener: (...args: any[]) => void): this;
110
111        emit(event: "error", err: Error): boolean;
112        emit(event: "exit", exitCode: number): boolean;
113        emit(event: "message", value: any): boolean;
114        emit(event: "online"): boolean;
115        emit(event: string | symbol, ...args: any[]): boolean;
116
117        on(event: "error", listener: (err: Error) => void): this;
118        on(event: "exit", listener: (exitCode: number) => void): this;
119        on(event: "message", listener: (value: any) => void): this;
120        on(event: "online", listener: () => void): this;
121        on(event: string | symbol, listener: (...args: any[]) => void): this;
122
123        once(event: "error", listener: (err: Error) => void): this;
124        once(event: "exit", listener: (exitCode: number) => void): this;
125        once(event: "message", listener: (value: any) => void): this;
126        once(event: "online", listener: () => void): this;
127        once(event: string | symbol, listener: (...args: any[]) => void): this;
128
129        prependListener(event: "error", listener: (err: Error) => void): this;
130        prependListener(event: "exit", listener: (exitCode: number) => void): this;
131        prependListener(event: "message", listener: (value: any) => void): this;
132        prependListener(event: "online", listener: () => void): this;
133        prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
134
135        prependOnceListener(event: "error", listener: (err: Error) => void): this;
136        prependOnceListener(event: "exit", listener: (exitCode: number) => void): this;
137        prependOnceListener(event: "message", listener: (value: any) => void): this;
138        prependOnceListener(event: "online", listener: () => void): this;
139        prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
140
141        removeListener(event: "error", listener: (err: Error) => void): this;
142        removeListener(event: "exit", listener: (exitCode: number) => void): this;
143        removeListener(event: "message", listener: (value: any) => void): this;
144        removeListener(event: "online", listener: () => void): this;
145        removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
146
147        off(event: "error", listener: (err: Error) => void): this;
148        off(event: "exit", listener: (exitCode: number) => void): this;
149        off(event: "message", listener: (value: any) => void): this;
150        off(event: "online", listener: () => void): this;
151        off(event: string | symbol, listener: (...args: any[]) => void): this;
152    }
153}
154