Compare commits

..

No commits in common. "master" and "bytestring-v1.4.0" have entirely different histories.

67 changed files with 284 additions and 3405 deletions

View File

@ -1,8 +0,0 @@
version: "0.2"
words:
- actix
- addrs
- mptcp
- nonblocking
- oneshot
- rustup

View File

@ -1,12 +1,10 @@
## PR Type
<!-- What kind of change does this PR make? -->
<!-- Bug Fix / Feature / Refactor / Code Style / Other -->
INSERT_PR_TYPE
## PR Checklist
## PR Checklist
Check your PR fulfills the following:
<!-- For draft PRs check the boxes as you complete them. -->
@ -16,10 +14,11 @@ Check your PR fulfills the following:
- [ ] A changelog entry has been made for the appropriate packages.
- [ ] Format code with the latest stable rustfmt
## Overview
## Overview
<!-- Describe the current and new behavior. -->
<!-- Emphasize any breaking changes. -->
<!-- If this PR fixes or closes an issue, reference it here. -->
<!-- Closes #000 -->

View File

@ -8,4 +8,3 @@ updates:
directory: /
schedule:
interval: weekly
versioning-strategy: lockfile-only

View File

@ -47,7 +47,7 @@ jobs:
- name: Install nasm
if: matrix.target.os == 'windows-latest'
uses: ilammy/setup-nasm@v1.5.2
uses: ilammy/setup-nasm@v1.5.1
- name: Install OpenSSL
if: matrix.target.os == 'windows-latest'
@ -59,12 +59,12 @@ jobs:
echo "RUSTFLAGS=-C target-feature=+crt-static" >> $GITHUB_ENV
- name: Install Rust (${{ matrix.version }})
uses: actions-rust-lang/setup-rust-toolchain@v1.13.0
uses: actions-rust-lang/setup-rust-toolchain@v1.10.1
with:
toolchain: ${{ matrix.version }}
- name: Install just, cargo-hack, cargo-nextest, cargo-ci-cache-clean
uses: taiki-e/install-action@v2.55.1
uses: taiki-e/install-action@v2.44.71
with:
tool: just,cargo-hack,cargo-nextest,cargo-ci-cache-clean
@ -116,14 +116,31 @@ jobs:
- uses: actions/checkout@v4
- name: Install Rust (nightly)
uses: actions-rust-lang/setup-rust-toolchain@v1.13.0
uses: actions-rust-lang/setup-rust-toolchain@v1.10.1
with:
toolchain: nightly
- name: Install cargo-hack & cargo-minimal-versions
uses: taiki-e/install-action@v2.55.1
uses: taiki-e/install-action@v2.44.71
with:
tool: cargo-hack,cargo-minimal-versions
- name: Check With Minimal Versions
run: cargo minimal-versions check
nextest:
name: nextest
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1.10.1
- name: Install cargo-nextest
uses: taiki-e/install-action@v2.44.71
with:
tool: cargo-nextest
- name: Test with cargo-nextest
run: cargo nextest run

View File

@ -53,10 +53,10 @@ jobs:
- name: Setup mold linker
if: matrix.target.os == 'ubuntu-latest'
uses: rui314/setup-mold@v1
- name: Install nasm
if: matrix.target.os == 'windows-latest'
uses: ilammy/setup-nasm@v1.5.2
uses: ilammy/setup-nasm@v1.5.1
- name: Install OpenSSL
if: matrix.target.os == 'windows-latest'
@ -68,12 +68,12 @@ jobs:
echo "RUSTFLAGS=-C target-feature=+crt-static" >> $GITHUB_ENV
- name: Install Rust (${{ matrix.version.name }})
uses: actions-rust-lang/setup-rust-toolchain@v1.13.0
uses: actions-rust-lang/setup-rust-toolchain@v1.10.1
with:
toolchain: ${{ matrix.version.version }}
- name: Install just, cargo-hack, cargo-nextest, cargo-ci-cache-clean
uses: taiki-e/install-action@v2.55.1
uses: taiki-e/install-action@v2.44.71
with:
tool: just,cargo-hack,cargo-nextest,cargo-ci-cache-clean
@ -120,12 +120,12 @@ jobs:
- uses: actions/checkout@v4
- name: Install Rust (nightly)
uses: actions-rust-lang/setup-rust-toolchain@v1.13.0
uses: actions-rust-lang/setup-rust-toolchain@v1.10.1
with:
toolchain: nightly
- name: Install just
uses: taiki-e/install-action@v2.55.1
uses: taiki-e/install-action@v2.44.71
with:
tool: just

View File

@ -18,12 +18,12 @@ jobs:
- uses: actions/checkout@v4
- name: Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1.13.0
uses: actions-rust-lang/setup-rust-toolchain@v1.10.1
with:
components: llvm-tools-preview
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@v2.55.1
uses: taiki-e/install-action@v2.44.71
with:
tool: cargo-llvm-cov
@ -31,7 +31,7 @@ jobs:
run: cargo llvm-cov --workspace --all-features --codecov --output-path codecov.json
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5.4.3
uses: codecov/codecov-action@v5.0.2
with:
files: codecov.json
fail_ci_if_error: true

View File

