Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ jobs:
- name: wstd tests
run: cargo test -p wstd -p wstd-axum --target wasm32-wasip2 -- --nocapture

- name: p3 wstd tests
run: cargo test -p wstd -p wstd-axum --target wasm32-wasip2 --no-default-features --features p3 -- --nocapture

- name: test-programs tests
run: cargo test -p test-programs -- --nocapture
if: steps.creds.outcome == 'success'
Expand Down
74 changes: 70 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,16 @@ repository.workspace = true
rust-version.workspace = true

[features]
default = ["json"]
default = ["json", "p2"]
json = ["dep:serde", "dep:serde_json"]

# WASI backend selection. Exactly one of these must be enabled.
p2 = ["dep:wasip2"]
p3 = ["dep:wasip3"]

[build-dependencies]
cfg_aliases.workspace = true

[dependencies]
anyhow.workspace = true
async-task.workspace = true
Expand All @@ -27,9 +34,11 @@ http.workspace = true
itoa.workspace = true
pin-project-lite.workspace = true
slab.workspace = true
wasip2.workspace = true
wstd-macro.workspace = true

wasip2 = { workspace = true, optional = true }
wasip3 = { workspace = true, optional = true }

# optional
serde = { workspace = true, optional = true }
serde_json = { workspace = true, optional = true }
Expand All @@ -43,6 +52,62 @@ humantime.workspace = true
serde = { workspace = true, features = ["derive"] }
serde_json.workspace = true

[[test]]
name = "http_first_byte_timeout"
required-features = ["p2"]

[[test]]
name = "http_get"
required-features = ["p2"]

[[test]]
name = "http_get_json"
required-features = ["p2"]

[[test]]
name = "http_handle_error_code"
required-features = ["p2"]

[[test]]
name = "http_post"
required-features = ["p2"]

[[test]]
name = "http_post_json"
required-features = ["p2"]

[[test]]
name = "http_timeout"
required-features = ["p2"]

[[test]]
name = "sleep"
required-features = ["p2"]

[[example]]
name = "complex_http_client"
required-features = ["p2"]

[[example]]
name = "http_client"
required-features = ["p2"]

[[example]]
name = "http_server"
required-features = ["p2"]

[[example]]
name = "http_server_proxy"
required-features = ["p2"]

[[example]]
name = "tcp_echo_server"
required-features = ["p2"]

[[example]]
name = "tcp_stream_client"
required-features = ["p2"]

