summaryrefslogtreecommitdiff
path: root/runtime/web_worker.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/web_worker.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/web_worker.rs')
-rw-r--r--runtime/web_worker.rs26
1 files changed, 22 insertions, 4 deletions
diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs
index 55749ca27..27fe633ad 100644
--- a/runtime/web_worker.rs
+++ b/runtime/web_worker.rs
@@ -27,6 +27,7 @@ use deno_core::serde_json::json;
use deno_core::v8;
use deno_core::CancelHandle;
use deno_core::CompiledWasmModuleStore;
+use deno_core::DetachedBuffer;
use deno_core::Extension;
use deno_core::FeatureChecker;
use deno_core::GetErrorClassFn;
@@ -47,9 +48,11 @@ use deno_kv::dynamic::MultiBackendDbHandler;
use deno_terminal::colors;
use deno_tls::RootCertStoreProvider;
use deno_web::create_entangled_message_port;
+use deno_web::serialize_transferables;
use deno_web::BlobStore;
use deno_web::JsMessageData;
use deno_web::MessagePort;
+use deno_web::Transferable;
use log::debug;
use std::cell::RefCell;
use std::fmt;
@@ -61,6 +64,11 @@ use std::sync::Arc;
use std::task::Context;
use std::task::Poll;
+pub struct WorkerMetadata {
+ pub buffer: DetachedBuffer,
+ pub transferables: Vec<Transferable>,
+}
+
static WORKER_ID_COUNTER: AtomicU32 = AtomicU32::new(1);
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
@@ -343,7 +351,7 @@ pub struct WebWorker {
has_message_event_listener_fn: Option<v8::Global<v8::Value>>,
bootstrap_fn_global: Option<v8::Global<v8::Function>>,
// Consumed when `bootstrap_fn` is called
- maybe_worker_metadata: Option<JsMessageData>,
+ maybe_worker_metadata: Option<WorkerMetadata>,
}
pub struct WebWorkerOptions {
@@ -371,7 +379,7 @@ pub struct WebWorkerOptions {
pub feature_checker: Arc<FeatureChecker>,
pub strace_ops: Option<Vec<String>>,
pub close_on_idle: bool,
- pub maybe_worker_metadata: Option<JsMessageData>,
+ pub maybe_worker_metadata: Option<WorkerMetadata>,
}
impl WebWorker {
@@ -622,7 +630,8 @@ impl WebWorker {
}
pub fn bootstrap(&mut self, options: &BootstrapOptions) {
- self.js_runtime.op_state().borrow_mut().put(options.clone());
+ let op_state = self.js_runtime.op_state();
+ op_state.borrow_mut().put(options.clone());
// Instead of using name for log we use `worker-${id}` because
// WebWorkers can have empty string as name.
{
@@ -633,7 +642,16 @@ impl WebWorker {
let undefined = v8::undefined(scope);
let mut worker_data: v8::Local<v8::Value> = v8::undefined(scope).into();
if let Some(data) = self.maybe_worker_metadata.take() {
- worker_data = deno_core::serde_v8::to_v8(scope, data).unwrap();
+ let js_transferables = serialize_transferables(
+ &mut op_state.borrow_mut(),
+ data.transferables,
+ );
+ let js_message_data = JsMessageData {
+ data: data.buffer,
+ transferables: js_transferables,
+ };
+ worker_data =
+ deno_core::serde_v8::to_v8(scope, js_message_data).unwrap();
}
let name_str: v8::Local<v8::Value> =
v8::String::new(scope, &self.name).unwrap().into();