Add init methods for each op module (#3087)

This commit is contained in:
Ryan Dahl 2019-10-11 11:41:54 -07:00 committed by GitHub
parent 04ed8d0531
commit 97d8498d46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 292 additions and 361 deletions

View File

@ -2,9 +2,22 @@
use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::futures::future::join_all;
use crate::futures::Future;
use crate::ops::json_op;
use crate::state::ThreadSafeState;
use deno::*;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op("cache", s.core_op(json_op(s.stateful_op(op_cache))));
i.register_op(
"fetch_source_files",
s.core_op(json_op(s.stateful_op(op_fetch_source_files))),
);
i.register_op(
"fetch_asset",
s.core_op(json_op(s.stateful_op(op_fetch_asset))),
);
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct CacheArgs {
@ -13,7 +26,7 @@ struct CacheArgs {
extension: String,
}
pub fn op_cache(
fn op_cache(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -38,7 +51,7 @@ struct FetchSourceFilesArgs {
referrer: String,
}
pub fn op_fetch_source_files(
fn op_fetch_source_files(
state: &ThreadSafeState,
args: Value,
_data: Option<PinnedBuf>,
@ -85,7 +98,7 @@ struct FetchAssetArgs {
name: String,
}
pub fn op_fetch_asset(
fn op_fetch_asset(
_state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,

View File

@ -1,18 +1,30 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::fmt_errors::JSError;
use crate::ops::json_op;
use crate::source_maps::get_orig_position;
use crate::source_maps::CachedMaps;
use crate::state::ThreadSafeState;
use deno::*;
use std::collections::HashMap;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op(
"apply_source_map",
s.core_op(json_op(s.stateful_op(op_apply_source_map))),
);
i.register_op(
"format_error",
s.core_op(json_op(s.stateful_op(op_format_error))),
);
}
#[derive(Deserialize)]
struct FormatErrorArgs {
error: String,
}
pub fn op_format_error(
fn op_format_error(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -32,7 +44,7 @@ struct ApplySourceMap {
column: i32,
}
pub fn op_apply_source_map(
fn op_apply_source_map(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,

View File

@ -1,6 +1,7 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::http_util::get_client;
use crate::ops::json_op;
use crate::resources;
use crate::state::ThreadSafeState;
use deno::*;
@ -12,6 +13,10 @@ use hyper::rt::Future;
use std;
use std::convert::From;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op("fetch", s.core_op(json_op(s.stateful_op(op_fetch))));
}
#[derive(Deserialize)]
struct FetchArgs {
method: Option<String>,

View File

@ -1,6 +1,7 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::fs as deno_fs;
use crate::ops::json_op;
use crate::resources;
use crate::state::ThreadSafeState;
use deno::*;
@ -9,6 +10,12 @@ use std;
use std::convert::From;
use tokio;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op("open", s.core_op(json_op(s.stateful_op(op_open))));
i.register_op("close", s.core_op(json_op(s.stateful_op(op_close))));
i.register_op("seek", s.core_op(json_op(s.stateful_op(op_seek))));
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct OpenArgs {
@ -17,7 +24,7 @@ struct OpenArgs {
mode: String,
}
pub fn op_open(
fn op_open(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -96,7 +103,7 @@ struct CloseArgs {
rid: i32,
}
pub fn op_close(
fn op_close(
_state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -117,7 +124,7 @@ struct SeekArgs {
whence: i32,
}
pub fn op_seek(
fn op_seek(
_state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,

View File

@ -1,10 +1,10 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
// Some deserializer fields are only used on Unix and Windows build fails without it
#![allow(dead_code)]
use super::dispatch_json::{blocking_json, Deserialize, JsonOp, Value};
use crate::deno_error::DenoError;
use crate::deno_error::ErrorKind;
use crate::fs as deno_fs;
use crate::ops::json_op;
use crate::state::ThreadSafeState;
use deno::*;
use remove_dir_all::remove_dir_all;
@ -16,12 +16,34 @@ use std::time::UNIX_EPOCH;
#[cfg(unix)]
use std::os::unix::fs::PermissionsExt;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op("chdir", s.core_op(json_op(s.stateful_op(op_chdir))));
i.register_op("mkdir", s.core_op(json_op(s.stateful_op(op_mkdir))));
i.register_op("chmod", s.core_op(json_op(s.stateful_op(op_chmod))));
i.register_op("chown", s.core_op(json_op(s.stateful_op(op_chown))));
i.register_op("remove", s.core_op(json_op(s.stateful_op(op_remove))));
i.register_op("copy_file", s.core_op(json_op(s.stateful_op(op_copy_file))));
i.register_op("stat", s.core_op(json_op(s.stateful_op(op_stat))));
i.register_op("read_dir", s.core_op(json_op(s.stateful_op(op_read_dir))));
i.register_op("rename", s.core_op(json_op(s.stateful_op(op_rename))));
i.register_op("link", s.core_op(json_op(s.stateful_op(op_link))));
i.register_op("symlink", s.core_op(json_op(s.stateful_op(op_symlink))));
i.register_op("read_link", s.core_op(json_op(s.stateful_op(op_read_link))));
i.register_op("truncate", s.core_op(json_op(s.stateful_op(op_truncate))));
i.register_op(
"make_temp_dir",
s.core_op(json_op(s.stateful_op(op_make_temp_dir))),
);
i.register_op("cwd", s.core_op(json_op(s.stateful_op(op_cwd))));
i.register_op("utime", s.core_op(json_op(s.stateful_op(op_utime))));
}
#[derive(Deserialize)]
struct ChdirArgs {
directory: String,
}
pub fn op_chdir(
fn op_chdir(
_state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -40,7 +62,7 @@ struct MkdirArgs {
mode: u32,
}
pub fn op_mkdir(
fn op_mkdir(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -66,7 +88,7 @@ struct ChmodArgs {
mode: u32,
}
pub fn op_chmod(
fn op_chmod(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -100,7 +122,7 @@ struct ChownArgs {
gid: u32,
}
pub fn op_chown(
fn op_chown(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -127,7 +149,7 @@ struct RemoveArgs {
recursive: bool,
}
pub fn op_remove(
fn op_remove(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -161,7 +183,7 @@ struct CopyFileArgs {
to: String,
}
pub fn op_copy_file(
fn op_copy_file(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -220,7 +242,7 @@ struct StatArgs {
lstat: bool,
}
pub fn op_stat(
fn op_stat(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -262,7 +284,7 @@ struct ReadDirArgs {
path: String,
}
pub fn op_read_dir(
fn op_read_dir(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -308,7 +330,7 @@ struct RenameArgs {
newpath: String,
}
pub fn op_rename(
fn op_rename(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -338,7 +360,7 @@ struct LinkArgs {
newname: String,
}
pub fn op_link(
fn op_link(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -367,7 +389,7 @@ struct SymlinkArgs {
newname: String,
}
pub fn op_symlink(
fn op_symlink(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -400,7 +422,7 @@ struct ReadLinkArgs {
name: String,
}
pub fn op_read_link(
fn op_read_link(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -429,7 +451,7 @@ struct TruncateArgs {
len: u64,
}
pub fn op_truncate(
fn op_truncate(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -459,7 +481,7 @@ struct MakeTempDirArgs {
suffix: Option<String>,
}
pub fn op_make_temp_dir(
fn op_make_temp_dir(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -499,7 +521,7 @@ struct Utime {
mtime: u64,
}
pub fn op_utime(
fn op_utime(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -514,7 +536,7 @@ pub fn op_utime(
})
}
pub fn op_cwd(
fn op_cwd(
_state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,

View File

@ -1,12 +1,18 @@
use super::dispatch_minimal::MinimalOp;
use crate::deno_error;
use crate::ops::minimal_op;
use crate::resources;
use crate::state::ThreadSafeState;
use crate::tokio_read;
use crate::tokio_write;
use deno::ErrBox;
use deno::PinnedBuf;
use deno::*;
use futures::Future;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op("read", s.core_op(minimal_op(op_read)));
i.register_op("write", s.core_op(minimal_op(op_write)));
}
pub fn op_read(rid: i32, zero_copy: Option<PinnedBuf>) -> Box<MinimalOp> {
debug!("read rid={}", rid);
let zero_copy = match zero_copy {

View File

@ -1,21 +0,0 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{JsonOp, Value};
use crate::state::ThreadSafeState;
use deno::*;
use std::sync::atomic::Ordering;
pub fn op_metrics(
state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,
) -> Result<JsonOp, ErrBox> {
let m = &state.metrics;
Ok(JsonOp::Sync(json!({
"opsDispatched": m.ops_dispatched.load(Ordering::SeqCst) as u64,
"opsCompleted": m.ops_completed.load(Ordering::SeqCst) as u64,
"bytesSentControl": m.bytes_sent_control.load(Ordering::SeqCst) as u64,
"bytesSentData": m.bytes_sent_data.load(Ordering::SeqCst) as u64,
"bytesReceived": m.bytes_received.load(Ordering::SeqCst) as u64
})))
}

View File

@ -12,10 +12,8 @@ pub mod fetch;
pub mod files;
pub mod fs;
pub mod io;
pub mod metrics;
pub mod net;
pub mod os;
pub mod performance;
pub mod permissions;
pub mod process;
pub mod random;

View File

@ -1,5 +1,6 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::ops::json_op;
use crate::resolve_addr::resolve_addr;
use crate::resources;
use crate::resources::Resource;
@ -14,12 +15,20 @@ use tokio;
use tokio::net::TcpListener;
use tokio::net::TcpStream;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op("accept", s.core_op(json_op(s.stateful_op(op_accept))));
i.register_op("dial", s.core_op(json_op(s.stateful_op(op_dial))));
i.register_op("dial_tls", s.core_op(json_op(s.stateful_op(op_dial))));
i.register_op("shutdown", s.core_op(json_op(s.stateful_op(op_shutdown))));
i.register_op("listen", s.core_op(json_op(s.stateful_op(op_listen))));
}
#[derive(Deserialize)]
struct AcceptArgs {
rid: i32,
}
pub fn op_accept(
fn op_accept(
_state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -54,7 +63,7 @@ struct DialArgs {
port: u16,
}
pub fn op_dial(
fn op_dial(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -96,7 +105,7 @@ struct ShutdownArgs {
how: i32,
}
pub fn op_shutdown(
fn op_shutdown(
_state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -125,7 +134,7 @@ struct ListenArgs {
port: u16,
}
pub fn op_listen(
fn op_listen(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,

View File

@ -2,6 +2,7 @@
use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::colors;
use crate::fs as deno_fs;
use crate::ops::json_op;
use crate::state::ThreadSafeState;
use crate::version;
use atty;
@ -22,7 +23,19 @@ static BUILD_OS: &str = "win";
#[cfg(target_arch = "x86_64")]
static BUILD_ARCH: &str = "x64";
pub fn op_start(
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op("exit", s.core_op(json_op(s.stateful_op(op_exit))));
i.register_op("is_tty", s.core_op(json_op(s.stateful_op(op_is_tty))));
i.register_op("env", s.core_op(json_op(s.stateful_op(op_env))));
i.register_op("exec_path", s.core_op(json_op(s.stateful_op(op_exec_path))));
i.register_op("set_env", s.core_op(json_op(s.stateful_op(op_set_env))));
i.register_op("get_env", s.core_op(json_op(s.stateful_op(op_get_env))));
i.register_op("home_dir", s.core_op(json_op(s.stateful_op(op_home_dir))));
i.register_op("hostname", s.core_op(json_op(s.stateful_op(op_hostname))));
i.register_op("start", s.core_op(json_op(s.stateful_op(op_start))));
}
fn op_start(
state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,
@ -46,7 +59,7 @@ pub fn op_start(
})))
}
pub fn op_home_dir(
fn op_home_dir(
state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,
@ -60,7 +73,7 @@ pub fn op_home_dir(
Ok(JsonOp::Sync(json!(path)))
}
pub fn op_exec_path(
fn op_exec_path(
state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,
@ -80,7 +93,7 @@ struct SetEnv {
value: String,
}
pub fn op_set_env(
fn op_set_env(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -91,7 +104,7 @@ pub fn op_set_env(
Ok(JsonOp::Sync(json!({})))
}
pub fn op_env(
fn op_env(
state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,
@ -106,7 +119,7 @@ struct GetEnv {
key: String,
}
pub fn op_get_env(
fn op_get_env(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -125,7 +138,7 @@ struct Exit {
code: i32,
}
pub fn op_exit(
fn op_exit(
_s: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -134,7 +147,7 @@ pub fn op_exit(
std::process::exit(args.code)
}
pub fn op_is_tty(
fn op_is_tty(
_s: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,
@ -146,7 +159,7 @@ pub fn op_is_tty(
})))
}
pub fn op_hostname(
fn op_hostname(
state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,

View File

@ -1,30 +0,0 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{JsonOp, Value};
use crate::state::ThreadSafeState;
use deno::*;
// Returns a milliseconds and nanoseconds subsec
// since the start time of the deno runtime.
// If the High precision flag is not set, the
// nanoseconds are rounded on 2ms.
pub fn op_now(
state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,
) -> Result<JsonOp, ErrBox> {
let seconds = state.start_time.elapsed().as_secs();
let mut subsec_nanos = state.start_time.elapsed().subsec_nanos();
let reduced_time_precision = 2_000_000; // 2ms in nanoseconds
// If the permission is not enabled
// Round the nano result on 2 milliseconds
// see: https://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp#Reduced_time_precision
if !state.permissions.allows_hrtime() {
subsec_nanos -= subsec_nanos % reduced_time_precision
}
Ok(JsonOp::Sync(json!({
"seconds": seconds,
"subsecNanos": subsec_nanos,
})))
}

View File

@ -1,8 +1,20 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::ops::json_op;
use crate::state::ThreadSafeState;
use deno::*;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op(
"permissions",
s.core_op(json_op(s.stateful_op(op_permissions))),
);
i.register_op(
"revoke_permission",
s.core_op(json_op(s.stateful_op(op_revoke_permission))),
);
}
pub fn op_permissions(
state: &ThreadSafeState,
_args: Value,

View File

@ -1,5 +1,6 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::ops::json_op;
use crate::resources;
use crate::signal::kill;
use crate::state::ThreadSafeState;
@ -14,6 +15,15 @@ use tokio_process::CommandExt;
#[cfg(unix)]
use std::os::unix::process::ExitStatusExt;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op("run", s.core_op(json_op(s.stateful_op(op_run))));
i.register_op(
"run_status",
s.core_op(json_op(s.stateful_op(op_run_status))),
);
i.register_op("kill", s.core_op(json_op(s.stateful_op(op_kill))));
}
fn subprocess_stdio_map(s: &str) -> std::process::Stdio {
match s {
"inherit" => std::process::Stdio::inherit(),
@ -37,7 +47,7 @@ struct RunArgs {
stderr_rid: u32,
}
pub fn op_run(
fn op_run(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -103,7 +113,7 @@ struct RunStatusArgs {
rid: i32,
}
pub fn op_run_status(
fn op_run_status(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -144,7 +154,7 @@ struct KillArgs {
signo: i32,
}
pub fn op_kill(
fn op_kill(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,

View File

@ -1,11 +1,19 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{JsonOp, Value};
use crate::ops::json_op;
use crate::state::ThreadSafeState;
use deno::*;
use rand::thread_rng;
use rand::Rng;
pub fn op_get_random_values(
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op(
"get_random_values",
s.core_op(json_op(s.stateful_op(op_get_random_values))),
);
}
fn op_get_random_values(
state: &ThreadSafeState,
_args: Value,
zero_copy: Option<PinnedBuf>,

View File

@ -1,17 +1,29 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{blocking_json, Deserialize, JsonOp, Value};
use crate::ops::json_op;
use crate::repl;
use crate::resources;
use crate::state::ThreadSafeState;
use deno::*;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op(
"repl_start",
s.core_op(json_op(s.stateful_op(op_repl_start))),
);
i.register_op(
"repl_readline",
s.core_op(json_op(s.stateful_op(op_repl_readline))),
);
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct ReplStartArgs {
history_file: String,
}
pub fn op_repl_start(
fn op_repl_start(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -32,7 +44,7 @@ struct ReplReadlineArgs {
prompt: String,
}
pub fn op_repl_readline(
fn op_repl_readline(
_state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,

View File

@ -1,10 +1,15 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{JsonOp, Value};
use crate::ops::json_op;
use crate::resources::table_entries;
use crate::state::ThreadSafeState;
use deno::*;
pub fn op_resources(
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op("resources", s.core_op(json_op(s.stateful_op(op_resources))));
}
fn op_resources(
_state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,

View File

@ -1,5 +1,6 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::ops::json_op;
use crate::state::ThreadSafeState;
use deno::*;
use futures::Future;
@ -7,7 +8,19 @@ use std;
use std::time::Duration;
use std::time::Instant;
pub fn op_global_timer_stop(
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op(
"global_timer_stop",
s.core_op(json_op(s.stateful_op(op_global_timer_stop))),
);
i.register_op(
"global_timer",
s.core_op(json_op(s.stateful_op(op_global_timer))),
);
i.register_op("now", s.core_op(json_op(s.stateful_op(op_now))));
}
fn op_global_timer_stop(
state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,
@ -23,7 +36,7 @@ struct GlobalTimerArgs {
timeout: u64,
}
pub fn op_global_timer(
fn op_global_timer(
state: &ThreadSafeState,
args: Value,
_zero_copy: Option<PinnedBuf>,
@ -40,3 +53,29 @@ pub fn op_global_timer(
Ok(JsonOp::Async(Box::new(f)))
}
// Returns a milliseconds and nanoseconds subsec
// since the start time of the deno runtime.
// If the High precision flag is not set, the
// nanoseconds are rounded on 2ms.
fn op_now(
state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,
) -> Result<JsonOp, ErrBox> {
let seconds = state.start_time.elapsed().as_secs();
let mut subsec_nanos = state.start_time.elapsed().subsec_nanos();
let reduced_time_precision = 2_000_000; // 2ms in nanoseconds
// If the permission is not enabled
// Round the nano result on 2 milliseconds
// see: https://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp#Reduced_time_precision
if !state.permissions.allows_hrtime() {
subsec_nanos -= subsec_nanos % reduced_time_precision
}
Ok(JsonOp::Sync(json!({
"seconds": seconds,
"subsecNanos": subsec_nanos,
})))
}

View File

@ -3,6 +3,7 @@ use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::deno_error::js_check;
use crate::deno_error::DenoError;
use crate::deno_error::ErrorKind;
use crate::ops::json_op;
use crate::resources;
use crate::startup_data;
use crate::state::ThreadSafeState;
@ -15,6 +16,36 @@ use futures::Sink;
use futures::Stream;
use std;
use std::convert::From;
use std::sync::atomic::Ordering;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
i.register_op(
"create_worker",
s.core_op(json_op(s.stateful_op(op_create_worker))),
);
i.register_op(
"host_get_worker_closed",
s.core_op(json_op(s.stateful_op(op_host_get_worker_closed))),
);
i.register_op(
"host_post_message",
s.core_op(json_op(s.stateful_op(op_host_post_message))),
);
i.register_op(
"host_get_message",
s.core_op(json_op(s.stateful_op(op_host_get_message))),
);
// TODO: make sure these two ops are only accessible to appropriate Worker
i.register_op(
"worker_post_message",
s.core_op(json_op(s.stateful_op(op_worker_post_message))),
);
i.register_op(
"worker_get_message",
s.core_op(json_op(s.stateful_op(op_worker_get_message))),
);
i.register_op("metrics", s.core_op(json_op(s.stateful_op(op_metrics))));
}
struct GetMessageFuture {
pub state: ThreadSafeState,
@ -33,7 +64,7 @@ impl Future for GetMessageFuture {
}
/// Get message from host as guest worker
pub fn op_worker_get_message(
fn op_worker_get_message(
state: &ThreadSafeState,
_args: Value,
_data: Option<PinnedBuf>,
@ -56,7 +87,7 @@ pub fn op_worker_get_message(
}
/// Post message to host as guest worker
pub fn op_worker_post_message(
fn op_worker_post_message(
state: &ThreadSafeState,
_args: Value,
data: Option<PinnedBuf>,
@ -84,7 +115,7 @@ struct CreateWorkerArgs {
}
/// Create worker as the host
pub fn op_create_worker(
fn op_create_worker(
state: &ThreadSafeState,
args: Value,
_data: Option<PinnedBuf>,
@ -154,7 +185,7 @@ struct HostGetWorkerClosedArgs {
}
/// Return when the worker closes
pub fn op_host_get_worker_closed(
fn op_host_get_worker_closed(
state: &ThreadSafeState,
args: Value,
_data: Option<PinnedBuf>,
@ -183,7 +214,7 @@ struct HostGetMessageArgs {
}
/// Get message from guest worker as host
pub fn op_host_get_message(
fn op_host_get_message(
_state: &ThreadSafeState,
args: Value,
_data: Option<PinnedBuf>,
@ -208,7 +239,7 @@ struct HostPostMessageArgs {
}
/// Post message to guest worker as host
pub fn op_host_post_message(
fn op_host_post_message(
_state: &ThreadSafeState,
args: Value,
data: Option<PinnedBuf>,
@ -225,3 +256,19 @@ pub fn op_host_post_message(
Ok(JsonOp::Sync(json!({})))
}
fn op_metrics(
state: &ThreadSafeState,
_args: Value,
_zero_copy: Option<PinnedBuf>,
) -> Result<JsonOp, ErrBox> {
let m = &state.metrics;
Ok(JsonOp::Sync(json!({
"opsDispatched": m.ops_dispatched.load(Ordering::SeqCst) as u64,
"opsCompleted": m.ops_completed.load(Ordering::SeqCst) as u64,
"bytesSentControl": m.bytes_sent_control.load(Ordering::SeqCst) as u64,
"bytesSentData": m.bytes_sent_data.load(Ordering::SeqCst) as u64,
"bytesReceived": m.bytes_received.load(Ordering::SeqCst) as u64
})))
}

View File

@ -104,9 +104,8 @@ impl Deref for ThreadSafeState {
}
impl ThreadSafeState {
// TODO: better name welcome
/// Wrap core `OpDispatcher` to collect metrics.
pub fn cli_op<D>(
pub fn core_op<D>(
&self,
dispatcher: D,
) -> impl Fn(&[u8], Option<PinnedBuf>) -> CoreOp

View File

@ -1,8 +1,6 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use crate::fmt_errors::JSError;
use crate::ops::json_op;
use crate::ops::minimal_op;
use crate::ops::*;
use crate::ops;
use crate::state::ThreadSafeState;
use deno;
use deno::ErrBox;
@ -33,255 +31,22 @@ impl Worker {
let isolate = Arc::new(Mutex::new(deno::Isolate::new(startup_data, false)));
{
let mut i = isolate.lock().unwrap();
let state_ = state.clone();
i.register_op("read", state_.cli_op(minimal_op(io::op_read)));
i.register_op("write", state_.cli_op(minimal_op(io::op_write)));
i.register_op(
"exit",
state_.cli_op(json_op(state_.stateful_op(os::op_exit))),
);
i.register_op(
"is_tty",
state_.cli_op(json_op(state_.stateful_op(os::op_is_tty))),
);
i.register_op(
"env",
state_.cli_op(json_op(state_.stateful_op(os::op_env))),
);
i.register_op(
"exec_path",
state_.cli_op(json_op(state_.stateful_op(os::op_exec_path))),
);
i.register_op(
"utime",
state_.cli_op(json_op(state_.stateful_op(fs::op_utime))),
);
i.register_op(
"set_env",
state_.cli_op(json_op(state_.stateful_op(os::op_set_env))),
);
i.register_op(
"get_env",
state_.cli_op(json_op(state_.stateful_op(os::op_get_env))),
);
i.register_op(
"home_dir",
state_.cli_op(json_op(state_.stateful_op(os::op_home_dir))),
);
i.register_op(
"start",
state_.cli_op(json_op(state_.stateful_op(os::op_start))),
);
i.register_op(
"apply_source_map",
state_.cli_op(json_op(state_.stateful_op(errors::op_apply_source_map))),
);
i.register_op(
"format_error",
state_.cli_op(json_op(state_.stateful_op(errors::op_format_error))),
);
i.register_op(
"cache",
state_.cli_op(json_op(state_.stateful_op(compiler::op_cache))),
);
i.register_op(
"fetch_source_files",
state_
.cli_op(json_op(state_.stateful_op(compiler::op_fetch_source_files))),
);
i.register_op(
"open",
state_.cli_op(json_op(state_.stateful_op(files::op_open))),
);
i.register_op(
"close",
state_.cli_op(json_op(state_.stateful_op(files::op_close))),
);
i.register_op(
"seek",
state_.cli_op(json_op(state_.stateful_op(files::op_seek))),
);
i.register_op(
"fetch",
state_.cli_op(json_op(state_.stateful_op(fetch::op_fetch))),
);
i.register_op(
"metrics",
state_.cli_op(json_op(state_.stateful_op(metrics::op_metrics))),
);
i.register_op(
"repl_start",
state_.cli_op(json_op(state_.stateful_op(repl::op_repl_start))),
);
i.register_op(
"repl_readline",
state_.cli_op(json_op(state_.stateful_op(repl::op_repl_readline))),
);
i.register_op(
"accept",
state_.cli_op(json_op(state_.stateful_op(net::op_accept))),
);
i.register_op(
"dial",
state_.cli_op(json_op(state_.stateful_op(net::op_dial))),
);
i.register_op(
"dial_tls",
state_.cli_op(json_op(state_.stateful_op(net::op_dial))),
);
i.register_op(
"shutdown",
state_.cli_op(json_op(state_.stateful_op(net::op_shutdown))),
);
i.register_op(
"listen",
state_.cli_op(json_op(state_.stateful_op(net::op_listen))),
);
i.register_op(
"resources",
state_.cli_op(json_op(state_.stateful_op(resources::op_resources))),
);
i.register_op(
"get_random_values",
state_
.cli_op(json_op(state_.stateful_op(random::op_get_random_values))),
);
i.register_op(
"global_timer_stop",
state_
.cli_op(json_op(state_.stateful_op(timers::op_global_timer_stop))),
);
i.register_op(
"global_timer",
state_.cli_op(json_op(state_.stateful_op(timers::op_global_timer))),
);
i.register_op(
"now",
state_.cli_op(json_op(state_.stateful_op(performance::op_now))),
);
i.register_op(
"permissions",
state_.cli_op(json_op(state_.stateful_op(permissions::op_permissions))),
);
i.register_op(
"revoke_permission",
state_.cli_op(json_op(
state_.stateful_op(permissions::op_revoke_permission),
)),
);
i.register_op(
"create_worker",
state_.cli_op(json_op(state_.stateful_op(workers::op_create_worker))),
);
i.register_op(
"host_get_worker_closed",
state_.cli_op(json_op(
state_.stateful_op(workers::op_host_get_worker_closed),
)),
);
i.register_op(
"host_post_message",
state_
.cli_op(json_op(state_.stateful_op(workers::op_host_post_message))),
);
i.register_op(
"host_get_message",
state_
.cli_op(json_op(state_.stateful_op(workers::op_host_get_message))),
);
// TODO: make sure these two ops are only accessible to appropriate Worker
i.register_op(
"worker_post_message",
state_
.cli_op(json_op(state_.stateful_op(workers::op_worker_post_message))),
);
i.register_op(
"worker_get_message",
state_
.cli_op(json_op(state_.stateful_op(workers::op_worker_get_message))),
);
i.register_op(
"run",
state_.cli_op(json_op(state_.stateful_op(process::op_run))),
);
i.register_op(
"run_status",
state_.cli_op(json_op(state_.stateful_op(process::op_run_status))),
);
i.register_op(
"kill",
state_.cli_op(json_op(state_.stateful_op(process::op_kill))),
);
i.register_op(
"chdir",
state_.cli_op(json_op(state_.stateful_op(fs::op_chdir))),
);
i.register_op(
"mkdir",
state_.cli_op(json_op(state_.stateful_op(fs::op_mkdir))),
);
i.register_op(
"chmod",
state_.cli_op(json_op(state_.stateful_op(fs::op_chmod))),
);
i.register_op(
"chown",
state_.cli_op(json_op(state_.stateful_op(fs::op_chown))),
);
i.register_op(
"remove",
state_.cli_op(json_op(state_.stateful_op(fs::op_remove))),
);
i.register_op(
"copy_file",
state_.cli_op(json_op(state_.stateful_op(fs::op_copy_file))),
);
i.register_op(
"stat",
state_.cli_op(json_op(state_.stateful_op(fs::op_stat))),
);
i.register_op(
"read_dir",
state_.cli_op(json_op(state_.stateful_op(fs::op_read_dir))),
);
i.register_op(
"rename",
state_.cli_op(json_op(state_.stateful_op(fs::op_rename))),
);
i.register_op(
"link",
state_.cli_op(json_op(state_.stateful_op(fs::op_link))),
);
i.register_op(
"symlink",
state_.cli_op(json_op(state_.stateful_op(fs::op_symlink))),
);
i.register_op(
"read_link",
state_.cli_op(json_op(state_.stateful_op(fs::op_read_link))),
);
i.register_op(
"truncate",
state_.cli_op(json_op(state_.stateful_op(fs::op_truncate))),
);
i.register_op(
"make_temp_dir",
state_.cli_op(json_op(state_.stateful_op(fs::op_make_temp_dir))),
);
i.register_op(
"cwd",
state_.cli_op(json_op(state_.stateful_op(fs::op_cwd))),
);
i.register_op(
"fetch_asset",
state_.cli_op(json_op(state_.stateful_op(compiler::op_fetch_asset))),
);
i.register_op(
"hostname",
state_.cli_op(json_op(state_.stateful_op(os::op_hostname))),
);
ops::compiler::init(&mut i, &state);
ops::errors::init(&mut i, &state);
ops::fetch::init(&mut i, &state);
ops::files::init(&mut i, &state);
ops::fs::init(&mut i, &state);
ops::io::init(&mut i, &state);
ops::net::init(&mut i, &state);
ops::os::init(&mut i, &state);
ops::permissions::init(&mut i, &state);
ops::process::init(&mut i, &state);
ops::random::init(&mut i, &state);
ops::repl::init(&mut i, &state);
ops::resources::init(&mut i, &state);
ops::timers::init(&mut i, &state);
ops::workers::init(&mut i, &state);
let state_ = state.clone();
i.set_dyn_import(move |id, specifier, referrer| {