summaryrefslogtreecommitdiff
path: root/cli/ops/web_worker.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/ops/web_worker.rs')
-rw-r--r--cli/ops/web_worker.rs119
1 files changed, 23 insertions, 96 deletions
diff --git a/cli/ops/web_worker.rs b/cli/ops/web_worker.rs
index 023a4708c..9d8140d7b 100644
--- a/cli/ops/web_worker.rs
+++ b/cli/ops/web_worker.rs
@@ -1,112 +1,39 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
-use super::dispatch_json::{JsonOp, Value};
-use crate::ops::json_op;
+
use crate::state::State;
use crate::web_worker::WebWorkerHandle;
use crate::worker::WorkerEvent;
-use deno_core::CoreIsolate;
-use deno_core::CoreIsolateState;
-use deno_core::ErrBox;
-use deno_core::ZeroCopyBuf;
+use deno_core::OpRegistry;
use futures::channel::mpsc;
-use std::convert::From;
use std::rc::Rc;
-pub fn web_worker_op<D>(
- sender: mpsc::Sender<WorkerEvent>,
- dispatcher: D,
-) -> impl Fn(
- &mut CoreIsolateState,
- Value,
- &mut [ZeroCopyBuf],
-) -> Result<JsonOp, ErrBox>
-where
- D: Fn(
- &mpsc::Sender<WorkerEvent>,
- Value,
- &mut [ZeroCopyBuf],
- ) -> Result<JsonOp, ErrBox>,
-{
- move |_isolate_state: &mut CoreIsolateState,
- args: Value,
- zero_copy: &mut [ZeroCopyBuf]|
- -> Result<JsonOp, ErrBox> { dispatcher(&sender, args, zero_copy) }
-}
-
-pub fn web_worker_op2<D>(
- handle: WebWorkerHandle,
- sender: mpsc::Sender<WorkerEvent>,
- dispatcher: D,
-) -> impl Fn(
- &mut CoreIsolateState,
- Value,
- &mut [ZeroCopyBuf],
-) -> Result<JsonOp, ErrBox>
-where
- D: Fn(
- WebWorkerHandle,
- &mpsc::Sender<WorkerEvent>,
- Value,
- &mut [ZeroCopyBuf],
- ) -> Result<JsonOp, ErrBox>,
-{
- move |_isolate_state: &mut CoreIsolateState,
- args: Value,
- zero_copy: &mut [ZeroCopyBuf]|
- -> Result<JsonOp, ErrBox> {
- dispatcher(handle.clone(), &sender, args, zero_copy)
- }
-}
-
pub fn init(
- i: &mut CoreIsolate,
s: &Rc<State>,
sender: &mpsc::Sender<WorkerEvent>,
handle: WebWorkerHandle,
) {
- i.register_op(
+ // Post message to host as guest worker.
+ let sender_ = sender.clone();
+ s.register_op_json_sync(
"op_worker_post_message",
- s.core_op(json_op(web_worker_op(
- sender.clone(),
- op_worker_post_message,
- ))),
- );
- i.register_op(
- "op_worker_close",
- s.core_op(json_op(web_worker_op2(
- handle,
- sender.clone(),
- op_worker_close,
- ))),
+ move |_state, _args, bufs| {
+ assert_eq!(bufs.len(), 1, "Invalid number of arguments");
+ let msg_buf: Box<[u8]> = (*bufs[0]).into();
+ sender_
+ .clone()
+ .try_send(WorkerEvent::Message(msg_buf))
+ .expect("Failed to post message to host");
+ Ok(json!({}))
+ },
);
-}
-
-/// Post message to host as guest worker
-fn op_worker_post_message(
- sender: &mpsc::Sender<WorkerEvent>,
- _args: Value,
- data: &mut [ZeroCopyBuf],
-) -> Result<JsonOp, ErrBox> {
- assert_eq!(data.len(), 1, "Invalid number of arguments");
- let d = Vec::from(&*data[0]).into_boxed_slice();
- let mut sender = sender.clone();
- sender
- .try_send(WorkerEvent::Message(d))
- .expect("Failed to post message to host");
- Ok(JsonOp::Sync(json!({})))
-}
-/// Notify host that guest worker closes
-fn op_worker_close(
- handle: WebWorkerHandle,
- sender: &mpsc::Sender<WorkerEvent>,
- _args: Value,
- _data: &mut [ZeroCopyBuf],
-) -> Result<JsonOp, ErrBox> {
- let mut sender = sender.clone();
- // Notify parent that we're finished
- sender.close_channel();
- // Terminate execution of current worker
- handle.terminate();
- Ok(JsonOp::Sync(json!({})))
+ // Notify host that guest worker closes.
+ let sender_ = sender.clone();
+ s.register_op_json_sync("op_worker_close", move |_state, _args, _bufs| {
+ // Notify parent that we're finished
+ sender_.clone().close_channel();
+ // Terminate execution of current worker
+ handle.terminate();
+ Ok(json!({}))
+ });
}