@@ -77,38 +77,47 @@ const config = deepMerge(getConfig(options.config || testRoot), overrideConfigs)
7777
7878function initializeListeners ( ) {
7979 // suite
80- event . dispatcher . on ( event . suite . before , suite => sendToParentThread ( { event : event . suite . before , workerIndex, data : suite . simplify ( ) } ) )
81- event . dispatcher . on ( event . suite . after , suite => sendToParentThread ( { event : event . suite . after , workerIndex, data : suite . simplify ( ) } ) )
80+ event . dispatcher . on ( event . suite . before , suite => safelySendToParent ( { event : event . suite . before , workerIndex, data : suite . simplify ( ) } ) )
81+ event . dispatcher . on ( event . suite . after , suite => safelySendToParent ( { event : event . suite . after , workerIndex, data : suite . simplify ( ) } ) )
8282
8383 // calculate duration
8484 event . dispatcher . on ( event . test . started , test => ( test . start = new Date ( ) ) )
8585
8686 // tests
87- event . dispatcher . on ( event . test . before , test => sendToParentThread ( { event : event . test . before , workerIndex, data : test . simplify ( ) } ) )
88- event . dispatcher . on ( event . test . after , test => sendToParentThread ( { event : event . test . after , workerIndex, data : test . simplify ( ) } ) )
87+ event . dispatcher . on ( event . test . before , test => safelySendToParent ( { event : event . test . before , workerIndex, data : test . simplify ( ) } ) )
88+ event . dispatcher . on ( event . test . after , test => safelySendToParent ( { event : event . test . after , workerIndex, data : test . simplify ( ) } ) )
8989 // we should force-send correct errors to prevent race condition
90- event . dispatcher . on ( event . test . finished , ( test , err ) => sendToParentThread ( { event : event . test . finished , workerIndex, data : { ...test . simplify ( ) , err } } ) )
91- event . dispatcher . on ( event . test . failed , ( test , err ) => sendToParentThread ( { event : event . test . failed , workerIndex, data : { ...test . simplify ( ) , err } } ) )
92- event . dispatcher . on ( event . test . passed , ( test , err ) => sendToParentThread ( { event : event . test . passed , workerIndex, data : { ...test . simplify ( ) , err } } ) )
93- event . dispatcher . on ( event . test . started , test => sendToParentThread ( { event : event . test . started , workerIndex, data : test . simplify ( ) } ) )
94- event . dispatcher . on ( event . test . skipped , test => sendToParentThread ( { event : event . test . skipped , workerIndex, data : test . simplify ( ) } ) )
90+ event . dispatcher . on ( event . test . finished , ( test , err ) => {
91+ const simplifiedData = test . simplify ( )
92+ const serializableErr = serializeError ( err )
93+ safelySendToParent ( { event : event . test . finished , workerIndex, data : { ...simplifiedData , err : serializableErr } } )
94+ } )
95+ event . dispatcher . on ( event . test . failed , ( test , err ) => {
96+ const simplifiedData = test . simplify ( )
97+ const serializableErr = serializeError ( err )
98+ safelySendToParent ( { event : event . test . failed , workerIndex, data : { ...simplifiedData , err : serializableErr } } )
99+ } )
100+ event . dispatcher . on ( event . test . passed , ( test , err ) => safelySendToParent ( { event : event . test . passed , workerIndex, data : { ...test . simplify ( ) , err } } ) )
101+ event . dispatcher . on ( event . test . started , test => safelySendToParent ( { event : event . test . started , workerIndex, data : test . simplify ( ) } ) )
102+ event . dispatcher . on ( event . test . skipped , test => safelySendToParent ( { event : event . test . skipped , workerIndex, data : test . simplify ( ) } ) )
95103
96104 // steps
97- event . dispatcher . on ( event . step . finished , step => sendToParentThread ( { event : event . step . finished , workerIndex, data : step . simplify ( ) } ) )
98- event . dispatcher . on ( event . step . started , step => sendToParentThread ( { event : event . step . started , workerIndex, data : step . simplify ( ) } ) )
99- event . dispatcher . on ( event . step . passed , step => sendToParentThread ( { event : event . step . passed , workerIndex, data : step . simplify ( ) } ) )
100- event . dispatcher . on ( event . step . failed , step => sendToParentThread ( { event : event . step . failed , workerIndex, data : step . simplify ( ) } ) )
101-
102- event . dispatcher . on ( event . hook . failed , ( hook , err ) => sendToParentThread ( { event : event . hook . failed , workerIndex, data : { ...hook . simplify ( ) , err } } ) )
103- event . dispatcher . on ( event . hook . passed , hook => sendToParentThread ( { event : event . hook . passed , workerIndex, data : hook . simplify ( ) } ) )
104- event . dispatcher . on ( event . hook . finished , hook => sendToParentThread ( { event : event . hook . finished , workerIndex, data : hook . simplify ( ) } ) )
105-
106- event . dispatcher . once ( event . all . after , ( ) => {
107- sendToParentThread ( { event : event . all . after , workerIndex, data : container . result ( ) . simplify ( ) } )
105+ event . dispatcher . on ( event . step . finished , step => safelySendToParent ( { event : event . step . finished , workerIndex, data : step . simplify ( ) } ) )
106+ event . dispatcher . on ( event . step . started , step => safelySendToParent ( { event : event . step . started , workerIndex, data : step . simplify ( ) } ) )
107+ event . dispatcher . on ( event . step . passed , step => safelySendToParent ( { event : event . step . passed , workerIndex, data : step . simplify ( ) } ) )
108+ event . dispatcher . on ( event . step . failed , step => safelySendToParent ( { event : event . step . failed , workerIndex, data : step . simplify ( ) } ) )
109+
110+ event . dispatcher . on ( event . hook . failed , ( hook , err ) => {
111+ const serializableErr = serializeError ( err )
112+ safelySendToParent ( { event : event . hook . failed , workerIndex, data : { ...hook . simplify ( ) , err : serializableErr } } )
108113 } )
114+ event . dispatcher . on ( event . hook . passed , hook => safelySendToParent ( { event : event . hook . passed , workerIndex, data : hook . simplify ( ) } ) )
115+ event . dispatcher . on ( event . hook . finished , hook => safelySendToParent ( { event : event . hook . finished , workerIndex, data : hook . simplify ( ) } ) )
116+
117+ event . dispatcher . once ( event . all . after , ( ) => safelySendToParent ( { event : event . all . after , workerIndex, data : container . result ( ) . simplify ( ) } ) )
109118 // all
110119 event . dispatcher . once ( event . all . result , ( ) => {
111- sendToParentThread ( { event : event . all . result , workerIndex, data : container . result ( ) . simplify ( ) } )
120+ safelySendToParent ( { event : event . all . result , workerIndex, data : container . result ( ) . simplify ( ) } )
112121 parentPort ?. close ( )
113122 } )
114123}
@@ -117,6 +126,50 @@ function disablePause() {
117126 global . pause = ( ) => { }
118127}
119128
129+ function serializeError ( err ) {
130+ if ( ! err ) return null
131+ try {
132+ return {
133+ message : err . message ,
134+ stack : err . stack ,
135+ name : err . name ,
136+ actual : err . actual ,
137+ expected : err . expected ,
138+ }
139+ } catch {
140+ return { message : 'Error could not be serialized' , name : 'Error' }
141+ }
142+ }
143+
144+ function safelySendToParent ( data ) {
145+ try {
146+ parentPort ?. postMessage ( data )
147+ } catch ( cloneError ) {
148+ // Fallback for non-serializable data
149+ const fallbackData = { ...data }
150+
151+ // Try to serialize error objects if present
152+ if ( fallbackData . data && fallbackData . data . err ) {
153+ fallbackData . data . err = serializeError ( fallbackData . data . err )
154+ }
155+
156+ // If still fails, send minimal data
157+ try {
158+ parentPort ?. postMessage ( fallbackData )
159+ } catch ( finalError ) {
160+ parentPort ?. postMessage ( {
161+ event : data . event ,
162+ workerIndex,
163+ data : {
164+ title : fallbackData . data ?. title || 'Unknown' ,
165+ state : fallbackData . data ?. state || 'error' ,
166+ err : { message : 'Data could not be serialized' } ,
167+ } ,
168+ } )
169+ }
170+ }
171+ }
172+
120173function sendToParentThread ( data ) {
121174 parentPort ?. postMessage ( data )
122175}
0 commit comments