summaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2022-08-16 21:00:35 -0400
committerGitHub <noreply@github.com>2022-08-16 21:00:35 -0400
commit868c7e38bfc9a09b5cfeae30ea5a2345a6d700d7 (patch)
tree555d1b5cb080aaddfdb8b70c0779086d243a984c /runtime
parent0b70c81f97a730fda353b6d06e589c3a2a558676 (diff)
feat(runtime): add pre_execute_module_cb (#15485)
Diffstat (limited to 'runtime')
-rw-r--r--runtime/examples/hello_runtime.rs5
-rw-r--r--runtime/ops/worker_host.rs24
-rw-r--r--runtime/web_worker.rs19
-rw-r--r--runtime/worker.rs5
4 files changed, 39 insertions, 14 deletions
diff --git a/runtime/examples/hello_runtime.rs b/runtime/examples/hello_runtime.rs
index 07e42f0ff..2853c1120 100644
--- a/runtime/examples/hello_runtime.rs
+++ b/runtime/examples/hello_runtime.rs
@@ -22,7 +22,7 @@ async fn main() -> Result<(), AnyError> {
let create_web_worker_cb = Arc::new(|_| {
todo!("Web workers are not supported in the example");
});
- let web_worker_preload_module_cb = Arc::new(|_| {
+ let web_worker_event_cb = Arc::new(|_| {
todo!("Web workers are not supported in the example");
});
@@ -46,7 +46,8 @@ async fn main() -> Result<(), AnyError> {
seed: None,
source_map_getter: None,
format_js_error_fn: None,
- web_worker_preload_module_cb,
+ web_worker_preload_module_cb: web_worker_event_cb.clone(),
+ web_worker_pre_execute_module_cb: web_worker_event_cb,
create_web_worker_cb,
maybe_inspector_server: None,
should_break_on_first_statement: false,
diff --git a/runtime/ops/worker_host.rs b/runtime/ops/worker_host.rs
index b61fca460..2f07e48b2 100644
--- a/runtime/ops/worker_host.rs
+++ b/runtime/ops/worker_host.rs
@@ -42,7 +42,7 @@ pub type CreateWebWorkerCb = dyn Fn(CreateWebWorkerArgs) -> (WebWorker, Sendable
+ Sync
+ Send;
-pub type PreloadModuleCb = dyn Fn(WebWorker) -> LocalFutureObj<'static, Result<WebWorker, AnyError>>
+pub type WorkerEventCb = dyn Fn(WebWorker) -> LocalFutureObj<'static, Result<WebWorker, AnyError>>
+ Sync
+ Send;
@@ -51,17 +51,16 @@ pub type PreloadModuleCb = dyn Fn(WebWorker) -> LocalFutureObj<'static, Result<W
/// because `GothamState` used in `OpState` overrides
/// value if type aliases have the same underlying type
#[derive(Clone)]
-pub struct CreateWebWorkerCbHolder(Arc<CreateWebWorkerCb>);
+struct CreateWebWorkerCbHolder(Arc<CreateWebWorkerCb>);
#[derive(Clone)]
-pub struct FormatJsErrorFnHolder(Option<Arc<FormatJsErrorFn>>);
+struct FormatJsErrorFnHolder(Option<Arc<FormatJsErrorFn>>);
+
+#[derive(Clone)]
+struct PreloadModuleCbHolder(Arc<WorkerEventCb>);
-/// A holder for callback that can used to preload some modules into a WebWorker
-/// before actual worker code is executed. It's a struct instead of a type
-/// because `GothamState` used in `OpState` overrides
-/// value if type aliases have the same underlying type
#[derive(Clone)]
-pub struct PreloadModuleCbHolder(Arc<PreloadModuleCb>);
+struct PreExecuteModuleCbHolder(Arc<WorkerEventCb>);
pub struct WorkerThread {
worker_handle: WebWorkerHandle,
@@ -92,7 +91,8 @@ pub type WorkersTable = HashMap<WorkerId, WorkerThread>;
pub fn init(
create_web_worker_cb: Arc<CreateWebWorkerCb>,
- preload_module_cb: Arc<PreloadModuleCb>,
+ preload_module_cb: Arc<WorkerEventCb>,
+ pre_execute_module_cb: Arc<WorkerEventCb>,
format_js_error_fn: Option<Arc<FormatJsErrorFn>>,
) -> Extension {
Extension::builder()
@@ -106,6 +106,9 @@ pub fn init(
let preload_module_cb_holder =
PreloadModuleCbHolder(preload_module_cb.clone());
state.put::<PreloadModuleCbHolder>(preload_module_cb_holder);
+ let pre_execute_module_cb_holder =
+ PreExecuteModuleCbHolder(pre_execute_module_cb.clone());
+ state.put::<PreExecuteModuleCbHolder>(pre_execute_module_cb_holder);
let format_js_error_fn_holder =
FormatJsErrorFnHolder(format_js_error_fn.clone());
state.put::<FormatJsErrorFnHolder>(format_js_error_fn_holder);
@@ -174,6 +177,8 @@ fn op_create_worker(
state.put::<CreateWebWorkerCbHolder>(create_web_worker_cb.clone());
let preload_module_cb = state.take::<PreloadModuleCbHolder>();
state.put::<PreloadModuleCbHolder>(preload_module_cb.clone());
+ let pre_execute_module_cb = state.take::<PreExecuteModuleCbHolder>();
+ state.put::<PreExecuteModuleCbHolder>(pre_execute_module_cb.clone());
let format_js_error_fn = state.take::<FormatJsErrorFnHolder>();
state.put::<FormatJsErrorFnHolder>(format_js_error_fn.clone());
state.put::<WorkerId>(worker_id.next().unwrap());
@@ -219,6 +224,7 @@ fn op_create_worker(
module_specifier,
maybe_source_code,
preload_module_cb.0,
+ pre_execute_module_cb.0,
format_js_error_fn.0,
)
})?;
diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs
index 064195cd8..a4a2516a9 100644
--- a/runtime/web_worker.rs
+++ b/runtime/web_worker.rs
@@ -324,7 +324,8 @@ pub struct WebWorkerOptions {
pub seed: Option<u64>,
pub module_loader: Rc<dyn ModuleLoader>,
pub create_web_worker_cb: Arc<ops::worker_host::CreateWebWorkerCb>,
- pub preload_module_cb: Arc<ops::worker_host::PreloadModuleCb>,
+ pub preload_module_cb: Arc<ops::worker_host::WorkerEventCb>,
+ pub pre_execute_module_cb: Arc<ops::worker_host::WorkerEventCb>,
pub format_js_error_fn: Option<Arc<FormatJsErrorFn>>,
pub source_map_getter: Option<Box<dyn SourceMapGetter>>,
pub worker_type: WebWorkerType,
@@ -406,6 +407,7 @@ impl WebWorker {
ops::worker_host::init(
options.create_web_worker_cb.clone(),
options.preload_module_cb.clone(),
+ options.pre_execute_module_cb.clone(),
options.format_js_error_fn.clone(),
),
// Extensions providing Deno.* features
@@ -669,7 +671,8 @@ pub fn run_web_worker(
worker: WebWorker,
specifier: ModuleSpecifier,
maybe_source_code: Option<String>,
- preload_module_cb: Arc<ops::worker_host::PreloadModuleCb>,
+ preload_module_cb: Arc<ops::worker_host::WorkerEventCb>,
+ pre_execute_module_cb: Arc<ops::worker_host::WorkerEventCb>,
format_js_error_fn: Option<Arc<FormatJsErrorFn>>,
) -> Result<(), AnyError> {
let name = worker.name.to_string();
@@ -704,6 +707,18 @@ pub fn run_web_worker(
// script instead of module
match worker.preload_main_module(&specifier).await {
Ok(id) => {
+ worker = match (pre_execute_module_cb)(worker).await {
+ Ok(worker) => worker,
+ Err(e) => {
+ print_worker_error(&e, &name, format_js_error_fn.as_deref());
+ internal_handle
+ .post_event(WorkerControlEvent::TerminalError(e))
+ .expect("Failed to post message to host");
+
+ // Failure to execute script is a terminal error, bye, bye.
+ return Ok(());
+ }
+ };
worker.start_polling_for_messages();
worker.execute_main_module(id).await
}
diff --git a/runtime/worker.rs b/runtime/worker.rs
index e8cddd5c9..0336e8340 100644
--- a/runtime/worker.rs
+++ b/runtime/worker.rs
@@ -69,7 +69,8 @@ pub struct WorkerOptions {
pub module_loader: Rc<dyn ModuleLoader>,
// Callbacks invoked when creating new instance of WebWorker
pub create_web_worker_cb: Arc<ops::worker_host::CreateWebWorkerCb>,
- pub web_worker_preload_module_cb: Arc<ops::worker_host::PreloadModuleCb>,
+ pub web_worker_preload_module_cb: Arc<ops::worker_host::WorkerEventCb>,
+ pub web_worker_pre_execute_module_cb: Arc<ops::worker_host::WorkerEventCb>,
pub format_js_error_fn: Option<Arc<FormatJsErrorFn>>,
pub source_map_getter: Option<Box<dyn SourceMapGetter>>,
pub maybe_inspector_server: Option<Arc<InspectorServer>>,
@@ -148,6 +149,7 @@ impl MainWorker {
ops::worker_host::init(
options.create_web_worker_cb.clone(),
options.web_worker_preload_module_cb.clone(),
+ options.web_worker_pre_execute_module_cb.clone(),
options.format_js_error_fn.clone(),
),
ops::spawn::init(),
@@ -420,6 +422,7 @@ mod tests {
format_js_error_fn: None,
source_map_getter: None,
web_worker_preload_module_cb: Arc::new(|_| unreachable!()),
+ web_worker_pre_execute_module_cb: Arc::new(|_| unreachable!()),
create_web_worker_cb: Arc::new(|_| unreachable!()),
maybe_inspector_server: None,
should_break_on_first_statement: false,