diff --git a/.gitignore b/.gitignore index ea8c4bf..f29ad9e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +striker-config.toml diff --git a/Cargo.lock b/Cargo.lock index 78910a2..ed40dca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,16 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -45,7 +55,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.10.0", + "bitflags 2.11.0", "cc", "cesu8", "jni", @@ -73,9 +83,9 @@ checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "approx" @@ -100,7 +110,7 @@ checksum = "f548ad2c4031f2902e3edc1f29c29e835829437de49562d8eb5dc5584d3a1043" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -117,9 +127,9 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.3" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" dependencies = [ "async-task", "concurrent-queue", @@ -195,26 +205,41 @@ dependencies = [ "windows-link", ] +[[package]] +name = "backtrace-ext" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" +dependencies = [ + "backtrace", +] + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bevy" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec689b5a79452b6f777b889bbff22d3216b82a8d2ab7814d4a0eb571e9938d97" +checksum = "1fd310426290cec560221f9750c2f4484be4a8eeea7de3483c423329b465c40e" dependencies = [ "bevy_internal", ] [[package]] name = "bevy_a11y" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef69b6d2dec07cbf407c63f6987e1746e4b735a9beea51f4bfc25ad49e344f75" +checksum = "e887b25c84f384ffe3278a17cf0e4b405eaa3c8fbc3db24d05d560a11780676d" dependencies = [ "accesskit", "bevy_app", @@ -225,18 +250,18 @@ dependencies = [ [[package]] name = "bevy_android" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008133458cfe0d43a8870bfc4c5a729467cc5d9246611462add38bcf45ed896f" +checksum = "a8c58de772ac1148884112e8a456c4f127a94b95a0e42ab5b160b7a11895a241" dependencies = [ "android-activity", ] [[package]] name = "bevy_app" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2271a0123a7cc355c3fe98754360c75aa84b29f2a6b1a9f8c00aac427570d174" +checksum = "def9f41aa5bf9b9dec8beda307a332798609cffb9d44f71005e0cfb45164f2f6" dependencies = [ "bevy_derive", "bevy_ecs", @@ -249,7 +274,7 @@ dependencies = [ "ctrlc", "downcast-rs", "log", - "thiserror 2.0.17", + "thiserror 2.0.18", "variadics_please", "wasm-bindgen", "web-sys", @@ -257,35 +282,35 @@ dependencies = [ [[package]] name = "bevy_color" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74727302424d7ffc23528a974dbb44a34708662926e1a3bfc5040493f858886e" +checksum = "2eb41e8310a85811d14a4e75cfc2d6c07ac70661d6a4883509fc960f622970a8" dependencies = [ "bevy_math", "bevy_reflect", "bytemuck", "derive_more", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "wgpu-types", ] [[package]] name = "bevy_derive" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b6a05c31f54c83d681f1b8699bbaf581f06b25a40c9a6bb815625f731f5ba9" +checksum = "318ee0532c3da93749859d18f89a889c638fbc56aabac4d866583df7b951d103" dependencies = [ "bevy_macro_utils", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "bevy_diagnostic" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aca4caa8a9014a435dca382b1bdebaee4363e9be69882c598fc4ff4d7cd56e6a" +checksum = "ec8543a0f7afd56d3499ba80ffab6ef0bad12f93c2d2ca9aa7b1f1b8816c3980" dependencies = [ "atomic-waker", "bevy_app", @@ -300,9 +325,9 @@ dependencies = [ [[package]] name = "bevy_ecs" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24637a7c8643cab493f4085cda6bde4895f0e0816699c59006f18819da2ca0b8" +checksum = "c9cf7a3ee41342dd7b5a5d82e200d0e8efb933169247fce853b4ad633d51e87d" dependencies = [ "arrayvec", "bevy_ecs_macros", @@ -311,7 +336,7 @@ dependencies = [ "bevy_reflect", "bevy_tasks", "bevy_utils", - "bitflags 2.10.0", + "bitflags 2.11.0", "bumpalo", "concurrent-queue", "derive_more", @@ -322,27 +347,27 @@ dependencies = [ "serde", "slotmap", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "variadics_please", ] [[package]] name = "bevy_ecs_macros" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb14c18ca71e11c69fbae873c2db129064efac6d52e48d0127d37bfba1acfa8" +checksum = "908baf585e2ea16bd53ef0da57b69580478af0059d2dbdb4369991ac9794b618" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "bevy_input" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2853993baf27b963a417d3603a73e02e39c5041913cd1ba7211b0a3037b191" +checksum = "dbc8ffbd02df34dfc52faf420a5263985973765e228043adf542fd0d790a6b21" dependencies = [ "bevy_app", "bevy_ecs", @@ -351,14 +376,14 @@ dependencies = [ "bevy_reflect", "derive_more", "log", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "bevy_input_focus" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05fc0fae5e4e081180f7f7bf8023a2b97dad13dcb5fa79eba50cda5bb95699a9" +checksum = "08d48a5bceccb9157549a39ab3de4017f5368b65db6471605e9a3f1c19d91bbc" dependencies = [ "bevy_app", "bevy_ecs", @@ -367,14 +392,14 @@ dependencies = [ "bevy_reflect", "bevy_window", "log", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "bevy_internal" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57463815630ea71221c0b8e7bff72d816a3071a89507c45f9e2686fbb5e1956b" +checksum = "6a11df62e49897def470471551c02f13c6fb488e55dddb5ab7ef098132e07754" dependencies = [ "bevy_a11y", "bevy_android", @@ -399,9 +424,9 @@ dependencies = [ [[package]] name = "bevy_log" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406304a9b867a2de98c3edf0cc9e5a608fad1a1ddc567e15e72c186a8273ef51" +checksum = "c2aac1187f83a1ab2eae887564f7fb14b4abb3fbe8b2267a6426663463923120" dependencies = [ "android_log-sys", "bevy_app", @@ -417,46 +442,46 @@ dependencies = [ [[package]] name = "bevy_macro_utils" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7272fca0bf30d8ca2571a803598856104b63e5c596d52850f811ed37c5e1e3" +checksum = "3b147843b81a7ec548876ff97fa7bfdc646ef2567cb465566259237b39664438" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", - "toml_edit", + "syn 2.0.117", + "toml_edit 0.23.10+spec-1.0.0", ] [[package]] name = "bevy_math" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a815c514b8a6f7b11508cdc8b3a4bf0761e96a14227af40aa93cb1160989ce0" +checksum = "e931fa969f89c83498b22c97432383afe90e90fd1a5e04fa07be8da4d3bcac84" dependencies = [ "approx", "arrayvec", "bevy_reflect", "derive_more", "glam", - "itertools 0.14.0", + "itertools", "libm", "rand 0.9.2", "rand_distr", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "variadics_please", ] [[package]] name = "bevy_platform" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b29ea749a8e85f98186ab662f607b885b97c804bb14cdb0cdf838164496d474" +checksum = "ec6b36504169b644acd26a5469fd8d371aa6f1d73ee5c01b1b1181ae1cefbf9b" dependencies = [ "critical-section", - "foldhash", + "foldhash 0.2.0", "futures-channel", - "hashbrown", + "hashbrown 0.16.1", "js-sys", "portable-atomic", "portable-atomic-util", @@ -469,9 +494,9 @@ dependencies = [ [[package]] name = "bevy_ptr" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f98cbc6d34bbdb58240b72ed1731931b4991a893b3a3238bb7c42ae054aa676" +checksum = "c7a9329e8dc4e01ced480eeec4902e6d7cb56e56ec37f6fbc4323e5c937290a7" [[package]] name = "bevy_ratatui" @@ -480,7 +505,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e24368df4cff95c92448a33c46f7db4ff51016a3024d27bd2daa49d0e3ce03f4" dependencies = [ "bevy", - "bitflags 2.10.0", + "bitflags 2.11.0", "color-eyre", "ratatui", "tracing", @@ -488,9 +513,9 @@ dependencies = [ [[package]] name = "bevy_reflect" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a977e2b8dba65b6e9c11039c5f9ef108be428f036b3d1cac13ad86ec59f9c" +checksum = "d1dfeb67a9fe4f59003a84f5f99ba6302141c70e926601cbc6abfd4a1eea9ca9" dependencies = [ "assert_type_match", "bevy_platform", @@ -501,13 +526,13 @@ dependencies = [ "disqualified", "downcast-rs", "erased-serde", - "foldhash", + "foldhash 0.2.0", "glam", "indexmap", "serde", "smallvec", "smol_str", - "thiserror 2.0.17", + "thiserror 2.0.18", "uuid", "variadics_please", "wgpu-types", @@ -515,23 +540,23 @@ dependencies = [ [[package]] name = "bevy_reflect_derive" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "067af30072b1611fda1a577f1cb678b8ea2c9226133068be808dd49aac30cef0" +checksum = "475f68c93e9cd5f17e9167635c8533a4f388f12d38245a202359e4c2721d87ba" dependencies = [ "bevy_macro_utils", "indexmap", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "uuid", ] [[package]] name = "bevy_state" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9453325ca0c185a043f4515158daa15a8ab19139a60fd1edaf87fbe896cb7f83" +checksum = "0ae0682968e97d29c1eccc8c6bb6283f2678d362779bc03f1bb990967059473b" dependencies = [ "bevy_app", "bevy_ecs", @@ -545,20 +570,20 @@ dependencies = [ [[package]] name = "bevy_state_macros" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d733081e57e49b3c43bdf3766d1de74c7df32e0f4db20c20437c85b1d18908de" +checksum = "73d32f90f9cfcef5a44401db7ce206770daaa1707b0fb95eb7a96a6933f54f1b" dependencies = [ "bevy_macro_utils", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "bevy_tasks" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990ffedd374dd2c4fe8f0fd4bcefd5617d1ee59164b6c3fcc356a69b48e26e8e" +checksum = "384eb04d80aa38664d69988fd30cbbe03e937ecb65c66aa6abe60ce0bca826aa" dependencies = [ "async-channel", "async-executor", @@ -575,9 +600,9 @@ dependencies = [ [[package]] name = "bevy_time" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4c68b78e7ca1cc10c811cd1ded8350f53f2be11eb46946879a74c684026bff7" +checksum = "b5ef9af4e523195e561074cf60fbfad0f4cb8d1db504855fee3c4ce8896c7244" dependencies = [ "bevy_app", "bevy_ecs", @@ -590,9 +615,9 @@ dependencies = [ [[package]] name = "bevy_transform" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30e3957de42c2f7d88dfe8428e739b74deab8932d2a8bbb9d4eefbd64b6aa34" +checksum = "3c3bb3de7842fef699344beb03f22bdbff16599d788fe0f47fbb3b1e6fa320eb" dependencies = [ "bevy_app", "bevy_ecs", @@ -603,14 +628,14 @@ dependencies = [ "bevy_utils", "derive_more", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "bevy_utils" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e258c44d869f9c41ac0f88a16815c67f2569eb9fff4716828a40273d127b6f84" +checksum = "2111910cd7a4b1e6ce07eaaeb6f68a2c0ea0ca609ed0d0d506e3eb161101435b" dependencies = [ "bevy_platform", "disqualified", @@ -619,9 +644,9 @@ dependencies = [ [[package]] name = "bevy_window" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "869a56f1da2544641734018e1f1caa660299cd6e3af794f3fa0df72293d8eed2" +checksum = "6df06e6993a0896bae2fe7644ae6def29a1a92b45dfb1bcebbd92af782be3638" dependencies = [ "bevy_app", "bevy_ecs", @@ -657,13 +682,22 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" dependencies = [ "serde_core", ] +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -684,15 +718,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] @@ -705,7 +739,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -716,9 +750,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "castaway" @@ -731,9 +765,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.52" +version = "1.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", "jobserver", @@ -759,13 +793,48 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + [[package]] name = "cobs" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -854,16 +923,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "cordyceps" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" -dependencies = [ - "loom", - "tracing", -] - [[package]] name = "cpufeatures" version = "0.2.17" @@ -909,7 +968,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "crossterm_winapi", "derive_more", "document-features", @@ -952,15 +1011,40 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.5.1" +version = "3.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" +checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162" dependencies = [ "dispatch2", - "nix 0.30.1", + "nix 0.31.2", "windows-sys 0.61.2", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "fiat-crypto", + "rustc_version", + "subtle", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "darling" version = "0.23.0" @@ -981,7 +1065,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -992,7 +1076,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1003,9 +1087,9 @@ checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", ] @@ -1029,16 +1113,10 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.114", + "syn 2.0.117", "unicode-xid", ] -[[package]] -name = "diatomic-waker" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" - [[package]] name = "digest" version = "0.10.7" @@ -1047,15 +1125,16 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] name = "dispatch2" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "libc", "objc2", @@ -1108,9 +1187,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" dependencies = [ "serde", "serde_core", @@ -1129,9 +1208,9 @@ dependencies = [ [[package]] name = "euclid" -version = "0.22.11" +version = "0.22.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63" dependencies = [ "num-traits", ] @@ -1183,6 +1262,12 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "filedescriptor" version = "0.8.3" @@ -1196,9 +1281,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "finl_unicode" @@ -1226,58 +1311,49 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.2.0" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "futures-buffered" -version = "0.2.12" +name = "foldhash" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8e0e1f38ec07ba4abbde21eed377082f17ccb988be9d988a5adbf4bafc118fd" -dependencies = [ - "cordyceps", - "diatomic-waker", - "futures-core", - "pin-project-lite", - "spin", -] +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", ] [[package]] name = "futures-concurrency" -version = "7.6.3" +version = "7.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eb68017df91f2e477ed4bea586c59eaecaa47ed885a770d0444e21e62572cd2" +checksum = "175cd8cca9e1d45b87f18ffa75088f2099e3c4fe5e2f83e42de112560bea8ea6" dependencies = [ "fixedbitset 0.5.7", - "futures-buffered", "futures-core", "futures-lite", "pin-project", - "slab", "smallvec", ] [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-lite" @@ -1293,18 +1369,21 @@ dependencies = [ ] [[package]] -name = "generator" -version = "0.8.8" +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ - "cc", - "cfg-if", - "libc", - "log", - "rustversion", - "windows-link", - "windows-result", + "futures-core", + "futures-task", + "pin-project-lite", + "slab", ] [[package]] @@ -1325,8 +1404,21 @@ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", "wasip2", + "wasip3", ] [[package]] @@ -1355,6 +1447,15 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + [[package]] name = "hashbrown" version = "0.16.1" @@ -1363,7 +1464,7 @@ checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.2.0", "serde", "serde_core", ] @@ -1397,6 +1498,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "ident_case" version = "1.0.1" @@ -1416,7 +1523,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.1", + "serde", + "serde_core", ] [[package]] @@ -1428,6 +1537,15 @@ dependencies = [ "rustversion", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "instability" version = "0.3.11" @@ -1438,17 +1556,14 @@ dependencies = [ "indoc", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] -name = "itertools" -version = "0.13.0" +name = "is_ci" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" [[package]] name = "itertools" @@ -1467,9 +1582,9 @@ checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jiff" -version = "0.2.18" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" +checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -1482,20 +1597,20 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.18" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" +checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "jiff-tzdb" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68971ebff725b9e2ca27a601c5eb38a4c5d64422c4cbab0c535f248087eda5c2" +checksum = "c900ef84826f1338a557697dc8fc601df9ca9af4ac137c7fb61d4c6f2dfd3076" [[package]] name = "jiff-tzdb-platform" @@ -1534,15 +1649,15 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom", + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.83" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -1550,13 +1665,13 @@ dependencies = [ [[package]] name = "kasuari" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe90c1150662e858c7d5f945089b7517b0a80d8bf7ba4b1b5ffc984e7230a5b" +checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" dependencies = [ - "hashbrown", + "hashbrown 0.16.1", "portable-atomic", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -1571,17 +1686,23 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" -version = "0.2.180" +version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "line-clipping" @@ -1589,14 +1710,14 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f4de44e98ddbf09375cbf4d17714d18f39195f4f4894e8524501726fd9a8a4a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litrs" @@ -1619,26 +1740,13 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", -] - [[package]] name = "lru" version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" dependencies = [ - "hashbrown", + "hashbrown 0.16.1", ] [[package]] @@ -1662,9 +1770,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memmem" @@ -1681,6 +1789,36 @@ dependencies = [ "autocfg", ] +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "backtrace", + "backtrace-ext", + "cfg-if", + "miette-derive", + "owo-colors", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1714,7 +1852,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "jni-sys", "log", "ndk-sys", @@ -1743,7 +1881,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "libc", @@ -1752,11 +1890,11 @@ dependencies = [ [[package]] name = "nix" -version = "0.30.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "libc", @@ -1789,9 +1927,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-derive" @@ -1801,7 +1939,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1833,7 +1971,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1847,9 +1985,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", ] @@ -1871,9 +2009,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "opaque-debug" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "ordered-float" @@ -1886,9 +2030,9 @@ dependencies = [ [[package]] name = "owo-colors" -version = "4.2.3" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" [[package]] name = "parking" @@ -1921,9 +2065,9 @@ dependencies = [ [[package]] name = "pest" -version = "2.8.5" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" dependencies = [ "memchr", "ucd-trie", @@ -1931,9 +2075,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.5" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed" +checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" dependencies = [ "pest", "pest_generator", @@ -1941,22 +2085,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.5" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5" +checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "pest_meta" -version = "2.8.5" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365" +checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" dependencies = [ "pest", "sha2", @@ -2002,7 +2146,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2016,29 +2160,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "polling" @@ -2054,17 +2198,28 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" dependencies = [ "portable-atomic", ] @@ -2096,29 +2251,39 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit", + "toml_edit 0.25.4+spec-1.1.0", ] [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.43" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -2129,6 +2294,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" version = "0.8.5" @@ -2145,7 +2316,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -2155,7 +2326,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -2166,11 +2337,11 @@ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "getrandom", + "getrandom 0.3.4", ] [[package]] @@ -2185,9 +2356,9 @@ dependencies = [ [[package]] name = "rapidhash" -version = "4.2.0" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2988730ee014541157f48ce4dcc603940e00915edc3c7f9a8d78092256bb2493" +checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" dependencies = [ "rand 0.9.2", "rustversion", @@ -2213,18 +2384,18 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "compact_str", - "hashbrown", + "hashbrown 0.16.1", "indoc", - "itertools 0.14.0", + "itertools", "kasuari", "lru", "strum", - "thiserror 2.0.17", + "thiserror 2.0.18", "unicode-segmentation", "unicode-truncate", - "unicode-width", + "unicode-width 0.2.2", ] [[package]] @@ -2265,17 +2436,17 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7dbfa023cd4e604c2553483820c5fe8aa9d71a42eea5aa77c6e7f35756612db" dependencies = [ - "bitflags 2.10.0", - "hashbrown", + "bitflags 2.11.0", + "hashbrown 0.16.1", "indoc", "instability", - "itertools 0.14.0", + "itertools", "line-clipping", "ratatui-core", "strum", "time", "unicode-segmentation", - "unicode-width", + "unicode-width 0.2.2", ] [[package]] @@ -2290,14 +2461,14 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -2307,9 +2478,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -2318,15 +2489,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc_version" @@ -2339,11 +2510,11 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys", @@ -2358,19 +2529,29 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "sachy-config" +version = "0.1.0" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core#ee60e727e6d412cd13009809eb08f51a9b441b44" +dependencies = [ + "base64ct", + "miette", + "toml_edit 0.25.4+spec-1.1.0", +] [[package]] name = "sachy-fmt" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core#07539b3e060d72b69d4c5fef8db61a10dc20541d" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core#ee60e727e6d412cd13009809eb08f51a9b441b44" [[package]] name = "sachy-mdns" version = "0.1.0" -source = "git+https://tangled.org/sachy.dev/sachy-embed-core#07539b3e060d72b69d4c5fef8db61a10dc20541d" +source = "git+https://tangled.org/sachy.dev/sachy-embed-core#ee60e727e6d412cd13009809eb08f51a9b441b44" dependencies = [ "sachy-fmt", "winnow", @@ -2385,12 +2566,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -2430,7 +2605,20 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", ] [[package]] @@ -2492,15 +2680,15 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slotmap" @@ -2526,14 +2714,28 @@ dependencies = [ "serde", ] +[[package]] +name = "snow" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599b506ccc4aff8cf7844bc42cf783009a434c1e26c964432560fb6d6ad02d82" +dependencies = [ + "blake2", + "chacha20poly1305", + "curve25519-dalek", + "getrandom 0.3.4", + "rustc_version", + "subtle", +] + [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -2565,6 +2767,7 @@ dependencies = [ "async-io", "bevy", "bevy_ratatui", + "bytes", "color-eyre", "crossterm", "futures-concurrency", @@ -2572,8 +2775,10 @@ dependencies = [ "postcard", "rapidhash", "ratatui", + "sachy-config", "sachy-mdns", "serde", + "snow", "socket2", "striker-proto", ] @@ -2610,9 +2815,36 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "supports-color" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" +dependencies = [ + "is_ci", ] +[[package]] +name = "supports-hyperlinks" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e396b6523b11ccb83120b115a0b7366de372751aa6edf19844dfb13a6af97e91" + +[[package]] +name = "supports-unicode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" + [[package]] name = "syn" version = "1.0.109" @@ -2626,15 +2858,25 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.114" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "terminal_size" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" +dependencies = [ + "rustix", + "windows-sys 0.60.2", +] + [[package]] name = "terminfo" version = "0.9.0" @@ -2664,7 +2906,7 @@ checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7" dependencies = [ "anyhow", "base64", - "bitflags 2.10.0", + "bitflags 2.11.0", "fancy-regex", "filedescriptor", "finl_unicode", @@ -2698,6 +2940,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "unicode-linebreak", + "unicode-width 0.2.2", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -2709,11 +2961,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -2724,18 +2976,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2749,24 +3001,24 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "libc", "num-conv", "num_threads", "powerfmt", - "serde", + "serde_core", "time-core", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "toml_datetime" @@ -2777,6 +3029,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_datetime" +version = "1.0.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.23.10+spec-1.0.0" @@ -2784,20 +3045,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ "indexmap", - "toml_datetime", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.25.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +dependencies = [ + "indexmap", + "toml_datetime 1.0.0+spec-1.1.0", "toml_parser", + "toml_writer", "winnow", ] [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.0.9+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" dependencies = [ "winnow", ] +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + [[package]] name = "tracing" version = "0.1.44" @@ -2817,7 +3097,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2865,9 +3145,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -2912,9 +3192,15 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-segmentation" @@ -2924,15 +3210,21 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-truncate" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fbf03860ff438702f3910ca5f28f8dac63c1c11e7efb5012b8b175493606330" +checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" dependencies = [ - "itertools 0.13.0", + "itertools", "unicode-segmentation", - "unicode-width", + "unicode-width 0.2.2", ] +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "unicode-width" version = "0.2.2" @@ -2945,6 +3237,16 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "utf8parse" version = "0.2.2" @@ -2953,12 +3255,12 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.19.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" dependencies = [ "atomic", - "getrandom", + "getrandom 0.4.2", "js-sys", "serde_core", "wasm-bindgen", @@ -2978,7 +3280,7 @@ checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3014,18 +3316,27 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -3036,11 +3347,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.56" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -3049,9 +3361,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.106" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3059,31 +3371,65 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.106" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.106" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "web-sys" -version = "0.3.83" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -3115,7 +3461,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "692daff6d93d94e29e4114544ef6d5c942a7ed998b37abdc19b17136ea428eb7" dependencies = [ - "getrandom", + "getrandom 0.3.4", "mac_address", "sha2", "thiserror 1.0.69", @@ -3177,12 +3523,12 @@ version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "bytemuck", "js-sys", "log", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "web-sys", ] @@ -3223,15 +3569,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -3383,35 +3720,129 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index 1323ba6..477e88c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ repository.workspace = true license.workspace = true [dependencies] +bytes = "1.11.1" color-eyre = "0.6.5" crossterm = "0.29.0" ratatui = { version = "0.30.0", features = [ @@ -46,6 +47,15 @@ sachy-mdns = { git = "https://tangled.org/sachy.dev/sachy-embed-core", package = serde.workspace = true postcard.workspace = true jiff = "0.2.18" +snow = { version = "0.10", default-features = false, features = [ + "use-curve25519", + "use-chacha20poly1305", + "use-blake2", + "use-getrandom", +] } + +[build-dependencies] +sachy-config = { git = "https://tangled.org/sachy.dev/sachy-embed-core", package = "sachy-config" } [lib] path = "src/lib.rs" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..501f6aa --- /dev/null +++ b/build.rs @@ -0,0 +1,20 @@ +use std::{io::BufWriter, path::PathBuf}; + +fn main() { + let out = &PathBuf::from(std::env::var_os("OUT_DIR").unwrap()); + + let config = include_str!("striker-config.toml"); + + let out_file = out.join("constants.rs"); + + let mut writer = BufWriter::new( + std::fs::OpenOptions::new() + .create(true) + .truncate(true) + .write(true) + .open(out_file) + .unwrap(), + ); + + sachy_config::output_config(config, &mut writer).unwrap(); +} diff --git a/src/device.rs b/src/device.rs index 38ecf0e..817a05d 100644 --- a/src/device.rs +++ b/src/device.rs @@ -1,144 +1,17 @@ -use core::net::IpAddr; +mod components; +mod home; +mod monitoring; +mod resources; +mod setup; -use bevy::{ - app::{Plugin, Update}, - ecs::{ - component::Component, - entity::Entity, - lifecycle::HookContext, - name::Name, - resource::Resource, - system::{Commands, Res, ResMut}, - world::DeferredWorld, - }, - prelude::Deref, -}; -use rapidhash::RapidHashSet; -use ratatui::{ - style::{Color, Stylize}, - text::{Line, Span, Text, ToSpan}, - widgets::{Block, Padding, Paragraph, Widget}, -}; - -use crate::net::DiscoverResponse; - -#[derive(Debug, Resource, Default)] -pub struct UniqueDevices(pub RapidHashSet); - -#[derive(Debug, Component)] -pub struct Device; - -#[derive(Debug, Clone, Component, Hash, PartialEq, Eq)] -#[component(immutable, on_remove = on_remove_device)] -pub struct DeviceSocket { - pub address: String, - pub port: u16, - pub ip: IpAddr, -} - -#[derive(Debug, Component, Default, Clone, Copy)] -pub struct DeviceDetector { - pub blip_threshold: u16, - pub blip_size: usize, -} - -impl Widget for DeviceDetector { - fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer) - where - Self: Sized, - { - let detector_lines = [ - Line::from_iter([Span::raw("Threshold: "), self.blip_threshold.to_span()]), - Line::from_iter([Span::raw("Blip Size: "), self.blip_size.to_span()]), - ]; - - let detector_info = Paragraph::new(Text::from_iter(detector_lines)) - .block( - Block::bordered() - .title("Settings") - .padding(Padding::horizontal(1)) - .border_style(Color::LightGreen), - ) - .white(); - - detector_info.render(area, buf); - } -} - -fn on_remove_device(mut world: DeferredWorld, context: HookContext) { - let component = world - .entity(context.entity) - .get::() - .cloned() - .unwrap(); - let mut devices = world.resource_mut::(); - - devices.0.remove(&component); -} - -#[derive(Debug, Component)] -#[component(immutable)] -pub struct StormLevel(pub u16); - -#[derive(Debug, Component, Deref)] -#[component(immutable)] -pub struct Timestamp(pub jiff::Timestamp); - -impl Timestamp { - pub fn from_microseconds(stamp: i64) -> Result { - jiff::Timestamp::from_microsecond(stamp).map(Self) - } -} - -#[derive(Debug, Component, Deref)] -#[component(immutable)] -pub struct StormSignal(Vec); - -impl StormSignal { - pub fn new(value: Vec) -> Self { - Self(value) - } -} - -#[derive(Debug, Component, Deref)] -#[component(immutable)] -pub struct SignalAverage(pub u16); - -impl SignalAverage { - pub fn new(value: u16) -> Self { - Self(value) - } -} - -#[derive(Debug, Component, Deref)] -#[component(immutable)] -pub struct SignalPeaks(Vec<(usize, u16)>); - -impl SignalPeaks { - pub fn new(value: Vec<(usize, u16)>) -> Self { - Self(value) - } -} - -#[derive(Debug, Component)] -#[relationship(relationship_target = Signals)] -pub struct SignalSource(pub Entity); - -#[derive(Component, Debug, Deref)] -#[relationship_target(relationship = SignalSource, linked_spawn)] -pub struct Signals { - signals: Vec, -} +use bevy::{app::Plugin, ecs::event::Event}; -#[derive(Debug, Component)] -#[relationship(relationship_target = StormLevels)] -pub struct StormSource(pub Entity); +use crate::device::{ + home::HomeViewPlugin, monitoring::MonitoringViewPlugin, resources::UniqueDevices, + setup::DevicesSetupPlugin, +}; -#[derive(Component, Debug, Deref)] -#[relationship_target(relationship = StormSource, linked_spawn)] -pub struct StormLevels { - levels: Vec, -} +pub use crate::{device::components::*, device::resources::ConnectedDevice}; #[derive(Debug)] pub enum ConnectionState { @@ -157,43 +30,18 @@ impl core::fmt::Display for ConnectionState { } } -#[derive(Debug, Resource)] -pub struct ConnectedDevice { - pub device: Entity, - pub connection_state: ConnectionState, -} - -fn register_devices( - incoming: Res, - mut unique: ResMut, - mut commands: Commands, -) { - let mut devices = Vec::new(); - - while let Ok(discovered) = incoming.0.try_recv() { - let device_addr = DeviceSocket { - address: discovered.address, - port: discovered.port, - ip: discovered.ip, - }; - - if !unique.0.contains(&device_addr) { - unique.0.insert(device_addr.clone()); - devices.push((Device, Name::new(discovered.host), device_addr)); - } - } - - if !devices.is_empty() { - commands.spawn_batch(devices); - } -} +#[derive(Debug, Event)] +pub struct FindDevices; #[derive(Debug)] pub struct DevicePlugin; impl Plugin for DevicePlugin { fn build(&self, app: &mut bevy::app::App) { - app.init_resource::() - .add_systems(Update, register_devices); + app.init_resource::().add_plugins(( + DevicesSetupPlugin, + HomeViewPlugin, + MonitoringViewPlugin, + )); } } diff --git a/src/device/components.rs b/src/device/components.rs new file mode 100644 index 0000000..1a985af --- /dev/null +++ b/src/device/components.rs @@ -0,0 +1,129 @@ +use core::net::IpAddr; + +use bevy::{ + ecs::{component::Component, entity::Entity, lifecycle::HookContext, world::DeferredWorld}, + prelude::Deref, +}; +use ratatui::{ + style::{Color, Stylize}, + text::{Line, Span, Text, ToSpan}, + widgets::{Block, Padding, Paragraph, Widget}, +}; + +use crate::device::resources::UniqueDevices; + +#[derive(Debug, Component)] +pub struct Device; + +#[derive(Debug, Clone, Component, Hash, PartialEq, Eq)] +#[component(immutable, on_remove = on_remove_device)] +pub struct DeviceSocket { + pub address: String, + pub port: u16, + pub ip: IpAddr, + pub encryption: String, +} + +#[derive(Debug, Component, Default, Clone, Copy)] +pub struct DeviceDetector { + pub blip_threshold: u16, + pub blip_size: usize, +} + +impl Widget for DeviceDetector { + fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer) + where + Self: Sized, + { + let detector_lines = [ + Line::from_iter([Span::raw("Threshold: "), self.blip_threshold.to_span()]), + Line::from_iter([Span::raw("Blip Size: "), self.blip_size.to_span()]), + ]; + + let detector_info = Paragraph::new(Text::from_iter(detector_lines)) + .block( + Block::bordered() + .title("Settings") + .padding(Padding::horizontal(1)) + .border_style(Color::LightGreen), + ) + .white(); + + detector_info.render(area, buf); + } +} + +fn on_remove_device(mut world: DeferredWorld, context: HookContext) { + let component = world + .entity(context.entity) + .get::() + .cloned() + .unwrap(); + let mut devices = world.resource_mut::(); + + devices.0.remove(&component); +} + +#[derive(Debug, Component)] +#[component(immutable)] +pub struct StormLevel(pub u16); + +#[derive(Debug, Component, Deref)] +#[component(immutable)] +pub struct Timestamp(pub jiff::Timestamp); + +impl Timestamp { + pub fn from_microseconds(stamp: i64) -> Result { + jiff::Timestamp::from_microsecond(stamp).map(Self) + } +} + +#[derive(Debug, Component, Deref)] +#[component(immutable)] +pub struct StormSignal(Vec); + +impl StormSignal { + pub fn new(value: Vec) -> Self { + Self(value) + } +} + +#[derive(Debug, Component, Deref)] +#[component(immutable)] +pub struct SignalAverage(pub u16); + +impl SignalAverage { + pub fn new(value: u16) -> Self { + Self(value) + } +} + +#[derive(Debug, Component, Deref)] +#[component(immutable)] +pub struct SignalPeaks(Vec<(usize, u16)>); + +impl SignalPeaks { + pub fn new(value: Vec<(usize, u16)>) -> Self { + Self(value) + } +} + +#[derive(Debug, Component)] +#[relationship(relationship_target = Signals)] +pub struct SignalSource(pub Entity); + +#[derive(Component, Debug, Deref)] +#[relationship_target(relationship = SignalSource, linked_spawn)] +pub struct Signals { + signals: Vec, +} + +#[derive(Debug, Component)] +#[relationship(relationship_target = StormLevels)] +pub struct StormSource(pub Entity); + +#[derive(Component, Debug, Deref)] +#[relationship_target(relationship = StormSource, linked_spawn)] +pub struct StormLevels { + levels: Vec, +} diff --git a/src/views/home.rs b/src/device/home.rs similarity index 88% rename from src/views/home.rs rename to src/device/home.rs index a0ede41..8756f45 100644 --- a/src/views/home.rs +++ b/src/device/home.rs @@ -1,4 +1,5 @@ use bevy::{ + app::{Plugin, PostUpdate}, ecs::{ entity::Entity, error::Result, @@ -6,10 +7,14 @@ use bevy::{ name::Name, query::With, resource::Resource, + schedule::IntoScheduleConfigs, system::{Commands, Query, Res, ResMut}, world::World, }, - state::state::NextState, + state::{ + condition::in_state, + state::{NextState, OnEnter, OnExit}, + }, time::{Real, Time, Timer}, }; use bevy_ratatui::RatatuiContext; @@ -20,9 +25,8 @@ use ratatui::{ }; use crate::{ - device::{ConnectedDevice, ConnectionState, Device, DeviceSocket}, + device::{ConnectedDevice, ConnectionState, Device, DeviceSocket, FindDevices}, messages::StrikeMessage, - net::MdnsSignaler, state::AppState, }; @@ -45,7 +49,6 @@ pub fn cleanup_home_view(mut commands: Commands) { } pub fn home_message_handler( - signal: Res, mut list_state: ResMut, mut is_searching: ResMut, mut strike_reader: MessageReader, @@ -60,7 +63,7 @@ pub fn home_message_handler( is_searching.searching = Some(Timer::from_seconds(1.0, bevy::time::TimerMode::Once)); } - let _ = signal.0.try_send(()); + commands.trigger(FindDevices); } StrikeMessage::NextDevice if is_searching.searching.is_none() => { list_state.0.select_next(); @@ -165,3 +168,18 @@ pub fn search_timer(mut is_searching: ResMut, time: Res { chart.render(area, buf); } } + +pub struct MonitoringViewPlugin; + +impl Plugin for MonitoringViewPlugin { + fn build(&self, app: &mut bevy::app::App) { + app.add_systems(OnEnter(AppState::Monitoring), enter_monitoring) + .add_systems(OnExit(AppState::Monitoring), exit_monitoring) + .add_systems( + PostUpdate, + ( + monitoring_message_handler, + (update_device_data, clear_device_data), + monitoring_view, + ) + .chain() + .run_if(in_state(AppState::Monitoring)), + ); + } +} diff --git a/src/device/resources.rs b/src/device/resources.rs new file mode 100644 index 0000000..cbbf6e2 --- /dev/null +++ b/src/device/resources.rs @@ -0,0 +1,18 @@ +use async_channel::Receiver; +use bevy::ecs::{entity::Entity, resource::Resource}; +use bytes::Bytes; +use rapidhash::RapidHashSet; + +use crate::device::{ConnectionState, DeviceSocket}; + +#[derive(Debug, Resource, Default)] +pub struct UniqueDevices(pub RapidHashSet); + +#[derive(Debug, Resource)] +pub struct DiscoverResponse(pub Receiver); + +#[derive(Debug, Resource)] +pub struct ConnectedDevice { + pub device: Entity, + pub connection_state: ConnectionState, +} diff --git a/src/device/setup.rs b/src/device/setup.rs new file mode 100644 index 0000000..fb0b8b7 --- /dev/null +++ b/src/device/setup.rs @@ -0,0 +1,223 @@ +use core::{ + net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4}, + time::Duration, +}; +use std::net::UdpSocket; + +use async_channel::{Sender, TryRecvError}; +use async_io::{Async, Timer}; +use bevy::{ + app::{Plugin, PreUpdate, Startup}, + ecs::{ + error::Result, + name::Name, + observer::On, + resource::Resource, + system::{Commands, Res, ResMut}, + }, + tasks::IoTaskPool, +}; +use bytes::Bytes; +use futures_concurrency::future::Race; +use sachy_mdns::{ + GROUP_SOCK_V4, MDNS_PORT, + client::query_service, + dns::{ + label::Label, + records::{QType, Record, SRV}, + reqres::Response, + traits::DnsParse, + }, +}; +use socket2::{Domain, Protocol, Socket, Type}; + +use crate::device::{ + Device, DeviceSocket, FindDevices, + resources::{DiscoverResponse, UniqueDevices}, +}; + +fn register_devices( + incoming: Option>, + mut unique: ResMut, + mut commands: Commands, +) { + if let Some(incoming) = incoming { + let mut devices = Vec::new(); + + loop { + match incoming.0.try_recv() { + Ok(discovered) => { + if let Ok(discovered) = Response::parse(&mut &discovered[..], &discovered) + && let Some(instance) = build_device_instance(&discovered) + { + let device_addr = DeviceSocket { + address: instance.srv.target.to_string(), + port: instance.srv.port, + ip: instance.ip, + encryption: instance.encryption.to_string(), + }; + + if !unique.0.contains(&device_addr) { + unique.0.insert(device_addr.clone()); + devices.push(( + Device, + Name::new(instance.host.to_string()), + device_addr, + )); + } + } + } + Err(TryRecvError::Closed) => { + commands.remove_resource::(); + break; + } + Err(TryRecvError::Empty) => break, + } + } + + if !devices.is_empty() { + commands.spawn_batch(devices); + } + } +} + +struct InstanceDetails<'a> { + host: Label<'a>, + srv: &'a SRV<'a>, + ip: IpAddr, + encryption: &'a str, +} + +#[derive(Debug, Default)] +struct InstanceBuilder<'a> { + name: Option>, + srv: Option<&'a SRV<'a>>, + txt: Option<&'a str>, + ip: Option, +} + +fn build_device_instance<'a>(resp: &'a Response<'a>) -> Option> { + if resp + .answers + .iter() + .any(|answer| answer.atype == QType::PTR && answer.name == "_picostrike._tcp.local") + { + let builder = + resp.additional + .iter() + .fold(InstanceBuilder::default(), |mut instance, answer| { + match &answer.record { + Record::A(a) if instance.ip.is_none() => { + instance.ip.replace(IpAddr::V4(a.address)); + } + Record::AAAA(aaaa) if instance.ip.is_none() => { + instance.ip.replace(IpAddr::V6(aaaa.address)); + } + Record::SRV(srv) => { + instance.name.replace(answer.name); + instance.srv.replace(srv); + } + Record::TXT(txt) => { + instance.txt = txt.text.first().copied(); + } + _ => {} + } + + instance + }); + + if let InstanceBuilder { + name: Some(name), + srv: Some(srv), + txt: Some(txt), + ip: Some(ip), + } = builder + { + return Some(InstanceDetails { + host: name, + srv, + ip, + encryption: txt, + }); + } + } + + None +} + +fn on_find_devices(_trigger: On, signal: Res, mut commands: Commands) { + let (resp_tx, resp_rx) = async_channel::bounded(64); + + signal.0.send_blocking(resp_tx).ok(); + + commands.insert_resource(DiscoverResponse(resp_rx)); +} + +#[derive(Debug, Resource)] +struct MdnsSignaler(pub Sender>); + +fn create_mdns_socket() -> std::io::Result> { + let sock = Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?; + sock.set_reuse_address(true)?; + sock.set_nonblocking(true)?; + sock.bind(&SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, MDNS_PORT)).into())?; + let udp_socket = UdpSocket::from(sock); + Async::new_nonblocking(udp_socket) +} + +pub fn setup_mdns_task(mut commands: Commands) -> Result { + let io = IoTaskPool::get(); + + let (signal_tx, signal_rx) = async_channel::bounded::>(1); + + let udp_socket = create_mdns_socket()?; + + io.spawn(async move { + let mut buf = vec![0u8; 1028]; + let mut query_buf = vec![0u8; 128]; + let query = query_service("_picostrike._tcp.local", &mut query_buf).unwrap(); + + while let Ok(resp_tx) = signal_rx.recv().await { + let send_fut = async { + // Retry three times in case packets get lost coz UDP things + for _ in 0..3 { + udp_socket.send_to(query, GROUP_SOCK_V4).await.ok(); + Timer::after(Duration::from_millis(250)).await; + } + }; + + let recv_fut = async { + while let Ok((read, _)) = udp_socket.recv_from(&mut buf).await { + let input = Bytes::copy_from_slice(&buf[..read]); + + if resp_tx.send(input).await.is_err() { + break; + } + } + }; + + let timer = async { + Timer::after(Duration::from_millis(1000)).await; + resp_tx.close(); + }; + + (send_fut, recv_fut, timer, resp_tx.closed()).race().await; + } + }) + .detach(); + + commands.insert_resource(MdnsSignaler(signal_tx)); + + Ok(()) +} + +pub struct DevicesSetupPlugin; + +impl Plugin for DevicesSetupPlugin { + fn build(&self, app: &mut bevy::app::App) { + app.init_resource::() + .add_systems(Startup, setup_mdns_task) + .add_systems(PreUpdate, register_devices) + .add_observer(on_find_devices); + } +} diff --git a/src/lib.rs b/src/lib.rs index 2898289..2e6f946 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,10 @@ mod device; mod messages; mod net; mod state; -mod views; + +mod constants { + include!(concat!(env!("OUT_DIR"), "/constants.rs")); +} use bevy::{ app::{AppExit, Plugin, PreUpdate}, @@ -21,7 +24,6 @@ use crate::{ messages::StrikeMessage, net::NetPlugin, state::AppState, - views::{HomeViewPlugin, MonitoringViewPlugin}, }; #[derive(Debug)] @@ -34,8 +36,6 @@ impl Plugin for StrikerPlugin { .add_plugins(( NetPlugin, DevicePlugin, - HomeViewPlugin, - MonitoringViewPlugin, )) .add_systems(PreUpdate, keybinds); } diff --git a/src/net.rs b/src/net.rs index 0458644..d1827e7 100644 --- a/src/net.rs +++ b/src/net.rs @@ -1,7 +1,7 @@ -use core::net::IpAddr; use std::{ io::{Read, Write}, - net::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpStream, UdpSocket}, + net::{SocketAddr, TcpStream}, + sync::{Arc, LazyLock, Mutex, OnceLock}, time::Duration, }; @@ -9,23 +9,17 @@ use async_channel::{Receiver, Sender}; use async_io::{Async, Timer}; use bevy::{ app::{Plugin, Startup}, - ecs::{error::Result, resource::Resource, system::Commands}, + ecs::{resource::Resource, system::Commands}, tasks::IoTaskPool, }; use futures_concurrency::future::Race; -use sachy_mdns::{ - GROUP_SOCK_V4, MDNS_PORT, - client::query_service, - dns::{ - records::{QType, Record}, - reqres::Response, - traits::DnsParse, - }, -}; -use socket2::{Domain, Protocol, Socket, Type}; +use snow::{Builder, TransportState, params::NoiseParams}; -#[derive(Debug, Resource)] -pub struct DiscoverResponse(pub Receiver); +use crate::constants::NOISE_PSK; + +static PARAMS: LazyLock = + LazyLock::new(|| "Noise_XXpsk3_25519_ChaChaPoly_BLAKE2s".parse().unwrap()); +static LOCAL_PRIVATE_KEY: OnceLock = OnceLock::new(); pub enum StrikeUpdateState { Disconnected, @@ -48,101 +42,6 @@ pub enum StrikeAction { Disconnect, } -pub struct InstanceDetails { - pub host: String, - pub address: String, - pub port: u16, - pub ip: IpAddr, -} - -#[derive(Debug, Resource)] -pub struct MdnsSignaler(pub Sender<()>); - -fn create_mdns_socket() -> std::io::Result> { - let sock = Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?; - sock.set_reuse_address(true)?; - sock.set_nonblocking(true)?; - sock.bind(&SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, MDNS_PORT)).into())?; - let udp_socket = UdpSocket::from(sock); - Async::new_nonblocking(udp_socket) -} - -pub fn setup_mdns_task(mut commands: Commands) -> Result { - let io = IoTaskPool::get(); - - let (signal_tx, signal_rx) = async_channel::bounded(1); - let (resp_tx, resp_rx) = async_channel::bounded(64); - - let udp_socket = create_mdns_socket()?; - - io.spawn(async move { - let mut buf = vec![0u8; 1028]; - let mut query_buf = vec![0u8; 128]; - let query = query_service("_picostrike._tcp.local", &mut query_buf).unwrap(); - - while signal_rx.recv().await.is_ok() { - let send_fut = async { - // Retry three times in case packets get lost coz UDP things - for _ in 0..3 { - udp_socket.send_to(query, GROUP_SOCK_V4).await.ok(); - Timer::after(Duration::from_millis(250)).await; - } - }; - - let recv_fut = async { - while let Ok((read, _)) = udp_socket.recv_from(&mut buf).await { - let input = &buf[..read]; - let Ok(resp) = Response::parse(&mut &*input, input) else { - continue; - }; - - if resp.answers.iter().any(|answer| { - answer.atype == QType::PTR && answer.name == "_picostrike._tcp.local" - }) && let Some(ip) = resp.additional.iter().find_map(|answer| match &answer - .record - { - Record::A(a) => Some(IpAddr::V4(a.address)), - Record::AAAA(aaaa) => Some(IpAddr::V6(aaaa.address)), - _ => None, - }) && let Some((name, srv)) = resp.additional.iter().find_map(|answer| { - if let Record::SRV(srv) = &answer.record { - Some((answer.name, srv)) - } else { - None - } - }) { - resp_tx - .send(InstanceDetails { - host: name.to_string(), - address: srv.target.to_string(), - port: srv.port, - ip, - }) - .await - .ok(); - } - } - }; - - let timer = async { - Timer::after(Duration::from_millis(1000)).await; - }; - - let cancel = async { - signal_rx.recv().await.ok(); - }; - - (send_fut, recv_fut, timer, cancel).race().await; - } - }) - .detach(); - - commands.insert_resource(DiscoverResponse(resp_rx)); - commands.insert_resource(MdnsSignaler(signal_tx)); - - Ok(()) -} - pub fn setup_strike_connection(mut commands: Commands) { let io = IoTaskPool::get(); @@ -152,6 +51,7 @@ pub fn setup_strike_connection(mut commands: Commands) { io.spawn(async move { let mut read_buf = vec![0u8; 4096]; + let mut enc_buf = vec![0u8; 4096]; let mut write_buf = vec![0u8; 4096]; while let Ok(StrikeAction::Connect(addr)) = signal_rx.recv().await { @@ -166,14 +66,27 @@ pub fn setup_strike_connection(mut commands: Commands) { resp_tx.send(StrikeUpdateState::Connected).await.ok(); stream.write_with(|s| s.set_nodelay(true)).await.ok(); - let read_fut = async { - while let Ok(read) = stream.read_with(|mut a| a.read(&mut read_buf)).await { - let Ok(data) = striker_proto::receive_response(&mut read_buf[..read]) - else { - continue; - }; + let Ok(transport) = noise_handshake(&stream).await else { + resp_tx.send(StrikeUpdateState::Disconnected).await.ok(); + continue; + }; - if resp_tx.send(StrikeUpdateState::Updating(data)).await.is_err() { + let transport_access = Arc::new(Mutex::new(transport)); + + let read_fut = async { + while let Ok(buh) = recv(&stream).await { + if let Ok(decrypted) = { + transport_access + .lock() + .unwrap() + .read_message(&buh, &mut read_buf) + } && let Ok(data) = + striker_proto::receive_response(&mut read_buf[..decrypted]) + && resp_tx + .send(StrikeUpdateState::Updating(data)) + .await + .is_err() + { break; } } @@ -181,14 +94,17 @@ pub fn setup_strike_connection(mut commands: Commands) { let write_fut = async { while let Ok(req) = req_rx.recv().await { - let Ok(payload) = striker_proto::send_request(req, &mut write_buf) - else { - continue; - }; - - if stream.write_with(|mut s| s.write(payload)).await.is_err() { + if let Ok(payload) = striker_proto::send_request(req, &mut write_buf) + && let Ok(encrypted) = { + transport_access + .lock() + .unwrap() + .write_message(payload, &mut enc_buf) + } + && send(&stream, &enc_buf[..encrypted]).await.is_err() + { break; - } + }; } }; @@ -227,6 +143,61 @@ pub struct NetPlugin; impl Plugin for NetPlugin { fn build(&self, app: &mut bevy::app::App) { - app.add_systems(Startup, (setup_mdns_task, setup_strike_connection)); + app.add_systems(Startup, setup_strike_connection); } } + +async fn noise_handshake(tcp: &Async) -> color_eyre::Result { + let builder = Builder::new(PARAMS.clone()); + let static_key = LOCAL_PRIVATE_KEY.get_or_init(|| builder.generate_keypair().unwrap()); + + let mut noise = builder + .local_private_key(&static_key.private)? + .psk(3, &NOISE_PSK)? + .build_initiator()?; + + let mut payload = vec![0u8; 2048]; + + // -> e + let len = noise.write_message(&[], &mut payload)?; + + send(tcp, &payload[..len]).await?; + + // <- e, ee, s, es + noise.read_message(&recv(tcp).await?, &mut payload)?; + + // -> s, se + let len = noise.write_message(&[], &mut payload)?; + + send(tcp, &payload[..len]).await?; + + let transport = noise.into_transport_mode()?; + + Ok(transport) +} + +async fn recv(stream: &Async) -> std::io::Result> { + let mut msg_len_buf = [0_u8; 2]; + + stream + .read_with(|mut stream| { + stream.read_exact(&mut msg_len_buf)?; + let msg_len = usize::from(u16::from_be_bytes(msg_len_buf)); + let mut msg = vec![0_u8; msg_len]; + stream.read_exact(&mut msg[..])?; + + Ok(msg) + }) + .await +} + +/// Hyper-basic stream transport sender. 16-bit BE size followed by payload. +async fn send(stream: &Async, buf: &[u8]) -> std::io::Result<()> { + stream + .write_with(|mut stream| { + let len = u16::try_from(buf.len()).expect("message too large"); + stream.write_all(&len.to_be_bytes())?; + stream.write_all(buf) + }) + .await +} diff --git a/src/views.rs b/src/views.rs deleted file mode 100644 index bfa340e..0000000 --- a/src/views.rs +++ /dev/null @@ -1,54 +0,0 @@ -use bevy::{ - app::{Plugin, PostUpdate}, - ecs::schedule::IntoScheduleConfigs, - state::{ - condition::in_state, - state::{OnEnter, OnExit}, - }, -}; - -use crate::state::AppState; - -pub mod home; -pub mod monitoring; - -pub struct HomeViewPlugin; - -impl Plugin for HomeViewPlugin { - fn build(&self, app: &mut bevy::app::App) { - app.add_systems(OnEnter(AppState::Home), home::setup_home_view) - .add_systems(OnExit(AppState::Home), home::cleanup_home_view) - .add_systems( - PostUpdate, - ( - home::search_timer, - home::home_message_handler, - home::home_view, - ) - .chain() - .run_if(in_state(AppState::Home)), - ); - } -} - -pub struct MonitoringViewPlugin; - -impl Plugin for MonitoringViewPlugin { - fn build(&self, app: &mut bevy::app::App) { - app.add_systems(OnEnter(AppState::Monitoring), monitoring::enter_monitoring) - .add_systems(OnExit(AppState::Monitoring), monitoring::exit_monitoring) - .add_systems( - PostUpdate, - ( - monitoring::monitoring_message_handler, - ( - monitoring::update_device_data, - monitoring::clear_device_data, - ), - monitoring::monitoring_view, - ) - .chain() - .run_if(in_state(AppState::Monitoring)), - ); - } -} diff --git a/striker-config.example.toml b/striker-config.example.toml new file mode 100644 index 0000000..cd3e92e --- /dev/null +++ b/striker-config.example.toml @@ -0,0 +1,2 @@ +[statics] +NOISE_PSK = { kind = "bytes", value = "FwDnM8ikl63kopPSMm9dvz8NljGVoJWNR2ue7YWs45A=" }