@parcel/workers 2.8.3 → 2.9.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/index.d.ts +10 -9
- package/lib/Handle.js +4 -15
- package/lib/Worker.js +6 -43
- package/lib/WorkerFarm.js +35 -128
- package/lib/backend.js +0 -6
- package/lib/bus.js +0 -10
- package/lib/child.js +29 -65
- package/lib/childState.js +0 -1
- package/lib/cpuCount.js +2 -20
- package/lib/index.js +12 -24
- package/lib/process/ProcessChild.js +0 -17
- package/lib/process/ProcessWorker.js +0 -22
- package/lib/threads/ThreadsChild.js +0 -20
- package/lib/threads/ThreadsWorker.js +0 -18
- package/package.json +8 -8
- package/src/Worker.js +2 -0
- package/src/WorkerFarm.js +20 -7
- package/src/child.js +13 -3
- package/src/index.js +7 -1
- package/lib/Profiler.js +0 -80
- package/lib/Trace.js +0 -131
- package/src/Profiler.js +0 -93
- package/src/Trace.js +0 -125
package/lib/child.js
CHANGED
@@ -4,72 +4,55 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.Child = void 0;
|
7
|
-
|
8
7
|
function _assert() {
|
9
8
|
const data = _interopRequireDefault(require("assert"));
|
10
|
-
|
11
9
|
_assert = function () {
|
12
10
|
return data;
|
13
11
|
};
|
14
|
-
|
15
12
|
return data;
|
16
13
|
}
|
17
|
-
|
18
14
|
function _nullthrows() {
|
19
15
|
const data = _interopRequireDefault(require("nullthrows"));
|
20
|
-
|
21
16
|
_nullthrows = function () {
|
22
17
|
return data;
|
23
18
|
};
|
24
|
-
|
25
19
|
return data;
|
26
20
|
}
|
27
|
-
|
28
21
|
function _logger() {
|
29
22
|
const data = _interopRequireWildcard(require("@parcel/logger"));
|
30
|
-
|
31
23
|
_logger = function () {
|
32
24
|
return data;
|
33
25
|
};
|
34
|
-
|
35
26
|
return data;
|
36
27
|
}
|
37
|
-
|
38
28
|
function _diagnostic() {
|
39
29
|
const data = _interopRequireWildcard(require("@parcel/diagnostic"));
|
40
|
-
|
41
30
|
_diagnostic = function () {
|
42
31
|
return data;
|
43
32
|
};
|
44
|
-
|
45
33
|
return data;
|
46
34
|
}
|
47
|
-
|
48
35
|
function _core() {
|
49
36
|
const data = require("@parcel/core");
|
50
|
-
|
51
37
|
_core = function () {
|
52
38
|
return data;
|
53
39
|
};
|
54
|
-
|
55
40
|
return data;
|
56
41
|
}
|
57
|
-
|
58
42
|
var _bus = _interopRequireDefault(require("./bus"));
|
59
|
-
|
60
|
-
|
61
|
-
|
43
|
+
function _profiler() {
|
44
|
+
const data = require("@parcel/profiler");
|
45
|
+
_profiler = function () {
|
46
|
+
return data;
|
47
|
+
};
|
48
|
+
return data;
|
49
|
+
}
|
62
50
|
var _Handle2 = _interopRequireDefault(require("./Handle"));
|
63
|
-
|
64
51
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
65
|
-
|
66
52
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
67
|
-
|
68
53
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
69
|
-
|
70
54
|
// The import of './Handle' should really be imported eagerly (with @babel/plugin-transform-modules-commonjs's lazy mode).
|
71
55
|
const Handle = _Handle2.default;
|
72
|
-
|
73
56
|
class Child {
|
74
57
|
callQueue = [];
|
75
58
|
maxConcurrentCalls = 10;
|
@@ -78,18 +61,21 @@ class Child {
|
|
78
61
|
handles = new Map();
|
79
62
|
sharedReferences = new Map();
|
80
63
|
sharedReferencesByValue = new Map();
|
81
|
-
|
82
64
|
constructor(ChildBackend) {
|
83
65
|
this.child = new ChildBackend(m => {
|
84
66
|
this.messageListener(m);
|
85
|
-
}, () => this.handleEnd());
|
86
|
-
// the main process via the bus.
|
67
|
+
}, () => this.handleEnd());
|
87
68
|
|
69
|
+
// Monitior all logging events inside this child process and forward to
|
70
|
+
// the main process via the bus.
|
88
71
|
this.loggerDisposable = _logger().default.onLog(event => {
|
89
72
|
_bus.default.emit('logEvent', event);
|
90
73
|
});
|
74
|
+
// .. and do the same for trace events
|
75
|
+
this.tracerDisposable = _profiler().tracer.onTrace(event => {
|
76
|
+
_bus.default.emit('traceEvent', event);
|
77
|
+
});
|
91
78
|
}
|
92
|
-
|
93
79
|
workerApi = {
|
94
80
|
callMaster: (request, awaitResponse = true) => this.addCall(request, awaitResponse),
|
95
81
|
createReverseHandle: fn => this.createReverseHandle(fn),
|
@@ -100,7 +86,6 @@ class Child {
|
|
100
86
|
getSharedReference: ref => this.sharedReferences.get(ref),
|
101
87
|
resolveSharedReference: value => this.sharedReferencesByValue.get(value)
|
102
88
|
};
|
103
|
-
|
104
89
|
messageListener(message) {
|
105
90
|
if (message.type === 'response') {
|
106
91
|
return this.handleResponse(message);
|
@@ -108,21 +93,17 @@ class Child {
|
|
108
93
|
return this.handleRequest(message);
|
109
94
|
}
|
110
95
|
}
|
111
|
-
|
112
96
|
send(data) {
|
113
97
|
this.child.send(data);
|
114
98
|
}
|
115
|
-
|
116
99
|
async childInit(module, childId) {
|
117
100
|
// $FlowFixMe this must be dynamic
|
118
101
|
this.module = require(module);
|
119
102
|
this.childId = childId;
|
120
|
-
|
121
103
|
if (this.module.childInit != null) {
|
122
104
|
await this.module.childInit();
|
123
105
|
}
|
124
106
|
}
|
125
|
-
|
126
107
|
async handleRequest(data) {
|
127
108
|
let {
|
128
109
|
idx,
|
@@ -131,7 +112,6 @@ class Child {
|
|
131
112
|
handle: handleId
|
132
113
|
} = data;
|
133
114
|
let child = (0, _nullthrows().default)(data.child);
|
134
|
-
|
135
115
|
const responseFromContent = content => ({
|
136
116
|
idx,
|
137
117
|
child,
|
@@ -139,7 +119,6 @@ class Child {
|
|
139
119
|
contentType: 'data',
|
140
120
|
content
|
141
121
|
});
|
142
|
-
|
143
122
|
const errorResponseFromError = e => ({
|
144
123
|
idx,
|
145
124
|
child,
|
@@ -147,13 +126,10 @@ class Child {
|
|
147
126
|
contentType: 'error',
|
148
127
|
content: (0, _diagnostic().anyToDiagnostic)(e)
|
149
128
|
});
|
150
|
-
|
151
129
|
let result;
|
152
|
-
|
153
130
|
if (handleId != null) {
|
154
131
|
try {
|
155
132
|
var _this$handles$get;
|
156
|
-
|
157
133
|
let fn = (0, _nullthrows().default)((_this$handles$get = this.handles.get(handleId)) === null || _this$handles$get === void 0 ? void 0 : _this$handles$get.fn);
|
158
134
|
result = responseFromContent(fn(...args));
|
159
135
|
} catch (e) {
|
@@ -162,20 +138,20 @@ class Child {
|
|
162
138
|
} else if (method === 'childInit') {
|
163
139
|
try {
|
164
140
|
let [moduleName, childOptions] = args;
|
165
|
-
|
166
141
|
if (childOptions.shouldPatchConsole) {
|
167
142
|
(0, _logger().patchConsole)();
|
168
143
|
} else {
|
169
144
|
(0, _logger().unpatchConsole)();
|
170
145
|
}
|
171
|
-
|
146
|
+
if (childOptions.shouldTrace) {
|
147
|
+
_profiler().tracer.enable();
|
148
|
+
}
|
172
149
|
result = responseFromContent(await this.childInit(moduleName, child));
|
173
150
|
} catch (e) {
|
174
151
|
result = errorResponseFromError(e);
|
175
152
|
}
|
176
153
|
} else if (method === 'startProfile') {
|
177
|
-
this.profiler = new
|
178
|
-
|
154
|
+
this.profiler = new (_profiler().SamplingProfiler)();
|
179
155
|
try {
|
180
156
|
result = responseFromContent(await this.profiler.startProfiling());
|
181
157
|
} catch (e) {
|
@@ -191,14 +167,14 @@ class Child {
|
|
191
167
|
} else if (method === 'takeHeapSnapshot') {
|
192
168
|
try {
|
193
169
|
let v8 = require('v8');
|
194
|
-
|
195
170
|
result = responseFromContent(v8.writeHeapSnapshot('heap-' + args[0] + '-' + (this.childId ? 'worker' + this.childId : 'main') + '.heapsnapshot'));
|
196
171
|
} catch (e) {
|
197
172
|
result = errorResponseFromError(e);
|
198
173
|
}
|
199
174
|
} else if (method === 'createSharedReference') {
|
200
175
|
let [ref, _value] = args;
|
201
|
-
let value = _value instanceof ArrayBuffer ?
|
176
|
+
let value = _value instanceof ArrayBuffer ?
|
177
|
+
// In the case the value is pre-serialized as a buffer,
|
202
178
|
// deserialize it.
|
203
179
|
(0, _core().deserialize)(Buffer.from(_value)) : _value;
|
204
180
|
this.sharedReferences.set(ref, value);
|
@@ -212,26 +188,24 @@ class Child {
|
|
212
188
|
result = responseFromContent(null);
|
213
189
|
} else {
|
214
190
|
try {
|
215
|
-
result = responseFromContent(
|
191
|
+
result = responseFromContent(
|
192
|
+
// $FlowFixMe
|
216
193
|
await this.module[method](this.workerApi, ...args));
|
217
194
|
} catch (e) {
|
218
195
|
result = errorResponseFromError(e);
|
219
196
|
}
|
220
197
|
}
|
221
|
-
|
222
198
|
try {
|
223
199
|
this.send(result);
|
224
200
|
} catch (e) {
|
225
201
|
result = this.send(errorResponseFromError(e));
|
226
202
|
}
|
227
203
|
}
|
228
|
-
|
229
204
|
handleResponse(data) {
|
230
205
|
let idx = (0, _nullthrows().default)(data.idx);
|
231
206
|
let contentType = data.contentType;
|
232
207
|
let content = data.content;
|
233
208
|
let call = (0, _nullthrows().default)(this.responseQueue.get(idx));
|
234
|
-
|
235
209
|
if (contentType === 'error') {
|
236
210
|
(0, _assert().default)(typeof content !== 'string');
|
237
211
|
call.reject(new (_diagnostic().default)({
|
@@ -240,18 +214,18 @@ class Child {
|
|
240
214
|
} else {
|
241
215
|
call.resolve(content);
|
242
216
|
}
|
217
|
+
this.responseQueue.delete(idx);
|
243
218
|
|
244
|
-
|
245
|
-
|
219
|
+
// Process the next call
|
246
220
|
this.processQueue();
|
247
|
-
}
|
248
|
-
|
221
|
+
}
|
249
222
|
|
223
|
+
// Keep in mind to make sure responses to these calls are JSON.Stringify safe
|
250
224
|
addCall(request, awaitResponse = true) {
|
251
225
|
var _promise;
|
252
|
-
|
253
226
|
// $FlowFixMe
|
254
|
-
let call = {
|
227
|
+
let call = {
|
228
|
+
...request,
|
255
229
|
type: 'request',
|
256
230
|
child: this.childId,
|
257
231
|
// $FlowFixMe Added in Flow 0.121.0 upgrade in #4381
|
@@ -260,27 +234,22 @@ class Child {
|
|
260
234
|
reject: () => {}
|
261
235
|
};
|
262
236
|
let promise;
|
263
|
-
|
264
237
|
if (awaitResponse) {
|
265
238
|
promise = new Promise((resolve, reject) => {
|
266
239
|
call.resolve = resolve;
|
267
240
|
call.reject = reject;
|
268
241
|
});
|
269
242
|
}
|
270
|
-
|
271
243
|
this.callQueue.push(call);
|
272
244
|
this.processQueue();
|
273
245
|
return (_promise = promise) !== null && _promise !== void 0 ? _promise : Promise.resolve();
|
274
246
|
}
|
275
|
-
|
276
247
|
sendRequest(call) {
|
277
248
|
let idx;
|
278
|
-
|
279
249
|
if (call.awaitResponse) {
|
280
250
|
idx = this.responseId++;
|
281
251
|
this.responseQueue.set(idx, call);
|
282
252
|
}
|
283
|
-
|
284
253
|
this.send({
|
285
254
|
idx,
|
286
255
|
child: call.child,
|
@@ -292,21 +261,18 @@ class Child {
|
|
292
261
|
awaitResponse: call.awaitResponse
|
293
262
|
});
|
294
263
|
}
|
295
|
-
|
296
264
|
processQueue() {
|
297
265
|
if (!this.callQueue.length) {
|
298
266
|
return;
|
299
267
|
}
|
300
|
-
|
301
268
|
if (this.responseQueue.size < this.maxConcurrentCalls) {
|
302
269
|
this.sendRequest(this.callQueue.shift());
|
303
270
|
}
|
304
271
|
}
|
305
|
-
|
306
272
|
handleEnd() {
|
307
273
|
this.loggerDisposable.dispose();
|
274
|
+
this.tracerDisposable.dispose();
|
308
275
|
}
|
309
|
-
|
310
276
|
createReverseHandle(fn) {
|
311
277
|
let handle = new Handle({
|
312
278
|
fn,
|
@@ -315,7 +281,5 @@ class Child {
|
|
315
281
|
this.handles.set(handle.id, handle);
|
316
282
|
return handle;
|
317
283
|
}
|
318
|
-
|
319
284
|
}
|
320
|
-
|
321
285
|
exports.Child = Child;
|
package/lib/childState.js
CHANGED
package/lib/cpuCount.js
CHANGED
@@ -5,29 +5,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
});
|
6
6
|
exports.default = getCores;
|
7
7
|
exports.detectRealCores = detectRealCores;
|
8
|
-
|
9
8
|
function _os() {
|
10
9
|
const data = _interopRequireDefault(require("os"));
|
11
|
-
|
12
10
|
_os = function () {
|
13
11
|
return data;
|
14
12
|
};
|
15
|
-
|
16
13
|
return data;
|
17
14
|
}
|
18
|
-
|
19
15
|
function _child_process() {
|
20
16
|
const data = require("child_process");
|
21
|
-
|
22
17
|
_child_process = function () {
|
23
18
|
return data;
|
24
19
|
};
|
25
|
-
|
26
20
|
return data;
|
27
21
|
}
|
28
|
-
|
29
22
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
30
|
-
|
31
23
|
const exec = command => {
|
32
24
|
try {
|
33
25
|
let stdout = (0, _child_process().execSync)(command, {
|
@@ -40,50 +32,40 @@ const exec = command => {
|
|
40
32
|
return '';
|
41
33
|
}
|
42
34
|
};
|
43
|
-
|
44
35
|
function detectRealCores() {
|
45
36
|
let platform = _os().default.platform();
|
46
|
-
|
47
37
|
let amount = 0;
|
48
|
-
|
49
38
|
if (platform === 'linux') {
|
50
39
|
amount = parseInt(exec('lscpu -p | egrep -v "^#" | sort -u -t, -k 2,4 | wc -l'), 10);
|
51
40
|
} else if (platform === 'darwin') {
|
52
41
|
amount = parseInt(exec('sysctl -n hw.physicalcpu_max'), 10);
|
53
42
|
} else if (platform === 'win32') {
|
54
43
|
const str = exec('wmic cpu get NumberOfCores').match(/\d+/g);
|
55
|
-
|
56
44
|
if (str !== null) {
|
57
45
|
amount = parseInt(str.filter(n => n !== '')[0], 10);
|
58
46
|
}
|
59
47
|
}
|
60
|
-
|
61
48
|
if (!amount || amount <= 0) {
|
62
49
|
throw new Error('Could not detect cpu count!');
|
63
50
|
}
|
64
|
-
|
65
51
|
return amount;
|
66
52
|
}
|
67
|
-
|
68
53
|
let cores;
|
69
|
-
|
70
54
|
function getCores(bypassCache = false) {
|
71
55
|
// Do not re-run commands if we already have the count...
|
72
56
|
if (cores && !bypassCache) {
|
73
57
|
return cores;
|
74
58
|
}
|
75
|
-
|
76
59
|
try {
|
77
60
|
cores = detectRealCores();
|
78
61
|
} catch (e) {
|
79
62
|
// Guess the amount of real cores
|
80
63
|
cores = _os().default.cpus().filter((cpu, index) => !cpu.model.includes('Intel') || index % 2 === 1).length;
|
81
|
-
}
|
82
|
-
|
64
|
+
}
|
83
65
|
|
66
|
+
// Another fallback
|
84
67
|
if (!cores) {
|
85
68
|
cores = 1;
|
86
69
|
}
|
87
|
-
|
88
70
|
return cores;
|
89
71
|
}
|
package/lib/index.js
CHANGED
@@ -16,73 +16,61 @@ Object.defineProperty(exports, "bus", {
|
|
16
16
|
}
|
17
17
|
});
|
18
18
|
exports.default = void 0;
|
19
|
-
|
20
19
|
function _assert() {
|
21
20
|
const data = _interopRequireDefault(require("assert"));
|
22
|
-
|
23
21
|
_assert = function () {
|
24
22
|
return data;
|
25
23
|
};
|
26
|
-
|
27
24
|
return data;
|
28
25
|
}
|
29
|
-
|
30
26
|
var _WorkerFarm = _interopRequireWildcard(require("./WorkerFarm"));
|
31
|
-
|
32
27
|
function _logger() {
|
33
28
|
const data = _interopRequireDefault(require("@parcel/logger"));
|
34
|
-
|
35
29
|
_logger = function () {
|
36
30
|
return data;
|
37
31
|
};
|
38
|
-
|
39
32
|
return data;
|
40
33
|
}
|
41
|
-
|
42
34
|
var _bus = _interopRequireDefault(require("./bus"));
|
43
|
-
|
35
|
+
function _profiler() {
|
36
|
+
const data = require("@parcel/profiler");
|
37
|
+
_profiler = function () {
|
38
|
+
return data;
|
39
|
+
};
|
40
|
+
return data;
|
41
|
+
}
|
44
42
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
45
|
-
|
46
43
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
47
|
-
|
48
44
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
49
|
-
|
50
45
|
if (!_WorkerFarm.default.isWorker()) {
|
51
46
|
// Forward all logger events originating from workers into the main process
|
52
47
|
_bus.default.on('logEvent', e => {
|
53
48
|
switch (e.level) {
|
54
49
|
case 'info':
|
55
50
|
_logger().default.info(e.diagnostics);
|
56
|
-
|
57
51
|
break;
|
58
|
-
|
59
52
|
case 'progress':
|
60
53
|
(0, _assert().default)(typeof e.message === 'string');
|
61
|
-
|
62
54
|
_logger().default.progress(e.message);
|
63
|
-
|
64
55
|
break;
|
65
|
-
|
66
56
|
case 'verbose':
|
67
57
|
_logger().default.verbose(e.diagnostics);
|
68
|
-
|
69
58
|
break;
|
70
|
-
|
71
59
|
case 'warn':
|
72
60
|
_logger().default.warn(e.diagnostics);
|
73
|
-
|
74
61
|
break;
|
75
|
-
|
76
62
|
case 'error':
|
77
63
|
_logger().default.error(e.diagnostics);
|
78
|
-
|
79
64
|
break;
|
80
|
-
|
81
65
|
default:
|
82
66
|
throw new Error('Unknown log level');
|
83
67
|
}
|
84
68
|
});
|
85
|
-
}
|
86
69
|
|
70
|
+
// Forward all trace events originating from workers into the main process
|
71
|
+
_bus.default.on('traceEvent', e => {
|
72
|
+
_profiler().tracer.trace(e);
|
73
|
+
});
|
74
|
+
}
|
87
75
|
var _default = _WorkerFarm.default;
|
88
76
|
exports.default = _default;
|
@@ -4,52 +4,38 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
|
-
|
8
7
|
function _nullthrows() {
|
9
8
|
const data = _interopRequireDefault(require("nullthrows"));
|
10
|
-
|
11
9
|
_nullthrows = function () {
|
12
10
|
return data;
|
13
11
|
};
|
14
|
-
|
15
12
|
return data;
|
16
13
|
}
|
17
|
-
|
18
14
|
var _childState = require("../childState");
|
19
|
-
|
20
15
|
var _child = require("../child");
|
21
|
-
|
22
16
|
function _core() {
|
23
17
|
const data = require("@parcel/core");
|
24
|
-
|
25
18
|
_core = function () {
|
26
19
|
return data;
|
27
20
|
};
|
28
|
-
|
29
21
|
return data;
|
30
22
|
}
|
31
|
-
|
32
23
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
33
|
-
|
34
24
|
class ProcessChild {
|
35
25
|
constructor(onMessage, onExit) {
|
36
26
|
if (!process.send) {
|
37
27
|
throw new Error('Only create ProcessChild instances in a worker!');
|
38
28
|
}
|
39
|
-
|
40
29
|
this.onMessage = onMessage;
|
41
30
|
this.onExit = onExit;
|
42
31
|
process.on('message', data => this.handleMessage(data));
|
43
32
|
}
|
44
|
-
|
45
33
|
handleMessage(data) {
|
46
34
|
if (data === 'die') {
|
47
35
|
return this.stop();
|
48
36
|
}
|
49
|
-
|
50
37
|
this.onMessage((0, _core().deserialize)(Buffer.from(data, 'base64')));
|
51
38
|
}
|
52
|
-
|
53
39
|
send(data) {
|
54
40
|
let processSend = (0, _nullthrows().default)(process.send).bind(process);
|
55
41
|
processSend((0, _core().serialize)(data).toString('base64'), err => {
|
@@ -63,13 +49,10 @@ class ProcessChild {
|
|
63
49
|
}
|
64
50
|
});
|
65
51
|
}
|
66
|
-
|
67
52
|
stop() {
|
68
53
|
this.onExit(0);
|
69
54
|
process.exit();
|
70
55
|
}
|
71
|
-
|
72
56
|
}
|
73
|
-
|
74
57
|
exports.default = ProcessChild;
|
75
58
|
(0, _childState.setChild)(new _child.Child(ProcessChild));
|
@@ -4,52 +4,38 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
|
-
|
8
7
|
function _child_process() {
|
9
8
|
const data = _interopRequireDefault(require("child_process"));
|
10
|
-
|
11
9
|
_child_process = function () {
|
12
10
|
return data;
|
13
11
|
};
|
14
|
-
|
15
12
|
return data;
|
16
13
|
}
|
17
|
-
|
18
14
|
function _path() {
|
19
15
|
const data = _interopRequireDefault(require("path"));
|
20
|
-
|
21
16
|
_path = function () {
|
22
17
|
return data;
|
23
18
|
};
|
24
|
-
|
25
19
|
return data;
|
26
20
|
}
|
27
|
-
|
28
21
|
function _core() {
|
29
22
|
const data = require("@parcel/core");
|
30
|
-
|
31
23
|
_core = function () {
|
32
24
|
return data;
|
33
25
|
};
|
34
|
-
|
35
26
|
return data;
|
36
27
|
}
|
37
|
-
|
38
28
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
39
|
-
|
40
29
|
const WORKER_PATH = _path().default.join(__dirname, 'ProcessChild.js');
|
41
|
-
|
42
30
|
class ProcessWorker {
|
43
31
|
processQueue = true;
|
44
32
|
sendQueue = [];
|
45
|
-
|
46
33
|
constructor(execArgv, onMessage, onError, onExit) {
|
47
34
|
this.execArgv = execArgv;
|
48
35
|
this.onMessage = onMessage;
|
49
36
|
this.onError = onError;
|
50
37
|
this.onExit = onExit;
|
51
38
|
}
|
52
|
-
|
53
39
|
start() {
|
54
40
|
this.child = _child_process().default.fork(WORKER_PATH, process.argv, {
|
55
41
|
execArgv: this.execArgv,
|
@@ -63,7 +49,6 @@ class ProcessWorker {
|
|
63
49
|
this.child.on('error', this.onError);
|
64
50
|
return Promise.resolve();
|
65
51
|
}
|
66
|
-
|
67
52
|
async stop() {
|
68
53
|
this.child.send('die');
|
69
54
|
let forceKill = setTimeout(() => this.child.kill('SIGINT'), 500);
|
@@ -72,34 +57,27 @@ class ProcessWorker {
|
|
72
57
|
});
|
73
58
|
clearTimeout(forceKill);
|
74
59
|
}
|
75
|
-
|
76
60
|
send(data) {
|
77
61
|
if (!this.processQueue) {
|
78
62
|
this.sendQueue.push(data);
|
79
63
|
return;
|
80
64
|
}
|
81
|
-
|
82
65
|
let result = this.child.send((0, _core().serialize)(data).toString('base64'), error => {
|
83
66
|
if (error && error instanceof Error) {
|
84
67
|
// Ignore this, the workerfarm handles child errors
|
85
68
|
return;
|
86
69
|
}
|
87
|
-
|
88
70
|
this.processQueue = true;
|
89
|
-
|
90
71
|
if (this.sendQueue.length > 0) {
|
91
72
|
let queueCopy = this.sendQueue.slice(0);
|
92
73
|
this.sendQueue = [];
|
93
74
|
queueCopy.forEach(entry => this.send(entry));
|
94
75
|
}
|
95
76
|
});
|
96
|
-
|
97
77
|
if (!result || /^win/.test(process.platform)) {
|
98
78
|
// Queue is handling too much messages throttle it
|
99
79
|
this.processQueue = false;
|
100
80
|
}
|
101
81
|
}
|
102
|
-
|
103
82
|
}
|
104
|
-
|
105
83
|
exports.default = ProcessWorker;
|