1declare module "worker_threads" {
2    import { EventEmitter } from "events";
3    import { Readable, Writable } from "stream";
4
5    const isMainThread: boolean;
6    const parentPort: null | MessagePort;
7    const threadId: number;
8    const workerData: any;
9
10    class MessageChannel {
11        readonly port1: MessagePort;
12        readonly port2: MessagePort;
13    }
14
15    class MessagePort extends EventEmitter {
16        close(): void;
17        postMessage(value: any, transferList?: Array<ArrayBuffer | MessagePort>): void;
18        ref(): void;
19        unref(): void;
20        start(): void;
21
22        addListener(event: "close", listener: () => void): this;
23        addListener(event: "message", listener: (value: any) => void): this;
24        addListener(event: string | symbol, listener: (...args: any[]) => void): this;
25
26        emit(event: "close"): boolean;
27        emit(event: "message", value: any): boolean;
28        emit(event: string | symbol, ...args: any[]): boolean;
29
30        on(event: "close", listener: () => void): this;
31        on(event: "message", listener: (value: any) => void): this;
32        on(event: string | symbol, listener: (...args: any[]) => void): this;
33
34        once(event: "close", listener: () => void): this;
35        once(event: "message", listener: (value: any) => void): this;
36        once(event: string | symbol, listener: (...args: any[]) => void): this;
37
38        prependListener(event: "close", listener: () => void): this;
39        prependListener(event: "message", listener: (value: any) => void): this;
40        prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
41
42        prependOnceListener(event: "close", listener: () => void): this;
43        prependOnceListener(event: "message", listener: (value: any) => void): this;
44        prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
45
46        removeListener(event: "close", listener: () => void): this;
47        removeListener(event: "message", listener: (value: any) => void): this;
48        removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
49
50        off(event: "close", listener: () => void): this;
51        off(event: "message", listener: (value: any) => void): this;
52        off(event: string | symbol, listener: (...args: any[]) => void): this;
53    }
54
55    interface WorkerOptions {
56        eval?: boolean;
57        workerData?: any;
58        stdin?: boolean;
59        stdout?: boolean;
60        stderr?: boolean;
61    }
62
63    class Worker extends EventEmitter {
64        readonly stdin: Writable | null;
65        readonly stdout: Readable;
66        readonly stderr: Readable;
67        readonly threadId: number;
68
69        constructor(filename: string, options?: WorkerOptions);
70
71        postMessage(value: any, transferList?: Array<ArrayBuffer | MessagePort>): void;
72        ref(): void;
73        unref(): void;
74        terminate(callback?: (err: any, exitCode: number) => void): void;
75
76        addListener(event: "error", listener: (err: any) => void): this;
77        addListener(event: "exit", listener: (exitCode: number) => void): this;
78        addListener(event: "message", listener: (value: any) => void): this;
79        addListener(event: "online", listener: () => void): this;
80        addListener(event: string | symbol, listener: (...args: any[]) => void): this;
81
82        emit(event: "error", err: any): boolean;
83        emit(event: "exit", exitCode: number): boolean;
84        emit(event: "message", value: any): boolean;
85        emit(event: "online"): boolean;
86        emit(event: string | symbol, ...args: any[]): boolean;
87
88        on(event: "error", listener: (err: any) => void): this;
89        on(event: "exit", listener: (exitCode: number) => void): this;
90        on(event: "message", listener: (value: any) => void): this;
91        on(event: "online", listener: () => void): this;
92        on(event: string | symbol, listener: (...args: any[]) => void): this;
93
94        once(event: "error", listener: (err: any) => void): this;
95        once(event: "exit", listener: (exitCode: number) => void): this;
96        once(event: "message", listener: (value: any) => void): this;
97        once(event: "online", listener: () => void): this;
98        once(event: string | symbol, listener: (...args: any[]) => void): this;
99
100        prependListener(event: "error", listener: (err: any) => void): this;
101        prependListener(event: "exit", listener: (exitCode: number) => void): this;
102        prependListener(event: "message", listener: (value: any) => void): this;
103        prependListener(event: "online", listener: () => void): this;
104        prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
105
106        prependOnceListener(event: "error", listener: (err: any) => void): this;
107        prependOnceListener(event: "exit", listener: (exitCode: number) => void): this;
108        prependOnceListener(event: "message", listener: (value: any) => void): this;
109        prependOnceListener(event: "online", listener: () => void): this;
110        prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
111
112        removeListener(event: "error", listener: (err: any) => void): this;
113        removeListener(event: "exit", listener: (exitCode: number) => void): this;
114        removeListener(event: "message", listener: (value: any) => void): this;
115        removeListener(event: "online", listener: () => void): this;
116        removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
117
118        off(event: "error", listener: (err: any) => void): this;
119        off(event: "exit", listener: (exitCode: number) => void): this;
120        off(event: "message", listener: (value: any) => void): this;
121        off(event: "online", listener: () => void): this;
122        off(event: string | symbol, listener: (...args: any[]) => void): this;
123    }
124}
125