@@ -2,6 +2,7 @@ use std::fs::read_dir;
2
2
use std:: path:: Path ;
3
3
use std:: path:: PathBuf ;
4
4
5
+ use anyhow:: anyhow;
5
6
use anyhow:: bail;
6
7
use base:: worker:: TerminationToken ;
7
8
use base:: worker:: WorkerSurfaceBuilder ;
@@ -15,6 +16,8 @@ use deno_facade::payload_to_eszip;
15
16
use deno_facade:: EszipPayloadKind ;
16
17
use eszip:: v2:: EszipV2Module ;
17
18
use eszip:: v2:: EszipV2SourceSlot ;
19
+ use ext_event_worker:: events:: WorkerEventWithMetadata ;
20
+ use ext_event_worker:: events:: WorkerEvents ;
18
21
use ext_workers:: context:: UserWorkerMsgs ;
19
22
use ext_workers:: context:: UserWorkerRuntimeOpts ;
20
23
use ext_workers:: context:: WorkerContextInitOpts ;
77
80
{
78
81
let buf = read ( path. as_ref ( ) ) . await ?;
79
82
let eszip = EszipPayloadKind :: VecKind ( buf. clone ( ) ) ;
83
+ let metadata_path =
84
+ PathBuf :: from ( format ! ( "{}.metadata" , & path. as_ref( ) . to_string_lossy( ) ) ) ;
85
+ let metadata = if metadata_path. exists ( ) {
86
+ let buf = read ( metadata_path) . await ?;
87
+ Some ( serde_json:: from_slice :: < serde_json:: Value > ( & buf) ?)
88
+ } else {
89
+ None
90
+ }
91
+ . unwrap_or ( serde_json:: Value :: Object ( Default :: default ( ) ) ) ;
92
+ let capture_event_loop_error =
93
+ get_bool_from_json_value ( & metadata, "captureEventLoopError" )
94
+ . unwrap_or_default ( ) ;
95
+ let ( tx, rx) = if capture_event_loop_error {
96
+ let ( tx, rx) = mpsc:: unbounded_channel :: < WorkerEventWithMetadata > ( ) ;
97
+ ( Some ( tx) , Some ( rx) )
98
+ } else {
99
+ ( None , None )
100
+ } ;
80
101
let ( maybe_entrypoint, maybe_import_map_path) =
81
- guess_eszip_entrypoint_and_import_map_path ( path , buf) . await ?;
102
+ guess_eszip_entrypoint_and_import_map_path ( & metadata , buf) . await ?;
82
103
let termination_token = TerminationToken :: new ( ) ;
83
104
let ( pool_msg_tx, mut pool_msg_rx) = mpsc:: unbounded_channel ( ) ;
84
105
let worker_surface = WorkerSurfaceBuilder :: new ( )
94
115
service_path : Some ( String :: from ( "meow" ) ) ,
95
116
key : Some ( Uuid :: new_v4 ( ) ) ,
96
117
pool_msg_tx : Some ( pool_msg_tx) ,
97
- events_msg_tx : None ,
118
+ events_msg_tx : tx ,
98
119
cancel : None ,
99
120
context : json ! ( {
100
121
"importMapPath" : maybe_import_map_path
@@ -127,35 +148,36 @@ where
127
148
} ) ;
128
149
129
150
termination_token. cancel_and_wait ( ) . await ;
130
- worker_surface. map ( |_| ( ) )
131
- }
151
+ worker_surface. map ( |_| ( ) ) ?;
132
152
133
- async fn guess_eszip_entrypoint_and_import_map_path < P > (
134
- path : P ,
135
- buf : Vec < u8 > ,
136
- ) -> Result < ( Option < String > , Option < String > ) , AnyError >
137
- where
138
- P : AsRef < Path > ,
139
- {
140
- let metadata_path =
141
- PathBuf :: from ( format ! ( "{}.metadata" , & path. as_ref( ) . to_string_lossy( ) ) ) ;
142
- let ( metadata_entrypoint, metadata_import_map_path) =
143
- if metadata_path. exists ( ) {
144
- fn get_str ( value : & serde_json:: Value , key : & str ) -> Option < String > {
145
- value
146
- . get ( key)
147
- . and_then ( |it| it. as_str ( ) . map ( str:: to_string) )
153
+ if let Some ( mut rx) = rx {
154
+ rx. close ( ) ;
155
+ let mut msgs = vec ! [ ] ;
156
+ while let Some ( msg) = rx. recv ( ) . await {
157
+ msgs. push ( msg) ;
158
+ }
159
+ for msg in msgs {
160
+ match msg. event {
161
+ WorkerEvents :: BootFailure ( ev) => return Err ( anyhow ! ( ev. msg) ) ,
162
+ WorkerEvents :: UncaughtException ( ev) => {
163
+ return Err ( anyhow ! ( ev. exception) )
164
+ }
165
+ _ => { }
148
166
}
167
+ }
168
+ }
149
169
150
- let buf = read ( metadata_path) . await ?;
151
- let metadata = serde_json:: from_slice :: < serde_json:: Value > ( & buf) ?;
152
- (
153
- get_str ( & metadata, "entrypoint" ) ,
154
- get_str ( & metadata, "importMap" ) ,
155
- )
156
- } else {
157
- ( None , None )
158
- } ;
170
+ Ok ( ( ) )
171
+ }
172
+
173
+ async fn guess_eszip_entrypoint_and_import_map_path (
174
+ metadata : & serde_json:: Value ,
175
+ buf : Vec < u8 > ,
176
+ ) -> Result < ( Option < String > , Option < String > ) , AnyError > {
177
+ let ( metadata_entrypoint, metadata_import_map_path) = (
178
+ get_str_from_json_value ( metadata, "entrypoint" ) ,
179
+ get_str_from_json_value ( metadata, "importMap" ) ,
180
+ ) ;
159
181
let mut eszip = migrate:: try_migrate_if_needed (
160
182
payload_to_eszip ( EszipPayloadKind :: VecKind ( buf) ) . await ?,
161
183
None ,
@@ -285,3 +307,19 @@ fn get_testdata_paths() -> Result<Vec<PathBuf>, AnyError> {
285
307
}
286
308
Ok ( paths)
287
309
}
310
+
311
+ fn get_str_from_json_value (
312
+ value : & serde_json:: Value ,
313
+ key : & str ,
314
+ ) -> Option < String > {
315
+ value
316
+ . get ( key)
317
+ . and_then ( |it| it. as_str ( ) . map ( str:: to_string) )
318
+ }
319
+
320
+ fn get_bool_from_json_value (
321
+ value : & serde_json:: Value ,
322
+ key : & str ,
323
+ ) -> Option < bool > {
324
+ value. get ( key) . and_then ( |it| it. as_bool ( ) )
325
+ }
0 commit comments