@@ -7,68 +7,74 @@ import type {
77 CompileTypesWorkerResultMessage ,
88} from './compileTypesWorker' ;
99
10- let worker : Worker | null = null ;
11- let workerIndex = 0 ;
10+ const activeWorkers = new Map < number , Worker > ( ) ;
11+ let workerIndex = 1 ;
1212
1313export function compileTypesAsync (
1414 params : CompileTypesWorkerMessage ,
1515 loggerHint = '' ,
1616) : Promise < void > {
1717 const logger = getLogger ( ) ;
18- workerIndex ++ ;
19- const innerWorkerIndex = workerIndex ;
2018
21- return new Promise ( ( resolve , reject ) => {
22- if ( worker ) {
23- logger . log ( `Terminating existing worker process # ${ innerWorkerIndex } ` ) ;
24- worker . postMessage ( { type : 'exit' } ) ;
25- }
19+ activeWorkers . forEach ( ( worker , index ) => {
20+ logger . log ( `Terminating existing worker process # ${ index } ` ) ;
21+ worker . terminate ( ) ;
22+ } ) ;
23+ activeWorkers . clear ( ) ;
2624
27- const workerPath = path . join ( __dirname , 'compileTypesWorker.js' ) ;
28- worker = new Worker ( workerPath ) ;
25+ const currentWorkerIndex = workerIndex ++ ;
26+ const worker = new Worker ( path . join ( __dirname , 'compileTypesWorker.js' ) ) ;
27+ activeWorkers . set ( currentWorkerIndex , worker ) ;
2928
29+ return new Promise ( ( resolve , reject ) => {
3030 worker . on ( 'message' , ( result : CompileTypesWorkerResultMessage ) => {
3131 switch ( result . status ) {
3232 case 'log' :
33- logger [ result . level ] ( `[Worker] run #${ innerWorkerIndex } :` , result . message ) ;
33+ logger [ result . level ] ( `[Worker] run #${ currentWorkerIndex } :` , result . message ) ;
3434 return ;
3535 case 'success' :
3636 resolve ( ) ;
3737 break ;
3838 case 'failure' :
3939 logger . warn (
40- `[Worker] run #${ innerWorkerIndex } : Failed to compile types for exposed modules.` ,
40+ `[Worker] run #${ currentWorkerIndex } : Failed to compile types for exposed modules.` ,
4141 loggerHint ,
4242 ) ;
4343 reject ( new Error ( 'Failed to compile types for exposed modules.' ) ) ;
4444 break ;
4545 case 'error' :
4646 logger . warn (
47- `[Worker] run #${ innerWorkerIndex } : Error compiling types for exposed modules.` ,
47+ `[Worker] run #${ currentWorkerIndex } : Error compiling types for exposed modules.` ,
4848 loggerHint ,
4949 ) ;
5050 reject ( result . error ) ;
5151 break ;
52+ default :
53+ logger . error ( `[Worker]: Received unknown status: ${ ( result as Dict ) . status } ` ) ;
54+ break ;
5255 }
53- worker ?. postMessage ( { type : 'exit' } ) ;
54- worker = null ;
56+
57+ worker . terminate ( ) ;
5558 } ) ;
5659
5760 worker . on ( 'error' , error => {
58- logger . warn ( `[Worker] run #${ innerWorkerIndex } : Unexpected error.` , loggerHint ) ;
61+ logger . warn ( `[Worker] run #${ currentWorkerIndex } : Unexpected error.` , loggerHint ) ;
5962 logger . log ( error ) ;
6063 reject ( error ) ;
61- worker ?. postMessage ( { type : 'exit' } ) ;
62- worker = null ;
64+ worker . terminate ( ) ;
6365 } ) ;
6466
6567 worker . on ( 'exit' , code => {
66- if ( code === null || code === 0 ) {
68+ const isActiveWorker = activeWorkers . has ( currentWorkerIndex ) ;
69+ if ( isActiveWorker ) {
70+ activeWorkers . delete ( currentWorkerIndex ) ;
71+ }
72+
73+ if ( ! code || ! isActiveWorker ) {
6774 resolve ( ) ;
6875 } else {
69- reject ( new Error ( `[Worker] run #${ innerWorkerIndex } : Process exited with code ${ code } ` ) ) ;
76+ reject ( new Error ( `[Worker] run #${ currentWorkerIndex } : Process exited with code ${ code } ` ) ) ;
7077 }
71- worker = null ;
7278 } ) ;
7379
7480 worker . postMessage ( params ) ;
0 commit comments