summaryrefslogtreecommitdiff
path: root/runtime/ops/worker_host.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2024-03-16 00:59:18 +0000
committerGitHub <noreply@github.com>2024-03-16 01:59:18 +0100
commit92576fdcfd3e32dce63b533ab20d4974136b097d (patch)
tree6f3b61c4d1d10569e4bb54f8ee59fb5f1ff274da /runtime/ops/worker_host.rs
parentebbc897b69f906d88a99768a2fff7661e2894670 (diff)
fix(ext/node): support MessagePort in `WorkerOptions.workerData` (#22950)
This commit fixes passing `MessagePort` instances to `WorkerOptions.workerData`. Before they were not serialized and deserialized properly when spawning a worker thread. Closes https://github.com/denoland/deno/issues/22935
Diffstat (limited to 'runtime/ops/worker_host.rs')
-rw-r--r--runtime/ops/worker_host.rs15
1 files changed, 13 insertions, 2 deletions
diff --git a/runtime/ops/worker_host.rs b/runtime/ops/worker_host.rs
index 242d3bcda..e3360b830 100644
--- a/runtime/ops/worker_host.rs
+++ b/runtime/ops/worker_host.rs
@@ -11,6 +11,7 @@ use crate::web_worker::WebWorkerHandle;
use crate::web_worker::WebWorkerType;
use crate::web_worker::WorkerControlEvent;
use crate::web_worker::WorkerId;
+use crate::web_worker::WorkerMetadata;
use crate::worker::FormatJsErrorFn;
use deno_core::error::AnyError;
use deno_core::op2;
@@ -19,6 +20,7 @@ use deno_core::CancelFuture;
use deno_core::CancelHandle;
use deno_core::ModuleSpecifier;
use deno_core::OpState;
+use deno_web::deserialize_js_transferables;
use deno_web::JsMessageData;
use log::debug;
use std::cell::RefCell;
@@ -36,7 +38,7 @@ pub struct CreateWebWorkerArgs {
pub main_module: ModuleSpecifier,
pub worker_type: WebWorkerType,
pub close_on_idle: bool,
- pub maybe_worker_metadata: Option<JsMessageData>,
+ pub maybe_worker_metadata: Option<WorkerMetadata>,
}
pub type CreateWebWorkerCb = dyn Fn(CreateWebWorkerArgs) -> (WebWorker, SendableWebWorkerHandle)
@@ -175,7 +177,16 @@ fn op_create_worker(
// Setup new thread
let thread_builder = std::thread::Builder::new().name(format!("{worker_id}"));
-
+ let maybe_worker_metadata = if let Some(data) = maybe_worker_metadata {
+ let transferables =
+ deserialize_js_transferables(state, data.transferables)?;
+ Some(WorkerMetadata {
+ buffer: data.data,
+ transferables,
+ })
+ } else {
+ None
+ };
// Spawn it
thread_builder.spawn(move || {
// Any error inside this block is terminal: