@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 +23 -0
- package/lib/Handle.js +7 -33
- package/lib/Worker.js +35 -86
- package/lib/WorkerFarm.js +156 -244
- package/lib/backend.js +4 -6
- package/lib/bus.js +6 -24
- package/lib/child.js +67 -132
- package/lib/childState.js +2 -4
- package/lib/core-worker.browser.js +4 -0
- package/lib/core-worker.js +4 -0
- package/lib/cpuCount.js +15 -25
- package/lib/index.js +17 -47
- package/lib/process/ProcessChild.js +4 -42
- package/lib/process/ProcessWorker.js +2 -37
- package/lib/threads/ThreadsChild.js +3 -45
- package/lib/threads/ThreadsWorker.js +0 -30
- package/lib/web/WebChild.js +44 -0
- package/lib/web/WebWorker.js +85 -0
- package/package.json +14 -7
- package/src/Worker.js +24 -14
- package/src/WorkerFarm.js +139 -36
- package/src/backend.js +5 -0
- package/src/bus.js +2 -1
- package/src/child.js +36 -12
- package/src/core-worker.browser.js +3 -0
- package/src/core-worker.js +2 -0
- package/src/cpuCount.js +17 -8
- package/src/index.js +7 -1
- package/src/process/ProcessChild.js +1 -0
- package/src/types.js +1 -1
- package/src/web/WebChild.js +50 -0
- package/src/web/WebWorker.js +85 -0
- package/test/cpuCount.test.js +1 -1
- package/test/workerfarm.js +1 -1
- package/lib/Profiler.js +0 -86
- package/lib/Trace.js +0 -139
- package/src/Profiler.js +0 -93
- package/src/Trace.js +0 -125
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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
let
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
}
|
|
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
|
|
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();
|
|
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;
|