| # Changelog |
| |
| All notable changes to this project will be documented in this file. |
| |
| The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), |
| and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). |
| |
| # Unreleased |
| |
| - None. |
| |
| # 0.4.13 (June 17, 2022) |
| |
| ### Added |
| |
| - **load_shed**: Public constructor for `Overloaded` error ([#661]) |
| |
| ### Fixed |
| |
| - **util**: Fix hang with `call_all` when the `Stream` of requests is pending |
| ([#656]) |
| - **ready_cache**: Ensure cancelation is observed by pending services ([#668], |
| fixes [#415]) |
| - **docs**: Fix a missing section header due to a typo ([#646]) |
| - **docs**: Fix broken links to `Service` trait ([#659]) |
| |
| |
| [#661]: https://github.com/tower-rs/tower/pull/661 |
| [#656]: https://github.com/tower-rs/tower/pull/656 |
| [#668]: https://github.com/tower-rs/tower/pull/668 |
| [#415]: https://github.com/tower-rs/tower/pull/415 |
| [#646]: https://github.com/tower-rs/tower/pull/646 |
| [#659]: https://github.com/tower-rs/tower/pull/659 |
| |
| # 0.4.12 (February 16, 2022) |
| |
| ### Fixed |
| |
| - **hedge**, **load**, **retry**: Fix use of `Instant` operations that can panic |
| on platforms where `Instant` is not monotonic ([#633]) |
| - Disable `attributes` feature on `tracing` dependency ([#623]) |
| - Remove unused dependencies and dependency features with some feature |
| combinations ([#603], [#602]) |
| - **docs**: Fix a typo in the RustDoc for `Buffer` ([#622]) |
| |
| ### Changed |
| |
| - Updated minimum supported Rust version (MSRV) to 1.49.0. |
| - **hedge**: Updated `hdrhistogram` dependency to v7.0 ([#602]) |
| - Updated `tokio-util` dependency to v0.7 ([#638]) |
| |
| [#633]: https://github.com/tower-rs/tower/pull/633 |
| [#623]: https://github.com/tower-rs/tower/pull/623 |
| [#603]: https://github.com/tower-rs/tower/pull/603 |
| [#602]: https://github.com/tower-rs/tower/pull/602 |
| [#622]: https://github.com/tower-rs/tower/pull/622 |
| [#638]: https://github.com/tower-rs/tower/pull/638 |
| |
| # 0.4.11 (November 18, 2021) |
| |
| ### Added |
| |
| - **util**: Add `BoxCloneService` which is a `Clone + Send` boxed `Service` ([#615]) |
| - **util**: Add `ServiceExt::boxed` and `ServiceExt::boxed_clone` for applying the |
| `BoxService` and `BoxCloneService` middleware ([#616]) |
| - **builder**: Add `ServiceBuilder::boxed` and `ServiceBuilder::boxed_clone` for |
| applying `BoxService` and `BoxCloneService` layers ([#616]) |
| |
| ### Fixed |
| |
| - **util**: Remove redundant `F: Clone` bound from `ServiceExt::map_request` ([#607]) |
| - **util**: Remove unnecessary `Debug` bounds from `impl Debug for BoxService` ([#617]) |
| - **util**: Remove unnecessary `Debug` bounds from `impl Debug for UnsyncBoxService` ([#617]) |
| - **balance**: Remove redundant `Req: Clone` bound from `Clone` impls |
| for `MakeBalance`, and `MakeBalanceLayer` ([#607]) |
| - **balance**: Remove redundant `Req: Debug` bound from `Debug` impls |
| for `MakeBalance`, `MakeFuture`, `Balance`, and `Pool` ([#607]) |
| - **ready-cache**: Remove redundant `Req: Debug` bound from `Debug` impl |
| for `ReadyCache` ([#607]) |
| - **steer**: Remove redundant `Req: Debug` bound from `Debug` impl |
| for `Steer` ([#607]) |
| - **docs**: Fix `doc(cfg(...))` attributes |
| of `PeakEwmaDiscover`, and `PendingRequestsDiscover` ([#610]) |
| |
| [#607]: https://github.com/tower-rs/tower/pull/607 |
| [#610]: https://github.com/tower-rs/tower/pull/610 |
| [#615]: https://github.com/tower-rs/tower/pull/615 |
| [#616]: https://github.com/tower-rs/tower/pull/616 |
| [#617]: https://github.com/tower-rs/tower/pull/617 |
| |
| # 0.4.10 (October 19, 2021) |
| |
| - Fix accidental breaking change when using the |
| `rustdoc::broken_intra_doc_links` lint ([#605]) |
| - Clarify that tower's minimum supported rust version is 1.46 ([#605]) |
| |
| [#605]: https://github.com/tower-rs/tower/pull/605 |
| |
| # 0.4.9 (October 13, 2021) |
| |
| - Migrate to [pin-project-lite] ([#595]) |
| - **builder**: Implement `Layer` for `ServiceBuilder` ([#600]) |
| - **builder**: Add `ServiceBuilder::and_then` analogous to |
| `ServiceExt::and_then` ([#601]) |
| |
| [#600]: https://github.com/tower-rs/tower/pull/600 |
| [#601]: https://github.com/tower-rs/tower/pull/601 |
| [#595]: https://github.com/tower-rs/tower/pull/595 |
| [pin-project-lite]: https://crates.io/crates/pin-project-lite |
| |
| # 0.4.8 (May 28, 2021) |
| |
| - **builder**: Add `ServiceBuilder::map_result` analogous to |
| `ServiceExt::map_result` ([#583]) |
| - **limit**: Add `GlobalConcurrencyLimitLayer` to allow reusing a concurrency |
| limit across multiple services ([#574]) |
| |
| [#574]: https://github.com/tower-rs/tower/pull/574 |
| [#583]: https://github.com/tower-rs/tower/pull/583 |
| |
| # 0.4.7 (April 27, 2021) |
| |
| ### Added |
| |
| - **builder**: Add `ServiceBuilder::check_service` to check the request, |
| response, and error types of the output service. ([#576]) |
| - **builder**: Add `ServiceBuilder::check_service_clone` to check the output |
| service can be cloned. ([#576]) |
| |
| ### Fixed |
| |
| - **spawn_ready**: Abort spawned background tasks when the `SpawnReady` service |
| is dropped, fixing a potential task/resource leak (#[581]) |
| - Fixed broken documentation links ([#578]) |
| |
| [#576]: https://github.com/tower-rs/tower/pull/576 |
| [#578]: https://github.com/tower-rs/tower/pull/578 |
| [#581]: https://github.com/tower-rs/tower/pull/581 |
| |
| # 0.4.6 (February 26, 2021) |
| |
| ### Deprecated |
| |
| - **util**: Deprecated `ServiceExt::ready_and` (renamed to `ServiceExt::ready`). |
| ([#567]) |
| - **util**: Deprecated `ReadyAnd` future (renamed to `Ready`). ([#567]) |
| ### Added |
| |
| - **builder**: Add `ServiceBuilder::layer_fn` to add a layer built from a |
| function. ([#560]) |
| - **builder**: Add `ServiceBuilder::map_future` for transforming the futures |
| produced by a service. ([#559]) |
| - **builder**: Add `ServiceBuilder::service_fn` for applying `Layer`s to an |
| async function using `util::service_fn`. ([#564]) |
| - **util**: Add example for `service_fn`. ([#563]) |
| - **util**: Add `BoxLayer` for creating boxed `Layer` trait objects. ([#569]) |
| |
| [#567]: https://github.com/tower-rs/tower/pull/567 |
| [#560]: https://github.com/tower-rs/tower/pull/560 |
| [#559]: https://github.com/tower-rs/tower/pull/559 |
| [#564]: https://github.com/tower-rs/tower/pull/564 |
| [#563]: https://github.com/tower-rs/tower/pull/563 |
| [#569]: https://github.com/tower-rs/tower/pull/569 |
| |
| # 0.4.5 (February 10, 2021) |
| |
| ### Added |
| |
| - **util**: Add `ServiceExt::map_future`. ([#542]) |
| - **builder**: Add `ServiceBuilder::option_layer` to optionally add a layer. ([#555]) |
| - **make**: Add `Shared` which lets you implement `MakeService` by cloning a |
| service. ([#533]) |
| |
| ### Fixed |
| |
| - **util**: Make combinators that contain closures implement `Debug`. They |
| previously wouldn't since closures never implement `Debug`. ([#552]) |
| - **steer**: Implement `Clone` for `Steer`. ([#554]) |
| - **spawn-ready**: SpawnReady now propagates the current `tracing` span to |
| spawned tasks ([#557]) |
| - Only pull in `tracing` for the features that need it. ([#551]) |
| |
| [#542]: https://github.com/tower-rs/tower/pull/542 |
| [#555]: https://github.com/tower-rs/tower/pull/555 |
| [#557]: https://github.com/tower-rs/tower/pull/557 |
| [#533]: https://github.com/tower-rs/tower/pull/533 |
| [#551]: https://github.com/tower-rs/tower/pull/551 |
| [#554]: https://github.com/tower-rs/tower/pull/554 |
| [#552]: https://github.com/tower-rs/tower/pull/552 |
| |
| # 0.4.4 (January 20, 2021) |
| |
| ### Added |
| |
| - **util**: Implement `Layer` for `Either<A, B>`. ([#531]) |
| - **util**: Implement `Clone` for `FilterLayer`. ([#535]) |
| - **timeout**: Implement `Clone` for `TimeoutLayer`. ([#535]) |
| - **limit**: Implement `Clone` for `RateLimitLayer`. ([#535]) |
| |
| ### Fixed |
| |
| - Added "full" feature which turns on all other features. ([#532]) |
| - **spawn-ready**: Avoid oneshot allocations. ([#538]) |
| |
| [#531]: https://github.com/tower-rs/tower/pull/531 |
| [#532]: https://github.com/tower-rs/tower/pull/532 |
| [#535]: https://github.com/tower-rs/tower/pull/535 |
| [#538]: https://github.com/tower-rs/tower/pull/538 |
| |
| # 0.4.3 (January 13, 2021) |
| |
| ### Added |
| |
| - **filter**: `Filter::check` and `AsyncFilter::check` methods which check a |
| request against the filter's `Predicate` ([#521]) |
| - **filter**: Added `get_ref`, `get_mut`, and `into_inner` methods to `Filter` |
| and `AsyncFilter`, allowing access to the wrapped service ([#522]) |
| - **util**: Added `layer` associated function to `AndThen`, `Then`, |
| `MapRequest`, `MapResponse`, and `MapResult` types. These return a `Layer` |
| that produces middleware of that type, as a convenience to avoid having to |
| import the `Layer` type separately. ([#524]) |
| - **util**: Added missing `Clone` impls to `AndThenLayer`, `MapRequestLayer`, |
| and `MapErrLayer`, when the mapped function implements `Clone` ([#525]) |
| - **util**: Added `FutureService::new` constructor, with less restrictive bounds |
| than the `future_service` free function ([#523]) |
| |
| [#521]: https://github.com/tower-rs/tower/pull/521 |
| [#522]: https://github.com/tower-rs/tower/pull/522 |
| [#523]: https://github.com/tower-rs/tower/pull/523 |
| [#524]: https://github.com/tower-rs/tower/pull/524 |
| [#525]: https://github.com/tower-rs/tower/pull/525 |
| |
| # 0.4.2 (January 11, 2021) |
| |
| ### Added |
| |
| - Export `layer_fn` and `LayerFn` from the `tower::layer` module. ([#516]) |
| |
| ### Fixed |
| |
| - Fix missing `Sync` implementation for `Buffer` and `ConcurrencyLimit` ([#518]) |
| |
| [#518]: https://github.com/tower-rs/tower/pull/518 |
| [#516]: https://github.com/tower-rs/tower/pull/516 |
| |
| # 0.4.1 (January 7, 2021) |
| |
| ### Fixed |
| |
| - Updated `tower-layer` to 0.3.1 to fix broken re-exports. |
| |
| # 0.4.0 (January 7, 2021) |
| |
| This is a major breaking release including a large number of changes. In |
| particular, this release updates `tower` to depend on Tokio 1.0, and moves all |
| middleware into the `tower` crate. In addition, Tower 0.4 reworks several |
| middleware APIs, as well as introducing new ones. |
| |
| This release does *not* change the core `Service` or `Layer` traits, so `tower` |
| 0.4 still depends on `tower-service` 0.3 and `tower-layer` 0.3. This means that |
| `tower` 0.4 is still compatible with libraries that depend on those crates. |
| |
| ### Added |
| |
| - **make**: Added `MakeService::into_service` and `MakeService::as_service` for |
| converting `MakeService`s into `Service`s ([#492]) |
| - **steer**: Added `steer` middleware for routing requests to one of a set of |
| services ([#426]) |
| - **util**: Added `MapRequest` middleware and `ServiceExt::map_request`, for |
| applying a function to a request before passing it to the inner service |
| ([#435]) |
| - **util**: Added `MapResponse` middleware and `ServiceExt::map_response`, for |
| applying a function to the `Response` type of an inner service after its |
| future completes ([#435]) |
| - **util**: Added `MapErr` middleware and `ServiceExt::map_err`, for |
| applying a function to the `Error` returned by an inner service if it fails |
| ([#396]) |
| - **util**: Added `MapResult` middleware and `ServiceExt::map_result`, for |
| applying a function to the `Result` returned by an inner service's future |
| regardless of whether it succeeds or fails ([#499]) |
| - **util**: Added `Then` middleware and `ServiceExt::then`, for chaining another |
| future after an inner service's future completes (with a `Response` or an |
| `Error`) ([#500]) |
| - **util**: Added `AndThen` middleware and `ServiceExt::and_then`, for |
| chaining another future after an inner service's future completes successfully |
| ([#485]) |
| - **util**: Added `layer_fn`, for constructing a `Layer` from a function taking |
| a `Service` and returning a different `Service` ([#491]) |
| - **util**: Added `FutureService`, which implements `Service` for a |
| `Future` whose `Output` type is a `Service` ([#496]) |
| - **util**: Added `BoxService::layer` and `UnsyncBoxService::layer`, to make |
| constructing layers more ergonomic ([#503]) |
| - **layer**: Added `Layer` impl for `&Layer` ([#446]) |
| - **retry**: Added `Retry::get_ref`, `Retry::get_mut`, and `Retry::into_inner` |
| to access the inner service ([#463]) |
| - **timeout**: Added `Timeout::get_ref`, `Timeout::get_mut`, and |
| `Timeout::into_inner` to access the inner service ([#463]) |
| - **buffer**: Added `Clone` and `Copy` impls for `BufferLayer` (#[493]) |
| - Several documentation improvements ([#442], [#444], [#445], [#449], [#487], |
| [#490], [#506]]) |
| |
| ### Changed |
| |
| - All middleware `tower-*` crates were merged into `tower` and placed |
| behind feature flags ([#432]) |
| - Updated Tokio dependency to 1.0 ([#489]) |
| - **builder**: Make `ServiceBuilder::service` take `self` by reference rather |
| than by value ([#504]) |
| - **reconnect**: Return errors from `MakeService` in the response future, rather than |
| in `poll_ready`, allowing the reconnect service to be reused when a reconnect |
| fails ([#386], [#437]) |
| - **discover**: Changed `Discover` to be a sealed trait alias for a |
| `TryStream<Item = Change>`. `Discover` implementations are now written by |
| implementing `Stream`. ([#443]) |
| - **load**: Renamed the `Instrument` trait to `TrackCompletion` ([#445]) |
| - **load**: Renamed `NoInstrument` to `CompleteOnResponse` ([#445]) |
| - **balance**: Renamed `BalanceLayer` to `MakeBalanceLayer` ([#449]) |
| - **balance**: Renamed `BalanceMake` to `MakeBalance` ([#449]) |
| - **ready-cache**: Changed `ready_cache::error::Failed`'s `fmt::Debug` impl to |
| require the key type to also implement `fmt::Debug` ([#467]) |
| - **filter**: Changed `Filter` and `Predicate` to use a synchronous function as |
| a predicate ([#508]) |
| - **filter**: Renamed the previous `Filter` and `Predicate` (where `Predicate`s |
| returned a `Future`) to `AsyncFilter` and `AsyncPredicate` ([#508]) |
| - **filter**: `Predicate`s now take a `Request` type by value and may return a |
| new request, potentially of a different type ([#508]) |
| - **filter**: `Predicate`s may now return an error of any type ([#508]) |
| |
| ### Fixed |
| |
| - **limit**: Fixed an issue where `RateLimit` services do not reset the remaining |
| count when rate limiting ([#438], [#439]) |
| - **util**: Fixed a bug where `oneshot` futures panic if the service does not |
| immediately become ready ([#447]) |
| - **ready-cache**: Fixed `ready_cache::error::Failed` not returning inner error types |
| via `Error::source` ([#467]) |
| - **hedge**: Fixed an interaction with `buffer` where `buffer` slots were |
| eagerly reserved for hedge requests even if they were not sent ([#472]) |
| - **hedge**: Fixed the use of a fixed 10 second bound on the hedge latency |
| histogram resulting on errors with longer-lived requests. The latency |
| histogram now automatically resizes ([#484]) |
| - **buffer**: Fixed an issue where tasks waiting for buffer capacity were not |
| woken when a buffer is dropped, potentially resulting in a task leak ([#480]) |
| |
| ### Removed |
| |
| - Remove `ServiceExt::ready`. |
| - **discover**: Removed `discover::stream` module, since `Discover` is now an |
| alias for `Stream` ([#443]) |
| - **buffer**: Removed `MakeBalance::from_rng`, which caused all balancers to use |
| the same RNG ([#497]) |
| |
| [#432]: https://github.com/tower-rs/tower/pull/432 |
| [#426]: https://github.com/tower-rs/tower/pull/426 |
| [#435]: https://github.com/tower-rs/tower/pull/435 |
| [#499]: https://github.com/tower-rs/tower/pull/499 |
| [#386]: https://github.com/tower-rs/tower/pull/386 |
| [#437]: https://github.com/tower-rs/tower/pull/487 |
| [#438]: https://github.com/tower-rs/tower/pull/438 |
| [#437]: https://github.com/tower-rs/tower/pull/439 |
| [#443]: https://github.com/tower-rs/tower/pull/443 |
| [#442]: https://github.com/tower-rs/tower/pull/442 |
| [#444]: https://github.com/tower-rs/tower/pull/444 |
| [#445]: https://github.com/tower-rs/tower/pull/445 |
| [#446]: https://github.com/tower-rs/tower/pull/446 |
| [#447]: https://github.com/tower-rs/tower/pull/447 |
| [#449]: https://github.com/tower-rs/tower/pull/449 |
| [#463]: https://github.com/tower-rs/tower/pull/463 |
| [#396]: https://github.com/tower-rs/tower/pull/396 |
| [#467]: https://github.com/tower-rs/tower/pull/467 |
| [#472]: https://github.com/tower-rs/tower/pull/472 |
| [#480]: https://github.com/tower-rs/tower/pull/480 |
| [#484]: https://github.com/tower-rs/tower/pull/484 |
| [#489]: https://github.com/tower-rs/tower/pull/489 |
| [#497]: https://github.com/tower-rs/tower/pull/497 |
| [#487]: https://github.com/tower-rs/tower/pull/487 |
| [#493]: https://github.com/tower-rs/tower/pull/493 |
| [#491]: https://github.com/tower-rs/tower/pull/491 |
| [#495]: https://github.com/tower-rs/tower/pull/495 |
| [#503]: https://github.com/tower-rs/tower/pull/503 |
| [#504]: https://github.com/tower-rs/tower/pull/504 |
| [#492]: https://github.com/tower-rs/tower/pull/492 |
| [#500]: https://github.com/tower-rs/tower/pull/500 |
| [#490]: https://github.com/tower-rs/tower/pull/490 |
| [#506]: https://github.com/tower-rs/tower/pull/506 |
| [#508]: https://github.com/tower-rs/tower/pull/508 |
| [#485]: https://github.com/tower-rs/tower/pull/485 |
| |
| # 0.3.1 (January 17, 2020) |
| |
| - Allow opting out of tracing/log (#410). |
| |
| # 0.3.0 (December 19, 2019) |
| |
| - Update all tower based crates to `0.3`. |
| - Update to `tokio 0.2` |
| - Update to `futures 0.3` |
| |
| # 0.3.0-alpha.2 (September 30, 2019) |
| |
| - Move to `futures-*-preview 0.3.0-alpha.19` |
| - Move to `pin-project 0.4` |
| |
| # 0.3.0-alpha.1a (September 13, 2019) |
| |
| - Update `tower-buffer` to `0.3.0-alpha.1b` |
| |
| # 0.3.0-alpha.1 (September 11, 2019) |
| |
| - Move to `std::future` |
| |
| # 0.1.1 (July 19, 2019) |
| |
| - Add `ServiceBuilder::into_inner` |
| |
| # 0.1.0 (April 26, 2019) |
| |
| - Initial release |