diff --git a/.vscode/settings.json b/.vscode/settings.json index 836fb0116..e386d4b4c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,7 @@ "editor.formatOnSave": false }, "rust-analyzer.check.workspace": true, - "rust-analyzer.checkOnSave.allTargets": false, + "rust-analyzer.check.features": "all", + "rust-analyzer.cargo.features": "all", + "rust-analyzer.check.allTargets": true } diff --git a/Cargo.lock b/Cargo.lock index 478626fa8..8fda26cd9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,9 +35,9 @@ dependencies = [ [[package]] name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", @@ -60,9 +60,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom 0.2.12", "once_cell", @@ -71,9 +71,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" dependencies = [ "cfg-if", "const-random", @@ -256,7 +256,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -278,7 +278,7 @@ dependencies = [ "argh_shared", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -339,9 +339,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.3.15" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a" +checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" dependencies = [ "brotli", "flate2", @@ -349,19 +349,8 @@ dependencies = [ "memchr", "pin-project-lite", "tokio", -] - -[[package]] -name = "async-compression" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" -dependencies = [ - "flate2", - "futures-core", - "memchr", - "pin-project-lite", - "tokio", + "zstd 0.13.0", + "zstd-safe 7.0.0", ] [[package]] @@ -474,7 +463,7 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -495,28 +484,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "async-stream" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "async-task" version = "4.7.0" @@ -531,7 +498,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -566,21 +533,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "atomic" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" - -[[package]] -name = "atomic" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" -dependencies = [ - "bytemuck", -] - [[package]] name = "atomic-waker" version = "1.1.2" @@ -651,57 +603,23 @@ dependencies = [ [[package]] name = "axum" -version = "0.5.17" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acee9fd5073ab6b045a275b3e709c163dd36c90685219cb21804a147b58dba43" +checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" dependencies = [ "async-trait", - "axum-core 0.2.9", - "base64 0.13.1", - "bitflags 1.3.2", - "bytes", - "futures-util", - "headers 0.3.9", - "http 0.2.11", - "http-body 0.4.6", - "hyper 0.14.28", - "itoa 1.0.10", - "matchit 0.5.0", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "sha-1", - "sync_wrapper", - "tokio", - "tokio-tungstenite 0.17.2", - "tower", - "tower-http 0.3.5", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" -dependencies = [ - "async-trait", - "axum-core 0.3.4", + "axum-core 0.4.3", "axum-macros", - "base64 0.21.7", - "bitflags 1.3.2", + "base64", "bytes", "futures-util", - "http 0.2.11", - "http-body 0.4.6", - "hyper 0.14.28", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.1.0", + "hyper-util", "itoa 1.0.10", - "matchit 0.7.3", + "matchit", "memchr", "mime", "percent-encoding", @@ -714,10 +632,11 @@ dependencies = [ "sha1", "sync_wrapper", "tokio", - "tokio-tungstenite 0.20.1", + "tokio-tungstenite", "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -726,36 +645,20 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "axum 0.6.20", - "axum_session", + "axum", + "axum_session 0.3.5", "axum_session_auth", "dioxus", "dioxus-fullstack", "dioxus-web", "execute", - "http 0.2.11", + "http 1.0.0", "serde", "simple_logger", "sqlx", "tokio", "tower", - "tower-http 0.4.4", -] - -[[package]] -name = "axum-core" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e5939e02c56fecd5c017c37df4238c0a839fa76b7f97acdd7efb804fd181cc" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 0.2.11", - "http-body 0.4.6", - "mime", - "tower-layer", - "tower-service", + "tower-http", ] [[package]] @@ -775,11 +678,32 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "axum-desktop" version = "0.1.0" dependencies = [ - "axum 0.6.20", + "axum", "dioxus", "serde", "tokio", @@ -800,21 +724,21 @@ dependencies = [ [[package]] name = "axum-macros" -version = "0.3.8" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdca6a10ecad987bda04e95606ef85a5417dcaac1a78455242d72e031e2b6b62" +checksum = "00c055ee2d014ae5981ce1016374e8213682aa14d9bf40e48ab48b5f3ef20eaa" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] name = "axum-router" version = "0.1.0" dependencies = [ - "axum 0.6.20", + "axum", "dioxus", "serde", "tokio", @@ -834,7 +758,7 @@ dependencies = [ "hyper 0.14.28", "pin-project-lite", "rustls 0.21.10", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "tokio", "tokio-rustls 0.24.1", "tower-service", @@ -849,7 +773,7 @@ dependencies = [ "aes-gcm", "async-trait", "axum-core 0.3.4", - "base64 0.21.7", + "base64", "bytes", "chrono", "cookie 0.17.0", @@ -870,26 +794,59 @@ dependencies = [ ] [[package]] -name = "axum_session_auth" -version = "0.3.1" +name = "axum_session" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d26b395b86d34230970c09fee81cad335704d5b6b797714a9ebb8a51cc4fa6" +checksum = "d0f0035d1d5a70ac279e80a75e60592023ba8b327c929c3827f6c5ed749b9f8b" +dependencies = [ + "aes-gcm", + "async-trait", + "axum", + "base64", + "bytes", + "chrono", + "cookie 0.18.0", + "dashmap", + "forwarded-header-value", + "futures", + "hmac", + "http 1.0.0", + "http-body 1.0.0", + "rand 0.8.5", + "serde", + "serde_json", + "sha2", + "sqlx", + "thiserror", + "tokio", + "tower-layer", + "tower-service", + "tracing", + "uuid", +] + +[[package]] +name = "axum_session_auth" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd4c620e865c92d9fca3ad57efeb4baef271f3ccdba163928002f13489952660" dependencies = [ "anyhow", "async-recursion", "async-trait", - "axum-core 0.3.4", - "axum_session", + "axum-core 0.4.3", + "axum_session 0.12.4", "bytes", "chrono", "dashmap", "futures", - "http 0.2.11", - "http-body 0.4.6", + "http 1.0.0", + "http-body 1.0.0", "serde", "tokio", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -907,12 +864,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.7" @@ -954,12 +905,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "binascii" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" - [[package]] name = "bincode" version = "1.3.3" @@ -1071,7 +1016,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", "syn_derive", ] @@ -1112,7 +1057,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" dependencies = [ "memchr", - "regex-automata 0.4.5", + "regex-automata", "serde", ] @@ -1142,9 +1087,9 @@ checksum = "38d17f4d6e4dc36d1a02fbedc2753a096848e7c1b0772f7654eab8e2c927dd53" [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" [[package]] name = "bytecheck" @@ -1259,7 +1204,7 @@ dependencies = [ "heck 0.4.1", "home", "ignore", - "indexmap 2.2.2", + "indexmap 2.2.3", "indicatif", "liquid", "liquid-core", @@ -1449,9 +1394,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1541,7 +1486,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -1761,7 +1706,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" dependencies = [ "aes-gcm", - "base64 0.21.7", + "base64", "percent-encoding", "rand 0.8.5", "subtle", @@ -1776,11 +1721,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cd91cf61412820176e137621345ee43b3f4423e589e7ae4e50d601d93e35ef8" dependencies = [ "aes-gcm", - "base64 0.21.7", - "hmac", + "base64", "percent-encoding", "rand 0.8.5", - "sha2", "subtle", "time", "version_check", @@ -1852,9 +1795,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -2017,16 +1960,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "cruet" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6132609543972496bc97b1e01f1ce6586768870aeb4cabeb3385f4e05b5caead" -dependencies = [ - "once_cell", - "regex", -] - [[package]] name = "crunchy" version = "0.2.2" @@ -2090,7 +2023,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2121,7 +2054,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2154,9 +2087,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.5" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8" +checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955" dependencies = [ "darling_core", "darling_macro", @@ -2164,27 +2097,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.5" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3" +checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] name = "darling_macro" -version = "0.20.5" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77" +checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2260,39 +2193,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "devise" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6eacefd3f541c66fc61433d65e54e0e46e0a029a819a7dbbc7a7b489e8a85f8" -dependencies = [ - "devise_codegen", - "devise_core", -] - -[[package]] -name = "devise_codegen" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8cf4b8dd484ede80fd5c547592c46c3745a617c8af278e2b72bea86b2dfed6" -dependencies = [ - "devise_core", - "quote", -] - -[[package]] -name = "devise_core" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a" -dependencies = [ - "bitflags 2.4.2", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.48", -] - [[package]] name = "dialoguer" version = "0.11.0" @@ -2363,7 +2263,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2384,7 +2284,7 @@ version = "0.4.3" dependencies = [ "anyhow", "atty", - "axum 0.5.17", + "axum", "axum-server", "cargo-generate", "cargo_metadata 0.18.1", @@ -2405,10 +2305,10 @@ dependencies = [ "flate2", "fs_extra", "futures-util", - "headers 0.3.9", + "headers", "html_parser", - "hyper 0.14.28", - "hyper-rustls 0.23.2", + "hyper 1.1.0", + "hyper-rustls 0.26.0", "ignore", "indicatif", "interprocess-docfix", @@ -2425,7 +2325,7 @@ dependencies = [ "serde", "serde_json", "subprocess", - "syn 2.0.48", + "syn 2.0.49", "tar", "tauri-bundler", "tempfile", @@ -2434,7 +2334,7 @@ dependencies = [ "toml 0.8.10", "toml_edit 0.21.1", "tower", - "tower-http 0.2.5", + "tower-http", "walkdir", "wasm-bindgen-cli-support", "zip", @@ -2451,7 +2351,7 @@ dependencies = [ "serde_json", "tauri-bundler", "tauri-utils", - "toml 0.5.11", + "toml 0.8.10", "tracing", ] @@ -2493,7 +2393,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.49", "trybuild", ] @@ -2558,7 +2458,6 @@ dependencies = [ "serde", "serde_json", "tokio", - "warp", ] [[package]] @@ -2577,8 +2476,8 @@ version = "0.4.3" dependencies = [ "anymap 0.12.1", "async-trait", - "axum 0.6.20", - "base64 0.21.7", + "axum", + "base64", "bytes", "ciborium", "dioxus-cli-config", @@ -2590,12 +2489,10 @@ dependencies = [ "dioxus-web", "dioxus_server_macro", "futures-util", - "http 0.2.11", - "http-body-util", - "hyper 0.14.28", + "http 1.0.0", + "hyper 1.1.0", "once_cell", "pin-project", - "salvo", "serde", "serde_json", "server_fn", @@ -2604,11 +2501,10 @@ dependencies = [ "tokio-stream", "tokio-util", "tower", - "tower-http 0.4.4", + "tower-http", "tower-layer", "tracing", "tracing-futures", - "warp", "web-sys", ] @@ -2676,7 +2572,7 @@ dependencies = [ "convert_case 0.6.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", "trybuild", ] @@ -2711,8 +2607,7 @@ dependencies = [ name = "dioxus-liveview" version = "0.4.3" dependencies = [ - "async-trait", - "axum 0.6.20", + "axum", "dioxus", "dioxus-cli-config", "dioxus-core", @@ -2723,12 +2618,8 @@ dependencies = [ "futures-util", "generational-box", "minify-js", - "once_cell", "pretty_env_logger", - "rocket", - "rocket_ws", "rustc-hash", - "salvo", "serde", "serde_json", "slab", @@ -2738,7 +2629,6 @@ dependencies = [ "tokio-util", "tower", "tracing", - "warp", ] [[package]] @@ -2779,7 +2669,7 @@ dependencies = [ "quote", "rustc-hash", "smallvec", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2794,7 +2684,7 @@ dependencies = [ name = "dioxus-playwright-liveview-test" version = "0.0.1" dependencies = [ - "axum 0.6.20", + "axum", "dioxus", "dioxus-liveview", "tokio", @@ -2825,7 +2715,7 @@ dependencies = [ name = "dioxus-router" version = "0.4.3" dependencies = [ - "axum 0.6.20", + "axum", "console_error_panic_hook", "criterion 0.5.1", "dioxus", @@ -2857,7 +2747,7 @@ dependencies = [ "proc-macro2", "quote", "slab", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2870,7 +2760,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.48", + "syn 2.0.49", "tracing", ] @@ -2909,8 +2799,8 @@ dependencies = [ "fern", "fs_extra", "generational-box", - "http 0.2.11", - "lru 0.10.1", + "http 1.0.0", + "lru", "rustc-hash", "serde", "serde_json", @@ -2983,7 +2873,7 @@ dependencies = [ "proc-macro2", "quote", "server_fn_macro", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -3075,9 +2965,9 @@ checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" dependencies = [ "serde", ] @@ -3106,14 +2996,14 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] name = "enumflags2" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939" +checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" dependencies = [ "enumflags2_derive", "serde", @@ -3121,13 +3011,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" +checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -3148,7 +3038,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -3180,16 +3070,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "etag" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b3d0661a2ccddc26cba0b834e9b717959ed6fdd76c7129ee159c170a875bf44" -dependencies = [ - "str-buf", - "xxhash-rust", -] - [[package]] name = "etcetera" version = "0.8.0" @@ -3298,7 +3178,7 @@ checksum = "ce8cd46a041ad005ab9c71263f9a0ff5b529eac0fe4cc9b4a20f4f0765d8cf4b" dependencies = [ "execute-command-tokens", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -3388,20 +3268,6 @@ dependencies = [ "rustc_version", ] -[[package]] -name = "figment" -version = "0.10.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b6e5bc7bd59d60d0d45a6ccab6cf0f4ce28698fb4e81e750ddf229c9b824026" -dependencies = [ - "atomic 0.6.0", - "pear", - "serde", - "toml 0.8.10", - "uncased", - "version_check", -] - [[package]] name = "filetime" version = "0.2.23" @@ -3480,7 +3346,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -3504,6 +3370,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "forwarded-header-value" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9" +dependencies = [ + "nonempty", + "thiserror", +] + [[package]] name = "fs-err" version = "2.11.0" @@ -3653,7 +3529,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -3803,19 +3679,6 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "generator" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" -dependencies = [ - "cc", - "libc", - "log", - "rustversion", - "windows 0.48.0", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -3954,7 +3817,7 @@ dependencies = [ "gix-date", "itoa 1.0.10", "thiserror", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -3975,7 +3838,7 @@ dependencies = [ "smallvec", "thiserror", "unicode-bom", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -4075,7 +3938,7 @@ dependencies = [ "itoa 1.0.10", "smallvec", "thiserror", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -4109,7 +3972,7 @@ dependencies = [ "gix-validate", "memmap2", "thiserror", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -4197,7 +4060,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -4239,8 +4102,8 @@ dependencies = [ "aho-corasick 1.1.2", "bstr 1.9.0", "log", - "regex-automata 0.4.5", - "regex-syntax 0.8.2", + "regex-automata", + "regex-syntax", ] [[package]] @@ -4495,7 +4358,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -4510,7 +4373,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.11", - "indexmap 2.2.2", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -4529,7 +4392,7 @@ dependencies = [ "futures-sink", "futures-util", "http 1.0.0", - "indexmap 2.2.2", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -4572,7 +4435,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", ] [[package]] @@ -4581,7 +4444,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "bumpalo", ] @@ -4591,7 +4454,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "allocator-api2", ] @@ -4610,30 +4473,15 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.21.7", + "base64", "bytes", - "headers-core 0.2.0", + "headers-core", "http 0.2.11", "httpdate", "mime", "sha1", ] -[[package]] -name = "headers" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" -dependencies = [ - "base64 0.21.7", - "bytes", - "headers-core 0.3.0", - "http 1.0.0", - "httpdate", - "mime", - "sha1", -] - [[package]] name = "headers-core" version = "0.2.0" @@ -4643,15 +4491,6 @@ dependencies = [ "http 0.2.11", ] -[[package]] -name = "headers-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" -dependencies = [ - "http 1.0.0", -] - [[package]] name = "heck" version = "0.3.3" @@ -4681,9 +4520,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c62115964e08cb8039170eb33c1d0e2388a256930279edca206fff675f82c3" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "hex" @@ -4845,9 +4684,9 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" [[package]] name = "http-range-header" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" +checksum = "3ce4ef31cda248bbdb6e6820603b82dfcd9e833db65a43e997a0ccec777d11fe" [[package]] name = "httparse" @@ -4911,21 +4750,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" -dependencies = [ - "http 0.2.11", - "hyper 0.14.28", - "log", - "rustls 0.20.9", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.23.4", -] - [[package]] name = "hyper-rustls" version = "0.24.2" @@ -4940,6 +4764,25 @@ dependencies = [ "tokio-rustls 0.24.1", ] +[[package]] +name = "hyper-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" +dependencies = [ + "futures-util", + "http 1.0.0", + "hyper 1.1.0", + "hyper-util", + "log", + "rustls 0.22.2", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.25.0", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -4960,6 +4803,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" dependencies = [ "bytes", + "futures-channel", "futures-util", "http 1.0.0", "http-body 1.0.0", @@ -4967,6 +4811,9 @@ dependencies = [ "pin-project-lite", "socket2 0.5.5", "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -5034,7 +4881,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.5", + "regex-automata", "same-file", "walkdir", "winapi-util", @@ -5093,9 +4940,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -5104,9 +4951,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" dependencies = [ "console", "instant", @@ -5139,12 +4986,6 @@ dependencies = [ "cfb", ] -[[package]] -name = "inlinable_string" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" - [[package]] name = "inotify" version = "0.9.6" @@ -5201,7 +5042,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -5242,7 +5083,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.5", + "hermit-abi 0.3.6", "libc", "windows-sys 0.48.0", ] @@ -5276,11 +5117,12 @@ dependencies = [ [[package]] name = "iri-string" -version = "0.4.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0f7638c1e223529f1bfdc48c8b133b9e0b434094d1d28473161ee48b235f78" +checksum = "21859b667d66a4c1dacd9df0863b3efb65785474255face87f5bca39dd8407c0" dependencies = [ - "nom", + "memchr", + "serde", ] [[package]] @@ -5294,11 +5136,11 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe8f25ce1159c7740ff0b9b2f5cdf4a8428742ba7c112b9f20f22cd5219c7dab" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.5", + "hermit-abi 0.3.6", "libc", "windows-sys 0.52.0", ] @@ -5675,17 +5517,18 @@ dependencies = [ [[package]] name = "lightningcss" -version = "1.0.0-alpha.52" +version = "1.0.0-alpha.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771a62dedf5ec563bbfea9760f6c6a6bc546e67355eba0cd7d00c0dc34b11d90" +checksum = "4ae8ba2b1b450cefc6a7a6ee93868992f56f662869b90404de2a7319da18640f" dependencies = [ - "ahash 0.7.7", + "ahash 0.8.8", "bitflags 2.4.2", "const-str", "cssparser 0.33.0", "cssparser-color", "dashmap", "data-encoding", + "getrandom 0.2.12", "itertools 0.10.5", "lazy_static", "parcel_selectors", @@ -5769,7 +5612,7 @@ checksum = "fc2fb41a9bb4257a3803154bdf7e2df7d45197d1941c9b1a90ad815231630721" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -5812,21 +5655,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" -[[package]] -name = "loom" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", -] - [[package]] name = "loop9" version = "0.1.5" @@ -5836,15 +5664,6 @@ dependencies = [ "imgref", ] -[[package]] -name = "lru" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" -dependencies = [ - "hashbrown 0.13.2", -] - [[package]] name = "lru" version = "0.12.2" @@ -5947,7 +5766,7 @@ version = "0.1.0" source = "git+https://github.com/DioxusLabs/collect-assets?rev=f982698#f982698027fc27d22acfb4121fba389ec125d538" dependencies = [ "anyhow", - "base64 0.21.7", + "base64", "home", "infer 0.11.0", "reqwest", @@ -5961,12 +5780,12 @@ name = "manganis-macro" version = "0.0.1" source = "git+https://github.com/DioxusLabs/collect-assets?rev=f982698#f982698027fc27d22acfb4121fba389ec125d538" dependencies = [ - "base64 0.21.7", + "base64", "manganis-cli-support", "manganis-common", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -5989,27 +5808,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "matches" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" -[[package]] -name = "matchit" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" - [[package]] name = "matchit" version = "0.7.3" @@ -6090,16 +5894,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "mime-infer" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91caed19dd472bc88bcd063571df18153529d49301a1918f4cf37f42332bee2e" -dependencies = [ - "mime", - "unicase", -] - [[package]] name = "mime_guess" version = "2.0.4" @@ -6225,53 +6019,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "multer" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" -dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http 0.2.11", - "httparse", - "log", - "memchr", - "mime", - "spin 0.9.8", - "tokio", - "tokio-util", - "version_check", -] - -[[package]] -name = "multer" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15d522be0a9c3e46fd2632e272d178f56387bdb5c9fbb3a36c649062e9b5219" -dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http 1.0.0", - "httparse", - "log", - "memchr", - "mime", - "spin 0.9.8", - "version_check", -] - -[[package]] -name = "multimap" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a5d38b9b352dbd913288736af36af41c48d61b1a8cd34bcecd727561b7d511" -dependencies = [ - "serde", -] - [[package]] name = "names" version = "0.14.0" @@ -6395,6 +6142,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nonempty" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7" + [[package]] name = "noop_proc_macro" version = "0.3.0" @@ -6492,7 +6245,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -6543,7 +6296,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.5", + "hermit-abi 0.3.6", "libc", ] @@ -6570,9 +6323,9 @@ dependencies = [ [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] @@ -6683,7 +6436,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -6694,9 +6447,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.2.2+3.2.1" +version = "300.2.3+3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bbfad0063610ac26ee79f7484739e2b07555a75c42453b89263830b5c8103bc" +checksum = "5cff92b6f71555b61bb9315f7c64da3ca43d87531622120fea0195fc761b4843" dependencies = [ "cc", ] @@ -6902,12 +6655,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "path-slash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" - [[package]] name = "pathdiff" version = "0.2.1" @@ -6926,29 +6673,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "pear" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ccca0f6c17acc81df8e242ed473ec144cbf5c98037e69aa6d144780aad103c8" -dependencies = [ - "inlinable_string", - "pear_codegen", - "yansi 1.0.0-rc.1", -] - -[[package]] -name = "pear_codegen" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e22670e8eb757cff11d6c199ca7b987f352f0346e0be4dd23869ec72cb53c77" -dependencies = [ - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.48", -] - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -6995,7 +6719,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -7016,7 +6740,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.2.2", + "indexmap 2.2.3", ] [[package]] @@ -7123,7 +6847,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -7170,7 +6894,7 @@ checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -7219,9 +6943,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plasmo" @@ -7251,8 +6975,8 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef" dependencies = [ - "base64 0.21.7", - "indexmap 2.2.2", + "base64", + "indexmap 2.2.3", "line-wrap", "quick-xml", "serde", @@ -7373,7 +7097,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22020dfcf177fcc7bf5deaf7440af371400c67c0de14c399938d8ed4fb4645d3" dependencies = [ "proc-macro2", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -7383,7 +7107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ "diff", - "yansi 0.5.1", + "yansi", ] [[package]] @@ -7403,7 +7127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -7473,19 +7197,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", - "version_check", - "yansi 1.0.0-rc.1", -] - [[package]] name = "prodash" version = "26.2.2" @@ -7508,7 +7219,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce97fecd27bc49296e5e20518b5a1bb54a14f7d5fe6228bc9686ee2a74915cc8" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -7684,7 +7395,7 @@ dependencies = [ "crossterm 0.27.0", "indoc", "itertools 0.11.0", - "lru 0.12.2", + "lru", "paste", "strum", "unicode-segmentation", @@ -7833,26 +7544,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "ref-cast" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "regex" version = "1.10.3" @@ -7861,17 +7552,8 @@ checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick 1.1.2", "memchr", - "regex-automata 0.4.5", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -7882,15 +7564,9 @@ checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick 1.1.2", "memchr", - "regex-syntax 0.8.2", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.2" @@ -7928,7 +7604,7 @@ version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ - "base64 0.21.7", + "base64", "bytes", "encoding_rs", "futures-core", @@ -7948,7 +7624,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls 0.21.10", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", @@ -8017,7 +7693,7 @@ version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3625f343d89990133d013e39c46e350915178cf94f1bec9f49b0cbef98a3e3c" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "bitflags 2.4.2", "instant", "num-traits", @@ -8035,22 +7711,7 @@ checksum = "853977598f084a492323fe2f7896b4100a86284ee8473612de60021ea341310f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", + "syn 2.0.49", ] [[package]] @@ -8063,7 +7724,7 @@ dependencies = [ "getrandom 0.2.12", "libc", "spin 0.9.8", - "untrusted 0.9.0", + "untrusted", "windows-sys 0.48.0", ] @@ -8102,106 +7763,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" -[[package]] -name = "rocket" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e7bb57ccb26670d73b6a47396c83139447b9e7878cab627fdfe9ea8da489150" -dependencies = [ - "async-stream", - "async-trait", - "atomic 0.5.3", - "binascii", - "bytes", - "either", - "figment", - "futures", - "indexmap 2.2.2", - "log", - "memchr", - "multer 2.1.0", - "num_cpus", - "parking_lot", - "pin-project-lite", - "rand 0.8.5", - "ref-cast", - "rocket_codegen", - "rocket_http", - "serde", - "state", - "tempfile", - "time", - "tokio", - "tokio-stream", - "tokio-util", - "ubyte", - "version_check", - "yansi 1.0.0-rc.1", -] - -[[package]] -name = "rocket_codegen" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2238066abf75f21be6cd7dc1a09d5414a671f4246e384e49fe3f8a4936bd04c" -dependencies = [ - "devise", - "glob", - "indexmap 2.2.2", - "proc-macro2", - "quote", - "rocket_http", - "syn 2.0.48", - "unicode-xid", - "version_check", -] - -[[package]] -name = "rocket_http" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a1663694d059fe5f943ea5481363e48050acedd241d46deb2e27f71110389e" -dependencies = [ - "cookie 0.18.0", - "either", - "futures", - "http 0.2.11", - "hyper 0.14.28", - "indexmap 2.2.2", - "log", - "memchr", - "pear", - "percent-encoding", - "pin-project-lite", - "ref-cast", - "serde", - "smallvec", - "stable-pattern", - "state", - "time", - "tokio", - "uncased", -] - -[[package]] -name = "rocket_ws" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6677b3fe72e2d73dd632c412546ed8153e8685c830ee8d20e4488575cb905d9" -dependencies = [ - "rocket", - "tokio-tungstenite 0.20.1", -] - [[package]] name = "ron" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ - "base64 0.21.7", + "base64", "bitflags 2.4.2", - "indexmap 2.2.2", + "indexmap 2.2.3", "serde", "serde_derive", ] @@ -8238,48 +7808,14 @@ dependencies = [ "pretty_assertions", "proc-macro2", "quote", - "syn 2.0.48", -] - -[[package]] -name = "rust-embed" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82c0bbc10308ed323529fd3c1dce8badda635aa319a5ff0e6466f33b8101e3f" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6227c01b1783cdfee1bcf844eb44594cd16ec71c35305bf1c9fb5aade2735e16" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn 2.0.48", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb0a25bfbb2d4b4402179c2cf030387d9990857ce08a32592c6238db9fa8665" -dependencies = [ - "sha2", - "walkdir", + "syn 2.0.49", ] [[package]] name = "rust_decimal" -version = "1.34.2" +version = "1.34.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755392e1a2f77afd95580d3f0d0e94ac83eeeb7167552c9b5bca549e61a94d83" +checksum = "b39449a79f45e8da28c57c341891b69a183044b29518bb8f86dbac9df60bb7df" dependencies = [ "arrayvec", "borsh", @@ -8361,18 +7897,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rustls" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" -dependencies = [ - "log", - "ring 0.16.20", - "sct", - "webpki", -] - [[package]] name = "rustls" version = "0.21.10" @@ -8380,7 +7904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", - "ring 0.17.7", + "ring", "rustls-webpki 0.101.7", "sct", ] @@ -8392,7 +7916,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" dependencies = [ "log", - "ring 0.17.7", + "ring", "rustls-pki-types", "rustls-webpki 0.102.2", "subtle", @@ -8401,12 +7925,13 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", - "rustls-pemfile", + "rustls-pemfile 2.1.0", + "rustls-pki-types", "schannel", "security-framework", ] @@ -8417,14 +7942,24 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.7", + "base64", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c333bb734fcdedcea57de1602543590f545f127dc8b533324318fd492c5c70b" +dependencies = [ + "base64", + "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" +checksum = "048a63e5b3ac996d78d402940b5fa47973d2d080c6c6fffa1d0f19c4445310b7" [[package]] name = "rustls-webpki" @@ -8432,8 +7967,8 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.7", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -8442,9 +7977,9 @@ version = "0.102.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" dependencies = [ - "ring 0.17.7", + "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] @@ -8465,151 +8000,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" -[[package]] -name = "salvo" -version = "0.63.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc1aaf77a4c306270cb7b1a6e08a5b12ee14935ac5a5c6b0ce1958d66a72ad9" -dependencies = [ - "salvo-compression", - "salvo-serve-static", - "salvo_core", - "salvo_extra", -] - -[[package]] -name = "salvo-compression" -version = "0.63.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c487a736613df6e2ae455bdd3775d86ad9a2a2dcf0cd4067adc9ce08dc9f0d97" -dependencies = [ - "brotli", - "bytes", - "flate2", - "futures-util", - "indexmap 2.2.2", - "salvo_core", - "tokio", - "tokio-util", - "tracing", - "zstd 0.13.0", -] - -[[package]] -name = "salvo-hello-world" -version = "0.1.0" -dependencies = [ - "dioxus", - "dioxus-fullstack", - "dioxus-web", - "execute", - "reqwest", - "salvo", - "serde", - "simple_logger", - "tracing", - "tracing-subscriber", - "tracing-wasm", -] - -[[package]] -name = "salvo-serve-static" -version = "0.63.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef927fe76c5444b3ef6386180ec0f39998e26414dee66e6ce48b91da6f2ef8e" -dependencies = [ - "hex", - "mime", - "mime-infer", - "path-slash", - "percent-encoding", - "rust-embed", - "salvo_core", - "serde", - "serde_json", - "time", - "tokio", - "tracing", -] - -[[package]] -name = "salvo_core" -version = "0.63.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c36a49a4227992bb0e27f3c9589e24b2bd8c68a29e2ed42e03f6de6da39faa0f" -dependencies = [ - "async-trait", - "base64 0.21.7", - "bytes", - "cookie 0.18.0", - "cruet", - "enumflags2", - "form_urlencoded", - "futures-channel", - "futures-util", - "headers 0.4.0", - "http 1.0.0", - "http-body-util", - "hyper 1.1.0", - "hyper-util", - "indexmap 2.2.2", - "mime", - "mime-infer", - "multer 3.0.0", - "multimap", - "nix 0.27.1", - "once_cell", - "parking_lot", - "percent-encoding", - "pin-project", - "rand 0.8.5", - "regex", - "salvo_macros", - "serde", - "serde-xml-rs", - "serde_json", - "sync_wrapper", - "tempfile", - "thiserror", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "salvo_extra" -version = "0.63.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcfdffe788f7ae4c79bdeea16db85cd27e473a8d4bef44ba10b9323461f78087" -dependencies = [ - "base64 0.21.7", - "etag", - "futures-util", - "hyper 1.1.0", - "pin-project", - "salvo_core", - "serde", - "serde_json", - "tokio", - "tokio-tungstenite 0.21.0", - "tracing", - "ulid", -] - -[[package]] -name = "salvo_macros" -version = "0.63.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fa50756ef995d410bb1968b403a1eca169b54c3c0eb4be4bcb1da8c7591cb7d" -dependencies = [ - "cruet", - "proc-macro-crate 2.0.0", - "proc-macro2", - "quote", - "regex", - "syn 2.0.48", -] - [[package]] name = "same-file" version = "1.0.6" @@ -8656,8 +8046,8 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.7", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -8754,18 +8144,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "serde-xml-rs" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" -dependencies = [ - "log", - "serde", - "thiserror", - "xml-rs", -] - [[package]] name = "serde_cbor" version = "0.11.2" @@ -8784,7 +8162,7 @@ checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -8837,7 +8215,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -8867,11 +8245,11 @@ version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" dependencies = [ - "base64 0.21.7", + "base64", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.2", + "indexmap 2.2.3", "serde", "serde_derive", "serde_json", @@ -8888,7 +8266,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -8911,7 +8289,7 @@ dependencies = [ "serde_json", "serde_qs", "server_fn_macro_default", - "syn 2.0.48", + "syn 2.0.49", "thiserror", "xxhash-rust", ] @@ -8927,7 +8305,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.48", + "syn 2.0.49", "xxhash-rust", ] @@ -8938,7 +8316,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a3353f22e2bcc451074d4feaa37317d9d17dff11d4311928384734ea17ab9ca" dependencies = [ "server_fn_macro", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -8951,17 +8329,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "sha-1" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sha1" version = "0.10.6" @@ -9132,7 +8499,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9298e863f0143b89972299110a7fa3e2fc08c412341d588c497bae38409f9e68" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -9141,7 +8508,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f20798defa0e9d4eff9ca451c7f84774c7378a9c3b5a40112cfa2b3eadb97ae2" dependencies = [ - "lru 0.12.2", + "lru", "once_cell", "rustc-hash", ] @@ -9282,7 +8649,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "atoi", "bigdecimal", "bit-vec", @@ -9301,7 +8668,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.2.2", + "indexmap 2.2.3", "ipnetwork", "log", "mac_address", @@ -9311,7 +8678,7 @@ dependencies = [ "percent-encoding", "rust_decimal", "rustls 0.21.10", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "serde", "serde_json", "sha2", @@ -9374,7 +8741,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" dependencies = [ "atoi", - "base64 0.21.7", + "base64", "bigdecimal", "bitflags 2.4.2", "byteorder", @@ -9421,7 +8788,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" dependencies = [ "atoi", - "base64 0.21.7", + "base64", "bigdecimal", "bit-vec", "bitflags 2.4.2", @@ -9488,30 +8855,12 @@ dependencies = [ "uuid", ] -[[package]] -name = "stable-pattern" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" -dependencies = [ - "memchr", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "state" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" -dependencies = [ - "loom", -] - [[package]] name = "static-hydrated" version = "0.1.0" @@ -9530,12 +8879,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "str-buf" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceb97b7225c713c2fd4db0153cb6b3cab244eb37900c3f634ed4d43310d8c34" - [[package]] name = "string_cache" version = "0.8.7" @@ -9598,7 +8941,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -9640,9 +8983,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" dependencies = [ "proc-macro2", "quote", @@ -9658,7 +9001,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -9748,7 +9091,7 @@ dependencies = [ "tao-macros", "unicode-segmentation", "url", - "windows 0.52.0", + "windows", "windows-implement", "windows-version", "x11-dl", @@ -9928,22 +9271,22 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -10067,7 +9410,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -10080,17 +9423,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.9", - "tokio", - "webpki", -] - [[package]] name = "tokio-rustls" version = "0.24.1" @@ -10101,6 +9433,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.2", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.14" @@ -10113,30 +9456,6 @@ dependencies = [ "tokio-util", ] -[[package]] -name = "tokio-tungstenite" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite 0.17.3", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite 0.20.1", -] - [[package]] name = "tokio-tungstenite" version = "0.21.0" @@ -10146,7 +9465,7 @@ dependencies = [ "futures-util", "log", "tokio", - "tungstenite 0.21.0", + "tungstenite", ] [[package]] @@ -10192,11 +9511,11 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.4", + "toml_edit 0.22.6", ] [[package]] @@ -10214,11 +9533,11 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -10227,9 +9546,9 @@ version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.2.3", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -10238,22 +9557,22 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.2.3", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.4" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9ffdf896f8daaabf9b66ba8e77ea1ed5ed0f72821b398aba62352e95062951" +checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ - "indexmap 2.2.2", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.1", ] [[package]] @@ -10274,18 +9593,19 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.2.5" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8" +checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" dependencies = [ - "async-compression 0.3.15", - "base64 0.13.1", - "bitflags 1.3.2", + "async-compression", + "base64", + "bitflags 2.4.2", "bytes", "futures-core", "futures-util", - "http 0.2.11", - "http-body 0.4.6", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", "http-range-header", "httpdate", "iri-string", @@ -10299,52 +9619,7 @@ dependencies = [ "tower-layer", "tower-service", "tracing", -] - -[[package]] -name = "tower-http" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" -dependencies = [ - "bitflags 1.3.2", - "bytes", - "futures-core", - "futures-util", - "http 0.2.11", - "http-body 0.4.6", - "http-range-header", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" -dependencies = [ - "async-compression 0.4.6", - "base64 0.21.7", - "bitflags 2.4.2", - "bytes", - "futures-core", - "futures-util", - "http 0.2.11", - "http-body 0.4.6", - "http-range-header", - "httpdate", - "mime", - "mime_guess", - "percent-encoding", - "pin-project-lite", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", + "uuid", ] [[package]] @@ -10379,7 +9654,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -10419,14 +9694,10 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ - "matchers", "nu-ansi-term", - "once_cell", - "regex", "sharded-slab", "smallvec", "thread_local", - "tracing", "tracing-core", "tracing-log", ] @@ -10521,33 +9792,14 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.17.3" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" -dependencies = [ - "base64 0.13.1", - "byteorder", - "bytes", - "http 0.2.11", - "httparse", - "log", - "rand 0.8.5", - "sha-1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" dependencies = [ "byteorder", "bytes", "data-encoding", - "http 0.2.11", + "http 1.0.0", "httparse", "log", "rand 0.8.5", @@ -10557,35 +9809,12 @@ dependencies = [ "utf-8", ] -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "log", - "rand 0.8.5", - "thiserror", - "utf-8", -] - [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "ubyte" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" -dependencies = [ - "serde", -] - [[package]] name = "ucd-trie" version = "0.1.6" @@ -10603,27 +9832,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "ulid" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34778c17965aa2a08913b57e1f34db9b4a63f5de31768b55bf20d2795f921259" -dependencies = [ - "getrandom 0.2.12", - "rand 0.8.5", - "web-time", -] - -[[package]] -name = "uncased" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" -dependencies = [ - "serde", - "version_check", -] - [[package]] name = "unicase" version = "2.7.0" @@ -10694,12 +9902,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -10712,7 +9914,7 @@ version = "2.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b52731d03d6bb2fd18289d4028aee361d6c28d44977846793b994b13cdcc64d" dependencies = [ - "base64 0.21.7", + "base64", "hootbin", "log", "native-tls", @@ -10867,50 +10069,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "warp" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e92e22e03ff1230c03a1a8ee37d2f89cd489e2e541b7550d6afad96faed169" -dependencies = [ - "async-compression 0.3.15", - "bytes", - "futures-channel", - "futures-util", - "headers 0.3.9", - "http 0.2.11", - "hyper 0.14.28", - "log", - "mime", - "mime_guess", - "multer 2.1.0", - "percent-encoding", - "pin-project", - "rustls-pemfile", - "scoped-tls", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-stream", - "tokio-tungstenite 0.20.1", - "tokio-util", - "tower-service", - "tracing", -] - -[[package]] -name = "warp-hello-world" -version = "0.1.0" -dependencies = [ - "dioxus", - "reqwest", - "serde", - "tracing", - "tracing-subscriber", - "tracing-wasm", -] - [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -10944,7 +10102,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", "wasm-bindgen-shared", ] @@ -10955,7 +10113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "806a045c4ec4ef7c3ad86dc27bcb641b84d9eeb3846200f56d7ab0885241d654" dependencies = [ "anyhow", - "base64 0.21.7", + "base64", "log", "rustc-demangle", "serde_json", @@ -11010,7 +10168,7 @@ checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -11053,7 +10211,7 @@ checksum = "a5211b7550606857312bba1d978a8ec75692eae187becc5e680444fffc5e6f89" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -11138,16 +10296,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee269d72cc29bf77a2c4bc689cc750fb39f5cbd493d2205bbb3f5c7779cf7b0" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "webbrowser" version = "0.8.12" @@ -11218,16 +10366,6 @@ dependencies = [ "libwebp-sys", ] -[[package]] -name = "webpki" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" -dependencies = [ - "ring 0.17.7", - "untrusted 0.9.0", -] - [[package]] name = "webpki-roots" version = "0.25.4" @@ -11251,7 +10389,7 @@ checksum = "e0ae9c7e420783826cf769d2c06ac9ba462f450eca5893bb8c6c6529a4e5dd33" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.52.0", + "windows", "windows-core", "windows-implement", "windows-interface", @@ -11265,7 +10403,7 @@ checksum = "ac1345798ecd8122468840bcdf1b95e5dc6d2206c5e4b0eafa078d061f59c9bc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -11275,7 +10413,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6ad85fceee6c42fa3d61239eba5a11401bf38407a849ed5ea1b407df08cca72" dependencies = [ "thiserror", - "windows 0.52.0", + "windows", "windows-core", ] @@ -11340,15 +10478,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows" version = "0.52.0" @@ -11378,7 +10507,7 @@ checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -11389,7 +10518,7 @@ checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -11601,9 +10730,18 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.39" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5389a154b01683d28c77f8f68f49dea75f0a4da32557a58f68ee51ebba472d29" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" dependencies = [ "memchr", ] @@ -11624,7 +10762,7 @@ version = "0.35.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3016c47c9b6f7029a9da7cd48af8352327226bba0e955f3c92e2966651365a9" dependencies = [ - "base64 0.21.7", + "base64", "block", "cfg_aliases", "cocoa", @@ -11657,7 +10795,7 @@ dependencies = [ "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.52.0", + "windows", "windows-implement", "windows-version", "x11-dl", @@ -11714,12 +10852,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "xml-rs" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" - [[package]] name = "xxhash-rust" version = "0.8.8" @@ -11732,15 +10864,6 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" -[[package]] -name = "yansi" -version = "1.0.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1367295b8f788d371ce2dbc842c7b709c73ee1364d30351dd300ec2203b12377" -dependencies = [ - "is-terminal", -] - [[package]] name = "zbus" version = "3.15.0" @@ -11824,7 +10947,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 748eb89a8..9ac28a43c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,8 +37,6 @@ members = [ "packages/fullstack/examples/axum-router", "packages/fullstack/examples/axum-desktop", "packages/fullstack/examples/axum-auth", - "packages/fullstack/examples/salvo-hello-world", - "packages/fullstack/examples/warp-hello-world", "packages/fullstack/examples/static-hydrated", # Full project examples "examples/tailwind", @@ -88,6 +86,7 @@ dioxus-fullstack = { path = "packages/fullstack", version = "0.4.1" } dioxus_server_macro = { path = "packages/server-macro", version = "0.4.1" } tracing = "0.1.37" tracing-futures = "0.2.5" +toml = "0.8" tokio = "1.28" slab = "0.4.2" futures-channel = "0.3.21" @@ -105,6 +104,17 @@ manganis-cli-support = { git = "https://github.com/DioxusLabs/collect-assets", r ] } manganis = { git = "https://github.com/DioxusLabs/collect-assets", rev = "f982698" } +lru = "0.12.2" +async-trait = "0.1.77" +axum = "0.7.0" +tower = "0.4.13" +http = "1.0.0" +tower-http = "0.5.1" +hyper = "1.0.0" +hyper-rustls = "0.26.0" +serde_json = "1.0.61" +serde = "1.0.61" + # This is a "virtual package" # It is not meant to be published, but is used so "cargo run --example XYZ" works properly [package] @@ -125,7 +135,6 @@ publish = false manganis = { workspace = true, optional = true} reqwest = { version = "0.11.9", features = ["json"], optional = true} http-range = {version = "0.1.5", optional = true } -warp = { version = "0.3.0", optional = true } [dev-dependencies] dioxus = { workspace = true, features = ["router"] } @@ -149,13 +158,11 @@ tokio = { version = "1.16.1", features = ["full"] } liveview = ["dioxus/liveview"] fullstack = ["dioxus/fullstack"] axum = ["dioxus/axum"] -salvo = ["dioxus/salvo"] -rocket = ["dioxus/rocket"] server = ["dioxus/axum"] default = ["dioxus/desktop"] web = ["dioxus/web"] collect-assets = ["manganis"] -http = ["reqwest", "http-range", "warp"] +http = ["reqwest", "http-range"] [[example]] name = "login_form" diff --git a/packages/cli-config/Cargo.toml b/packages/cli-config/Cargo.toml index 2bcbea1f1..0d93c5ebe 100644 --- a/packages/cli-config/Cargo.toml +++ b/packages/cli-config/Cargo.toml @@ -12,7 +12,7 @@ keywords = ["react", "gui", "cli", "dioxus", "wasm"] clap = { version = "4.2", features = ["derive"], optional = true } serde = { version = "1.0.136", features = ["derive"] } serde_json = "1.0.79" -toml = { version = "0.5.8", optional = true } +toml = { workspace = true, optional = true } cargo_toml = { version = "0.16.0", optional = true } once_cell = "1.18.0" tracing = { workspace = true } diff --git a/packages/cli/Cargo.toml b/packages/cli/Cargo.toml index 657c70e0f..eaa4c7c8f 100644 --- a/packages/cli/Cargo.toml +++ b/packages/cli/Cargo.toml @@ -21,7 +21,7 @@ log = "0.4.14" fern = { version = "0.6.0", features = ["colored"] } serde = { version = "1.0.136", features = ["derive"] } serde_json = "1.0.79" -toml = "0.8.8" +toml = {workspace = true} fs_extra = "1.2.0" cargo_toml = "0.18.0" futures-util = { workspace = true } @@ -32,17 +32,17 @@ tokio = { version = "1.16.1", features = ["fs", "sync", "rt", "macros"] } atty = "0.2.14" chrono = "0.4.19" anyhow = "1" -hyper = "0.14.17" -hyper-rustls = "0.23.2" +hyper = {workspace = true} +hyper-rustls = {workspace = true} indicatif = "0.17.5" subprocess = "0.2.9" rayon = "1.8.0" -axum = { version = "0.5.1", features = ["ws", "headers"] } +axum = { workspace = true, features = ["ws"] } axum-server = { version = "0.5.1", features = ["tls-rustls"] } -tower-http = { version = "0.2.2", features = ["full"] } -headers = "0.3.7" +tower-http = { workspace = true, features = ["full"] } +headers = "0.3.7" walkdir = "2" # tools download @@ -56,7 +56,7 @@ reqwest = { version = "0.11", features = [ flate2 = "1.0.22" tar = "0.4.38" zip = "0.6.2" -tower = "0.4.12" +tower = { workspace = true } lazy_static = "1.4.0" # plugin packages diff --git a/packages/cli/src/main.rs b/packages/cli/src/main.rs index dae2deb2c..d4326a696 100644 --- a/packages/cli/src/main.rs +++ b/packages/cli/src/main.rs @@ -5,9 +5,6 @@ use anyhow::Context; use clap::Parser; use dioxus_cli::*; -#[cfg(feature = "plugin")] -use dioxus_cli::plugin::PluginManager; - use Commands::*; fn get_bin(bin: Option) -> Result { @@ -92,6 +89,9 @@ async fn main() -> anyhow::Result<()> { DioxusConfig::default() }); + #[cfg(feature = "plugin")] + use dioxus_cli::plugin::PluginManager; + #[cfg(feature = "plugin")] PluginManager::init(_dioxus_config.plugin) .context(error_wrapper("Plugin system initialization failed"))?; diff --git a/packages/cli/src/server/web/mod.rs b/packages/cli/src/server/web/mod.rs index 582b81129..6ae873d1f 100644 --- a/packages/cli/src/server/web/mod.rs +++ b/packages/cli/src/server/web/mod.rs @@ -8,8 +8,8 @@ use crate::{ BuildResult, Result, }; use axum::{ - body::{Full, HttpBody}, - extract::{ws::Message, Extension, TypedHeader, WebSocketUpgrade}, + body::{Body, HttpBody}, + extract::{ws::Message, Extension, WebSocketUpgrade}, http::{ self, header::{HeaderName, HeaderValue}, @@ -287,20 +287,18 @@ async fn setup_router( let mut response = if file_service_config.dioxus_config.web.watcher.index_on_404 && response.status() == StatusCode::NOT_FOUND { - let body = Full::from( + let body = Body::from( // TODO: Cache/memoize this. std::fs::read_to_string(file_service_config.out_dir().join("index.html")) .ok() .unwrap(), - ) - .map_err(|err| match err {}) - .boxed(); + ); Response::builder() .status(StatusCode::OK) .body(body) .unwrap() } else { - response.map(|body| body.boxed()) + response.map(|body| body.into()) }; let headers = response.headers_mut(); headers.insert( diff --git a/packages/cli/src/server/web/proxy.rs b/packages/cli/src/server/web/proxy.rs index 4242a55eb..d5e4a4eeb 100644 --- a/packages/cli/src/server/web/proxy.rs +++ b/packages/cli/src/server/web/proxy.rs @@ -5,6 +5,8 @@ use anyhow::Context; use axum::{http::StatusCode, routing::any, Router}; use hyper::{Request, Response, Uri}; +use axum::body::Body as MyBody; + #[derive(Debug, Clone)] struct ProxyClient { inner: hyper::Client>, @@ -24,10 +26,7 @@ impl ProxyClient { } } - async fn send( - &self, - mut req: Request, - ) -> Result> { + async fn send(&self, mut req: Request) -> Result> { let mut uri_parts = req.uri().clone().into_parts(); uri_parts.authority = self.url.authority().cloned(); uri_parts.scheme = self.url.scheme().cloned(); diff --git a/packages/dioxus/Cargo.toml b/packages/dioxus/Cargo.toml index 352a258d5..90fb7ea79 100644 --- a/packages/dioxus/Cargo.toml +++ b/packages/dioxus/Cargo.toml @@ -50,16 +50,10 @@ web = ["dioxus-web", "dioxus-fullstack?/web", "dioxus-config-macro/web", "dioxus ssr = ["dioxus-ssr", "dioxus-router?/ssr", "dioxus-config-macro/ssr"] liveview = ["dioxus-liveview", "dioxus-config-macro/liveview", "dioxus-router?/liveview"] axum = ["dioxus-fullstack?/axum", "ssr", "dioxus-liveview?/axum"] -salvo = ["dioxus-fullstack?/salvo", "ssr", "dioxus-liveview?/salvo"] -warp = ["dioxus-fullstack?/warp", "ssr", "dioxus-liveview?/warp"] -rocket = ["dioxus-liveview?/rocket"] tui = ["dioxus-tui", "dioxus-config-macro/tui"] # This feature just disables the no-renderer-enabled warning third-party-renderer = [] -# This feature enables some nightly flags that make it more clear what structs/methods are available in each feature -nightly-doc = [] - [dev-dependencies] futures-util = { workspace = true } tracing = { workspace = true } diff --git a/packages/dioxus/build.rs b/packages/dioxus/build.rs index e9687a09f..15315eeb9 100644 --- a/packages/dioxus/build.rs +++ b/packages/dioxus/build.rs @@ -5,8 +5,8 @@ fn main() { return; } - let liveview_renderers = ["liveview", "axum", "salvo", "warp", "rocket"]; - let fullstack_renderers = ["axum", "salvo", "warp"]; + let liveview_renderers = ["liveview", "axum"]; + let fullstack_renderers = ["axum"]; let client_renderers = ["desktop", "mobile", "web", "tui"]; let client_renderer_selected = client_renderers .iter() diff --git a/packages/dioxus/src/launch.rs b/packages/dioxus/src/launch.rs index f62377341..e58e3ecb5 100644 --- a/packages/dioxus/src/launch.rs +++ b/packages/dioxus/src/launch.rs @@ -38,7 +38,7 @@ impl LaunchBuilder { /// Launch your web application. #[cfg(feature = "web")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "web")))] + #[cfg_attr(docsrs, doc(cfg(feature = "web")))] pub fn web() -> LaunchBuilder { LaunchBuilder { launch_fn: dioxus_web::launch::launch, @@ -49,7 +49,7 @@ impl LaunchBuilder { /// Launch your desktop application. #[cfg(feature = "desktop")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "desktop")))] + #[cfg_attr(docsrs, doc(cfg(feature = "desktop")))] pub fn desktop() -> LaunchBuilder { LaunchBuilder { launch_fn: dioxus_desktop::launch::launch, @@ -60,7 +60,7 @@ impl LaunchBuilder { /// Launch your fullstack application. #[cfg(feature = "fullstack")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "fullstack")))] + #[cfg_attr(docsrs, doc(cfg(feature = "fullstack")))] pub fn fullstack() -> LaunchBuilder { LaunchBuilder { launch_fn: dioxus_fullstack::launch::launch, @@ -71,7 +71,7 @@ impl LaunchBuilder { /// Launch your fullstack application. #[cfg(feature = "mobile")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "mobile")))] + #[cfg_attr(docsrs, doc(cfg(feature = "mobile")))] pub fn mobile() -> LaunchBuilder { LaunchBuilder { launch_fn: dioxus_mobile::launch::launch, @@ -81,7 +81,7 @@ impl LaunchBuilder { } #[cfg(feature = "tui")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "tui")))] + #[cfg_attr(docsrs, doc(cfg(feature = "tui")))] /// Launch your tui application pub fn tui() -> LaunchBuilder { LaunchBuilder { @@ -232,28 +232,28 @@ pub fn launch(app: fn() -> Element) { } #[cfg(feature = "web")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "web")))] +#[cfg_attr(docsrs, doc(cfg(feature = "web")))] /// Launch your web application without any additional configuration. See [`LaunchBuilder`] for more options. pub fn launch_web(app: fn() -> Element) { LaunchBuilder::web().launch(app) } #[cfg(feature = "desktop")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "desktop")))] +#[cfg_attr(docsrs, doc(cfg(feature = "desktop")))] /// Launch your desktop application without any additional configuration. See [`LaunchBuilder`] for more options. pub fn launch_desktop(app: fn() -> Element) { LaunchBuilder::desktop().launch(app) } #[cfg(feature = "fullstack")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "fullstack")))] +#[cfg_attr(docsrs, doc(cfg(feature = "fullstack")))] /// Launch your fullstack application without any additional configuration. See [`LaunchBuilder`] for more options. pub fn launch_fullstack(app: fn() -> Element) { LaunchBuilder::fullstack().launch(app) } #[cfg(feature = "tui")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "tui")))] +#[cfg_attr(docsrs, doc(cfg(feature = "tui")))] /// Launch your tui application without any additional configuration. See [`LaunchBuilder`] for more options. pub fn launch_tui(app: fn() -> Element) { LaunchBuilder::tui().launch(app) diff --git a/packages/dioxus/src/lib.rs b/packages/dioxus/src/lib.rs index d843cfd56..bd2e8f70b 100644 --- a/packages/dioxus/src/lib.rs +++ b/packages/dioxus/src/lib.rs @@ -1,114 +1,115 @@ #![doc = include_str!("../README.md")] #![doc(html_logo_url = "https://avatars.githubusercontent.com/u/79236386")] #![doc(html_favicon_url = "https://avatars.githubusercontent.com/u/79236386")] -#![cfg_attr(any(docsrs, feature = "nightly-doc"), feature(doc_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] pub use dioxus_core; #[cfg(feature = "launch")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "launch")))] +#[cfg_attr(docsrs, doc(cfg(feature = "launch")))] mod launch; #[cfg(feature = "hooks")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "hooks")))] +#[cfg_attr(docsrs, doc(cfg(feature = "hooks")))] pub use dioxus_hooks as hooks; #[cfg(feature = "signals")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "signals")))] +#[cfg_attr(docsrs, doc(cfg(feature = "signals")))] pub use dioxus_signals as signals; pub mod events { #[cfg(feature = "html")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "html")))] + #[cfg_attr(docsrs, doc(cfg(feature = "html")))] pub use dioxus_html::prelude::*; } #[cfg(feature = "html")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "html")))] +#[cfg_attr(docsrs, doc(cfg(feature = "html")))] pub use dioxus_html as html; #[cfg(feature = "macro")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "macro")))] +#[cfg_attr(docsrs, doc(cfg(feature = "macro")))] pub use dioxus_core_macro as core_macro; pub mod prelude { #[cfg(feature = "launch")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "launch")))] + #[cfg_attr(docsrs, doc(cfg(feature = "launch")))] pub use crate::launch::*; #[cfg(feature = "hooks")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "hooks")))] + #[cfg_attr(docsrs, doc(cfg(feature = "hooks")))] pub use crate::hooks::*; #[cfg(feature = "signals")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "signals")))] + #[cfg_attr(docsrs, doc(cfg(feature = "signals")))] pub use dioxus_signals::*; pub use dioxus_core::prelude::*; #[cfg(feature = "macro")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "macro")))] + #[cfg_attr(docsrs, doc(cfg(feature = "macro")))] #[allow(deprecated)] pub use dioxus_core_macro::{component, format_args_f, inline_props, render, rsx, Props}; #[cfg(feature = "launch")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "launch")))] + #[cfg_attr(docsrs, doc(cfg(feature = "launch")))] pub use dioxus_config_macro::*; #[cfg(feature = "html")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "html")))] + #[cfg_attr(docsrs, doc(cfg(feature = "html")))] pub use dioxus_html as dioxus_elements; #[cfg(feature = "html")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "html")))] + #[cfg_attr(docsrs, doc(cfg(feature = "html")))] pub use dioxus_elements::{prelude::*, GlobalAttributes, SvgAttributes}; #[cfg(all(not(target_arch = "wasm32"), feature = "hot-reload"))] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "hot-reload")))] + #[cfg_attr(docsrs, doc(cfg(feature = "hot-reload")))] pub use dioxus_hot_reload::{self, hot_reload_init}; pub use dioxus_core; #[cfg(feature = "fullstack")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "fullstack")))] + #[cfg_attr(docsrs, doc(cfg(feature = "fullstack")))] pub use dioxus_fullstack::prelude::*; #[cfg(feature = "router")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "router")))] + #[cfg_attr(docsrs, doc(cfg(feature = "router")))] pub use dioxus_router; + #[cfg(feature = "router")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "router")))] + #[cfg_attr(docsrs, doc(cfg(feature = "router")))] pub use dioxus_router::prelude::*; } #[cfg(feature = "web")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "web")))] +#[cfg_attr(docsrs, doc(cfg(feature = "web")))] pub use dioxus_web as web; #[cfg(feature = "router")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "router")))] +#[cfg_attr(docsrs, doc(cfg(feature = "router")))] pub use dioxus_router as router; #[cfg(feature = "fullstack")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "fullstack")))] +#[cfg_attr(docsrs, doc(cfg(feature = "fullstack")))] pub use dioxus_fullstack as fullstack; #[cfg(feature = "desktop")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "desktop")))] +#[cfg_attr(docsrs, doc(cfg(feature = "desktop")))] pub use dioxus_desktop as desktop; #[cfg(feature = "mobile")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "mobile")))] +#[cfg_attr(docsrs, doc(cfg(feature = "mobile")))] pub use dioxus_desktop as mobile; #[cfg(feature = "liveview")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "liveview")))] +#[cfg_attr(docsrs, doc(cfg(feature = "liveview")))] pub use dioxus_liveview as liveview; #[cfg(feature = "tui")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "tui")))] +#[cfg_attr(docsrs, doc(cfg(feature = "tui")))] pub use dioxus_tui as tui; #[cfg(feature = "ssr")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "ssr")))] +#[cfg_attr(docsrs, doc(cfg(feature = "ssr")))] pub use dioxus_ssr as ssr; diff --git a/packages/fullstack/Cargo.toml b/packages/fullstack/Cargo.toml index 63fde221c..861457351 100644 --- a/packages/fullstack/Cargo.toml +++ b/packages/fullstack/Cargo.toml @@ -15,23 +15,17 @@ resolver = "2" server_fn = { version = "0.5.2", default-features = false } dioxus_server_macro = { workspace = true } -# warp -warp = { version = "0.3.5", features = ["compression-gzip"], optional = true } # axum -axum = { version = "0.6.1", features = ["ws", "macros"], default-features = false, optional = true } -tower-http = { version = "0.4.0", optional = true, features = ["fs", "compression-gzip"] } - -# salvo -salvo = { version = "0.63.0", optional = true, features = ["serve-static", "websocket", "compression"] } -http-body-util = { version = "0.1.0-rc.2", optional = true } +axum = { workspace = true, features = ["ws", "macros"], default-features = false, optional = true } +tower-http = { workspace = true, optional = true, features = ["fs", "compression-gzip"] } dioxus-lib = { workspace = true } # Dioxus + SSR dioxus-ssr = { workspace = true, optional = true } -hyper = { version = "0.14.25", optional = true } -http = { version = "0.2.9", optional = true } +hyper = { workspace = true, optional = true } +http = { workspace = true, optional = true } # Web Integration dioxus-web = { workspace = true, features = ["hydrate"], optional = true } @@ -60,7 +54,7 @@ pin-project = { version = "1.1.2", optional = true } thiserror = { workspace = true, optional = true } async-trait = "0.1.71" bytes = "1.4.0" -tower = { version = "0.4.13", features = ["util"], optional = true } +tower = { workspace = true, features = ["util"], optional = true } tower-layer = { version = "0.3.2", optional = true } web-sys = { version = "0.3.61", optional = true, features = ["Window", "Document", "Element", "HtmlDocument", "Storage", "console"] } @@ -75,11 +69,7 @@ hot-reload = ["serde_json", "futures-util"] web = ["dioxus-web", "web-sys"] desktop = ["dioxus-desktop"] mobile = ["dioxus-mobile"] -warp = ["dep:warp", "server"] axum = ["dep:axum", "tower-http", "server"] -salvo = ["dep:salvo", "server", "http-body-util"] server = ["server_fn/ssr", "dioxus_server_macro/server", "tokio", "tokio-util", "tokio-stream", "dioxus-ssr", "dioxus-ssr/incremental", "tower", "hyper", "http", "tower-layer", "anymap", "tracing-futures", "pin-project", "thiserror", "dioxus-cli-config"] default-tls = ["server_fn/default-tls"] rustls = ["server_fn/rustls"] -# This feature enables some nightly flags that make it more clear what structs/methods are available in each feature -nightly-doc = [] diff --git a/packages/fullstack/README.md b/packages/fullstack/README.md index 55f0fd492..3b1b38d5f 100644 --- a/packages/fullstack/README.md +++ b/packages/fullstack/README.md @@ -37,51 +37,43 @@ Full stack Dioxus in under 50 lines of code use dioxus::prelude::*; use dioxus_fullstack::prelude::*; +// On the web, run our client code +#[cfg(feature = "web")] fn main() { - #[cfg(feature = "web")] dioxus_web::launch_with_props( app, get_root_props_from_document().unwrap_or_default(), dioxus_web::Config::new().hydrate(true), ); - #[cfg(feature = "server")] - { - tokio::runtime::Runtime::new() - .unwrap() - .block_on(async move { - warp::serve( - // Automatically handles server side rendering, hot reloading intigration, and hosting server functions - serve_dioxus_application( - "", - ServerConfig::new(app, ()), - ) - ) - .run(([127, 0, 0, 1], 8080)) - .await; - }); - } +} + +// On the server, run a simple warp server +#[cfg(feature = "server")] +#[tokio::main] +async fn main() { + // Automatically handles server side rendering, hot reloading intigration, and hosting server functions + warp::serve(serve_dioxus_application("", ServerConfig::new(app, ()))) + .run(([127, 0, 0, 1], 8080)) + .await; } fn app() -> Element { let meaning = use_signal(|| None); + rsx! { + h1 { "Meaning of life: {meaning:?}" } button { - onclick: move |_| { - to_owned![meaning]; - async move { - if let Ok(data) = get_meaning("life the universe and everything".into()).await { - meaning.set(data); - } + onclick: move |_| async move { + if let Ok(data) = get_meaning("life the universe and everything".into()).await { + meaning.set(data); } }, "Run a server function" } - "Server said: {meaning:?}" - }) + } } -// This code will only run on the server -#[server(GetMeaning)] +#[server] async fn get_meaning(of: String) -> Result, ServerFnError> { Ok(of.contains("life").then(|| 42)) } diff --git a/packages/fullstack/examples/axum-auth/Cargo.toml b/packages/fullstack/examples/axum-auth/Cargo.toml index 2a3efa267..90148f083 100644 --- a/packages/fullstack/examples/axum-auth/Cargo.toml +++ b/packages/fullstack/examples/axum-auth/Cargo.toml @@ -8,13 +8,11 @@ publish = false [dependencies] dioxus-web = { workspace = true, features = ["hydrate"], optional = true } -dioxus = { workspace = true } +dioxus = { features = ["fullstack"], workspace = true } dioxus-fullstack = { workspace = true } -axum = { version = "0.6.12", optional = true } +axum = { workspace = true, optional = true } tokio = { workspace = true, features = ["full"], optional = true } -serde = "1.0.159" -execute = "0.2.12" -tower-http = { version = "0.4.1", features = ["auth"], optional = true } +tower-http = { workspace = true, features = ["auth"], optional = true } simple_logger = { version = "4.2.0", optional = true } async-trait = { version = "0.1.71", optional = true } sqlx = { version = "0.7.0", features = [ @@ -26,9 +24,12 @@ sqlx = { version = "0.7.0", features = [ "tls-rustls", "runtime-tokio", ], optional = true } +http = { workspace = true, optional = true } +tower = { workspace = true, optional = true } + +serde = "1.0.159" +execute = "0.2.12" anyhow = "1.0.71" -http = { version = "0.2.9", optional = true } -tower = { version = "0.4.13", optional = true } [dependencies.axum_session] version = "0.3.0" @@ -36,7 +37,7 @@ features = ["sqlite-rustls"] optional = true [dependencies.axum_session_auth] -version = "0.3.0" +version = "0.12.0" features = ["sqlite-rustls"] optional = true diff --git a/packages/fullstack/examples/axum-auth/src/main.rs b/packages/fullstack/examples/axum-auth/src/main.rs index 6d9084b7c..b7eb2364a 100644 --- a/packages/fullstack/examples/axum-auth/src/main.rs +++ b/packages/fullstack/examples/axum-auth/src/main.rs @@ -17,7 +17,7 @@ use serde::{Deserialize, Serialize}; fn main() { #[cfg(feature = "web")] // Hydrate the application on the client - dioxus_web::launch_cfg(app, dioxus_web::Config::new().hydrate(true)); + dioxus_web::launch::launch_cfg(app, dioxus_web::Config::new().hydrate(true)); #[cfg(feature = "server")] { @@ -51,7 +51,9 @@ fn main() { // build our application with some routes let app = Router::new() // Server side render the application, serve static assets, and register server functions - .serve_dioxus_application("", ServerConfig::new(app, ())) + .serve_dioxus_application("", ServeConfig::builder().build(), || { + VirtualDom::new(app) + }) .layer( axum_session_auth::AuthSessionLayer::< crate::auth::User, diff --git a/packages/fullstack/examples/axum-desktop/Cargo.toml b/packages/fullstack/examples/axum-desktop/Cargo.toml index fe16f2419..d789b48e5 100644 --- a/packages/fullstack/examples/axum-desktop/Cargo.toml +++ b/packages/fullstack/examples/axum-desktop/Cargo.toml @@ -7,8 +7,8 @@ publish = false [lib] [dependencies] -dioxus = { workspace = true } -axum = { version = "0.6.12", optional = true } +dioxus = { workspace = true, features = ["launch"] } +axum = { workspace = true, optional = true } tokio = { workspace = true, features = ["full"], optional = true } serde = "1.0.159" diff --git a/packages/fullstack/examples/axum-desktop/src/client.rs b/packages/fullstack/examples/axum-desktop/src/client.rs index 247f2e8f2..b9a2e0463 100644 --- a/packages/fullstack/examples/axum-desktop/src/client.rs +++ b/packages/fullstack/examples/axum-desktop/src/client.rs @@ -9,5 +9,7 @@ fn main() { // Set the url of the server where server functions are hosted. #[cfg(not(feature = "server"))] dioxus::fullstack::prelude::server_fn::set_server_url("http://127.0.0.1:8080"); - dioxus::desktop::launch(app) + + #[cfg(feature = "desktop")] + dioxus::prelude::launch_desktop(app) } diff --git a/packages/fullstack/examples/axum-router/Cargo.toml b/packages/fullstack/examples/axum-router/Cargo.toml index 3e020b764..dfac4be56 100644 --- a/packages/fullstack/examples/axum-router/Cargo.toml +++ b/packages/fullstack/examples/axum-router/Cargo.toml @@ -8,7 +8,7 @@ publish = false [dependencies] dioxus = { workspace = true, features = ["router"] } -axum = { version = "0.6.12", optional = true } +axum = { workspace = true, optional = true } tokio = {workspace = true, features = ["full"], optional = true } serde = { version = "1.0.159", features = ["derive"] } diff --git a/packages/fullstack/examples/salvo-hello-world/.gitignore b/packages/fullstack/examples/salvo-hello-world/.gitignore deleted file mode 100644 index 21fff11dd..000000000 --- a/packages/fullstack/examples/salvo-hello-world/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -dist -target -static -.dioxus \ No newline at end of file diff --git a/packages/fullstack/examples/salvo-hello-world/Cargo.toml b/packages/fullstack/examples/salvo-hello-world/Cargo.toml deleted file mode 100644 index 87c82bb4e..000000000 --- a/packages/fullstack/examples/salvo-hello-world/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "salvo-hello-world" -version = "0.1.0" -edition = "2021" -publish = false - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -dioxus-web = { workspace = true, features=["hydrate"], optional = true } -dioxus = { workspace = true } -dioxus-fullstack = { workspace = true } -serde = "1.0.159" -salvo = { version = "0.63.0", optional = true } -execute = "0.2.12" -reqwest = "0.11.18" -simple_logger = "4.2.0" -tracing-wasm = "0.2.1" -tracing = { workspace = true } -tracing-subscriber = "0.3.17" - -[features] -default = [] -server = ["salvo", "dioxus-fullstack/salvo"] -web = ["dioxus-web"] diff --git a/packages/fullstack/examples/salvo-hello-world/src/main.rs b/packages/fullstack/examples/salvo-hello-world/src/main.rs deleted file mode 100644 index 4870e951a..000000000 --- a/packages/fullstack/examples/salvo-hello-world/src/main.rs +++ /dev/null @@ -1,57 +0,0 @@ -//! Run with: -//! -//! ```sh -//! dx serve --platform fullstack -//! ``` - -#![allow(non_snake_case, unused)] -use dioxus::prelude::*; -use dioxus_fullstack::{launch, prelude::*}; -use serde::{Deserialize, Serialize}; - -fn app() -> Element { - let state = use_server_future(move || async move { get_server_data().await.unwrap() })?; - - let mut count = use_signal(|| 0); - let mut text = use_signal(|| "...".to_string()); - - rsx! { - div { "Server state: {state.value().unwrap()}" } - h1 { "High-Five counter: {count}" } - button { onclick: move |_| count += 1, "Up high!" } - button { onclick: move |_| count -= 1, "Down low!" } - button { - onclick: move |_| async move { - if let Ok(data) = get_server_data().await { - println!("Client received: {}", data); - text.set(data.clone()); - post_server_data(data).await.unwrap(); - } - }, - "Run a server function!" - } - "Server said: {text}" - } -} - -#[server(PostServerData)] -async fn post_server_data(data: String) -> Result<(), ServerFnError> { - println!("Server received: {}", data); - - Ok(()) -} - -#[server(GetServerData)] -async fn get_server_data() -> Result { - Ok(reqwest::get("https://httpbin.org/ip").await?.text().await?) -} - -fn main() { - #[cfg(feature = "web")] - tracing_wasm::set_as_global_default(); - - #[cfg(feature = "server")] - tracing_subscriber::fmt::init(); - - LaunchBuilder::fullstack().launch(app); -} diff --git a/packages/fullstack/examples/warp-hello-world/.gitignore b/packages/fullstack/examples/warp-hello-world/.gitignore deleted file mode 100644 index 21fff11dd..000000000 --- a/packages/fullstack/examples/warp-hello-world/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -dist -target -static -.dioxus \ No newline at end of file diff --git a/packages/fullstack/examples/warp-hello-world/Cargo.toml b/packages/fullstack/examples/warp-hello-world/Cargo.toml deleted file mode 100644 index df7ac9d96..000000000 --- a/packages/fullstack/examples/warp-hello-world/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "warp-hello-world" -version = "0.1.0" -edition = "2021" -publish = false - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -dioxus = { workspace = true, features = ["fullstack"] } -serde = "1.0.159" -tracing-wasm = "0.2.1" -tracing = { workspace = true } -tracing-subscriber = "0.3.17" -reqwest = "0.11.18" - -[features] -default = [] -server = ["dioxus/warp"] -web = ["dioxus/web"] diff --git a/packages/fullstack/examples/warp-hello-world/src/main.rs b/packages/fullstack/examples/warp-hello-world/src/main.rs deleted file mode 100644 index f424e15c3..000000000 --- a/packages/fullstack/examples/warp-hello-world/src/main.rs +++ /dev/null @@ -1,54 +0,0 @@ -//! Run with: -//! -//! ```sh -//! dx serve --platform fullstack -//! ``` - -#![allow(non_snake_case, unused)] -use dioxus::prelude::*; - -fn app() -> Element { - let mut count = use_signal(|| 0); - let text = use_signal(|| "...".to_string()); - - rsx! { - h1 { "High-Five counter: {count}" } - button { onclick: move |_| count += 1, "Up high!" } - button { onclick: move |_| count -= 1, "Down low!" } - button { - onclick: move |_| { - to_owned![text]; - async move { - if let Ok(data) = get_server_data().await { - println!("Client received: {}", data); - text.set(data.clone()); - post_server_data(data).await.unwrap(); - } - } - }, - "Run a server function!" - } - "Server said: {text}" - } -} - -#[server] -async fn post_server_data(data: String) -> Result<(), ServerFnError> { - println!("Server received: {}", data); - - Ok(()) -} - -#[server] -async fn get_server_data() -> Result { - Ok(reqwest::get("https://httpbin.org/ip").await?.text().await?) -} - -fn main() { - #[cfg(feature = "web")] - tracing_wasm::set_as_global_default(); - #[cfg(feature = "server")] - tracing_subscriber::fmt::init(); - - launch(app); -} diff --git a/packages/fullstack/src/adapters/axum_adapter.rs b/packages/fullstack/src/adapters/axum_adapter.rs index d73edeb88..e12590bed 100644 --- a/packages/fullstack/src/adapters/axum_adapter.rs +++ b/packages/fullstack/src/adapters/axum_adapter.rs @@ -55,7 +55,7 @@ //! ``` use axum::{ - body::{self, Body, BoxBody}, + body::{self, Body}, extract::State, handler::Handler, http::{Request, Response, StatusCode}, @@ -234,7 +234,7 @@ where mut handler: impl FnMut(server_fn::ServerFnTraitObj<()>) -> H, ) -> Self where - H: Handler, + H: Handler, T: 'static, S: Clone + Send + Sync + 'static, { @@ -468,10 +468,10 @@ pub async fn render_handler( .await } -fn report_err(e: E) -> Response { +fn report_err(e: E) -> Response { Response::builder() .status(StatusCode::INTERNAL_SERVER_ERROR) - .body(body::boxed(format!("Error: {}", e))) + .body(body::Body::new(format!("Error: {}", e))) .unwrap() } diff --git a/packages/fullstack/src/adapters/mod.rs b/packages/fullstack/src/adapters/mod.rs index 61f24bf3c..3e8c9321f 100644 --- a/packages/fullstack/src/adapters/mod.rs +++ b/packages/fullstack/src/adapters/mod.rs @@ -12,15 +12,13 @@ #[cfg(feature = "axum")] pub mod axum_adapter; -// #[cfg(feature = "salvo")] -// pub mod salvo_adapter; -#[cfg(feature = "warp")] -pub mod warp_adapter; use http::StatusCode; use server_fn::{Encoding, Payload}; use std::sync::{Arc, RwLock}; +type MyBody = axum::body::Body; + use crate::{ layer::{BoxedService, Service}, prelude::{DioxusServerContext, ProvideServerContext}, @@ -68,11 +66,11 @@ impl ServerFnHandler { impl Service for ServerFnHandler { fn run( &mut self, - req: http::Request, + req: http::Request, ) -> std::pin::Pin< Box< dyn std::future::Future< - Output = Result, server_fn::ServerFnError>, + Output = Result, server_fn::ServerFnError>, > + Send, >, > { @@ -83,7 +81,7 @@ impl Service for ServerFnHandler { Box::pin(async move { let query = req.uri().query().unwrap_or_default().as_bytes().to_vec(); let (parts, body) = req.into_parts(); - let body = hyper::body::to_bytes(body).await?.to_vec(); + let body = axum::body::to_bytes(body, usize::MAX).await?.to_vec(); let headers = &parts.headers; let accept_header = headers.get("Accept").cloned(); let parts = Arc::new(RwLock::new(parts)); diff --git a/packages/fullstack/src/adapters/salvo_adapter.rs b/packages/fullstack/src/adapters/salvo_adapter.rs deleted file mode 100644 index a30097c9a..000000000 --- a/packages/fullstack/src/adapters/salvo_adapter.rs +++ /dev/null @@ -1,581 +0,0 @@ -//! Dioxus utilities for the [Salvo](https://salvo.rs) server framework. -//! -//! # Example -//! ```rust -//! #![allow(non_snake_case)] -//! use dioxus_lib::prelude::*; -//! use dioxus_fullstack::prelude::*; -//! -//! fn main() { -//! #[cfg(feature = "web")] -//! dioxus_web::launch_cfg(app, dioxus_web::Config::new().hydrate(true)); -//! #[cfg(feature = "server")] -//! { -//! use salvo::prelude::*; -//! tokio::runtime::Runtime::new() -//! .unwrap() -//! .block_on(async move { -//! let router = -//! Router::new().serve_dioxus_application("", ServerConfig::new(app, ())); -//! Server::new(TcpListener::bind("127.0.0.1:8080")) -//! .serve(router) -//! .await; -//! }); -//! } -//! } -//! -//! fn app() -> Element { -//! let text = use_signal(|| "...".to_string()); -//! -//! rsx! { -//! button { -//! onclick: move |_| { -//! to_owned![text]; -//! async move { -//! if let Ok(data) = get_server_data().await { -//! text.set(data); -//! } -//! } -//! }, -//! "Run a server function" -//! } -//! "Server said: {text}" -//! }) -//! } -//! -//! #[server(GetServerData)] -//! async fn get_server_data() -> Result { -//! Ok("Hello from the server!".to_string()) -//! } -//! ``` - -use dioxus_lib::prelude::*; -use http_body_util::{BodyExt, Limited}; -use hyper::body::Body as HyperBody; -use hyper::StatusCode; -use salvo::{ - async_trait, handler, - http::{ - cookie::{Cookie, CookieJar}, - ParseError, - }, - serve_static::{StaticDir, StaticFile}, - Depot, Error as SalvoError, FlowCtrl, Handler, Request, Response, Router, -}; -use server_fn::{Encoding, ServerFunctionRegistry}; -use std::error::Error; -use std::sync::Arc; -use std::sync::RwLock; - -use crate::{ - layer::Service, prelude::*, render::SSRState, serve_config::ServeConfig, - server_fn::DioxusServerFnRegistry, server_fn_service, -}; - -type HyperRequest = hyper::Request; -type HyperResponse = hyper::Response; - -/// A extension trait with utilities for integrating Dioxus with your Salvo router. -pub trait DioxusRouterExt { - /// Registers server functions with a custom handler function. This allows you to pass custom context to your server functions by generating a [`DioxusServerContext`] from the request. - /// - /// # Example - /// ```rust - /// use salvo::prelude::*; - /// use std::{net::TcpListener, sync::Arc}; - /// use dioxus_fullstack::prelude::*; - /// - /// struct ServerFunctionHandler { - /// server_fn: server_fn::ServerFnTraitObj<()>, - /// } - /// - /// #[handler] - /// impl ServerFunctionHandler { - /// async fn handle( - /// &self, - /// req: &mut Request, - /// depot: &mut Depot, - /// res: &mut Response, - /// flow: &mut FlowCtrl, - /// ) { - /// // Add the headers to server context - /// ServerFnHandler::new((req.headers().clone(),), self.server_fn.clone()) - /// .handle(req, depot, res, flow) - /// .await - /// } - /// } - /// - /// #[tokio::main] - /// async fn main() { - /// let router = Router::new() - /// .register_server_fns_with_handler("", |func| { - /// ServerFnHandler::new(DioxusServerContext::default(), func) - /// }); - /// Server::new(TcpListener::bind("127.0.0.1:8080")) - /// .serve(router) - /// .await; - /// } - /// ``` - fn register_server_fns_with_handler( - self, - server_fn_route: &'static str, - handler: impl Fn(server_fn::ServerFnTraitObj<()>) -> H, - ) -> Self - where - H: Handler + 'static; - - /// Registers server functions with the default handler. This handler function will pass an empty [`DioxusServerContext`] to your server functions. - /// - /// # Example - /// ```rust - /// use salvo::prelude::*; - /// use std::{net::TcpListener, sync::Arc}; - /// use dioxus_fullstack::prelude::*; - /// - /// #[tokio::main] - /// async fn main() { - /// let router = Router::new() - /// .register_server_fns(""); - /// Server::new(TcpListener::bind("127.0.0.1:8080")) - /// .serve(router) - /// .await; - /// } - /// - /// ``` - fn register_server_fns(self, server_fn_route: &'static str) -> Self; - - /// Register the web RSX hot reloading endpoint. This will enable hot reloading for your application in debug mode when you call [`dioxus_hot_reload::hot_reload_init`]. - /// - /// # Example - /// ```rust - /// use salvo::prelude::*; - /// use std::{net::TcpListener, sync::Arc}; - /// use dioxus_fullstack::prelude::*; - /// - /// #[tokio::main] - /// async fn main() { - /// let router = Router::new() - /// .connect_hot_reload(); - /// Server::new(TcpListener::bind("127.0.0.1:8080")) - /// .serve(router) - /// .await; - /// } - fn connect_hot_reload(self) -> Self; - - /// Serves the static WASM for your Dioxus application (except the generated index.html). - /// - /// # Example - /// ```rust - /// use salvo::prelude::*; - /// use std::{net::TcpListener, sync::Arc}; - /// use dioxus_fullstack::prelude::*; - /// - /// #[tokio::main] - /// async fn main() { - /// let router = Router::new() - /// .server_static_assets("/dist"); - /// Server::new(TcpListener::bind("127.0.0.1:8080")) - /// .serve(router) - /// .await; - /// } - /// ``` - fn serve_static_assets(self, assets_path: impl Into) -> Self; - - /// Serves the Dioxus application. This will serve a complete server side rendered application. - /// This will serve static assets, server render the application, register server functions, and intigrate with hot reloading. - /// - /// # Example - /// ```rust - /// #![allow(non_snake_case)] - /// use dioxus_lib::prelude::*; - /// use dioxus_fullstack::prelude::*; - /// use salvo::prelude::*; - /// use std::{net::TcpListener, sync::Arc}; - /// - /// #[tokio::main] - /// async fn main() { - /// let router = Router::new().serve_dioxus_application("", ServerConfig::new(app, ())); - /// Server::new(TcpListener::bind("127.0.0.1:8080")) - /// .serve(router) - /// .await; - /// } - /// - /// fn app() -> Element {unimplemented!() } - /// ``` - fn serve_dioxus_application( - self, - server_fn_path: &'static str, - cfg: impl Into, - virtual_dom_factory: impl Fn() -> VirtualDom + Send + Sync + 'static, - ) -> Self; -} - -impl DioxusRouterExt for Router { - fn register_server_fns_with_handler( - self, - server_fn_route: &'static str, - mut handler: impl FnMut(server_fn::ServerFnTraitObj<()>) -> H, - ) -> Self - where - H: Handler + 'static, - { - let mut router = self; - for server_fn_path in DioxusServerFnRegistry::paths_registered() { - let func = DioxusServerFnRegistry::get(server_fn_path).unwrap(); - let full_route = format!("{server_fn_route}/{server_fn_path}"); - match func.encoding() { - Encoding::Url | Encoding::Cbor => { - router = router.push(Router::with_path(&full_route).post(handler(func))); - } - Encoding::GetJSON | Encoding::GetCBOR => { - router = router.push(Router::with_path(&full_route).get(handler(func))); - } - } - } - router - } - - fn register_server_fns(self, server_fn_route: &'static str) -> Self { - self.register_server_fns_with_handler(server_fn_route, |func| ServerFnHandler { - server_context: DioxusServerContext::default(), - function: func, - }) - } - - fn serve_static_assets(mut self, assets_path: impl Into) -> Self { - let assets_path = assets_path.into(); - - // Serve all files in dist folder except index.html - let dir = std::fs::read_dir(&assets_path).unwrap_or_else(|e| { - panic!( - "Couldn't read assets directory at {:?}: {}", - &assets_path, e - ) - }); - - for entry in dir.flatten() { - let path = entry.path(); - if path.ends_with("index.html") { - continue; - } - let route = path - .strip_prefix(&assets_path) - .unwrap() - .iter() - .map(|segment| { - segment.to_str().unwrap_or_else(|| { - panic!("Failed to convert path segment {:?} to string", segment) - }) - }) - .collect::>() - .join("/"); - if path.is_file() { - let route = format!("/{}", route); - let serve_dir = StaticFile::new(path.clone()); - self = self.push(Router::with_path(route).get(serve_dir)) - } else { - let route = format!("/{}/<**path>", route); - let serve_dir = StaticDir::new([path.clone()]); - self = self.push(Router::with_path(route).get(serve_dir)) - } - } - - self - } - - fn serve_dioxus_application( - self, - server_fn_path: &'static str, - cfg: impl Into, - virtual_dom_factory: impl Fn() -> VirtualDom + Send + Sync + 'static, - ) -> Self { - let cfg = cfg.into(); - - self.serve_static_assets(cfg.assets_path.clone()) - .connect_hot_reload() - .register_server_fns(server_fn_path) - .push(Router::with_path("/<**any_path>").get(SSRHandler { - config: cfg, - virtual_dom: virtual_dom_factory, - })) - } - - fn connect_hot_reload(self) -> Self { - let mut _dioxus_router = Router::with_path("_dioxus"); - _dioxus_router = - _dioxus_router.push(Router::with_path("hot_reload").handle(HotReloadHandler)); - #[cfg(all(debug_assertions, feature = "hot-reload"))] - { - _dioxus_router = _dioxus_router.push(Router::with_path("disconnect").handle(ignore_ws)); - } - self.push(_dioxus_router) - } -} - -/// Extracts the parts of a request that are needed for server functions. This will take parts of the request and replace them with empty values. -pub fn extract_parts(req: &mut Request) -> http::request::Parts { - let mut parts = http::request::Request::new(()).into_parts().0; - parts.method = std::mem::take(req.method_mut()); - parts.uri = std::mem::take(req.uri_mut()); - parts.version = req.version(); - parts.headers = std::mem::take(req.headers_mut()); - parts.extensions = std::mem::take(req.extensions_mut()); - - parts -} - -fn apply_request_parts_to_response( - headers: hyper::header::HeaderMap, - response: &mut salvo::prelude::Response, -) { - let mut_headers = response.headers_mut(); - for (key, value) in headers.iter() { - mut_headers.insert(key, value.clone()); - } -} - -#[inline] -async fn convert_request(req: &mut Request) -> Result { - let forward_url: hyper::Uri = TryFrom::try_from(req.uri()).map_err(SalvoError::other)?; - let mut build = hyper::Request::builder() - .method(req.method()) - .uri(&forward_url); - for (key, value) in req.headers() { - build = build.header(key, value); - } - static SECURE_MAX_SIZE: usize = 64 * 1024; - - let body = Limited::new(req.take_body(), SECURE_MAX_SIZE) - .collect() - .await - .map_err(ParseError::other)? - .to_bytes(); - build.body(body.into()).map_err(SalvoError::other) -} - -#[inline] -async fn convert_response(response: HyperResponse, res: &mut Response) { - let (parts, body) = response.into_parts(); - let http::response::Parts { - version, - headers, - status, - .. - } = parts; - res.status_code = Some(status); - res.version = version; - res.cookies = CookieJar::new(); - for cookie in headers.get_all(http::header::SET_COOKIE).iter() { - if let Some(cookie) = cookie - .to_str() - .ok() - .and_then(|s| Cookie::parse(s.to_string()).ok()) - { - res.cookies.add_original(cookie); - } - } - res.headers = headers; - res.version = version; - if let Ok(bytes) = hyper::body::to_bytes(body).await { - res.body = bytes.into() - } -} - -/// A handler that renders a Dioxus application to HTML using server-side rendering. -pub struct SSRHandler { - config: ServeConfig, - virtual_dom: Box VirtualDom + Send + Sync>, -} - -impl SSRHandler { - /// Creates a new SSR handler with the given configuration. - pub fn new( - config: ServeConfig, - virtual_dom: impl Fn() -> VirtualDom + Send + Sync + 'static, - ) -> Self { - Self { - config, - virtual_dom: Box::new(virtual_dom), - } - } -} - -#[async_trait] -impl Handler for SSRHandler { - async fn handle( - &self, - req: &mut Request, - depot: &mut Depot, - res: &mut Response, - _flow: &mut FlowCtrl, - ) { - // Get the SSR renderer from the depot or create a new one if it doesn't exist - let renderer_pool = if let Some(renderer) = depot.obtain::() { - renderer.clone() - } else { - let renderer = SSRState::new(&self.cfg); - depot.inject(renderer.clone()); - renderer - }; - - let route = req.uri().path().to_string(); - let parts: Arc> = Arc::new(RwLock::new(extract_parts(req))); - let server_context = DioxusServerContext::new(parts); - - match renderer_pool - .render(route, &self.cfg, &server_context) - .await - { - Ok(rendered) => { - let crate::render::RenderResponse { html, freshness } = rendered; - - res.write_body(html).unwrap(); - - let headers = server_context.response_parts().unwrap().headers.clone(); - apply_request_parts_to_response(headers, res); - freshness.write(res.headers_mut()); - } - Err(err) => { - tracing::error!("Error rendering SSR: {}", err); - res.write_body("Error rendering SSR").unwrap(); - } - }; - } -} - -/// A default handler for server functions. It will deserialize the request body, call the server function, and serialize the response. -pub struct ServerFnHandler { - server_context: DioxusServerContext, - function: server_fn::ServerFnTraitObj<()>, -} - -impl ServerFnHandler { - /// Create a new server function handler with the given server context and server function. - pub fn new( - server_context: impl Into, - function: server_fn::ServerFnTraitObj<()>, - ) -> Self { - let server_context = server_context.into(); - Self { - server_context, - function, - } - } -} - -#[handler] -impl ServerFnHandler { - async fn handle(&self, req: &mut Request, _depot: &mut Depot, res: &mut Response) { - match convert_request(req).await { - Ok(hyper_req) => { - let response = - server_fn_service(self.server_context.clone(), self.function.clone()) - .run(hyper_req) - .await - .unwrap(); - convert_response(response, res).await; - } - Err(err) => handle_error(err, res), - } - } -} - -fn handle_error(error: impl Error + Send + Sync, res: &mut Response) { - let mut resp_err = Response::new(); - resp_err.status_code(StatusCode::INTERNAL_SERVER_ERROR); - resp_err.render(format!("Internal Server Error: {}", error)); - *res = resp_err; -} - -/// A handler for Dioxus web hot reload websocket. This will send the updated static parts of the RSX to the client when they change. -#[cfg(not(all(debug_assertions, feature = "hot-reload")))] -#[derive(Default)] -pub struct HotReloadHandler; - -#[cfg(not(all(debug_assertions, feature = "hot-reload")))] -#[handler] -impl HotReloadHandler { - async fn handle( - &self, - _req: &mut Request, - _depot: &mut Depot, - _res: &mut Response, - ) -> Result<(), salvo::http::StatusError> { - Err(salvo::http::StatusError::not_found()) - } -} - -/// A handler for Dioxus web hot reload websocket. This will send the updated static parts of the RSX to the client when they change. -#[cfg(all(debug_assertions, feature = "hot-reload"))] -#[derive(Default)] -pub struct HotReloadHandler; - -#[cfg(all(debug_assertions, feature = "hot-reload"))] -#[handler] -impl HotReloadHandler { - async fn handle( - &self, - req: &mut Request, - _depot: &mut Depot, - res: &mut Response, - ) -> Result<(), salvo::http::StatusError> { - use salvo::websocket::Message; - use salvo::websocket::WebSocketUpgrade; - - let state = crate::hot_reload::spawn_hot_reload().await; - - WebSocketUpgrade::new() - .upgrade(req, res, move |mut websocket| async move { - use futures_util::StreamExt; - - println!("🔥 Hot Reload WebSocket connected"); - { - // update any rsx calls that changed before the websocket connected. - { - println!("🔮 Finding updates since last compile..."); - let templates_read = state.templates.read().await; - - for template in &*templates_read { - if websocket - .send(Message::text(serde_json::to_string(&template).unwrap())) - .await - .is_err() - { - return; - } - } - } - println!("finished"); - } - - let mut rx = tokio_stream::wrappers::WatchStream::from_changes( - state.message_receiver.clone(), - ); - while let Some(change) = rx.next().await { - if let Some(template) = change { - let template = { serde_json::to_string(&template).unwrap() }; - if websocket.send(Message::text(template)).await.is_err() { - break; - }; - } - } - }) - .await - } -} - -#[cfg(all(debug_assertions, feature = "hot-reload"))] -#[handler] -async fn ignore_ws(req: &mut Request, res: &mut Response) -> Result<(), salvo::http::StatusError> { - use salvo::websocket::WebSocketUpgrade; - WebSocketUpgrade::new() - .upgrade(req, res, |mut ws| async move { - let _ = ws.send(salvo::websocket::Message::text("connected")).await; - while let Some(msg) = ws.recv().await { - if msg.is_err() { - return; - }; - } - }) - .await -} diff --git a/packages/fullstack/src/adapters/warp_adapter.rs b/packages/fullstack/src/adapters/warp_adapter.rs deleted file mode 100644 index 711980ec8..000000000 --- a/packages/fullstack/src/adapters/warp_adapter.rs +++ /dev/null @@ -1,417 +0,0 @@ -//! Dioxus utilities for the [Warp](https://docs.rs/warp/latest/warp/index.html) server framework. -//! -//! # Example -//! ```rust -//! #![allow(non_snake_case)] -//! use dioxus_lib::prelude::*; -//! use dioxus_fullstack::prelude::*; -//! -//! fn main() { -//! #[cfg(feature = "web")] -//! dioxus_web::launch_cfg(app, dioxus_web::Config::new().hydrate(true)); -//! #[cfg(feature = "server")] -//! { -//! tokio::runtime::Runtime::new() -//! .unwrap() -//! .block_on(async move { -//! let routes = serve_dioxus_application("", ServerConfig::new(app, ())); -//! warp::serve(routes).run(([127, 0, 0, 1], 8080)).await; -//! }); -//! } -//! } -//! -//! fn app() -> Element { -//! let text = use_signal(|| "...".to_string()); -//! -//! rsx! { -//! button { -//! onclick: move |_| { -//! to_owned![text]; -//! async move { -//! if let Ok(data) = get_server_data().await { -//! text.set(data); -//! } -//! } -//! }, -//! "Run a server function" -//! } -//! "Server said: {text}" -//! }) -//! } -//! -//! #[server(GetServerData)] -//! async fn get_server_data() -> Result { -//! Ok("Hello from the server!".to_string()) -//! } -//! -//! ``` - -use crate::layer::Service; -use crate::{ - prelude::*, render::SSRState, serve_config::ServeConfig, server_fn::DioxusServerFnRegistry, -}; - -use crate::server_fn_service; -use dioxus_lib::prelude::VirtualDom; -use server_fn::{Encoding, Payload, ServerFunctionRegistry}; -use std::error::Error; -use std::sync::Arc; -use std::sync::RwLock; -use tokio::task::spawn_blocking; -use warp::path::FullPath; -use warp::Rejection; -use warp::{ - filters::BoxedFilter, - http::{Response, StatusCode}, - hyper::body::Bytes, - path, Filter, Reply, -}; - -/// Registers server functions with a custom handler function. This allows you to pass custom context to your server functions by generating a [`DioxusServerContext`] from the request. -/// -/// # Example -/// ```rust -/// use warp::{body, header, hyper::HeaderMap, path, post, Filter}; -/// -/// #[tokio::main] -/// async fn main() { -/// let routes = register_server_fns_with_handler(server_fn_route, |full_route, func| { -/// path(full_route) -/// .and(warp::post().or(warp::get()).unify()) -/// .and(request_parts()) -/// .and(warp::body::bytes()) -/// .and_then(move |parts, bytes: bytes::Bytes| { -/// let mut service = server_fn_service(DioxusServerContext::default(), func.clone()); -/// async move { -/// let req = warp::hyper::Request::from_parts(parts, bytes.into()); -/// service.run(req).await.map_err(|err| { -/// tracing::error!("Server function error: {}", err); -/// warp::reject::reject() -/// }) -/// } -/// }) -/// }) -/// warp::serve(routes).run(([127, 0, 0, 1], 8080)).await; -/// } -/// ``` -pub fn register_server_fns_with_handler( - server_fn_route: &'static str, - mut handler: H, -) -> BoxedFilter<(R,)> -where - H: FnMut(String, server_fn::ServerFnTraitObj<()>) -> F, - F: Filter + Send + Sync + 'static, - F::Extract: Send, - R: Reply + 'static, -{ - let mut filter: Option> = None; - for server_fn_path in DioxusServerFnRegistry::paths_registered() { - let func = DioxusServerFnRegistry::get(server_fn_path).unwrap(); - let full_route = format!("{server_fn_route}/{server_fn_path}") - .trim_start_matches('/') - .to_string(); - let route = handler(full_route, func).boxed(); - if let Some(boxed_filter) = filter.take() { - filter = Some(boxed_filter.or(route).unify().boxed()); - } else { - filter = Some(route); - } - } - filter.expect("No server functions found") -} - -/// Registers server functions with the default handler. This handler function will pass an empty [`DioxusServerContext`] to your server functions. -/// -/// # Example -/// ```rust -/// use dioxus_fullstack::prelude::*; -/// -/// #[tokio::main] -/// async fn main() { -/// let routes = register_server_fns(""); -/// warp::serve(routes).run(([127, 0, 0, 1], 8080)).await; -/// } -/// ``` -pub fn register_server_fns(server_fn_route: &'static str) -> BoxedFilter<(impl Reply,)> { - register_server_fns_with_handler(server_fn_route, |full_route, func| { - path(full_route) - .and(warp::post().or(warp::get()).unify()) - .and(request_parts()) - .and(warp::body::bytes()) - .and_then(move |parts, bytes: bytes::Bytes| { - let mut service = server_fn_service(DioxusServerContext::default(), func.clone()); - async move { - let req = warp::hyper::Request::from_parts(parts, bytes.into()); - service.run(req).await.map_err(|err| { - tracing::error!("Server function error: {}", err); - - struct WarpServerFnError(String); - impl std::fmt::Debug for WarpServerFnError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.0) - } - } - - impl warp::reject::Reject for WarpServerFnError {} - - warp::reject::custom(WarpServerFnError(err.to_string())) - }) - } - }) - }) -} - -/// Serves the Dioxus application. This will serve a complete server side rendered application. -/// This will serve static assets, server render the application, register server functions, and intigrate with hot reloading. -/// -/// # Example -/// ```rust -/// #![allow(non_snake_case)] -/// use dioxus_lib::prelude::*; -/// use dioxus_fullstack::prelude::*; -/// -/// #[tokio::main] -/// async fn main() { -/// let routes = serve_dioxus_application("", ServerConfig::new(app, ())); -/// warp::serve(routes).run(([127, 0, 0, 1], 8080)).await; -/// } -/// -/// fn app() -> Element { -/// None -/// } -/// ``` -pub fn serve_dioxus_application( - server_fn_route: &'static str, - cfg: impl Into, - virtual_dom_factory: impl Fn() -> VirtualDom + Send + Sync + 'static, -) -> BoxedFilter<(impl Reply,)> { - let cfg = cfg.into(); - // Serve the dist folder and the index.html file - let serve_dir = warp::fs::dir(cfg.assets_path.clone()); - - let virtual_dom_factory = - Arc::new(virtual_dom_factory) as Arc VirtualDom + Send + Sync + 'static>; - - connect_hot_reload() - // First register the server functions - .or(register_server_fns(server_fn_route)) - // Then the index route - .or(path::end().and(render_ssr(cfg.clone(), { - let virtual_dom_factory = virtual_dom_factory.clone(); - move || virtual_dom_factory() - }))) - // Then the static assets - .or(serve_dir) - // Then all other routes - .or(render_ssr(cfg, move || virtual_dom_factory())) - .boxed() -} - -/// Server render the application. -pub fn render_ssr( - cfg: ServeConfig, - virtual_dom_factory: impl Fn() -> VirtualDom + Send + Sync + 'static, -) -> impl Filter + Clone { - warp::get() - .and(request_parts()) - .and(with_ssr_state(&cfg, virtual_dom_factory)) - .then( - move |parts: http::request::Parts, - (renderer, virtual_dom_factory): ( - SSRState, - Arc VirtualDom + Send + Sync + 'static>, - )| { - let route = parts.uri.path().to_string(); - let parts = Arc::new(RwLock::new(parts)); - let cfg = cfg.clone(); - async move { - let server_context = DioxusServerContext::new(parts); - - match renderer - .render(route, &cfg, move || virtual_dom_factory(), &server_context) - .await - { - Ok(rendered) => { - let crate::render::RenderResponse { html, freshness } = rendered; - - let mut res = Response::builder() - .header("Content-Type", "text/html") - .body(html) - .unwrap(); - - let headers_mut = res.headers_mut(); - let headers = server_context.response_parts().unwrap().headers.clone(); - for (key, value) in headers.iter() { - headers_mut.insert(key, value.clone()); - } - freshness.write(headers_mut); - - res - } - Err(err) => { - tracing::error!("Failed to render ssr: {}", err); - Response::builder() - .status(500) - .body("Failed to render ssr".into()) - .unwrap() - } - } - } - }, - ) -} - -/// An extractor for the request parts (used in [DioxusServerContext]). This will extract the method, uri, query, and headers from the request. -pub fn request_parts( -) -> impl Filter + Clone { - warp::method() - .and(warp::filters::path::full()) - .and( - warp::filters::query::raw() - .or(warp::any().map(String::new)) - .unify(), - ) - .and(warp::header::headers_cloned()) - .and_then(move |method, path: FullPath, query, headers| async move { - http::uri::Builder::new() - .path_and_query(format!("{}?{}", path.as_str(), query)) - .build() - .map_err(|err| { - warp::reject::custom(FailedToReadBody(format!("Failed to build uri: {}", err))) - }) - .map(|uri| { - let mut req = http::Request::builder() - .method(method) - .uri(uri) - .body(()) - .unwrap(); - req.headers_mut().extend(headers); - req.into_parts().0 - }) - }) -} - -fn with_ssr_state( - cfg: &ServeConfig, - virtual_dom_factory: impl Fn() -> VirtualDom + Send + Sync + 'static, -) -> impl Filter< - Extract = (( - SSRState, - Arc VirtualDom + Send + Sync + 'static>, - ),), - Error = std::convert::Infallible, -> + Clone { - let renderer = SSRState::new(cfg); - let virtual_dom_factory = - Arc::new(virtual_dom_factory) as Arc VirtualDom + Send + Sync + 'static>; - warp::any().map(move || (renderer.clone(), virtual_dom_factory.clone())) -} - -#[derive(Debug)] -struct FailedToReadBody(String); - -impl warp::reject::Reject for FailedToReadBody {} - -#[derive(Debug)] -struct RecieveFailed(String); - -impl warp::reject::Reject for RecieveFailed {} - -/// Register the web RSX hot reloading endpoint. This will enable hot reloading for your application in debug mode when you call [`dioxus_hot_reload::hot_reload_init`]. -/// -/// # Example -/// ```rust -/// #![allow(non_snake_case)] -/// use dioxus_fullstack::prelude::*; -/// -/// #[tokio::main] -/// async fn main() { -/// let routes = connect_hot_reload(); -/// warp::serve(routes).run(([127, 0, 0, 1], 8080)).await; -/// } -/// ``` -pub fn connect_hot_reload() -> impl Filter + Clone -{ - #[cfg(not(all(debug_assertions, feature = "hot-reload")))] - { - warp::path!("_dioxus" / "hot_reload") - .map(warp::reply) - .map(|reply| warp::reply::with_status(reply, warp::http::StatusCode::NOT_FOUND)) - } - #[cfg(all(debug_assertions, feature = "hot-reload"))] - { - use crate::hot_reload::HotReloadState; - use futures_util::sink::SinkExt; - use futures_util::StreamExt; - use warp::ws::Message; - - let hot_reload = warp::path!("_dioxus" / "hot_reload") - .and(warp::any().then(crate::hot_reload::spawn_hot_reload)) - .and(warp::ws()) - .map(move |state: &'static HotReloadState, ws: warp::ws::Ws| { - // #[cfg(all(debug_assertions, feature = "hot-reload"))] - ws.on_upgrade(move |mut websocket| { - async move { - println!("🔥 Hot Reload WebSocket connected"); - { - // update any rsx calls that changed before the websocket connected. - { - println!("🔮 Finding updates since last compile..."); - let templates_read = state.templates.read().await; - - for template in &*templates_read { - if websocket - .send(Message::text( - serde_json::to_string(&template).unwrap(), - )) - .await - .is_err() - { - return; - } - } - } - println!("finished"); - } - - let mut rx = tokio_stream::wrappers::WatchStream::from_changes( - state.message_receiver.clone(), - ); - while let Some(change) = rx.next().await { - if let Some(template) = change { - let template = { serde_json::to_string(&template).unwrap() }; - if websocket.send(Message::text(template)).await.is_err() { - break; - }; - } - } - } - }) - }); - let disconnect = - warp::path!("_dioxus" / "disconnect") - .and(warp::ws()) - .map(move |ws: warp::ws::Ws| { - println!("disconnect"); - #[cfg(all(debug_assertions, feature = "hot-reload",))] - ws.on_upgrade(move |mut websocket| async move { - struct DisconnectOnDrop(Option); - impl Drop for DisconnectOnDrop { - fn drop(&mut self) { - std::mem::drop(self.0.take().unwrap().close()); - } - } - - let _ = websocket.send(Message::text("connected")).await; - let mut ws = DisconnectOnDrop(Some(websocket)); - - loop { - if ws.0.as_mut().unwrap().next().await.is_none() { - break; - } - } - }) - }); - disconnect.or(hot_reload) - } -} diff --git a/packages/fullstack/src/config.rs b/packages/fullstack/src/config.rs index f4416b8df..176e7381e 100644 --- a/packages/fullstack/src/config.rs +++ b/packages/fullstack/src/config.rs @@ -53,7 +53,7 @@ impl Config { /// Set the address to serve the app on. #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub fn addr(self, addr: impl Into) -> Self { let addr = addr.into(); Self { addr, ..self } @@ -61,7 +61,7 @@ impl Config { /// Set the route to the server functions. #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub fn server_fn_route(self, server_fn_route: &'static str) -> Self { Self { server_fn_route, @@ -71,7 +71,7 @@ impl Config { /// Set the incremental renderer config. #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub fn incremental(self, cfg: IncrementalRendererConfig) -> Self { Self { server_cfg: self.server_cfg.incremental(cfg), @@ -81,21 +81,21 @@ impl Config { /// Set the server config. #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub fn server_cfg(self, server_cfg: ServeConfigBuilder) -> Self { Self { server_cfg, ..self } } /// Set the web config. #[cfg(feature = "web")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "web")))] + #[cfg_attr(docsrs, doc(cfg(feature = "web")))] pub fn web_cfg(self, web_cfg: dioxus_web::Config) -> Self { Self { web_cfg, ..self } } /// Set the desktop config. #[cfg(feature = "desktop")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "desktop")))] + #[cfg_attr(docsrs, doc(cfg(feature = "desktop")))] pub fn desktop_cfg(self, desktop_cfg: dioxus_desktop::Config) -> Self { Self { desktop_cfg, @@ -105,13 +105,13 @@ impl Config { /// Set the mobile config. #[cfg(feature = "mobile")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "mobile")))] + #[cfg_attr(docsrs, doc(cfg(feature = "mobile")))] pub fn mobile_cfg(self, mobile_cfg: dioxus_mobile::Config) -> Self { Self { mobile_cfg, ..self } } #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] /// Launch a server application pub async fn launch_server( self, @@ -121,7 +121,8 @@ impl Config { println!("Listening on {}", addr); let cfg = self.server_cfg.build(); let server_fn_route = self.server_fn_route; - #[cfg(all(feature = "axum", not(feature = "warp"), not(feature = "salvo")))] + + #[cfg(feature = "axum")] { use crate::adapters::axum_adapter::{render_handler, DioxusRouterExt}; use axum::routing::get; @@ -144,52 +145,8 @@ impl Config { .layer(tower_http::compression::CompressionLayer::new().gzip(true)), ) .into_make_service(); - axum::Server::bind(&addr).serve(router).await.unwrap(); - } - #[cfg(all(feature = "warp", not(feature = "axum"), not(feature = "salvo")))] - { - use warp::Filter; - // First register the server functions - let router = register_server_fns(server_fn_route); - #[cfg(not(any(feature = "desktop", feature = "mobile")))] - let router = { - // Serve the dist folder and the index.html file - let serve_dir = warp::fs::dir(cfg.assets_path); - let build_virtual_dom = Arc::new(build_virtual_dom); - - router - .or(connect_hot_reload()) - // Then the index route - .or(warp::path::end().and(render_ssr(cfg.clone(), { - let build_virtual_dom = build_virtual_dom.clone(); - move || build_virtual_dom() - }))) - // Then the static assets - .or(serve_dir) - // Then all other routes - .or(render_ssr(cfg, move || build_virtual_dom())) - }; - warp::serve(router.boxed().with(warp::filters::compression::gzip())) - .run(addr) - .await; - } - #[cfg(all(feature = "salvo", not(feature = "axum"), not(feature = "warp")))] - { - use crate::adapters::salvo_adapter::{DioxusRouterExt, SSRHandler}; - use salvo::conn::Listener; - let router = salvo::Router::new().register_server_fns(server_fn_route); - #[cfg(not(any(feature = "desktop", feature = "mobile")))] - let router = router - .serve_static_assets(cfg.assets_path) - .connect_hot_reload() - .push(salvo::Router::with_path("/<**any_path>").get(SSRHandler::new(cfg))); - let router = router.hoop( - salvo::compression::Compression::new() - .enable_gzip(salvo::prelude::CompressionLevel::Default), - ); - salvo::Server::new(salvo::conn::tcp::TcpListener::new(addr).bind().await) - .serve(router) - .await; + let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); + axum::serve(listener, router).await.unwrap(); } } } diff --git a/packages/fullstack/src/layer.rs b/packages/fullstack/src/layer.rs index 60f76107b..82d0226cb 100644 --- a/packages/fullstack/src/layer.rs +++ b/packages/fullstack/src/layer.rs @@ -19,35 +19,35 @@ where } } +type MyBody = axum::body::Body; + /// A service is a function that takes a request and returns an async response pub trait Service { /// Run the service and produce a future that resolves to a response fn run( &mut self, - req: http::Request, + req: http::Request, ) -> Pin< Box< - dyn std::future::Future< - Output = Result, server_fn::ServerFnError>, - > + Send, + dyn std::future::Future, server_fn::ServerFnError>> + + Send, >, >; } impl Service for S where - S: tower::Service, Response = Response>, + S: tower::Service, Response = Response>, S::Future: Send + 'static, S::Error: Into, { fn run( &mut self, - req: http::Request, + req: http::Request, ) -> Pin< Box< - dyn std::future::Future< - Output = Result, server_fn::ServerFnError>, - > + Send, + dyn std::future::Future, server_fn::ServerFnError>> + + Send, >, > { let fut = self.call(req).instrument(tracing::trace_span!( @@ -62,13 +62,13 @@ where /// A boxed service is a type-erased service that can be used without knowing the underlying type pub struct BoxedService(pub Box); -impl tower::Service> for BoxedService { - type Response = http::Response; +impl tower::Service> for BoxedService { + type Response = http::Response; type Error = server_fn::ServerFnError; type Future = Pin< Box< dyn std::future::Future< - Output = Result, server_fn::ServerFnError>, + Output = Result, server_fn::ServerFnError>, > + Send, >, >; @@ -80,7 +80,7 @@ impl tower::Service> for BoxedService { Ok(()).into() } - fn call(&mut self, req: Request) -> Self::Future { + fn call(&mut self, req: Request) -> Self::Future { self.0.run(req) } } diff --git a/packages/fullstack/src/lib.rs b/packages/fullstack/src/lib.rs index 270cbc801..775683828 100644 --- a/packages/fullstack/src/lib.rs +++ b/packages/fullstack/src/lib.rs @@ -11,21 +11,17 @@ mod html_storage; #[cfg(feature = "server")] mod adapters; // Splitting up the glob export lets us document features required for each adapter -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "axum")))] +#[cfg_attr(docsrs, doc(cfg(feature = "axum")))] #[cfg(feature = "axum")] pub use adapters::axum_adapter; -// TODO: Compilation seems to be broken with the salvo feature enabled. Fix and add more features to checks in CI -// #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "salvo")))] -// #[cfg(feature = "salvo")] -// pub use adapters::salvo_adapter; -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "warp")))] -#[cfg(feature = "warp")] -pub use adapters::warp_adapter; -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + +#[cfg_attr(docsrs, doc(cfg(feature = "server")))] #[cfg(feature = "server")] pub use adapters::{server_fn_service, ServerFnHandler}; + mod config; mod hooks; + #[cfg(all(debug_assertions, feature = "hot-reload", feature = "server"))] mod hot_reload; pub mod launch; @@ -43,15 +39,11 @@ mod server_fn; /// A prelude of commonly used items in dioxus-fullstack. pub mod prelude { #[cfg(feature = "axum")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "axum")))] + #[cfg_attr(docsrs, doc(cfg(feature = "axum")))] pub use crate::adapters::axum_adapter::*; - // #[cfg(feature = "salvo")] - // #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "salvo")))] - // pub use crate::adapters::salvo_adapter::*; - #[cfg(feature = "warp")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "warp")))] - pub use crate::adapters::warp_adapter::*; + use crate::hooks; + #[cfg(not(feature = "server"))] #[cfg_attr( any(docsrs, feature = "nightly-doc"), @@ -59,8 +51,9 @@ pub mod prelude { )] pub use crate::html_storage::deserialize::get_root_props_from_document; #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub use crate::layer::{Layer, Service}; + #[cfg(all(feature = "server", feature = "router"))] #[cfg_attr( any(docsrs, feature = "nightly-doc"), @@ -68,13 +61,15 @@ pub mod prelude { )] pub use crate::render::pre_cache_static_routes_with_props; #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub use crate::render::SSRState; + #[cfg(feature = "router")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "router")))] + #[cfg_attr(docsrs, doc(cfg(feature = "router")))] pub use crate::router::FullstackRouterConfig; + #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub use crate::serve_config::{ServeConfig, ServeConfigBuilder}; #[cfg(all(feature = "server", feature = "axum"))] #[cfg_attr( @@ -83,44 +78,29 @@ pub mod prelude { )] pub use crate::server_context::Axum; #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub use crate::server_context::{ extract, server_context, DioxusServerContext, FromServerContext, ProvideServerContext, }; pub use crate::server_fn::DioxusServerFn; #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub use crate::server_fn::{ServerFnMiddleware, ServerFnTraitObj, ServerFunction}; pub use dioxus_server_macro::*; #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub use dioxus_ssr::incremental::IncrementalRendererConfig; pub use server_fn::{self, ServerFn as _, ServerFnError}; pub use hooks::{server_cached::server_cached, server_future::use_server_future}; } -// Warn users about overlapping features -#[cfg(all( - feature = "server", - feature = "web", - not(doc), - not(feature = "nightly-doc") -))] -compile_error!("The `ssr` feature (enabled by `warp`, `axum`, or `salvo`) and `web` feature are overlapping. Please choose one or the other."); +// // Warn users about overlapping features +// #[cfg(all(feature = "server", feature = "web", not(doc)))] +// compile_error!("The `ssr` feature (enabled by `warp`, `axum`, or `salvo`) and `web` feature are overlapping. Please choose one or the other."); -#[cfg(all( - feature = "server", - feature = "desktop", - not(doc), - not(feature = "nightly-doc") -))] -compile_error!("The `ssr` feature (enabled by `warp`, `axum`, or `salvo`) and `desktop` feature are overlapping. Please choose one or the other."); +// #[cfg(all(feature = "server", feature = "desktop", not(doc)))] +// compile_error!("The `ssr` feature (enabled by `warp`, `axum`, or `salvo`) and `desktop` feature are overlapping. Please choose one or the other."); -#[cfg(all( - feature = "server", - feature = "mobile", - not(doc), - not(feature = "nightly-doc") -))] -compile_error!("The `ssr` feature (enabled by `warp`, `axum`, or `salvo`) and `mobile` feature are overlapping. Please choose one or the other."); +// #[cfg(all(feature = "server", feature = "mobile", not(doc)))] +// compile_error!("The `ssr` feature (enabled by `warp`, `axum`, or `salvo`) and `mobile` feature are overlapping. Please choose one or the other."); diff --git a/packages/fullstack/src/server_context.rs b/packages/fullstack/src/server_context.rs index 8d5966a7c..2fb06b61f 100644 --- a/packages/fullstack/src/server_context.rs +++ b/packages/fullstack/src/server_context.rs @@ -228,7 +228,7 @@ impl FromServerContext for FromContext { } #[cfg(feature = "axum")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "axum")))] +#[cfg_attr(docsrs, doc(cfg(feature = "axum")))] /// An adapter for axum extractors for the server context pub struct Axum; diff --git a/packages/fullstack/src/server_fn.rs b/packages/fullstack/src/server_fn.rs index d51e4beec..cdfff266e 100644 --- a/packages/fullstack/src/server_fn.rs +++ b/packages/fullstack/src/server_fn.rs @@ -1,5 +1,5 @@ #[cfg(feature = "server")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] +#[cfg_attr(docsrs, doc(cfg(feature = "server")))] #[derive(Clone)] /// A trait object for a function that be called on serializable arguments and returns a serializable result. pub struct ServerFnTraitObj(server_fn::ServerFnTraitObj<()>); @@ -41,7 +41,7 @@ impl ServerFnTraitObj { server_fn::inventory::collect!(ServerFnTraitObj); #[cfg(feature = "server")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] +#[cfg_attr(docsrs, doc(cfg(feature = "server")))] /// Middleware for a server function pub struct ServerFnMiddleware { /// The prefix of the server function. @@ -75,7 +75,7 @@ pub(crate) static MIDDLEWARE: once_cell::sync::Lazy< server_fn::inventory::collect!(ServerFnMiddleware); #[cfg(feature = "server")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] +#[cfg_attr(docsrs, doc(cfg(feature = "server")))] /// A server function that can be called on serializable arguments and returns a serializable result. pub type ServerFunction = server_fn::SerializedFnTraitObj<()>; @@ -92,7 +92,7 @@ static REGISTERED_SERVER_FUNCTIONS: once_cell::sync::Lazy< }); #[cfg(feature = "server")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] +#[cfg_attr(docsrs, doc(cfg(feature = "server")))] /// The registry of all Dioxus server functions. pub struct DioxusServerFnRegistry; @@ -160,7 +160,7 @@ impl server_fn::ServerFunctionRegistry<()> for DioxusServerFnRegistry { } #[cfg(feature = "server")] -#[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] +#[cfg_attr(docsrs, doc(cfg(feature = "server")))] /// Errors that can occur when registering a server function. #[derive(thiserror::Error, Debug, Clone, serde::Serialize, serde::Deserialize)] pub enum ServerRegistrationFnError { @@ -184,7 +184,7 @@ pub enum ServerRegistrationFnError { pub trait DioxusServerFn: server_fn::ServerFn<()> { /// Registers the server function, allowing the client to query it by URL. #[cfg(feature = "server")] - #[cfg_attr(any(docsrs, feature = "nightly-doc"), doc(cfg(feature = "server")))] + #[cfg_attr(docsrs, doc(cfg(feature = "server")))] fn register_explicit() -> Result<(), server_fn::ServerFnError> { Self::register_in_explicit::() } diff --git a/packages/liveview/.vscode/settings.json b/packages/liveview/.vscode/settings.json deleted file mode 100644 index 6fff6cc40..000000000 --- a/packages/liveview/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rust-analyzer.cargo.features": [ - "warp" - ] -} diff --git a/packages/liveview/Cargo.toml b/packages/liveview/Cargo.toml index c523d08be..e01e6d3dd 100644 --- a/packages/liveview/Cargo.toml +++ b/packages/liveview/Cargo.toml @@ -31,42 +31,19 @@ dioxus-hot-reload = { workspace = true, optional = true } dioxus-cli-config = { workspace = true } generational-box = { workspace = true } -# warp -warp = { version = "0.3.3", optional = true } - # axum -axum = { version = "0.6.1", optional = true, features = ["ws"] } - -# salvo -salvo = { version = "0.63.0", optional = true, features = ["websocket", "affix"] } -once_cell = "1.17.1" -async-trait = "0.1.71" - -# rocket -rocket = { version = "0.5.0", optional = true } -rocket_ws = { version = "0.1.0", optional = true } - -# actix is ... complicated? -# actix-files = { version = "0.6.2", optional = true } -# actix-web = { version = "4.2.1", optional = true } -# actix-ws = { version = "0.2.5", optional = true } +axum = { workspace = true, optional = true, features = ["ws"] } [dev-dependencies] pretty_env_logger = { version = "0.5.0" } tokio = { workspace = true, features = ["full"] } -warp = "0.3.3" -axum = { version = "0.6.1", features = ["ws"] } -salvo = { version = "0.63.0", features = ["affix", "websocket"] } -rocket = "0.5.0" -rocket_ws = "0.1.0" -tower = "0.4.13" +axum = { workspace = true, features = ["ws"] } +tower = { workspace = true } dioxus = { workspace = true } [features] default = ["hot-reload"] -# actix = ["actix-files", "actix-web", "actix-ws"] hot-reload = ["dioxus-hot-reload"] -rocket = ["dep:rocket", "dep:rocket_ws"] [[example]] name = "axum" @@ -75,15 +52,3 @@ required-features = ["axum"] [[example]] name = "axum_stress" required-features = ["axum"] - -[[example]] -name = "salvo" -required-features = ["salvo"] - -[[example]] -name = "warp" -required-features = ["warp"] - -[[example]] -name = "rocket" -required-features = ["rocket"] diff --git a/packages/liveview/README.md b/packages/liveview/README.md index 13af3c36f..66065ad31 100644 --- a/packages/liveview/README.md +++ b/packages/liveview/README.md @@ -26,9 +26,6 @@ The current backend frameworks supported include: - Axum -- Warp -- Salvo -- Rocket Dioxus-LiveView exports some primitives to wire up an app into an existing backend framework. diff --git a/packages/liveview/examples/rocket.rs b/packages/liveview/examples/rocket.rs deleted file mode 100644 index e5f045698..000000000 --- a/packages/liveview/examples/rocket.rs +++ /dev/null @@ -1,76 +0,0 @@ -#[macro_use] -extern crate rocket; - -use dioxus::prelude::*; -use dioxus_liveview::LiveViewPool; -use rocket::response::content::RawHtml; -use rocket::{Config, Rocket, State}; -use rocket_ws::{Channel, WebSocket}; - -fn app() -> Element { - let mut num = use_signal(|| 0); - - rsx! { - div { - "hello Rocket! {num}" - button { onclick: move |_| num += 1, "Increment" } - } - } -} - -fn index_page_with_glue(glue: &str) -> RawHtml { - RawHtml(format!( - r#" - - - Dioxus LiveView with Rocket -
- {glue} - - "#, - glue = glue - )) -} - -#[get("/")] -async fn index(config: &Config) -> RawHtml { - index_page_with_glue(&dioxus_liveview::interpreter_glue(&format!( - "ws://{addr}:{port}/ws", - addr = config.address, - port = config.port, - ))) -} - -#[get("/as-path")] -async fn as_path() -> RawHtml { - index_page_with_glue(&dioxus_liveview::interpreter_glue("/ws")) -} - -#[get("/ws")] -fn ws(ws: WebSocket, pool: &State) -> Channel<'static> { - let pool = pool.inner().to_owned(); - - ws.channel(move |stream| { - Box::pin(async move { - let _ = pool - .launch(dioxus_liveview::rocket_socket(stream), app) - .await; - Ok(()) - }) - }) -} - -#[tokio::main] -async fn main() { - let view = dioxus_liveview::LiveViewPool::new(); - - Rocket::build() - .manage(view) - .mount("/", routes![index, as_path, ws]) - .ignite() - .await - .expect("Failed to ignite rocket") - .launch() - .await - .expect("Failed to launch rocket"); -} diff --git a/packages/liveview/examples/salvo.rs b/packages/liveview/examples/salvo.rs deleted file mode 100644 index e4c27b091..000000000 --- a/packages/liveview/examples/salvo.rs +++ /dev/null @@ -1,67 +0,0 @@ -use dioxus::prelude::*; -use dioxus_liveview::LiveViewPool; -use salvo::affix; -use salvo::prelude::*; -use std::net::SocketAddr; -use std::sync::Arc; - -fn app() -> Element { - let mut num = use_signal(|| 0); - - rsx! { - div { - "hello salvo! {num}" - button { onclick: move |_| num += 1, "Increment" } - } - } -} - -#[tokio::main] -async fn main() { - pretty_env_logger::init(); - - let addr = "127.0.0.1:3030"; - let acceptor = TcpListener::new(addr).bind().await; - - let view = LiveViewPool::new(); - - let router = Router::new() - .hoop(affix::inject(Arc::new(view))) - .get(index) - .push(Router::with_path("ws").get(connect)); - - println!("Listening on http://{}", addr); - - Server::new(acceptor).serve(router).await; -} - -#[handler] -fn index(res: &mut Response) { - let addr: SocketAddr = ([127, 0, 0, 1], 3030).into(); - res.render(Text::Html(format!( - r#" - - - Dioxus LiveView with Salvo -
- {glue} - - "#, - glue = dioxus_liveview::interpreter_glue(&format!("ws://{addr}/ws")) - ))); -} - -#[handler] -async fn connect( - req: &mut Request, - depot: &mut Depot, - res: &mut Response, -) -> Result<(), StatusError> { - let view = depot.obtain::>().unwrap().clone(); - - WebSocketUpgrade::new() - .upgrade(req, res, |ws| async move { - _ = view.launch(dioxus_liveview::salvo_socket(ws), app).await; - }) - .await -} diff --git a/packages/liveview/examples/warp.rs b/packages/liveview/examples/warp.rs deleted file mode 100644 index 0b97f5abf..000000000 --- a/packages/liveview/examples/warp.rs +++ /dev/null @@ -1,56 +0,0 @@ -use dioxus::prelude::*; -use dioxus_liveview::warp_adapter::warp_socket; -use dioxus_liveview::LiveViewPool; -use std::net::SocketAddr; -use warp::ws::Ws; -use warp::Filter; - -fn app() -> Element { - let mut num = use_signal(|| 0); - - rsx! { - div { - "hello warp! {num}" - button { - onclick: move |_| num += 1, - "Increment" - } - } - } -} - -#[tokio::main] -async fn main() { - pretty_env_logger::init(); - - let addr: SocketAddr = ([127, 0, 0, 1], 3030).into(); - - let index = warp::path::end().map(move || { - warp::reply::html(format!( - r#" - - - Dioxus LiveView with Warp -
- {glue} - - "#, - glue = dioxus_liveview::interpreter_glue(&format!("ws://{addr}/ws/")) - )) - }); - - let pool = LiveViewPool::new(); - - let ws = warp::path("ws") - .and(warp::ws()) - .and(warp::any().map(move || pool.clone())) - .map(move |ws: Ws, pool: LiveViewPool| { - ws.on_upgrade(|ws| async move { - let _ = pool.launch(warp_socket(ws), app).await; - }) - }); - - println!("Listening on http://{}", addr); - - warp::serve(index.or(ws)).run(addr).await; -} diff --git a/packages/liveview/src/adapters/axum_adapter.rs b/packages/liveview/src/adapters/axum_adapter.rs index 6e859078e..7b9eb7904 100644 --- a/packages/liveview/src/adapters/axum_adapter.rs +++ b/packages/liveview/src/adapters/axum_adapter.rs @@ -81,10 +81,8 @@ impl LiveviewRouter for Router { } async fn start(self, address: impl Into) { - if let Err(err) = axum::Server::bind(&address.into()) - .serve(self.into_make_service()) - .await - { + let listener = tokio::net::TcpListener::bind(address.into()).await.unwrap(); + if let Err(err) = axum::serve(listener, self.into_make_service()).await { eprintln!("Failed to start axum server: {}", err); } } diff --git a/packages/liveview/src/adapters/mod.rs b/packages/liveview/src/adapters/mod.rs index 0e9e74d31..2abc6794a 100644 --- a/packages/liveview/src/adapters/mod.rs +++ b/packages/liveview/src/adapters/mod.rs @@ -2,26 +2,11 @@ use std::future::Future; use dioxus_core::{Element, VirtualDom}; -#[cfg(feature = "warp")] -pub mod warp_adapter; -#[cfg(feature = "warp")] -pub use warp_adapter::*; - #[cfg(feature = "axum")] pub mod axum_adapter; #[cfg(feature = "axum")] pub use axum_adapter::*; -#[cfg(feature = "salvo")] -pub mod salvo_adapter; -#[cfg(feature = "salvo")] -pub use salvo_adapter::*; - -#[cfg(feature = "rocket")] -pub mod rocket_adapter; -#[cfg(feature = "rocket")] -pub use rocket_adapter::*; - /// A trait for servers that can be used to host a LiveView app. pub trait LiveviewRouter { /// Create a new router. diff --git a/packages/liveview/src/adapters/rocket_adapter.rs b/packages/liveview/src/adapters/rocket_adapter.rs deleted file mode 100644 index 21f217eca..000000000 --- a/packages/liveview/src/adapters/rocket_adapter.rs +++ /dev/null @@ -1,113 +0,0 @@ -use crate::LiveViewPool; -use crate::LiveviewRouter; -use crate::{LiveViewError, LiveViewSocket}; -use rocket::futures::{SinkExt, StreamExt}; -use rocket::response::content::RawHtml; -use rocket::{get, routes, State}; -use rocket_ws::Channel; -use rocket_ws::WebSocket; -use rocket_ws::{result::Error, stream::DuplexStream, Message}; -use std::sync::Arc; - -/// Convert a Rocket WebSocket into a `LiveViewSocket`. -/// -/// This is required to launch a LiveView app using the Rocket web framework. -pub fn rocket_socket(stream: DuplexStream) -> impl LiveViewSocket { - stream - .map(transform_rx) - .with(transform_tx) - .sink_map_err(|_| LiveViewError::SendingFailed) -} - -fn transform_rx(message: Result) -> Result, LiveViewError> { - message - .map_err(|_| LiveViewError::SendingFailed)? - .into_text() - .map(|s| s.into_bytes()) - .map_err(|_| LiveViewError::SendingFailed) -} - -async fn transform_tx(message: Vec) -> Result { - Ok(Message::Binary(message)) -} - -impl LiveviewRouter for rocket::Rocket { - fn create_default_liveview_router() -> Self { - Self::build() - } - - fn with_virtual_dom( - self, - route: &str, - app: impl Fn() -> dioxus_core::prelude::VirtualDom + Send + Sync + 'static, - ) -> Self { - #[get("/")] - async fn index(request: &rocket::route::Route) -> RawHtml { - let route = request.uri.base(); - - let glue = crate::interpreter_glue(&format!("{route}/ws",)); - - let title = crate::app_title(); - - RawHtml(format!( - r#" - - - {title} -
- {glue} - - "# - )) - } - - #[get("/ws")] - fn ws(ws: WebSocket, app: &State) -> Channel<'static> { - let app = app.inner(); - let pool = app.pool.clone(); - let app = app.app.clone(); - - ws.channel(move |stream| { - Box::pin(async move { - let _ = pool - .launch_virtualdom(crate::rocket_socket(stream), move || app()) - .await; - Ok(()) - }) - }) - } - - struct LiveviewApp { - app: Arc dioxus_core::prelude::VirtualDom + Send + Sync + 'static>, - pool: LiveViewPool, - } - - let app = Arc::new(app); - - let view = crate::LiveViewPool::new(); - - self.manage(LiveviewApp { - app: app, - pool: view, - }) - .mount(route, routes![index, ws]) - } - - async fn start(self, address: impl Into) { - let address = address.into(); - - let figment = self - .figment() - .clone() - .merge((rocket::Config::PORT, address.port())) - .merge((rocket::Config::ADDRESS, address.ip())); - - self.configure(figment) - .ignite() - .await - .expect("Failed to ignite rocket") - .launch() - .await - .expect("Failed to launch rocket"); - } -} diff --git a/packages/liveview/src/adapters/salvo_adapter.rs b/packages/liveview/src/adapters/salvo_adapter.rs deleted file mode 100644 index 0a3f0cd0b..000000000 --- a/packages/liveview/src/adapters/salvo_adapter.rs +++ /dev/null @@ -1,108 +0,0 @@ -use crate::LiveViewPool; -use crate::LiveviewRouter; -use crate::{LiveViewError, LiveViewSocket}; -use futures_util::{SinkExt, StreamExt}; -use salvo::conn::TcpListener; -use salvo::http::StatusError; -use salvo::websocket::WebSocketUpgrade; -use salvo::websocket::{Message, WebSocket}; -use salvo::writing::Text; -use salvo::Listener; -use salvo::Server; -use salvo::{handler, Depot, Request, Response, Router}; -use std::sync::Arc; - -/// Convert a Salvo WebSocket into a `LiveViewSocket`. -/// -/// This is required to launch a LiveView app using the Salvo web framework. -pub fn salvo_socket(ws: WebSocket) -> impl LiveViewSocket { - ws.map(transform_rx) - .with(transform_tx) - .sink_map_err(|_| LiveViewError::SendingFailed) -} - -fn transform_rx(message: Result) -> Result, LiveViewError> { - let as_bytes = message.map_err(|_| LiveViewError::SendingFailed)?; - - Ok(as_bytes.into()) -} - -async fn transform_tx(message: Vec) -> Result { - Ok(Message::binary(message)) -} - -#[derive(Clone)] -struct LiveviewApp { - app: Arc dioxus_core::prelude::VirtualDom + Send + Sync + 'static>, - pool: Arc, -} - -impl LiveviewRouter for Router { - fn create_default_liveview_router() -> Self { - Self::new() - } - - fn with_virtual_dom( - self, - route: &str, - app: impl Fn() -> dioxus_core::prelude::VirtualDom + Send + Sync + 'static, - ) -> Self { - let app = Arc::new(app); - - let view = crate::LiveViewPool::new(); - - self.push( - Router::with_path(route) - .hoop(salvo::affix::inject(LiveviewApp { - app: app, - pool: Arc::new(view), - })) - .get(index) - .push(Router::with_path("ws").get(connect)), - ) - } - - async fn start(self, address: impl Into) { - let address = address.into(); - - let acceptor = TcpListener::new(address).bind().await; - Server::new(acceptor).serve(self).await; - } -} - -#[handler] -fn index(req: &mut Request, res: &mut Response) { - let base = req.uri().path(); - let title = crate::app_title(); - - res.render(Text::Html(format!( - r#" - - - {title} -
- {glue} - - "#, - glue = crate::interpreter_glue(&format!("{base}/ws")) - ))); -} - -#[handler] -async fn connect( - req: &mut Request, - depot: &mut Depot, - res: &mut Response, -) -> Result<(), StatusError> { - let app = depot.obtain::().unwrap().clone(); - let view = app.pool.clone(); - let app = app.app.clone(); - - WebSocketUpgrade::new() - .upgrade(req, res, |ws| async move { - _ = view - .launch_virtualdom(crate::salvo_socket(ws), move || app()) - .await; - }) - .await -} diff --git a/packages/liveview/src/adapters/warp_adapter.rs b/packages/liveview/src/adapters/warp_adapter.rs deleted file mode 100644 index d2861d80e..000000000 --- a/packages/liveview/src/adapters/warp_adapter.rs +++ /dev/null @@ -1,25 +0,0 @@ -use crate::{LiveViewError, LiveViewSocket}; -use futures_util::{SinkExt, StreamExt}; -use warp::ws::{Message, WebSocket}; - -/// Convert a warp WebSocket into a `LiveViewSocket`. -/// -/// This is required to launch a LiveView app using the warp web framework. -pub fn warp_socket(ws: WebSocket) -> impl LiveViewSocket { - ws.map(transform_rx) - .with(transform_tx) - .sink_map_err(|_| LiveViewError::SendingFailed) -} - -fn transform_rx(message: Result) -> Result, LiveViewError> { - // Destructure the `message` into the buffer we got from warp. - let msg = message - .map_err(|_| LiveViewError::SendingFailed)? - .into_bytes(); - - Ok(msg) -} - -async fn transform_tx(message: Vec) -> Result { - Ok(Message::binary(message)) -} diff --git a/packages/liveview/src/launch.rs b/packages/liveview/src/launch.rs index d008e38cd..de8142a4e 100644 --- a/packages/liveview/src/launch.rs +++ b/packages/liveview/src/launch.rs @@ -3,10 +3,6 @@ use std::any::Any; #[cfg(feature = "axum")] pub type Config = crate::Config; -#[cfg(all(feature = "salvo", not(feature = "axum")))] -pub type Config = crate::Config; -#[cfg(all(feature = "rocket", not(any(feature = "axum", feature = "salvo"))))] -pub type Config = crate::Config>; /// Launches the WebView and runs the event loop, with configuration and root props. pub fn launch( diff --git a/packages/liveview/src/lib.rs b/packages/liveview/src/lib.rs index 74ceff98c..075179d87 100644 --- a/packages/liveview/src/lib.rs +++ b/packages/liveview/src/lib.rs @@ -25,7 +25,7 @@ impl WebsocketRx for T where T: StreamExt String { // If the url starts with a `/`, generate glue which reuses current host let get_ws_url = if url_or_path.starts_with('/') { r#" - let loc = window.location; + let loc = window.location; let new_url = ""; if (loc.protocol === "https:") {{ new_url = "wss:"; @@ -135,7 +135,7 @@ pub fn interpreter_glue(url_or_path: &str) -> String { function __dioxusGetWsUrl(path) {{ {get_ws_url} }} - + var WS_ADDR = __dioxusGetWsUrl("{url_or_path}"); {handle_edits} diff --git a/packages/playwright-tests/liveview/Cargo.toml b/packages/playwright-tests/liveview/Cargo.toml index 851bed97d..ac066735c 100644 --- a/packages/playwright-tests/liveview/Cargo.toml +++ b/packages/playwright-tests/liveview/Cargo.toml @@ -10,4 +10,4 @@ publish = false dioxus = { workspace = true } dioxus-liveview = { workspace = true, features = ["axum"] } tokio = { version = "1.19.2", features = ["full"] } -axum = { version = "0.6.1", features = ["ws"] } +axum = { workspace = true, features = ["ws"] } diff --git a/packages/router/Cargo.toml b/packages/router/Cargo.toml index 3343f1886..57065726d 100644 --- a/packages/router/Cargo.toml +++ b/packages/router/Cargo.toml @@ -39,7 +39,7 @@ web = ["gloo", "web-sys", "wasm-bindgen", "gloo-utils", "js-sys"] fullstack = ["dioxus-fullstack"] [dev-dependencies] -axum = { version = "0.6.1", features = ["ws"] } +axum = { workspace = true, features = ["ws"] } dioxus = { workspace = true, features = ["router" ]} # dioxus-liveview = { workspace = true, features = ["axum"] } dioxus-ssr = { path = "../ssr" } diff --git a/packages/router/examples/simple_routes.rs b/packages/router/examples/simple_routes.rs index deefd35e6..49ff66cce 100644 --- a/packages/router/examples/simple_routes.rs +++ b/packages/router/examples/simple_routes.rs @@ -26,9 +26,7 @@ async fn main() { "/ws", get(move |ws: WebSocketUpgrade| async move { ws.on_upgrade(move |socket| async move { - _ = view - .launch(dioxus_liveview::axum_socket(socket), Route::Home {}) - .await; + _ = view.launch(dioxus_liveview::axum_socket(socket), app).await; }) }), ); @@ -43,11 +41,13 @@ async fn main() { #[cfg(not(feature = "liveview"))] fn main() { - launch(|| { - rsx! { - Router:: {} - } - }) + launch(app) +} + +fn app() -> Element { + rsx! { + Router:: {} + } } #[component] diff --git a/packages/router/src/history/liveview.rs b/packages/router/src/history/liveview.rs index ddeb029fe..478785617 100644 --- a/packages/router/src/history/liveview.rs +++ b/packages/router/src/history/liveview.rs @@ -175,10 +175,8 @@ where let eval_provider = consume_context::>(); let create_eval = Rc::new(move |script: &str| { - eval_provider - .new_evaluator(script.to_string()) - .map(UseEval::new) - }) as Rc Result>; + UseEval::new(eval_provider.new_evaluator(script.to_string())) + }) as Rc UseEval>; // Listen to server actions spawn({ @@ -256,7 +254,7 @@ where history.length, ]; "#, - ).expect("failed to load state").await.expect("serializable state"); + ).await.expect("serializable state"); let (route, state, session, depth) = serde_json::from_value::<( String, Option, @@ -276,7 +274,8 @@ where // Call the updater callback (updater.read().unwrap())(); - create_eval(&format!(r#" + create_eval(&format!( + r#" // this does not trigger a PopState event history.replaceState({state}, "", "{route}"); sessionStorage.setItem("liveview", '{session}'); @@ -287,7 +286,8 @@ where event.state, ]); }}); - "#)).expect("failed to initialize popstate") + "# + )) }; loop { diff --git a/packages/router/src/router_cfg.rs b/packages/router/src/router_cfg.rs index 30dcac10f..a53064208 100644 --- a/packages/router/src/router_cfg.rs +++ b/packages/router/src/router_cfg.rs @@ -1,11 +1,9 @@ -use std::sync::Arc; - use crate::contexts::router::RoutingCallback; use crate::history::HistoryProvider; +use crate::prelude::*; use crate::routable::Routable; use dioxus_lib::prelude::*; - -use crate::prelude::*; +use std::sync::Arc; /// Global configuration options for the router. /// @@ -31,43 +29,6 @@ pub struct RouterConfig { pub(crate) initial_route: Option, } -macro_rules! default_history { - ($initial_route:ident) => { - { - // If we are on wasm32 and the web feature is enabled, use the web history. - #[cfg(all(target_arch = "wasm32", feature = "web"))] - return Box::new(AnyHistoryProviderImplWrapper::new(WebHistory::::default())); - // If we are using dioxus fullstack and the ssr feature is enabled, use the memory history with the initial path set to the current path in fullstack - #[cfg(all(feature = "fullstack", feature = "ssr"))] - return Box::new(AnyHistoryProviderImplWrapper::new(MemoryHistory::::with_initial_path( - dioxus_fullstack::prelude::server_context() - .request_parts() - .unwrap() - .uri - .to_string() - .parse() - .unwrap_or_else(|err| { - tracing::error!("Failed to parse uri: {}", err); - "/" - .parse() - .unwrap_or_else(|err| { - panic!("Failed to parse uri: {}", err); - }) - }), - ))); - // If we are not on wasm32 and the liveview feature is enabled, use the liveview history. - #[cfg(all(feature = "liveview"))] - return Box::new(AnyHistoryProviderImplWrapper::new(LiveviewHistory::new_with_initial_path($initial_route))); - // Otherwise use the memory history. - #[cfg(all( - not(all(target_arch = "wasm32", feature = "web")), - not(all(feature = "liveview", not(target_arch = "wasm32"))), - ))] - Box::new(AnyHistoryProviderImplWrapper::new(MemoryHistory::with_initial_path($initial_route))) - } - }; -} - impl Default for RouterConfig where ::Err: std::fmt::Display, @@ -94,7 +55,7 @@ where )); self.history .take() - .unwrap_or_else(|| default_history!(initial_route)) + .unwrap_or_else(|| default_history(initial_route)) } } @@ -154,3 +115,49 @@ where } } } + +/// Get the default history provider for the current platform. +fn default_history(initial_route: R) -> Box +where + ::Err: std::fmt::Display, +{ + // If we're on the web and have wasm, use the web history provider + if cfg!(all(target_arch = "wasm32", feature = "web")) { + return Box::new(AnyHistoryProviderImplWrapper::new( + WebHistory::::default(), + )); + } + + // If we're using fullstack and server side rendering, use the memory history provider + if cfg!(all(feature = "fullstack", feature = "ssr")) { + return Box::new(AnyHistoryProviderImplWrapper::new( + MemoryHistory::::with_initial_path( + dioxus_fullstack::prelude::server_context() + .request_parts() + .unwrap() + .uri + .to_string() + .parse() + .unwrap_or_else(|err| { + tracing::error!("Failed to parse uri: {}", err); + "/".parse().unwrap_or_else(|err| { + panic!("Failed to parse uri: {}", err); + }) + }), + ), + )); + } + + // If liveview is enabled, use the liveview history provider + if cfg!(feature = "liveview") { + return Box::new(AnyHistoryProviderImplWrapper::new( + LiveviewHistory::new_with_initial_path(initial_route), + )); + } + + // If none of the above, use the memory history provider, which is a decent enough fallback + // Eventually we want to integrate with the mobile history provider, and other platform providers + Box::new(AnyHistoryProviderImplWrapper::new( + MemoryHistory::with_initial_path(initial_route), + )) +} diff --git a/packages/ssr/Cargo.toml b/packages/ssr/Cargo.toml index 89cc10edc..350f81b68 100644 --- a/packages/ssr/Cargo.toml +++ b/packages/ssr/Cargo.toml @@ -15,15 +15,17 @@ generational-box = { workspace = true } askama_escape = "0.10.3" thiserror = "1.0.23" rustc-hash = "1.1.0" -lru = "0.10.0" +lru = { workspace = true } tracing = { workspace = true } -http = "0.2.9" +http = { workspace = true } tokio = { version = "1.28", features = ["fs", "io-util"], optional = true } -async-trait = "0.1.58" -serde_json = { version = "1.0" } +async-trait = { workspace = true } +serde_json = { workspace = true } [dev-dependencies] dioxus = { workspace = true } +dioxus-signals = { workspace = true } + tracing = { workspace = true } fern = { version = "0.6.0", features = ["colored"] } anyhow = "1.0" @@ -31,7 +33,6 @@ argh = "0.1.4" serde = "1.0.120" serde_json = "1.0.61" fs_extra = "1.2.0" -dioxus-signals = { workspace = true } [features] default = []