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