From bcfac0c6b6c704c7fc433df0965809ee34ded406 Mon Sep 17 00:00:00 2001 From: oxalica Date: Mon, 26 Aug 2024 22:55:08 -0400 Subject: [PATCH] Allow CORS and fix event readiness notification --- Cargo.lock | 31 +++++++++++++++++++++++++++++++ Cargo.toml | 2 ++ src/main.rs | 6 +++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index b682694..5a21093 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -222,6 +222,7 @@ dependencies = [ "bitflags", "clap", "ed25519-dalek", + "futures-util", "hex", "humantime", "rand_core", @@ -233,6 +234,7 @@ dependencies = [ "serde_json", "tokio", "tokio-stream", + "tower-http", "tracing", "tracing-subscriber", "uuid", @@ -564,6 +566,17 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "futures-sink" version = "0.3.30" @@ -583,9 +596,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", + "futures-macro", "futures-task", "pin-project-lite", "pin-utils", + "slab", ] [[package]] @@ -1697,6 +1712,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags", + "bytes", + "http", + "http-body", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" diff --git a/Cargo.toml b/Cargo.toml index 24a6b80..7e46468 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ axum = { version = "0.7.5", features = ["tokio"] } bitflags = { version = "2.6.0", features = ["serde"] } clap = { version = "4.5.16", features = ["derive"] } ed25519-dalek = { version = "2.1.1", features = ["digest", "serde"] } +futures-util = "0.3.30" hex = { version = "0.4.3", features = ["serde"] } humantime = "2.1.0" rand_core = "0.6.4" @@ -21,6 +22,7 @@ serde-constant = "0.1.0" serde_json = "1.0.127" tokio = { version = "1.39.3", features = ["macros", "rt-multi-thread", "sync"] } tokio-stream = { version = "0.1.15", features = ["sync"] } +tower-http = { version = "0.5.2", features = ["cors"] } tracing = "0.1.40" tracing-subscriber = "0.3.18" uuid = { version = "1.10.0", features = ["serde", "v4"] } diff --git a/src/main.rs b/src/main.rs index 3adbe1d..a60486f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -93,7 +93,8 @@ async fn main_async(opt: Cli, st: AppState) -> Result<()> { .route("/room/:ruuid/feed.json", get(room_get_feed)) .route("/room/:ruuid/event", get(room_event)) .route("/room/:ruuid/item", post(room_post_item)) - .with_state(Arc::new(st)); + .with_state(Arc::new(st)) + .layer(tower_http::cors::CorsLayer::permissive()); let listener = tokio::net::TcpListener::bind(&opt.listen) .await @@ -433,5 +434,8 @@ async fn room_event( .expect("serialization cannot fail"); Some(Ok::<_, Infallible>(evt)) }); + // NB. Send an empty event immediately to trigger client ready event. + let first_event = sse::Event::default().comment(""); + let stream = futures_util::stream::iter(Some(Ok(first_event))).chain(stream); Ok(sse::Sse::new(stream).keep_alive(sse::KeepAlive::default())) }