Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
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
6 changes: 6 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,9 @@
# * AWS auth environment variables, for running the wstd-aws integration tests.
# * . directory is available at .
runner = "wasmtime run -Shttp --env AWS_ACCESS_KEY_ID --env AWS_SECRET_ACCESS_KEY --env AWS_SESSION_TOKEN --dir .::."

[target.wasm32-wasip3]
# wasmtime is given:
# * AWS auth environment variables, for running the wstd-aws integration tests.
# * . directory is available at .
runner = "wasmtime run -Shttp -Sp3 --env AWS_ACCESS_KEY_ID --env AWS_SECRET_ACCESS_KEY --env AWS_SESSION_TOKEN --dir .::."
10 changes: 9 additions & 1 deletion .github/actions/install-rust/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,15 @@ runs:
run: |
rustup set profile minimal
rustup update "${{ steps.select.outputs.version }}" --no-self-update
rustup default "${{ steps.select.outputs.version }}"
# `rustup default` gets overwritten by rust-toolchain.toml, `rustup
# override` has higher precedence though.
rustup override set "${{ steps.select.outputs.version }}"

rustup target add wasm32-wasip2

if [ "${{ inputs.toolchain }}" = "nightly" ]; then
rustup target add wasm32-wasip3
fi

# Save disk space by avoiding incremental compilation. Also turn down
# debuginfo from 2 to 0 to help save disk space.
Expand Down
10 changes: 8 additions & 2 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,19 @@ jobs:
role-to-assume: arn:aws:iam::313377415443:role/wstd-aws-ci-role
role-session-name: github-ci

- name: rust version
run: cargo --version

- name: check
run: cargo check --workspace --all --bins --examples

- name: wstd tests
- name: wstd p2 tests
run: cargo test -p wstd -p wstd-axum --target wasm32-wasip2 -- --nocapture

- name: wstd p3 tests
if: matrix.rust == 'nightly'
run: cargo test -p wstd -p wstd-axum --target wasm32-wasip3 -- --nocapture

- name: test-programs tests
run: cargo test -p test-programs -- --nocapture
if: steps.creds.outcome == 'success'
Expand Down Expand Up @@ -90,4 +97,3 @@ jobs:
- run: ./publish bump
# Make sure the tree is publish-able as-is
- run: ./publish verify

13 changes: 9 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,18 @@ http.workspace = true
itoa.workspace = true
pin-project-lite.workspace = true
slab.workspace = true
wasip2.workspace = true
wstd-macro.workspace = true

# optional
serde = { workspace = true, optional = true }
serde_json = { workspace = true, optional = true }

[target.'cfg(all(target_os = "wasi", target_env = "p2"))'.dependencies]
wasip2.workspace = true

[target.'cfg(all(target_os = "wasi", target_env = "p3"))'.dependencies]
wasip3.workspace = true

[dev-dependencies]
anyhow.workspace = true
clap.workspace = true
Expand All @@ -59,7 +64,7 @@ license = "Apache-2.0 WITH LLVM-exception"
repository = "https://github.com/bytecodealliance/wstd"
keywords = ["WebAssembly", "async", "stdlib", "Components"]
categories = ["wasm", "asynchronous"]
rust-version = "1.91.1"
rust-version = "1.92.0"
authors = [
"Yoshua Wuyts <rust@yosh.is>",
"Pat Hickey <pat@moreproductive.org>",
Expand Down Expand Up @@ -95,13 +100,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"
]
2 changes: 1 addition & 1 deletion axum/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ 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

[dev-dependencies]
Expand Down
3 changes: 3 additions & 0 deletions axum/examples/hello_world.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

//! Run with
//!
//! ```sh
Expand Down
3 changes: 3 additions & 0 deletions axum/examples/hello_world_nomacro.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

//! Run with
//!
//! ```sh
Expand Down
3 changes: 3 additions & 0 deletions axum/examples/weather.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

//! This demo app shows a Axum based wasi-http server making an arbitrary
//! number of http requests as part of serving a single response.
//!
Expand Down
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(all(target_os = "wasi", target_env = "p2"))]
//! Support for the [`axum`] web server framework in wasi-http components, via
//! [`wstd`].
//!
Expand Down
3 changes: 3 additions & 0 deletions examples/complex_http_client.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

use anyhow::{Result, anyhow};
use clap::{ArgAction, Parser};
use std::str::FromStr;
Expand Down
3 changes: 3 additions & 0 deletions examples/http_client.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

use anyhow::{Result, anyhow};
use clap::{ArgAction, Parser};
use wstd::http::{Body, BodyExt, Client, Method, Request, Uri};
Expand Down
3 changes: 3 additions & 0 deletions examples/http_server.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

use anyhow::{Context, Result};
use futures_lite::stream::{once_future, unfold};
use http_body_util::{BodyExt, StreamBody};
Expand Down
3 changes: 3 additions & 0 deletions examples/http_server_proxy.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

//! Run the example with:
//! ```sh
//! cargo build --example http_server_proxy --target=wasm32-wasip2
Expand Down
9 changes: 9 additions & 0 deletions examples/macro_main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#![cfg_attr(not(target_os = "wasi"), no_main)]
#![cfg(target_os = "wasi")]

//! Verifies that the `main` macro is compiling.

