Expand description
§Description
Complete drop-in replacement for std::time
that works in browsers.
Currently Instant::now()
and SystemTime::now()
will simply panic
when using the wasm32-unknown-unknown
target. This implementation uses
Performance.now()
for Instant
and Date.now()
for SystemTime
to offer a drop-in replacement that works in browsers.
At the same time the library will simply re-export std::time
when not
using the wasm32-unknown-unknown
or wasm32v1-none
target and will not
pull in any dependencies.
Additionally, if compiled with target-feature = "atomics"
it will
synchronize the timestamps to account for different context’s, like web
workers. See Performance.timeOrigin
for more information.
§Target
This library specifically targets browsers, that support
Performance.now()
, with the wasm32-unknown-unknown
or wasm32v1-none
target. Emscripten is not supported. WASI doesn’t require support as it has
it’s own native API to deal with std::time
.
Furthermore it depends on wasm-bindgen
, which is required. This library
will continue to depend on it until a viable alternative presents itself, in
which case multiple ecosystems could be supported.
§Note
§Ticking during sleep
Currently a known bug is affecting browsers on operating system other then
Windows. This bug prevents Instant
from continuing to tick when the
context is asleep. While this doesn’t conflict with Rusts requirements of
Instant
, by chance Rust’s Std
has the same problem.
See the MDN documentation on this for more information.
§Context support
The implementation of Instant::now()
relies on the availability of the
Performance
object, a lack thereof will cause a panic. This can happen
if called from a worklet.
§Usage
You can simply import the types you need:
use web_time::{Instant, SystemTime};
let now = Instant::now();
let time = SystemTime::now();
Using -Ctarget-feature=+nontrapping-fptoint
will improve the performance
of Instant::now()
and SystemTime::now()
, but the vast majority of
the time is still spent going through JS.
§Features
§std
(enabled by default)
Enables the corresponding crate feature in all dependencies and allows for some optimized instruction output.
Without this crate feature compilation the standard library is not included.
Has no effect on targets other then wasm32-unknown-unknown
or
wasm32v1-none
.
§msrv
(enabled by default)
Allows web-time
to make use of features only available in higher MSRVs.
This offers compile-time detection and does not break compilation when
enabled with the crates MSRV.
- Rust v1.77 +
std
: Enables the use of thef64.nearest
instruction. Which will significantly reduce the instruction count forInstant::now()
. - Rust Nightly: Enables the use of the
f64.trunc
andf64.nearest
instruction. Which will significantly reduce the instruction count forInstant::now()
.
§serde
Implements serde::Deserialize
and serde::Serialize
for
SystemTime
.
§Conditional Configurations
§docsrs
This requires Rust nightly and enhances the documentation. It must only be
used with RUSTDOCFLAGS
, not with RUSTFLAGS
.
§MSRV Policy
The MSRV is v1.60. Changes to the MSRV will be accompanied by a minor version bump.
§Contributing
See the CONTRIBUTING file for details.
§Attribution
Inspiration was taken from the instant project.
Additional insight was taken from the time project.
§Changelog
See the CHANGELOG file for details.
§License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
§Copyright
A majority of the code and documentation was taken from std::time
. For
license information see #License.
§Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Modules§
Structs§
- A
Duration
type to represent a span of time, typically used for system timeouts. - See
std::time::Instant
. - An error which can be returned when converting a floating-point value of seconds into a
Duration
.