deno_runtime/ops/
web_worker.rs1mod 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 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 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}