Skip to content

Commit 639b905

Browse files
authored
Unref shared worker when all test workers have deregistered
This should prevent the main process from exiting prematurely with a 0 exit code. See background in #3149 (comment).
1 parent 4ecfe7d commit 639b905

File tree

5 files changed

+43
-10
lines changed

5 files changed

+43
-10
lines changed

lib/plugin-support/shared-workers.js

+8-10
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,13 @@ function launchWorker(filename, initialData) {
5151
export async function observeWorkerProcess(fork, runStatus) {
5252
let registrationCount = 0;
5353
let signalDeregistered;
54+
let launched;
5455
const deregistered = new Promise(resolve => {
55-
signalDeregistered = resolve;
56+
signalDeregistered = () => {
57+
// Only unref the worker once all test workers have been deregistered, otherwise the worker may exit before test workers are deregistered
58+
launched?.worker.unref();
59+
resolve();
60+
};
5661
});
5762

5863
fork.promise.finally(() => {
@@ -62,7 +67,7 @@ export async function observeWorkerProcess(fork, runStatus) {
6267
});
6368

6469
fork.onConnectSharedWorker(async ({filename, initialData, port, signalError}) => {
65-
const launched = launchWorker(filename, initialData);
70+
launched = launchWorker(filename, initialData);
6671

6772
const handleWorkerMessage = async message => {
6873
if (message.type === 'deregistered-test-worker' && message.id === fork.threadId) {
@@ -104,14 +109,7 @@ export async function observeWorkerProcess(fork, runStatus) {
104109
});
105110

106111
launched.worker.on('message', handleWorkerMessage);
107-
} catch {
108-
return;
109-
} finally {
110-
// Attaching listeners has the side-effect of referencing the worker.
111-
// Explicitly unreference it now so it does not prevent the main process
112-
// from exiting.
113-
launched.worker.unref();
114-
}
112+
} catch {}
115113
});
116114

117115
return deregistered;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "module",
3+
"ava": {
4+
"files": [
5+
"*.js"
6+
],
7+
"timeout": "5s"
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import test from 'ava';
2+
import {registerSharedWorker} from 'ava/plugin';
3+
import delay from 'delay';
4+
5+
registerSharedWorker({
6+
filename: new URL('worker.mjs', import.meta.url),
7+
supportedProtocols: ['ava-4'],
8+
});
9+
10+
test('time out', async t => {
11+
await delay(10_000);
12+
13+
t.pass();
14+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default ({negotiateProtocol}) => {
2+
negotiateProtocol(['ava-4']).ready();
3+
};

test/shared-workers/timeout/test.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import test from '@ava/test';
2+
3+
import {fixture} from '../../helpers/exec.js';
4+
5+
test('times out', async t => {
6+
const error = await t.throwsAsync(async () => fixture());
7+
8+
t.is(error.exitCode, 1);
9+
});

0 commit comments

Comments
 (0)