Skip to content

Latest commit

 

History

History
1234 lines (697 loc) · 24.6 KB

CHANGELOG.md

File metadata and controls

1234 lines (697 loc) · 24.6 KB

2.5.0 (2024-07-27)

Bug Fixes

  • Better handle in flight frames on io loop termination.

2.4.0 (2024-07-16)

Bug Fixes

  • Prevent basic_publish hangs in some rare corner case

2.3.4 (2024-05-01)

Features

  • Allow closing Acker and checking if already used

Bug Fixes

  • Close connection to server in case of missing heartbeat

2.3.3 (2024-04-24)

Misc

  • Dependencies update

2.3.2 (2024-04-23)

Bug Fixes

  • Don't allow trying to close an already closed connection
  • Make sure heartbeats are no longer sent after a connection error

2.3.1 (2023-07-14)

Misc

  • Simplify channels cleanup logic on connection close

2.3.0 (2023-07-14)

Bug Fixes

  • Fix an error when finalizing the connection close duz to missing channel 0.
  • Properly cleanup heartbeat sending when connection hit an error.

2.2.1 (2023-05-19)

Bug Fixes

  • Don't call the channel error hook when we get closed with a non error code

2.2.0 (2023-05-19)

Features

  • Introduce Channel::on_error

2.1.3 (2023-05-19)

Bug Fixes

  • Don't propagate the same error twice

2.1.2 (2023-05-18)

Bug Fixes

  • Fix memory leak on connection failure

2.1.1 (2022-04-08)

Bug Fixes

  • Fix potential race condition on connection error

2.1.0 (2022-03-23)

Bug Fixes

  • Fix potential race condition on connection opening

2.0.3 (2022-02-25)

Misc

  • Update amq-protocol

2.0.2 (2022-02-23)

Bug Fixes

  • Fix some potential hang with rustls

2.0.1 (2022-02-08)

Misc

  • Update README

2.0.0 (2022-02-02)

Misc

  • Make most of the API based on async fns
  • Update to amq-protocol 7.0
  • Reworked connector
  • Dropped third-party reactors/executors integration
  • New third-party reactors integration through reactor-trait
  • New third-party executors integration through executor-trait
  • Misc internal cleanups
  • Default reactor to async-io
  • Switch from log to tracing
  • Make most internals use async rust
  • Switch to edition 2021
  • Default to rustls for TLS handling
  • basic_publish no longer takes ownership of the data
  • Dropped Clone impl where it didn't make sense
  • Acker is now public

1.10.0 (2022-01-30)

Bug Fixes

  • Fix potential panic on shutdown

1.9.0 (2021-11-23)

Bug Fixes

  • Fix handling of RabbitMQ replies when they arrive unordered

1.8.1 (2021-11-12)

Misc

  • Logging updates

1.8.0 (2021-08-22)

Misc

  • Update to nom 7

1.7.1 (2021-05-06)

Bug Fixes

  • Fix handling of unresponsive servers

1.7.0 (2021-04-16)

Bug Fixes

  • Fix handling of soft errors

1.6.9 (2021-04-08)

Bug Fixes

  • Fix hang in Acker when acking twice (which is invalid)

1.6.8 (2021-02-18)

Misc

  • Simplify acknowledgements internal handling
  • Logging updates

1.6.7 (2021-02-17)

Misc

  • Logging updates

1.6.6 (2020-12-25)

Bug Fixes

  • Fix an issue with automatic connection close on drop

1.6.5 (2020-12-23)

Bug Fixes

  • Treat close and error as success for consumers cancel as it forcibly implies cancelation

1.6.4 (2020-12-23)

Bug Fixes

  • Cleanup basic cancel handling
  • Fix undocumented rabbitmq behaviour on channel close with expected replies

1.6.3 (2020-12-23)

Bug Fixes

  • Better handling of automatic consumer cancelation when connection is closing

1.6.2 (2020-12-23)

Bug Fixes

  • Fix a potential race condition when automatically canceling consumer on drop

1.6.1 (2020-11-28)

Bug Fixes

  • Flush more often onto socket

1.6.0 (2020-11-21)

