summaryrefslogtreecommitdiff
path: root/ext/timers/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/timers/lib.rs')
-rw-r--r--ext/timers/lib.rs127
1 files changed, 0 insertions, 127 deletions
diff --git a/ext/timers/lib.rs b/ext/timers/lib.rs
deleted file mode 100644
index 63aabe9d4..000000000
--- a/ext/timers/lib.rs
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
-
-//! This module helps deno implement timers and performance APIs.
-
-use deno_core::error::AnyError;
-use deno_core::include_js_files;
-use deno_core::op_async;
-use deno_core::op_sync;
-use deno_core::CancelFuture;
-use deno_core::CancelHandle;
-use deno_core::Extension;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use std::borrow::Cow;
-use std::cell::RefCell;
-use std::rc::Rc;
-use std::time::Duration;
-use std::time::Instant;
-
-pub trait TimersPermission {
- fn allow_hrtime(&mut self) -> bool;
- fn check_unstable(&self, state: &OpState, api_name: &'static str);
-}
-
-pub fn init<P: TimersPermission + 'static>() -> Extension {
- Extension::builder()
- .js(include_js_files!(
- prefix "deno:ext/timers",
- "01_timers.js",
- "02_performance.js",
- ))
- .ops(vec![
- ("op_now", op_sync(op_now::<P>)),
- ("op_timer_handle", op_sync(op_timer_handle)),
- ("op_sleep", op_async(op_sleep)),
- ("op_sleep_sync", op_sync(op_sleep_sync::<P>)),
- ])
- .state(|state| {
- state.put(StartTime::now());
- Ok(())
- })
- .build()
-}
-
-pub type StartTime = Instant;
-
-// 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<TP>(
- state: &mut OpState,
- _argument: (),
- _: (),
-) -> Result<f64, AnyError>
-where
- TP: TimersPermission + 'static,
-{
- let start_time = state.borrow::<StartTime>();
- let seconds = start_time.elapsed().as_secs();
- let mut subsec_nanos = start_time.elapsed().subsec_nanos() as f64;
- let reduced_time_precision = 2_000_000.0; // 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.borrow_mut::<TP>().allow_hrtime() {
- subsec_nanos -= subsec_nanos % reduced_time_precision;
- }
-
- let result = (seconds * 1_000) as f64 + (subsec_nanos / 1_000_000.0);
-
- Ok(result)
-}
-
-pub struct TimerHandle(Rc<CancelHandle>);
-
-impl Resource for TimerHandle {
- fn name(&self) -> Cow<str> {
- "timer".into()
- }
-
- fn close(self: Rc<Self>) {
- self.0.cancel();
- }
-}
-
-/// Creates a [`TimerHandle`] resource that can be used to cancel invocations of
-/// [`op_sleep`].
-pub fn op_timer_handle(
- state: &mut OpState,
- _: (),
- _: (),
-) -> Result<ResourceId, AnyError> {
- let rid = state
- .resource_table
- .add(TimerHandle(CancelHandle::new_rc()));
- Ok(rid)
-}
-
-/// Waits asynchronously until either `millis` milliseconds have passed or the
-/// [`TimerHandle`] resource given by `rid` has been canceled.
-pub async fn op_sleep(
- state: Rc<RefCell<OpState>>,
- millis: u64,
- rid: ResourceId,
-) -> Result<(), AnyError> {
- let handle = state.borrow().resource_table.get::<TimerHandle>(rid)?;
- tokio::time::sleep(Duration::from_millis(millis))
- .or_cancel(handle.0.clone())
- .await?;
- Ok(())
-}
-
-pub fn op_sleep_sync<TP>(
- state: &mut OpState,
- millis: u64,
- _: (),
-) -> Result<(), AnyError>
-where
- TP: TimersPermission + 'static,
-{
- state.borrow::<TP>().check_unstable(state, "Deno.sleepSync");
- std::thread::sleep(Duration::from_millis(millis));
- Ok(())
-}