Forráskód Böngészése

Upgrade to axum 0.7, drop 3rd party adapters

Jonathan Kelley 1 éve
szülő
commit
214a907adc
53 módosított fájl, 635 hozzáadás és 3252 törlés
  1. 3 1
      .vscode/settings.json
  2. 371 1248
      Cargo.lock
  3. 13 6
      Cargo.toml
  4. 1 1
      packages/cli-config/Cargo.toml
  5. 7 7
      packages/cli/Cargo.toml
  6. 3 3
      packages/cli/src/main.rs
  7. 5 7
      packages/cli/src/server/web/mod.rs
  8. 3 4
      packages/cli/src/server/web/proxy.rs
  9. 0 6
      packages/dioxus/Cargo.toml
  10. 2 2
      packages/dioxus/build.rs
  11. 9 9
      packages/dioxus/src/launch.rs
  12. 27 26
      packages/dioxus/src/lib.rs
  13. 5 15
      packages/fullstack/Cargo.toml
  14. 19 27
      packages/fullstack/README.md
  15. 9 8
      packages/fullstack/examples/axum-auth/Cargo.toml
  16. 4 2
      packages/fullstack/examples/axum-auth/src/main.rs
  17. 2 2
      packages/fullstack/examples/axum-desktop/Cargo.toml
  18. 3 1
      packages/fullstack/examples/axum-desktop/src/client.rs
  19. 1 1
      packages/fullstack/examples/axum-router/Cargo.toml
  20. 0 4
      packages/fullstack/examples/salvo-hello-world/.gitignore
  21. 0 25
      packages/fullstack/examples/salvo-hello-world/Cargo.toml
  22. 0 57
      packages/fullstack/examples/salvo-hello-world/src/main.rs
  23. 0 4
      packages/fullstack/examples/warp-hello-world/.gitignore
  24. 0 20
      packages/fullstack/examples/warp-hello-world/Cargo.toml
  25. 0 54
      packages/fullstack/examples/warp-hello-world/src/main.rs
  26. 4 4
      packages/fullstack/src/adapters/axum_adapter.rs
  27. 5 7
      packages/fullstack/src/adapters/mod.rs
  28. 0 581
      packages/fullstack/src/adapters/salvo_adapter.rs
  29. 0 417
      packages/fullstack/src/adapters/warp_adapter.rs
  30. 12 55
      packages/fullstack/src/config.rs
  31. 13 13
      packages/fullstack/src/layer.rs
  32. 27 47
      packages/fullstack/src/lib.rs
  33. 1 1
      packages/fullstack/src/server_context.rs
  34. 6 6
      packages/fullstack/src/server_fn.rs
  35. 0 5
      packages/liveview/.vscode/settings.json
  36. 3 38
      packages/liveview/Cargo.toml
  37. 0 3
      packages/liveview/README.md
  38. 0 76
      packages/liveview/examples/rocket.rs
  39. 0 67
      packages/liveview/examples/salvo.rs
  40. 0 56
      packages/liveview/examples/warp.rs
  41. 2 4
      packages/liveview/src/adapters/axum_adapter.rs
  42. 0 15
      packages/liveview/src/adapters/mod.rs
  43. 0 113
      packages/liveview/src/adapters/rocket_adapter.rs
  44. 0 108
      packages/liveview/src/adapters/salvo_adapter.rs
  45. 0 25
      packages/liveview/src/adapters/warp_adapter.rs
  46. 0 4
      packages/liveview/src/launch.rs
  47. 3 3
      packages/liveview/src/lib.rs
  48. 1 1
      packages/playwright-tests/liveview/Cargo.toml
  49. 1 1
      packages/router/Cargo.toml
  50. 8 8
      packages/router/examples/simple_routes.rs
  51. 7 7
      packages/router/src/history/liveview.rs
  52. 49 42
      packages/router/src/router_cfg.rs
  53. 6 5
      packages/ssr/Cargo.toml

+ 3 - 1
.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
 }

