@atlaspack/workers 2.14.5-canary.25 → 2.14.5-canary.250
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +286 -0
- package/dist/Handle.js +33 -0
- package/dist/Worker.js +180 -0
- package/dist/WorkerFarm.js +539 -0
- package/dist/backend.js +34 -0
- package/dist/bus.js +24 -0
- package/dist/child.js +290 -0
- package/dist/childState.js +11 -0
- package/dist/cpuCount.js +72 -0
- package/dist/index.js +44 -0
- package/dist/process/ProcessChild.js +48 -0
- package/dist/process/ProcessWorker.js +68 -0
- package/dist/threads/ThreadsChild.js +31 -0
- package/dist/threads/ThreadsWorker.js +47 -0
- package/dist/types.js +2 -0
- package/dist/web/WebChild.js +34 -0
- package/dist/web/WebWorker.js +70 -0
- package/index.d.ts +96 -3
- package/lib/Handle.js +0 -3
- package/lib/Worker.js +7 -1
- package/lib/WorkerFarm.js +12 -7
- package/lib/backend.js +5 -1
- package/lib/bus.js +1 -1
- package/lib/child.js +11 -4
- package/lib/cpuCount.js +6 -2
- package/lib/process/ProcessChild.js +6 -1
- package/lib/process/ProcessWorker.js +9 -2
- package/lib/threads/ThreadsChild.js +3 -0
- package/lib/threads/ThreadsWorker.js +10 -2
- package/lib/types/Handle.d.ts +19 -0
- package/lib/types/Worker.d.ts +40 -0
- package/lib/types/WorkerFarm.d.ts +93 -0
- package/lib/types/backend.d.ts +4 -0
- package/lib/types/bus.d.ts +6 -0
- package/lib/types/child.d.ts +43 -0
- package/lib/types/childState.d.ts +3 -0
- package/lib/types/cpuCount.d.ts +2 -0
- package/lib/types/index.d.ts +6 -0
- package/lib/types/process/ProcessChild.d.ts +9 -0
- package/lib/types/process/ProcessWorker.d.ts +16 -0
- package/lib/types/threads/ThreadsChild.d.ts +8 -0
- package/lib/types/threads/ThreadsWorker.d.ts +15 -0
- package/lib/types/types.d.ts +52 -0
- package/lib/types/web/WebChild.d.ts +8 -0
- package/lib/types/web/WebWorker.d.ts +15 -0
- package/lib/web/WebChild.js +6 -1
- package/lib/web/WebWorker.js +19 -4
- package/package.json +15 -19
- package/src/{Handle.js → Handle.ts} +11 -11
- package/src/{Worker.js → Worker.ts} +66 -54
- package/src/{WorkerFarm.js → WorkerFarm.ts} +195 -142
- package/src/{backend.js → backend.ts} +6 -3
- package/src/{bus.js → bus.ts} +2 -3
- package/src/{child.js → child.ts} +55 -43
- package/src/{childState.js → childState.ts} +1 -2
- package/src/{cpuCount.js → cpuCount.ts} +10 -7
- package/src/{index.js → index.ts} +0 -1
- package/src/process/{ProcessChild.js → ProcessChild.ts} +5 -3
- package/src/process/{ProcessWorker.js → ProcessWorker.ts} +10 -7
- package/src/threads/{ThreadsChild.js → ThreadsChild.ts} +2 -2
- package/src/threads/{ThreadsWorker.js → ThreadsWorker.ts} +14 -8
- package/src/{types.js → types.ts} +34 -35
- package/src/web/{WebChild.js → WebChild.ts} +6 -2
- package/src/web/{WebWorker.js → WebWorker.ts} +19 -7
- package/test/{cpuCount.test.js → cpuCount.test.ts} +0 -1
- package/test/{workerfarm.test.cjs → workerfarm.test.js} +9 -2
- package/tsconfig.json +27 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
1
|
import type {ErrorWithCode, FilePath} from '@atlaspack/types-internal';
|
|
4
2
|
import type {
|
|
5
3
|
CallRequest,
|
|
@@ -22,7 +20,7 @@ import {
|
|
|
22
20
|
serialize,
|
|
23
21
|
} from '@atlaspack/build-cache';
|
|
24
22
|
import ThrowableDiagnostic, {anyToDiagnostic, md} from '@atlaspack/diagnostic';
|
|
25
|
-
import Worker, {
|
|
23
|
+
import Worker, {WorkerCall} from './Worker';
|
|
26
24
|
import cpuCount from './cpuCount';
|
|
27
25
|
import Handle from './Handle';
|
|
28
26
|
import {child} from './childState';
|
|
@@ -33,32 +31,34 @@ import logger from '@atlaspack/logger';
|
|
|
33
31
|
|
|
34
32
|
let referenceId = 1;
|
|
35
33
|
|
|
36
|
-
export
|
|
37
|
-
|
|
38
|
-
export type FarmOptions = {
|
|
39
|
-
maxConcurrentWorkers: number
|
|
40
|
-
maxConcurrentCallsPerWorker: number
|
|
41
|
-
forcedKillTime: number
|
|
42
|
-
useLocalWorker: boolean
|
|
43
|
-
warmWorkers: boolean
|
|
44
|
-
workerPath?: FilePath
|
|
45
|
-
backend: BackendType
|
|
46
|
-
shouldPatchConsole?: boolean
|
|
47
|
-
shouldTrace?: boolean
|
|
48
|
-
|
|
34
|
+
export type SharedReference = number;
|
|
35
|
+
|
|
36
|
+
export type FarmOptions = {
|
|
37
|
+
maxConcurrentWorkers: number;
|
|
38
|
+
maxConcurrentCallsPerWorker: number;
|
|
39
|
+
forcedKillTime: number;
|
|
40
|
+
useLocalWorker: boolean;
|
|
41
|
+
warmWorkers: boolean;
|
|
42
|
+
workerPath?: FilePath;
|
|
43
|
+
backend: BackendType;
|
|
44
|
+
shouldPatchConsole?: boolean;
|
|
45
|
+
shouldTrace?: boolean;
|
|
46
|
+
};
|
|
49
47
|
|
|
50
48
|
type WorkerModule = {
|
|
51
|
-
|
|
52
|
-
...
|
|
49
|
+
readonly [key: string]: (...args: Array<unknown>) => Promise<unknown>;
|
|
53
50
|
};
|
|
54
51
|
|
|
55
|
-
export type WorkerApi = {
|
|
56
|
-
callMaster(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
export type WorkerApi = {
|
|
53
|
+
callMaster(
|
|
54
|
+
arg1: CallRequest,
|
|
55
|
+
arg2?: boolean | null | undefined,
|
|
56
|
+
): Promise<unknown>;
|
|
57
|
+
createReverseHandle(fn: HandleFunction): Handle;
|
|
58
|
+
getSharedReference(ref: SharedReference): unknown;
|
|
59
|
+
resolveSharedReference(value: unknown): SharedReference | null | undefined;
|
|
60
|
+
callChild?: (childId: number, request: HandleCallRequest) => Promise<unknown>;
|
|
61
|
+
};
|
|
62
62
|
|
|
63
63
|
export {Handle};
|
|
64
64
|
|
|
@@ -72,19 +72,22 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
72
72
|
callQueue: Array<WorkerCall> = [];
|
|
73
73
|
ending: boolean = false;
|
|
74
74
|
localWorker: WorkerModule;
|
|
75
|
-
localWorkerInit:
|
|
75
|
+
localWorkerInit: Promise<undefined> | null | undefined;
|
|
76
76
|
options: FarmOptions;
|
|
77
77
|
run: HandleFunction;
|
|
78
78
|
warmWorkers: number = 0;
|
|
79
79
|
readyWorkers: number = 0;
|
|
80
80
|
workers: Map<number, Worker> = new Map();
|
|
81
81
|
handles: Map<number, Handle> = new Map();
|
|
82
|
-
sharedReferences: Map<SharedReference,
|
|
83
|
-
sharedReferencesByValue: Map<
|
|
84
|
-
serializedSharedReferences: Map<
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
82
|
+
sharedReferences: Map<SharedReference, unknown> = new Map();
|
|
83
|
+
sharedReferencesByValue: Map<unknown, SharedReference> = new Map();
|
|
84
|
+
serializedSharedReferences: Map<
|
|
85
|
+
SharedReference,
|
|
86
|
+
ArrayBufferLike | null | undefined
|
|
87
|
+
> = new Map();
|
|
88
|
+
profiler: SamplingProfiler | null | undefined;
|
|
89
|
+
|
|
90
|
+
constructor(farmOptions: Partial<FarmOptions> = {}) {
|
|
88
91
|
super();
|
|
89
92
|
this.options = {
|
|
90
93
|
maxConcurrentWorkers: WorkerFarm.getNumWorkers(),
|
|
@@ -102,9 +105,9 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
102
105
|
throw new Error('Please provide a worker path!');
|
|
103
106
|
}
|
|
104
107
|
|
|
105
|
-
// $FlowFixMe
|
|
106
108
|
this.localWorker = require(this.options.workerPath);
|
|
107
109
|
|
|
110
|
+
// @ts-expect-error TS2322
|
|
108
111
|
this.localWorkerInit =
|
|
109
112
|
this.localWorker.childInit != null ? this.localWorker.childInit() : null;
|
|
110
113
|
|
|
@@ -128,47 +131,58 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
128
131
|
this.startMaxWorkers();
|
|
129
132
|
}
|
|
130
133
|
|
|
131
|
-
workerApi: {
|
|
132
|
-
callChild: (
|
|
134
|
+
workerApi: {
|
|
135
|
+
callChild: (
|
|
136
|
+
childId: number,
|
|
137
|
+
request: HandleCallRequest,
|
|
138
|
+
) => Promise<unknown>;
|
|
133
139
|
callMaster: (
|
|
134
140
|
request: CallRequest,
|
|
135
|
-
awaitResponse?:
|
|
136
|
-
) => Promise<
|
|
137
|
-
createReverseHandle: (fn: HandleFunction) => Handle
|
|
138
|
-
getSharedReference: (ref: SharedReference) =>
|
|
139
|
-
resolveSharedReference: (value:
|
|
140
|
-
runHandle: (handle: Handle, args: Array<any>) => Promise<
|
|
141
|
-
|
|
141
|
+
awaitResponse?: boolean | null | undefined,
|
|
142
|
+
) => Promise<unknown>;
|
|
143
|
+
createReverseHandle: (fn: HandleFunction) => Handle;
|
|
144
|
+
getSharedReference: (ref: SharedReference) => unknown;
|
|
145
|
+
resolveSharedReference: (value: unknown) => undefined | SharedReference;
|
|
146
|
+
runHandle: (handle: Handle, args: Array<any>) => Promise<unknown>;
|
|
147
|
+
} = {
|
|
142
148
|
callMaster: async (
|
|
143
149
|
request: CallRequest,
|
|
144
|
-
awaitResponse:
|
|
145
|
-
): Promise<
|
|
146
|
-
// $FlowFixMe
|
|
150
|
+
awaitResponse: boolean | null = true,
|
|
151
|
+
): Promise<unknown> => {
|
|
147
152
|
let result = await this.processRequest({
|
|
148
153
|
...request,
|
|
154
|
+
// @ts-expect-error TS2322
|
|
149
155
|
awaitResponse,
|
|
150
156
|
});
|
|
151
157
|
return deserialize(serialize(result));
|
|
152
158
|
},
|
|
153
159
|
createReverseHandle: (fn: HandleFunction): Handle =>
|
|
154
160
|
this.createReverseHandle(fn),
|
|
155
|
-
callChild: (
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
161
|
+
callChild: (
|
|
162
|
+
childId: number,
|
|
163
|
+
request: HandleCallRequest,
|
|
164
|
+
): Promise<unknown> =>
|
|
165
|
+
new Promise(
|
|
166
|
+
(
|
|
167
|
+
resolve: (result: Promise<any> | any) => void,
|
|
168
|
+
reject: (error?: any) => void,
|
|
169
|
+
) => {
|
|
170
|
+
nullthrows(this.workers.get(childId)).call({
|
|
171
|
+
...request,
|
|
172
|
+
resolve,
|
|
173
|
+
reject,
|
|
174
|
+
retries: 0,
|
|
175
|
+
});
|
|
176
|
+
},
|
|
177
|
+
),
|
|
178
|
+
runHandle: (handle: Handle, args: Array<any>): Promise<unknown> =>
|
|
165
179
|
this.workerApi.callChild(nullthrows(handle.childId), {
|
|
166
180
|
handle: handle.id,
|
|
167
181
|
args,
|
|
168
182
|
}),
|
|
169
183
|
getSharedReference: (ref: SharedReference) =>
|
|
170
184
|
this.sharedReferences.get(ref),
|
|
171
|
-
resolveSharedReference: (value:
|
|
185
|
+
resolveSharedReference: (value: unknown) =>
|
|
172
186
|
this.sharedReferencesByValue.get(value),
|
|
173
187
|
};
|
|
174
188
|
|
|
@@ -234,9 +248,13 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
234
248
|
};
|
|
235
249
|
}
|
|
236
250
|
|
|
237
|
-
onError(
|
|
251
|
+
onError(
|
|
252
|
+
error: ErrorWithCode,
|
|
253
|
+
worker: Worker,
|
|
254
|
+
): undefined | Promise<undefined> {
|
|
238
255
|
// Handle ipc errors
|
|
239
256
|
if (error.code === 'ERR_IPC_CHANNEL_CLOSED') {
|
|
257
|
+
// @ts-expect-error TS2322
|
|
240
258
|
return this.stopWorker(worker);
|
|
241
259
|
} else {
|
|
242
260
|
logger.error(error, '@atlaspack/workers');
|
|
@@ -314,6 +332,7 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
314
332
|
}
|
|
315
333
|
|
|
316
334
|
if (worker.calls.size < this.options.maxConcurrentCallsPerWorker) {
|
|
335
|
+
// @ts-expect-error TS2345
|
|
317
336
|
this.callWorker(worker, this.callQueue.shift());
|
|
318
337
|
}
|
|
319
338
|
}
|
|
@@ -333,25 +352,24 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
333
352
|
}
|
|
334
353
|
|
|
335
354
|
async processRequest(
|
|
336
|
-
data: {
|
|
337
|
-
location: FilePath
|
|
338
|
-
|
|
355
|
+
data: {
|
|
356
|
+
location: FilePath;
|
|
357
|
+
} & Partial<WorkerRequest>,
|
|
339
358
|
worker?: Worker,
|
|
340
|
-
): Promise
|
|
359
|
+
): Promise<string | null | undefined> {
|
|
341
360
|
let {method, args, location, awaitResponse, idx, handle: handleId} = data;
|
|
342
361
|
let mod;
|
|
343
362
|
if (handleId != null) {
|
|
344
363
|
mod = nullthrows(this.handles.get(handleId)?.fn);
|
|
345
364
|
} else if (location) {
|
|
346
|
-
//
|
|
365
|
+
// @ts-expect-error TS2339
|
|
347
366
|
if (process.browser) {
|
|
348
367
|
if (location === '@atlaspack/workers/bus') {
|
|
349
|
-
mod =
|
|
368
|
+
mod = bus as any;
|
|
350
369
|
} else {
|
|
351
370
|
throw new Error('No dynamic require possible: ' + location);
|
|
352
371
|
}
|
|
353
372
|
} else {
|
|
354
|
-
// $FlowFixMe this must be dynamic
|
|
355
373
|
mod = require(location);
|
|
356
374
|
}
|
|
357
375
|
} else {
|
|
@@ -375,8 +393,9 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
375
393
|
let result;
|
|
376
394
|
if (method == null) {
|
|
377
395
|
try {
|
|
396
|
+
// @ts-expect-error TS2488
|
|
378
397
|
result = responseFromContent(await mod(...args));
|
|
379
|
-
} catch (e) {
|
|
398
|
+
} catch (e: any) {
|
|
380
399
|
result = errorResponseFromError(e);
|
|
381
400
|
}
|
|
382
401
|
} else {
|
|
@@ -386,9 +405,8 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
386
405
|
}
|
|
387
406
|
|
|
388
407
|
try {
|
|
389
|
-
// $FlowFixMe
|
|
390
408
|
result = responseFromContent(await mod[method](...args));
|
|
391
|
-
} catch (e) {
|
|
409
|
+
} catch (e: any) {
|
|
392
410
|
result = errorResponseFromError(e);
|
|
393
411
|
}
|
|
394
412
|
}
|
|
@@ -410,16 +428,21 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
410
428
|
throw new Error('Cannot add a worker call if workerfarm is ending.');
|
|
411
429
|
}
|
|
412
430
|
|
|
413
|
-
return new Promise(
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
431
|
+
return new Promise(
|
|
432
|
+
(
|
|
433
|
+
resolve: (result: Promise<any> | any) => void,
|
|
434
|
+
reject: (error?: any) => void,
|
|
435
|
+
) => {
|
|
436
|
+
this.callQueue.push({
|
|
437
|
+
method,
|
|
438
|
+
args: args,
|
|
439
|
+
retries: 0,
|
|
440
|
+
resolve,
|
|
441
|
+
reject,
|
|
442
|
+
});
|
|
443
|
+
this.processQueue();
|
|
444
|
+
},
|
|
445
|
+
);
|
|
423
446
|
}
|
|
424
447
|
|
|
425
448
|
async end(): Promise<void> {
|
|
@@ -466,9 +489,12 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
466
489
|
}
|
|
467
490
|
|
|
468
491
|
createSharedReference(
|
|
469
|
-
value:
|
|
492
|
+
value: unknown,
|
|
470
493
|
isCacheable: boolean = true,
|
|
471
|
-
): {
|
|
494
|
+
): {
|
|
495
|
+
ref: SharedReference;
|
|
496
|
+
dispose(): Promise<unknown>;
|
|
497
|
+
} {
|
|
472
498
|
let ref = referenceId++;
|
|
473
499
|
this.sharedReferences.set(ref, value);
|
|
474
500
|
this.sharedReferencesByValue.set(value, ref);
|
|
@@ -483,7 +509,7 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
483
509
|
this.sharedReferencesByValue.delete(value);
|
|
484
510
|
this.serializedSharedReferences.delete(ref);
|
|
485
511
|
|
|
486
|
-
let promises = [];
|
|
512
|
+
let promises: Array<Promise<any>> = [];
|
|
487
513
|
for (let worker of this.workers.values()) {
|
|
488
514
|
if (!worker.sentSharedReferences.has(ref)) {
|
|
489
515
|
continue;
|
|
@@ -491,16 +517,21 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
491
517
|
|
|
492
518
|
worker.sentSharedReferences.delete(ref);
|
|
493
519
|
promises.push(
|
|
494
|
-
new Promise(
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
520
|
+
new Promise(
|
|
521
|
+
(
|
|
522
|
+
resolve: (result: Promise<any> | any) => void,
|
|
523
|
+
reject: (error?: any) => void,
|
|
524
|
+
) => {
|
|
525
|
+
worker.call({
|
|
526
|
+
method: 'deleteSharedReference',
|
|
527
|
+
args: [ref],
|
|
528
|
+
resolve,
|
|
529
|
+
reject,
|
|
530
|
+
skipReadyCheck: true,
|
|
531
|
+
retries: 0,
|
|
532
|
+
});
|
|
533
|
+
},
|
|
534
|
+
),
|
|
504
535
|
);
|
|
505
536
|
}
|
|
506
537
|
return Promise.all(promises);
|
|
@@ -508,7 +539,7 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
508
539
|
};
|
|
509
540
|
}
|
|
510
541
|
|
|
511
|
-
getSerializedSharedReference(ref: SharedReference):
|
|
542
|
+
getSerializedSharedReference(ref: SharedReference): ArrayBufferLike {
|
|
512
543
|
let cached = this.serializedSharedReferences.get(ref);
|
|
513
544
|
if (cached) {
|
|
514
545
|
return cached;
|
|
@@ -527,19 +558,24 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
527
558
|
}
|
|
528
559
|
|
|
529
560
|
async startProfile() {
|
|
530
|
-
let promises = [];
|
|
561
|
+
let promises: Array<Promise<unknown> | Promise<any>> = [];
|
|
531
562
|
for (let worker of this.workers.values()) {
|
|
532
563
|
promises.push(
|
|
533
|
-
new Promise(
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
564
|
+
new Promise(
|
|
565
|
+
(
|
|
566
|
+
resolve: (result: Promise<any> | any) => void,
|
|
567
|
+
reject: (error?: any) => void,
|
|
568
|
+
) => {
|
|
569
|
+
worker.call({
|
|
570
|
+
method: 'startProfile',
|
|
571
|
+
args: [],
|
|
572
|
+
resolve,
|
|
573
|
+
reject,
|
|
574
|
+
retries: 0,
|
|
575
|
+
skipReadyCheck: true,
|
|
576
|
+
});
|
|
577
|
+
},
|
|
578
|
+
),
|
|
543
579
|
);
|
|
544
580
|
}
|
|
545
581
|
|
|
@@ -560,16 +596,21 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
560
596
|
for (let worker of this.workers.values()) {
|
|
561
597
|
names.push('Worker ' + worker.id);
|
|
562
598
|
promises.push(
|
|
563
|
-
new Promise(
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
599
|
+
new Promise(
|
|
600
|
+
(
|
|
601
|
+
resolve: (result: Promise<any> | any) => void,
|
|
602
|
+
reject: (error?: any) => void,
|
|
603
|
+
) => {
|
|
604
|
+
worker.call({
|
|
605
|
+
method: 'endProfile',
|
|
606
|
+
args: [],
|
|
607
|
+
resolve,
|
|
608
|
+
reject,
|
|
609
|
+
retries: 0,
|
|
610
|
+
skipReadyCheck: true,
|
|
611
|
+
});
|
|
612
|
+
},
|
|
613
|
+
),
|
|
573
614
|
);
|
|
574
615
|
}
|
|
575
616
|
|
|
@@ -579,11 +620,12 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
579
620
|
let stream = trace.pipe(fs.createWriteStream(filename));
|
|
580
621
|
|
|
581
622
|
for (let profile of profiles) {
|
|
623
|
+
// @ts-expect-error TS2345
|
|
582
624
|
trace.addCPUProfile(names.shift(), profile);
|
|
583
625
|
}
|
|
584
626
|
|
|
585
627
|
trace.flush();
|
|
586
|
-
await new Promise((resolve) => {
|
|
628
|
+
await new Promise((resolve: (result: Promise<never>) => void) => {
|
|
587
629
|
stream.once('finish', resolve);
|
|
588
630
|
});
|
|
589
631
|
|
|
@@ -594,18 +636,23 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
594
636
|
}
|
|
595
637
|
|
|
596
638
|
async callAllWorkers(method: string, args: Array<any>) {
|
|
597
|
-
let promises = [];
|
|
639
|
+
let promises: Array<Promise<unknown> | Promise<any>> = [];
|
|
598
640
|
for (let worker of this.workers.values()) {
|
|
599
641
|
promises.push(
|
|
600
|
-
new Promise(
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
642
|
+
new Promise(
|
|
643
|
+
(
|
|
644
|
+
resolve: (result: Promise<any> | any) => void,
|
|
645
|
+
reject: (error?: any) => void,
|
|
646
|
+
) => {
|
|
647
|
+
worker.call({
|
|
648
|
+
method,
|
|
649
|
+
args,
|
|
650
|
+
resolve,
|
|
651
|
+
reject,
|
|
652
|
+
retries: 0,
|
|
653
|
+
});
|
|
654
|
+
},
|
|
655
|
+
),
|
|
609
656
|
);
|
|
610
657
|
}
|
|
611
658
|
|
|
@@ -620,16 +667,21 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
620
667
|
let snapshotPaths = await Promise.all(
|
|
621
668
|
[...this.workers.values()].map(
|
|
622
669
|
(worker) =>
|
|
623
|
-
new Promise(
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
670
|
+
new Promise(
|
|
671
|
+
(
|
|
672
|
+
resolve: (result: Promise<any> | any) => void,
|
|
673
|
+
reject: (error?: any) => void,
|
|
674
|
+
) => {
|
|
675
|
+
worker.call({
|
|
676
|
+
method: 'takeHeapSnapshot',
|
|
677
|
+
args: [snapshotId],
|
|
678
|
+
resolve,
|
|
679
|
+
reject,
|
|
680
|
+
retries: 0,
|
|
681
|
+
skipReadyCheck: true,
|
|
682
|
+
});
|
|
683
|
+
},
|
|
684
|
+
),
|
|
633
685
|
),
|
|
634
686
|
);
|
|
635
687
|
|
|
@@ -657,16 +709,16 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
657
709
|
return !!child;
|
|
658
710
|
}
|
|
659
711
|
|
|
660
|
-
static getWorkerApi(): {
|
|
712
|
+
static getWorkerApi(): {
|
|
661
713
|
callMaster: (
|
|
662
714
|
request: CallRequest,
|
|
663
|
-
awaitResponse?:
|
|
664
|
-
) => Promise<
|
|
665
|
-
createReverseHandle: (fn: (...args: Array<any>) =>
|
|
666
|
-
getSharedReference: (ref: SharedReference) =>
|
|
667
|
-
resolveSharedReference: (value:
|
|
668
|
-
runHandle: (handle: Handle, args: Array<any>) => Promise<
|
|
669
|
-
|
|
715
|
+
awaitResponse?: boolean | null | undefined,
|
|
716
|
+
) => Promise<unknown>;
|
|
717
|
+
createReverseHandle: (fn: (...args: Array<any>) => unknown) => Handle;
|
|
718
|
+
getSharedReference: (ref: SharedReference) => unknown;
|
|
719
|
+
resolveSharedReference: (value: unknown) => undefined | SharedReference;
|
|
720
|
+
runHandle: (handle: Handle, args: Array<any>) => Promise<unknown>;
|
|
721
|
+
} {
|
|
670
722
|
invariant(
|
|
671
723
|
child != null,
|
|
672
724
|
'WorkerFarm.getWorkerApi can only be called within workers',
|
|
@@ -675,9 +727,10 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
675
727
|
}
|
|
676
728
|
|
|
677
729
|
static getConcurrentCallsPerWorker(
|
|
678
|
-
defaultValue
|
|
730
|
+
defaultValue: number = DEFAULT_MAX_CONCURRENT_CALLS,
|
|
679
731
|
): number {
|
|
680
732
|
return (
|
|
733
|
+
// @ts-expect-error TS2345
|
|
681
734
|
parseInt(process.env.ATLASPACK_MAX_CONCURRENT_CALLS, 10) || defaultValue
|
|
682
735
|
);
|
|
683
736
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
// @flow
|
|
2
1
|
import type {BackendType, WorkerImpl} from './types';
|
|
3
2
|
|
|
3
|
+
// flow-to-ts helpers
|
|
4
|
+
export type Class<T> = new (...args: any[]) => T;
|
|
5
|
+
// /flow-to-ts helpers
|
|
6
|
+
|
|
4
7
|
export function detectBackend(): BackendType {
|
|
5
|
-
//
|
|
8
|
+
// @ts-expect-error TS2339
|
|
6
9
|
if (process.browser) return 'web';
|
|
7
10
|
|
|
8
11
|
switch (process.env.ATLASPACK_WORKER_BACKEND) {
|
|
@@ -14,7 +17,7 @@ export function detectBackend(): BackendType {
|
|
|
14
17
|
try {
|
|
15
18
|
require('worker_threads');
|
|
16
19
|
return 'threads';
|
|
17
|
-
} catch (err) {
|
|
20
|
+
} catch (err: any) {
|
|
18
21
|
return 'process';
|
|
19
22
|
}
|
|
20
23
|
}
|
package/src/{bus.js → bus.ts}
RENAMED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// @flow
|
|
2
1
|
import EventEmitter from 'events';
|
|
3
2
|
import {child} from './childState';
|
|
4
3
|
|
|
@@ -7,7 +6,7 @@ class Bus extends EventEmitter {
|
|
|
7
6
|
if (child) {
|
|
8
7
|
child.workerApi.callMaster(
|
|
9
8
|
{
|
|
10
|
-
//
|
|
9
|
+
// @ts-expect-error TS2339
|
|
11
10
|
location: process.browser ? '@atlaspack/workers/bus' : __filename,
|
|
12
11
|
method: 'emit',
|
|
13
12
|
args: [event, ...args],
|
|
@@ -21,4 +20,4 @@ class Bus extends EventEmitter {
|
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
export default
|
|
23
|
+
export default new Bus() as Bus;
|