Completed
Push — master ( cdadad...8d09a6 )
by Dimas
36:02 queued 17:12
created

libs/typings/node/worker_threads.d.ts   F

Complexity

Total Complexity 76
Complexity/F 1

Size

Lines of Code 192
Function Count 76

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 139
dl 0
loc 192
rs 2.32
c 0
b 0
f 0
wmc 76
mnd 0
bc 0
fnc 76
bpm 0
cpm 1
noi 0

28 Functions

Rating   Name   Duplication   Size   Complexity  
A Worker.ref 0 1 1
A MessagePort.ref 0 1 1
A Worker.once 0 2 1
A Worker.removeListener 0 2 1
A MessagePort.removeListener 0 2 1
A Worker.prependOnceListener 0 2 1
A Worker.terminate 0 5 1
A MessagePort.addListener 0 2 1
A worker_threads.d.ts ➔ receiveMessageOnPort 0 8 1
A Worker.postMessage 0 2 1
A MessagePort.prependListener 0 2 1
A Worker.getHeapSnapshot 0 10 1
A Worker.off 0 2 1
A MessagePort.on 0 2 1
A MessagePort.close 0 1 1
A worker_threads.d.ts ➔ moveMessagePortToContext 0 16 1
A MessagePort.once 0 2 1
A MessagePort.start 0 1 1
A MessagePort.postMessage 0 1 1
A Worker.addListener 0 2 1
A Worker.prependListener 0 2 1
A MessagePort.prependOnceListener 0 2 1
A MessagePort.emit 0 2 1
A Worker.on 0 2 1
A Worker.emit 0 2 1
A MessagePort.off 0 2 1
A Worker.unref 0 1 1
A MessagePort.unref 0 1 1

How to fix   Complexity   

Complexity

