@@ -5,7 +5,12 @@ import { Configuration } from './configuration.js';
5
5
import { getModuleDirname , getProjectDirname } from './getDirname.js' ;
6
6
import { Logger } from './logger.js' ;
7
7
8
- const workers = new Map < string , Worker > ( ) ;
8
+ interface MyWorker extends Worker {
9
+ used ?: boolean ;
10
+ toKill ?: boolean ;
11
+ }
12
+
13
+ const workers = new Map < string , MyWorker > ( ) ;
9
14
10
15
/**
11
16
* Run the function in a Node.js Worker Thread
@@ -22,7 +27,9 @@ async function runInWorker(input: {
22
27
const func = await Configuration . getLambda ( input . fuctionRequest . functionId ) ;
23
28
24
29
return new Promise < void > ( ( resolve , reject ) => {
25
- let worker = workers . get ( input . fuctionRequest . workerId ) ;
30
+ let worker : MyWorker | undefined = workers . get (
31
+ input . fuctionRequest . workerId ,
32
+ ) ;
26
33
27
34
if ( ! worker ) {
28
35
worker = startWorker ( {
@@ -33,6 +40,8 @@ async function runInWorker(input: {
33
40
environment : input . environment ,
34
41
verbose : Configuration . config . verbose ,
35
42
} ) ;
43
+ worker . used = false ;
44
+ worker . toKill = false ;
36
45
} else {
37
46
Logger . verbose (
38
47
`[Function ${ input . fuctionRequest . functionId } ] [Worker ${ input . fuctionRequest . workerId } ] Reusing worker` ,
@@ -44,11 +53,18 @@ async function runInWorker(input: {
44
53
`[Function ${ input . fuctionRequest . functionId } ] [Worker ${ input . fuctionRequest . workerId } ] Worker message` ,
45
54
JSON . stringify ( msg ) ,
46
55
) ;
56
+
57
+ worker . used = false ;
47
58
if ( msg ?. errorType ) {
48
59
reject ( msg ) ;
49
60
} else {
50
61
resolve ( msg ) ;
51
62
}
63
+
64
+ if ( worker . toKill ) {
65
+ worker . toKill = false ;
66
+ void worker . terminate ( ) ;
67
+ }
52
68
} ) ;
53
69
worker . on ( 'error' , ( err ) => {
54
70
Logger . error (
@@ -58,6 +74,7 @@ async function runInWorker(input: {
58
74
reject ( err ) ;
59
75
} ) ;
60
76
77
+ worker . used = true ;
61
78
worker . postMessage ( {
62
79
env : input . fuctionRequest . env ,
63
80
event : input . fuctionRequest . event ,
@@ -118,6 +135,7 @@ function startWorker(input: WorkerRequest) {
118
135
) ;
119
136
workers . delete ( input . workerId ) ;
120
137
} ) ;
138
+
121
139
workers . set ( input . workerId , worker ) ;
122
140
123
141
return worker ;
@@ -130,7 +148,18 @@ async function stopAllWorkers() {
130
148
Logger . verbose ( 'Stopping all workers' ) ;
131
149
const promises : Promise < any > [ ] = [ ] ;
132
150
for ( const worker of workers . values ( ) ) {
133
- promises . push ( worker . terminate ( ) ) ;
151
+ if ( worker . used ) {
152
+ worker . toKill = true ;
153
+ // set timout for 5 minutes and kill the worker if it is still running
154
+ setTimeout ( ( ) => {
155
+ if ( worker . toKill ) {
156
+ worker . toKill = false ;
157
+ void worker . terminate ( ) ;
158
+ }
159
+ } , 300000 ) ;
160
+ } else {
161
+ promises . push ( worker . terminate ( ) ) ;
162
+ }
134
163
}
135
164
workers . clear ( ) ;
136
165
await Promise . all ( promises ) ;
0 commit comments