|
| 1 | +diff --git a/node_modules/ava/lib/plugin-support/shared-workers.js b/node_modules/ava/lib/plugin-support/shared-workers.js |
| 2 | +index 94030ce..2d65454 100644 |
| 3 | +--- a/node_modules/ava/lib/plugin-support/shared-workers.js |
| 4 | ++++ b/node_modules/ava/lib/plugin-support/shared-workers.js |
| 5 | +@@ -49,35 +49,54 @@ function launchWorker(filename, initialData) { |
| 6 | + } |
| 7 | + |
| 8 | + export async function observeWorkerProcess(fork, runStatus) { |
| 9 | +- let registrationCount = 0; |
| 10 | +- let signalDeregistered; |
| 11 | +- const deregistered = new Promise(resolve => { |
| 12 | +- signalDeregistered = resolve; |
| 13 | ++ let signalDone; |
| 14 | ++ |
| 15 | ++ const done = new Promise(resolve => { |
| 16 | ++ signalDone = () => { |
| 17 | ++ resolve(); |
| 18 | ++ }; |
| 19 | + }); |
| 20 | + |
| 21 | +- fork.promise.finally(() => { |
| 22 | +- if (registrationCount === 0) { |
| 23 | +- signalDeregistered(); |
| 24 | ++ const activeInstances = new Set(); |
| 25 | ++ |
| 26 | ++ const removeInstance = instance => { |
| 27 | ++ instance.worker.unref(); |
| 28 | ++ activeInstances.delete(instance); |
| 29 | ++ |
| 30 | ++ if (activeInstances.size === 0) { |
| 31 | ++ signalDone(); |
| 32 | ++ } |
| 33 | ++ }; |
| 34 | ++ |
| 35 | ++ const removeAllInstances = () => { |
| 36 | ++ if (activeInstances.size === 0) { |
| 37 | ++ signalDone(); |
| 38 | ++ return; |
| 39 | + } |
| 40 | ++ |
| 41 | ++ for (const instance of activeInstances) { |
| 42 | ++ removeInstance(instance); |
| 43 | ++ } |
| 44 | ++ }; |
| 45 | ++ |
| 46 | ++ fork.promise.finally(() => { |
| 47 | ++ removeAllInstances(); |
| 48 | + }); |
| 49 | + |
| 50 | + fork.onConnectSharedWorker(async ({filename, initialData, port, signalError}) => { |
| 51 | + const launched = launchWorker(filename, initialData); |
| 52 | ++ activeInstances.add(launched); |
| 53 | + |
| 54 | + const handleWorkerMessage = async message => { |
| 55 | + if (message.type === 'deregistered-test-worker' && message.id === fork.threadId) { |
| 56 | + launched.worker.off('message', handleWorkerMessage); |
| 57 | +- |
| 58 | +- registrationCount--; |
| 59 | +- if (registrationCount === 0) { |
| 60 | +- signalDeregistered(); |
| 61 | +- } |
| 62 | ++ removeInstance(launched); |
| 63 | + } |
| 64 | + }; |
| 65 | + |
| 66 | + launched.statePromises.error.then(error => { |
| 67 | +- signalDeregistered(); |
| 68 | + launched.worker.off('message', handleWorkerMessage); |
| 69 | ++ removeAllInstances(); |
| 70 | + runStatus.emitStateChange({type: 'shared-worker-error', err: serializeError('Shared worker error', true, error)}); |
| 71 | + signalError(); |
| 72 | + }); |
| 73 | +@@ -85,8 +104,6 @@ export async function observeWorkerProcess(fork, runStatus) { |
| 74 | + try { |
| 75 | + await launched.statePromises.available; |
| 76 | + |
| 77 | +- registrationCount++; |
| 78 | +- |
| 79 | + port.postMessage({type: 'ready'}); |
| 80 | + |
| 81 | + launched.worker.postMessage({ |
| 82 | +@@ -104,15 +121,8 @@ export async function observeWorkerProcess(fork, runStatus) { |
| 83 | + }); |
| 84 | + |
| 85 | + launched.worker.on('message', handleWorkerMessage); |
| 86 | +- } catch { |
| 87 | +- return; |
| 88 | +- } finally { |
| 89 | +- // Attaching listeners has the side-effect of referencing the worker. |
| 90 | +- // Explicitly unreference it now so it does not prevent the main process |
| 91 | +- // from exiting. |
| 92 | +- launched.worker.unref(); |
| 93 | +- } |
| 94 | ++ } catch {} |
| 95 | + }); |
| 96 | + |
| 97 | +- return deregistered; |
| 98 | ++ return done; |
| 99 | + } |
0 commit comments