@parcel/workers 2.0.0-beta.3 → 2.0.0-dev.1510

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 ADDED
@@ -0,0 +1,23 @@
1
+ import {FilePath} from '@parcel/types';
2
+
3
+ type BackendType = 'process' | 'threads';
4
+
5
+ export type FarmOptions = {
6
+ maxConcurrentWorkers: number;
7
+ maxConcurrentCallsPerWorker: number;
8
+ forcedKillTime: number;
9
+ useLocalWorker: boolean;
10
+ warmWorkers: boolean;
11
+ workerPath?: FilePath;
12
+ backend: BackendType;
13
+ shouldPatchConsole?: boolean;
14
+ shouldTrace?: boolean;
15
+ };
16
+
17
+ declare class WorkerFarm {
18
+ constructor(options: FarmOptions);
19
+
20
+ end(): Promise<void>;
21
+ }
22
+
23
+ export default WorkerFarm;
package/lib/Handle.js CHANGED
@@ -4,69 +4,43 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  function _core() {
9
8
  const data = require("@parcel/core");
10
-
11
9
  _core = function () {
12
10
  return data;
13
11
  };
14
-
15
- return data;
16
- }
17
-
18
- function _package() {
19
- const data = _interopRequireDefault(require("../package.json"));
20
-
21
- _package = function () {
22
- return data;
23
- };
24
-
25
12
  return data;
26
13
  }
27
-
14
+ var _package = _interopRequireDefault(require("../package.json"));
28
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
-
30
- 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; }
31
-
32
- let HANDLE_ID = 0; // $FlowFixMe
16
+ // $FlowFixMe
17
+ let HANDLE_ID = 0;
18
+ // $FlowFixMe
33
19
 
34
20
  const handleById = new Map();
35
-
36
21
  class Handle {
37
22
  constructor(opts) {
38
23
  var _opts$id;
39
-
40
- _defineProperty(this, "id", void 0);
41
-
42
- _defineProperty(this, "childId", void 0);
43
-
44
- _defineProperty(this, "fn", void 0);
45
-
46
24
  this.id = (_opts$id = opts.id) !== null && _opts$id !== void 0 ? _opts$id : ++HANDLE_ID;
47
25
  this.fn = opts.fn;
48
26
  this.childId = opts.childId;
49
27
  handleById.set(this.id, this);
50
28
  }
51
-
52
29
  dispose() {
53
30
  handleById.delete(this.id);
54
31
  }
55
-
56
32
  serialize() {
57
33
  return {
58
34
  id: this.id,
59
35
  childId: this.childId
60
36
  };
61
37
  }
62
-
63
38
  static deserialize(opts) {
64
39
  return new Handle(opts);
65
40
  }
41
+ }
66
42
 
67
- } // Register the Handle as a serializable class so that it will properly be deserialized
43
+ // Register the Handle as a serializable class so that it will properly be deserialized
68
44
  // by anything that uses WorkerFarm.
69
-
70
-
71
45
  exports.default = Handle;
72
- (0, _core().registerSerializableClass)(`${_package().default.version}:Handle`, Handle);
46
+ (0, _core().registerSerializableClass)(`${_package.default.version}:Handle`, Handle);
package/lib/Worker.js CHANGED
@@ -4,99 +4,63 @@ 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
  function _events() {
19
15
  const data = _interopRequireDefault(require("events"));
20
-
21
16
  _events = function () {
22
17
  return data;
23
18
  };
24
-
25
19
  return data;
26
20
  }
27
-
28
21
  function _diagnostic() {
29
22
  const data = _interopRequireDefault(require("@parcel/diagnostic"));
30
-
31
23
  _diagnostic = function () {
32
24
  return data;
33
25
  };
34
-
35
- return data;
36
- }
37
-
38
- function _backend() {
39
- const data = require("./backend");
40
-
41
- _backend = function () {
42
- return data;
43
- };
44
-
45
26
  return data;
46
27
  }