Features

  • Introduce Connection::topology to get a serializable representation of the declared queues and consumers
  • Introduce Connection::restore to redeclare the things listed in a Topology
  • Introduce Delivery::acker as a simpler way to ack/nack/reject deliveries
  • Delivery can be dereferenced as Acker to directly be able to ack/nack/reject
  • BasicGetMessage and BasicReturnMessage can be dereferenced as Delivery

1.5.0 (2020-10-31)

Misc

  • Update to amq-protocol 6.0.1

1.4.3 (2020-10-26)

Misc

  • Port examples to async-global-executor

1.4.2 (2020-10-16)

Misc

  • Update dependencies

1.4.1 (2020-10-06)

Bug Fixes

  • When converting Consumer to an Iterator, don't cancel it until the Iterator is gone

1.4.0 (2020-10-04)

Bug Fixes

  • When dropping a Consumer, cancel it if it has no delegates

1.3.1 (2020-10-04)

Bug Fixes

  • Fix potential leak due to consumer clone

1.3.0 (2020-10-04)

Bug Fixes

  • When dropping a Channel, wait for all its consumers to be canceled before closing it

Misc

  • Use proper non_exhaustive annotation for error enum

1.2.8 (2020-09-25)

Misc

  • Update async-task

1.2.7 (2020-09-18)

Bug Fixes

  • Make frame ordering more robust

1.2.6 (2020-09-18)

Bug Fixes

  • Fix a bug in the frame ordering when doing lots of publishing

1.2.5 (2020-09-18)

Misc

  • Update pinky-swear

1.2.4 (2020-09-17)

Bug Fixes

  • Fix a memory leak in publishers confirm

1.2.3 (2020-09-02)

Bug Fixes

  • Fix an issue when redeclaring a queue

1.2.2 (2020-08-21)

Misc

  • Improve logging on connection error

1.2.1 (2020-06-26)

Features

  • Introduce bastion-amqp to use the bastion executor instead of the default one

Bug Fixes

  • Properly wait for plain stream to be connected on windows

1.2.0 (2020-06-25)

Misc

  • Update amq-protocol

1.1.3 (2020-06-23)

Misc

  • Update dependencies

1.1.2 (2020-06-18)

Features

  • Add BasicReturnMessage::error

1.1.1 (2020-06-17)

Bug Fixes

  • Properly handle recycling channels ids when we reached the channel limit
  • Fix receiving returned messages from the AMQP server

1.1.0 (2020-06-09)

Features

  • Make codegen optional

1.0.2 (2020-06-04)

Bug Fixes

  • update amq-protocol

1.0.1 (2020-06-02)

Bug Fixes

  • DefaultExecutor cleanups

1.0.0 (2020-05-27)

Features

  • Introduce tokio-amqp to use the tokio executor instead of the default one
  • Introduce async-amqp to use the async-std executor instead of the default one
  • Introduce lapinou to use the smol executor instead of the default one
  • New default Reactor
  • Reactor is now configurable
  • Using self-signed certificates is now easie with connect_with_config
  • Channel gets closed once the last reference is dropped
  • Connection gets closed once the last reference and the last Channel are dropped
  • Consumer::tag gives you access to the consumer's tag

Breaking changes

  • The auth mechanism is now configured using a query parameter in the AMQPUri
  • The executor trait is now made to handle futures. (e.g. Box::pin(async move {}))
  • ConsumerDelegate is now built with futures.
  • The number of threads used by the default executor is now configured using ConnectionProperties::with_default_executor
  • Connection no longer implements Clone
  • Connection::connect has been reworked to properly handle mid handshake TLS streams
  • CloseOnDrop is now gone
  • DeliveryResult now also carries the corresponding Channel

Bug Fixes

  • Follow the specifications in being stricter about receiving invalid frames
  • Don't consider interrupted IO signals as failures
  • Threads are correctly cleaned up

Misc

  • Better Debug implementations
  • Internals cleanup
  • Use vectored io when applicable

0.39.7 (2020-04-17)

Bug Fixes

  • Error handling fixes

0.39.6 (2020-04-17)

Bug Fixes

  • IoLoop error handling fixes

0.39.5 (2020-04-17)

Bug Fixes

  • Fix a hang with rustls flush

0.39.4 (2020-04-17)

Bug Fixes

  • Fix some edge cases issues with the internal buffer

0.39.3 (2020-04-17)

Bug Fixes

  • Fix some issues with openssl
  • Flush socket for rustls

0.39.2 (2020-04-16)

