@parcel/workers 2.0.0-beta.1 → 2.0.0-nightly.1002

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/lib/WorkerFarm.js CHANGED
@@ -11,94 +11,112 @@ Object.defineProperty(exports, "Handle", {
11
11
  });
12
12
  exports.default = void 0;
13
13
 
14
- var _assert = _interopRequireDefault(require("assert"));
14
+ function _assert() {
15
+ const data = _interopRequireDefault(require("assert"));
15
16
 
16
- var _nullthrows = _interopRequireDefault(require("nullthrows"));
17
+ _assert = function () {
18
+ return data;
19
+ };
17
20
 
18
- var _events = _interopRequireDefault(require("events"));
21
+ return data;
22
+ }
19
23
 
20
- var _core = require("@parcel/core");
24
+ function _nullthrows() {
25
+ const data = _interopRequireDefault(require("nullthrows"));
21
26
 
22
- var _diagnostic = _interopRequireWildcard(require("@parcel/diagnostic"));
27
+ _nullthrows = function () {
28
+ return data;
29
+ };
23
30
 
24
- var _Worker = _interopRequireDefault(require("./Worker"));
31
+ return data;
32
+ }
25
33
 
26
- var _cpuCount = _interopRequireDefault(require("./cpuCount"));
34
+ function _events() {
35
+ const data = _interopRequireDefault(require("events"));
27
36
 
28
- var _Handle = _interopRequireDefault(require("./Handle"));
37
+ _events = function () {
38
+ return data;
39
+ };
29
40
 
30
- var _childState = require("./childState");
41
+ return data;
42
+ }
31
43
 
32
- var _backend = require("./backend");
44
+ function _core() {
45
+ const data = require("@parcel/core");
33
46
 
34
- var _Profiler = _interopRequireDefault(require("./Profiler"));
47
+ _core = function () {
48
+ return data;
49
+ };
35
50
 
36
- var _Trace = _interopRequireDefault(require("./Trace"));
51
+ return data;
52
+ }
37
53
 
38
- var _fs = _interopRequireDefault(require("fs"));
54
+ function _diagnostic() {
55
+ const data = _interopRequireWildcard(require("@parcel/diagnostic"));
39
56
 
40
- var _logger = _interopRequireDefault(require("@parcel/logger"));
57
+ _diagnostic = function () {
58
+ return data;
59
+ };
41
60
 
42
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
61
+ return data;
62
+ }
43
63
 
44
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (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; }
64
+ var _Worker = _interopRequireDefault(require("./Worker"));
45
65
 
46
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
66
+ var _cpuCount = _interopRequireDefault(require("./cpuCount"));
47
67
 
48
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
68
+ var _Handle = _interopRequireDefault(require("./Handle"));
49
69
 
50
- let profileId = 1;
51
- let referenceId = 1;
70
+ var _childState = require("./childState");
52
71
 
53
- /**
54
- * workerPath should always be defined inside farmOptions
55
- */
56
- class WorkerFarm extends _events.default {
57
- constructor(farmOptions = {}) {
58
- super();
72
+ var _backend = require("./backend");
59
73
 
60
- _defineProperty(this, "callQueue", []);
74
+ var _Profiler = _interopRequireDefault(require("./Profiler"));
61
75
 
62
- _defineProperty(this, "ending", false);
76
+ var _Trace = _interopRequireDefault(require("./Trace"));
63
77
 
64
- _defineProperty(this, "localWorker", void 0);
78
+ function _fs() {
79
+ const data = _interopRequireDefault(require("fs"));
65
80
 
66
- _defineProperty(this, "options", void 0);
81
+ _fs = function () {
82
+ return data;
83
+ };
67
84
 
68
- _defineProperty(this, "run", void 0);
85
+ return data;
86
+ }
69
87
 
70
- _defineProperty(this, "warmWorkers", 0);
88
+ function _logger() {
89
+ const data = _interopRequireDefault(require("@parcel/logger"));
71
90
 
72
- _defineProperty(this, "workers", new Map());
91
+ _logger = function () {
92
+ return data;
93
+ };
73
94
 
74
- _defineProperty(this, "handles", new Map());
95
+ return data;
96
+ }
75
97
 
76
- _defineProperty(this, "sharedReferences", new Map());
98
+ 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); }
77
99
 
