// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. use crate::msg; use crate::ops::ok_buf; use crate::ops::serialize_response; use crate::ops::CliOpResult; use crate::state::ThreadSafeState; use deno::*; use flatbuffers::FlatBufferBuilder; // 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, base: &msg::Base<'_>, data: Option, ) -> CliOpResult { assert!(data.is_none()); 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 } let builder = &mut FlatBufferBuilder::new(); let inner = msg::NowRes::create( builder, &msg::NowResArgs { seconds, subsec_nanos, }, ); ok_buf(serialize_response( base.cmd_id(), builder, msg::BaseArgs { inner: Some(inner.as_union_value()), inner_type: msg::Any::NowRes, ..Default::default() }, )) }