Bug Fixes

  • Work around a bug in mio where we sometimes wouldn't receive a readable notification for the socket

0.39.1 (2020-04-14)

Bug Fixes

  • Fix overflow with high heartbeats
  • Properly report connection errors

0.39.0 (2020-04-08)

Breaking changes

  • Connection::on_error and Consumer::set_delegate no longer require a Box
  • Connection::on_error now accept a FnMut
  • Update to pinky-swear 4.0.0

0.38.4 (2020-04-07)

Bug Fixes

  • Don't queue extraneous heartbeats if we cannot write to socket

0.38.4 (2020-04-07)

Bug Fixes

  • Refuse invalid incoming frames
  • Don't send heartbeats unless necessary

Misc

  • Drop the heartbeat thread

0.38.3 (2020-04-06)

Bug Fixes

  • Fix the way we schedule heartbeats to be sent

0.38.2 (2020-04-06)

Bug Fixes

  • Properly put the Conneciton in Error state when we get closed with protocol error

0.38.1 (2020-04-06)

Bug Fixes

  • Don't panic when CloseOnDrop tries to close an already closed Connection

Misc

  • Use vectored IO when appropriate when writing to socket

0.38.0 (2020-04-05)

Bug Fixes

  • Wait until a frame has been fully sent before notifying sender
  • Properly handle Basic.Return when channel is not in confirm mode
  • Fix handling of publisher-confirms ack with returned message
  • Fix handling of publisher-confirms nack without returned message

Breaking changes

  • Confirmation::Nack now carries an Option<Box<BasicReturnMessage>>
  • Confirmation::Ack now carries an Option<Box<BasicReturnMessage>>

0.37.1 (2020-04-04)

Bug Fixes

  • Prevent a issue when hitting EWOULDBLOCK mid-frame with no other frame queued

0.37.0 (2020-04-03)

Features

  • Connection and Channel can be moved out of CloseOnDrop using into_inner()
  • We now add a marker to promises when trace logging is enabled to make debugging easier

Breaking changes

  • Update to pinky-swear 3.0.0 (properly handle chaining result promises)
  • Confirmation can no longer hold an error
  • PublisherConfirm now returns a proper Result<Confirmation>
  • Connecting now returns a CloseOnDrop<Connection>
  • Creating a channel now returns a CloseOnDrop<Channel>
  • PinkySwear is now hidden from the public API

0.36.2 (2020-04-02)

Features

  • Add a new CloseOnDrop wrapper for automatically closing Connection or Channel when dropped.

Bug Fixes

  • Properly send errors to publisher confirms awaiters on channel close

0.36.1 (2020-04-02)

Bug Fixes

  • Properly forward errors to publisher confirms awaiters

0.36.0 (2020-04-02)

Bug Fixes

  • Track the frame-sending promise before the response one for syncrhonous methods

Breaking changes

  • The bugfix induces some changes in the return values of some method. Shouldn't change anything.

0.35.2 (2020-04-02)

Bug Fixes

  • Properly report error in one internal place

0.35.1 (2020-04-02)

Bug Fixes

  • Update pinky-swear to 2.1.0 to avoid any sync op on main thread

0.35.0 (2020-04-01)

