Skip to content

Commit

Permalink
feat(runtime/ops): strongly typed deserialization of JSON ops (denola…
Browse files Browse the repository at this point in the history
  • Loading branch information
crowlKats authored Feb 18, 2021
1 parent 2225e83 commit 666c4b7
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 17 deletions.
23 changes: 15 additions & 8 deletions runtime/ops/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ use crate::metrics::metrics_op;
use deno_core::error::AnyError;
use deno_core::json_op_async;
use deno_core::json_op_sync;
use deno_core::serde_json::Value;
use deno_core::serde::de::DeserializeOwned;
use deno_core::serde::Serialize;
use deno_core::BufVec;
use deno_core::JsRuntime;
use deno_core::OpState;
Expand All @@ -37,18 +38,24 @@ use std::cell::RefCell;
use std::future::Future;
use std::rc::Rc;

pub fn reg_json_async<F, R>(rt: &mut JsRuntime, name: &'static str, op_fn: F)
where
F: Fn(Rc<RefCell<OpState>>, Value, BufVec) -> R + 'static,
R: Future<Output = Result<Value, AnyError>> + 'static,
pub fn reg_json_async<F, V, R, RV>(
rt: &mut JsRuntime,
name: &'static str,
op_fn: F,
) where
F: Fn(Rc<RefCell<OpState>>, V, BufVec) -> R + 'static,
V: DeserializeOwned,
R: Future<Output = Result<RV, AnyError>> + 'static,
RV: Serialize,
{
rt.register_op(name, metrics_op(json_op_async(op_fn)));
}

pub fn reg_json_sync<F>(rt: &mut JsRuntime, name: &'static str, op_fn: F)
pub fn reg_json_sync<F, V, R>(rt: &mut JsRuntime, name: &'static str, op_fn: F)
where
F: Fn(&mut OpState, Value, &mut [ZeroCopyBuf]) -> Result<Value, AnyError>
+ 'static,
F: Fn(&mut OpState, V, &mut [ZeroCopyBuf]) -> Result<R, AnyError> + 'static,
V: DeserializeOwned,
R: Serialize,
{
rt.register_op(name, metrics_op(json_op_sync(op_fn)));
}
Expand Down
22 changes: 13 additions & 9 deletions runtime/ops/web_worker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use crate::web_worker::WebWorkerHandle;
use crate::web_worker::WorkerEvent;
use deno_core::futures::channel::mpsc;
use deno_core::serde_json::json;
use deno_core::serde_json::{json, Value};

pub fn init(
rt: &mut deno_core::JsRuntime,
Expand All @@ -15,7 +15,7 @@ pub fn init(
super::reg_json_sync(
rt,
"op_worker_post_message",
move |_state, _args, bufs| {
move |_state, _args: Value, bufs| {
assert_eq!(bufs.len(), 1, "Invalid number of arguments");
let msg_buf: Box<[u8]> = (*bufs[0]).into();
sender_
Expand All @@ -27,11 +27,15 @@ pub fn init(
);

// Notify host that guest worker closes.
super::reg_json_sync(rt, "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!({}))
});
super::reg_json_sync(
rt,
"op_worker_close",
move |_state, _args: Value, _bufs| {
// Notify parent that we're finished
sender.clone().close_channel();
// Terminate execution of current worker
handle.terminate();
Ok(json!({}))
},
);
}

0 comments on commit 666c4b7

Please sign in to comment.