From 6e99dc3d7035de26fbdc346bc50567b5ca04096e Mon Sep 17 00:00:00 2001 From: Andrew Rioux Date: Thu, 23 Jan 2025 21:11:25 -0500 Subject: [PATCH] feat: figured out leptos networking --- Cargo.lock | 321 +++++++++++++++++++++++++++----- flake.lock | 8 +- flake.nix | 2 +- sparse-server/Cargo.toml | 32 +++- sparse-server/src/app.rs | 87 +++++++++ sparse-server/src/db.rs | 2 + sparse-server/src/db/beacons.rs | 1 + sparse-server/src/db/users.rs | 1 + sparse-server/src/main.rs | 3 + sparse-server/src/webserver.rs | 37 +++- 10 files changed, 427 insertions(+), 67 deletions(-) create mode 100644 sparse-server/src/db.rs create mode 100644 sparse-server/src/db/beacons.rs create mode 100644 sparse-server/src/db/users.rs diff --git a/Cargo.lock b/Cargo.lock index 503507b..599ba14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -151,6 +151,7 @@ checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", + "base64", "bytes", "futures-util", "http", @@ -170,8 +171,10 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", + "sha1", "sync_wrapper", "tokio", + "tokio-tungstenite", "tower 0.5.2", "tower-layer", "tower-service", @@ -275,6 +278,15 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -331,7 +343,9 @@ checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", + "wasm-bindgen", "windows-targets", ] @@ -355,7 +369,7 @@ dependencies = [ "ansi_term", "atty", "bitflags 1.3.2", - "strsim", + "strsim 0.8.0", "textwrap", "unicode-width", "vec_map", @@ -451,12 +465,66 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.96", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.96", +] + [[package]] name = "dashmap" version = "6.1.0" @@ -471,6 +539,24 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "data-encoding" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" + +[[package]] +name = "default-struct-builder" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0df63c21a4383f94bd5388564829423f35c316aed85dc4f8427aded372c7c0d" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "derive-where" version = "1.2.7" @@ -482,6 +568,16 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -665,6 +761,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -672,8 +778,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -855,9 +963,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hydration_context" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef13071fe13b55c85fe2b70246d2e3b49d2c6a764fd3e0edaf262cc385ff1854" +checksum = "d35485b3dcbf7e044b8f28c73f04f13e7b509c2466fd10cb2a8a447e38f8a93a" dependencies = [ "futures", "js-sys", @@ -1046,6 +1154,12 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "1.0.3" @@ -1118,10 +1232,11 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1139,15 +1254,16 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "leptos" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5046c590aea121f6ad5e71fcb75453a933425d39527b9a3b1b295235afc8df" +checksum = "21c31c9d022c77702c53e02830d08b28320aca9c0899a19c443096c114623fa5" dependencies = [ "any_spawner", "base64", "cfg-if", "either_of", "futures", + "getrandom", "hydration_context", "leptos_config", "leptos_dom", @@ -1175,10 +1291,31 @@ dependencies = [ ] [[package]] -name = "leptos_axum" -version = "0.7.0" +name = "leptos-use" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0d388392939f629c45b8c7bcc83997cb6c6026813b57f50953651ad5be63d8" +checksum = "e63ce77018c615075541d944d678853b5bb40c79510e39edf695cadb9b128e13" +dependencies = [ + "cfg-if", + "chrono", + "codee", + "default-struct-builder", + "js-sys", + "lazy_static", + "leptos", + "paste", + "send_wrapper", + "thiserror 2.0.11", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "leptos_axum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b613d5784037baee42a11d21bc263adfc1a55e416556a3d5bfe39c7b87fadf" dependencies = [ "any_spawner", "axum", @@ -1213,9 +1350,9 @@ dependencies = [ [[package]] name = "leptos_dom" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c15aca81dc2edd040b51c46734f65c6f36e6ba8a31347c1354c94b958044ae0" +checksum = "a462aaeec85bc4ecfb26bf324437b92690bf3add1e30eb29b3acc08b20e8b4cb" dependencies = [ "js-sys", "or_poisoned", @@ -1246,9 +1383,9 @@ dependencies = [ [[package]] name = "leptos_integration_utils" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d293a2f64a558d4ca10ef01125d055134f3582f27c407102c4259bb54ca8b55b" +checksum = "a8652fcd7a1744f85403b95c5520143f3b962d640c8450b8514f9530fb5c4b76" dependencies = [ "futures", "hydration_context", @@ -1283,9 +1420,9 @@ dependencies = [ [[package]] name = "leptos_meta" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c651d788bbbf1c57ee95dd3835f9d433b85a409b6256f338c3c7146eb8b7f53" +checksum = "7250991b2077ef5869e999c74cf4990926a3c3919b50c9937e101c1c874102db" dependencies = [ "futures", "indexmap", @@ -1299,9 +1436,9 @@ dependencies = [ [[package]] name = "leptos_router" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4f1784486ebf36805dac22faee21e3e610aa64b6662a7386f065eeec27ae8" +checksum = "9a193dbd62b9617a5d7d199ea70c570da01a1bbe798e617373b6351845be6778" dependencies = [ "any_spawner", "either_of", @@ -1335,9 +1472,9 @@ dependencies = [ [[package]] name = "leptos_server" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93450589df3b3e398c7f5ea64d8f1c8369b1ba9b90e1f70f6cb996b8d443ca3e" +checksum = "18caffe32c245ddb35697edd898ccb3393efce67672a707a14eebd0db2e8249a" dependencies = [ "any_spawner", "base64", @@ -1969,9 +2106,9 @@ dependencies = [ [[package]] name = "rstml" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51187e564f12336ef40cd04f6f4d805d6919188001dcf1e0a021898ea0fe28ce" +checksum = "61cf4616de7499fc5164570d40ca4e1b24d231c6833a88bff0fe00725080fd56" dependencies = [ "derive-where", "proc-macro2", @@ -1979,7 +2116,7 @@ dependencies = [ "quote", "syn 2.0.96", "syn_derive", - "thiserror 1.0.69", + "thiserror 2.0.11", ] [[package]] @@ -2002,9 +2139,9 @@ checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustix" -version = "0.38.43" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags 2.8.0", "errno", @@ -2155,9 +2292,9 @@ dependencies = [ [[package]] name = "server_fn" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "033cb8014aa86a7ce0c6ee58d23dce1a078b2e320dc6c53bb439663993199b1f" +checksum = "f5dd7fcccd3ef2081da086c1f8595b506627abbbbc9f64be0141d2251219570e" dependencies = [ "axum", "bytes", @@ -2213,6 +2350,17 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -2291,19 +2439,26 @@ dependencies = [ "anyhow", "axum", "axum-server", + "codee", "console_error_panic_hook", + "futures", + "futures-util", "http", "leptos", + "leptos-use", "leptos_axum", "leptos_meta", "leptos_router", "structopt", "thiserror 1.0.69", "tokio", + "tokio-stream", "tower 0.4.13", "tower-http 0.5.2", + "tracing", "tracing-subscriber", "wasm-bindgen", + "web-sys", ] [[package]] @@ -2332,6 +2487,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "structopt" version = "0.3.26" @@ -2386,11 +2547,11 @@ dependencies = [ [[package]] name = "syn_derive" -version = "0.1.8" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +checksum = "cdb066a04799e45f5d582e8fc6ec8e6d6896040d00898eb4e6a835196815b219" dependencies = [ - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", "syn 2.0.96", @@ -2415,9 +2576,9 @@ dependencies = [ [[package]] name = "tachys" -version = "0.1.0" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be68dfd4abf192e11a1bdd484239daa84ffa6fcd27c25cf4f011b2b0fb27ddb" +checksum = "d777e4426a597296b020edcb5c3d8f25a3ccd8adfd22eb5154ac81da946aef9f" dependencies = [ "any_spawner", "const_str_slice_concat", @@ -2571,6 +2732,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + [[package]] name = "tokio-util" version = "0.7.13" @@ -2719,9 +2892,21 @@ checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "tracing-core" version = "0.1.33" @@ -2774,6 +2959,24 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + [[package]] name = "typed-builder" version = "0.20.0" @@ -2794,6 +2997,12 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicase" version = "2.8.1" @@ -2802,9 +3011,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" [[package]] name = "unicode-segmentation" @@ -2841,6 +3050,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf16_iter" version = "1.0.5" @@ -2861,9 +3076,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" +checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" dependencies = [ "getrandom", ] @@ -2904,24 +3119,24 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn 2.0.96", @@ -2930,21 +3145,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2952,9 +3168,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -2965,9 +3181,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" @@ -2984,9 +3203,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/flake.lock b/flake.lock index 6ac171b..f9430f0 100644 --- a/flake.lock +++ b/flake.lock @@ -95,16 +95,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1737299813, - "narHash": "sha256-Qw2PwmkXDK8sPQ5YQ/y/icbQ+TYgbxfjhgnkNJyT1X8=", + "lastModified": 1737469691, + "narHash": "sha256-nmKOgAU48S41dTPIXAq0AHZSehWUn6ZPrUKijHAMmIk=", "owner": "nixos", "repo": "nixpkgs", - "rev": "107d5ef05c0b1119749e381451389eded30fb0d5", + "rev": "9e4d5190a9482a1fb9d18adf0bdb83c6e506eaab", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-24.11", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index db9ff92..1d059e1 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Sparse C2 framework"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; rust-overlay = { url = "github:oxalica/rust-overlay"; diff --git a/sparse-server/Cargo.toml b/sparse-server/Cargo.toml index 880d4b6..66ddd8f 100644 --- a/sparse-server/Cargo.toml +++ b/sparse-server/Cargo.toml @@ -7,22 +7,29 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -leptos = { version = "0.7.0", features = ["nightly"] } -leptos_router = { version = "0.7.0", features = ["nightly"] } -axum = { version = "0.7", optional = true } +leptos = { version = "^0.7", features = ["nightly"] } +leptos_router = { version = "^0.7", features = ["nightly"] } +axum = { version = "^0.7", optional = true } console_error_panic_hook = "0.1" -leptos_axum = { version = "0.7.0", optional = true } -leptos_meta = { version = "0.7.0" } +leptos_axum = { version = "^0.7", optional = true } +leptos_meta = { version = "^0.7" } tokio = { version = "1", features = ["rt-multi-thread"], optional = true } tower = { version = "0.4", optional = true } tower-http = { version = "0.5", features = ["fs"], optional = true } -wasm-bindgen = "=0.2.95" +wasm-bindgen = "0.2" thiserror = "1" http = "1" -axum-server = { version = "0.7.1", features = ["tokio-rustls"], optional = true } -tracing-subscriber = { version = "0.3.19", features = ["chrono", "env-filter", "serde", "tracing", "tracing-serde"], optional = true } +axum-server = { version = "^0.7", features = ["tokio-rustls"], optional = true } +tracing-subscriber = { version = "0.3", features = ["chrono", "env-filter", "serde", "tracing", "tracing-serde"], optional = true } structopt = { version = "0.3", optional = true } -anyhow = "1.0.95" +anyhow = "1.0" +futures = "0.3" +tokio-stream = { version = "0.1", optional = true } +futures-util = { version = "0.3", optional = true } +tracing = { version = "0.1", optional = true } +web-sys = { version = "0.3", features = ["WebSocket"] } +leptos-use = { version = "0.15", default_features = false, features = ["use_websocket"] } +codee = "0.2" [features] hydrate = ["leptos/hydrate"] @@ -35,9 +42,14 @@ ssr = [ "dep:axum-server", "dep:tracing-subscriber", "dep:structopt", + "dep:tokio-stream", + "dep:futures-util", + "dep:tracing", "leptos/ssr", "leptos_meta/ssr", "leptos_router/ssr", + "leptos-use/ssr", + "axum/ws" ] [package.metadata.leptos] @@ -58,7 +70,7 @@ env = "DEV" bin-features = ["ssr"] bin-default-features = false -bin-target-triple = "x86_64-unknown-linux-musl" +bin-target-triple = "x86_64-unknown-linux-gnu" lib-features = ["hydrate"] lib-default-features = false diff --git a/sparse-server/src/app.rs b/sparse-server/src/app.rs index 11509f6..538f1cc 100644 --- a/sparse-server/src/app.rs +++ b/sparse-server/src/app.rs @@ -5,6 +5,21 @@ use leptos_router::{ StaticSegment, }; +#[server] +pub async fn test_retrieve() -> Result { + use leptos::server_fn::error::NoCustomError; + + tokio::time::sleep(tokio::time::Duration::from_millis(1000)).await; + + let start = std::time::SystemTime::now(); + let since_the_epoch = start + .duration_since(std::time::UNIX_EPOCH) + .map_err(|e| ServerFnError::::ServerError(e.to_string()))? + .as_secs(); + + Ok(since_the_epoch) +} + pub fn shell(options: LeptosOptions) -> impl IntoView { view! { @@ -47,12 +62,84 @@ pub fn App() -> impl IntoView { /// Renders the home page of your application. #[component] fn HomePage() -> impl IntoView { + use web_sys::WebSocket; + use std::sync::Arc; + use leptos_use::{UseWebSocketReturn, use_websocket}; + // Creates a reactive value to update the button let count = RwSignal::new(0); let on_click = move |_| *count.write() += 1; + let loaded_time = Resource::new(|| (), |_| async move { test_retrieve().await }); + + let (requested_time, set_requested_time) = signal(None::); + let request_time = Action::new(move |_: &()| async move { + let t = match test_retrieve().await { + Ok(t) => format!("{}", t), + Err(_) => "Error!".to_string() + }; + set_requested_time(Some(t)); + }); + let request_time_callback = move |_| { + request_time.dispatch(()); + }; + let pending = request_time.pending(); + + let text_input = RwSignal::new("".to_owned()); + let (messages, set_messages) = signal(Vec::::new()); + + let UseWebSocketReturn { send, message, .. } = use_websocket::("/ws"); + + Effect::new(move |_| { + message.with(move |message| { + if let Some(m) = message { + leptos::logging::log!("got update: {}", m); + set_messages.update(|messages: &mut Vec<_>| messages.push(format!("msg: {}", m))); + } + }) + }); + + let send_message = move |_| { + send(&text_input.get()); + text_input.set("".to_string()); + }; + view! {

"Welcome to Leptos!"

+ "Loading..."

} + > +

"Loaded time:"

+ {move || { + loaded_time.get() + .map(|time| match time { + Ok(t) => view! {

{format!("{}", t)}

}, + Err(_) => view! {

{"Error!".to_string()}

} + }) + }} +

"Requested time:"

+ + {move || pending.get().then_some("Loading...")} + {move || match requested_time.get() { + Some(t) => { + leptos::logging::log!("updating time display"); + view! {

{t}

} + }, + None => view! {

{"N/A".to_string()}

} + }} +
+

"Messages"

+ + + {move || messages + .get() + .iter() + .map(|message| view! {

{message.clone()}

}) + .collect::>()} } } diff --git a/sparse-server/src/db.rs b/sparse-server/src/db.rs new file mode 100644 index 0000000..d321fbf --- /dev/null +++ b/sparse-server/src/db.rs @@ -0,0 +1,2 @@ +mod beacons; +mod users; diff --git a/sparse-server/src/db/beacons.rs b/sparse-server/src/db/beacons.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/sparse-server/src/db/beacons.rs @@ -0,0 +1 @@ + diff --git a/sparse-server/src/db/users.rs b/sparse-server/src/db/users.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/sparse-server/src/db/users.rs @@ -0,0 +1 @@ + diff --git a/sparse-server/src/main.rs b/sparse-server/src/main.rs index 3070910..868f8ab 100644 --- a/sparse-server/src/main.rs +++ b/sparse-server/src/main.rs @@ -14,6 +14,9 @@ mod cli; #[cfg(feature = "ssr")] mod webserver; +#[cfg(feature = "ssr")] +mod db; + #[cfg(feature = "ssr")] #[tokio::main] async fn main() -> anyhow::Result<()> { diff --git a/sparse-server/src/webserver.rs b/sparse-server/src/webserver.rs index df144b1..8d331df 100644 --- a/sparse-server/src/webserver.rs +++ b/sparse-server/src/webserver.rs @@ -1,3 +1,37 @@ +pub async fn websocket(ws: axum::extract::ws::WebSocketUpgrade) -> axum::response::Response { + ws.on_upgrade(handle_websocket) +} + +async fn handle_websocket(mut socket: axum::extract::ws::WebSocket) { + use futures_util::StreamExt; + use tracing::info; + + let mut count = 0; + + loop { + tokio::select! { + msg = socket.recv() => { + match msg { + None => { + break; + } + Some(msg) => { + let Ok(axum::extract::ws::Message::Text(msg)) = msg else { continue; }; + + info!("Received message! {}", msg); + + let Ok(_) = socket.send(axum::extract::ws::Message::Text(msg)).await else { break; }; + } + } + } + _ = tokio::time::sleep(tokio::time::Duration::from_secs(1)) => { + let Ok(_) = socket.send(axum::extract::ws::Message::Text(format!("{}", count))).await else { break; }; + count += 1; + } + } + } +} + pub async fn serve_web(options: crate::cli::Options) -> anyhow::Result<()> { use axum::Router; use leptos::logging::log; @@ -21,6 +55,7 @@ pub async fn serve_web(options: crate::cli::Options) -> anyhow::Result<()> { let routes = generate_route_list(App); let app = Router::new() + .route("/ws", axum::routing::any(websocket)) .leptos_routes(&leptos_options, routes, { let leptos_options = leptos_options.clone(); move || shell(leptos_options.clone()) @@ -30,7 +65,7 @@ pub async fn serve_web(options: crate::cli::Options) -> anyhow::Result<()> { // run our app with hyper // `axum::Server` is a re-export of `hyper::Server` - log!("listening on http://{}", &addr); + tracing::info!("listening on http://{}", &addr); let listener = tokio::net::TcpListener::bind(&addr).await?; axum::serve(listener, app.into_make_service()).await?;