summaryrefslogtreecommitdiff
path: root/cli/ops/timers.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/ops/timers.rs')
-rw-r--r--cli/ops/timers.rs43
1 files changed, 41 insertions, 2 deletions
diff --git a/cli/ops/timers.rs b/cli/ops/timers.rs
index abcd5c1b3..f366797b4 100644
--- a/cli/ops/timers.rs
+++ b/cli/ops/timers.rs
@@ -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,
+ })))
+}