33 KiB
Changelog
All notable changes to async-std will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
[1.8.0] - 2020-12-04
This patch introduces async_std::channel
, a new submodule for our async channels implementation. channels
have been one of async-std's most requested features, and have existed as "unstable" for the past year. We've been cautious about stabilizing channels, and this caution turned out to be warranted: we realized our channels could hang indefinitely under certain circumstances, and people ended up expressing a need for unbounded channels.
So today we're introducing the new async_std::channel
submodule which exports the async-channel
crate, and we're marking the older unstable async_std::sync::channel
API as "deprecated". This release includes both APIs, but we intend to stabilize async_std::channel
and remove the older API in January. This should give dependent projects a month to upgrade, though we can extend that if it proves to be too short.
The rationale for adding a new top-level channel
submodule, rather than extending sync
is that the std::sync
and async_std::sync
submodule are a bit of a mess, and the libs team has been talking about splitting std::sync
up into separate modules. The stdlib has to guarantee it'll forever be backwards compatible, but async-std
does not (we fully expect a 2.0 once we have async closures & traits). So we're experimenting with this change before std
does, with the expectation that this change can serve as a data point when the libs team decides how to proceed in std.
Added
Fixed
- Fixed mentions of the
tokio03
flags in the docs #909 - Fixed a double drop issue in
StreamExt::cycle
#903
Internal
- updated
pin-project
tov0.2.0
1.7.0 - 2020-10-30
This patch adds a feature to enable compatibility with the new tokio
0.3.0
release, and updates internal dependencies.
Added
- Add
tokio03
feature (#895)
Internal
- chore: update dependencies (#897)
1.6.5 - 2020-09-28
Fixed
1.6.4 - 2020-09-16
Added
- Added
UdpSocket::peek
andUdpSocket::peek_from
(#853)
Changed
-
Extracted the executor into async-global-executor (#867)
-
Updated various dependencies
Fixed
- Ensure
UnixStream::into_raw_fd
doesn't close the file descriptor (#855) - Fixed wasm builds and ensured better dependency management depending on the compile target (#863)
1.6.3 - 2020-07-31
Added
Changed
- Switched from smol to individual executor parts. (#836)
- Replaced internal
Mutex
implementation withasync-mutex
. (#822)
Fixed
- Added missing
Send
guards toStream::collect
. (#665)
1.6.2 - 2020-06-19
Added
- Add
UdpSocket::peer_addr
(#816)
Changed
Fixed
- Ensure the reactor is running for sockets and timers (#819).
- Avoid excessive polling in
flatten
andflat_map
(#701)
1.6.1 - 2020-06-11
Added
- Added
tokio02
feature flag, to allow compatability usage with tokio@0.2 (#804).
Changed
- Removed unstable
stdio
lock methods, due to their unsoundness (#807).
Fixed
- Fixed wrong slice index for file reading (#802).
- Fixed recursive calls to
block_on
(#799) and (#809). - Remove
default
feature requirement for theunstable
feature (#806).
1.6.0 - 2020-05-22
See 1.6.0-beta.1
and 1.6.0-beta.2
.
1.6.0-beta.2 - 2020-05-19
Added
- Added an environment variable to configure the thread pool size of the runtime. (#774)
- Implement
Clone
forUnixStream
(#772)
Changed
- For
wasm
, switched underlyingTimer
implementation tofutures-timer
. (#776)
Fixed
- Use
smol::block_on
to handle drop ofFile
, avoiding nested executor panic. (#768)
1.6.0-beta.1 - 2020-05-07
Added
- Added
task::spawn_local
. (#757) - Added out of the box support for
wasm
. (#757) - Added
JoinHandle::cancel
(#757) - Added
sync::Condvar
(#369) - Added
sync::Sender::try_send
andsync::Receiver::try_recv
(#585) - Added
no_std
support fortask
,future
andstream
(#680)
Changed
- Switched underlying runtime to
smol
. (#757) - Switched implementation of
sync::Barrier
to usesync::Condvar
likestd
does. (#581)
Fixed
- Allow compilation on 32 bit targets, by using
AtomicUsize
forTaskId
. (#756)
1.5.0 - 2020-02-03
This patch includes various quality of life improvements to async-std.
Including improved performance, stability, and the addition of various
Clone
impls that replace the use of Arc
in many cases.
Added
- Added links to various ecosystem projects from the README (#660)
- Added an example on
FromStream
forResult<T, E>
(#643) - Added
stream::pending
as "unstable" (#615) - Added an example of
stream::timeout
to document the error flow (#675) - Implement
Clone
forDirEntry
(#682) - Implement
Clone
forTcpStream
(#689)
Changed
- Removed internal comment on
stream::Interval
(#645) - The "unstable" feature can now be used without requiring the "default" feature (#647)
- Removed unnecessary trait bound on
stream::FlatMap
(#651) - Updated the "broadcaster" dependency used by "unstable" to
1.0.0
(#681) - Updated
async-task
to 1.2.1 (#676) task::block_on
now parks after a single poll, improving performance in many cases (#684)- Improved reading flow of the "client" part of the async-std tutorial (#550)
- Use
take_while
instead ofscan
inimpl
ofProduct
,Sum
andFromStream
(#667) TcpStream::connect
no longer uses a thread from the threadpool, improving performance (#687)
Fixed
- Fixed crate documentation typo (#655)
- Fixed documentation for
UdpSocket::recv
(#648) - Fixed documentation for
UdpSocket::send
(#671) - Fixed typo in stream documentation (#650)
- Fixed typo on
sync::JoinHandle
documentation (#659) - Removed use of
std::error::Error::description
which failed CI (#661) - Removed the use of rustfmt's unstable
format_code_in_doc_comments
option which failed CI (#685) - Fixed a code typo in the
task::sleep
example (#688)
1.4.0 - 2019-12-20
This patch adds Future::timeout
, providing a method counterpart to the
future::timeout
free function. And includes several bug fixes around missing
APIs. Notably we're not shipping our new executor yet, first announced on our
blog.
Examples
use async_std::prelude::*;
use async_std::future;
use std::time::Duration;
let fut = future::pending::<()>(); // This future will never resolve.
let res = fut.timeout(Duration::from_millis(100)).await;
assert!(res.is_err()); // The future timed out, returning an err.
Added
- Added
Future::timeout
as "unstable" (#600)
Fixes
- Fixed a doc test and enabled it on CI (#597)
- Fixed a rendering issue with the
stream
submodule documentation (#621) Write::write_fmt
's future is now correctly marked as#[must_use]
(#628)- Fixed the missing
io::Bytes
export (#633) - Fixed the missing
io::Chain
export (#633) - Fixed the missing
io::Take
export (#633)
1.3.0 - 2019-12-12
This patch introduces Stream::delay
, more methods on DoubleEndedStream
,
and improves compile times. Stream::delay
is a new API that's similar to
task::sleep
,
but can be passed as part of as stream, rather than as a separate block. This is
useful for examples, or when manually debugging race conditions.
Examples
let start = Instant::now();
let mut s = stream::from_iter(vec![0u8, 1]).delay(Duration::from_millis(200));
// The first time will take more than 200ms due to delay.
s.next().await;
assert!(start.elapsed().as_millis() >= 200);
// There will be no delay after the first time.
s.next().await;
assert!(start.elapsed().as_millis() <= 210);
Added
- Added
Stream::delay
as "unstable" (#309) - Added
DoubleEndedStream::next_back
as "unstable" (#562) - Added
DoubleEndedStream::nth_back
as "unstable" (#562) - Added
DoubleEndedStream::rfind
as "unstable" (#562) - Added
DoubleEndedStream::rfold
as "unstable" (#562) - Added
DoubleEndedStream::try_rfold
as "unstable" (#562) stream::Once
now implementsDoubleEndedStream
(#562)stream::FromIter
now implementsDoubleEndedStream
(#562)
Changed
- Removed our dependency on
async-macros
, speeding up compilation (#610)
Fixes
- Fixed a link in the task docs (#598)
- Fixed the
UdpSocket::recv
example (#603) - Fixed a link to
task::block_on
(#608) - Fixed an incorrect API mention in
task::Builder
(#612) - Fixed leftover mentions of
futures-preview
(#595) - Fixed a typo in the tutorial (#614)
<TcpStream as Write>::poll_close
now closes the write half of the stream (#618)
1.2.0 - 2019-11-27
This patch includes some minor quality-of-life improvements, introduces a
new Stream::unzip
API, and adds verbose errors to our networking types.
This means if you can't connect to a socket, you'll never have to wonder again which address it was you couldn't connect to, instead of having to go through the motions to debug what the address was.
Example
Unzip a stream of tuples into two collections:
use async_std::prelude::*;
use async_std::stream;
let s = stream::from_iter(vec![(1,2), (3,4)]);
let (left, right): (Vec<_>, Vec<_>) = s.unzip().await;
assert_eq!(left, [1, 3]);
assert_eq!(right, [2, 4]);
Added
- Added
Stream::unzip
as "unstable". - Added verbose errors to the networking types.
Changed
- Enabled CI on master branch.
Future::join
andFuture::try_join
can now join futures with different output types.
Fixed
- Fixed the docs and
Debug
output ofBufWriter
. - Fixed a bug in
Stream::throttle
that made it consume too much CPU.
1.1.0 - 2019-11-21
This patch introduces a faster scheduler algorithm, Stream::throttle
, and
stabilizes task::yield_now
. Additionally we're introducing several more stream
APIs, bringing us to almost complete parity with the standard library.
Furthermore our path
submodule now returns more context in errors. So if
opening a file fails, async-std will tell you which file was failed to open,
making it easier to write and debug programs.
Examples
let start = Instant::now();
let mut s = stream::interval(Duration::from_millis(5))
.throttle(Duration::from_millis(10))
.take(2);
s.next().await;
assert!(start.elapsed().as_millis() >= 5);
s.next().await;
assert!(start.elapsed().as_millis() >= 15);
s.next().await;
assert!(start.elapsed().as_millis() >= 25);
Added
- Added
Stream::throttle
as "unstable". - Added
Stream::count
as "unstable". - Added
Stream::max
as "unstable". - Added
Stream::successors
as "unstable". - Added
Stream::by_ref
as "unstable". - Added
Stream::partition
as "unstable". - Added contextual errors to the
path
submodule. - Added
os::windows::symlink_dir
as "unstable". - Added
os::windows::symlink_file
as "unstable". - Stabilized
task::yield_now
.
Fixes
- We now ignore seek errors when rolling back failed
read
calls onFile
. - Fixed a bug where
Stream::max_by_key
was returning the wrong result. - Fixed a bug where
Stream::min_by_key
was returning the wrong result.
Changed
- Applied various fixes to the tutorial.
- Fixed an issue with Clippy.
- Optimized an internal code generation macro, improving compilation speeds.
- Removed an
Unpin
bound fromstream::Once
. - Removed various extra internal uses of
pin_mut!
. - Simplified
Stream::any
andStream::all
's internals. - The
surf
example is now enabled again. - Tweaked some streams internals.
- Updated
futures-timer
to 2.0.0, improving compilation speed. - Upgraded
async-macros
to 2.0.0. Stream::merge
now uses randomized ordering to reduce overall latency.- The scheduler is now more efficient by keeping a slot for the next task to run. This is similar to Go's scheduler, and Tokio's scheduler.
- Fixed the documentation of the
channel
types to link back to thechannel
function.
1.0.1 - 2019-11-12
We were seeing a regression in our fs performance, caused by too many long-running tasks. This patch fixes that regression by being more proactive about closing down idle threads.
Changes
- Improved thread startup/shutdown algorithm in
task::spawn_blocking
. - Fixed a typo in the tutorial.
1.0.0 - 2019-11-11
This release marks the 1.0.0
release of async-std; a major milestone for our
development. This release itself mostly includes quality of life improvements
for all of modules, including more consistent API bounds for a lot of our
submodules.
The biggest change is that we're now using the full semver range,
major.minor.patch
, and any breaking changes to our "stable" APIs will require
an update of the major
number.
We're excited we've hit this milestone together with you all. Thank you!
Added
- Added
Future::join
as "unstable", replacingfuture::join!
. - Added
Future::try_join
as "unstable", replacingfuture::try_join!
. - Enabled
stable
andbeta
channel testing on CI. - Implemented
FromIterator
andExtend
forPathBuf
. - Implemented
FromStream
forPathBuf
. - Loosened the trait bounds of
io::copy
on "unstable".
Changed
- Added a
Sync
bound toRwLock
, resolving a memory safety issue. - Fixed a bug in
Stream::take_while
where it could continue after it should've ended. - Fixed a bug where our
attributes
Cargo feature wasn't working as intended. - Improved documentation of
Stream::merge
, documenting ordering guarantees. - Update doc imports in examples to prefer async-std's types.
- Various quality of life improvements to the
future
submodule. - Various quality of life improvements to the
path
submodule. - Various quality of life improvements to the
stream
submodule.
Removed
- Removed
future::join!
in favor ofFuture::join
. - Removed
future::try_join!
in favor ofFuture::try_join
.
0.99.12 - 2019-11-07
This patch upgrades us to futures
0.3, support for async/await
on Rust
Stable, performance improvements, and brand new module-level documentation.
Added
- Added
Future::flatten
as "unstable". - Added
Future::race
as "unstable" (replacesfuture::select!
). - Added
Future::try_race
as "unstable" (replacesfuture::try_select!
). - Added
Stderr::lock
as "unstable". - Added
Stdin::lock
as "unstable". - Added
Stdout::lock
as "unstable". - Added
Stream::copied
as "unstable". - Added
Stream::eq
as "unstable". - Added
Stream::max_by_key
as "unstable". - Added
Stream::min
as "unstable". - Added
Stream::ne
as "unstable". - Added
Stream::position
as "unstable". - Added
StreamExt
andFutureExt
as enumerable in theprelude
. - Added
TcpListener
andTcpStream
integration tests. - Added
stream::from_iter
. - Added
sync::WakerSet
for internal use. - Added an example to handle both
IP v4
andIP v6
connections. - Added the
default
Cargo feature. - Added the
attributes
Cargo feature. - Added the
std
Cargo feature.
Changed
- Fixed a bug in the blocking threadpool where it didn't spawn more than one thread.
- Fixed a bug with
Stream::merge
where sometimes it ended too soon. - Fixed a bug with our GitHub actions setup.
- Fixed an issue where our channels could spuriously deadlock.
- Refactored the
task
module. - Removed a deprecated GitHub action.
- Replaced
futures-preview
withfutures
. - Replaced
lazy_static
withonce_cell
. - Replaced all uses of
VecDequeue
in the examples withstream::from_iter
. - Simplified
sync::RwLock
using the internalsync::WakerSet
type. - Updated the
path
submodule documentation to match std. - Updated the mod-level documentation to match std.
Removed
- Removed
future::select!
(replaced byFuture::race
). - Removed
future::try_select!
(replaced byFuture::try_race
).
0.99.11 - 2019-10-29
This patch introduces async_std::sync::channel
, a novel asynchronous port of
the ultra-fast Crossbeam channels. This has been one of the most anticipated
features for async-std, and we're excited to be providing a first version of
this!
In addition to channels, this patch has the regular list of new methods, types, and doc fixes.
Examples
Send and receive items from a channel
// Create a bounded channel with a max-size of 1
let (s, r) = channel(1);
// This call returns immediately because there is enough space in the channel.
s.send(1).await;
task::spawn(async move {
// This call blocks the current task because the channel is full.
// It will be able to complete only after the first message is received.
s.send(2).await;
});
// Receive items from the channel
task::sleep(Duration::from_secs(1)).await;
assert_eq!(r.recv().await, Some(1));
assert_eq!(r.recv().await, Some(2));
Added
- Added
Future::delay
as "unstable" - Added
Stream::flat_map
as "unstable" - Added
Stream::flatten
as "unstable" - Added
Stream::product
as "unstable" - Added
Stream::sum
as "unstable" - Added
Stream::min_by_key
- Added
Stream::max_by
- Added
Stream::timeout
as "unstable" - Added
sync::channel
as "unstable". - Added doc links from instantiated structs to the methods that create them.
- Implemented
Extend
+FromStream
forPathBuf
.
Changed
- Fixed an issue with
block_on
so it works even when nested. - Fixed issues with our Clippy check on CI.
- Replaced our uses of
cfg_if
with our own macros, simplifying the codebase. - Updated the homepage link in
Cargo.toml
to point to async.rs. - Updated the module-level documentation for
stream
andsync
. - Various typos and grammar fixes.
- Removed redundant file flushes, improving the performance of
File
operations
Removed
Nothing was removed in this release.
0.99.10 - 2019-10-16
This patch stabilizes several core concurrency macros, introduces async versions
of Path
and PathBuf
, and adds almost 100 other commits.
Examples
Asynchronously read directories from the filesystem
use async_std::fs;
use async_std::path::Path;
use async_std::prelude::*;
let path = Path::new("/laputa");
let mut dir = fs::read_dir(&path).await.unwrap();
while let Some(entry) = dir.next().await {
if let Ok(entry) = entry {
println!("{:?}", entry.path());
}
}
Cooperatively reschedule the current task on the executor
use async_std::prelude::*;
use async_std::task;
task::spawn(async {
let x = fibonnacci(1000); // Do expensive work
task::yield_now().await; // Allow other tasks to run
x + fibonnacci(100) // Do more work
})
Create an interval stream
use async_std::prelude::*;
use async_std::stream;
use std::time::Duration;
let mut interval = stream::interval(Duration::from_secs(4));
while let Some(_) = interval.next().await {
println!("prints every four seconds");
}
Added
- Added
FutureExt
to theprelude
, allowing us to extendFuture
- Added
Stream::cmp
- Added
Stream::ge
- Added
Stream::last
- Added
Stream::le
- Added
Stream::lt
- Added
Stream::merge
as "unstable", replacingstream::join!
- Added
Stream::partial_cmp
- Added
Stream::take_while
- Added
Stream::try_fold
- Added
future::IntoFuture
as "unstable" - Added
io::BufRead::split
- Added
io::Write::write_fmt
- Added
print!
,println!
,eprint!
,eprintln!
macros as "unstable" - Added
process
as "unstable", re-exporting std types only for now - Added
std::net
re-exports to thenet
submodule - Added
std::path::PathBuf
with all associated methods - Added
std::path::Path
with all associated methods - Added
stream::ExactSizeStream
as "unstable" - Added
stream::FusedStream
as "unstable" - Added
stream::Product
- Added
stream::Sum
- Added
stream::from_fn
- Added
stream::interval
as "unstable" - Added
stream::repeat_with
- Added
task::spawn_blocking
as "unstable", replacingtask::blocking
- Added
task::yield_now
- Added
write!
andwriteln!
macros as "unstable" - Stabilized
future::join!
andfuture::try_join!
- Stabilized
future::timeout
- Stabilized
path
- Stabilized
task::ready!
Changed
- Fixed
BufWriter::into_inner
so it callsflush
before yielding - Refactored
io::BufWriter
internals - Refactored
net::ToSocketAddrs
internals - Removed Travis CI entirely
- Rewrote the README.md
- Stabilized
io::Cursor
- Switched bors over to use GitHub actions
- Updated the
io
documentation to match std'sio
docs - Updated the
task
documentation to match std'sthread
docs
Removed
- Removed the "unstable"
stream::join!
in favor ofStream::merge
- Removed the "unstable"
task::blocking
in favor oftask::spawn_blocking
0.99.9 - 2019-10-08
This patch upgrades our futures-rs
version, allowing us to build on the 1.39
beta. Additionally we've introduced map
and for_each
to Stream
. And we've
added about a dozen new FromStream
implementations for std
types, bringing
us up to par with std's FromIterator
implementations.
And finally we've added a new "unstable" task::blocking
function which can be
used to convert blocking code into async code using a threadpool. We've been
using this internally for a while now to async-std to power our fs
and
net::SocketAddr
implementations. With this patch userland code now finally has
access to this too.
Example
Create a stream of tuples, and collect into a hashmap
let a = stream::once(1u8);
let b = stream::once(0u8);
let s = a.zip(b);
let map: HashMap<u8, u8> = s.collect().await;
assert_eq!(map.get(&1), Some(&0u8));
Spawn a blocking task on a dedicated threadpool
task::blocking(async {
println!("long-running task here");
}).await;
Added
- Added
stream::Stream::map
- Added
stream::Stream::for_each
- Added
stream::Stream::try_for_each
- Added
task::blocking
as "unstable" - Added
FromStream
for allstd::{option, collections, result, string, sync}
types. - Added the
path
submodule as "unstable".
Changed
- Updated
futures-preview
to0.3.0-alpha.19
, allowing us to build onrustc 1.39.0-beta
. - As a consequence of this upgrade, all of our concrete stream implementations
now make use of
Stream::size_hint
to optimize internal allocations. - We now use GitHub Actions through actions-rs, in addition to Travis CI. We intend to fully switch in the near future.
- Fixed a bug introduced in 0.99.6 where Unix Domain Listeners would sometimes become unresponsive.
- Updated our
sync::Barrier
docs to match std. - Updated our
stream::FromStream
docs to match std'sFromIterator
.
0.99.8 - 2019-09-28
Added
- Added README to examples directory.
- Added concurrency documentation to the futures submodule.
- Added
io::Read::take
method. - Added
io::Read::by_ref
method. - Added
io::Read::chain
method.
Changed
- Pin futures-preview to
0.3.0-alpha.18
, to avoid rustc upgrade problems. - Simplified extension traits using a macro.
- Use the
broadcast
module withstd::sync::Mutex
, reducing dependencies.
0.99.7 - 2019-09-26
Added
- Added
future::join
macro as "unstable" - Added
future::select
macro as "unstable" - Added
future::try_join
macro as "unstable" - Added
future::try_select
macro as "unstable" - Added
io::BufWriter
struct - Added
stream::Extend
trait - Added
stream::Stream::chain
method - Added
stream::Stream::filter
method - Added
stream::Stream::inspect
method - Added
stream::Stream::skip_while
method - Added
stream::Stream::skip
method - Added
stream::Stream::step_by
method - Added
sync::Arc
struct from stdlib - Added
sync::Barrier
struct as "unstable" - Added
sync::Weak
struct from stdlib - Added
task::ready
macro as "unstable"
Changed
- Correctly marked the
pin
submodule as "unstable" in the docs - Updated tutorial to have certain functions suffixed with
_loop
io
traits are now re-exports of futures-rs types, allowing them to be implementedstream
traits are now re-exports of futures-rs types, allowing them to be implementedprelude::*
now needs to be in scope for functionsio
andstream
traits to work
0.99.6 - 2019-09-19
Added
- Added
stream::Stream::collect
as "unstable" - Added
stream::Stream::enumerate
- Added
stream::Stream::fuse
- Added
stream::Stream::fold
- Added
stream::Stream::scan
- Added
stream::Stream::zip
- Added
stream::join
macro as "unstable" - Added
stream::DoubleEndedStream
as "unstable" - Added
stream::FromStream
trait as "unstable" - Added
stream::IntoStream
trait as "unstable" - Added
io::Cursor
as "unstable" - Added
io::BufRead::consume
method - Added
io::repeat
- Added
io::Slice
andio::SliceMut
- Added documentation for feature flags
- Added
pin
submodule as "unstable" - Added the ability to
collect
a stream ofResult<T, E>
s into aResult<impl FromStream<T>, E>
Changed
- Refactored the scheduling algorithm of our executor to use work stealing
- Refactored the network driver, removing 400 lines of code
- Removed the
Send
bound fromtask::block_on
- Removed
Unpin
bound fromimpl<T: futures::stream::Stream> Stream for T
0.99.5 - 2019-09-12
Added
- Added tests for
io::timeout
- Added
io::BufRead::fill_buf
, anasync fn
counterpart topoll_fill_buf
- Added
fs::create_dir_all
- Added
future::timeout
, a free function to time out futures after a threshold - Added
io::prelude
- Added
net::ToSocketAddrs
, a non-blocking version of std'sToSocketAddrs
- Added
stream::Stream::all
- Added
stream::Stream::filter_map
- Added
stream::Stream::find_map
- Added
stream::Stream::find
- Added
stream::Stream::min_by
- Added
stream::Stream::nth
Changed
- Polished the text and examples of the tutorial
cargo fmt
on all examples- Simplified internals of
TcpStream::connect_to
- Modularized our CI setup, enabled a rustfmt fallback, and improved caching
- Reduced our dependency on the
futures-rs
crate, improving compilation times - Split
io::Read
,io::Write
,io::BufRead
, andstream::Stream
into multiple files fs::File
now flushes more often to prevent flushes duringseek
- Updated all dependencies
- Fixed a bug in the conversion of
File
into raw handle - Fixed compilation errors on the latest nightly
Removed
0.99.4 - 2019-08-21
Changes
- Many small changes in the book, mostly typos
- Documentation fixes correcting examples
- Now works with recent nightly with stabilised async/await (> 2019-08-21)
0.99.3 - 2019-08-16
- Initial beta release