Skip to content

Commit 603769f

Browse files
committed
feat(jest-worker): factory pattern
1 parent 6d1cbe8 commit 603769f

6 files changed

Lines changed: 71 additions & 44 deletions

File tree

packages/jest-haste-map/src/index.ts

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -546,14 +546,16 @@ class HasteMap extends EventEmitter {
546546
if (this._options.retainAllFiles && filePath.includes(NODE_MODULES)) {
547547
if (computeSha1) {
548548
return this._getWorker(workerOptions)
549-
.getSha1({
550-
computeDependencies: this._options.computeDependencies,
551-
computeSha1,
552-
dependencyExtractor: this._options.dependencyExtractor,
553-
filePath,
554-
hasteImplModulePath: this._options.hasteImplModulePath,
555-
rootDir,
556-
})
549+
.then(workerInstance =>
550+
workerInstance.getSha1({
551+
computeDependencies: this._options.computeDependencies,
552+
computeSha1,
553+
dependencyExtractor: this._options.dependencyExtractor,
554+
filePath,
555+
hasteImplModulePath: this._options.hasteImplModulePath,
556+
rootDir,
557+
}),
558+
)
557559
.then(workerReply, workerError);
558560
}
559561

@@ -622,14 +624,16 @@ class HasteMap extends EventEmitter {
622624
}
623625

624626
return this._getWorker(workerOptions)
625-
.worker({
626-
computeDependencies: this._options.computeDependencies,
627-
computeSha1,
628-
dependencyExtractor: this._options.dependencyExtractor,
629-
filePath,
630-
hasteImplModulePath: this._options.hasteImplModulePath,
631-
rootDir,
632-
})
627+
.then(workerInstance =>
628+
workerInstance.worker({
629+
computeDependencies: this._options.computeDependencies,
630+
computeSha1,
631+
dependencyExtractor: this._options.dependencyExtractor,
632+
filePath,
633+
hasteImplModulePath: this._options.hasteImplModulePath,
634+
rootDir,
635+
}),
636+
)
633637
.then(workerReply, workerError);
634638
}
635639

@@ -714,17 +718,19 @@ class HasteMap extends EventEmitter {
714718
/**
715719
* Creates workers or parses files and extracts metadata in-process.
716720
*/
717-
private _getWorker(options?: {forceInBand: boolean}): WorkerInterface {
721+
private async _getWorker(options?: {
722+
forceInBand: boolean;
723+
}): Promise<WorkerInterface> {
718724
if (!this._worker) {
719725
if ((options && options.forceInBand) || this._options.maxWorkers <= 1) {
720726
this._worker = {getSha1, worker};
721727
} else {
722728
// @ts-expect-error: assignment of a worker with custom properties.
723-
this._worker = new Worker(require.resolve('./worker'), {
729+
this._worker = (await Worker.create(require.resolve('./worker'), {
724730
exposedMethods: ['getSha1', 'worker'],
725731
maxRetries: 3,
726732
numWorkers: this._options.maxWorkers,
727-
}) as WorkerInterface;
733+
})) as WorkerInterface;
728734
}
729735
}
730736

packages/jest-reporters/src/CoverageReporter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ export default class CoverageReporter extends BaseReporter {
151151
if (this._globalConfig.maxWorkers <= 1) {
152152
worker = require('./CoverageWorker');
153153
} else {
154-
worker = new Worker(require.resolve('./CoverageWorker'), {
154+
worker = await Worker.create(require.resolve('./CoverageWorker'), {
155155
exposedMethods: ['worker'],
156156
maxRetries: 2,
157157
numWorkers: this._globalConfig.maxWorkers,

packages/jest-runner/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class TestRunner {
168168
}
169169
}
170170

171-
const worker = new Worker(TEST_WORKER_PATH, {
171+
const worker = (await Worker.create(TEST_WORKER_PATH, {
172172
exposedMethods: ['worker'],
173173
forkOptions: {stdio: 'pipe'},
174174
maxRetries: 3,
@@ -178,7 +178,7 @@ class TestRunner {
178178
serializableResolvers: Array.from(resolvers.values()),
179179
},
180180
],
181-
}) as WorkerInterface;
181+
})) as WorkerInterface;
182182

183183
if (worker.getStdout()) worker.getStdout().pipe(process.stdout);
184184
if (worker.getStderr()) worker.getStderr().pipe(process.stderr);

packages/jest-worker/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ This example covers the minimal usage:
2424
import JestWorker from 'jest-worker';
2525

2626
async function main() {
27-
const worker = new JestWorker(require.resolve('./Worker'));
27+
const worker = await JestWorker.create(require.resolve('./Worker'));
2828
const result = await worker.hello('Alice'); // "Hello, Alice"
2929
}
3030

@@ -144,7 +144,7 @@ This example covers the standard usage:
144144
import JestWorker from 'jest-worker';
145145

146146
async function main() {
147-
const myWorker = new JestWorker(require.resolve('./Worker'), {
147+
const myWorker = await JestWorker.create(require.resolve('./Worker'), {
148148
exposedMethods: ['foo', 'bar', 'getWorkerId'],
149149
numWorkers: 4,
150150
});
@@ -188,7 +188,7 @@ This example covers the usage with a `computeWorkerKey` method:
188188
import JestWorker from 'jest-worker';
189189

190190
async function main() {
191-
const myWorker = new JestWorker(require.resolve('./Worker'), {
191+
const myWorker = await JestWorker.create(require.resolve('./Worker'), {
192192
computeWorkerKey: (method, filename) => filename,
193193
});
194194

packages/jest-worker/src/__performance_tests__/test.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,14 @@ function testJestWorker() {
9393
}
9494
}
9595

96-
const farm = new JestWorker(require.resolve('./workers/jest_worker'), {
97-
exposedMethods: [method],
98-
forkOptions: {execArgv: []},
99-
workers: threads,
100-
});
96+
const farm = await JestWorker.create(
97+
require.resolve('./workers/jest_worker'),
98+
{
99+
exposedMethods: [method],
100+
forkOptions: {execArgv: []},
101+
workers: threads,
102+
},
103+
);
101104

102105
farm.getStdout().pipe(process.stdout);
103106
farm.getStderr().pipe(process.stderr);

packages/jest-worker/src/index.ts

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ export default class JestWorker {
7979
this._options = {...options};
8080
this._ending = false;
8181

82-
this._inspectorSession = this.setUpInspector();
83-
8482
const workerPoolOptions: WorkerPoolOptions = {
8583
enableWorkerThreads: this._options.enableWorkerThreads ?? false,
8684
forkOptions: this._options.forkOptions ?? {},
@@ -111,19 +109,39 @@ export default class JestWorker {
111109
this._bindExposedWorkerMethods(workerPath, this._options);
112110
}
113111

114-
private setUpInspector() {
115-
// Open V8 Inspector
116-
inspector.open();
112+
public static create = async (
113+
workerPath: string,
114+
options?: FarmOptions,
115+
): Promise<JestWorker> => {
116+
const setUpInspector = async () => {
117+
// Open V8 Inspector
118+
inspector.open();
119+
120+
const inspectorUrl = inspector.url();
121+
if (inspectorUrl) {
122+
const session = new inspector.Session();
123+
session.connect();
124+
await new Promise((resolve, reject) => {
125+
session.post('Debugger.enable', (err: Error) => {
126+
if (err === null) {
127+
resolve();
128+
} else {
129+
reject(err);
130+
}
131+
});
132+
});
133+
return session;
134+
}
135+
return undefined;
136+
};
137+
138+
const jestWorker = new JestWorker(workerPath, options);
139+
const inspectorSession = await setUpInspector();
117140

118-
const inspectorUrl = inspector.url();
119-
let session;
120-
if (inspectorUrl !== undefined) {
121-
session = new inspector.Session();
122-
session.connect();
123-
session.post('Debugger.enable');
124-
}
125-
return session;
126-
}
141+
jestWorker._inspectorSession = inspectorSession;
142+
143+
return jestWorker;
144+
};
127145

128146
private _bindExposedWorkerMethods(
129147
workerPath: string,

0 commit comments

Comments
 (0)