Skip to content

Commit 5b8e3a2

Browse files
authored
fix: make it possible to capture worker events optionally in eszip migration test (#580)
* fix: make it possible to capture worker events optionally in eszip migration test * stamp: polishing
1 parent ae9b6e3 commit 5b8e3a2

File tree

3 files changed

+69
-28
lines changed

3 files changed

+69
-28
lines changed

crates/base/tests/eszip_migration.rs

Lines changed: 66 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::fs::read_dir;
22
use std::path::Path;
33
use std::path::PathBuf;
44

5+
use anyhow::anyhow;
56
use anyhow::bail;
67
use base::worker::TerminationToken;
78
use base::worker::WorkerSurfaceBuilder;
@@ -15,6 +16,8 @@ use deno_facade::payload_to_eszip;
1516
use deno_facade::EszipPayloadKind;
1617
use eszip::v2::EszipV2Module;
1718
use eszip::v2::EszipV2SourceSlot;
19+
use ext_event_worker::events::WorkerEventWithMetadata;
20+
use ext_event_worker::events::WorkerEvents;
1821
use ext_workers::context::UserWorkerMsgs;
1922
use ext_workers::context::UserWorkerRuntimeOpts;
2023
use ext_workers::context::WorkerContextInitOpts;
@@ -77,8 +80,26 @@ where
7780
{
7881
let buf = read(path.as_ref()).await?;
7982
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+
};
80101
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?;
82103
let termination_token = TerminationToken::new();
83104
let (pool_msg_tx, mut pool_msg_rx) = mpsc::unbounded_channel();
84105
let worker_surface = WorkerSurfaceBuilder::new()
@@ -94,7 +115,7 @@ where
94115
service_path: Some(String::from("meow")),
95116
key: Some(Uuid::new_v4()),
96117
pool_msg_tx: Some(pool_msg_tx),
97-
events_msg_tx: None,
118+
events_msg_tx: tx,
98119
cancel: None,
99120
context: json!({
100121
"importMapPath": maybe_import_map_path
@@ -127,35 +148,36 @@ where
127148
});
128149

129150
termination_token.cancel_and_wait().await;
130-
worker_surface.map(|_| ())
131-
}
151+
worker_surface.map(|_| ())?;
132152

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+
_ => {}
148166
}
167+
}
168+
}
149169

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+
);
159181
let mut eszip = migrate::try_migrate_if_needed(
160182
payload_to_eszip(EszipPayloadKind::VecKind(buf)).await?,
161183
None,
@@ -285,3 +307,19 @@ fn get_testdata_paths() -> Result<Vec<PathBuf>, AnyError> {
285307
}
286308
Ok(paths)
287309
}
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+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"captureEventLoopError": true
3+
}

crates/base/tests/fixture/testdata/fdqdoblxppxtigtdfhbh_bd3072a8-13a2-4c8c-9e38-ebf55a6e7e9c_3.snapshot

Whitespace-only changes.

0 commit comments

Comments
 (0)