[workspace]
members = [
"axum",
Expand Down Expand Up @@ -72,6 +137,7 @@ async-task = "4.7"
axum = { version = "0.8.6", default-features = false }
bytes = "1.10.1"
cargo_metadata = "0.22"
cfg_aliases = "0.2"
clap = { version = "4.5.26", features = ["derive"] }
futures-core = "0.3.19"
futures-lite = "1.12.0"
Expand All @@ -95,13 +161,13 @@ test-programs = { path = "test-programs" }
tower-service = "0.3.3"
ureq = { version = "3.1", default-features = false, features = ["json"] }
wasip2 = "1.0"
wstd = { path = ".", version = "=0.6.8" }
wasip3 = "0.8"
wstd = { path = ".", version = "=0.6.8", default-features = false }
wstd-axum = { path = "./axum", version = "=0.6.8" }
wstd-axum-macro = { path = "./axum/macro", version = "=0.6.8" }
wstd-macro = { path = "./macro", version = "=0.6.8" }

[package.metadata.docs.rs]
all-features = true
targets = [
"wasm32-wasip2"
]
22 changes: 21 additions & 1 deletion axum/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,32 @@ rust-version.workspace = true
[dependencies]
axum.workspace = true
tower-service.workspace = true
wstd.workspace = true
wstd = { workspace = true, features = ["json"] }
wstd-axum-macro.workspace = true

[features]
default = ["p2"]
p2 = ["wstd/p2"]
p3 = ["wstd/p3"]

[build-dependencies]
cfg_aliases.workspace = true

[dev-dependencies]
anyhow.workspace = true
futures-concurrency.workspace = true
serde = { workspace = true, features = ["derive"] }
serde_qs.workspace = true
axum = { workspace = true, features = ["query", "json", "macros"] }

[[example]]
name = "hello_world"
required-features = ["p2"]

[[example]]
name = "hello_world_nomacro"
required-features = ["p2"]

[[example]]
name = "weather"
required-features = ["p2"]
10 changes: 10 additions & 0 deletions axum/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
use cfg_aliases::cfg_aliases;

fn main() {
cfg_aliases! {
// TODO https://github.com/bytecodealliance/wstd/issues/147: Swap these
// to use `target_env` instead.
p2: { feature = "p2" },
p3: { feature = "p3" },
}
}
1 change: 1 addition & 0 deletions axum/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#![cfg(p2)]
//! Support for the [`axum`] web server framework in wasi-http components, via
//! [`wstd`].
//!
Expand Down
10 changes: 10 additions & 0 deletions build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
use cfg_aliases::cfg_aliases;

fn main() {
cfg_aliases! {
// TODO https://github.com/bytecodealliance/wstd/issues/147: Swap these
// to use `target_env` instead.
p2: { feature = "p2" },
p3: { feature = "p3" },
}
}
Comment on lines +3 to +10

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Saw this handy aliasing in #127 which can let us switch to using the target without a big diff. Not sure what our general philosophy is about pulling in entire crates for such little things though. I left it as a separate commit so it's easy to revert if we don't want it.

40 changes: 31 additions & 9 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
//! **TCP echo server**
//!
//! ```rust,no_run
#![doc = include_str!("../examples/tcp_echo_server.rs")]
#![cfg_attr(p2, doc = include_str!("../examples/tcp_echo_server.rs"))]
//! ```
//!
//! **HTTP Client**
Expand All @@ -30,7 +30,7 @@
//! **HTTP Server**
//!
//! ```rust,no_run
#![doc = include_str!("../examples/http_server.rs")]
#![cfg_attr(p2, doc = include_str!("../examples/http_server.rs"))]
//! ```
//!
//! # Design Decisions
Expand All @@ -55,30 +55,52 @@
//! These are unique capabilities provided by WASI 0.2, and because this library
//! is specific to that are exposed from here.

// Exactly one WASI backend must be selected. See the `p2`/`p3` features.
#[cfg(all(p2, p3))]
compile_error!(
"the `p2` and `p3` features are mutually exclusive — enable exactly one WASI backend"
);
#[cfg(not(any(p2, p3)))]
compile_error!("exactly one of the `p2` or `p3` features must be enabled");

#[cfg(p2)]
pub mod future;
#[cfg(p2)]
#[macro_use]
pub mod http;
#[cfg(p2)]
pub mod io;
pub mod iter;
#[cfg(p2)]
pub mod net;
#[cfg(p2)]
pub mod rand;
#[cfg(p2)]
pub mod runtime;
#[cfg(p2)]
pub mod task;
#[cfg(p2)]
pub mod time;

pub use wstd_macro::attr_macro_http_server as http_server;
pub use wstd_macro::attr_macro_main as main;
pub use wstd_macro::attr_macro_test as test;
#[cfg(p2)]
pub use wstd_macro::{
attr_macro_http_server as http_server, attr_macro_main as main, attr_macro_test as test,
};

// Re-export the wasip2 crate for use only by `wstd-macro` macros. The proc
// macros need to generate code that uses these definitions, but we don't want
// to treat it as part of our public API with regards to semver, so we keep it
// under `__internal` as well as doc(hidden) to indicate it is private.
// Re-export the active WASI backend crate for use only by `wstd-macro` macros.
// The proc macros need to generate code that uses these definitions, but we
// don't want to treat it as part of our public API with regards to semver, so
// we keep it under `__internal` as well as doc(hidden) to indicate it is
// private.
#[doc(hidden)]
pub mod __internal {
#[cfg(p2)]
pub use wasip2;
#[cfg(p3)]
pub use wasip3;
}

#[cfg(p2)]
pub mod prelude {
pub use crate::future::FutureExt as _;
pub use crate::io::AsyncRead as _;
Expand Down
Loading