deno_runtime/ops/
web_worker.rs

1// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
2
3mod sync_fetch;
4
5use crate::web_worker::WebWorkerInternalHandle;
6use crate::web_worker::WebWorkerType;
7use deno_core::op2;
8use deno_core::CancelFuture;
9use deno_core::OpState;
10use deno_web::JsMessageData;
11use deno_web::MessagePortError;
12use std::cell::RefCell;
13use std::rc::Rc;
14
15use self::sync_fetch::op_worker_sync_fetch;
16pub use sync_fetch::SyncFetchError;
17
18deno_core::extension!(
19  deno_web_worker,
20  ops = [
21    op_worker_post_message,
22    op_worker_recv_message,
23    // Notify host that guest worker closes.
24    op_worker_close,
25    op_worker_get_type,
26    op_worker_sync_fetch,
27  ],
28);
29
30#[op2]
31fn op_worker_post_message(
32  state: &mut OpState,
33  #[serde] data: JsMessageData,
34) -> Result<(), MessagePortError> {
35  let handle = state.borrow::<WebWorkerInternalHandle>().clone();
36  handle.port.send(state, data)
37}
38
39#[op2(async(lazy), fast)]
40#[serde]
41async fn op_worker_recv_message(
42  state: Rc<RefCell<OpState>>,
43) -> Result<Option<JsMessageData>, MessagePortError> {
44  let handle = {
45    let state = state.borrow();
46    state.borrow::<WebWorkerInternalHandle>().clone()
47  };
48  handle
49    .port
50    .recv(state.clone())
51    .or_cancel(handle.cancel)
52    .await?
53}
54
55#[op2(fast)]
56fn op_worker_close(state: &mut OpState) {
57  // Notify parent that we're finished
58  let mut handle = state.borrow_mut::<WebWorkerInternalHandle>().clone();
59
60  handle.terminate();
61}
62
63#[op2]
64#[serde]
65fn op_worker_get_type(state: &mut OpState) -> WebWorkerType {
66  let handle = state.borrow::<WebWorkerInternalHandle>().clone();
67  handle.worker_type
68}