diff options
Diffstat (limited to 'cli/ops/web_worker.rs')
-rw-r--r-- | cli/ops/web_worker.rs | 119 |
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!({})) + }); } |