@@ -88,6 +88,9 @@ const startRunningService = async (wasmURL: string | URL, wasmModule: WebAssembl
88
88
terminate : ( ) => void
89
89
}
90
90
91
+ let rejectAllWith : ( error : unknown ) => void
92
+ const rejectAllPromise = new Promise ( resolve => rejectAllWith = resolve )
93
+
91
94
if ( useWorker ) {
92
95
// Run esbuild off the main thread
93
96
let blob = new Blob ( [ `onmessage=${ WEB_WORKER_SOURCE_CODE } (postMessage)` ] , { type : 'text/javascript' } )
@@ -98,7 +101,13 @@ const startRunningService = async (wasmURL: string | URL, wasmModule: WebAssembl
98
101
let go : Go | undefined
99
102
worker = {
100
103
onmessage : null ,
101
- postMessage : data => setTimeout ( ( ) => go = onmessage ( { data } ) ) ,
104
+ postMessage : data => setTimeout ( ( ) => {
105
+ try {
106
+ go = onmessage ( { data } )
107
+ } catch ( error ) {
108
+ rejectAllWith ( error ) // Catch strange crashes (e.g. stack overflow)
109
+ }
110
+ } ) ,
102
111
terminate ( ) {
103
112
if ( go )
104
113
for ( let timeout of go . _scheduledTimeouts . values ( ) )
@@ -144,29 +153,34 @@ const startRunningService = async (wasmURL: string | URL, wasmModule: WebAssembl
144
153
145
154
longLivedService = {
146
155
build : ( options : types . BuildOptions ) =>
147
- new Promise < types . BuildResult > ( ( resolve , reject ) =>
156
+ new Promise < types . BuildResult > ( ( resolve , reject ) => {
157
+ rejectAllPromise . then ( reject )
148
158
service . buildOrContext ( {
149
159
callName : 'build' ,
150
160
refs : null ,
151
161
options,
152
162
isTTY : false ,
153
163
defaultWD : '/' ,
154
164
callback : ( err , res ) => err ? reject ( err ) : resolve ( res as types . BuildResult ) ,
155
- } ) ) ,
165
+ } )
166
+ } ) ,
156
167
157
168
context : ( options : types . BuildOptions ) =>
158
- new Promise < types . BuildContext > ( ( resolve , reject ) =>
169
+ new Promise < types . BuildContext > ( ( resolve , reject ) => {
170
+ rejectAllPromise . then ( reject )
159
171
service . buildOrContext ( {
160
172
callName : 'context' ,
161
173
refs : null ,
162
174
options,
163
175
isTTY : false ,
164
176
defaultWD : '/' ,
165
177
callback : ( err , res ) => err ? reject ( err ) : resolve ( res as types . BuildContext ) ,
166
- } ) ) ,
178
+ } )
179
+ } ) ,
167
180
168
181
transform : ( input : string | Uint8Array , options ?: types . TransformOptions ) =>
169
- new Promise < types . TransformResult > ( ( resolve , reject ) =>
182
+ new Promise < types . TransformResult > ( ( resolve , reject ) => {
183
+ rejectAllPromise . then ( reject )
170
184
service . transform ( {
171
185
callName : 'transform' ,
172
186
refs : null ,
@@ -178,27 +192,32 @@ const startRunningService = async (wasmURL: string | URL, wasmModule: WebAssembl
178
192
writeFile ( _ , callback ) { callback ( null ) ; } ,
179
193
} ,
180
194
callback : ( err , res ) => err ? reject ( err ) : resolve ( res ! ) ,
181
- } ) ) ,
195
+ } )
196
+ } ) ,
182
197
183
198
formatMessages : ( messages , options ) =>
184
- new Promise ( ( resolve , reject ) =>
199
+ new Promise ( ( resolve , reject ) => {
200
+ rejectAllPromise . then ( reject )
185
201
service . formatMessages ( {
186
202
callName : 'formatMessages' ,
187
203
refs : null ,
188
204
messages,
189
205
options,
190
206
callback : ( err , res ) => err ? reject ( err ) : resolve ( res ! ) ,
191
- } ) ) ,
207
+ } )
208
+ } ) ,
192
209
193
210
analyzeMetafile : ( metafile , options ) =>
194
- new Promise ( ( resolve , reject ) =>
211
+ new Promise ( ( resolve , reject ) => {
212
+ rejectAllPromise . then ( reject )
195
213
service . analyzeMetafile ( {
196
214
callName : 'analyzeMetafile' ,
197
215
refs : null ,
198
216
metafile : typeof metafile === 'string' ? metafile : JSON . stringify ( metafile ) ,
199
217
options,
200
218
callback : ( err , res ) => err ? reject ( err ) : resolve ( res ! ) ,
201
- } ) ) ,
219
+ } )
220
+ } ) ,
202
221
}
203
222
}
204
223
0 commit comments