@ -18,7 +18,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: actions-rust-lang/setup-rust-toolchain@v1.13.0
- uses: actions-rust-lang/setup-rust-toolchain@v1.10.1
with:
toolchain: nightly
components: rustfmt
@ -35,7 +35,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: actions-rust-lang/setup-rust-toolchain@v1.13.0
- uses: actions-rust-lang/setup-rust-toolchain@v1.10.1
with: { components: clippy }
- uses: giraffate/clippy-action@v1.0.1
@ -51,19 +51,47 @@ jobs:
- uses: actions/checkout@v4
- name: Install Rust (${{ vars.RUST_VERSION_EXTERNAL_TYPES }})
uses: actions-rust-lang/setup-rust-toolchain@v1.13.0
uses: actions-rust-lang/setup-rust-toolchain@v1.10.1
with:
toolchain: ${{ vars.RUST_VERSION_EXTERNAL_TYPES }}
- name: Install just
uses: taiki-e/install-action@v2.55.1
uses: taiki-e/install-action@v2.44.71
with:
tool: just
- name: Install cargo-check-external-types
uses: taiki-e/cache-cargo-install-action@v2.2.0
uses: taiki-e/cache-cargo-install-action@v2.0.1
with:
tool: cargo-check-external-types
- name: check external types
run: just check-external-types-all +${{ vars.RUST_VERSION_EXTERNAL_TYPES }}
public-api-diff:
name: Public API Diff
runs-on: ubuntu-latest
steps:
- name: Checkout main branch
uses: actions/checkout@v4
with:
ref: ${{ github.base_ref }}
- name: Checkout PR branch
uses: actions/checkout@v4
- name: Install Rust (${{ vars.RUST_VERSION_API_DIFF }})
uses: actions-rust-lang/setup-rust-toolchain@v1.8.0
with:
toolchain: ${{ vars.RUST_VERSION_API_DIFF }}
- name: Install cargo-public-api
uses: taiki-e/install-action@v2.34.0
with:
tool: cargo-public-api
- name: Generate API diff
run: |
for f in $(find -mindepth 2 -maxdepth 2 -name Cargo.toml); do
cargo public-api --manifest-path "$f" --simplified diff ${{ github.event.pull_request.base.sha }}..${{ github.sha }}
done

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
Cargo.lock
target/
guide/build/
/gh-pages

View File

@ -1,29 +0,0 @@
exclude = ["target/*"]
include = ["**/*.toml"]
[formatting]
column_width = 110
[[rule]]
include = ["**/Cargo.toml"]
keys = [
"dependencies",
"*-dependencies",
"workspace.dependencies",
"workspace.*-dependencies",
"target.*.dependencies",
"target.*.*-dependencies",
]
formatting.reorder_keys = true
[[rule]]
include = ["**/Cargo.toml"]
keys = [
"dependencies.*",
"*-dependencies.*",
"workspace.dependencies.*",
"workspace.*-dependencies.*",
"target.*.dependencies",
"target.*.*-dependencies",
]
formatting.reorder_keys = false

