@@ -49,49 +49,61 @@ function launchWorker(filename, initialData) {
49
49
}
50
50
51
51
export async function observeWorkerProcess ( fork , runStatus ) {
52
- let registrationCount = 0 ;
53
- let signalDeregistered ;
54
- let launched ;
55
- const deregistered = new Promise ( 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 ( ) ;
52
+ let signalDone ;
53
+
54
+ const done = new Promise ( resolve => {
55
+ signalDone = ( ) => {
59
56
resolve ( ) ;
60
57
} ;
61
58
} ) ;
62
59
63
- fork . promise . finally ( ( ) => {
64
- if ( registrationCount === 0 ) {
65
- signalDeregistered ( ) ;
60
+ const activeInstances = new Set ( ) ;
61
+
62
+ const removeInstance = instance => {
63
+ instance . worker . unref ( ) ;
64
+ activeInstances . delete ( instance ) ;
65
+
66
+ if ( activeInstances . size === 0 ) {
67
+ signalDone ( ) ;
68
+ }
69
+ } ;
70
+
71
+ const removeAllInstances = ( ) => {
72
+ if ( activeInstances . size === 0 ) {
73
+ signalDone ( ) ;
74
+ return ;
66
75
}
76
+
77
+ for ( const instance of activeInstances ) {
78
+ removeInstance ( instance ) ;
79
+ }
80
+ } ;
81
+
82
+ fork . promise . finally ( ( ) => {
83
+ removeAllInstances ( ) ;
67
84
} ) ;
68
85
69
86
fork . onConnectSharedWorker ( async ( { filename, initialData, port, signalError} ) => {
70
- launched = launchWorker ( filename , initialData ) ;
87
+ const launched = launchWorker ( filename , initialData ) ;
88
+ activeInstances . add ( launched ) ;
71
89
72
90
const handleWorkerMessage = async message => {
73
91
if ( message . type === 'deregistered-test-worker' && message . id === fork . threadId ) {
74
92
launched . worker . off ( 'message' , handleWorkerMessage ) ;
75
-
76
- registrationCount -- ;
77
- if ( registrationCount === 0 ) {
78
- signalDeregistered ( ) ;
79
- }
93
+ removeInstance ( launched ) ;
80
94
}
81
95
} ;
82
96
83
97
launched . statePromises . error . then ( error => {
84
- signalDeregistered ( ) ;
85
98
launched . worker . off ( 'message' , handleWorkerMessage ) ;
99
+ removeAllInstances ( ) ;
86
100
runStatus . emitStateChange ( { type : 'shared-worker-error' , err : serializeError ( 'Shared worker error' , true , error ) } ) ;
87
101
signalError ( ) ;
88
102
} ) ;
89
103
90
104
try {
91
105
await launched . statePromises . available ;
92
106
93
- registrationCount ++ ;
94
-
95
107
port . postMessage ( { type : 'ready' } ) ;
96
108
97
109
launched . worker . postMessage ( {
@@ -112,5 +124,5 @@ export async function observeWorkerProcess(fork, runStatus) {
112
124
} catch { }
113
125
} ) ;
114
126
115
- return deregistered ;
127
+ return done ;
116
128
}
0 commit comments