Breaking changes

  • Update to pinky-swear 2.0.0 (shoudln't change much)
  • Publisher Confirms integration has been reworked:
    • basic_publish now gives you a PinkySwear<Result<PublisherConfirm>>
    • If you didn't enable publisher confirms using confirm_select, you can ignore it
    • If you drop the PublisherConfirm it will behave as before and you'll need to call wait_for_confirms
    • You can use the PublisherConfirm to wait for this particular Confirmation (Ack/Nack(BasicReturnMEssage))

Bug Fixes

  • Detect errors in some edge scenarii

0.34.1 (2020-04-01)

Bug Fixes

  • Fix a bug when receiving basic-return before basic-nack

0.34.0 (2020-03-24)

Breaking changes

  • The Connect trait has been simplified
  • The futures feature doesn't exist anymore (always enabled)
  • The lapin-futures (0.1 futures compat) has been dropped

Misc

  • Examples ported to async/await

0.33.2 (2020-03-23)

Bug Fixes

  • Fix nom dependency

0.33.1 (2020-03-18)

Bug Fixes

  • Fix hang on macos

0.33.0 (2020-03-12)

Breaking changes

  • Some more Error reworks
  • Port to amq-protocol 5.0 and mio 0.7
  • Deprecate lapin-futures

0.32.5 (2020-03-09)

Bug Fixes

  • Prevent lapin-futures from eating memory when eagerly polled

0.32.4 (2020-03-09)

Bug Fixes

  • Followup to 0.32.3 for consumers in lapin-futures

0.32.3 (2020-03-09)

Bug Fixes

  • Fix waking up context when a future gets sent to another one

0.32.2 (2020-03-05)

Bug Fixes

  • Fix race condition in Channel::close

0.32.1 (2020-03-03)

Bug Fixes

  • Fix Channel and Connection status in some cases

0.32.0 (2020-02-27)

Bug Fixes

  • Properly handle critical error when reading from socket on first connection

Breaking changes

  • Error::ConnectionRefused is replaced by the proper underlying ProtocolError or IOError

Features

  • DefaultExecutor::default() is now public

0.31.0 (2020-02-25)

Bug Fixes

  • Receiving consumer or basic get deliveries on queue we didn't declare now works properly

Breaking changes

  • Channel::basic_consume now takes an &str instead of a &Queue as its first parameter

Features

  • impl From<_> for AMQPValue

0.30.1 (2020-02-25)

Features

  • New rustls-native-certs feature

0.30.0 (2020-02-25)

Breaking changes

  • Error enum has been cleaned up
  • ErrorHandler now takes the Error as a param

Bug Fixes

  • Better error handling and forwarding

0.29.2 (2020-02-25)

Bug Fixes

  • Fix PartialEq for Error

0.29.1 (2020-02-24)

Bug Fixes

  • Ensure we properly write everything when we need to split contents

0.29.0 (2020-02-24)

Breaking changes

  • Switch the return types to pinky-swear (the API remains mostly the same)

Features

  • Error is now Clonable

Bug Fixes

  • Better error handling and bubbling in lots of cases
  • Properly handle soft errors

0.28.4 (2019-12-03)

Bug Fixes

  • Fix some error handling in consumers

0.28.3 (2019-11-21)

Features

  • Export ConsumerIterator

0.28.2 (2019-11-07)

Features

  • Update dependencies

0.28.1 (20191023)

Bug Fixes

  • Fix some race conditions in the publisher confirms implementation

0.28.0 (20190927)

Breaking changes

  • Channel::exchange_declare now takes an ExchangeKind parameter instead of an &str

0.27.2 (2019-11-07)

Features

  • Update dependencies

0.27.1 (2019-09-26)

Bug Fixes

  • Warn on unused Confirmation
  • Avoid Mutex around consumer delegate to enable proper multithreading

0.27.0 (2019-09-25)

Breaking changes

  • Updated amq-protocol to 3.0.0
  • Channel::connection_[,un}blocked is now Connection::{,un}block
  • failure as been replaced with std::error::Error usage
  • Confirmation::as_error has been removed
  • Consumers API has been cleaned up, everything is now a DeliveryResult
  • IoLoop::run is now IoLoop::start

Features

  • Add support for update_secret for oauth2 authentication module
  • Add support for TLS "identity" (client certificate)
  • Consumer can now be used as an Iterator<Item = Delivery>
  • Consumer::set_delegate now accepts a closure parameter
  • Add lapin::Result

0.26.11 (2019-09-17)

Bug Fixes

  • Update amq-protocol to fix amqps handling

0.26.10 (2019-09-11)

Bug Fixes

  • Fix error handling during early connection stage
  • Properly forward errors to consumer delegates

0.26.9 (2019-08-26)

Bug Fixes

  • IoLoop fixes under heavy loads

0.26.8 (2019-08-26)

Bug Fixes

  • IoLoop fixes under heavy loads

0.26.7 (2019-08-23)

Bug Fixes

  • Make Connection::connector and IoLoop:run public

0.26.6 (2019-08-15)

Bug Fixes

  • Better handle multiple channel publishing under heavy load

0.26.5 (2019-08-14)

Bug Fixes

  • Fix retrying of basic_publish frames

0.26.4 (2019-08-14)

Bug Fixes

  • Rework how basic_publish is handled internally to ensure concurrent usages work as expected

0.26.3 (2019-08-12)

Bug Fixes

  • Do not hang on tasks that require an answer in case of channel error

0.26.2 (2019-08-12)

Bug Fixes

  • Fixes some frames ordering when using concurrent basic_publish under heavy load

0.26.1 (2019-08-09)

Bug Fixes

  • Properly broadcast channel error to all pending tasks/futures

0.26.0 (2019-08-08)

Bug Fixes

  • Fix unblocking connection
  • Properly broadcast connection error to all pending tasks/futures

Breaking changes

  • Unused IoLoopError has been dropped

0.25.0 (2019-07-12)

Bug Fixes

  • Consumer streams now properly forward connection errors

Breaking changes

  • lapin's consumer stream now returns a Result

Features

  • ConsumerDelegate now has a on_error hook

0.24.1 (2019-07-11)

Bug Fixes

  • Properly handle network disconnections on OSX

0.24.0 (2019-07-04)

Bug Fixes

  • Connection::close no longer hangs
  • ConsumerDelegate no longer requires fmt::Debug

Breaking changes

  • ConsumerDelegate methods have been renamed for clarity and only on_new_delivery is now mandatory

0.23.0 (2019-06-21)

Breaking changes

  • lapin-async as been renamed to lapin
  • lapin: Instead of passing a Box<dyn ConsumerSubscriber> as a parameter to basic_consume, you must now call set_delegate(Box<dyn ConsumerDelegate>) on the returned Consumer

Features

  • lapin has experimental support for futures-0.3 + std::future::Future through its futures feature

0.22.0 (2019-06-20)

Features

  • you can now select the TLS implementation used for amqps or disable amqps support

Bug Fixes

  • vhosts are properly handled again
  • we now properly wait for the return message when last ack is a nack for publishers confirm

Breaking changes

  • wait_for_confirms() is now async (needs to be awaited)

0.21.3 (2019-06-18)

Bug Fixes

  • More work around connection failures, properly report those as errors
  • Add a way to register a connection error handler

0.21.2 (2019-06-17)

Bug Fixes

  • Properly handle connection failures

0.21.1 (2019-06-16)

Features

  • async
    • Connection::run to keep the program running when there is nothing left to downgraded but consume new messages

Bug Fixes

  • io_loop correctly exists once connection is no longer connected

0.21.0 (2019-06-14)

Breaking changes

  • Some internal methods are no longer public (channel and connection handling)
  • Rework how we close channels and connection

0.20.0 (2019-06-14)

Breaking changes

  • Drop duplicate Credentials param from connect, use the credentials from the AMQPUri.

0.19.0 (2019-06-14)

Features

  • All of AMQP methods and auth mechanisms are now supported

Bug Fixes

  • Better consumers handling
  • Misc code cleanup and modernization
  • AMQP is now fully supported, no more crahs on unexpected frames

Breaking changes

  • Method options are now generated. Hardcoded fields from AMQP omitted. Options are shared between async and futures
  • The way we handle publisher_confirm has changed. You now need to call confirm_select explicitly, and then wait_for_confirms to wait for all pending confirmations
  • async
    • Methods are now on the Channel object which is now returned instead of channel_id by create_channel
    • Methods are now generated from protocol specifications
    • Methods return a Confirmation that can be awaited
    • ShortString and LongString are now concrete types (!= String), which can be created from &str or String using into()
    • Connection::connect has been rewritten
  • futures
    • Port to the new lapin-async
    • Client::connect has been rewritten

0.18.0 (2019-03-03)

Bug Fixes

  • Better delivery_tag handling
  • Adapt our behaviour wrt ack/nack to be specifications-compliant
  • We now pass several additional information to the server when connecting, such as capabilities

Breaking changes

  • Connect now takes an additional ConnectionProperties for better configuration

Features

  • Better logging when channel gets closed by server
  • Support receiving BasicCancel from the server

0.17.0 (2019-02-15)

Bug Fixes

  • Drop prefetched messages when specific arguments are passed to basic_{,n}ack or basic_cancel

Housekeeping

  • Drop sasl dependency, avoiding linkage to LGPL-3 licensed code

0.16.0 (2019-02-01)

Housekeeping

  • Switch to edition 2018
  • Switch to parking_lot Mutex

Breaking changes

  • futures
    • Drop now unused mutex poisoning error

0.15.0 (2018-12-05)

Housekeeping

  • Update amq-protocol

Breaking Changes

  • async:
    • Introduce a new Error type, replacing occurrences of io::Error in public APIs (#145)
  • futures:
    • Introduce a new Error type, replacing occurrences of io::Error in public APIs (#145)

0.14.1 (2018-11-16)

Housekeeping

  • Update env_logger
  • Drop unused build.rs from async

Bug Fixes

  • Fix heartbeat interval

0.14.0 (2018-10-17)

Housekeeping

  • Update amq-protocol dependency
  • Reexport amq_protocol::uri

0.13.0 (2018-07-09)

Features

  • futures:
    • basic_ack and basic_nack API now support passing the multiple flag
    • Port to the new tokio-codec crate
    • The object returned by queue_declare now holds the messages count and the consumers count too

Bug Fixes

  • Fully rework how consumers are handled internally, should be way more robust now
  • Heartbeats are now preemptive and are successfully sent even under heavy load

Breaking Changes

  • Port to nom 4
  • async: some fields got their visibility downgraded to private as part of the consumers rework
  • futures:
    • We now use impl trait and thus require rust 1.26.0 or greater
    • basic_publish payload is now a Vec<u8>

0.12.0 (2018-06-05)

Features

  • Implement channel_close_ok
  • Slightly rework consumers internal handling
  • futures:
    • Allow cancelling the Heartbeat future
    • Implement flow methods

Bug Fixes

  • Fix bad expectation for empty payloads
  • Fix heartbeat when configured value is 0
  • Fix channel overflow when channel_max is low
  • futures:
    • Ensure tasks aren't dropped when we hit Async::NotReady but queued for re-poll instead
    • Correctly handle mutex poisoning
    • Use generated consumer tag and queue name when an empty one is provided
    • Fix Sink implementation on AMQPTransport

Breaking Changes

  • futures:
    • Port to tokio
    • Update to tokio-timer 0.2
    • queue_declare now return a Queue object
    • basic_consume now expects a Queue object to ensure you've called queue_declare first

0.11.1 (2018-04-12)

Bug Fixes

  • futures: Get back to tokio-timer 0.1

0.11.0 (2018-04-08)

Features

  • implement basic_qos
  • futures:
    • Implement basic_nack
    • Implement queue_unbind
    • Mark all futures as Send to ease tokio integration

Bug Fixes

  • futures: Get back to tokio-timer 0.1

Breaking Changes

  • Message is now Delivery, differentiate from BasicGetMessage
  • futures:
    • Port to tokio-timer 0.2
    • Prefer handle.spawn to thread::new for the heartbeat

0.10.0 (2017-07-13)

Bug Fixes

  • Rework how the futures API is handled internally
  • Rework client-server parameters negotiation at connection

Breaking Changes

  • futures:
    • create_confirm_channel now take a ConfirmSelectOptions
    • Run heartbeat in a separated thread (delegate thread creation to user)
    • Return a heartbeat creation closure alongside the client

0.9.0 (2017-06-19)

Features

  • Implement access methods
  • async:
    • Make errors more specific
    • Do the frame_max negotiation with the server
  • futures:
    • Implement missing exchange methods

Breaking Changes

  • futures: Rework the basic_publish API

0.8.2 (2017-05-04)

Bug Fixes

  • Update amq-protocol

0.8.1 (2017-05-04)

Bug Fixes

  • Better error handling

0.8.0 (2017-04-13)

Features

  • futures: Implement Channel::close

Bug Fixes

  • Polling improvements
  • Better error handling

0.7.0 (2017-04-10)

Features

  • Implement exchange_declare
  • futures:
    • Implement queue_bind
    • Implement queue_delete

0.6.0 (2017-03-30)

Features

  • Allow choosing the vhost

0.5.0 (2017-03-28)

Bug Fixes

  • Update sasl to 0.4 (removes the openssl dependency)

0.4.0 (2017-03-28)

Features

  • Implement confirm_select
  • async:
    • Add support for BasicProperties
    • Implement receive_basic_ack
    • Implement receive_basic_nack
  • futures:
    • Implement confirm channel
    • Implement heartbeat

0.3.0 (2017-03-25)

Features

  • Chunking of message bodies

Breaking Changes

  • futures: Add options for API methods missing them

0.2.0 (2017-03-20)

Features

  • Initial release