78
- _defineProperty(this, "sharedReferencesByValue", new Map());
100
+ 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; }
79
101
 
80
- _defineProperty(this, "profiler", void 0);
102
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
81
103
 
82
- _defineProperty(this, "workerApi", {
83
- callMaster: async (request, awaitResponse = true) => {
84
- // $FlowFixMe
85
- let result = await this.processRequest({ ...request,
86
- awaitResponse
87
- });
88
- return (0, _core.deserialize)((0, _core.serialize)(result));
89
- },
90
- createReverseHandle: fn => this.createReverseHandle(fn),
91
- callChild: (childId, request) => new Promise((resolve, reject) => {
92
- (0, _nullthrows.default)(this.workers.get(childId)).call({ ...request,
93
- resolve,
94
- reject,
95
- retries: 0
96
- });
97
- }),
98
- getSharedReference: ref => this.sharedReferences.get(ref),
99
- resolveSharedReference: value => this.sharedReferencesByValue.get(value)
100
- });
104
+ let referenceId = 1;
101
105
 
106
+ /**
107
+ * workerPath should always be defined inside farmOptions
108
+ */
109
+ class WorkerFarm extends _events().default {
110
+ callQueue = [];
111
+ ending = false;
112
+ warmWorkers = 0;
113
+ workers = new Map();
114
+ handles = new Map();
115
+ sharedReferences = new Map();
116
+ sharedReferencesByValue = new Map();
117
+
118
+ constructor(farmOptions = {}) {
119
+ super();
102
120
  this.options = {
103
121
  maxConcurrentWorkers: WorkerFarm.getNumWorkers(),
104
122
  maxConcurrentCallsPerWorker: WorkerFarm.getConcurrentCallsPerWorker(),
@@ -116,10 +134,35 @@ class WorkerFarm extends _events.default {
116
134
 
117
135
 
118
136
  this.localWorker = require(this.options.workerPath);
137
+ this.localWorkerInit = this.localWorker.childInit != null ? this.localWorker.childInit() : null;
119
138
  this.run = this.createHandle('run');
120
139
  this.startMaxWorkers();
121
140
  }
122
141
 
142
+ workerApi = {
143
+ callMaster: async (request, awaitResponse = true) => {
144
+ // $FlowFixMe
145
+ let result = await this.processRequest({ ...request,
146
+ awaitResponse
147
+ });
148
+ return (0, _core().deserialize)((0, _core().serialize)(result));
149
+ },
150
+ createReverseHandle: fn => this.createReverseHandle(fn),
151
+ callChild: (childId, request) => new Promise((resolve, reject) => {
152
+ (0, _nullthrows().default)(this.workers.get(childId)).call({ ...request,
153
+ resolve,
154
+ reject,
155
+ retries: 0
156
+ });
157
+ }),
158
+ runHandle: (handle, args) => this.workerApi.callChild((0, _nullthrows().default)(handle.childId), {
159
+ handle: handle.id,
160
+ args
161
+ }),
162
+ getSharedReference: ref => this.sharedReferences.get(ref),
163
+ resolveSharedReference: value => this.sharedReferencesByValue.get(value)
164
+ };
165
+
123
166
  warmupWorker(method, args) {
124
167
  // Workers are already stopping
125
168
  if (this.ending) {
@@ -147,7 +190,7 @@ class WorkerFarm extends _events.default {
147
190
  }
148
191
 
149
192
  createHandle(method) {
150
- return (...args) => {
193
+ return async (...args) => {
151
194
  // Child process workers are slow to start (~600ms).
152
195
  // While we're waiting, just run on the main thread.
153
196
  // This significantly speeds up startup time.
@@ -158,7 +201,13 @@ class WorkerFarm extends _events.default {
158
201
  this.warmupWorker(method, args);
159
202
  }
160
203
 
161
- let processedArgs = (0, _core.restoreDeserializedObject)((0, _core.prepareForSerialization)([...args, false]));
204
+ let processedArgs = (0, _core().restoreDeserializedObject)((0, _core().prepareForSerialization)([...args, false]));
205
+
206
+ if (this.localWorkerInit != null) {
207
+ await this.localWorkerInit;
208
+ this.localWorkerInit = null;
209
+ }
210
+
162
211
  return this.localWorker[method](this.workerApi, ...processedArgs);
163
212
  }
164
213
  };
@@ -169,7 +218,7 @@ class WorkerFarm extends _events.default {
169
218
  if (error.code === 'ERR_IPC_CHANNEL_CLOSED') {
170
219
  return this.stopWorker(worker);
171
220
  } else {
172
- _logger.default.error(error, '@parcel/workers');
221
+ _logger().default.error(error, '@parcel/workers');
173
222
  }
174
223
  }
175
224
 
@@ -177,10 +226,10 @@ class WorkerFarm extends _events.default {
177
226
  let worker = new _Worker.default({
178
227
  forcedKillTime: this.options.forcedKillTime,
179
228
  backend: this.options.backend,
180
- patchConsole: this.options.patchConsole,
229
+ shouldPatchConsole: this.options.shouldPatchConsole,
181
230
  sharedReferences: this.sharedReferences
182
231
  });
183
- worker.fork((0, _nullthrows.default)(this.options.workerPath));
232
+ worker.fork((0, _nullthrows().default)(this.options.workerPath));
184
233
  worker.on('request', data => this.processRequest(data, worker));
185
234
  worker.on('ready', () => this.processQueue());
186
235
  worker.on('response', () => this.processQueue());
@@ -215,7 +264,9 @@ class WorkerFarm extends _events.default {
215
264
  this.startChild();
216
265
  }
217
266
 
218
- for (let worker of this.workers.values()) {
267
+ let workers = [...this.workers.values()].sort((a, b) => a.calls.size - b.calls.size);
268
+
269
+ for (let worker of workers) {
219
270
  if (!this.callQueue.length) {
220
271
  break;
221
272
  }
@@ -242,7 +293,9 @@ class WorkerFarm extends _events.default {
242
293
  let mod;
243
294
 
244
295
  if (handleId != null) {
245
- mod = (0, _nullthrows.default)(this.handles.get(handleId)).fn;
296
+ var _this$handles$get;
297
+
298
+ mod = (0, _nullthrows().default)((_this$handles$get = this.handles.get(handleId)) === null || _this$handles$get === void 0 ? void 0 : _this$handles$get.fn);
246
299
  } else if (location) {
247
300
  // $FlowFixMe this must be dynamic
248
301
  mod = require(location);
@@ -261,14 +314,14 @@ class WorkerFarm extends _events.default {
261
314
  idx,
262
315
  type: 'response',
263
316
  contentType: 'error',
264
- content: (0, _diagnostic.anyToDiagnostic)(e)
317
+ content: (0, _diagnostic().anyToDiagnostic)(e)
265
318
  });
266
319
 
267
320
  let result;
268
321
 
269
322
  if (method == null) {
270
323
  try {
271
- result = responseFromContent((await mod(...args)));
324
+ result = responseFromContent(await mod(...args));
272
325
  } catch (e) {
273
326
  result = errorResponseFromError(e);
274
327
  }
@@ -280,7 +333,7 @@ class WorkerFarm extends _events.default {
280
333
 
281
334
  try {
282
335
  // $FlowFixMe
283
- result = responseFromContent((await mod[method](...args)));
336
+ result = responseFromContent(await mod[method](...args));
284
337
  } catch (e) {
285
338
  result = errorResponseFromError(e);
286
339
  }
@@ -291,7 +344,7 @@ class WorkerFarm extends _events.default {
291
344
  worker.send(result);
292
345
  } else {
293
346
  if (result.contentType === 'error') {
294
- throw new _diagnostic.default({
347
+ throw new (_diagnostic().default)({
295
348
  diagnostic: result.content
296
349
  });
297
350
  }
@@ -320,6 +373,7 @@ class WorkerFarm extends _events.default {
320
373
 
321
374
  async end() {
322
375
  this.ending = true;
376
+ await Promise.all(Array.from(this.workers.values()).map(worker => this.stopWorker(worker)));
323
377
 
324
378
  for (let handle of this.handles.values()) {
325
379
  handle.dispose();
@@ -328,7 +382,6 @@ class WorkerFarm extends _events.default {
328
382
  this.handles = new Map();
329
383
  this.sharedReferences = new Map();
330
384
  this.sharedReferencesByValue = new Map();
331
- await Promise.all(Array.from(this.workers.values()).map(worker => this.stopWorker(worker)));
332
385
  this.ending = false;
333
386
  }
334
387
 
@@ -349,22 +402,24 @@ class WorkerFarm extends _events.default {
349
402
 
350
403
  createReverseHandle(fn) {
351
404
  let handle = new _Handle.default({
352
- fn,
353
- workerApi: this.workerApi
405
+ fn
354
406
  });
355
407
  this.handles.set(handle.id, handle);
356
408
  return handle;
357
409
  }
358
410
 
359
- async createSharedReference(value) {
411
+ async createSharedReference(value, // An optional, pre-serialized representation of the value to be used
412
+ // in its place.
413
+ buffer) {
360
414
  let ref = referenceId++;
361
415
  this.sharedReferences.set(ref, value);
362
416
  this.sharedReferencesByValue.set(value, ref);
417
+ let toSend = buffer ? buffer.buffer : value;
363
418
  let promises = [];
364
419
 
365
420
  for (let worker of this.workers.values()) {
366
421
  if (worker.ready) {
367
- promises.push(worker.sendSharedReference(ref, value));
422
+ promises.push(worker.sendSharedReference(ref, toSend));
368
423
  }
369
424
  }
370
425
 
@@ -383,6 +438,7 @@ class WorkerFarm extends _events.default {
383
438
  args: [ref],
384
439
  resolve,
385
440
  reject,
441
+ skipReadyCheck: true,
386
442
  retries: 0
387
443
  });
388
444
  }));
@@ -403,7 +459,8 @@ class WorkerFarm extends _events.default {
403
459
  args: [],
404
460
  resolve,
405
461
  reject,
406
- retries: 0
462
+ retries: 0,
463
+ skipReadyCheck: true
407
464
  });
408
465
  }));
409
466
  }
@@ -429,15 +486,16 @@ class WorkerFarm extends _events.default {
429
486
  args: [],
430
487
  resolve,
431
488
  reject,
432
- retries: 0
489
+ retries: 0,
490
+ skipReadyCheck: true
433
491
  });
434
492
  }));
435
493
  }
436
494
 
437
495
  var profiles = await Promise.all(promises);
438
496
  let trace = new _Trace.default();
439
- let filename = `profile-${profileId++}.trace`;
440
- let stream = trace.pipe(_fs.default.createWriteStream(filename));
497
+ let filename = `profile-${getTimeId()}.trace`;
498
+ let stream = trace.pipe(_fs().default.createWriteStream(filename));
441
499
 
442
500
  for (let profile of profiles) {
443
501
  trace.addCPUProfile(names.shift(), profile);
@@ -448,14 +506,60 @@ class WorkerFarm extends _events.default {
448
506
  stream.once('finish', resolve);
449
507
  });
450
508
 
451
- _logger.default.info({
509
+ _logger().default.info({
452
510
  origin: '@parcel/workers',
453
- message: `Wrote profile to ${filename}`
511
+ message: (0, _diagnostic().md)`Wrote profile to ${filename}`
454
512
  });
455
513
  }
456
514
 
515
+ async callAllWorkers(method, args) {
516
+ let promises = [];
517
+
518
+ for (let worker of this.workers.values()) {
519
+ promises.push(new Promise((resolve, reject) => {
520
+ worker.call({
521
+ method,
522
+ args,
523
+ resolve,
524
+ reject,
525
+ retries: 0
526
+ });
527
+ }));
528
+ }
529
+
530
+ promises.push(this.localWorker[method](this.workerApi, ...args));
531
+ await Promise.all(promises);
532
+ }
533
+
534
+ async takeHeapSnapshot() {
535
+ let snapshotId = getTimeId();
536
+
537
+ try {
538
+ let snapshotPaths = await Promise.all([...this.workers.values()].map(worker => new Promise((resolve, reject) => {
539
+ worker.call({
540
+ method: 'takeHeapSnapshot',
541
+ args: [snapshotId],
542
+ resolve,
543
+ reject,
544
+ retries: 0,
545
+ skipReadyCheck: true
546
+ });
547
+ })));
548
+
549
+ _logger().default.info({
550
+ origin: '@parcel/workers',
551
+ message: (0, _diagnostic().md)`Wrote heap snapshots to the following paths:\n${snapshotPaths.join('\n')}`
552
+ });
553
+ } catch {
554
+ _logger().default.error({
555
+ origin: '@parcel/workers',
556
+ message: 'Unable to take heap snapshots. Note: requires Node 11.13.0+'
557
+ });
558
+ }
559
+ }
560
+
457
561
  static getNumWorkers() {
458
- return process.env.PARCEL_WORKERS ? parseInt(process.env.PARCEL_WORKERS, 10) : (0, _cpuCount.default)();
562
+ return process.env.PARCEL_WORKERS ? parseInt(process.env.PARCEL_WORKERS, 10) : Math.ceil((0, _cpuCount.default)() / 2);
459
563
  }
460
564
 
461
565
  static isWorker() {
@@ -463,14 +567,19 @@ class WorkerFarm extends _events.default {
463
567
  }
464
568
 
465
569
  static getWorkerApi() {
466
- (0, _assert.default)(_childState.child != null, 'WorkerFarm.getWorkerApi can only be called within workers');
570
+ (0, _assert().default)(_childState.child != null, 'WorkerFarm.getWorkerApi can only be called within workers');
467
571
  return _childState.child.workerApi;
468
572
  }
469
573
 
470
574
  static getConcurrentCallsPerWorker() {
471
- return parseInt(process.env.PARCEL_MAX_CONCURRENT_CALLS, 10) || 5;
575
+ return parseInt(process.env.PARCEL_MAX_CONCURRENT_CALLS, 10) || 30;
472
576
  }
473
577
 
474
578
  }
475
579
 
476
- exports.default = WorkerFarm;
580
+ exports.default = WorkerFarm;
581
+
582
+ function getTimeId() {
583
+ let now = new Date();
584
+ return String(now.getFullYear()) + String(now.getMonth() + 1).padStart(2, '0') + String(now.getDate()).padStart(2, '0') + '-' + String(now.getHours()).padStart(2, '0') + String(now.getMinutes()).padStart(2, '0') + String(now.getSeconds()).padStart(2, '0');
585
+ }
package/lib/bus.js CHANGED
@@ -5,13 +5,21 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _events = _interopRequireDefault(require("events"));
8
+ function _events() {
9
+ const data = _interopRequireDefault(require("events"));
10
+
11
+ _events = function () {
12
+ return data;
13
+ };
14
+
15
+ return data;
16
+ }
9
17
 
10
18
  var _childState = require("./childState");
11
19
 
12
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
21
 
14
- class Bus extends _events.default {
22
+ class Bus extends _events().default {
15
23
  emit(event, ...args) {
16
24
  if (_childState.child) {
17
25
  _childState.child.workerApi.callMaster({