@atlaspack/workers 2.14.21 → 2.14.22-typescript-5ad950d33.0
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/LICENSE +201 -0
- package/index.d.ts +94 -2
- package/lib/Handle.d.ts +19 -0
- package/lib/Handle.js +0 -3
- package/lib/Worker.d.ts +40 -0
- package/lib/Worker.js +7 -1
- package/lib/WorkerFarm.d.ts +93 -0
- package/lib/WorkerFarm.js +17 -7
- package/lib/backend.d.ts +4 -0
- package/lib/backend.js +5 -1
- package/lib/bus.d.ts +6 -0
- package/lib/bus.js +1 -1
- package/lib/child.d.ts +43 -0
- package/lib/child.js +11 -4
- package/lib/childState.d.ts +3 -0
- package/lib/cpuCount.d.ts +2 -0
- package/lib/cpuCount.js +6 -2
- package/lib/index.d.ts +6 -0
- package/lib/process/ProcessChild.d.ts +9 -0
- package/lib/process/ProcessChild.js +6 -1
- package/lib/process/ProcessWorker.d.ts +16 -0
- package/lib/process/ProcessWorker.js +9 -2
- package/lib/threads/ThreadsChild.d.ts +8 -0
- package/lib/threads/ThreadsChild.js +3 -0
- package/lib/threads/ThreadsWorker.d.ts +15 -0
- package/lib/threads/ThreadsWorker.js +10 -2
- package/lib/types.d.ts +52 -0
- package/lib/web/WebChild.d.ts +8 -0
- package/lib/web/WebChild.js +6 -1
- package/lib/web/WebWorker.d.ts +15 -0
- package/lib/web/WebWorker.js +20 -4
- package/package.json +16 -12
- package/src/{Handle.js → Handle.ts} +11 -11
- package/src/{Worker.js → Worker.ts} +66 -54
- package/src/{WorkerFarm.js → WorkerFarm.ts} +198 -141
- 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} +4 -2
- package/tsconfig.json +4 -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
|
+
ArrayBuffer | 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);
|
|
@@ -520,26 +551,33 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
520
551
|
// If the reference was created with the isCacheable option set to false,
|
|
521
552
|
// serializedSharedReferences will contain `null` as the value.
|
|
522
553
|
if (cached !== null) {
|
|
554
|
+
// @ts-expect-error TS2345
|
|
523
555
|
this.serializedSharedReferences.set(ref, buf);
|
|
524
556
|
}
|
|
525
557
|
|
|
558
|
+
// @ts-expect-error TS2322
|
|
526
559
|
return buf;
|
|
527
560
|
}
|
|
528
561
|
|
|
529
562
|
async startProfile() {
|
|
530
|
-
let promises = [];
|
|
563
|
+
let promises: Array<Promise<unknown> | Promise<any>> = [];
|
|
531
564
|
for (let worker of this.workers.values()) {
|
|
532
565
|
promises.push(
|
|
533
|
-
new Promise(
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
566
|
+
new Promise(
|
|
567
|
+
(
|
|
568
|
+
resolve: (result: Promise<any> | any) => void,
|
|
569
|
+
reject: (error?: any) => void,
|
|
570
|
+
) => {
|
|
571
|
+
worker.call({
|
|
572
|
+
method: 'startProfile',
|
|
573
|
+
args: [],
|
|
574
|
+
resolve,
|
|
575
|
+
reject,
|
|
576
|
+
retries: 0,
|
|
577
|
+
skipReadyCheck: true,
|
|
578
|
+
});
|
|
579
|
+
},
|
|
580
|
+
),
|
|
543
581
|
);
|
|
544
582
|
}
|
|
545
583
|
|
|
@@ -560,16 +598,21 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
560
598
|
for (let worker of this.workers.values()) {
|
|
561
599
|
names.push('Worker ' + worker.id);
|
|
562
600
|
promises.push(
|
|
563
|
-
new Promise(
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
601
|
+
new Promise(
|
|
602
|
+
(
|
|
603
|
+
resolve: (result: Promise<any> | any) => void,
|
|
604
|
+
reject: (error?: any) => void,
|
|
605
|
+
) => {
|
|
606
|
+
worker.call({
|
|
607
|
+
method: 'endProfile',
|
|
608
|
+
args: [],
|
|
609
|
+
resolve,
|
|
610
|
+
reject,
|
|
611
|
+
retries: 0,
|
|
612
|
+
skipReadyCheck: true,
|
|
613
|
+
});
|
|
614
|
+
},
|
|
615
|
+
),
|
|
573
616
|
);
|
|
574
617
|
}
|
|
575
618
|
|
|
@@ -579,33 +622,40 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
579
622
|
let stream = trace.pipe(fs.createWriteStream(filename));
|
|
580
623
|
|
|
581
624
|
for (let profile of profiles) {
|
|
625
|
+
// @ts-expect-error TS2345
|
|
582
626
|
trace.addCPUProfile(names.shift(), profile);
|
|
583
627
|
}
|
|
584
628
|
|
|
585
629
|
trace.flush();
|
|
586
|
-
await new Promise((resolve) => {
|
|
630
|
+
await new Promise((resolve: (result: Promise<never>) => void) => {
|
|
587
631
|
stream.once('finish', resolve);
|
|
588
632
|
});
|
|
589
633
|
|
|
590
634
|
logger.info({
|
|
591
635
|
origin: '@atlaspack/workers',
|
|
636
|
+
// @ts-expect-error TS2345
|
|
592
637
|
message: md`Wrote profile to ${filename}`,
|
|
593
638
|
});
|
|
594
639
|
}
|
|
595
640
|
|
|
596
641
|
async callAllWorkers(method: string, args: Array<any>) {
|
|
597
|
-
let promises = [];
|
|
642
|
+
let promises: Array<Promise<unknown> | Promise<any>> = [];
|
|
598
643
|
for (let worker of this.workers.values()) {
|
|
599
644
|
promises.push(
|
|
600
|
-
new Promise(
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
645
|
+
new Promise(
|
|
646
|
+
(
|
|
647
|
+
resolve: (result: Promise<any> | any) => void,
|
|
648
|
+
reject: (error?: any) => void,
|
|
649
|
+
) => {
|
|
650
|
+
worker.call({
|
|
651
|
+
method,
|
|
652
|
+
args,
|
|
653
|
+
resolve,
|
|
654
|
+
reject,
|
|
655
|
+
retries: 0,
|
|
656
|
+
});
|
|
657
|
+
},
|
|
658
|
+
),
|
|
609
659
|
);
|
|
610
660
|
}
|
|
611
661
|
|
|
@@ -620,21 +670,27 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
620
670
|
let snapshotPaths = await Promise.all(
|
|
621
671
|
[...this.workers.values()].map(
|
|
622
672
|
(worker) =>
|
|
623
|
-
new Promise(
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
673
|
+
new Promise(
|
|
674
|
+
(
|
|
675
|
+
resolve: (result: Promise<any> | any) => void,
|
|
676
|
+
reject: (error?: any) => void,
|
|
677
|
+
) => {
|
|
678
|
+
worker.call({
|
|
679
|
+
method: 'takeHeapSnapshot',
|
|
680
|
+
args: [snapshotId],
|
|
681
|
+
resolve,
|
|
682
|
+
reject,
|
|
683
|
+
retries: 0,
|
|
684
|
+
skipReadyCheck: true,
|
|
685
|
+
});
|
|
686
|
+
},
|
|
687
|
+
),
|
|
633
688
|
),
|
|
634
689
|
);
|
|
635
690
|
|
|
636
691
|
logger.info({
|
|
637
692
|
origin: '@atlaspack/workers',
|
|
693
|
+
// @ts-expect-error TS2345
|
|
638
694
|
message: md`Wrote heap snapshots to the following paths:\n${snapshotPaths.join(
|
|
639
695
|
'\n',
|
|
640
696
|
)}`,
|
|
@@ -657,16 +713,16 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
657
713
|
return !!child;
|
|
658
714
|
}
|
|
659
715
|
|
|
660
|
-
static getWorkerApi(): {
|
|
716
|
+
static getWorkerApi(): {
|
|
661
717
|
callMaster: (
|
|
662
718
|
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
|
-
|
|
719
|
+
awaitResponse?: boolean | null | undefined,
|
|
720
|
+
) => Promise<unknown>;
|
|
721
|
+
createReverseHandle: (fn: (...args: Array<any>) => unknown) => Handle;
|
|
722
|
+
getSharedReference: (ref: SharedReference) => unknown;
|
|
723
|
+
resolveSharedReference: (value: unknown) => undefined | SharedReference;
|
|
724
|
+
runHandle: (handle: Handle, args: Array<any>) => Promise<unknown>;
|
|
725
|
+
} {
|
|
670
726
|
invariant(
|
|
671
727
|
child != null,
|
|
672
728
|
'WorkerFarm.getWorkerApi can only be called within workers',
|
|
@@ -675,9 +731,10 @@ export default class WorkerFarm extends EventEmitter {
|
|
|
675
731
|
}
|
|
676
732
|
|
|
677
733
|
static getConcurrentCallsPerWorker(
|
|
678
|
-
defaultValue
|
|
734
|
+
defaultValue: number = DEFAULT_MAX_CONCURRENT_CALLS,
|
|
679
735
|
): number {
|
|
680
736
|
return (
|
|
737
|
+
// @ts-expect-error TS2345
|
|
681
738
|
parseInt(process.env.ATLASPACK_MAX_CONCURRENT_CALLS, 10) || defaultValue
|
|
682
739
|
);
|
|
683
740
|
}
|
|
@@ -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;
|