+ 371 - 1248
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]]
@@ -337,31 +337,20 @@ dependencies = [
  "pin-project-lite",
 ]
 
-[[package]]
-name = "async-compression"
-version = "0.3.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a"
-dependencies = [
- "brotli",
- "flate2",
- "futures-core",
- "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 = [
+ "brotli",
  "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"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acee9fd5073ab6b045a275b3e709c163dd36c90685219cb21804a147b58dba43"
-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"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
+checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e"
 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,27 +645,27 @@ 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",
+ "tower-http",
 ]
 
 [[package]]
 name = "axum-core"
-version = "0.2.9"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37e5939e02c56fecd5c017c37df4238c0a839fa76b7f97acdd7efb804fd181cc"
+checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
 dependencies = [
  "async-trait",
  "bytes",
@@ -754,32 +673,37 @@ dependencies = [
  "http 0.2.11",
  "http-body 0.4.6",
  "mime",
+ "rustversion",
  "tower-layer",
  "tower-service",
 ]
 
 [[package]]
 name = "axum-core"
-version = "0.3.4"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3"
 dependencies = [
  "async-trait",
  "bytes",
  "futures-util",
- "http 0.2.11",
- "http-body 0.4.6",
+ "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",
@@ -869,27 +793,60 @@ dependencies = [
  "uuid",
 ]
 
+[[package]]
+name = "axum_session"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+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.3.1"
+version = "0.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88d26b395b86d34230970c09fee81cad335704d5b6b797714a9ebb8a51cc4fa6"
+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"
@@ -4913,31 +4752,35 @@ dependencies = [
 
 [[package]]
 name = "hyper-rustls"
-version = "0.23.2"
+version = "0.24.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c"
+checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
 dependencies = [
+ "futures-util",
  "http 0.2.11",
  "hyper 0.14.28",
- "log",
- "rustls 0.20.9",
- "rustls-native-certs",
+ "rustls 0.21.10",
  "tokio",
- "tokio-rustls 0.23.4",
+ "tokio-rustls 0.24.1",
 ]
 
 [[package]]
 name = "hyper-rustls"
-version = "0.24.2"
+version = "0.26.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
+checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c"
 dependencies = [
  "futures-util",
- "http 0.2.11",
- "hyper 0.14.28",
- "rustls 0.21.10",
+ "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.24.1",
+ "tokio-rustls 0.25.0",
+ "tower-service",
 ]
 
 [[package]]
@@ -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,57 +7808,23 @@ dependencies = [
  "pretty_assertions",
  "proc-macro2",
  "quote",
- "syn 2.0.48",
+ "syn 2.0.49",
 ]
 
 [[package]]
-name = "rust-embed"
-version = "8.2.0"
+name = "rust_decimal"
+version = "1.34.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a82c0bbc10308ed323529fd3c1dce8badda635aa319a5ff0e6466f33b8101e3f"
+checksum = "b39449a79f45e8da28c57c341891b69a183044b29518bb8f86dbac9df60bb7df"
 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",
-]
-
-[[package]]
-name = "rust_decimal"
-version = "1.34.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "755392e1a2f77afd95580d3f0d0e94ac83eeeb7167552c9b5bca549e61a94d83"
-dependencies = [
- "arrayvec",
- "borsh",
- "bytes",
- "num-traits",
- "rand 0.8.5",
- "rkyv",
- "serde",
- "serde_json",
+ "arrayvec",
+ "borsh",
+ "bytes",
+ "num-traits",
+ "rand 0.8.5",
+ "rkyv",
+ "serde",
+ "serde_json",
 ]
 
 [[package]]
@@ -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]]
@@ -10082,22 +9425,22 @@ dependencies = [
 
 [[package]]
 name = "tokio-rustls"
-version = "0.23.4"
+version = "0.24.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
+checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
 dependencies = [
- "rustls 0.20.9",
+ "rustls 0.21.10",
  "tokio",
- "webpki",
 ]
 
 [[package]]
 name = "tokio-rustls"
-version = "0.24.1"
+version = "0.25.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
+checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f"
 dependencies = [
- "rustls 0.21.10",
+ "rustls 0.22.2",
+ "rustls-pki-types",
  "tokio",
 ]
 
@@ -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"
-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"
+version = "0.21.0"
 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]]