#[wstd::main]
async fn main() {
println!("Hello world");
}
9 changes: 7 additions & 2 deletions examples/tcp_echo_server.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

use wstd::io;
use wstd::iter::AsyncIterator;
use wstd::net::TcpListener;

#[wstd::main]
async fn main() -> io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
let mut listener = TcpListener::bind("127.0.0.1:8080").await?;
println!("Listening on {}", listener.local_addr()?);
println!("type `nc localhost 8080` to create a TCP client");

Expand All @@ -14,7 +17,9 @@ async fn main() -> io::Result<()> {
println!("Accepted from: {}", stream.peer_addr()?);
wstd::runtime::spawn(async move {
// If echo copy fails, we can ignore it.
let _ = io::copy(&stream, &stream).await;
let mut stream = stream;
let (mut read_half, mut write_half) = stream.split();
let _ = io::copy(&mut read_half, &mut write_half).await;
})
.detach();
}
Expand Down
3 changes: 3 additions & 0 deletions examples/tcp_stream_client.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

use wstd::io::{self, AsyncRead, AsyncWrite};
use wstd::net::TcpStream;

Expand Down
3 changes: 3 additions & 0 deletions examples/udp_echo_server.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

use wstd::io;
use wstd::net::UdpSocket;

Expand Down
3 changes: 3 additions & 0 deletions examples/udp_stream_client.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![cfg_attr(not(all(target_os = "wasi", target_env = "p2")), no_main)]
#![cfg(all(target_os = "wasi", target_env = "p2"))]

use wstd::io;
use wstd::net::{UdpSocket, UdpStream};

Expand Down
12 changes: 6 additions & 6 deletions src/http/body.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use crate::http::{
error::Context as _,
fields::{header_map_from_wasi, header_map_to_wasi},
};
use crate::io::{AsyncInputStream, AsyncOutputStream};
use crate::io::{AsyncInputStream, AsyncOutputStream, AsyncWrite};
use crate::runtime::{AsyncPollable, Reactor, WaitFor};

pub use ::http_body::{Body as HttpBody, Frame, SizeHint};
Expand Down Expand Up @@ -77,7 +77,7 @@ impl Body {
match self.0 {
BodyInner::Incoming(incoming) => incoming.send(outgoing_body).await,
BodyInner::Boxed(box_body) => {
let out_stream = AsyncOutputStream::new(
let mut out_stream = AsyncOutputStream::new(
outgoing_body
.write()
.expect("outgoing body already written"),
Expand Down Expand Up @@ -108,7 +108,7 @@ impl Body {
}
}
BodyInner::Complete { data, trailers } => {
let out_stream = AsyncOutputStream::new(
let mut out_stream = AsyncOutputStream::new(
outgoing_body
.write()
.expect("outgoing body already written"),
Expand Down Expand Up @@ -348,14 +348,14 @@ impl Incoming {
}
async fn send(self, outgoing_body: WasiOutgoingBody) -> Result<(), Error> {
let in_body = self.body;
let in_stream =
let mut in_stream =
AsyncInputStream::new(in_body.stream().expect("incoming body already read"));
let out_stream = AsyncOutputStream::new(
let mut out_stream = AsyncOutputStream::new(
outgoing_body
.write()
.expect("outgoing body already written"),
);
in_stream.copy_to(&out_stream).await.map_err(|e| {
in_stream.copy_to(&mut out_stream).await.map_err(|e| {
Error::from(e).context("copying incoming body stream to outgoing body stream")
})?;
drop(in_stream);
Expand Down
4 changes: 2 additions & 2 deletions src/io/read.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ pub trait AsyncRead {
// If the `AsyncRead` implementation is an unbuffered wrapper around an
// `AsyncInputStream`, some I/O operations can be more efficient.
#[inline]
fn as_async_input_stream(&self) -> Option<&io::AsyncInputStream> {
fn as_async_input_stream(&mut self) -> Option<&mut io::AsyncInputStream> {
None
}
}
Expand All @@ -45,7 +45,7 @@ impl<R: AsyncRead + ?Sized> AsyncRead for &mut R {
}

#[inline]
fn as_async_input_stream(&self) -> Option<&io::AsyncInputStream> {
fn as_async_input_stream(&mut self) -> Option<&mut io::AsyncInputStream> {
(**self).as_async_input_stream()
}
}
8 changes: 4 additions & 4 deletions src/io/stdio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ impl AsyncRead for Stdin {
}

#[inline]
fn as_async_input_stream(&self) -> Option<&AsyncInputStream> {
Some(&self.stream)
fn as_async_input_stream(&mut self) -> Option<&mut AsyncInputStream> {
Some(&mut self.stream)
}
}

Expand Down Expand Up @@ -93,7 +93,7 @@ impl AsyncWrite for Stdout {
}

#[inline]
fn as_async_output_stream(&self) -> Option<&AsyncOutputStream> {
fn as_async_output_stream(&mut self) -> Option<&mut AsyncOutputStream> {
self.stream.as_async_output_stream()
}
}
Expand Down Expand Up @@ -143,7 +143,7 @@ impl AsyncWrite for Stderr {
}

#[inline]
fn as_async_output_stream(&self) -> Option<&AsyncOutputStream> {
fn as_async_output_stream(&mut self) -> Option<&mut AsyncOutputStream> {
self.stream.as_async_output_stream()
}
}
Expand Down
Loading
Loading