diff --git a/framed-messages/Cargo.toml b/framed-messages/Cargo.toml deleted file mode 100644 index 460514e..0000000 --- a/framed-messages/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "framed-messages" -version = "0.1.0" -edition = "2024" - -[dependencies] -anyhow = "1.0.98" -bytes = "1.10.1" -futures-util = { version = "0.3.31", features = ["sink"] } -iroh = "0.91.0" -iroh-metrics = "0.35.0" -n0-snafu = "0.2.1" -n0-watcher = "0.2.0" -postcard = "1.1.2" -serde = { version = "1.0.219", features = ["derive"] } -tokio = { version = "1.46.1", features = ["full"] } -tokio-util = { version = "0.7.15", features = ["codec"] } diff --git a/webrtc-chat/.cargo/config.toml b/webrtc-chat/.cargo/config.toml new file mode 100644 index 0000000..2e07606 --- /dev/null +++ b/webrtc-chat/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.wasm32-unknown-unknown] +rustflags = ['--cfg', 'getrandom_backend="wasm_js"'] diff --git a/webrtc-chat/.gitignore b/webrtc-chat/.gitignore new file mode 100644 index 0000000..f589403 --- /dev/null +++ b/webrtc-chat/.gitignore @@ -0,0 +1,3 @@ +/public/wasm +/package-lock.json +/node_modules diff --git a/framed-messages/Cargo.lock b/webrtc-chat/Cargo.lock similarity index 76% rename from framed-messages/Cargo.lock rename to webrtc-chat/Cargo.lock index 5463b74..d508028 100644 --- a/framed-messages/Cargo.lock +++ b/webrtc-chat/Cargo.lock @@ -28,6 +28,31 @@ dependencies = [ "generic-array", ] +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -58,15 +83,71 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", +] + [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" dependencies = [ "backtrace", ] +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + [[package]] name = "arrayref" version = "0.3.9" @@ -79,6 +160,57 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "asn1-rs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + [[package]] name = "async-compat" version = "0.2.4" @@ -94,13 +226,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -131,11 +263,12 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "attohttpc" -version = "0.24.1" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" +checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" dependencies = [ - "http 0.2.12", + "base64", + "http", "log", "url", ] @@ -148,9 +281,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backon" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302eaff5357a264a2c42f127ecb8bac761cf99749fc3dc95677e2743991f99e7" +checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" dependencies = [ "fastrand", "gloo-timers", @@ -196,11 +329,26 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" [[package]] name = "blake3" @@ -224,6 +372,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + [[package]] name = "bounded-integer" version = "0.5.8" @@ -254,15 +411,36 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + [[package]] name = "cc" -version = "1.2.29" +version = "1.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" +checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f" dependencies = [ "shlex", ] +[[package]] +name = "ccm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae3c82e4355234767756212c570e29833699ab63e6ffd161887314cc5b43847" +dependencies = [ + "aead", + "cipher", + "ctr", + "subtle", +] + [[package]] name = "cfg-if" version = "1.0.1" @@ -294,8 +472,10 @@ checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", "windows-link", ] @@ -310,13 +490,53 @@ dependencies = [ "zeroize", ] +[[package]] +name = "clap" +version = "4.5.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + [[package]] name = "cobs" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -330,6 +550,21 @@ dependencies = [ "termcolor", ] +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -422,6 +657,18 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -465,6 +712,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -491,7 +747,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -512,6 +768,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + [[package]] name = "der_derive" version = "0.7.3" @@ -520,7 +790,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -558,7 +828,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "unicode-xid", ] @@ -570,7 +840,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "unicode-xid", ] @@ -587,6 +857,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -599,7 +870,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -624,9 +895,23 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] [[package]] name = "ed25519" @@ -641,9 +926,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek", "ed25519", @@ -654,6 +939,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "embedded-io" version = "0.4.0" @@ -675,7 +981,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -695,7 +1001,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -704,6 +1010,27 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -716,6 +1043,16 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "fiat-crypto" version = "0.2.9" @@ -743,23 +1080,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "framed-messages" -version = "0.1.0" -dependencies = [ - "anyhow", - "bytes", - "futures-util", - "iroh", - "iroh-metrics", - "n0-snafu", - "n0-watcher 0.2.0", - "postcard", - "serde", - "tokio", - "tokio-util", -] - [[package]] name = "futures" version = "0.3.31" @@ -777,15 +1097,15 @@ dependencies = [ [[package]] name = "futures-buffered" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe940397c8b744b9c2c974791c2c08bca2c3242ce0290393249e98f215a00472" +checksum = "a8e0e1f38ec07ba4abbde21eed377082f17ccb988be9d988a5adbf4bafc118fd" dependencies = [ "cordyceps", "diatomic-waker", "futures-core", "pin-project-lite", - "spin", + "spin 0.10.0", ] [[package]] @@ -823,9 +1143,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand", "futures-core", @@ -842,7 +1162,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -927,6 +1247,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "gimli" version = "0.31.1" @@ -935,9 +1265,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "gloo-timers" @@ -951,18 +1281,29 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "h2" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.3.1", + "http", "indexmap", "slab", "tokio", @@ -981,9 +1322,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -1000,7 +1341,7 @@ dependencies = [ "hash32", "rustc_version", "serde", - "spin", + "spin 0.9.8", "stable_deref_trait", ] @@ -1032,9 +1373,9 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.9.1", + "rand 0.9.2", "ring", - "thiserror 2.0.12", + "thiserror 2.0.15", "tinyvec", "tokio", "tracing", @@ -1054,21 +1395,30 @@ dependencies = [ "moka", "once_cell", "parking_lot", - "rand 0.9.1", + "rand 0.9.2", "resolv-conf", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", "tokio", "tracing", ] [[package]] -name = "hmac" -version = "0.12.1" +name = "hkdf" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "digest", + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", ] [[package]] @@ -1093,17 +1443,6 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f558a64ac9af88b5ba400d99b579451af0d39c6d360980045b91aac966d705e2" -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.3.1" @@ -1122,7 +1461,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.3.1", + "http", ] [[package]] @@ -1133,7 +1472,7 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.3.1", + "http", "http-body", "pin-project-lite", ] @@ -1152,20 +1491,22 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", - "http 1.3.1", + "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1177,7 +1518,7 @@ version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http 1.3.1", + "http", "hyper", "hyper-util", "rustls", @@ -1185,28 +1526,28 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] name = "hyper-util" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64", "bytes", "futures-channel", "futures-core", "futures-util", - "http 1.3.1", + "http", "http-body", "hyper", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.0", "tokio", "tower-service", "tracing", @@ -1345,20 +1686,20 @@ dependencies = [ [[package]] name = "igd-next" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06464e726471718db9ad3fefc020529fabcde03313a0fc3967510e2db5add12" +checksum = "516893339c97f6011282d5825ac94fc1c7aad5cad26bdc2d0cee068c0bf97f97" dependencies = [ "async-trait", "attohttpc", "bytes", "futures", - "http 1.3.1", + "http", "http-body-util", "hyper", "hyper-util", "log", - "rand 0.9.1", + "rand 0.9.2", "tokio", "url", "xmltree", @@ -1380,6 +1721,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ + "block-padding", "generic-array", ] @@ -1395,13 +1737,33 @@ dependencies = [ "web-sys", ] +[[package]] +name = "interceptor" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac0781c825d602095113772e389ef0607afcb869ae0e68a590d8e0799cdcef8" +dependencies = [ + "async-trait", + "bytes", + "log", + "portable-atomic", + "rand 0.8.5", + "rtcp", + "rtp", + "thiserror 1.0.69", + "tokio", + "waitgroup", + "webrtc-srtp", + "webrtc-util", +] + [[package]] name = "io-uring" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" dependencies = [ - "bitflags", + "bitflags 2.9.2", "cfg-if", "libc", ] @@ -1436,9 +1798,7 @@ dependencies = [ [[package]] name = "iroh" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6a98c47bb5f720edeb77be502a8acd238a3c0755f0b1ad865a716224d794a59" +version = "0.91.2" dependencies = [ "aead", "backon", @@ -1453,7 +1813,7 @@ dependencies = [ "futures-util", "getrandom 0.3.3", "hickory-resolver", - "http 1.3.1", + "http", "igd-next", "instant", "iroh-base", @@ -1462,9 +1822,10 @@ dependencies = [ "iroh-quinn-proto", "iroh-quinn-udp", "iroh-relay", - "n0-future", + "js-sys", + "n0-future 0.1.3", "n0-snafu", - "n0-watcher 0.3.0", + "n0-watcher", "nested_enum_utils", "netdev", "netwatch", @@ -1478,6 +1839,7 @@ dependencies = [ "rustls-pki-types", "rustls-webpki", "serde", + "serde_json", "smallvec", "snafu", "spki", @@ -1490,16 +1852,17 @@ dependencies = [ "tokio-util", "tracing", "url", + "wasm-bindgen", "wasm-bindgen-futures", + "web-sys", "webpki-roots 0.26.11", + "webrtc", "z32", ] [[package]] name = "iroh-base" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bde4e612191173e8ade55e3aa719044514edfff952292ffbf581be35cbb59c" +version = "0.91.2" dependencies = [ "curve25519-dalek", "data-encoding", @@ -1536,7 +1899,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1553,7 +1916,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.10", - "thiserror 2.0.12", + "thiserror 2.0.15", "tokio", "tracing", "web-time", @@ -1573,7 +1936,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.15", "tinyvec", "tracing", "web-time", @@ -1595,9 +1958,7 @@ dependencies = [ [[package]] name = "iroh-relay" -version = "0.91.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f19e43de2cfc04748054e1cbf7854ae1e192ddc45a4adeae7be7076a8f1fd43" +version = "0.91.2" dependencies = [ "blake3", "bytes", @@ -1606,7 +1967,7 @@ dependencies = [ "derive_more 2.0.1", "getrandom 0.3.3", "hickory-resolver", - "http 1.3.1", + "http", "http-body-util", "hyper", "hyper-util", @@ -1615,7 +1976,7 @@ dependencies = [ "iroh-quinn", "iroh-quinn-proto", "lru", - "n0-future", + "n0-future 0.1.3", "n0-snafu", "nested_enum_utils", "num_enum", @@ -1643,6 +2004,12 @@ dependencies = [ "z32", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itoa" version = "1.0.15" @@ -1667,9 +2034,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "litemap" @@ -1679,9 +2046,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" [[package]] name = "lock_api" @@ -1736,6 +2103,16 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "md5" version = "0.7.0" @@ -1748,6 +2125,21 @@ version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1808,6 +2200,27 @@ dependencies = [ "web-time", ] +[[package]] +name = "n0-future" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d7dd42bd0114c9daa9c4f2255d692a73bba45767ec32cf62892af6fe5d31f6" +dependencies = [ + "cfg_aliases", + "derive_more 1.0.0", + "futures-buffered", + "futures-lite", + "futures-util", + "js-sys", + "pin-project", + "send_wrapper", + "tokio", + "tokio-util", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-time", +] + [[package]] name = "n0-snafu" version = "0.2.1" @@ -1821,25 +2234,12 @@ dependencies = [ "tracing-error", ] -[[package]] -name = "n0-watcher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f216d4ebc5fcf9548244803cbb93f488a2ae160feba3706cd17040d69cf7a368" -dependencies = [ - "derive_more 1.0.0", - "n0-future", - "snafu", -] - [[package]] name = "n0-watcher" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31462392a10d5ada4b945e840cbec2d5f3fee752b96c4b33eb41414d8f45c2a" dependencies = [ "derive_more 1.0.0", - "n0-future", + "n0-future 0.1.3", "snafu", ] @@ -1890,7 +2290,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0e7987b28514adf555dc1f9a5c30dfc3e50750bbaffb1aec41ca7b23dcd8e4" dependencies = [ "anyhow", - "bitflags", + "bitflags 2.9.2", "byteorder", "libc", "log", @@ -1905,7 +2305,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56d83370a96813d7c977f8b63054f1162df6e5784f1c598d689236564fb5a6f2" dependencies = [ "anyhow", - "bitflags", + "bitflags 2.9.2", "byteorder", "libc", "log", @@ -1936,7 +2336,7 @@ dependencies = [ "log", "netlink-packet-core", "netlink-sys", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1955,8 +2355,6 @@ dependencies = [ [[package]] name = "netwatch" version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901dbb408894af3df3fc51420ba0c6faf3a7d896077b797c39b7001e2f787bd" dependencies = [ "atomic-waker", "bytes", @@ -1965,8 +2363,8 @@ dependencies = [ "iroh-quinn-udp", "js-sys", "libc", - "n0-future", - "n0-watcher 0.3.0", + "n0-future 0.1.3", + "n0-watcher", "nested_enum_utils", "netdev", "netlink-packet-core", @@ -1987,12 +2385,35 @@ dependencies = [ "wmi", ] +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset", + "pin-utils", +] + [[package]] name = "no-std-net" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "ntimestamp" version = "1.0.0" @@ -2018,12 +2439,31 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2052,7 +2492,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2064,6 +2504,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "oid-registry" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" +dependencies = [ + "asn1-rs", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -2074,6 +2523,12 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "opaque-debug" version = "0.3.1" @@ -2086,6 +2541,30 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + [[package]] name = "parking" version = "2.2.1" @@ -2121,6 +2600,16 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pem" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +dependencies = [ + "base64", + "serde", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -2143,7 +2632,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", - "thiserror 2.0.12", + "thiserror 2.0.15", "ucd-trie", ] @@ -2167,7 +2656,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2207,7 +2696,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2224,9 +2713,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkarr" -version = "3.8.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a50f65a2b97031863fbdff2f085ba832360b4bef3106d1fcff9ab5bf4063fe" +checksum = "5eb1f2f4311bae1da11f930c804c724c9914cf55ae51a9ee0440fc98826984f7" dependencies = [ "async-compat", "base32", @@ -2246,7 +2735,7 @@ dependencies = [ "serde", "sha1_smol", "simple-dns", - "thiserror 2.0.12", + "thiserror 2.0.15", "tokio", "tracing", "url", @@ -2281,7 +2770,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2316,6 +2805,18 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.11.1" @@ -2325,8 +2826,6 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portmapper" version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f1975debe62a70557e42b9ff9466e4890cf9d3d156d296408a711f1c5f642b" dependencies = [ "base64", "bytes", @@ -2340,7 +2839,7 @@ dependencies = [ "nested_enum_utils", "netwatch", "num_enum", - "rand 0.9.1", + "rand 0.9.2", "serde", "smallvec", "snafu", @@ -2355,9 +2854,9 @@ dependencies = [ [[package]] name = "postcard" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1de96e20f51df24ca73cafcc4690e044854d803259db27a00a461cb3b9d17a" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" dependencies = [ "cobs", "embedded-io 0.4.0", @@ -2369,13 +2868,13 @@ dependencies = [ [[package]] name = "postcard-derive" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f049d94cb6dda6938cc8a531d2898e7c08d71c6de63d8e67123cca6cdde2cc" +checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2436,6 +2935,15 @@ dependencies = [ "ucd-parse", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-crate" version = "3.3.0" @@ -2447,9 +2955,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -2468,7 +2976,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.10", - "thiserror 2.0.12", + "thiserror 2.0.15", "tokio", "tracing", "web-time", @@ -2483,13 +2991,13 @@ dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", - "rand 0.9.1", + "rand 0.9.2", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.15", "tinyvec", "tracing", "web-time", @@ -2547,9 +3055,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -2593,13 +3101,27 @@ dependencies = [ "getrandom 0.3.3", ] +[[package]] +name = "rcgen" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "x509-parser", + "yasna", +] + [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags", + "bitflags 2.9.2", ] [[package]] @@ -2654,15 +3176,15 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64", "bytes", "futures-core", "futures-util", - "http 1.3.1", + "http", "http-body", "http-body-util", "hyper", @@ -2690,7 +3212,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] @@ -2699,6 +3221,16 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "ring" version = "0.17.14" @@ -2713,11 +3245,37 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rtcp" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9689528bf3a9eb311fd938d05516dd546412f9ce4fffc8acfc1db27cc3dbf72" +dependencies = [ + "bytes", + "thiserror 1.0.69", + "webrtc-util", +] + +[[package]] +name = "rtp" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c54733451a67d76caf9caa07a7a2cec6871ea9dda92a7847f98063d459200f4b" +dependencies = [ + "bytes", + "memchr", + "portable-atomic", + "rand 0.8.5", + "serde", + "thiserror 1.0.69", + "webrtc-util", +] + [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -2734,11 +3292,20 @@ dependencies = [ "semver", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "log", "once_cell", @@ -2761,9 +3328,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "ring", "rustls-pki-types", @@ -2772,9 +3339,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -2803,6 +3370,32 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sdp" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd277015eada44a0bb810a4b84d3bf6e810573fa62fb442f457edf6a1087a69" +dependencies = [ + "rand 0.8.5", + "substring", + "thiserror 1.0.69", + "url", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "self_cell" version = "1.2.0" @@ -2830,6 +3423,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_bytes" version = "0.11.17" @@ -2847,14 +3451,14 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "itoa", "memchr", @@ -2929,9 +3533,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -2942,6 +3546,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ + "digest", "rand_core 0.6.4", ] @@ -2957,14 +3562,14 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dee851d0e5e7af3721faea1843e8015e820a234f81fda3dea9247e15bac9a86a" dependencies = [ - "bitflags", + "bitflags 2.9.2", ] [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -2973,12 +3578,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] -name = "snafu" -version = "0.8.6" +name = "smol_str" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320b01e011bf8d5d7a4a4a4be966d9160968935849c83b918827f6a435e7f627" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" dependencies = [ - "backtrace", + "serde", +] + +[[package]] +name = "snafu" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320b01e011bf8d5d7a4a4a4be966d9160968935849c83b918827f6a435e7f627" +dependencies = [ + "backtrace", "snafu-derive", ] @@ -2991,7 +3605,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3023,6 +3637,12 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" + [[package]] name = "spki" version = "0.7.3" @@ -3039,6 +3659,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "strum" version = "0.27.2" @@ -3057,7 +3683,26 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", +] + +[[package]] +name = "stun" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dbc2bab375524093c143dc362a03fb6a1fb79e938391cdb21665688f88a088a" +dependencies = [ + "base64", + "crc", + "lazy_static", + "md-5", + "rand 0.8.5", + "ring", + "subtle", + "thiserror 1.0.69", + "tokio", + "url", + "webrtc-util", ] [[package]] @@ -3081,7 +3726,16 @@ dependencies = [ "precis-core", "precis-profiles", "quoted-string-parser", - "rand 0.9.1", + "rand 0.9.2", +] + +[[package]] +name = "substring" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" +dependencies = [ + "autocfg", ] [[package]] @@ -3099,7 +3753,7 @@ dependencies = [ "hex", "parking_lot", "pnet_packet", - "rand 0.9.1", + "rand 0.9.2", "socket2 0.5.10", "thiserror 1.0.69", "tokio", @@ -3119,9 +3773,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -3145,7 +3799,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3154,7 +3808,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", + "bitflags 2.9.2", "core-foundation", "system-configuration-sys", ] @@ -3195,11 +3849,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.15", ] [[package]] @@ -3210,18 +3864,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3240,11 +3894,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", + "itoa", "js-sys", "num-conv", "powerfmt", "serde", "time-core", + "time-macros", ] [[package]] @@ -3253,6 +3909,16 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tinystr" version = "0.8.1" @@ -3280,9 +3946,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -3293,9 +3959,9 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2 0.5.10", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3306,7 +3972,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3333,15 +3999,14 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", "futures-sink", "futures-util", - "hashbrown", "pin-project-lite", "tokio", ] @@ -3357,9 +4022,9 @@ dependencies = [ "futures-core", "futures-sink", "getrandom 0.3.3", - "http 1.3.1", + "http", "httparse", - "rand 0.9.1", + "rand 0.9.2", "ring", "rustls-pki-types", "simdutf8", @@ -3406,10 +4071,10 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags", + "bitflags 2.9.2", "bytes", "futures-util", - "http 1.3.1", + "http", "http-body", "iri-string", "pin-project-lite", @@ -3450,7 +4115,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3508,6 +4173,27 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "turn" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f5aea1116456e1da71c45586b87c72e3b43164fbf435eb93ff6aa475416a9a4" +dependencies = [ + "async-trait", + "base64", + "futures", + "log", + "md-5", + "portable-atomic", + "rand 0.8.5", + "ring", + "stun", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "webrtc-util", +] + [[package]] name = "typenum" version = "1.18.0" @@ -3584,11 +4270,17 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -3607,6 +4299,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "waitgroup" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" +dependencies = [ + "atomic-waker", +] + [[package]] name = "want" version = "0.3.1" @@ -3653,7 +4354,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-shared", ] @@ -3688,7 +4389,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3741,18 +4442,255 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] name = "webpki-roots" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] +[[package]] +name = "webrtc" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24bab7195998d605c862772f90a452ba655b90a2f463c850ac032038890e367a" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "cfg-if", + "hex", + "interceptor", + "lazy_static", + "log", + "portable-atomic", + "rand 0.8.5", + "rcgen", + "regex", + "ring", + "rtcp", + "rtp", + "rustls", + "sdp", + "serde", + "serde_json", + "sha2", + "smol_str", + "stun", + "thiserror 1.0.69", + "time", + "tokio", + "turn", + "url", + "waitgroup", + "webrtc-data", + "webrtc-dtls", + "webrtc-ice", + "webrtc-mdns", + "webrtc-media", + "webrtc-sctp", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "webrtc-chat" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-channel", + "chrono", + "clap", + "futures", + "futures-lite", + "getrandom 0.3.3", + "iroh", + "log", + "n0-future 0.2.0", + "rand 0.9.2", + "serde", + "serde-wasm-bindgen", + "serde_json", + "tokio", + "tokio-stream", + "tracing", + "tracing-subscriber", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", +] + +[[package]] +name = "webrtc-data" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e97b932854da633a767eff0cc805425a2222fc6481e96f463e57b015d949d1d" +dependencies = [ + "bytes", + "log", + "portable-atomic", + "thiserror 1.0.69", + "tokio", + "webrtc-sctp", + "webrtc-util", +] + +[[package]] +name = "webrtc-dtls" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ccbe4d9049390ab52695c3646c1395c877e16c15fb05d3bda8eee0c7351711c" +dependencies = [ + "aes", + "aes-gcm", + "async-trait", + "bincode", + "byteorder", + "cbc", + "ccm", + "der-parser", + "hkdf", + "hmac", + "log", + "p256", + "p384", + "portable-atomic", + "rand 0.8.5", + "rand_core 0.6.4", + "rcgen", + "ring", + "rustls", + "sec1", + "serde", + "sha1", + "sha2", + "subtle", + "thiserror 1.0.69", + "tokio", + "webrtc-util", + "x25519-dalek", + "x509-parser", +] + +[[package]] +name = "webrtc-ice" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb51bde0d790f109a15bfe4d04f1b56fb51d567da231643cb3f21bb74d678997" +dependencies = [ + "arc-swap", + "async-trait", + "crc", + "log", + "portable-atomic", + "rand 0.8.5", + "serde", + "serde_json", + "stun", + "thiserror 1.0.69", + "tokio", + "turn", + "url", + "uuid", + "waitgroup", + "webrtc-mdns", + "webrtc-util", +] + +[[package]] +name = "webrtc-mdns" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "979cc85259c53b7b620803509d10d35e2546fa505d228850cbe3f08765ea6ea8" +dependencies = [ + "log", + "socket2 0.5.10", + "thiserror 1.0.69", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-media" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80041211deccda758a3e19aa93d6b10bc1d37c9183b519054b40a83691d13810" +dependencies = [ + "byteorder", + "bytes", + "rand 0.8.5", + "rtp", + "thiserror 1.0.69", +] + +[[package]] +name = "webrtc-sctp" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07439c134425d51d2f10907aaf2f815fdfb587dce19fe94a4ae8b5faf2aae5ae" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "crc", + "log", + "portable-atomic", + "rand 0.8.5", + "thiserror 1.0.69", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-srtp" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01e773f79b09b057ffbda6b03fe7b43403b012a240cf8d05d630674c3723b5bb" +dependencies = [ + "aead", + "aes", + "aes-gcm", + "byteorder", + "bytes", + "ctr", + "hmac", + "log", + "rtcp", + "rtp", + "sha1", + "subtle", + "thiserror 1.0.69", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-util" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64bfb10dbe6d762f80169ae07cf252bafa1f764b9594d140008a0231c0cdce58" +dependencies = [ + "async-trait", + "bitflags 1.3.2", + "bytes", + "ipnet", + "lazy_static", + "libc", + "log", + "nix", + "portable-atomic", + "rand 0.8.5", + "thiserror 1.0.69", + "tokio", + "winapi", +] + [[package]] name = "widestring" version = "1.2.0" @@ -3844,7 +4782,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3855,7 +4793,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3919,6 +4857,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -3943,13 +4890,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows-threading" version = "0.1.0" @@ -3971,6 +4935,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3983,6 +4953,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -3995,12 +4971,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -4013,6 +5001,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -4025,6 +5019,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -4037,6 +5037,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -4049,11 +5055,17 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -4074,7 +5086,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags", + "bitflags 2.9.2", ] [[package]] @@ -4087,7 +5099,7 @@ dependencies = [ "futures", "log", "serde", - "thiserror 2.0.12", + "thiserror 2.0.15", "windows", "windows-core", ] @@ -4111,17 +5123,47 @@ dependencies = [ "pharos", "rustc_version", "send_wrapper", - "thiserror 2.0.12", + "thiserror 2.0.15", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", ] +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "ring", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + [[package]] name = "xml-rs" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "xmltree" @@ -4132,6 +5174,15 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + [[package]] name = "yoke" version = "0.8.0" @@ -4152,7 +5203,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -4179,7 +5230,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4199,7 +5250,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -4208,6 +5259,20 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] [[package]] name = "zerotrie" @@ -4222,9 +5287,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -4239,5 +5304,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] diff --git a/webrtc-chat/Cargo.toml b/webrtc-chat/Cargo.toml new file mode 100644 index 0000000..b565090 --- /dev/null +++ b/webrtc-chat/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "webrtc-chat" +version = "0.1.0" +edition = "2024" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +# Core dependencies +iroh = { path = "../../iroh/iroh" , default-features = false} +getrandom = { version = "0.3", features = ["wasm_js"] } +wasm-bindgen = "=0.2.100" +wasm-bindgen-futures = "0.4.50" +wasm-streams = "0.4.2" +serde-wasm-bindgen = "0.4.1" +tokio = { version = "1.47.1" , default-features = false, features = ["sync"]} +serde = { version = "1.0.219", features = ["derive"] } +serde_json = "1.0.143" +tokio-stream = "0.1.17" +log = "0.4.27" +tracing = "0.1.41" +async-channel = "2.5.0" +anyhow = "1.0.99" +futures-lite = "2.6.1" +n0-future = "0.2.0" +clap = { version = "4.5.41", features = ["derive"] } +tracing-subscriber = "0.3.19" +futures = "0.3.31" +url = "2.5.4" +rand = "0.9.1" +chrono = "0.4.41" + + +[build] +rustflags = ["-D", "warnings"] diff --git a/webrtc-chat/package.json b/webrtc-chat/package.json new file mode 100644 index 0000000..ae31fd0 --- /dev/null +++ b/webrtc-chat/package.json @@ -0,0 +1,20 @@ +{ + "name": "webrtc-chat", + "version": "0.1.0", + "scripts": { + "setup": "rustup target add wasm32-unknown-unknown", + "build": "cargo build --target=wasm32-unknown-unknown && wasm-bindgen ./target/wasm32-unknown-unknown/debug/webrtc_chat.wasm --out-dir=public/wasm --weak-refs --target=web --debug", + "build:release": "cargo build --target=wasm32-unknown-unknown --release && wasm-bindgen ./target/wasm32-unknown-unknown/release/webrtc_chat.wasm --out-dir=public/wasm --weak-refs --target=web && wasm-opt --enable-nontrapping-float-to-int --enable-bulk-memory -Os -o public/wasm/webrtc_chat.wasm public/wasm/webrtc_chat_bg.wasm", + "serve": "http-server --cors -a localhost public/", + "dev": "npm run build && npm run serve" + }, + "author": "n0 team", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "http-server": "^14.1.1" + }, + "devDependencies": { + "@wasm-tool/wasm-bindgen-cli": "^0.2.92", + "@wasm-tool/wasm-opt": "^116.0.0" + } +} \ No newline at end of file diff --git a/webrtc-chat/src/bin/cli.rs b/webrtc-chat/src/bin/cli.rs new file mode 100644 index 0000000..3e5e9b0 --- /dev/null +++ b/webrtc-chat/src/bin/cli.rs @@ -0,0 +1,147 @@ +use chrono; +use iroh::node_info::NodeData; +use iroh::{NodeId, TransportMode}; +use n0_future::StreamExt; +use std::collections::BTreeSet; +use std::env; +use std::str::FromStr; +use std::time::Duration; +use tokio::time; +use webrtc_chat::node2::{AcceptEvent, ConnectEvent, EchoNode}; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let args: Vec = env::args().collect(); + + if args.len() < 2 { + println!("Usage: {} [target_node_id]", args[0]); + println!(""); + println!("Run two terminals:"); + println!("Terminal 1: {} node1", args[0]); + println!("Terminal 2: {} node2 ", args[0]); + return Ok(()); + } + + let node_type = &args[1]; + let node = EchoNode::spawn(TransportMode::UdpRelay).await?; + let my_id = node.endpoint().node_id(); + + println!("Started {} with ID: {}", node_type, my_id); + + // Always subscribe to discoveries + if let Some(mut stream) = node.subscribe() { + tokio::spawn(async move { + while let Some(item) = stream.next().await { + println!("DISCOVERED: {} from {}", item.node_id(), item.provenance()); + } + }); + } + + // Subscribe to accept events to monitor incoming connections + let mut accept_stream = node.accept_events(); + tokio::spawn(async move { + while let Some(event) = accept_stream.next().await { + match event { + AcceptEvent::Accepted { node_id } => { + println!("✓ Connection accepted from: {}", node_id); + } + AcceptEvent::Echoed { + node_id, + bytes_sent, + } => { + println!("✓ Echoed {} bytes back to: {}", bytes_sent, node_id); + } + AcceptEvent::Closed { node_id, error } => { + if let Some(err) = error { + println!("✗ Connection closed with {}: {}", node_id, err); + } else { + println!("✓ Connection closed cleanly with: {}", node_id); + } + } + AcceptEvent::StreamData { + bytes_received, + node_id, + } => { + println!("📡 Received {} bytes from: {}", bytes_received, node_id); + } + } + } + }); + + match node_type.as_str() { + "node1" => { + println!("Node1 ready! Copy this ID and run:"); + println!("Terminal 2: {} node2 {}", args[0], my_id); + println!("Waiting for connections..."); + + // Publish node data for discovery + let node_data = NodeData::new(None, BTreeSet::new()); + node.publish(node_data); + println!("Published node info for discovery"); + + // Just wait and monitor + loop { + time::sleep(Duration::from_secs(10)).await; + println!("Node1 still running and listening..."); + } + } + "node2" => { + if args.len() < 3 { + println!("Error: node2 needs target node ID"); + println!("Usage: {} node2 ", args[0]); + return Ok(()); + } + + let target_id_str = &args[2]; + let target_node_id = NodeId::from_str(target_id_str) + .map_err(|e| anyhow::anyhow!("Invalid node ID: {}", e))?; + + println!("Node2 attempting to connect to: {}", target_node_id); + + // Publish our node info for discovery + let node_data = NodeData::new(None, BTreeSet::new()); + node.publish(node_data); + + // Wait a moment for discovery to propagate + time::sleep(Duration::from_secs(2)).await; + + println!("Starting persistent connection..."); + + // Use the persistent connection method instead! + let mut connect_stream = node.connect_persistent(target_node_id); + + println!("Monitoring persistent connection events..."); + while let Some(event) = connect_stream.next().await { + match event { + ConnectEvent::Connected => { + println!("✓ Persistent connection established!"); + } + ConnectEvent::Sent { bytes_sent } => { + println!("📤 Sent {} bytes to target", bytes_sent); + } + ConnectEvent::Received { bytes_received } => { + println!("📥 Received {} bytes back (echo)", bytes_received); + } + ConnectEvent::Closed { error } => { + if let Some(err) = error { + println!("✗ Persistent connection closed with error: {}", err); + } else { + println!("✓ Persistent connection closed successfully"); + } + break; + } + ConnectEvent::KeepAlive => { + println!("💓 Keeping connection alive"); + } + } + } + + println!("Persistent connection session ended."); + } + _ => { + println!("Invalid node type. Use 'node1' or 'node2'"); + } + } + + Ok(()) +} diff --git a/webrtc-chat/src/bin/cli2.rs b/webrtc-chat/src/bin/cli2.rs new file mode 100644 index 0000000..952e07a --- /dev/null +++ b/webrtc-chat/src/bin/cli2.rs @@ -0,0 +1,81 @@ +use anyhow::Result; +use clap::Parser; +use iroh::{NodeId, TransportMode}; +use n0_future::StreamExt; +use webrtc_chat::node2::{AcceptEvent, ConnectEvent, EchoNode}; + +#[derive(Debug, Parser)] +struct Args { + #[clap(subcommand)] + command: Command, +} + +#[derive(Debug, Parser)] +enum Command { + Connect { node_id: NodeId, payload: String }, + Accept, +} + +#[tokio::main] +async fn main() -> Result<()> { + // tracing_subscriber::fmt::init(); + let args = Args::parse(); + let node = EchoNode::spawn(TransportMode::WebrtcRelay).await?; + match args.command { + Command::Connect { node_id, payload } => { + let mut events = node.connect_persistent(node_id); + while let Some(event) = events.next().await { + match event { + ConnectEvent::Connected => { + println!("Connection established") + } + ConnectEvent::Sent { bytes_sent } => { + + // println!("Sent: {} bytes", bytes_sent); + } + ConnectEvent::Received { bytes_received } => { + // println!("Received: {} bytes", bytes_received); + } + ConnectEvent::Closed { error } => { + println!("Connection closed due to error: {:?}", error); + } + ConnectEvent::KeepAlive => { + println!("Connection keep-alive"); + } + } + } + } + Command::Accept => { + println!("connect to this node:"); + println!( + "cargo run --bin cli2 connect {} hello-please-echo-back", + node.endpoint().node_id() + ); + let mut events = node.accept_events(); + while let Some(event) = events.next().await { + match event { + AcceptEvent::Accepted { node_id } => { + println!("Accepted connection {}", node_id); + } + AcceptEvent::Echoed { + node_id, + bytes_sent, + } => { + println!("Echoed: {} bytes", bytes_sent); + } + AcceptEvent::Closed { error, node_id } => { + println!("Connection closed due to error: {:?}", error); + } + AcceptEvent::StreamData { + node_id, + bytes_received, + } => { + // println!("StreamData: {} bytes", bytes_received); + } + } + } + } + } + + Ok(()) +} diff --git a/webrtc-chat/src/lib.rs b/webrtc-chat/src/lib.rs new file mode 100644 index 0000000..8f99ddb --- /dev/null +++ b/webrtc-chat/src/lib.rs @@ -0,0 +1,2 @@ +pub mod node; +pub mod node2; diff --git a/webrtc-chat/src/node.rs b/webrtc-chat/src/node.rs new file mode 100644 index 0000000..1055dc8 --- /dev/null +++ b/webrtc-chat/src/node.rs @@ -0,0 +1,228 @@ +use anyhow::Result; +use async_channel::Sender; +use iroh::discovery::DiscoveryItem; +use iroh::node_info::NodeData; +use iroh::{ + Endpoint, NodeId, + endpoint::Connection, + protocol::{AcceptError, ProtocolHandler, Router}, +}; +use n0_future::{Stream, StreamExt, boxed::BoxStream, task}; +use serde::{Deserialize, Serialize}; +use tokio::sync::broadcast; +use tokio_stream::wrappers::BroadcastStream; +use tracing::info; + +#[derive(Debug, Clone)] +pub struct EchoNode { + router: Router, + accept_events: broadcast::Sender, +} + +impl EchoNode { + pub async fn spawn() -> Result { + let endpoint = iroh::Endpoint::builder() + .discovery_n0() + .alpns(vec![Echo::ALPN.to_vec()]) + .bind() + .await?; + let (event_sender, _event_receiver) = broadcast::channel(128); + let echo = Echo::new(event_sender.clone()); + let router = Router::builder(endpoint).accept(Echo::ALPN, echo).spawn(); + Ok(Self { + router, + accept_events: event_sender, + }) + } + + pub fn endpoint(&self) -> &Endpoint { + self.router.endpoint() + } + + pub fn accept_events(&self) -> BoxStream { + let receiver = self.accept_events.subscribe(); + Box::pin(BroadcastStream::new(receiver).filter_map(|event| event.ok())) + } + + pub fn connect( + &self, + node_id: NodeId, + payload: String, + ) -> impl Stream + Unpin + use<> { + let (event_sender, event_receiver) = async_channel::bounded(16); + let endpoint = self.router.endpoint().clone(); + task::spawn(async move { + let res = connect(&endpoint, node_id, payload, event_sender.clone()).await; + let error = res.as_ref().err().map(|err| err.to_string()); + event_sender.send(ConnectEvent::Closed { error }).await.ok(); + }); + Box::pin(event_receiver) + } + + pub fn publish(&self, data: NodeData) { + let endpoint = self.router.endpoint(); + if let Some(ref dis) = endpoint.discovery() { + dis.publish(&data) + }; + } + + // pub fn subscribe(&self) -> Option> { + // let endpoint = self.router.endpoint(); + // if let Some(ref discovery) = endpoint.discovery() { + // // Return the discovery stream directly + // discovery.subscribe() + // } else { + // None + // } + // } + + // // Or if you want to process the discoveries: + // pub fn subscribe_and_process(&self) -> Option> { + // let endpoint = self.router.endpoint(); + // if let Some(ref discovery) = endpoint.discovery() { + // let stream = discovery.subscribe()?; + // // Process each discovered item + // Some(stream.map(|item| { + // info!( + // "Discovered peer: {} from {}", + // item.node_id().fmt_short(), + // item.provenance() + // ); + // item + // })) + // } else { + // None + // } + // } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type", rename_all = "camelCase")] +pub enum ConnectEvent { + Connected, + Sent { bytes_sent: u64 }, + Received { bytes_received: u64 }, + Closed { error: Option }, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type", rename_all = "camelCase")] +pub enum AcceptEvent { + Accepted { + node_id: NodeId, + }, + Echoed { + node_id: NodeId, + bytes_sent: u64, + }, + Closed { + node_id: NodeId, + error: Option, + }, +} + +#[derive(Debug, Clone)] +pub struct Echo { + event_sender: broadcast::Sender, +} + +impl Echo { + pub const ALPN: &[u8] = b"iroh/example-browser-echo/0"; + pub fn new(event_sender: broadcast::Sender) -> Self { + Self { event_sender } + } +} + +impl Echo { + async fn handle_connection( + self, + connection: Connection, + ) -> std::result::Result<(), AcceptError> { + // Wait for the connection to be fully established. + let node_id = connection.remote_node_id()?; + self.event_sender + .send(AcceptEvent::Accepted { node_id }) + .ok(); + let res = self.handle_connection_0(&connection).await; + let error = res.as_ref().err().map(|err| err.to_string()); + self.event_sender + .send(AcceptEvent::Closed { node_id, error }) + .ok(); + res + } + async fn handle_connection_0( + &self, + connection: &Connection, + ) -> std::result::Result<(), AcceptError> { + // We can get the remote's node id from the connection. + let node_id = connection.remote_node_id()?; + info!("Accepted connection from {node_id}"); + + // Our protocol is a simple request-response protocol, so we expect the + // connecting peer to open a single bi-directional stream. + let (mut send, mut recv) = connection.accept_bi().await?; + + // Echo any bytes received back directly. + let bytes_sent = tokio::io::copy(&mut recv, &mut send).await?; + info!("Copied over {bytes_sent} byte(s)"); + self.event_sender + .send(AcceptEvent::Echoed { + node_id, + bytes_sent, + }) + .ok(); + + // By calling `finish` on the send stream we signal that we will not send anything + // further, which makes the receive stream on the other end terminate. + send.finish()?; + + // Wait until the remote closes the connection, which it does once it + // received the response. + connection.closed().await; + Ok(()) + } +} + +impl ProtocolHandler for Echo { + /// The `accept` method is called for each incoming connection for our ALPN. + /// + /// The returned future runs on a newly spawned tokio task, so it can run as long as + /// the connection lasts. + async fn accept(&self, connection: Connection) -> std::result::Result<(), AcceptError> { + self.clone().handle_connection(connection).await + } +} + +async fn connect( + endpoint: &Endpoint, + node_id: NodeId, + payload: String, + event_sender: Sender, +) -> Result<()> { + let connection = endpoint.connect(node_id, Echo::ALPN).await?; + event_sender.send(ConnectEvent::Connected).await?; + let (mut send_stream, mut recv_stream) = connection.open_bi().await?; + let send_task = task::spawn({ + let event_sender = event_sender.clone(); + async move { + let bytes_sent = payload.len(); + send_stream.write_all(payload.as_bytes()).await?; + event_sender + .send(ConnectEvent::Sent { + bytes_sent: bytes_sent as u64, + }) + .await?; + anyhow::Ok(()) + } + }); + let n = tokio::io::copy(&mut recv_stream, &mut tokio::io::sink()).await?; + // We know we received the last data, so we close the connection. + connection.close(1u8.into(), b"done"); + event_sender + .send(ConnectEvent::Received { + bytes_received: n as u64, + }) + .await?; + send_task.await??; + Ok(()) +} diff --git a/webrtc-chat/src/node2.rs b/webrtc-chat/src/node2.rs new file mode 100644 index 0000000..db91197 --- /dev/null +++ b/webrtc-chat/src/node2.rs @@ -0,0 +1,379 @@ +use anyhow::Result; +use async_channel::Sender; +use iroh::discovery::DiscoveryItem; +use iroh::node_info::NodeData; +use iroh::{ + Endpoint, NodeId, TransportMode, + endpoint::Connection, + protocol::{AcceptError, ProtocolHandler, Router}, +}; +use n0_future::{Stream, StreamExt, boxed::BoxStream, task}; +use serde::{Deserialize, Serialize}; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::sync::broadcast; +use tokio_stream::wrappers::BroadcastStream; +use tracing::info; + +#[derive(Debug, Clone)] +pub struct EchoNode { + router: Router, + accept_events: broadcast::Sender, +} + +impl EchoNode { + pub async fn spawn(transport: TransportMode) -> Result { + let endpoint = iroh::Endpoint::builder() + .discovery_n0() + .alpns(vec![Echo::ALPN.to_vec()]) + .bind_transport(transport) + .await?; + let (event_sender, _event_receiver) = broadcast::channel(128); + let echo = Echo::new(event_sender.clone()); + let router = Router::builder(endpoint).accept(Echo::ALPN, echo).spawn(); + Ok(Self { + router, + accept_events: event_sender, + }) + } + + pub fn endpoint(&self) -> &Endpoint { + self.router.endpoint() + } + + pub fn accept_events(&self) -> BoxStream { + let receiver = self.accept_events.subscribe(); + Box::pin(BroadcastStream::new(receiver).filter_map(|event| event.ok())) + } + + // New method for persistent connection + pub fn connect_persistent( + &self, + node_id: NodeId, + ) -> impl Stream + Unpin + use<> { + let (event_sender, event_receiver) = async_channel::bounded(16); + let endpoint = self.router.endpoint().clone(); + task::spawn(async move { + let res = connect_persistent(&endpoint, node_id, event_sender.clone()).await; + let error = res.as_ref().err().map(|err| err.to_string()); + event_sender.send(ConnectEvent::Closed { error }).await.ok(); + }); + Box::pin(event_receiver) + } + + // Original connect method (kept for compatibility) + pub fn connect( + &self, + node_id: NodeId, + payload: String, + ) -> impl Stream + Unpin + use<> { + let (event_sender, event_receiver) = async_channel::bounded(16); + let endpoint = self.router.endpoint().clone(); + task::spawn(async move { + let res = connect(&endpoint, node_id, payload, event_sender.clone()).await; + let error = res.as_ref().err().map(|err| err.to_string()); + event_sender.send(ConnectEvent::Closed { error }).await.ok(); + }); + Box::pin(event_receiver) + } + + pub fn publish(&self, data: NodeData) { + let endpoint = self.router.endpoint(); + if let Some(ref dis) = endpoint.discovery() { + dis.publish(&data) + }; + } + + // pub fn subscribe(&self) -> Option> { + // let endpoint = self.router.endpoint(); + // if let Some(ref discovery) = endpoint.discovery() { + // discovery.subscribe() + // } else { + // None + // } + // } + + // pub fn subscribe_and_process(&self) -> Option> { + // let endpoint = self.router.endpoint(); + // if let Some(ref discovery) = endpoint.discovery() { + // let stream = discovery.subscribe()?; + // Some(stream.map(|item| { + // info!( + // "Discovered peer: {} from {}", + // item.node_id().fmt_short(), + // item.provenance() + // ); + // item + // })) + // } else { + // None + // } + // } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type", rename_all = "camelCase")] +pub enum ConnectEvent { + Connected, + Sent { bytes_sent: u64 }, + Received { bytes_received: u64 }, + Closed { error: Option }, + KeepAlive, // New event for persistent connections +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type", rename_all = "camelCase")] +pub enum AcceptEvent { + Accepted { + node_id: NodeId, + }, + Echoed { + node_id: NodeId, + bytes_sent: u64, + }, + Closed { + node_id: NodeId, + error: Option, + }, + StreamData { + node_id: NodeId, + bytes_received: u64, + }, // New event for streaming data +} + +#[derive(Debug, Clone)] +pub struct Echo { + event_sender: broadcast::Sender, +} + +impl Echo { + pub const ALPN: &[u8] = b"iroh/example-browser-echo/0"; + pub fn new(event_sender: broadcast::Sender) -> Self { + Self { event_sender } + } +} + +impl Echo { + async fn handle_connection( + self, + connection: Connection, + ) -> std::result::Result<(), AcceptError> { + let node_id = connection.remote_node_id()?; + self.event_sender + .send(AcceptEvent::Accepted { node_id }) + .ok(); + let res = self.handle_connection_streaming(&connection).await; + let error = res.as_ref().err().map(|err| err.to_string()); + self.event_sender + .send(AcceptEvent::Closed { node_id, error }) + .ok(); + res + } + + // New streaming handler that doesn't close immediately + async fn handle_connection_streaming( + &self, + connection: &Connection, + ) -> std::result::Result<(), AcceptError> { + let node_id = connection.remote_node_id()?; + info!("Accepted streaming connection from {node_id}"); + + let (mut send, mut recv) = connection.accept_bi().await?; + + // Keep reading and echoing data until the connection is closed + loop { + let mut buffer = [0u8; 1024]; + match recv.read(&mut buffer).await { + Ok(bytes_read) => { + match bytes_read { + None => {} + Some(0) => { + info!("Connection closed by peer {node_id}"); + break; + } + Some(bytes_read) => { + // Echo the data back + if let Err(e) = send.write_all(&buffer[..bytes_read]).await { + info!("Failed to write to {node_id}: {e}"); + break; + } + + self.event_sender + .send(AcceptEvent::StreamData { + node_id, + bytes_received: bytes_read as u64, + }) + .ok(); + + info!("Streamed {} bytes with {node_id}", bytes_read); + } + } + } + Err(e) => { + info!("Read error from {node_id}: {e}"); + break; + } + } + } + + Ok(()) + } + + // Original echo handler (kept for compatibility) + async fn handle_connection_0( + &self, + connection: &Connection, + ) -> std::result::Result<(), AcceptError> { + let node_id = connection.remote_node_id()?; + info!("Accepted connection from {node_id}"); + + let (mut send, mut recv) = connection.accept_bi().await?; + let bytes_sent = tokio::io::copy(&mut recv, &mut send).await?; + info!("Copied over {bytes_sent} byte(s)"); + self.event_sender + .send(AcceptEvent::Echoed { + node_id, + bytes_sent, + }) + .ok(); + + send.finish()?; + connection.closed().await; + Ok(()) + } +} + +impl ProtocolHandler for Echo { + async fn accept(&self, connection: Connection) -> std::result::Result<(), AcceptError> { + self.clone().handle_connection(connection).await + } +} + +// New persistent connection function +async fn connect_persistent( + endpoint: &Endpoint, + node_id: NodeId, + event_sender: Sender, +) -> Result<()> { + //Here connection is established + let connection = endpoint.connect(node_id, Echo::ALPN).await?; + + event_sender.send(ConnectEvent::Connected).await?; + + let (mut send_stream, mut recv_stream) = connection.open_bi().await?; + + // Send data continuously + let send_task = task::spawn({ + let event_sender = event_sender.clone(); + async move { + let mut counter = 0; + loop { + counter += 1; + let timestamp = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH)? + .as_secs(); + let message = format!( + "Stream message #{} at {}: {}", + counter, + timestamp, + "x".repeat(20) + ); + + match send_stream.write_all(message.as_bytes()).await { + Ok(()) => { + event_sender + .send(ConnectEvent::Sent { + bytes_sent: message.len() as u64, + }) + .await?; + info!("Sent stream message #{}", counter); + } + Err(e) => { + info!("Send error: {e}"); + break; + } + } + + tokio::time::sleep(std::time::Duration::from_secs(2)).await; + } + anyhow::Ok(()) + } + }); + + // Receive echoed data continuously + let recv_task = task::spawn({ + let event_sender = event_sender.clone(); + async move { + let mut buffer = [0u8; 1024]; + loop { + match recv_stream.read(&mut buffer).await { + Ok(bytes_read) => match bytes_read { + None => {} + Some(0) => { + info!("Receive stream ended"); + break; + } + Some(bytes_read) => { + event_sender + .send(ConnectEvent::Received { + bytes_received: bytes_read as u64, + }) + .await?; + info!("Received {} bytes back", bytes_read); + } + }, + Err(e) => { + info!("Receive error: {e}"); + break; + } + } + } + anyhow::Ok(()) + } + }); + + // Wait for either task to complete (connection closed or error) + tokio::select! { + result = send_task => { + info!("Send task completed: {:?}", result); + } + result = recv_task => { + info!("Receive task completed: {:?}", result); + } + } + + Ok(()) +} + +// Original connect function (kept for compatibility) +async fn connect( + endpoint: &Endpoint, + node_id: NodeId, + payload: String, + event_sender: Sender, +) -> Result<()> { + let connection = endpoint.connect(node_id, Echo::ALPN).await?; + event_sender.send(ConnectEvent::Connected).await?; + let (mut send_stream, mut recv_stream) = connection.open_bi().await?; + let send_task = task::spawn({ + let event_sender = event_sender.clone(); + async move { + let bytes_sent = payload.len(); + send_stream.write_all(payload.as_bytes()).await?; + event_sender + .send(ConnectEvent::Sent { + bytes_sent: bytes_sent as u64, + }) + .await?; + anyhow::Ok(()) + } + }); + let n = tokio::io::copy(&mut recv_stream, &mut tokio::io::sink()).await?; + // REMOVED: connection.close(1u8.into(), b"done"); // This was closing the connection! + event_sender + .send(ConnectEvent::Received { + bytes_received: n as u64, + }) + .await?; + send_task.await??; + Ok(()) +} diff --git a/webrtc-chat/src/wasm.rs b/webrtc-chat/src/wasm.rs new file mode 100644 index 0000000..ac4b3e9 --- /dev/null +++ b/webrtc-chat/src/wasm.rs @@ -0,0 +1,37 @@ + +use crate::node; + +#[wasm_bindgen(start)] +fn start(){ + + console_error_panic_hook::set_once(); + + tracing_subscriber::fmt() + .with_max_level(LevelFilter::TRACE) + .with_writer( + + MakeConsoleWriter::default().map_trace_level_to(tracing::Level::DEBUG), + + ) + .without_time() + .with_ansi(false) + .init(); + + tracing::info!("(testing logging) Logging setup"); + +} + +#[wasm_bindgen] +pub struct EchoNode(node::EchoNode); + + +#[wasm_bindgen] +impl EchoNode { + + pub async fn spawn() -> Result { + + Ok(Self(node::EchoNode::s)) + + } + +} \ No newline at end of file