+ 13 - 6
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"

+ 1 - 1
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 }

+ 7 - 7
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

+ 3 - 3
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<String>) -> Result<PathBuf> {
@@ -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"))?;

+ 5 - 7
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(

+ 3 - 4
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<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>>,
@@ -24,10 +26,7 @@ impl ProxyClient {
         }
     }
 
-    async fn send(
-        &self,
-        mut req: Request<hyper::body::Body>,
-    ) -> Result<Response<hyper::body::Body>> {
+    async fn send(&self, mut req: Request<MyBody>) -> Result<Response<MyBody>> {
         let mut uri_parts = req.uri().clone().into_parts();
         uri_parts.authority = self.url.authority().cloned();
         uri_parts.scheme = self.url.scheme().cloned();

+ 0 - 6
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 }

+ 2 - 2
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()

+ 9 - 9
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<dioxus_web::Config, UnsendContext> {
         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<dioxus_desktop::Config, UnsendContext> {
         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<dioxus_fullstack::Config, SendContext> {
         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<dioxus_mobile::Config, UnsendContext> {
         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<dioxus_tui::Config, UnsendContext> {
         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)

+ 27 - 26
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;

+ 5 - 15
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 = []

+ 19 - 27
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<Option<u32>, ServerFnError> {
     Ok(of.contains("life").then(|| 42))
 }

+ 9 - 8
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
 

+ 4 - 2
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,

+ 2 - 2
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"
 

+ 3 - 1
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)
 }

+ 1 - 1
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"] }
 

+ 0 - 4
packages/fullstack/examples/salvo-hello-world/.gitignore

@@ -1,4 +0,0 @@
-dist
-target
-static
-.dioxus

+ 0 - 25
packages/fullstack/examples/salvo-hello-world/Cargo.toml

@@ -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"]

+ 0 - 57
packages/fullstack/examples/salvo-hello-world/src/main.rs

@@ -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<String, ServerFnError> {
-    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);
-}

+ 0 - 4
packages/fullstack/examples/warp-hello-world/.gitignore

@@ -1,4 +0,0 @@
-dist
-target
-static
-.dioxus

+ 0 - 20
packages/fullstack/examples/warp-hello-world/Cargo.toml

@@ -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"]

+ 0 - 54
packages/fullstack/examples/warp-hello-world/src/main.rs

@@ -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<String, ServerFnError> {
-    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);
-}

+ 4 - 4
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<T, S, Body>,
+        H: Handler<T, S>,
         T: 'static,
         S: Clone + Send + Sync + 'static,
     {
@@ -468,10 +468,10 @@ pub async fn render_handler(
     .await
 }
 
-fn report_err<E: std::fmt::Display>(e: E) -> Response<BoxBody> {
+fn report_err<E: std::fmt::Display>(e: E) -> Response<axum::body::Body> {
     Response::builder()
         .status(StatusCode::INTERNAL_SERVER_ERROR)
-        .body(body::boxed(format!("Error: {}", e)))
+        .body(body::Body::new(format!("Error: {}", e)))
         .unwrap()
 }
 

+ 5 - 7
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<hyper::body::Body>,
+        req: http::Request<MyBody>,
     ) -> std::pin::Pin<
         Box<
             dyn std::future::Future<
-                    Output = Result<http::Response<hyper::body::Body>, server_fn::ServerFnError>,
+                    Output = Result<http::Response<MyBody>, 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));

+ 0 - 581
packages/fullstack/src/adapters/salvo_adapter.rs

@@ -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<String, ServerFnError> {
-//!     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<hyper::Body>;
-type HyperResponse = hyper::Response<HyperBody>;
-
-/// 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<H>(
-        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<std::path::PathBuf>) -> 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<ServeConfig>,
-        virtual_dom_factory: impl Fn() -> VirtualDom + Send + Sync + 'static,
-    ) -> Self;
-}
-
-impl DioxusRouterExt for Router {
-    fn register_server_fns_with_handler<H>(
-        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<std::path::PathBuf>) -> 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::<Vec<_>>()
-                .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<ServeConfig>,
-        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<HyperRequest, SalvoError> {
-    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<dyn Fn() -> 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::<SSRState>() {
-            renderer.clone()
-        } else {
-            let renderer = SSRState::new(&self.cfg);
-            depot.inject(renderer.clone());
-            renderer
-        };
-
-        let route = req.uri().path().to_string();
-        let parts: Arc<RwLock<http::request::Parts>> = 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<DioxusServerContext>,
-        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
-}

+ 0 - 417
packages/fullstack/src/adapters/warp_adapter.rs

@@ -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<String, ServerFnError> {
-//!     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<H, F, R>(
-    server_fn_route: &'static str,
-    mut handler: H,
-) -> BoxedFilter<(R,)>
-where
-    H: FnMut(String, server_fn::ServerFnTraitObj<()>) -> F,
-    F: Filter<Extract = (R,), Error = warp::Rejection> + Send + Sync + 'static,
-    F::Extract: Send,
-    R: Reply + 'static,
-{
-    let mut filter: Option<BoxedFilter<F::Extract>> = 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<ServeConfig>,
-    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<dyn Fn() -> 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<Extract = (impl Reply,), Error = warp::Rejection> + 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<dyn Fn() -> 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<Extract = (http::request::Parts,), Error = warp::reject::Rejection> + 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<dyn Fn() -> 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<dyn Fn() -> 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<Extract = (impl Reply,), Error = warp::Rejection> + 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<warp::ws::WebSocket>);
-                        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)
-    }
-}

