summaryrefslogtreecommitdiff
path: root/runtime/ops
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/ops')
-rw-r--r--runtime/ops/worker_host.rs24
1 files changed, 15 insertions, 9 deletions
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,
)
})?;