2979
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -17,7 +17,7 @@ members = [
[workspace.package]
license = "MIT OR Apache-2.0"
edition = "2021"
rust-version = "1.74"
rust-version = "1.71.1"
[patch.crates-io]
actix-codec = { path = "actix-codec" }
@ -36,9 +36,3 @@ local-waker = { path = "local-waker" }
lto = true
opt-level = 3
codegen-units = 1
[workspace.lints.rust]
rust_2018_idioms = "deny"
nonstandard-style = "deny"
future_incompatible = "deny"
missing_docs = { level = "warn", priority = -1 }

View File

@ -3,7 +3,7 @@
> A collection of lower-level libraries for composable network services.
[![CI](https://github.com/actix/actix-net/actions/workflows/ci.yml/badge.svg?event=push&style=flat-square)](https://github.com/actix/actix-net/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/actix/actix-net/graph/badge.svg?token=8rKIZKtLLm)](https://codecov.io/gh/actix/actix-net)
[![codecov](https://codecov.io/gh/actix/actix-net/branch/master/graph/badge.svg)](https://codecov.io/gh/actix/actix-net)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)
[![Dependency Status](https://deps.rs/repo/github/actix/actix-net/status.svg)](https://deps.rs/repo/github/actix/actix-net)

View File

@ -2,7 +2,7 @@
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.74.
- Minimum supported Rust version (MSRV) is now 1.71.
## 0.5.2

View File

@ -1,7 +1,10 @@
[package]
name = "actix-codec"
version = "0.5.2"
authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "Codec utilities for working with framed protocols"
keywords = ["network", "framework", "async", "futures"]
repository = "https://github.com/actix/actix-net"
@ -11,7 +14,13 @@ edition.workspace = true
rust-version.workspace = true
[package.metadata.cargo_check_external_types]
allowed_external_types = ["bytes::*", "futures_core::*", "futures_sink::*", "tokio::*", "tokio_util::*"]
allowed_external_types = [
"bytes::*",
"futures_core::*",
"futures_sink::*",
"tokio::*",
"tokio_util::*",
]
[dependencies]
bitflags = "2"
@ -20,7 +29,7 @@ futures-core = { version = "0.3.7", default-features = false }
futures-sink = { version = "0.3.7", default-features = false }
memchr = "2.3"
pin-project-lite = "0.2"
tokio = "1.44.2"
tokio = "1.23.1"
tokio-util = { version = "0.7", features = ["codec", "io"] }
tracing = { version = "0.1.30", default-features = false, features = ["log"] }
@ -31,6 +40,3 @@ tokio-test = "0.4.2"
[[bench]]
name = "lines"
harness = false
[lints]
workspace = true

View File

@ -1,5 +1,3 @@
#![allow(missing_docs)]
use bytes::BytesMut;
use criterion::{criterion_group, criterion_main, Criterion};

View File

@ -6,6 +6,8 @@
//! [`Sink`]: futures_sink::Sink
//! [`Stream`]: futures_core::Stream
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]

View File

@ -1,5 +1,3 @@
#![allow(missing_docs)]
use std::{
collections::VecDeque,
io::{self, Write},

View File

@ -2,7 +2,7 @@
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.74.
- Minimum supported Rust version (MSRV) is now 1.71.
## 0.2.4

View File

@ -2,9 +2,9 @@
name = "actix-macros"
version = "0.2.4"
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Ibraheem Ahmed <ibrah1440@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
"Nikolay Kim <fafhrd91@gmail.com>",
"Ibraheem Ahmed <ibrah1440@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "Macros for Actix system and runtime"
repository = "https://github.com/actix/actix-net"
@ -15,7 +15,7 @@ rust-version.workspace = true
[package.metadata.cargo-machete]
ignored = [
"proc_macro2", # specified for minimal versions compat
"proc_macro2", # specified for minimal versions compat
]
[lib]
@ -34,6 +34,3 @@ actix-rt = "2"
futures-util = { version = "0.3.17", default-features = false }
rustversion-msrv = "0.100"
trybuild = "1"
[lints]
workspace = true

View File

@ -8,6 +8,8 @@
//! # Tests
//! See docs for the [`#[test]`](macro@test) macro.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]

View File

@ -1,5 +1,3 @@
#![allow(missing_docs)]
#[rustversion_msrv::msrv]
#[test]
fn compile_macros() {

View File

@ -2,7 +2,7 @@
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.74.
- Minimum supported Rust version (MSRV) is now 1.71.
## 2.10.0

View File

@ -1,7 +1,10 @@
[package]
name = "actix-rt"
version = "2.10.0"
authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "Tokio-based single-threaded async runtime for the Actix ecosystem"
keywords = ["async", "futures", "io", "runtime"]
homepage = "https://actix.rs"
@ -12,7 +15,10 @@ edition.workspace = true
rust-version.workspace = true
[package.metadata.cargo_check_external_types]
allowed_external_types = ["actix_macros::*", "tokio::*"]
allowed_external_types = [
"actix_macros::*",
"tokio::*",
]
[features]
default = ["macros"]
@ -23,14 +29,11 @@ io-uring = ["tokio-uring"]
actix-macros = { version = "0.2.3", optional = true }
futures-core = { version = "0.3", default-features = false }
tokio = { version = "1.44.2", features = ["rt", "net", "parking_lot", "signal", "sync", "time"] }
tokio = { version = "1.23.1", features = ["rt", "net", "parking_lot", "signal", "sync", "time"] }
# runtime for `io-uring` feature
[target.'cfg(target_os = "linux")'.dependencies]
tokio-uring = { version = "0.5", optional = true }
[dev-dependencies]
tokio = { version = "1.44.2", features = ["full"] }
[lints]
workspace = true
tokio = { version = "1.23.1", features = ["full"] }

View File

@ -41,6 +41,8 @@
//! Note that there are currently some unimplemented parts of using `actix-rt` with `io-uring`.
//! In particular, when running a `System`, only `System::block_on` is supported.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
#![allow(clippy::type_complexity)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]

View File

@ -187,7 +187,10 @@ impl SystemRunner {
match exit_code {
0 => Ok(()),
nonzero => Err(io::Error::other(format!("Non-zero exit code: {}", nonzero))),
nonzero => Err(io::Error::new(
io::ErrorKind::Other,
format!("Non-zero exit code: {}", nonzero),
)),
}
}
@ -196,7 +199,8 @@ impl SystemRunner {
let SystemRunner { rt, stop_rx, .. } = self;
// run loop
rt.block_on(stop_rx).map_err(io::Error::other)
rt.block_on(stop_rx)
.map_err(|err| io::Error::new(io::ErrorKind::Other, err))
}
/// Retrieves a reference to the underlying [Actix runtime](crate::Runtime) associated with this

View File

@ -1,5 +1,3 @@
#![allow(missing_docs)]
use std::{
future::Future,
time::{Duration, Instant},

View File

@ -2,14 +2,6 @@
## Unreleased
## 2.6.0
- Add `ServerBuilder::shutdown_signal()` method.
- Minimum supported Rust version (MSRV) is now 1.74.
## 2.5.1
- Fix panic in test server.
- Minimum supported Rust version (MSRV) is now 1.71.
## 2.5.0

View File

@ -1,10 +1,10 @@
[package]
name = "actix-server"
version = "2.6.0"
version = "2.5.0"
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
"Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com>",
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
"Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com>",
]
description = "General purpose TCP server built for the Actix ecosystem"
keywords = ["network", "tcp", "server", "framework", "async"]
@ -16,7 +16,9 @@ edition.workspace = true
rust-version.workspace = true
[package.metadata.cargo_check_external_types]
allowed_external_types = ["tokio::*"]
allowed_external_types = [
"tokio::*",
]
[features]
default = []
@ -26,11 +28,12 @@ io-uring = ["tokio-uring", "actix-rt/io-uring"]
actix-rt = { version = "2.10", default-features = false }
actix-service = "2"
actix-utils = "3"
futures-core = { version = "0.3.17", default-features = false, features = ["alloc"] }
futures-util = { version = "0.3.17", default-features = false, features = ["alloc"] }
mio = { version = "1", features = ["os-poll", "net"] }
socket2 = "0.5"
tokio = { version = "1.44.2", features = ["sync"] }
tokio = { version = "1.23.1", features = ["sync"] }
tracing = { version = "0.1.30", default-features = false, features = ["log"] }
# runtime for `io-uring` feature
@ -42,12 +45,6 @@ actix-codec = "0.5"
actix-rt = "2.8"
bytes = "1"
futures-util = { version = "0.3.17", default-features = false, features = ["sink", "async-await-macro"] }
pretty_env_logger = "0.5"
static_assertions = "1"
tokio = { version = "1.44.2", features = ["io-util", "rt-multi-thread", "macros", "fs", "time"] }
tokio-util = "0.7"
tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }
[lints]
workspace = true
futures-util = { version = "0.3.17", default-features = false, features = ["sink", "async-await-macro"] }
tokio = { version = "1.23.1", features = ["io-util", "rt-multi-thread", "macros", "fs"] }

View File

@ -5,11 +5,11 @@
<!-- prettier-ignore-start -->
[![crates.io](https://img.shields.io/crates/v/actix-server?label=latest)](https://crates.io/crates/actix-server)
[![Documentation](https://docs.rs/actix-server/badge.svg?version=2.6.0)](https://docs.rs/actix-server/2.6.0)
[![Documentation](https://docs.rs/actix-server/badge.svg?version=2.5.0)](https://docs.rs/actix-server/2.5.0)
[![Version](https://img.shields.io/badge/rustc-1.52+-ab6000.svg)](https://blog.rust-lang.org/2021/05/06/Rust-1.52.0.html)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-server.svg)
<br />
[![Dependency Status](https://deps.rs/crate/actix-server/2.6.0/status.svg)](https://deps.rs/crate/actix-server/2.6.0)
[![Dependency Status](https://deps.rs/crate/actix-server/2.5.0/status.svg)](https://deps.rs/crate/actix-server/2.5.0)
![Download](https://img.shields.io/crates/d/actix-server.svg)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)

View File

@ -8,8 +8,6 @@
//!
//! Follow the prompt and enter a file path, relative or absolute.
#![allow(missing_docs)]
use std::io;
use actix_codec::{Framed, LinesCodec};

View File

@ -1,51 +0,0 @@
//! Demonstrates use of the `ServerBuilder::shutdown_signal` method using `tokio-util`s
//! `CancellationToken` helper using a nonsensical timer. In practice, this cancellation token would
//! be wired throughout your application and typically triggered by OS signals elsewhere.
use std::{io, time::Duration};
use actix_rt::net::TcpStream;
use actix_server::Server;
use actix_service::fn_service;
use tokio_util::sync::CancellationToken;
use tracing::level_filters::LevelFilter;
use tracing_subscriber::{prelude::*, EnvFilter};
async fn run(stop_signal: CancellationToken) -> io::Result<()> {
tracing_subscriber::registry()
.with(tracing_subscriber::fmt::layer())
.with(
EnvFilter::builder()
.with_default_directive(LevelFilter::INFO.into())
.from_env_lossy(),
)
.init();
let addr = ("127.0.0.1", 8080);
tracing::info!("starting server on port: {}", &addr.0);
Server::build()
.bind("shutdown-signal", addr, || {
fn_service(|_stream: TcpStream| async { Ok::<_, io::Error>(()) })
})?
.shutdown_signal(stop_signal.cancelled_owned())
.workers(2)
.run()
.await
}
#[tokio::main]
async fn main() -> io::Result<()> {
let stop_signal = CancellationToken::new();
tokio::spawn({
let stop_signal = stop_signal.clone();
async move {
tokio::time::sleep(Duration::from_secs(10)).await;
stop_signal.cancel();
}
});
run(stop_signal).await?;
Ok(())
}

View File

@ -76,7 +76,7 @@ impl Accept {
let accept_handle = thread::Builder::new()
.name("actix-server acceptor".to_owned())
.spawn(move || accept.poll_with(&mut sockets))
.map_err(io::Error::other)?;
.map_err(|err| io::Error::new(io::ErrorKind::Other, err))?;
Ok((waker_queue, handles_server, accept_handle))
}

View File

@ -1,7 +1,6 @@
use std::{future::Future, io, num::NonZeroUsize, time::Duration};
use std::{io, num::NonZeroUsize, time::Duration};
use actix_rt::net::TcpStream;
use futures_core::future::BoxFuture;
use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender};
use crate::{
@ -40,7 +39,6 @@ pub struct ServerBuilder {
pub(crate) mptcp: MpTcp,
pub(crate) exit: bool,
pub(crate) listen_os_signals: bool,
pub(crate) shutdown_signal: Option<BoxFuture<'static, ()>>,
pub(crate) cmd_tx: UnboundedSender<ServerCommand>,
pub(crate) cmd_rx: UnboundedReceiver<ServerCommand>,
pub(crate) worker_config: ServerWorkerConfig,
@ -66,7 +64,6 @@ impl ServerBuilder {
mptcp: MpTcp::Disabled,
exit: false,
listen_os_signals: true,
shutdown_signal: None,
cmd_tx,
cmd_rx,
worker_config: ServerWorkerConfig::default(),
@ -173,41 +170,6 @@ impl ServerBuilder {
self
}
/// Specify shutdown signal from a future.
///
/// Using this method will prevent OS signal handlers being set up.
///
/// Typically, a `CancellationToken` will be used, but any future _can_ be.
///
/// # Examples
///
/// ```
/// # use std::io;
/// # use tokio::net::TcpStream;
/// # use actix_server::Server;
/// # async fn run() -> io::Result<()> {
/// use actix_service::fn_service;
/// use tokio_util::sync::CancellationToken;
///
/// let stop_signal = CancellationToken::new();
///
/// Server::build()
/// .bind("shutdown-signal", "127.0.0.1:12345", || {
/// fn_service(|_stream: TcpStream| async { Ok::<_, io::Error>(()) })
/// })?
/// .shutdown_signal(stop_signal.cancelled_owned())
/// .run()
/// .await
/// # }
/// ```
pub fn shutdown_signal<Fut>(mut self, shutdown_signal: Fut) -> Self
where
Fut: Future<Output = ()> + Send + 'static,
{
self.shutdown_signal = Some(Box::pin(shutdown_signal));
self
}
/// Timeout for graceful workers shutdown in seconds.
///
/// After receiving a stop signal, workers have this much time to finish serving requests.
@ -408,6 +370,9 @@ pub(super) fn bind_addr<S: ToSocketAddrs>(
} else if let Some(err) = opt_err.take() {
Err(err)
} else {
Err(io::Error::other("Can not bind to address."))
Err(io::Error::new(
io::ErrorKind::Other,
"Can not bind to address.",
))
}
}

View File

@ -1,5 +1,7 @@
//! General purpose TCP server.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]

View File

@ -18,7 +18,7 @@ use crate::{
builder::ServerBuilder,
join_all::join_all,
service::InternalServiceFactory,
signals::{OsSignals, SignalKind, StopSignal},
signals::{SignalKind, Signals},
waker_queue::{WakerInterest, WakerQueue},
worker::{ServerWorker, ServerWorkerConfig, WorkerHandleServer},
ServerHandle,
@ -210,12 +210,7 @@ impl ServerInner {
let (waker_queue, worker_handles, accept_handle) = Accept::start(sockets, &builder)?;
let mux = ServerEventMultiplexer {
signal_fut: builder.shutdown_signal.map(StopSignal::Cancel).or_else(|| {
builder
.listen_os_signals
.then(OsSignals::new)
.map(StopSignal::Os)
}),
signal_fut: (builder.listen_os_signals).then(Signals::new),
cmd_rx: builder.cmd_rx,
};
@ -320,16 +315,7 @@ impl ServerInner {
fn map_signal(signal: SignalKind) -> ServerCommand {
match signal {
SignalKind::Cancel => {
info!("Cancellation token/channel received; starting graceful shutdown");
ServerCommand::Stop {
graceful: true,
completion: None,
force_system_stop: true,
}
}
SignalKind::OsInt => {
SignalKind::Int => {
info!("SIGINT received; starting forced shutdown");
ServerCommand::Stop {
graceful: false,
@ -338,7 +324,7 @@ impl ServerInner {
}
}
SignalKind::OsTerm => {
SignalKind::Term => {
info!("SIGTERM received; starting graceful shutdown");
ServerCommand::Stop {
graceful: true,
@ -347,7 +333,7 @@ impl ServerInner {
}
}
SignalKind::OsQuit => {
SignalKind::Quit => {
info!("SIGQUIT received; starting forced shutdown");
ServerCommand::Stop {
graceful: false,
@ -361,7 +347,7 @@ impl ServerInner {
struct ServerEventMultiplexer {
cmd_rx: UnboundedReceiver<ServerCommand>,
signal_fut: Option<StopSignal>,
signal_fut: Option<Signals>,
}
impl Stream for ServerEventMultiplexer {

View File

@ -1,11 +1,10 @@
use std::{
fmt,
future::Future,
pin::{pin, Pin},
pin::Pin,
task::{Context, Poll},
};
use futures_core::future::BoxFuture;
use tracing::trace;
/// Types of process signals.
@ -13,51 +12,28 @@ use tracing::trace;
#[derive(Debug, Clone, Copy, PartialEq)]
#[allow(dead_code)] // variants are never constructed on non-unix
pub(crate) enum SignalKind {
/// Cancellation token or channel.
Cancel,
/// `SIGINT`
Int,
/// OS `SIGINT`.
OsInt,
/// `SIGTERM`
Term,
/// OS `SIGTERM`.
OsTerm,
/// OS `SIGQUIT`.
OsQuit,
/// `SIGQUIT`
Quit,
}
impl fmt::Display for SignalKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(match self {
SignalKind::Cancel => "Cancellation token or channel",
SignalKind::OsInt => "SIGINT",
SignalKind::OsTerm => "SIGTERM",
SignalKind::OsQuit => "SIGQUIT",
SignalKind::Int => "SIGINT",
SignalKind::Term => "SIGTERM",
SignalKind::Quit => "SIGQUIT",
})
}
}
pub(crate) enum StopSignal {
/// OS signal handling is configured.
Os(OsSignals),
/// Cancellation token or channel.
Cancel(BoxFuture<'static, ()>),
}
impl Future for StopSignal {
type Output = SignalKind;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
match self.get_mut() {
StopSignal::Os(os_signals) => pin!(os_signals).poll(cx),
StopSignal::Cancel(cancel) => pin!(cancel).poll(cx).map(|()| SignalKind::Cancel),
}
}
}
/// Process signal listener.
pub(crate) struct OsSignals {
pub(crate) struct Signals {
#[cfg(not(unix))]
signals: futures_core::future::BoxFuture<'static, std::io::Result<()>>,
@ -65,14 +41,14 @@ pub(crate) struct OsSignals {
signals: Vec<(SignalKind, actix_rt::signal::unix::Signal)>,
}
impl OsSignals {
impl Signals {
/// Constructs an OS signal listening future.
pub(crate) fn new() -> Self {
trace!("setting up OS signal listener");
#[cfg(not(unix))]
{
OsSignals {
Signals {
signals: Box::pin(actix_rt::signal::ctrl_c()),
}
}
@ -82,9 +58,9 @@ impl OsSignals {
use actix_rt::signal::unix;
let sig_map = [
(unix::SignalKind::interrupt(), SignalKind::OsInt),
(unix::SignalKind::terminate(), SignalKind::OsTerm),
(unix::SignalKind::quit(), SignalKind::OsQuit),
(unix::SignalKind::interrupt(), SignalKind::Int),
(unix::SignalKind::terminate(), SignalKind::Term),
(unix::SignalKind::quit(), SignalKind::Quit),
];
let signals = sig_map
@ -103,18 +79,18 @@ impl OsSignals {
})
.collect::<Vec<_>>();
OsSignals { signals }
Signals { signals }
}
}
}
impl Future for OsSignals {
impl Future for Signals {
type Output = SignalKind;
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
#[cfg(not(unix))]
{
self.signals.as_mut().poll(cx).map(|_| SignalKind::OsInt)
self.signals.as_mut().poll(cx).map(|_| SignalKind::Int)
}
#[cfg(unix)]
@ -130,10 +106,3 @@ impl Future for OsSignals {
}
}
}
#[cfg(test)]
mod tests {
use super::*;
static_assertions::assert_impl_all!(StopSignal: Send, Unpin);
}

View File

@ -160,7 +160,6 @@ pub enum MioStream {
/// Helper trait for converting a Mio stream into a Tokio stream.
pub trait FromStream: Sized {
/// Creates stream from a `mio` stream.
fn from_mio(sock: MioStream) -> io::Result<Self>;
}

View File

@ -123,9 +123,7 @@ impl TestServerHandle {
/// Connect to server, returning a Tokio `TcpStream`.
pub fn connect(&self) -> io::Result<TcpStream> {
let stream = net::TcpStream::connect(self.addr)?;
stream.set_nonblocking(true)?;
TcpStream::from_std(stream)
TcpStream::from_std(net::TcpStream::connect(self.addr)?)
}
}

View File

@ -341,10 +341,11 @@ impl ServerWorker {
Ok((token, svc)) => services.push((idx, token, svc)),
Err(err) => {
error!("can not start worker: {err:?}");
return Err(io::Error::other(format!(
"can not start server service {idx}",
)));
error!("can not start worker: {:?}", err);
return Err(io::Error::new(
io::ErrorKind::Other,
format!("can not start server service {}", idx),
));
}
}
}
@ -439,12 +440,13 @@ impl ServerWorker {
Ok((token, svc)) => services.push((idx, token, svc)),
Err(err) => {
error!("can not start worker: {err:?}");
error!("can not start worker: {:?}", err);
Arbiter::current().stop();
factory_tx
.send(Err(io::Error::other(format!(
"can not start server service {idx}",
))))
.send(Err(io::Error::new(
io::ErrorKind::Other,
format!("can not start server service {}", idx),
)))
.unwrap();
return;
}

View File

@ -1,4 +1,4 @@
#![allow(clippy::let_underscore_future, missing_docs)]
#![allow(clippy::let_underscore_future)]
use std::{
net,

View File

@ -1,5 +1,3 @@
#![allow(missing_docs)]
use std::net;
use actix_rt::net::TcpStream;
@ -71,7 +69,5 @@ async fn new_with_builder() {
srv.connect().unwrap();
// connect to alt service defined in custom ServerBuilder
let stream = net::TcpStream::connect(alt_addr).unwrap();
stream.set_nonblocking(true).unwrap();
TcpStream::from_std(stream).unwrap();
TcpStream::from_std(net::TcpStream::connect(alt_addr).unwrap()).unwrap();
}

View File

@ -2,10 +2,6 @@
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.74.
## 2.0.3
- Minimum supported Rust version (MSRV) is now 1.71.
## 2.0.2

View File

@ -1,7 +1,10 @@
[package]
name = "actix-service"
version = "2.0.3"
authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
version = "2.0.2"
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "Service trait and combinators for representing asynchronous request/response operations."
keywords = ["network", "framework", "async", "futures", "service"]
categories = ["network-programming", "asynchronous", "no-std"]
@ -12,12 +15,10 @@ rust-version.workspace = true
[dependencies]
futures-core = { version = "0.3.17", default-features = false }
paste = "1"
pin-project-lite = "0.2"
[dev-dependencies]
actix-rt = "2"
actix-utils = "3"
futures-util = { version = "0.3.17", default-features = false }
[lints]
workspace = true

View File

@ -3,10 +3,10 @@
> Service trait and combinators for representing asynchronous request/response operations.
[![crates.io](https://img.shields.io/crates/v/actix-service?label=latest)](https://crates.io/crates/actix-service)
[![Documentation](https://docs.rs/actix-service/badge.svg?version=2.0.3)](https://docs.rs/actix-service/2.0.3)
[![Documentation](https://docs.rs/actix-service/badge.svg?version=2.0.2)](https://docs.rs/actix-service/2.0.2)
[![Version](https://img.shields.io/badge/rustc-1.46+-ab6000.svg)](https://blog.rust-lang.org/2020/03/12/Rust-1.46.html)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-service.svg)
[![Dependency Status](https://deps.rs/crate/actix-service/2.0.3/status.svg)](https://deps.rs/crate/actix-service/2.0.3)
[![Dependency Status](https://deps.rs/crate/actix-service/2.0.2/status.svg)](https://deps.rs/crate/actix-service/2.0.2)
![Download](https://img.shields.io/crates/d/actix-service.svg)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)

View File

@ -1,5 +1,3 @@
#![allow(missing_docs)]
use std::{future::Future, sync::mpsc, time::Duration};
async fn oracle<F, Fut>(f: F) -> (u32, u32)

View File

@ -3,38 +3,36 @@
use alloc::{boxed::Box, rc::Rc};
use core::{future::Future, pin::Pin};
use paste::paste;
use crate::{Service, ServiceFactory};
/// A boxed future with no send bound or lifetime parameters.
pub type BoxFuture<T> = Pin<Box<dyn Future<Output = T>>>;
/// Type alias for service trait object using [`Box`].
pub type BoxService<Req, Res, Err> =
Box<dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>>;
macro_rules! service_object {
($name: ident, $type: tt, $fn_name: ident) => {
paste! {
#[doc = "Type alias for service trait object using `" $type "`."]
pub type $name<Req, Res, Err> = $type<
dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>,
>;
/// Wraps service as a trait object using [`BoxService`].
pub fn service<S, Req>(service: S) -> BoxService<Req, S::Response, S::Error>
where
S: Service<Req> + 'static,
Req: 'static,
S::Future: 'static,
{
Box::new(ServiceWrapper::new(service))
#[doc = "Wraps service as a trait object using [`" $name "`]."]
pub fn $fn_name<S, Req>(service: S) -> $name<Req, S::Response, S::Error>
where
S: Service<Req> + 'static,
Req: 'static,
S::Future: 'static,
{
$type::new(ServiceWrapper::new(service))
}
}
};
}
/// Type alias for service trait object using [`Rc`].
pub type RcService<Req, Res, Err> =
Rc<dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>>;
/// Wraps service as a trait object using [`RcService`].
pub fn rc_service<S, Req>(service: S) -> RcService<Req, S::Response, S::Error>
where
S: Service<Req> + 'static,
Req: 'static,
S::Future: 'static,
{
Rc::new(ServiceWrapper::new(service))
}
service_object!(BoxService, Box, service);
service_object!(RcService, Rc, rc_service);
struct ServiceWrapper<S> {
inner: S,

View File

@ -1,6 +1,8 @@
//! See [`Service`] docs for information on this crate's foundational trait.
#![no_std]
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
#![allow(clippy::type_complexity)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]

View File

@ -1,4 +1,4 @@
//! When MSRV is 1.82, replace with `core::future::Ready` and `core::future::ready()`.
//! When MSRV is 1.48, replace with `core::future::Ready` and `core::future::ready()`.
use core::{
future::Future,

View File

@ -2,7 +2,7 @@
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.74.
- Minimum supported Rust version (MSRV) is now 1.71.
## 3.4.0

View File

@ -1,7 +1,10 @@
[package]
name = "actix-tls"
version = "3.4.0"
authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "TLS acceptor and connector services for Actix ecosystem"
keywords = ["network", "tls", "ssl", "async", "transport"]
repository = "https://github.com/actix/actix-net.git"
@ -15,12 +18,17 @@ all-features = true
rustdoc-args = ["--cfg", "docsrs"]
[package.metadata.cargo_check_external_types]
allowed_external_types = ["actix_service::*", "actix_utils::*", "futures_core::*", "tokio::*"]
allowed_external_types = [
"actix_service::*",
"actix_utils::*",
"futures_core::*",
"tokio::*",
]
[package.metadata.cargo-machete]
ignored = [
"rustls_021", # specified to force version with add_trust_anchors method
"rustls_webpki_0101", # specified to force secure version
"rustls_021", # specified to force version with add_trust_anchors method
"rustls_webpki_0101", # specified to force secure version
]
[features]
@ -68,10 +76,11 @@ uri = ["dep:http-0_2", "dep:http-1"]
actix-rt = { version = "2.2", default-features = false }
actix-service = "2"
actix-utils = "3"
futures-core = { version = "0.3.7", default-features = false, features = ["alloc"] }
impl-more = "0.1"
pin-project-lite = "0.2.7"
tokio = "1.44.2"
tokio = "1.23.1"
tokio-util = "0.7"
tracing = { version = "0.1.30", default-features = false, features = ["log"] }
@ -111,7 +120,7 @@ rustls-native-certs-07 = { package = "rustls-native-certs", version = "0.7", opt
tokio-native-tls = { version = "0.3", optional = true }
[target.'cfg(any())'.dependencies]
rustls-021 = { package = "rustls", version = "0.21.6", optional = true } # force version with add_trust_anchors method
rustls-021 = { package = "rustls", version = "0.21.6", optional = true } # force version with add_trust_anchors method
rustls-webpki-0101 = { package = "rustls-webpki", version = "0.101.4", optional = true } # force secure version
[dev-dependencies]
@ -119,9 +128,9 @@ actix-codec = "0.5"
actix-rt = "2.2"
actix-server = "2"
bytes = "1"
futures-util = { version = "0.3.17", default-features = false, features = ["sink"] }
itertools = "0.14"
pretty_env_logger = "0.5"
futures-util = { version = "0.3.17", default-features = false, features = ["sink"] }
itertools = "0.13"
rcgen = "0.13"
rustls-pemfile = "2"
tokio-rustls-026 = { package = "tokio-rustls", version = "0.26" }
@ -130,6 +139,3 @@ trust-dns-resolver = "0.23"
[[example]]
name = "accept-rustls"
required-features = ["accept", "rustls-0_23"]
[lints]
workspace = true

View File

@ -1,5 +1,7 @@
//! TLS acceptor and connector services for the Actix ecosystem.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]

View File

@ -1,4 +1,3 @@
#![allow(missing_docs)]
#![cfg(feature = "connect")]
use std::{

View File

@ -1,4 +1,3 @@
#![allow(missing_docs)]
#![cfg(feature = "connect")]
use std::{

View File

@ -2,7 +2,7 @@
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.74.
- Minimum supported Rust version (MSRV) is now 1.71.
## 0.1.0

View File

@ -13,17 +13,20 @@ edition.workspace = true
rust-version.workspace = true
[package.metadata.cargo_check_external_types]
allowed_external_types = ["actix_service::*", "actix_utils::*", "tracing::*", "tracing_futures::*"]
allowed_external_types = [
"actix_service::*",
"actix_utils::*",
"tracing::*",
"tracing_futures::*",
]
[dependencies]
actix-service = "2"
actix-utils = "3"
tracing = "0.1.35"
tracing-futures = "0.2"
[dev-dependencies]
actix-rt = "2"
slab = "0.4"
[lints]
workspace = true

View File

@ -1,5 +1,7 @@
//! Actix tracing - support for tokio tracing with Actix services.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
@ -20,7 +22,6 @@ pub struct TracingService<S, F> {
}
impl<S, F> TracingService<S, F> {
/// Constructs new tracing middleware.
pub fn new(inner: S, make_span: F) -> Self {
TracingService { inner, make_span }
}
@ -62,7 +63,6 @@ pub struct TracingTransform<S, U, F> {
}
impl<S, U, F> TracingTransform<S, U, F> {
/// Constructs new tracing middleware.
pub fn new(make_span: F) -> Self {
TracingTransform {
make_span,

View File

@ -2,7 +2,7 @@
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.74.
- Minimum supported Rust version (MSRV) is now 1.71.
## 3.0.1

View File

@ -1,7 +1,10 @@
[package]
name = "actix-utils"
version = "3.0.1"
authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
description = "Various utilities used in the Actix ecosystem"
keywords = ["network", "framework", "async", "futures"]
categories = ["network-programming", "asynchronous"]
@ -11,13 +14,10 @@ edition.workspace = true
rust-version.workspace = true
[dependencies]
local-waker = "0.1"
pin-project-lite = "0.2"
local-waker = "0.1"
[dev-dependencies]
actix-rt = "2"
futures-util = { version = "0.3.17", default-features = false }
static_assertions = "1.1"
[lints]
workspace = true

View File

@ -1,5 +1,7 @@
//! Various utilities used in the Actix ecosystem.
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]

View File

@ -2,8 +2,6 @@
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.74.
## 1.4.0
- Add `ByteString::split_at()` method.

View File

@ -2,7 +2,10 @@
name = "bytestring"
version = "1.4.0"
description = "A UTF-8 encoded read-only string using `Bytes` as storage"
authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
keywords = ["string", "bytes", "utf8", "web", "bytestring"]
categories = ["no-std", "web-programming"]
homepage = "https://actix.rs"
@ -12,7 +15,10 @@ edition.workspace = true
rust-version.workspace = true
[package.metadata.cargo_check_external_types]
allowed_external_types = ["bytes::*", "serde::*"]
allowed_external_types = [
"bytes::*",
"serde::*",
]
[dependencies]
bytes = { version = "1.2", default-features = false }
@ -22,6 +28,3 @@ serde = { version = "1", optional = true }
ahash = { version = "0.8", default-features = false }
serde_json = "1"
static_assertions = "1.1"
[lints]
workspace = true

View File

@ -3,6 +3,8 @@
//! See docs for [`ByteString`].
#![no_std]
#![deny(rust_2018_idioms, nonstandard_style)]
#![warn(future_incompatible, missing_docs)]
extern crate alloc;

View File

@ -1,8 +1,6 @@
_list:
@just --list
toolchain := ""
# Check project.
check: && clippy
just --unstable --fmt --check
@ -20,14 +18,10 @@ fmt:
fd --type=file --hidden -e=toml --exec-batch taplo format
cargo +nightly fmt
# Downgrade dependencies necessary to run MSRV checks/tests.
# Downgrade dev-dependencies necessary to run MSRV checks/tests.
[private]
downgrade-for-msrv:
cargo {{ toolchain }} update -p=native-tls --precise=0.2.13 # next ver: 1.80.0
cargo {{ toolchain }} update -p=idna_adapter --precise=1.2.0 # next ver: 1.82.0
cargo {{ toolchain }} update -p=litemap --precise=0.7.4 # next ver: 1.81.0
cargo {{ toolchain }} update -p=zerofrom --precise=0.1.5 # next ver: 1.81.0
cargo {{ toolchain }} update -p=half --precise=2.4.1 # next ver: 1.81.0
cargo update -p=clap --precise=4.4.18
msrv := ```
cargo metadata --format-version=1 \
@ -45,67 +39,51 @@ non_linux_all_features_list := ```
all_crate_features := if os() == "linux" { "--all-features" } else { "--features='" + non_linux_all_features_list + "'" }
# Run Clippy over workspace.
clippy:
clippy toolchain="":
cargo {{ toolchain }} clippy --workspace --all-targets {{ all_crate_features }}
# Run Clippy using MSRV.
clippy-msrv: downgrade-for-msrv
@just toolchain={{ msrv_rustup }} clippy
# Test workspace code.
[macos]
[windows]
test:
test toolchain="":
cargo {{ toolchain }} test --lib --tests --package=actix-macros
cargo {{ toolchain }} nextest run --no-tests=warn --workspace --exclude=actix-macros --no-default-features
cargo {{ toolchain }} nextest run --no-tests=warn --workspace --exclude=actix-macros {{ all_crate_features }}
cargo {{ toolchain }} nextest run --workspace --exclude=actix-macros --no-default-features
cargo {{ toolchain }} nextest run --workspace --exclude=actix-macros {{ all_crate_features }}
# Test workspace code.
[linux]
test:
test toolchain="":
cargo {{ toolchain }} test --lib --tests --package=actix-macros
cargo {{ toolchain }} nextest run --no-tests=warn --workspace --exclude=actix-macros --no-default-features
cargo {{ toolchain }} nextest run --no-tests=warn --workspace --exclude=actix-macros {{ non_linux_all_features_list }}
cargo {{ toolchain }} nextest run --no-tests=warn --workspace --exclude=actix-macros {{ all_crate_features }}
cargo {{ toolchain }} nextest run --workspace --exclude=actix-macros --no-default-features
cargo {{ toolchain }} nextest run --workspace --exclude=actix-macros {{ non_linux_all_features_list }}
cargo {{ toolchain }} nextest run --workspace --exclude=actix-macros {{ all_crate_features }}
# Test workspace using MSRV.
test-msrv: downgrade-for-msrv
@just toolchain={{ msrv_rustup }} test
test-msrv: downgrade-for-msrv (test msrv_rustup)
# Test workspace docs.
test-docs: && doc
test-docs toolchain="": && doc
cargo {{ toolchain }} test --doc --workspace {{ all_crate_features }} --no-fail-fast -- --nocapture
# Test workspace.
test-all: test test-docs
test-all toolchain="": (test toolchain) (test-docs toolchain)
# Document crates in workspace.
doc *args: && doc-set-workspace-crates
rm -f "$(cargo metadata --format-version=1 | jq -r '.target_directory')/doc/crates.js"
doc *args:
RUSTDOCFLAGS="--cfg=docsrs -Dwarnings" cargo +nightly doc --no-deps --workspace {{ all_crate_features }} {{ args }}
[private]
doc-set-workspace-crates:
#!/usr/bin/env bash
(
echo "window.ALL_CRATES ="
cargo metadata --format-version=1 \
| jq '[.packages[] | select(.source == null) | .targets | map(select(.doc) | .name)] | flatten'
echo ";"
) > "$(cargo metadata --format-version=1 | jq -r '.target_directory')/doc/crates.js"
# Document crates in workspace and watch for changes.
doc-watch:
@just doc --open
cargo watch -- just doc
# Check for unintentional external type exposure on all crates in workspace.
check-external-types-all:
check-external-types-all toolchain="+nightly":
#!/usr/bin/env bash
set -euo pipefail
exit=0
for f in $(find . -mindepth 2 -maxdepth 2 -name Cargo.toml | grep -vE "\-codegen/|\-derive/|\-macros/"); do
if ! just toolchain="+nightly" check-external-types-manifest "$f"; then exit=1; fi
if ! just check-external-types-manifest "$f" {{ toolchain }}; then exit=1; fi
echo
echo
done
@ -118,9 +96,9 @@ check-external-types-all-table toolchain="+nightly":
for f in $(find . -mindepth 2 -maxdepth 2 -name Cargo.toml | grep -vE "\-codegen/|\-derive/|\-macros/"); do
echo
echo "Checking for $f"
just toolchain="+nightly" check-external-types-manifest "$f" --output-format=markdown-table
just check-external-types-manifest "$f" {{ toolchain }} --output-format=markdown-table
done
# Check for unintentional external type exposure on a crate.
check-external-types-manifest manifest_path *extra_args="":
check-external-types-manifest manifest_path toolchain="+nightly" *extra_args="":
cargo {{ toolchain }} check-external-types --manifest-path "{{ manifest_path }}" {{ extra_args }}

View File

@ -2,7 +2,7 @@
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.74.
- Minimum supported Rust version (MSRV) is now 1.71.
## 0.1.5

View File

@ -2,7 +2,10 @@
name = "local-channel"
version = "0.1.5"
description = "A non-threadsafe multi-producer, single-consumer, futures-aware, FIFO queue"
authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
repository = "https://github.com/actix/actix-net"
keywords = ["channel", "local", "futures"]
license.workspace = true
@ -10,7 +13,10 @@ edition.workspace = true
rust-version.workspace = true
[package.metadata.cargo_check_external_types]
allowed_external_types = ["futures_core::*", "futures_sink::*"]
allowed_external_types = [
"futures_core::*",
"futures_sink::*",
]
[dependencies]
futures-core = "0.3.17"
@ -19,4 +25,4 @@ local-waker = "0.1"
[dev-dependencies]
futures-util = { version = "0.3.17", default-features = false }
tokio = { version = "1.44.2", features = ["rt", "macros"] }
tokio = { version = "1.23.1", features = ["rt", "macros"] }

View File

@ -2,7 +2,7 @@
## Unreleased
- Minimum supported Rust version (MSRV) is now 1.74.
- Minimum supported Rust version (MSRV) is now 1.71.
## 0.1.4

View File

@ -2,7 +2,10 @@
name = "local-waker"
version = "0.1.4"
description = "A synchronization primitive for thread-local task wakeup"
authors = ["Nikolay Kim <fafhrd91@gmail.com>", "Rob Ede <robjtede@icloud.com>"]
authors = [
"Nikolay Kim <fafhrd91@gmail.com>",
"Rob Ede <robjtede@icloud.com>",
]
repository = "https://github.com/actix/actix-net"
keywords = ["waker", "local", "futures", "no-std"]
categories = ["asynchronous", "no-std"]