+ 12 - 55
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<std::net::SocketAddr>) -> 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();
         }
     }
 }

+ 13 - 13
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<hyper::body::Body>,
+        req: http::Request<MyBody>,
     ) -> Pin<
         Box<
-            dyn std::future::Future<
-                    Output = Result<Response<hyper::body::Body>, server_fn::ServerFnError>,
-                > + Send,
+            dyn std::future::Future<Output = Result<Response<MyBody>, server_fn::ServerFnError>>
+                + Send,
         >,
     >;
 }
 
 impl<S> Service for S
 where
-    S: tower::Service<http::Request<hyper::body::Body>, Response = Response<hyper::body::Body>>,
+    S: tower::Service<http::Request<MyBody>, Response = Response<MyBody>>,
     S::Future: Send + 'static,
     S::Error: Into<server_fn::ServerFnError>,
 {
     fn run(
         &mut self,
-        req: http::Request<hyper::body::Body>,
+        req: http::Request<MyBody>,
     ) -> Pin<
         Box<
-            dyn std::future::Future<
-                    Output = Result<Response<hyper::body::Body>, server_fn::ServerFnError>,
-                > + Send,
+            dyn std::future::Future<Output = Result<Response<MyBody>, 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<dyn Service + Send>);
 
-impl tower::Service<http::Request<hyper::body::Body>> for BoxedService {
-    type Response = http::Response<hyper::body::Body>;
+impl tower::Service<http::Request<MyBody>> for BoxedService {
+    type Response = http::Response<MyBody>;
     type Error = server_fn::ServerFnError;
     type Future = Pin<
         Box<
             dyn std::future::Future<
-                    Output = Result<http::Response<hyper::body::Body>, server_fn::ServerFnError>,
+                    Output = Result<http::Response<MyBody>, server_fn::ServerFnError>,
                 > + Send,
         >,
     >;
@@ -80,7 +80,7 @@ impl tower::Service<http::Request<hyper::body::Body>> for BoxedService {
         Ok(()).into()
     }
 
-    fn call(&mut self, req: Request<hyper::body::Body>) -> Self::Future {
+    fn call(&mut self, req: Request<MyBody>) -> Self::Future {
         self.0.run(req)
     }
 }

+ 27 - 47
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.");
-
-#[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 = "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.");
+// // 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)))]
+// 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)))]
+// compile_error!("The `ssr` feature (enabled by `warp`, `axum`, or `salvo`) and `mobile` feature are overlapping. Please choose one or the other.");

+ 1 - 1
packages/fullstack/src/server_context.rs

@@ -228,7 +228,7 @@ impl<T: Send + Sync + Clone + 'static> FromServerContext for FromContext<T> {
 }
 
 #[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;
 

+ 6 - 6
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::<DioxusServerFnRegistry>()
     }

