]> Untitled Git - bdk/commitdiff
[wallet] Abstract, multi-platform datetime utils
authorAlekos Filini <alekos.filini@gmail.com>
Thu, 6 Aug 2020 09:12:15 +0000 (11:12 +0200)
committerAlekos Filini <alekos.filini@gmail.com>
Thu, 6 Aug 2020 12:28:20 +0000 (14:28 +0200)
Cargo.toml
src/wallet/mod.rs
src/wallet/time.rs [new file with mode: 0644]

index c2b6f29a9ee06f8cebe45704117c468c081f38ba..8f41704487abb03617da665e3a5b21eac9551282 100644 (file)
@@ -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 = []
index 018c215f69bd1b7efdc4d0a818344344602d218b..8ad197f5ba99f210e7486c6e0ada041500313168 100644 (file)
@@ -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 (file)
index 0000000..45f8407
--- /dev/null
@@ -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))
+    }
+}