Complex classes like libs/typings/node/worker_threads.d.ts often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
declare module "worker_threads" {
2
    import { Context } from "vm";
3
    import { EventEmitter } from "events";
4
    import { Readable, Writable } from "stream";
5
    import { URL } from "url";
6
7
    const isMainThread: boolean;
8
    const parentPort: null | MessagePort;
9
    const SHARE_ENV: unique symbol;
10
    const threadId: number;
11
    const workerData: any;
12
13
    class MessageChannel {
14
        readonly port1: MessagePort;
15
        readonly port2: MessagePort;
16
    }
17
18
    class MessagePort extends EventEmitter {
19
        close(): void;
20
        postMessage(value: any, transferList?: Array<ArrayBuffer | MessagePort>): void;
21
        ref(): void;
22
        unref(): void;
23
        start(): void;
24
25
        addListener(event: "close", listener: () => void): this;
26
        addListener(event: "message", listener: (value: any) => void): this;
27
        addListener(event: string | symbol, listener: (...args: any[]) => void): this;
28
29
        emit(event: "close"): boolean;
30
        emit(event: "message", value: any): boolean;
31
        emit(event: string | symbol, ...args: any[]): boolean;
32
33
        on(event: "close", listener: () => void): this;
34
        on(event: "message", listener: (value: any) => void): this;
35
        on(event: string | symbol, listener: (...args: any[]) => void): this;
36
37
        once(event: "close", listener: () => void): this;
38
        once(event: "message", listener: (value: any) => void): this;
39
        once(event: string | symbol, listener: (...args: any[]) => void): this;
40
41
        prependListener(event: "close", listener: () => void): this;
42
        prependListener(event: "message", listener: (value: any) => void): this;
43
        prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
44
45
        prependOnceListener(event: "close", listener: () => void): this;
46
        prependOnceListener(event: "message", listener: (value: any) => void): this;
47
        prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
48
49
        removeListener(event: "close", listener: () => void): this;
50
        removeListener(event: "message", listener: (value: any) => void): this;
51
        removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
52
53
        off(event: "close", listener: () => void): this;
54
        off(event: "message", listener: (value: any) => void): this;
55
        off(event: string | symbol, listener: (...args: any[]) => void): this;
56
    }
57
58
    interface WorkerOptions {
59
        /**
60
         * List of arguments which would be stringified and appended to
61
         * `process.argv` in the worker. This is mostly similar to the `workerData`
62
         * but the values will be available on the global `process.argv` as if they
63
         * were passed as CLI options to the script.
64
         */
65
        argv?: any[];
66
        env?: NodeJS.Dict<string> | typeof SHARE_ENV;
67
        eval?: boolean;
68
        workerData?: any;
69
        stdin?: boolean;
70
        stdout?: boolean;
71
        stderr?: boolean;
72
        execArgv?: string[];
73
        resourceLimits?: ResourceLimits;
74
        /**
75
         * Additional data to send in the first worker message.
76
         */
77
        transferList?: Array<ArrayBuffer | MessagePort>;
78
    }
79
80
    interface ResourceLimits {
81
        maxYoungGenerationSizeMb?: number;
82
        maxOldGenerationSizeMb?: number;
83
        codeRangeSizeMb?: number;
84
    }
85
86
    class Worker extends EventEmitter {
87
        readonly stdin: Writable | null;
88
        readonly stdout: Readable;
89
        readonly stderr: Readable;
90
        readonly threadId: number;
91
        readonly resourceLimits?: ResourceLimits;
92
93
        /**
94
         * @param filename  The path to the Worker’s main script or module.
95
         *                  Must be either an absolute path or a relative path (i.e. relative to the current working directory) starting with ./ or ../,
96
         *                  or a WHATWG URL object using file: protocol. If options.eval is true, this is a string containing JavaScript code rather than a path.
97
         */
98
        constructor(filename: string | URL, options?: WorkerOptions);
99
100
        postMessage(value: any, transferList?: Array<ArrayBuffer | MessagePort>): void;
101
        ref(): void;
102
        unref(): void;
103
        /**
104
         * Stop all JavaScript execution in the worker thread as soon as possible.
105
         * Returns a Promise for the exit code that is fulfilled when the `exit` event is emitted.
106
         */
107
        terminate(): Promise<number>;
108
109
        /**
110
         * Returns a readable stream for a V8 snapshot of the current state of the Worker.
111
         * See [`v8.getHeapSnapshot()`][] for more details.
112
         *
113
         * If the Worker thread is no longer running, which may occur before the
114
         * [`'exit'` event][] is emitted, the returned `Promise` will be rejected
115
         * immediately with an [`ERR_WORKER_NOT_RUNNING`][] error
116
         */
117
        getHeapSnapshot(): Promise<Readable>;
118
119
        addListener(event: "error", listener: (err: Error) => void): this;
120
        addListener(event: "exit", listener: (exitCode: number) => void): this;
121
        addListener(event: "message", listener: (value: any) => void): this;
122
        addListener(event: "online", listener: () => void): this;
123
        addListener(event: string | symbol, listener: (...args: any[]) => void): this;
124
125
        emit(event: "error", err: Error): boolean;
126
        emit(event: "exit", exitCode: number): boolean;
127
        emit(event: "message", value: any): boolean;
128
        emit(event: "online"): boolean;
129
        emit(event: string | symbol, ...args: any[]): boolean;
130
131
        on(event: "error", listener: (err: Error) => void): this;
132
        on(event: "exit", listener: (exitCode: number) => void): this;
133
        on(event: "message", listener: (value: any) => void): this;
134
        on(event: "online", listener: () => void): this;
135
        on(event: string | symbol, listener: (...args: any[]) => void): this;
136
137
        once(event: "error", listener: (err: Error) => void): this;
138
        once(event: "exit", listener: (exitCode: number) => void): this;
139
        once(event: "message", listener: (value: any) => void): this;
140
        once(event: "online", listener: () => void): this;
141
        once(event: string | symbol, listener: (...args: any[]) => void): this;
142
143
        prependListener(event: "error", listener: (err: Error) => void): this;
144
        prependListener(event: "exit", listener: (exitCode: number) => void): this;
145
        prependListener(event: "message", listener: (value: any) => void): this;
146
        prependListener(event: "online", listener: () => void): this;
147
        prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
148
149
        prependOnceListener(event: "error", listener: (err: Error) => void): this;
150
        prependOnceListener(event: "exit", listener: (exitCode: number) => void): this;
151
        prependOnceListener(event: "message", listener: (value: any) => void): this;
152
        prependOnceListener(event: "online", listener: () => void): this;
153
        prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
154
155
        removeListener(event: "error", listener: (err: Error) => void): this;
156
        removeListener(event: "exit", listener: (exitCode: number) => void): this;
157
        removeListener(event: "message", listener: (value: any) => void): this;
158
        removeListener(event: "online", listener: () => void): this;
159
        removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
160
161
        off(event: "error", listener: (err: Error) => void): this;
162
        off(event: "exit", listener: (exitCode: number) => void): this;
163
        off(event: "message", listener: (value: any) => void): this;
164
        off(event: "online", listener: () => void): this;
165
        off(event: string | symbol, listener: (...args: any[]) => void): this;
166
    }
167
168
    /**
169
     * Transfer a `MessagePort` to a different `vm` Context. The original `port`
170
     * object will be rendered unusable, and the returned `MessagePort` instance will
171
     * take its place.
172
     *
173
     * The returned `MessagePort` will be an object in the target context, and will
174
     * inherit from its global `Object` class. Objects passed to the
175
     * `port.onmessage()` listener will also be created in the target context
176
     * and inherit from its global `Object` class.
177
     *
178
     * However, the created `MessagePort` will no longer inherit from
179
     * `EventEmitter`, and only `port.onmessage()` can be used to receive
180
     * events using it.
181
     */
182
    function moveMessagePortToContext(port: MessagePort, context: Context): MessagePort;
183
184
    /**
185
     * Receive a single message from a given `MessagePort`. If no message is available,
186
     * `undefined` is returned, otherwise an object with a single `message` property
187
     * that contains the message payload, corresponding to the oldest message in the
188
     * `MessagePort`’s queue.
189
     */
190
    function receiveMessageOnPort(port: MessagePort): { message: any } | undefined;
191
}
192