@parcel/workers 2.0.0-nightly.92 → 2.0.1

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.
@@ -5,30 +5,42 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _worker_threads = require("worker_threads");
8
+ function _worker_threads() {
9
+ const data = require("worker_threads");
9
10
 
10
- var _path = _interopRequireDefault(require("path"));
11
+ _worker_threads = function () {
12
+ return data;
13
+ };
11
14
 
12
- var _core = require("@parcel/core");
15
+ return data;
16
+ }
13
17
 
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+ function _path() {
19
+ const data = _interopRequireDefault(require("path"));
15
20
 
16
- 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; }
21
+ _path = function () {
22
+ return data;
23
+ };
17
24
 
18
- const WORKER_PATH = _path.default.join(__dirname, 'ThreadsChild.js');
25
+ return data;
26
+ }
19
27
 
20
- class ThreadsWorker {
21
- constructor(execArgv, onMessage, onError, onExit) {
22
- _defineProperty(this, "execArgv", void 0);
28
+ function _core() {
29
+ const data = require("@parcel/core");
23
30
 
24
- _defineProperty(this, "onMessage", void 0);
31
+ _core = function () {
32
+ return data;
33
+ };
25
34
 
26
- _defineProperty(this, "onError", void 0);
35
+ return data;
36
+ }
27
37
 
28
- _defineProperty(this, "onExit", void 0);
38
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
39
 
30
- _defineProperty(this, "worker", void 0);
40
+ const WORKER_PATH = _path().default.join(__dirname, 'ThreadsChild.js');
31
41
 
42
+ class ThreadsWorker {
43
+ constructor(execArgv, onMessage, onError, onExit) {
32
44
  this.execArgv = execArgv;
33
45
  this.onMessage = onMessage;
34
46
  this.onError = onError;
@@ -36,7 +48,7 @@ class ThreadsWorker {
36
48
  }
37
49
 
38
50
  start() {
39
- this.worker = new _worker_threads.Worker(WORKER_PATH, {
51
+ this.worker = new (_worker_threads().Worker)(WORKER_PATH, {
40
52
  execArgv: this.execArgv,
41
53
  env: process.env
42
54
  });
@@ -55,11 +67,11 @@ class ThreadsWorker {
55
67
  }
56
68
 
57
69
  handleMessage(data) {
58
- this.onMessage((0, _core.restoreDeserializedObject)(data));
70
+ this.onMessage((0, _core().restoreDeserializedObject)(data));
59
71
  }
60
72
 
61
73
  send(data) {
62
- this.worker.postMessage((0, _core.prepareForSerialization)(data));
74
+ this.worker.postMessage((0, _core().prepareForSerialization)(data));
63
75
  }
64
76
 
65
77
  }
package/package.json CHANGED
@@ -1,29 +1,35 @@
1
1
  {
2
2
  "name": "@parcel/workers",
3
- "version": "2.0.0-nightly.92+c0655c56",
3
+ "version": "2.0.1",
4
4
  "description": "Blazing fast, zero configuration web application bundler",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
9
+ "funding": {
10
+ "type": "opencollective",
11
+ "url": "https://opencollective.com/parcel"
12
+ },
9
13
  "repository": {
10
14
  "type": "git",
11
15
  "url": "https://github.com/parcel-bundler/parcel.git"
12
16
  },
13
17
  "main": "lib/index.js",
14
18
  "source": "src/index.js",
19
+ "types": "index.d.ts",
15
20
  "engines": {
16
- "node": ">= 10.0.0"
21
+ "node": ">= 12.0.0"
17
22
  },
18
23
  "dependencies": {
19
- "@parcel/diagnostic": "2.0.0-nightly.92+c0655c56",
20
- "@parcel/logger": "2.0.0-nightly.92+c0655c56",
21
- "@parcel/utils": "2.0.0-nightly.92+c0655c56",
24
+ "@parcel/diagnostic": "^2.0.1",
25
+ "@parcel/logger": "^2.0.1",
26
+ "@parcel/types": "^2.0.1",
27
+ "@parcel/utils": "^2.0.1",
22
28
  "chrome-trace-event": "^1.0.2",
23
29
  "nullthrows": "^1.1.1"
24
30
  },
25
31
  "peerDependencies": {
26
- "@parcel/core": "^2.0.0-alpha.3.1"
32
+ "@parcel/core": "^2.0.0"
27
33
  },
28
- "gitHead": "c0655c56f7973492fdb28671029ddd923f17a244"
34
+ "gitHead": "28b47e6bdca7de2a06b7cc39a4a0b1df89f3fe15"
29
35
  }
package/src/Handle.js CHANGED
@@ -1,20 +1,16 @@
1
- // @flow
2
-
3
- import type {WorkerApi} from './';
4
-
1
+ // @flow strict-local
5
2
  import {registerSerializableClass} from '@parcel/core';
6
-
7
- import {child} from './childState';
3
+ // $FlowFixMe
8
4
  import packageJson from '../package.json';
9
5
 
10
6
  let HANDLE_ID = 0;
11
-
7
+ // $FlowFixMe
12
8
  export type HandleFunction = (...args: Array<any>) => any;
13
9
 
14
10
  type HandleOpts = {|
15
- fn: HandleFunction,
11
+ fn?: HandleFunction,
16
12
  childId?: ?number,
17
- workerApi: WorkerApi,
13
+ id?: number,
18
14
  |};
19
15
 
20
16
  const handleById: Map<number, Handle> = new Map();
@@ -22,14 +18,12 @@ const handleById: Map<number, Handle> = new Map();
22
18
  export default class Handle {
23
19
  id: number;
24
20
  childId: ?number;
25
- fn: HandleFunction;
26
- workerApi: WorkerApi;
21
+ fn: ?HandleFunction;
27
22
 
28
23
  constructor(opts: HandleOpts) {
29
- this.id = ++HANDLE_ID;
24
+ this.id = opts.id ?? ++HANDLE_ID;
30
25
  this.fn = opts.fn;
31
26
  this.childId = opts.childId;
32
- this.workerApi = opts.workerApi;
33
27
  handleById.set(this.id, this);
34
28
  }
35
29
 
@@ -37,38 +31,15 @@ export default class Handle {
37
31
  handleById.delete(this.id);
38
32
  }
39
33
 
40
- serialize() {
34
+ serialize(): {|childId: ?number, id: number|} {
41
35
  return {
42
36
  id: this.id,
43
37
  childId: this.childId,
44
38
  };
45
39
  }
46
40
 
47
- static deserialize(opts: {|id: number, childId?: number|}) {
48
- return function(...args: Array<mixed>) {
49
- let workerApi;
50
- if (child) {
51
- workerApi = child.workerApi;
52
- } else {
53
- let handle = handleById.get(opts.id);
54
- if (!handle) {
55
- throw new Error(
56
- 'Corresponding Handle was not found. It may have been disposed.',
57
- );
58
- }
59
- workerApi = handle.workerApi;
60
- }
61
-
62
- if (opts.childId != null && child) {
63
- throw new Error('Cannot call another child from a child');
64
- }
65
-
66
- if (opts.childId != null && workerApi.callChild) {
67
- return workerApi.callChild(opts.childId, {handle: opts.id, args});
68
- }
69
-
70
- return workerApi.callMaster({handle: opts.id, args}, true);
71
- };
41
+ static deserialize(opts: HandleOpts): Handle {
42
+ return new Handle(opts);
72
43
  }
73
44
  }
74
45
 
package/src/Profiler.js CHANGED
@@ -40,7 +40,7 @@ type PositionTickInfo = {|
40
40
  export default class Profiler {
41
41
  session: Session;
42
42
 
43
- startProfiling() {
43
+ startProfiling(): Promise<mixed> {
44
44
  let inspector;
45
45
  try {
46
46
  inspector = require('inspector');
package/src/Trace.js CHANGED
@@ -12,17 +12,17 @@ export default class Trace {
12
12
  this.tracer = new Tracer();
13
13
  this.tid = 0;
14
14
  this.eventId = 0;
15
- this.init();
16
15
  }
17
16
 
18
- getEventId() {
17
+ getEventId(): number {
19
18
  return this.eventId++;
20
19
  }
21
20
 
22
- init() {
21
+ init(ts: number) {
23
22
  this.tracer.instantEvent({
24
23
  name: 'TracingStartedInPage',
25
24
  id: this.getEventId(),
25
+ ts,
26
26
  cat: ['disabled-by-default-devtools.timeline'],
27
27
  args: {
28
28
  data: {
@@ -42,6 +42,7 @@ export default class Trace {
42
42
  this.tracer.instantEvent({
43
43
  name: 'TracingStartedInBrowser',
44
44
  id: this.getEventId(),
45
+ ts,
45
46
  cat: ['disabled-by-default-devtools.timeline'],
46
47
  args: {
47
48
  data: {
@@ -52,6 +53,9 @@ export default class Trace {
52
53
  }
53
54
 
54
55
  addCPUProfile(name: string, profile: Profile) {
56
+ if (this.eventId === 0) {
57
+ this.init(profile.startTime);
58
+ }
55
59
  const trace = this.tracer;
56
60
  const tid = this.tid;
57
61
  this.tid++;
@@ -111,7 +115,7 @@ export default class Trace {
111
115
  });
112
116
  }
113
117
 
114
- pipe(writable: Writable) {
118
+ pipe(writable: Writable): stream$Writable {
115
119
  return this.tracer.pipe(writable);
116
120
  }
117
121
 
package/src/Worker.js CHANGED
@@ -1,8 +1,10 @@
1
1
  // @flow
2
2
 
3
3
  import type {FilePath} from '@parcel/types';
4
- import type {WorkerMessage, WorkerImpl, BackendType} from './types';
4
+ import type {BackendType, WorkerImpl, WorkerMessage} from './types';
5
+ import type {SharedReference} from './WorkerFarm';
5
6
 
7
+ import nullthrows from 'nullthrows';
6
8
  import EventEmitter from 'events';
7
9
  import ThrowableDiagnostic from '@parcel/diagnostic';
8
10
  import {getWorkerBackend} from './backend';
@@ -12,6 +14,7 @@ export type WorkerCall = {|
12
14
  handle?: number,
13
15
  args: $ReadOnlyArray<any>,
14
16
  retries: number,
17
+ skipReadyCheck?: boolean,
15
18
  resolve: (result: Promise<any> | any) => void,
16
19
  reject: (error: any) => void,
17
20
  |};
@@ -19,7 +22,8 @@ export type WorkerCall = {|
19
22
  type WorkerOpts = {|
20
23
  forcedKillTime: number,
21
24
  backend: BackendType,
22
- patchConsole?: boolean,
25
+ shouldPatchConsole?: boolean,
26
+ sharedReferences: $ReadOnlyMap<SharedReference, mixed>,
23
27
  |};
24
28
 
25
29
  let WORKER_ID = 0;
@@ -27,14 +31,15 @@ export default class Worker extends EventEmitter {
27
31
  +options: WorkerOpts;
28
32
  worker: WorkerImpl;
29
33
  id: number = WORKER_ID++;
34
+ sharedReferences: $ReadOnlyMap<SharedReference, mixed> = new Map();
30
35
 
31
36
  calls: Map<number, WorkerCall> = new Map();
32
- exitCode = null;
33
- callId = 0;
37
+ exitCode: ?number = null;
38
+ callId: number = 0;
34
39
 
35
- ready = false;
36
- stopped = false;
37
- isStopping = false;
40
+ ready: boolean = false;
41
+ stopped: boolean = false;
42
+ isStopping: boolean = false;
38
43
 
39
44
  constructor(options: WorkerOpts) {
40
45
  super();
@@ -43,7 +48,7 @@ export default class Worker extends EventEmitter {
43
48
 
44
49
  async fork(forkModule: FilePath) {
45
50
  let filteredArgs = process.execArgv.filter(
46
- v => !/^--(debug|inspect)/.test(v),
51
+ v => !/^--(debug|inspect|max-old-space-size=)/.test(v),
47
52
  );
48
53
 
49
54
  for (let i = 0; i < filteredArgs.length; i++) {
@@ -57,6 +62,30 @@ export default class Worker extends EventEmitter {
57
62
  }
58
63
  }
59
64
 
65
+ // Workaround for https://github.com/nodejs/node/issues/29117
66
+ if (process.env.NODE_OPTIONS) {
67
+ // arg parsing logic adapted from https://stackoverflow.com/a/46946420/2352201
68
+ let opts = [''];
69
+ let quote = false;
70
+ for (let c of nullthrows(process.env.NODE_OPTIONS.match(/.|^$/g))) {
71
+ if (c === '"') {
72
+ quote = !quote;
73
+ } else if (!quote && c === ' ') {
74
+ opts.push('');
75
+ } else {
76
+ opts[opts.length - 1] += c.replace(/\\(.)/, '$1');
77
+ }
78
+ }
79
+
80
+ for (let i = 0; i < opts.length; i++) {
81
+ let opt = opts[i];
82
+ if (opt === '-r' || opt === '--require') {
83
+ filteredArgs.push(opt, opts[i + 1]);
84
+ i++;
85
+ }
86
+ }
87
+ }
88
+
60
89
  let onMessage = data => this.receive(data);
61
90
  let onExit = code => {
62
91
  this.exitCode = code;
@@ -77,19 +106,47 @@ export default class Worker extends EventEmitter {
77
106
  args: [
78
107
  forkModule,
79
108
  {
80
- patchConsole: !!this.options.patchConsole,
109
+ shouldPatchConsole: !!this.options.shouldPatchConsole,
81
110
  },
82
111
  ],
83
112
  retries: 0,
113
+ skipReadyCheck: true,
84
114
  resolve,
85
115
  reject,
86
116
  });
87
117
  });
88
118
 
119
+ let sharedRefs = this.options.sharedReferences;
120
+ let refsShared = new Set();
121
+ // in case more refs are created while initial refs are sending
122
+ while (refsShared.size < sharedRefs.size) {
123
+ await Promise.all(
124
+ [...sharedRefs]
125
+ .filter(([ref]) => !refsShared.has(ref))
126
+ .map(async ([ref, value]) => {
127
+ await this.sendSharedReference(ref, value);
128
+ refsShared.add(ref);
129
+ }),
130
+ );
131
+ }
132
+
89
133
  this.ready = true;
90
134
  this.emit('ready');
91
135
  }
92
136
 
137
+ sendSharedReference(ref: SharedReference, value: mixed): Promise<any> {
138
+ return new Promise((resolve, reject) => {
139
+ this.call({
140
+ method: 'createSharedReference',
141
+ args: [ref, value],
142
+ resolve,
143
+ reject,
144
+ retries: 0,
145
+ skipReadyCheck: true,
146
+ });
147
+ });
148
+ }
149
+
93
150
  send(data: WorkerMessage): void {
94
151
  this.worker.send(data);
95
152
  }
@@ -102,14 +159,20 @@ export default class Worker extends EventEmitter {
102
159
  let idx = this.callId++;
103
160
  this.calls.set(idx, call);
104
161
 
105
- this.send({
162
+ let msg = {
106
163
  type: 'request',
107
164
  idx: idx,
108
165
  child: this.id,
109
166
  handle: call.handle,
110
167
  method: call.method,
111
168
  args: call.args,
112
- });
169
+ };
170
+
171
+ if (this.ready || call.skipReadyCheck === true) {
172
+ this.send(msg);
173
+ } else {
174
+ this.once('ready', () => this.send(msg));
175
+ }
113
176
  }
114
177
 
115
178
  receive(message: WorkerMessage): void {