+ 0 - 5
packages/liveview/.vscode/settings.json

@@ -1,5 +0,0 @@
-{
-    "rust-analyzer.cargo.features": [
-        "warp"
-    ]
-}

+ 3 - 38
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"]

+ 0 - 3
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.
 

+ 0 - 76
packages/liveview/examples/rocket.rs

@@ -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<String> {
-    RawHtml(format!(
-        r#"
-        <!DOCTYPE html>
-        <html>
-            <head> <title>Dioxus LiveView with Rocket</title>  </head>
-            <body> <div id="main"></div> </body>
-            {glue}
-        </html>
-        "#,
-        glue = glue
-    ))
-}
-
-#[get("/")]
-async fn index(config: &Config) -> RawHtml<String> {
-    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<String> {
-    index_page_with_glue(&dioxus_liveview::interpreter_glue("/ws"))
-}
-
-#[get("/ws")]
-fn ws(ws: WebSocket, pool: &State<LiveViewPool>) -> 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");
-}

+ 0 - 67
packages/liveview/examples/salvo.rs

@@ -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#"
-            <!DOCTYPE html>
-            <html>
-                <head> <title>Dioxus LiveView with Salvo</title>  </head>
-                <body> <div id="main"></div> </body>
-                {glue}
-            </html>
-            "#,
-        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::<Arc<LiveViewPool>>().unwrap().clone();
-
-    WebSocketUpgrade::new()
-        .upgrade(req, res, |ws| async move {
-            _ = view.launch(dioxus_liveview::salvo_socket(ws), app).await;
-        })
-        .await
-}

+ 0 - 56
packages/liveview/examples/warp.rs

@@ -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#"
-            <!DOCTYPE html>
-            <html>
-                <head> <title>Dioxus LiveView with Warp</title>  </head>
-                <body> <div id="main"></div> </body>
-                {glue}
-            </html>
-            "#,
-            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;
-}

+ 2 - 4
packages/liveview/src/adapters/axum_adapter.rs

@@ -81,10 +81,8 @@ impl LiveviewRouter for Router {
     }
 
     async fn start(self, address: impl Into<std::net::SocketAddr>) {
-        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);
         }
     }

+ 0 - 15
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.

+ 0 - 113
packages/liveview/src/adapters/rocket_adapter.rs

@@ -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<Message, Error>) -> Result<Vec<u8>, LiveViewError> {
-    message
-        .map_err(|_| LiveViewError::SendingFailed)?
-        .into_text()
-        .map(|s| s.into_bytes())
-        .map_err(|_| LiveViewError::SendingFailed)
-}
-
-async fn transform_tx(message: Vec<u8>) -> Result<Message, Error> {
-    Ok(Message::Binary(message))
-}
-
-impl LiveviewRouter for rocket::Rocket<rocket::Build> {
-    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<String> {
-            let route = request.uri.base();
-
-            let glue = crate::interpreter_glue(&format!("{route}/ws",));
-
-            let title = crate::app_title();
-
-            RawHtml(format!(
-                r#"
-        <!DOCTYPE html>
-        <html>
-            <head> <title>{title}</title>  </head>
-            <body> <div id="main"></div> </body>
-            {glue}
-        </html>
-        "#
-            ))
-        }
-
-        #[get("/ws")]
-        fn ws(ws: WebSocket, app: &State<LiveviewApp>) -> 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<dyn Fn() -> 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<std::net::SocketAddr>) {
-        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");
-    }
-}