47
-
28
+ var _backend = require("./backend");
48
29
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
49
-
50
- 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; }
51
-
52
30
  let WORKER_ID = 0;
53
-
54
31
  class Worker extends _events().default {
32
+ id = WORKER_ID++;
33
+ sentSharedReferences = new Set();
34
+ calls = new Map();
35
+ exitCode = null;
36
+ callId = 0;
37
+ ready = false;
38
+ stopped = false;
39
+ isStopping = false;
55
40
  constructor(options) {
56
41
  super();
57
-
58
- _defineProperty(this, "options", void 0);
59
-
60
- _defineProperty(this, "worker", void 0);
61
-
62
- _defineProperty(this, "id", WORKER_ID++);
63
-
64
- _defineProperty(this, "sharedReferences", new Map());
65
-
66
- _defineProperty(this, "calls", new Map());
67
-
68
- _defineProperty(this, "exitCode", null);
69
-
70
- _defineProperty(this, "callId", 0);
71
-
72
- _defineProperty(this, "ready", false);
73
-
74
- _defineProperty(this, "stopped", false);
75
-
76
- _defineProperty(this, "isStopping", false);
77
-
78
42
  this.options = options;
79
43
  }
80
-
81
44
  async fork(forkModule) {
82
- let filteredArgs = process.execArgv.filter(v => !/^--(debug|inspect|max-old-space-size=)/.test(v));
83
-
84
- for (let i = 0; i < filteredArgs.length; i++) {
85
- let arg = filteredArgs[i];
86
-
87
- if ((arg === '-r' || arg === '--require') && filteredArgs[i + 1] === '@parcel/register') {
88
- filteredArgs.splice(i, 2);
89
- i--;
45
+ let filteredArgs = [];
46
+ if (process.execArgv) {
47
+ filteredArgs = process.execArgv.filter(v => !/^--(debug|inspect|no-opt|max-old-space-size=|max-semi-space-size=|expose-gc)/.test(v));
48
+ for (let i = 0; i < filteredArgs.length; i++) {
49
+ let arg = filteredArgs[i];
50
+ let isArgWithParam = (arg === '-r' || arg === '--require') && filteredArgs[i + 1] === '@parcel/register' || arg === '--title';
51
+ if (isArgWithParam) {
52
+ filteredArgs.splice(i, 2);
53
+ i--;
54
+ }
90
55
  }
91
- } // Workaround for https://github.com/nodejs/node/issues/29117
92
-
56
+ }
93
57
 
58
+ // Workaround for https://github.com/nodejs/node/issues/29117
94
59
  if (process.env.NODE_OPTIONS) {
95
60
  // arg parsing logic adapted from https://stackoverflow.com/a/46946420/2352201
96
61
  let opts = [''];
97
62
  let quote = false;
98
-
99
- for (let c of (0, _nullthrows().default)(process.env.NODE_OPTIONS.match(/\\?.|^$/g))) {
63
+ for (let c of (0, _nullthrows().default)(process.env.NODE_OPTIONS.match(/.|^$/g))) {
100
64
  if (c === '"') {
101
65
  quote = !quote;
102
66
  } else if (!quote && c === ' ') {
@@ -105,30 +69,31 @@ class Worker extends _events().default {
105
69
  opts[opts.length - 1] += c.replace(/\\(.)/, '$1');
106
70
  }
107
71
  }
108
-
109
72
  for (let i = 0; i < opts.length; i++) {
110
73
  let opt = opts[i];
111
-
112
74
  if (opt === '-r' || opt === '--require') {
113
75
  filteredArgs.push(opt, opts[i + 1]);
114
76
  i++;
115
77
  }
116
78
  }
117
79
  }
118
-
119
- let WorkerBackend = (0, _backend().getWorkerBackend)(this.options.backend);
120
- this.worker = new WorkerBackend(filteredArgs, data => this.receive(data), err => {
121
- this.emit('error', err);
122
- }, code => {
80
+ let onMessage = data => this.receive(data);
81
+ let onExit = code => {
123
82
  this.exitCode = code;
124
83
  this.emit('exit', code);
125
- });
84
+ };
85
+ let onError = err => {
86
+ this.emit('error', err);
87
+ };
88
+ let WorkerBackend = (0, _backend.getWorkerBackend)(this.options.backend);
89
+ this.worker = new WorkerBackend(filteredArgs, onMessage, onError, onExit);
126
90
  await this.worker.start();
127
91
  await new Promise((resolve, reject) => {
128
92
  this.call({
129
93
  method: 'childInit',
130
94
  args: [forkModule, {
131
- shouldPatchConsole: !!this.options.shouldPatchConsole
95
+ shouldPatchConsole: !!this.options.shouldPatchConsole,
96
+ shouldTrace: !!this.options.shouldTrace
132
97
  }],
133
98
  retries: 0,
134
99
  skipReadyCheck: true,
@@ -137,20 +102,19 @@ class Worker extends _events().default {
137
102
  });
138
103
  });
139
104
  let sharedRefs = this.options.sharedReferences;
140
- let refsShared = new Set(); // in case more refs are created while initial refs are sending
141
-
105
+ let refsShared = new Set();
106
+ // in case more refs are created while initial refs are sending
142
107
  while (refsShared.size < sharedRefs.size) {
143
108
  await Promise.all([...sharedRefs].filter(([ref]) => !refsShared.has(ref)).map(async ([ref, value]) => {
144
109
  await this.sendSharedReference(ref, value);
145
110
  refsShared.add(ref);
146
111
  }));
147
112
  }
148
-
149
113
  this.ready = true;
150
114
  this.emit('ready');
151
115
  }
152
-
153
116
  sendSharedReference(ref, value) {
117
+ this.sentSharedReferences.add(ref);
154
118
  return new Promise((resolve, reject) => {
155
119
  this.call({
156
120
  method: 'createSharedReference',
@@ -162,16 +126,13 @@ class Worker extends _events().default {
162
126
  });
163
127
  });
164
128
  }
165
-
166
129
  send(data) {
167
130
  this.worker.send(data);
168
131
  }
169
-
170
132
  call(call) {
171
133
  if (this.stopped || this.isStopping) {
172
134
  return;
173
135
  }
174
-
175
136
  let idx = this.callId++;
176
137
  this.calls.set(idx, call);
177
138
  let msg = {
@@ -182,35 +143,28 @@ class Worker extends _events().default {
182
143
  method: call.method,
183
144
  args: call.args
184
145
  };
185
-
186
146
  if (this.ready || call.skipReadyCheck === true) {
187
147
  this.send(msg);
188
148
  } else {
189
149
  this.once('ready', () => this.send(msg));
190
150
  }
191
151
  }
192
-
193
152
  receive(message) {
194
153
  if (this.stopped || this.isStopping) {
195
154
  return;
196
155
  }
197
-
198
156
  if (message.type === 'request') {
199
157
  this.emit('request', message);
200
158
  } else if (message.type === 'response') {
201
159
  let idx = message.idx;
202
-
203
160
  if (idx == null) {
204
161
  return;
205
162
  }
206
-
207
163
  let call = this.calls.get(idx);
208
-
209
164
  if (!call) {
210
165
  // Return for unknown calls, these might accur if a third party process uses workers
211
166
  return;
212
167
  }
213
-
214
168
  if (message.contentType === 'error') {
215
169
  call.reject(new (_diagnostic().default)({
216
170
  diagnostic: message.content
@@ -218,22 +172,17 @@ class Worker extends _events().default {
218
172
  } else {
219
173
  call.resolve(message.content);
220
174
  }
221
-
222
175
  this.calls.delete(idx);
223
176
  this.emit('response', message);
224
177
  }
225
178
  }
226
-
227
179
  async stop() {
228
180
  if (!this.stopped) {
229
181
  this.stopped = true;
230
-
231
182
  if (this.worker) {
232
183
  await this.worker.stop();
233
184
  }
234
185
  }
235
186
  }
236
-
237
187
  }
238
-
239
188
  exports.default = Worker;