diff --git a/Cargo.toml b/Cargo.toml index c2b6f29a..8f417044 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ tokio = { version = "0.2", features = ["rt-core"] } [target.'cfg(target_arch = "wasm32")'.dependencies] async-trait = "0.1" +js-sys = "0.3" [features] minimal = [] diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index 018c215f..8ad197f5 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -2,7 +2,6 @@ use std::cell::RefCell; use std::collections::{BTreeMap, HashSet}; use std::ops::DerefMut; use std::str::FromStr; -use std::time::{Instant, SystemTime, UNIX_EPOCH}; use bitcoin::blockdata::opcodes; use bitcoin::blockdata::script::Builder; @@ -17,9 +16,11 @@ use miniscript::BitcoinSig; #[allow(unused_imports)] use log::{debug, error, info, trace}; +pub mod time; pub mod utils; use self::utils::IsDust; + use crate::blockchain::{noop_progress, Blockchain, OfflineBlockchain, OnlineBlockchain}; use crate::database::{BatchDatabase, BatchOperations, DatabaseUtils}; use crate::descriptor::{get_checksum, DescriptorMeta, ExtendedDescriptor, ExtractPolicy, Policy}; @@ -295,7 +296,7 @@ where let transaction_details = TransactionDetails { transaction: None, txid: txid, - timestamp: Self::get_timestamp(), + timestamp: time::get_timestamp(), received, sent: outgoing, height: None, @@ -526,19 +527,6 @@ where // Internals - #[cfg(not(target_arch = "wasm32"))] - fn get_timestamp() -> u64 { - SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_secs() - } - - #[cfg(target_arch = "wasm32")] - fn get_timestamp() -> u64 { - 0 - } - fn get_descriptor_for(&self, script_type: ScriptType) -> &ExtendedDescriptor { let desc = match script_type { ScriptType::External => &self.descriptor, @@ -752,8 +740,7 @@ where // cache a few of our addresses if last_addr.is_none() { let mut address_batch = self.database.borrow().begin_batch(); - #[cfg(not(target_arch = "wasm32"))] - let start = Instant::now(); + let start = time::Instant::new(); for i in 0..=max_address { let derived = self.descriptor.derive(i).unwrap(); @@ -776,7 +763,6 @@ where } } - #[cfg(not(target_arch = "wasm32"))] info!( "derivation of {} addresses, took {} ms", max_address, diff --git a/src/wallet/time.rs b/src/wallet/time.rs new file mode 100644 index 00000000..45f84075 --- /dev/null +++ b/src/wallet/time.rs @@ -0,0 +1,52 @@ +use std::time::Duration; + +#[cfg(target_arch = "wasm32")] +use js_sys::Date; +#[cfg(not(target_arch = "wasm32"))] +use std::time::{Instant as SystemInstant, SystemTime, UNIX_EPOCH}; + +#[cfg(not(target_arch = "wasm32"))] +pub fn get_timestamp() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() +} +#[cfg(target_arch = "wasm32")] +pub fn get_timestamp() -> u64 { + let millis = Date::now(); + + (millis / 1000.0) as u64 +} + +#[cfg(not(target_arch = "wasm32"))] +pub struct Instant(SystemInstant); +#[cfg(target_arch = "wasm32")] +pub struct Instant(Duration); + +impl Instant { + #[cfg(not(target_arch = "wasm32"))] + pub fn new() -> Self { + Instant(SystemInstant::now()) + } + #[cfg(target_arch = "wasm32")] + pub fn new() -> Self { + let millis = Date::now(); + + let secs = millis / 1000.0; + let nanos = (millis % 1000.0) * 1e6; + + Instant(Duration::new(secs as u64, nanos as u32)) + } + + #[cfg(not(target_arch = "wasm32"))] + pub fn elapsed(&self) -> Duration { + self.0.elapsed() + } + #[cfg(target_arch = "wasm32")] + pub fn elapsed(&self) -> Duration { + let now = Instant::new(); + + now.0.checked_sub(self.0).unwrap_or(Duration::new(0, 0)) + } +}