+ 0 - 108
packages/liveview/src/adapters/salvo_adapter.rs

@@ -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<Message, salvo::Error>) -> Result<Vec<u8>, LiveViewError> {
-    let as_bytes = message.map_err(|_| LiveViewError::SendingFailed)?;
-
-    Ok(as_bytes.into())
-}
-
-async fn transform_tx(message: Vec<u8>) -> Result<Message, salvo::Error> {
-    Ok(Message::binary(message))
-}
-
-#[derive(Clone)]
-struct LiveviewApp {
-    app: Arc<dyn Fn() -> dioxus_core::prelude::VirtualDom + Send + Sync + 'static>,
-    pool: Arc<LiveViewPool>,
-}
-
-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<std::net::SocketAddr>) {
-        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#"
-            <!DOCTYPE html>
-            <html>
-                <head> <title>{title}</title>  </head>
-                <body> <div id="main"></div> </body>
-                {glue}
-            </html>
-            "#,
-        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::<LiveviewApp>().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
-}

+ 0 - 25
packages/liveview/src/adapters/warp_adapter.rs

@@ -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<Message, warp::Error>) -> Result<Vec<u8>, 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<u8>) -> Result<Message, warp::Error> {
-    Ok(Message::binary(message))
-}

+ 0 - 4
packages/liveview/src/launch.rs

@@ -3,10 +3,6 @@ use std::any::Any;
 
 #[cfg(feature = "axum")]
 pub type Config = crate::Config<axum::Router>;
-#[cfg(all(feature = "salvo", not(feature = "axum")))]
-pub type Config = crate::Config<salvo::Router>;
-#[cfg(all(feature = "rocket", not(any(feature = "axum", feature = "salvo"))))]
-pub type Config = crate::Config<rocket::Rocket<rocket::Build>>;
 
 /// Launches the WebView and runs the event loop, with configuration and root props.
 pub fn launch(

+ 3 - 3
packages/liveview/src/lib.rs

@@ -25,7 +25,7 @@ impl<T> WebsocketRx for T where T: StreamExt<Item = Result<String, LiveViewError
 
 #[derive(Debug, thiserror::Error)]
 pub enum LiveViewError {
-    #[error("warp error")]
+    #[error("Sending to client error")]
     SendingFailed,
 }
 
@@ -113,7 +113,7 @@ pub fn interpreter_glue(url_or_path: &str) -> 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}
 </script>

+ 1 - 1
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"] }

+ 1 - 1
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" }

+ 8 - 8
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::<Route> {}
-        }
-    })
+    launch(app)
+}
+
+fn app() -> Element {
+    rsx! {
+        Router::<Route> {}
+    }
 }
 
 #[component]

+ 7 - 7
packages/router/src/history/liveview.rs

@@ -175,10 +175,8 @@ where
         let eval_provider = consume_context::<Rc<dyn EvalProvider>>();
 
         let create_eval = Rc::new(move |script: &str| {
-            eval_provider
-                .new_evaluator(script.to_string())
-                .map(UseEval::new)
-        }) as Rc<dyn Fn(&str) -> Result<UseEval, EvalError>>;
+            UseEval::new(eval_provider.new_evaluator(script.to_string()))
+        }) as Rc<dyn Fn(&str) -> 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<State>,
@@ -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 {

+ 49 - 42
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<R: Routable> {
     pub(crate) initial_route: Option<R>,
 }
 
-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::<R>::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::<R>::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<R: Routable + Clone> Default for RouterConfig<R>
 where
     <R as std::str::FromStr>::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<R: Routable + Clone>(initial_route: R) -> Box<dyn AnyHistoryProvider>
+where
+    <R as std::str::FromStr>::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::<R>::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::<R>::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),
+    ))
+}

+ 6 - 5
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 = []