P2P support library for the beaver compute environment

Initial commit

+6589
+1
.gitignore
··· 1 + /target
+4697
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "acto" 7 + version = "0.8.0" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "148541f13c28e3e840354ee4d6c99046c10be2c81068bbd23b9e3a38f95a917e" 10 + dependencies = [ 11 + "parking_lot", 12 + "pin-project-lite", 13 + "rustc_version", 14 + "smol_str", 15 + "sync_wrapper", 16 + "tokio", 17 + "tracing", 18 + ] 19 + 20 + [[package]] 21 + name = "aho-corasick" 22 + version = "1.1.4" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 25 + dependencies = [ 26 + "memchr", 27 + ] 28 + 29 + [[package]] 30 + name = "allocator-api2" 31 + version = "0.2.21" 32 + source = "registry+https://github.com/rust-lang/crates.io-index" 33 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 34 + 35 + [[package]] 36 + name = "android_system_properties" 37 + version = "0.1.5" 38 + source = "registry+https://github.com/rust-lang/crates.io-index" 39 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 40 + dependencies = [ 41 + "libc", 42 + ] 43 + 44 + [[package]] 45 + name = "anstream" 46 + version = "0.6.21" 47 + source = "registry+https://github.com/rust-lang/crates.io-index" 48 + checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 49 + dependencies = [ 50 + "anstyle", 51 + "anstyle-parse", 52 + "anstyle-query", 53 + "anstyle-wincon", 54 + "colorchoice", 55 + "is_terminal_polyfill", 56 + "utf8parse", 57 + ] 58 + 59 + [[package]] 60 + name = "anstyle" 61 + version = "1.0.13" 62 + source = "registry+https://github.com/rust-lang/crates.io-index" 63 + checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 64 + 65 + [[package]] 66 + name = "anstyle-parse" 67 + version = "0.2.7" 68 + source = "registry+https://github.com/rust-lang/crates.io-index" 69 + checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 70 + dependencies = [ 71 + "utf8parse", 72 + ] 73 + 74 + [[package]] 75 + name = "anstyle-query" 76 + version = "1.1.5" 77 + source = "registry+https://github.com/rust-lang/crates.io-index" 78 + checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" 79 + dependencies = [ 80 + "windows-sys 0.61.2", 81 + ] 82 + 83 + [[package]] 84 + name = "anstyle-wincon" 85 + version = "3.0.11" 86 + source = "registry+https://github.com/rust-lang/crates.io-index" 87 + checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" 88 + dependencies = [ 89 + "anstyle", 90 + "once_cell_polyfill", 91 + "windows-sys 0.61.2", 92 + ] 93 + 94 + [[package]] 95 + name = "anyhow" 96 + version = "1.0.101" 97 + source = "registry+https://github.com/rust-lang/crates.io-index" 98 + checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" 99 + 100 + [[package]] 101 + name = "arrayref" 102 + version = "0.3.9" 103 + source = "registry+https://github.com/rust-lang/crates.io-index" 104 + checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 105 + 106 + [[package]] 107 + name = "arrayvec" 108 + version = "0.7.6" 109 + source = "registry+https://github.com/rust-lang/crates.io-index" 110 + checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 111 + 112 + [[package]] 113 + name = "async-compat" 114 + version = "0.2.5" 115 + source = "registry+https://github.com/rust-lang/crates.io-index" 116 + checksum = "a1ba85bc55464dcbf728b56d97e119d673f4cf9062be330a9a26f3acf504a590" 117 + dependencies = [ 118 + "futures-core", 119 + "futures-io", 120 + "once_cell", 121 + "pin-project-lite", 122 + "tokio", 123 + ] 124 + 125 + [[package]] 126 + name = "async-trait" 127 + version = "0.1.89" 128 + source = "registry+https://github.com/rust-lang/crates.io-index" 129 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 130 + dependencies = [ 131 + "proc-macro2", 132 + "quote", 133 + "syn", 134 + ] 135 + 136 + [[package]] 137 + name = "async_io_stream" 138 + version = "0.3.3" 139 + source = "registry+https://github.com/rust-lang/crates.io-index" 140 + checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" 141 + dependencies = [ 142 + "futures", 143 + "pharos", 144 + "rustc_version", 145 + ] 146 + 147 + [[package]] 148 + name = "atomic-polyfill" 149 + version = "1.0.3" 150 + source = "registry+https://github.com/rust-lang/crates.io-index" 151 + checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" 152 + dependencies = [ 153 + "critical-section", 154 + ] 155 + 156 + [[package]] 157 + name = "atomic-waker" 158 + version = "1.1.2" 159 + source = "registry+https://github.com/rust-lang/crates.io-index" 160 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 161 + 162 + [[package]] 163 + name = "attohttpc" 164 + version = "0.30.1" 165 + source = "registry+https://github.com/rust-lang/crates.io-index" 166 + checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" 167 + dependencies = [ 168 + "base64", 169 + "http", 170 + "log", 171 + "url", 172 + ] 173 + 174 + [[package]] 175 + name = "autocfg" 176 + version = "1.5.0" 177 + source = "registry+https://github.com/rust-lang/crates.io-index" 178 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 179 + 180 + [[package]] 181 + name = "aws-lc-rs" 182 + version = "1.16.0" 183 + source = "registry+https://github.com/rust-lang/crates.io-index" 184 + checksum = "d9a7b350e3bb1767102698302bc37256cbd48422809984b98d292c40e2579aa9" 185 + dependencies = [ 186 + "aws-lc-sys", 187 + "zeroize", 188 + ] 189 + 190 + [[package]] 191 + name = "aws-lc-sys" 192 + version = "0.37.1" 193 + source = "registry+https://github.com/rust-lang/crates.io-index" 194 + checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" 195 + dependencies = [ 196 + "cc", 197 + "cmake", 198 + "dunce", 199 + "fs_extra", 200 + ] 201 + 202 + [[package]] 203 + name = "backon" 204 + version = "1.6.0" 205 + source = "registry+https://github.com/rust-lang/crates.io-index" 206 + checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" 207 + dependencies = [ 208 + "fastrand", 209 + "gloo-timers", 210 + "tokio", 211 + ] 212 + 213 + [[package]] 214 + name = "base32" 215 + version = "0.5.1" 216 + source = "registry+https://github.com/rust-lang/crates.io-index" 217 + checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" 218 + 219 + [[package]] 220 + name = "base64" 221 + version = "0.22.1" 222 + source = "registry+https://github.com/rust-lang/crates.io-index" 223 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 224 + 225 + [[package]] 226 + name = "base64ct" 227 + version = "1.8.3" 228 + source = "registry+https://github.com/rust-lang/crates.io-index" 229 + checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" 230 + 231 + [[package]] 232 + name = "bitflags" 233 + version = "2.11.0" 234 + source = "registry+https://github.com/rust-lang/crates.io-index" 235 + checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" 236 + 237 + [[package]] 238 + name = "blake3" 239 + version = "1.8.3" 240 + source = "registry+https://github.com/rust-lang/crates.io-index" 241 + checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" 242 + dependencies = [ 243 + "arrayref", 244 + "arrayvec", 245 + "cc", 246 + "cfg-if", 247 + "constant_time_eq", 248 + "cpufeatures", 249 + ] 250 + 251 + [[package]] 252 + name = "block-buffer" 253 + version = "0.11.0" 254 + source = "registry+https://github.com/rust-lang/crates.io-index" 255 + checksum = "96eb4cdd6cf1b31d671e9efe75c5d1ec614776856cefbe109ca373554a6d514f" 256 + dependencies = [ 257 + "hybrid-array", 258 + ] 259 + 260 + [[package]] 261 + name = "block2" 262 + version = "0.6.2" 263 + source = "registry+https://github.com/rust-lang/crates.io-index" 264 + checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 265 + dependencies = [ 266 + "objc2", 267 + ] 268 + 269 + [[package]] 270 + name = "bumpalo" 271 + version = "3.19.1" 272 + source = "registry+https://github.com/rust-lang/crates.io-index" 273 + checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" 274 + 275 + [[package]] 276 + name = "byteorder" 277 + version = "1.5.0" 278 + source = "registry+https://github.com/rust-lang/crates.io-index" 279 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 280 + 281 + [[package]] 282 + name = "bytes" 283 + version = "1.11.1" 284 + source = "registry+https://github.com/rust-lang/crates.io-index" 285 + checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" 286 + 287 + [[package]] 288 + name = "cc" 289 + version = "1.2.56" 290 + source = "registry+https://github.com/rust-lang/crates.io-index" 291 + checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" 292 + dependencies = [ 293 + "find-msvc-tools", 294 + "jobserver", 295 + "libc", 296 + "shlex", 297 + ] 298 + 299 + [[package]] 300 + name = "cesu8" 301 + version = "1.1.0" 302 + source = "registry+https://github.com/rust-lang/crates.io-index" 303 + checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 304 + 305 + [[package]] 306 + name = "cfg-if" 307 + version = "1.0.4" 308 + source = "registry+https://github.com/rust-lang/crates.io-index" 309 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 310 + 311 + [[package]] 312 + name = "cfg_aliases" 313 + version = "0.2.1" 314 + source = "registry+https://github.com/rust-lang/crates.io-index" 315 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 316 + 317 + [[package]] 318 + name = "chrono" 319 + version = "0.4.43" 320 + source = "registry+https://github.com/rust-lang/crates.io-index" 321 + checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" 322 + dependencies = [ 323 + "iana-time-zone", 324 + "num-traits", 325 + "serde", 326 + "windows-link", 327 + ] 328 + 329 + [[package]] 330 + name = "clap" 331 + version = "4.5.59" 332 + source = "registry+https://github.com/rust-lang/crates.io-index" 333 + checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499" 334 + dependencies = [ 335 + "clap_builder", 336 + "clap_derive", 337 + ] 338 + 339 + [[package]] 340 + name = "clap_builder" 341 + version = "4.5.59" 342 + source = "registry+https://github.com/rust-lang/crates.io-index" 343 + checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24" 344 + dependencies = [ 345 + "anstream", 346 + "anstyle", 347 + "clap_lex", 348 + "strsim", 349 + ] 350 + 351 + [[package]] 352 + name = "clap_derive" 353 + version = "4.5.55" 354 + source = "registry+https://github.com/rust-lang/crates.io-index" 355 + checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" 356 + dependencies = [ 357 + "heck", 358 + "proc-macro2", 359 + "quote", 360 + "syn", 361 + ] 362 + 363 + [[package]] 364 + name = "clap_lex" 365 + version = "1.0.0" 366 + source = "registry+https://github.com/rust-lang/crates.io-index" 367 + checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" 368 + 369 + [[package]] 370 + name = "cmake" 371 + version = "0.1.57" 372 + source = "registry+https://github.com/rust-lang/crates.io-index" 373 + checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" 374 + dependencies = [ 375 + "cc", 376 + ] 377 + 378 + [[package]] 379 + name = "cobs" 380 + version = "0.3.0" 381 + source = "registry+https://github.com/rust-lang/crates.io-index" 382 + checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" 383 + dependencies = [ 384 + "thiserror 2.0.18", 385 + ] 386 + 387 + [[package]] 388 + name = "colorchoice" 389 + version = "1.0.4" 390 + source = "registry+https://github.com/rust-lang/crates.io-index" 391 + checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 392 + 393 + [[package]] 394 + name = "combine" 395 + version = "4.6.7" 396 + source = "registry+https://github.com/rust-lang/crates.io-index" 397 + checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 398 + dependencies = [ 399 + "bytes", 400 + "memchr", 401 + ] 402 + 403 + [[package]] 404 + name = "const-oid" 405 + version = "0.10.2" 406 + source = "registry+https://github.com/rust-lang/crates.io-index" 407 + checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" 408 + 409 + [[package]] 410 + name = "constant_time_eq" 411 + version = "0.4.2" 412 + source = "registry+https://github.com/rust-lang/crates.io-index" 413 + checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" 414 + 415 + [[package]] 416 + name = "convert_case" 417 + version = "0.10.0" 418 + source = "registry+https://github.com/rust-lang/crates.io-index" 419 + checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" 420 + dependencies = [ 421 + "unicode-segmentation", 422 + ] 423 + 424 + [[package]] 425 + name = "cordyceps" 426 + version = "0.3.4" 427 + source = "registry+https://github.com/rust-lang/crates.io-index" 428 + checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" 429 + dependencies = [ 430 + "loom", 431 + "tracing", 432 + ] 433 + 434 + [[package]] 435 + name = "core-foundation" 436 + version = "0.10.1" 437 + source = "registry+https://github.com/rust-lang/crates.io-index" 438 + checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" 439 + dependencies = [ 440 + "core-foundation-sys", 441 + "libc", 442 + ] 443 + 444 + [[package]] 445 + name = "core-foundation-sys" 446 + version = "0.8.7" 447 + source = "registry+https://github.com/rust-lang/crates.io-index" 448 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 449 + 450 + [[package]] 451 + name = "cpufeatures" 452 + version = "0.2.17" 453 + source = "registry+https://github.com/rust-lang/crates.io-index" 454 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 455 + dependencies = [ 456 + "libc", 457 + ] 458 + 459 + [[package]] 460 + name = "critical-section" 461 + version = "1.2.0" 462 + source = "registry+https://github.com/rust-lang/crates.io-index" 463 + checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" 464 + 465 + [[package]] 466 + name = "crossbeam-channel" 467 + version = "0.5.15" 468 + source = "registry+https://github.com/rust-lang/crates.io-index" 469 + checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 470 + dependencies = [ 471 + "crossbeam-utils", 472 + ] 473 + 474 + [[package]] 475 + name = "crossbeam-epoch" 476 + version = "0.9.18" 477 + source = "registry+https://github.com/rust-lang/crates.io-index" 478 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 479 + dependencies = [ 480 + "crossbeam-utils", 481 + ] 482 + 483 + [[package]] 484 + name = "crossbeam-utils" 485 + version = "0.8.21" 486 + source = "registry+https://github.com/rust-lang/crates.io-index" 487 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 488 + 489 + [[package]] 490 + name = "crypto-common" 491 + version = "0.2.0" 492 + source = "registry+https://github.com/rust-lang/crates.io-index" 493 + checksum = "211f05e03c7d03754740fd9e585de910a095d6b99f8bcfffdef8319fa02a8331" 494 + dependencies = [ 495 + "hybrid-array", 496 + ] 497 + 498 + [[package]] 499 + name = "curve25519-dalek" 500 + version = "5.0.0-pre.1" 501 + source = "registry+https://github.com/rust-lang/crates.io-index" 502 + checksum = "6f9200d1d13637f15a6acb71e758f64624048d85b31a5fdbfd8eca1e2687d0b7" 503 + dependencies = [ 504 + "cfg-if", 505 + "cpufeatures", 506 + "curve25519-dalek-derive", 507 + "digest", 508 + "fiat-crypto", 509 + "rand_core 0.9.5", 510 + "rustc_version", 511 + "serde", 512 + "subtle", 513 + "zeroize", 514 + ] 515 + 516 + [[package]] 517 + name = "curve25519-dalek-derive" 518 + version = "0.1.1" 519 + source = "registry+https://github.com/rust-lang/crates.io-index" 520 + checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" 521 + dependencies = [ 522 + "proc-macro2", 523 + "quote", 524 + "syn", 525 + ] 526 + 527 + [[package]] 528 + name = "darling" 529 + version = "0.20.11" 530 + source = "registry+https://github.com/rust-lang/crates.io-index" 531 + checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 532 + dependencies = [ 533 + "darling_core", 534 + "darling_macro", 535 + ] 536 + 537 + [[package]] 538 + name = "darling_core" 539 + version = "0.20.11" 540 + source = "registry+https://github.com/rust-lang/crates.io-index" 541 + checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 542 + dependencies = [ 543 + "fnv", 544 + "ident_case", 545 + "proc-macro2", 546 + "quote", 547 + "strsim", 548 + "syn", 549 + ] 550 + 551 + [[package]] 552 + name = "darling_macro" 553 + version = "0.20.11" 554 + source = "registry+https://github.com/rust-lang/crates.io-index" 555 + checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 556 + dependencies = [ 557 + "darling_core", 558 + "quote", 559 + "syn", 560 + ] 561 + 562 + [[package]] 563 + name = "data-encoding" 564 + version = "2.10.0" 565 + source = "registry+https://github.com/rust-lang/crates.io-index" 566 + checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" 567 + 568 + [[package]] 569 + name = "der" 570 + version = "0.8.0" 571 + source = "registry+https://github.com/rust-lang/crates.io-index" 572 + checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" 573 + dependencies = [ 574 + "const-oid", 575 + "pem-rfc7468", 576 + "zeroize", 577 + ] 578 + 579 + [[package]] 580 + name = "deranged" 581 + version = "0.5.6" 582 + source = "registry+https://github.com/rust-lang/crates.io-index" 583 + checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" 584 + dependencies = [ 585 + "powerfmt", 586 + ] 587 + 588 + [[package]] 589 + name = "derive_builder" 590 + version = "0.20.2" 591 + source = "registry+https://github.com/rust-lang/crates.io-index" 592 + checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" 593 + dependencies = [ 594 + "derive_builder_macro", 595 + ] 596 + 597 + [[package]] 598 + name = "derive_builder_core" 599 + version = "0.20.2" 600 + source = "registry+https://github.com/rust-lang/crates.io-index" 601 + checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" 602 + dependencies = [ 603 + "darling", 604 + "proc-macro2", 605 + "quote", 606 + "syn", 607 + ] 608 + 609 + [[package]] 610 + name = "derive_builder_macro" 611 + version = "0.20.2" 612 + source = "registry+https://github.com/rust-lang/crates.io-index" 613 + checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" 614 + dependencies = [ 615 + "derive_builder_core", 616 + "syn", 617 + ] 618 + 619 + [[package]] 620 + name = "derive_more" 621 + version = "2.1.1" 622 + source = "registry+https://github.com/rust-lang/crates.io-index" 623 + checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" 624 + dependencies = [ 625 + "derive_more-impl", 626 + ] 627 + 628 + [[package]] 629 + name = "derive_more-impl" 630 + version = "2.1.1" 631 + source = "registry+https://github.com/rust-lang/crates.io-index" 632 + checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" 633 + dependencies = [ 634 + "convert_case", 635 + "proc-macro2", 636 + "quote", 637 + "rustc_version", 638 + "syn", 639 + "unicode-xid", 640 + ] 641 + 642 + [[package]] 643 + name = "diatomic-waker" 644 + version = "0.2.3" 645 + source = "registry+https://github.com/rust-lang/crates.io-index" 646 + checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" 647 + 648 + [[package]] 649 + name = "digest" 650 + version = "0.11.0-rc.10" 651 + source = "registry+https://github.com/rust-lang/crates.io-index" 652 + checksum = "afa94b64bfc6549e6e4b5a3216f22593224174083da7a90db47e951c4fb31725" 653 + dependencies = [ 654 + "block-buffer", 655 + "const-oid", 656 + "crypto-common", 657 + ] 658 + 659 + [[package]] 660 + name = "dispatch2" 661 + version = "0.3.0" 662 + source = "registry+https://github.com/rust-lang/crates.io-index" 663 + checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 664 + dependencies = [ 665 + "bitflags", 666 + "block2", 667 + "libc", 668 + "objc2", 669 + ] 670 + 671 + [[package]] 672 + name = "displaydoc" 673 + version = "0.2.5" 674 + source = "registry+https://github.com/rust-lang/crates.io-index" 675 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 676 + dependencies = [ 677 + "proc-macro2", 678 + "quote", 679 + "syn", 680 + ] 681 + 682 + [[package]] 683 + name = "dlopen2" 684 + version = "0.5.0" 685 + source = "registry+https://github.com/rust-lang/crates.io-index" 686 + checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" 687 + dependencies = [ 688 + "libc", 689 + "once_cell", 690 + "winapi", 691 + ] 692 + 693 + [[package]] 694 + name = "document-features" 695 + version = "0.2.12" 696 + source = "registry+https://github.com/rust-lang/crates.io-index" 697 + checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" 698 + dependencies = [ 699 + "litrs", 700 + ] 701 + 702 + [[package]] 703 + name = "dunce" 704 + version = "1.0.5" 705 + source = "registry+https://github.com/rust-lang/crates.io-index" 706 + checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" 707 + 708 + [[package]] 709 + name = "dyn-clone" 710 + version = "1.0.20" 711 + source = "registry+https://github.com/rust-lang/crates.io-index" 712 + checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 713 + 714 + [[package]] 715 + name = "ed25519" 716 + version = "3.0.0-rc.4" 717 + source = "registry+https://github.com/rust-lang/crates.io-index" 718 + checksum = "c6e914c7c52decb085cea910552e24c63ac019e3ab8bf001ff736da9a9d9d890" 719 + dependencies = [ 720 + "pkcs8", 721 + "serde", 722 + "signature", 723 + ] 724 + 725 + [[package]] 726 + name = "ed25519-dalek" 727 + version = "3.0.0-pre.1" 728 + source = "registry+https://github.com/rust-lang/crates.io-index" 729 + checksum = "ad207ed88a133091f83224265eac21109930db09bedcad05d5252f2af2de20a1" 730 + dependencies = [ 731 + "curve25519-dalek", 732 + "ed25519", 733 + "rand_core 0.9.5", 734 + "serde", 735 + "sha2", 736 + "signature", 737 + "subtle", 738 + "zeroize", 739 + ] 740 + 741 + [[package]] 742 + name = "either" 743 + version = "1.15.0" 744 + source = "registry+https://github.com/rust-lang/crates.io-index" 745 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 746 + 747 + [[package]] 748 + name = "embedded-io" 749 + version = "0.4.0" 750 + source = "registry+https://github.com/rust-lang/crates.io-index" 751 + checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" 752 + 753 + [[package]] 754 + name = "embedded-io" 755 + version = "0.6.1" 756 + source = "registry+https://github.com/rust-lang/crates.io-index" 757 + checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" 758 + 759 + [[package]] 760 + name = "enum-as-inner" 761 + version = "0.6.1" 762 + source = "registry+https://github.com/rust-lang/crates.io-index" 763 + checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" 764 + dependencies = [ 765 + "heck", 766 + "proc-macro2", 767 + "quote", 768 + "syn", 769 + ] 770 + 771 + [[package]] 772 + name = "enum-assoc" 773 + version = "1.3.0" 774 + source = "registry+https://github.com/rust-lang/crates.io-index" 775 + checksum = "3ed8956bd5c1f0415200516e78ff07ec9e16415ade83c056c230d7b7ea0d55b7" 776 + dependencies = [ 777 + "proc-macro2", 778 + "quote", 779 + "syn", 780 + ] 781 + 782 + [[package]] 783 + name = "env_filter" 784 + version = "1.0.0" 785 + source = "registry+https://github.com/rust-lang/crates.io-index" 786 + checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" 787 + dependencies = [ 788 + "log", 789 + "regex", 790 + ] 791 + 792 + [[package]] 793 + name = "env_logger" 794 + version = "0.11.9" 795 + source = "registry+https://github.com/rust-lang/crates.io-index" 796 + checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" 797 + dependencies = [ 798 + "anstream", 799 + "anstyle", 800 + "env_filter", 801 + "jiff", 802 + "log", 803 + ] 804 + 805 + [[package]] 806 + name = "equivalent" 807 + version = "1.0.2" 808 + source = "registry+https://github.com/rust-lang/crates.io-index" 809 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 810 + 811 + [[package]] 812 + name = "errno" 813 + version = "0.3.14" 814 + source = "registry+https://github.com/rust-lang/crates.io-index" 815 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 816 + dependencies = [ 817 + "libc", 818 + "windows-sys 0.61.2", 819 + ] 820 + 821 + [[package]] 822 + name = "fastbloom" 823 + version = "0.14.1" 824 + source = "registry+https://github.com/rust-lang/crates.io-index" 825 + checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" 826 + dependencies = [ 827 + "getrandom 0.3.4", 828 + "libm", 829 + "rand 0.9.2", 830 + "siphasher", 831 + ] 832 + 833 + [[package]] 834 + name = "fastrand" 835 + version = "2.3.0" 836 + source = "registry+https://github.com/rust-lang/crates.io-index" 837 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 838 + 839 + [[package]] 840 + name = "fiat-crypto" 841 + version = "0.3.0" 842 + source = "registry+https://github.com/rust-lang/crates.io-index" 843 + checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" 844 + 845 + [[package]] 846 + name = "find-msvc-tools" 847 + version = "0.1.9" 848 + source = "registry+https://github.com/rust-lang/crates.io-index" 849 + checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" 850 + 851 + [[package]] 852 + name = "fnv" 853 + version = "1.0.7" 854 + source = "registry+https://github.com/rust-lang/crates.io-index" 855 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 856 + 857 + [[package]] 858 + name = "foldhash" 859 + version = "0.1.5" 860 + source = "registry+https://github.com/rust-lang/crates.io-index" 861 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 862 + 863 + [[package]] 864 + name = "foldhash" 865 + version = "0.2.0" 866 + source = "registry+https://github.com/rust-lang/crates.io-index" 867 + checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" 868 + 869 + [[package]] 870 + name = "form_urlencoded" 871 + version = "1.2.2" 872 + source = "registry+https://github.com/rust-lang/crates.io-index" 873 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 874 + dependencies = [ 875 + "percent-encoding", 876 + ] 877 + 878 + [[package]] 879 + name = "fs_extra" 880 + version = "1.3.0" 881 + source = "registry+https://github.com/rust-lang/crates.io-index" 882 + checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" 883 + 884 + [[package]] 885 + name = "futures" 886 + version = "0.3.32" 887 + source = "registry+https://github.com/rust-lang/crates.io-index" 888 + checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" 889 + dependencies = [ 890 + "futures-channel", 891 + "futures-core", 892 + "futures-executor", 893 + "futures-io", 894 + "futures-sink", 895 + "futures-task", 896 + "futures-util", 897 + ] 898 + 899 + [[package]] 900 + name = "futures-buffered" 901 + version = "0.2.13" 902 + source = "registry+https://github.com/rust-lang/crates.io-index" 903 + checksum = "4421cb78ee172b6b06080093479d3c50f058e7c81b7d577bbb8d118d551d4cd5" 904 + dependencies = [ 905 + "cordyceps", 906 + "diatomic-waker", 907 + "futures-core", 908 + "pin-project-lite", 909 + "spin 0.10.0", 910 + ] 911 + 912 + [[package]] 913 + name = "futures-channel" 914 + version = "0.3.32" 915 + source = "registry+https://github.com/rust-lang/crates.io-index" 916 + checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" 917 + dependencies = [ 918 + "futures-core", 919 + "futures-sink", 920 + ] 921 + 922 + [[package]] 923 + name = "futures-core" 924 + version = "0.3.32" 925 + source = "registry+https://github.com/rust-lang/crates.io-index" 926 + checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" 927 + 928 + [[package]] 929 + name = "futures-executor" 930 + version = "0.3.32" 931 + source = "registry+https://github.com/rust-lang/crates.io-index" 932 + checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" 933 + dependencies = [ 934 + "futures-core", 935 + "futures-task", 936 + "futures-util", 937 + ] 938 + 939 + [[package]] 940 + name = "futures-io" 941 + version = "0.3.32" 942 + source = "registry+https://github.com/rust-lang/crates.io-index" 943 + checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" 944 + 945 + [[package]] 946 + name = "futures-lite" 947 + version = "2.6.1" 948 + source = "registry+https://github.com/rust-lang/crates.io-index" 949 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 950 + dependencies = [ 951 + "fastrand", 952 + "futures-core", 953 + "futures-io", 954 + "parking", 955 + "pin-project-lite", 956 + ] 957 + 958 + [[package]] 959 + name = "futures-macro" 960 + version = "0.3.32" 961 + source = "registry+https://github.com/rust-lang/crates.io-index" 962 + checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" 963 + dependencies = [ 964 + "proc-macro2", 965 + "quote", 966 + "syn", 967 + ] 968 + 969 + [[package]] 970 + name = "futures-sink" 971 + version = "0.3.32" 972 + source = "registry+https://github.com/rust-lang/crates.io-index" 973 + checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" 974 + 975 + [[package]] 976 + name = "futures-task" 977 + version = "0.3.32" 978 + source = "registry+https://github.com/rust-lang/crates.io-index" 979 + checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" 980 + 981 + [[package]] 982 + name = "futures-util" 983 + version = "0.3.32" 984 + source = "registry+https://github.com/rust-lang/crates.io-index" 985 + checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" 986 + dependencies = [ 987 + "futures-channel", 988 + "futures-core", 989 + "futures-io", 990 + "futures-macro", 991 + "futures-sink", 992 + "futures-task", 993 + "memchr", 994 + "pin-project-lite", 995 + "slab", 996 + ] 997 + 998 + [[package]] 999 + name = "generator" 1000 + version = "0.8.8" 1001 + source = "registry+https://github.com/rust-lang/crates.io-index" 1002 + checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" 1003 + dependencies = [ 1004 + "cc", 1005 + "cfg-if", 1006 + "libc", 1007 + "log", 1008 + "rustversion", 1009 + "windows-link", 1010 + "windows-result", 1011 + ] 1012 + 1013 + [[package]] 1014 + name = "getrandom" 1015 + version = "0.2.17" 1016 + source = "registry+https://github.com/rust-lang/crates.io-index" 1017 + checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" 1018 + dependencies = [ 1019 + "cfg-if", 1020 + "js-sys", 1021 + "libc", 1022 + "wasi", 1023 + "wasm-bindgen", 1024 + ] 1025 + 1026 + [[package]] 1027 + name = "getrandom" 1028 + version = "0.3.4" 1029 + source = "registry+https://github.com/rust-lang/crates.io-index" 1030 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1031 + dependencies = [ 1032 + "cfg-if", 1033 + "js-sys", 1034 + "libc", 1035 + "r-efi", 1036 + "wasip2", 1037 + "wasm-bindgen", 1038 + ] 1039 + 1040 + [[package]] 1041 + name = "getrandom" 1042 + version = "0.4.1" 1043 + source = "registry+https://github.com/rust-lang/crates.io-index" 1044 + checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" 1045 + dependencies = [ 1046 + "cfg-if", 1047 + "js-sys", 1048 + "libc", 1049 + "r-efi", 1050 + "wasip2", 1051 + "wasip3", 1052 + "wasm-bindgen", 1053 + ] 1054 + 1055 + [[package]] 1056 + name = "gloo-timers" 1057 + version = "0.3.0" 1058 + source = "registry+https://github.com/rust-lang/crates.io-index" 1059 + checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" 1060 + dependencies = [ 1061 + "futures-channel", 1062 + "futures-core", 1063 + "js-sys", 1064 + "wasm-bindgen", 1065 + ] 1066 + 1067 + [[package]] 1068 + name = "h2" 1069 + version = "0.4.13" 1070 + source = "registry+https://github.com/rust-lang/crates.io-index" 1071 + checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" 1072 + dependencies = [ 1073 + "atomic-waker", 1074 + "bytes", 1075 + "fnv", 1076 + "futures-core", 1077 + "futures-sink", 1078 + "http", 1079 + "indexmap", 1080 + "slab", 1081 + "tokio", 1082 + "tokio-util", 1083 + "tracing", 1084 + ] 1085 + 1086 + [[package]] 1087 + name = "hash32" 1088 + version = "0.2.1" 1089 + source = "registry+https://github.com/rust-lang/crates.io-index" 1090 + checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" 1091 + dependencies = [ 1092 + "byteorder", 1093 + ] 1094 + 1095 + [[package]] 1096 + name = "hashbrown" 1097 + version = "0.15.5" 1098 + source = "registry+https://github.com/rust-lang/crates.io-index" 1099 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1100 + dependencies = [ 1101 + "foldhash 0.1.5", 1102 + ] 1103 + 1104 + [[package]] 1105 + name = "hashbrown" 1106 + version = "0.16.1" 1107 + source = "registry+https://github.com/rust-lang/crates.io-index" 1108 + checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 1109 + dependencies = [ 1110 + "allocator-api2", 1111 + "equivalent", 1112 + "foldhash 0.2.0", 1113 + ] 1114 + 1115 + [[package]] 1116 + name = "heapless" 1117 + version = "0.7.17" 1118 + source = "registry+https://github.com/rust-lang/crates.io-index" 1119 + checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" 1120 + dependencies = [ 1121 + "atomic-polyfill", 1122 + "hash32", 1123 + "rustc_version", 1124 + "serde", 1125 + "spin 0.9.8", 1126 + "stable_deref_trait", 1127 + ] 1128 + 1129 + [[package]] 1130 + name = "heck" 1131 + version = "0.5.0" 1132 + source = "registry+https://github.com/rust-lang/crates.io-index" 1133 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1134 + 1135 + [[package]] 1136 + name = "hickory-proto" 1137 + version = "0.25.2" 1138 + source = "registry+https://github.com/rust-lang/crates.io-index" 1139 + checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" 1140 + dependencies = [ 1141 + "async-trait", 1142 + "bytes", 1143 + "cfg-if", 1144 + "data-encoding", 1145 + "enum-as-inner", 1146 + "futures-channel", 1147 + "futures-io", 1148 + "futures-util", 1149 + "h2", 1150 + "http", 1151 + "idna", 1152 + "ipnet", 1153 + "once_cell", 1154 + "rand 0.9.2", 1155 + "ring", 1156 + "rustls", 1157 + "thiserror 2.0.18", 1158 + "tinyvec", 1159 + "tokio", 1160 + "tokio-rustls", 1161 + "tracing", 1162 + "url", 1163 + ] 1164 + 1165 + [[package]] 1166 + name = "hickory-resolver" 1167 + version = "0.25.2" 1168 + source = "registry+https://github.com/rust-lang/crates.io-index" 1169 + checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" 1170 + dependencies = [ 1171 + "cfg-if", 1172 + "futures-util", 1173 + "hickory-proto", 1174 + "ipconfig", 1175 + "moka", 1176 + "once_cell", 1177 + "parking_lot", 1178 + "rand 0.9.2", 1179 + "resolv-conf", 1180 + "rustls", 1181 + "smallvec", 1182 + "thiserror 2.0.18", 1183 + "tokio", 1184 + "tokio-rustls", 1185 + "tracing", 1186 + ] 1187 + 1188 + [[package]] 1189 + name = "http" 1190 + version = "1.4.0" 1191 + source = "registry+https://github.com/rust-lang/crates.io-index" 1192 + checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" 1193 + dependencies = [ 1194 + "bytes", 1195 + "itoa", 1196 + ] 1197 + 1198 + [[package]] 1199 + name = "http-body" 1200 + version = "1.0.1" 1201 + source = "registry+https://github.com/rust-lang/crates.io-index" 1202 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1203 + dependencies = [ 1204 + "bytes", 1205 + "http", 1206 + ] 1207 + 1208 + [[package]] 1209 + name = "http-body-util" 1210 + version = "0.1.3" 1211 + source = "registry+https://github.com/rust-lang/crates.io-index" 1212 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 1213 + dependencies = [ 1214 + "bytes", 1215 + "futures-core", 1216 + "http", 1217 + "http-body", 1218 + "pin-project-lite", 1219 + ] 1220 + 1221 + [[package]] 1222 + name = "httparse" 1223 + version = "1.10.1" 1224 + source = "registry+https://github.com/rust-lang/crates.io-index" 1225 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 1226 + 1227 + [[package]] 1228 + name = "httpdate" 1229 + version = "1.0.3" 1230 + source = "registry+https://github.com/rust-lang/crates.io-index" 1231 + checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1232 + 1233 + [[package]] 1234 + name = "hybrid-array" 1235 + version = "0.4.7" 1236 + source = "registry+https://github.com/rust-lang/crates.io-index" 1237 + checksum = "e1b229d73f5803b562cc26e4da0396c8610a4ee209f4fac8fa4f8d709166dc45" 1238 + dependencies = [ 1239 + "typenum", 1240 + ] 1241 + 1242 + [[package]] 1243 + name = "hyper" 1244 + version = "1.8.1" 1245 + source = "registry+https://github.com/rust-lang/crates.io-index" 1246 + checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" 1247 + dependencies = [ 1248 + "atomic-waker", 1249 + "bytes", 1250 + "futures-channel", 1251 + "futures-core", 1252 + "h2", 1253 + "http", 1254 + "http-body", 1255 + "httparse", 1256 + "httpdate", 1257 + "itoa", 1258 + "pin-project-lite", 1259 + "pin-utils", 1260 + "smallvec", 1261 + "tokio", 1262 + "want", 1263 + ] 1264 + 1265 + [[package]] 1266 + name = "hyper-rustls" 1267 + version = "0.27.7" 1268 + source = "registry+https://github.com/rust-lang/crates.io-index" 1269 + checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 1270 + dependencies = [ 1271 + "http", 1272 + "hyper", 1273 + "hyper-util", 1274 + "rustls", 1275 + "rustls-pki-types", 1276 + "tokio", 1277 + "tokio-rustls", 1278 + "tower-service", 1279 + "webpki-roots", 1280 + ] 1281 + 1282 + [[package]] 1283 + name = "hyper-util" 1284 + version = "0.1.20" 1285 + source = "registry+https://github.com/rust-lang/crates.io-index" 1286 + checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" 1287 + dependencies = [ 1288 + "base64", 1289 + "bytes", 1290 + "futures-channel", 1291 + "futures-util", 1292 + "http", 1293 + "http-body", 1294 + "hyper", 1295 + "ipnet", 1296 + "libc", 1297 + "percent-encoding", 1298 + "pin-project-lite", 1299 + "socket2 0.6.2", 1300 + "tokio", 1301 + "tower-service", 1302 + "tracing", 1303 + ] 1304 + 1305 + [[package]] 1306 + name = "iana-time-zone" 1307 + version = "0.1.65" 1308 + source = "registry+https://github.com/rust-lang/crates.io-index" 1309 + checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" 1310 + dependencies = [ 1311 + "android_system_properties", 1312 + "core-foundation-sys", 1313 + "iana-time-zone-haiku", 1314 + "js-sys", 1315 + "log", 1316 + "wasm-bindgen", 1317 + "windows-core", 1318 + ] 1319 + 1320 + [[package]] 1321 + name = "iana-time-zone-haiku" 1322 + version = "0.1.2" 1323 + source = "registry+https://github.com/rust-lang/crates.io-index" 1324 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1325 + dependencies = [ 1326 + "cc", 1327 + ] 1328 + 1329 + [[package]] 1330 + name = "icu_collections" 1331 + version = "2.1.1" 1332 + source = "registry+https://github.com/rust-lang/crates.io-index" 1333 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 1334 + dependencies = [ 1335 + "displaydoc", 1336 + "potential_utf", 1337 + "yoke", 1338 + "zerofrom", 1339 + "zerovec", 1340 + ] 1341 + 1342 + [[package]] 1343 + name = "icu_locale_core" 1344 + version = "2.1.1" 1345 + source = "registry+https://github.com/rust-lang/crates.io-index" 1346 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 1347 + dependencies = [ 1348 + "displaydoc", 1349 + "litemap", 1350 + "tinystr", 1351 + "writeable", 1352 + "zerovec", 1353 + ] 1354 + 1355 + [[package]] 1356 + name = "icu_normalizer" 1357 + version = "2.1.1" 1358 + source = "registry+https://github.com/rust-lang/crates.io-index" 1359 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 1360 + dependencies = [ 1361 + "icu_collections", 1362 + "icu_normalizer_data", 1363 + "icu_properties", 1364 + "icu_provider", 1365 + "smallvec", 1366 + "zerovec", 1367 + ] 1368 + 1369 + [[package]] 1370 + name = "icu_normalizer_data" 1371 + version = "2.1.1" 1372 + source = "registry+https://github.com/rust-lang/crates.io-index" 1373 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 1374 + 1375 + [[package]] 1376 + name = "icu_properties" 1377 + version = "2.1.2" 1378 + source = "registry+https://github.com/rust-lang/crates.io-index" 1379 + checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" 1380 + dependencies = [ 1381 + "icu_collections", 1382 + "icu_locale_core", 1383 + "icu_properties_data", 1384 + "icu_provider", 1385 + "zerotrie", 1386 + "zerovec", 1387 + ] 1388 + 1389 + [[package]] 1390 + name = "icu_properties_data" 1391 + version = "2.1.2" 1392 + source = "registry+https://github.com/rust-lang/crates.io-index" 1393 + checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" 1394 + 1395 + [[package]] 1396 + name = "icu_provider" 1397 + version = "2.1.1" 1398 + source = "registry+https://github.com/rust-lang/crates.io-index" 1399 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 1400 + dependencies = [ 1401 + "displaydoc", 1402 + "icu_locale_core", 1403 + "writeable", 1404 + "yoke", 1405 + "zerofrom", 1406 + "zerotrie", 1407 + "zerovec", 1408 + ] 1409 + 1410 + [[package]] 1411 + name = "id-arena" 1412 + version = "2.3.0" 1413 + source = "registry+https://github.com/rust-lang/crates.io-index" 1414 + checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" 1415 + 1416 + [[package]] 1417 + name = "ident_case" 1418 + version = "1.0.1" 1419 + source = "registry+https://github.com/rust-lang/crates.io-index" 1420 + checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1421 + 1422 + [[package]] 1423 + name = "identity-hash" 1424 + version = "0.1.0" 1425 + source = "registry+https://github.com/rust-lang/crates.io-index" 1426 + checksum = "dfdd7caa900436d8f13b2346fe10257e0c05c1f1f9e351f4f5d57c03bd5f45da" 1427 + 1428 + [[package]] 1429 + name = "idna" 1430 + version = "1.1.0" 1431 + source = "registry+https://github.com/rust-lang/crates.io-index" 1432 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1433 + dependencies = [ 1434 + "idna_adapter", 1435 + "smallvec", 1436 + "utf8_iter", 1437 + ] 1438 + 1439 + [[package]] 1440 + name = "idna_adapter" 1441 + version = "1.2.1" 1442 + source = "registry+https://github.com/rust-lang/crates.io-index" 1443 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 1444 + dependencies = [ 1445 + "icu_normalizer", 1446 + "icu_properties", 1447 + ] 1448 + 1449 + [[package]] 1450 + name = "igd-next" 1451 + version = "0.16.2" 1452 + source = "registry+https://github.com/rust-lang/crates.io-index" 1453 + checksum = "516893339c97f6011282d5825ac94fc1c7aad5cad26bdc2d0cee068c0bf97f97" 1454 + dependencies = [ 1455 + "async-trait", 1456 + "attohttpc", 1457 + "bytes", 1458 + "futures", 1459 + "http", 1460 + "http-body-util", 1461 + "hyper", 1462 + "hyper-util", 1463 + "log", 1464 + "rand 0.9.2", 1465 + "tokio", 1466 + "url", 1467 + "xmltree", 1468 + ] 1469 + 1470 + [[package]] 1471 + name = "indexmap" 1472 + version = "2.13.0" 1473 + source = "registry+https://github.com/rust-lang/crates.io-index" 1474 + checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" 1475 + dependencies = [ 1476 + "equivalent", 1477 + "hashbrown 0.16.1", 1478 + "serde", 1479 + "serde_core", 1480 + ] 1481 + 1482 + [[package]] 1483 + name = "ipconfig" 1484 + version = "0.3.2" 1485 + source = "registry+https://github.com/rust-lang/crates.io-index" 1486 + checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" 1487 + dependencies = [ 1488 + "socket2 0.5.10", 1489 + "widestring", 1490 + "windows-sys 0.48.0", 1491 + "winreg", 1492 + ] 1493 + 1494 + [[package]] 1495 + name = "ipnet" 1496 + version = "2.11.0" 1497 + source = "registry+https://github.com/rust-lang/crates.io-index" 1498 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1499 + 1500 + [[package]] 1501 + name = "iri-string" 1502 + version = "0.7.10" 1503 + source = "registry+https://github.com/rust-lang/crates.io-index" 1504 + checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" 1505 + dependencies = [ 1506 + "memchr", 1507 + "serde", 1508 + ] 1509 + 1510 + [[package]] 1511 + name = "iroh" 1512 + version = "0.96.1" 1513 + source = "registry+https://github.com/rust-lang/crates.io-index" 1514 + checksum = "5236da4d5681f317ec393c8fe2b7e3d360d31c6bb40383991d0b7429ca5ad117" 1515 + dependencies = [ 1516 + "backon", 1517 + "bytes", 1518 + "cfg_aliases", 1519 + "data-encoding", 1520 + "derive_more", 1521 + "ed25519-dalek", 1522 + "futures-util", 1523 + "getrandom 0.3.4", 1524 + "hickory-resolver", 1525 + "http", 1526 + "igd-next", 1527 + "iroh-base", 1528 + "iroh-metrics", 1529 + "iroh-quinn", 1530 + "iroh-quinn-proto", 1531 + "iroh-quinn-udp", 1532 + "iroh-relay", 1533 + "n0-error", 1534 + "n0-future", 1535 + "n0-watcher", 1536 + "netdev", 1537 + "netwatch", 1538 + "papaya", 1539 + "pin-project", 1540 + "pkarr", 1541 + "pkcs8", 1542 + "portmapper", 1543 + "rand 0.9.2", 1544 + "reqwest 0.12.28", 1545 + "rustc-hash", 1546 + "rustls", 1547 + "rustls-pki-types", 1548 + "rustls-webpki", 1549 + "serde", 1550 + "smallvec", 1551 + "strum", 1552 + "swarm-discovery", 1553 + "sync_wrapper", 1554 + "time", 1555 + "tokio", 1556 + "tokio-stream", 1557 + "tokio-util", 1558 + "tracing", 1559 + "url", 1560 + "wasm-bindgen-futures", 1561 + "webpki-roots", 1562 + ] 1563 + 1564 + [[package]] 1565 + name = "iroh-base" 1566 + version = "0.96.1" 1567 + source = "registry+https://github.com/rust-lang/crates.io-index" 1568 + checksum = "20c99d836a1c99e037e98d1bf3ef209c3a4df97555a00ce9510eb78eccdf5567" 1569 + dependencies = [ 1570 + "curve25519-dalek", 1571 + "data-encoding", 1572 + "derive_more", 1573 + "digest", 1574 + "ed25519-dalek", 1575 + "n0-error", 1576 + "rand_core 0.9.5", 1577 + "serde", 1578 + "sha2", 1579 + "url", 1580 + "zeroize", 1581 + "zeroize_derive", 1582 + ] 1583 + 1584 + [[package]] 1585 + name = "iroh-metrics" 1586 + version = "0.38.2" 1587 + source = "registry+https://github.com/rust-lang/crates.io-index" 1588 + checksum = "c946095f060e6e59b9ff30cc26c75cdb758e7fb0cde8312c89e2144654989fcb" 1589 + dependencies = [ 1590 + "iroh-metrics-derive", 1591 + "itoa", 1592 + "n0-error", 1593 + "postcard", 1594 + "ryu", 1595 + "serde", 1596 + "tracing", 1597 + ] 1598 + 1599 + [[package]] 1600 + name = "iroh-metrics-derive" 1601 + version = "0.4.1" 1602 + source = "registry+https://github.com/rust-lang/crates.io-index" 1603 + checksum = "cab063c2bfd6c3d5a33a913d4fdb5252f140db29ec67c704f20f3da7e8f92dbf" 1604 + dependencies = [ 1605 + "heck", 1606 + "proc-macro2", 1607 + "quote", 1608 + "syn", 1609 + ] 1610 + 1611 + [[package]] 1612 + name = "iroh-quinn" 1613 + version = "0.16.1" 1614 + source = "registry+https://github.com/rust-lang/crates.io-index" 1615 + checksum = "034ed21f34c657a123d39525d948c885aacba59508805e4dd67d71f022e7151b" 1616 + dependencies = [ 1617 + "bytes", 1618 + "cfg_aliases", 1619 + "iroh-quinn-proto", 1620 + "iroh-quinn-udp", 1621 + "pin-project-lite", 1622 + "rustc-hash", 1623 + "rustls", 1624 + "socket2 0.6.2", 1625 + "thiserror 2.0.18", 1626 + "tokio", 1627 + "tokio-stream", 1628 + "tracing", 1629 + "web-time", 1630 + ] 1631 + 1632 + [[package]] 1633 + name = "iroh-quinn-proto" 1634 + version = "0.15.1" 1635 + source = "registry+https://github.com/rust-lang/crates.io-index" 1636 + checksum = "0de99ad8adc878ee0e68509ad256152ce23b8bbe45f5539d04e179630aca40a9" 1637 + dependencies = [ 1638 + "bytes", 1639 + "derive_more", 1640 + "enum-assoc", 1641 + "fastbloom", 1642 + "getrandom 0.3.4", 1643 + "identity-hash", 1644 + "lru-slab", 1645 + "rand 0.9.2", 1646 + "ring", 1647 + "rustc-hash", 1648 + "rustls", 1649 + "rustls-pki-types", 1650 + "slab", 1651 + "sorted-index-buffer", 1652 + "thiserror 2.0.18", 1653 + "tinyvec", 1654 + "tracing", 1655 + "web-time", 1656 + ] 1657 + 1658 + [[package]] 1659 + name = "iroh-quinn-udp" 1660 + version = "0.8.0" 1661 + source = "registry+https://github.com/rust-lang/crates.io-index" 1662 + checksum = "f981dadd5a072a9e0efcd24bdcc388e570073f7e51b33505ceb1ef4668c80c86" 1663 + dependencies = [ 1664 + "cfg_aliases", 1665 + "libc", 1666 + "socket2 0.6.2", 1667 + "tracing", 1668 + "windows-sys 0.61.2", 1669 + ] 1670 + 1671 + [[package]] 1672 + name = "iroh-relay" 1673 + version = "0.96.1" 1674 + source = "registry+https://github.com/rust-lang/crates.io-index" 1675 + checksum = "cd2b63e654b9dec799a73372cdc79b529ca6c7248c0c8de7da78a02e3a46f03c" 1676 + dependencies = [ 1677 + "blake3", 1678 + "bytes", 1679 + "cfg_aliases", 1680 + "data-encoding", 1681 + "derive_more", 1682 + "getrandom 0.3.4", 1683 + "hickory-resolver", 1684 + "http", 1685 + "http-body-util", 1686 + "hyper", 1687 + "hyper-util", 1688 + "iroh-base", 1689 + "iroh-metrics", 1690 + "iroh-quinn", 1691 + "iroh-quinn-proto", 1692 + "lru", 1693 + "n0-error", 1694 + "n0-future", 1695 + "num_enum", 1696 + "pin-project", 1697 + "pkarr", 1698 + "postcard", 1699 + "rand 0.9.2", 1700 + "reqwest 0.12.28", 1701 + "rustls", 1702 + "rustls-pki-types", 1703 + "serde", 1704 + "serde_bytes", 1705 + "strum", 1706 + "tokio", 1707 + "tokio-rustls", 1708 + "tokio-util", 1709 + "tokio-websockets", 1710 + "tracing", 1711 + "url", 1712 + "vergen-gitcl", 1713 + "webpki-roots", 1714 + "ws_stream_wasm", 1715 + "z32", 1716 + ] 1717 + 1718 + [[package]] 1719 + name = "is_terminal_polyfill" 1720 + version = "1.70.2" 1721 + source = "registry+https://github.com/rust-lang/crates.io-index" 1722 + checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" 1723 + 1724 + [[package]] 1725 + name = "itertools" 1726 + version = "0.14.0" 1727 + source = "registry+https://github.com/rust-lang/crates.io-index" 1728 + checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 1729 + dependencies = [ 1730 + "either", 1731 + ] 1732 + 1733 + [[package]] 1734 + name = "itoa" 1735 + version = "1.0.17" 1736 + source = "registry+https://github.com/rust-lang/crates.io-index" 1737 + checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" 1738 + 1739 + [[package]] 1740 + name = "jiff" 1741 + version = "0.2.20" 1742 + source = "registry+https://github.com/rust-lang/crates.io-index" 1743 + checksum = "c867c356cc096b33f4981825ab281ecba3db0acefe60329f044c1789d94c6543" 1744 + dependencies = [ 1745 + "jiff-static", 1746 + "log", 1747 + "portable-atomic", 1748 + "portable-atomic-util", 1749 + "serde_core", 1750 + ] 1751 + 1752 + [[package]] 1753 + name = "jiff-static" 1754 + version = "0.2.20" 1755 + source = "registry+https://github.com/rust-lang/crates.io-index" 1756 + checksum = "f7946b4325269738f270bb55b3c19ab5c5040525f83fd625259422a9d25d9be5" 1757 + dependencies = [ 1758 + "proc-macro2", 1759 + "quote", 1760 + "syn", 1761 + ] 1762 + 1763 + [[package]] 1764 + name = "jni" 1765 + version = "0.21.1" 1766 + source = "registry+https://github.com/rust-lang/crates.io-index" 1767 + checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 1768 + dependencies = [ 1769 + "cesu8", 1770 + "cfg-if", 1771 + "combine", 1772 + "jni-sys", 1773 + "log", 1774 + "thiserror 1.0.69", 1775 + "walkdir", 1776 + "windows-sys 0.45.0", 1777 + ] 1778 + 1779 + [[package]] 1780 + name = "jni-sys" 1781 + version = "0.3.0" 1782 + source = "registry+https://github.com/rust-lang/crates.io-index" 1783 + checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 1784 + 1785 + [[package]] 1786 + name = "jobserver" 1787 + version = "0.1.34" 1788 + source = "registry+https://github.com/rust-lang/crates.io-index" 1789 + checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 1790 + dependencies = [ 1791 + "getrandom 0.3.4", 1792 + "libc", 1793 + ] 1794 + 1795 + [[package]] 1796 + name = "js-sys" 1797 + version = "0.3.85" 1798 + source = "registry+https://github.com/rust-lang/crates.io-index" 1799 + checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" 1800 + dependencies = [ 1801 + "once_cell", 1802 + "wasm-bindgen", 1803 + ] 1804 + 1805 + [[package]] 1806 + name = "lazy_static" 1807 + version = "1.5.0" 1808 + source = "registry+https://github.com/rust-lang/crates.io-index" 1809 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1810 + 1811 + [[package]] 1812 + name = "leb128fmt" 1813 + version = "0.1.0" 1814 + source = "registry+https://github.com/rust-lang/crates.io-index" 1815 + checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 1816 + 1817 + [[package]] 1818 + name = "libc" 1819 + version = "0.2.182" 1820 + source = "registry+https://github.com/rust-lang/crates.io-index" 1821 + checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" 1822 + 1823 + [[package]] 1824 + name = "libm" 1825 + version = "0.2.16" 1826 + source = "registry+https://github.com/rust-lang/crates.io-index" 1827 + checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" 1828 + 1829 + [[package]] 1830 + name = "litemap" 1831 + version = "0.8.1" 1832 + source = "registry+https://github.com/rust-lang/crates.io-index" 1833 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 1834 + 1835 + [[package]] 1836 + name = "litrs" 1837 + version = "1.0.0" 1838 + source = "registry+https://github.com/rust-lang/crates.io-index" 1839 + checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" 1840 + 1841 + [[package]] 1842 + name = "lock_api" 1843 + version = "0.4.14" 1844 + source = "registry+https://github.com/rust-lang/crates.io-index" 1845 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 1846 + dependencies = [ 1847 + "scopeguard", 1848 + ] 1849 + 1850 + [[package]] 1851 + name = "log" 1852 + version = "0.4.29" 1853 + source = "registry+https://github.com/rust-lang/crates.io-index" 1854 + checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 1855 + 1856 + [[package]] 1857 + name = "loom" 1858 + version = "0.7.2" 1859 + source = "registry+https://github.com/rust-lang/crates.io-index" 1860 + checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" 1861 + dependencies = [ 1862 + "cfg-if", 1863 + "generator", 1864 + "scoped-tls", 1865 + "tracing", 1866 + "tracing-subscriber", 1867 + ] 1868 + 1869 + [[package]] 1870 + name = "lru" 1871 + version = "0.16.3" 1872 + source = "registry+https://github.com/rust-lang/crates.io-index" 1873 + checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" 1874 + dependencies = [ 1875 + "hashbrown 0.16.1", 1876 + ] 1877 + 1878 + [[package]] 1879 + name = "lru-slab" 1880 + version = "0.1.2" 1881 + source = "registry+https://github.com/rust-lang/crates.io-index" 1882 + checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 1883 + 1884 + [[package]] 1885 + name = "mac-addr" 1886 + version = "0.3.0" 1887 + source = "registry+https://github.com/rust-lang/crates.io-index" 1888 + checksum = "d3d25b0e0b648a86960ac23b7ad4abb9717601dec6f66c165f5b037f3f03065f" 1889 + 1890 + [[package]] 1891 + name = "matchers" 1892 + version = "0.2.0" 1893 + source = "registry+https://github.com/rust-lang/crates.io-index" 1894 + checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" 1895 + dependencies = [ 1896 + "regex-automata", 1897 + ] 1898 + 1899 + [[package]] 1900 + name = "memchr" 1901 + version = "2.8.0" 1902 + source = "registry+https://github.com/rust-lang/crates.io-index" 1903 + checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" 1904 + 1905 + [[package]] 1906 + name = "mio" 1907 + version = "1.1.1" 1908 + source = "registry+https://github.com/rust-lang/crates.io-index" 1909 + checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" 1910 + dependencies = [ 1911 + "libc", 1912 + "wasi", 1913 + "windows-sys 0.61.2", 1914 + ] 1915 + 1916 + [[package]] 1917 + name = "moka" 1918 + version = "0.12.13" 1919 + source = "registry+https://github.com/rust-lang/crates.io-index" 1920 + checksum = "b4ac832c50ced444ef6be0767a008b02c106a909ba79d1d830501e94b96f6b7e" 1921 + dependencies = [ 1922 + "crossbeam-channel", 1923 + "crossbeam-epoch", 1924 + "crossbeam-utils", 1925 + "equivalent", 1926 + "parking_lot", 1927 + "portable-atomic", 1928 + "smallvec", 1929 + "tagptr", 1930 + "uuid", 1931 + ] 1932 + 1933 + [[package]] 1934 + name = "n0-error" 1935 + version = "0.1.3" 1936 + source = "registry+https://github.com/rust-lang/crates.io-index" 1937 + checksum = "af4782b4baf92d686d161c15460c83d16ebcfd215918763903e9619842665cae" 1938 + dependencies = [ 1939 + "n0-error-macros", 1940 + "spez", 1941 + ] 1942 + 1943 + [[package]] 1944 + name = "n0-error-macros" 1945 + version = "0.1.3" 1946 + source = "registry+https://github.com/rust-lang/crates.io-index" 1947 + checksum = "03755949235714b2b307e5ae89dd8c1c2531fb127d9b8b7b4adf9c876cd3ed18" 1948 + dependencies = [ 1949 + "proc-macro2", 1950 + "quote", 1951 + "syn", 1952 + ] 1953 + 1954 + [[package]] 1955 + name = "n0-future" 1956 + version = "0.3.2" 1957 + source = "registry+https://github.com/rust-lang/crates.io-index" 1958 + checksum = "e2ab99dfb861450e68853d34ae665243a88b8c493d01ba957321a1e9b2312bbe" 1959 + dependencies = [ 1960 + "cfg_aliases", 1961 + "derive_more", 1962 + "futures-buffered", 1963 + "futures-lite", 1964 + "futures-util", 1965 + "js-sys", 1966 + "pin-project", 1967 + "send_wrapper", 1968 + "tokio", 1969 + "tokio-util", 1970 + "wasm-bindgen", 1971 + "wasm-bindgen-futures", 1972 + "web-time", 1973 + ] 1974 + 1975 + [[package]] 1976 + name = "n0-watcher" 1977 + version = "0.6.1" 1978 + source = "registry+https://github.com/rust-lang/crates.io-index" 1979 + checksum = "38795f7932e6e9d1c6e989270ef5b3ff24ebb910e2c9d4bed2d28d8bae3007dc" 1980 + dependencies = [ 1981 + "derive_more", 1982 + "n0-error", 1983 + "n0-future", 1984 + ] 1985 + 1986 + [[package]] 1987 + name = "netdev" 1988 + version = "0.40.0" 1989 + source = "registry+https://github.com/rust-lang/crates.io-index" 1990 + checksum = "dc9815643a243856e7bd84524e1ff739e901e846cfb06ad9627cd2b6d59bd737" 1991 + dependencies = [ 1992 + "block2", 1993 + "dispatch2", 1994 + "dlopen2", 1995 + "ipnet", 1996 + "libc", 1997 + "mac-addr", 1998 + "netlink-packet-core", 1999 + "netlink-packet-route 0.25.1", 2000 + "netlink-sys", 2001 + "objc2-core-foundation", 2002 + "objc2-system-configuration", 2003 + "once_cell", 2004 + "plist", 2005 + "windows-sys 0.59.0", 2006 + ] 2007 + 2008 + [[package]] 2009 + name = "netlink-packet-core" 2010 + version = "0.8.1" 2011 + source = "registry+https://github.com/rust-lang/crates.io-index" 2012 + checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" 2013 + dependencies = [ 2014 + "paste", 2015 + ] 2016 + 2017 + [[package]] 2018 + name = "netlink-packet-route" 2019 + version = "0.25.1" 2020 + source = "registry+https://github.com/rust-lang/crates.io-index" 2021 + checksum = "3ec2f5b6839be2a19d7fa5aab5bc444380f6311c2b693551cb80f45caaa7b5ef" 2022 + dependencies = [ 2023 + "bitflags", 2024 + "libc", 2025 + "log", 2026 + "netlink-packet-core", 2027 + ] 2028 + 2029 + [[package]] 2030 + name = "netlink-packet-route" 2031 + version = "0.28.0" 2032 + source = "registry+https://github.com/rust-lang/crates.io-index" 2033 + checksum = "4ce3636fa715e988114552619582b530481fd5ef176a1e5c1bf024077c2c9445" 2034 + dependencies = [ 2035 + "bitflags", 2036 + "libc", 2037 + "log", 2038 + "netlink-packet-core", 2039 + ] 2040 + 2041 + [[package]] 2042 + name = "netlink-proto" 2043 + version = "0.12.0" 2044 + source = "registry+https://github.com/rust-lang/crates.io-index" 2045 + checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" 2046 + dependencies = [ 2047 + "bytes", 2048 + "futures", 2049 + "log", 2050 + "netlink-packet-core", 2051 + "netlink-sys", 2052 + "thiserror 2.0.18", 2053 + ] 2054 + 2055 + [[package]] 2056 + name = "netlink-sys" 2057 + version = "0.8.8" 2058 + source = "registry+https://github.com/rust-lang/crates.io-index" 2059 + checksum = "cd6c30ed10fa69cc491d491b85cc971f6bdeb8e7367b7cde2ee6cc878d583fae" 2060 + dependencies = [ 2061 + "bytes", 2062 + "futures-util", 2063 + "libc", 2064 + "log", 2065 + "tokio", 2066 + ] 2067 + 2068 + [[package]] 2069 + name = "netwatch" 2070 + version = "0.14.0" 2071 + source = "registry+https://github.com/rust-lang/crates.io-index" 2072 + checksum = "454b8c0759b2097581f25ed5180b4a1d14c324fde6d0734932a288e044d06232" 2073 + dependencies = [ 2074 + "atomic-waker", 2075 + "bytes", 2076 + "cfg_aliases", 2077 + "derive_more", 2078 + "iroh-quinn-udp", 2079 + "js-sys", 2080 + "libc", 2081 + "n0-error", 2082 + "n0-future", 2083 + "n0-watcher", 2084 + "netdev", 2085 + "netlink-packet-core", 2086 + "netlink-packet-route 0.28.0", 2087 + "netlink-proto", 2088 + "netlink-sys", 2089 + "objc2-core-foundation", 2090 + "objc2-system-configuration", 2091 + "pin-project-lite", 2092 + "serde", 2093 + "socket2 0.6.2", 2094 + "time", 2095 + "tokio", 2096 + "tokio-util", 2097 + "tracing", 2098 + "web-sys", 2099 + "windows", 2100 + "windows-result", 2101 + "wmi", 2102 + ] 2103 + 2104 + [[package]] 2105 + name = "ntimestamp" 2106 + version = "1.0.0" 2107 + source = "registry+https://github.com/rust-lang/crates.io-index" 2108 + checksum = "c50f94c405726d3e0095e89e72f75ce7f6587b94a8bd8dc8054b73f65c0fd68c" 2109 + dependencies = [ 2110 + "base32", 2111 + "document-features", 2112 + "getrandom 0.2.17", 2113 + "httpdate", 2114 + "js-sys", 2115 + "once_cell", 2116 + "serde", 2117 + ] 2118 + 2119 + [[package]] 2120 + name = "nu-ansi-term" 2121 + version = "0.50.3" 2122 + source = "registry+https://github.com/rust-lang/crates.io-index" 2123 + checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" 2124 + dependencies = [ 2125 + "windows-sys 0.61.2", 2126 + ] 2127 + 2128 + [[package]] 2129 + name = "num-conv" 2130 + version = "0.2.0" 2131 + source = "registry+https://github.com/rust-lang/crates.io-index" 2132 + checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" 2133 + 2134 + [[package]] 2135 + name = "num-traits" 2136 + version = "0.2.19" 2137 + source = "registry+https://github.com/rust-lang/crates.io-index" 2138 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2139 + dependencies = [ 2140 + "autocfg", 2141 + ] 2142 + 2143 + [[package]] 2144 + name = "num_enum" 2145 + version = "0.7.5" 2146 + source = "registry+https://github.com/rust-lang/crates.io-index" 2147 + checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 2148 + dependencies = [ 2149 + "num_enum_derive", 2150 + "rustversion", 2151 + ] 2152 + 2153 + [[package]] 2154 + name = "num_enum_derive" 2155 + version = "0.7.5" 2156 + source = "registry+https://github.com/rust-lang/crates.io-index" 2157 + checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 2158 + dependencies = [ 2159 + "proc-macro-crate", 2160 + "proc-macro2", 2161 + "quote", 2162 + "syn", 2163 + ] 2164 + 2165 + [[package]] 2166 + name = "num_threads" 2167 + version = "0.1.7" 2168 + source = "registry+https://github.com/rust-lang/crates.io-index" 2169 + checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 2170 + dependencies = [ 2171 + "libc", 2172 + ] 2173 + 2174 + [[package]] 2175 + name = "objc2" 2176 + version = "0.6.3" 2177 + source = "registry+https://github.com/rust-lang/crates.io-index" 2178 + checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 2179 + dependencies = [ 2180 + "objc2-encode", 2181 + ] 2182 + 2183 + [[package]] 2184 + name = "objc2-core-foundation" 2185 + version = "0.3.2" 2186 + source = "registry+https://github.com/rust-lang/crates.io-index" 2187 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 2188 + dependencies = [ 2189 + "bitflags", 2190 + "block2", 2191 + "dispatch2", 2192 + "libc", 2193 + "objc2", 2194 + ] 2195 + 2196 + [[package]] 2197 + name = "objc2-encode" 2198 + version = "4.1.0" 2199 + source = "registry+https://github.com/rust-lang/crates.io-index" 2200 + checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" 2201 + 2202 + [[package]] 2203 + name = "objc2-security" 2204 + version = "0.3.2" 2205 + source = "registry+https://github.com/rust-lang/crates.io-index" 2206 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 2207 + dependencies = [ 2208 + "bitflags", 2209 + "objc2", 2210 + "objc2-core-foundation", 2211 + ] 2212 + 2213 + [[package]] 2214 + name = "objc2-system-configuration" 2215 + version = "0.3.2" 2216 + source = "registry+https://github.com/rust-lang/crates.io-index" 2217 + checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" 2218 + dependencies = [ 2219 + "bitflags", 2220 + "dispatch2", 2221 + "libc", 2222 + "objc2", 2223 + "objc2-core-foundation", 2224 + "objc2-security", 2225 + ] 2226 + 2227 + [[package]] 2228 + name = "once_cell" 2229 + version = "1.21.3" 2230 + source = "registry+https://github.com/rust-lang/crates.io-index" 2231 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 2232 + dependencies = [ 2233 + "critical-section", 2234 + "portable-atomic", 2235 + ] 2236 + 2237 + [[package]] 2238 + name = "once_cell_polyfill" 2239 + version = "1.70.2" 2240 + source = "registry+https://github.com/rust-lang/crates.io-index" 2241 + checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" 2242 + 2243 + [[package]] 2244 + name = "openssl-probe" 2245 + version = "0.2.1" 2246 + source = "registry+https://github.com/rust-lang/crates.io-index" 2247 + checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" 2248 + 2249 + [[package]] 2250 + name = "p2p_beaver" 2251 + version = "0.1.0" 2252 + dependencies = [ 2253 + "env_logger", 2254 + "iroh", 2255 + "log", 2256 + "n0-error", 2257 + "n0-future", 2258 + "parking_lot", 2259 + "petname", 2260 + "postcard", 2261 + "serde", 2262 + "thiserror 2.0.18", 2263 + "tokio", 2264 + ] 2265 + 2266 + [[package]] 2267 + name = "papaya" 2268 + version = "0.2.3" 2269 + source = "registry+https://github.com/rust-lang/crates.io-index" 2270 + checksum = "f92dd0b07c53a0a0c764db2ace8c541dc47320dad97c2200c2a637ab9dd2328f" 2271 + dependencies = [ 2272 + "equivalent", 2273 + "seize", 2274 + ] 2275 + 2276 + [[package]] 2277 + name = "parking" 2278 + version = "2.2.1" 2279 + source = "registry+https://github.com/rust-lang/crates.io-index" 2280 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 2281 + 2282 + [[package]] 2283 + name = "parking_lot" 2284 + version = "0.12.5" 2285 + source = "registry+https://github.com/rust-lang/crates.io-index" 2286 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 2287 + dependencies = [ 2288 + "lock_api", 2289 + "parking_lot_core", 2290 + ] 2291 + 2292 + [[package]] 2293 + name = "parking_lot_core" 2294 + version = "0.9.12" 2295 + source = "registry+https://github.com/rust-lang/crates.io-index" 2296 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 2297 + dependencies = [ 2298 + "cfg-if", 2299 + "libc", 2300 + "redox_syscall", 2301 + "smallvec", 2302 + "windows-link", 2303 + ] 2304 + 2305 + [[package]] 2306 + name = "paste" 2307 + version = "1.0.15" 2308 + source = "registry+https://github.com/rust-lang/crates.io-index" 2309 + checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 2310 + 2311 + [[package]] 2312 + name = "pem-rfc7468" 2313 + version = "1.0.0" 2314 + source = "registry+https://github.com/rust-lang/crates.io-index" 2315 + checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" 2316 + dependencies = [ 2317 + "base64ct", 2318 + ] 2319 + 2320 + [[package]] 2321 + name = "percent-encoding" 2322 + version = "2.3.2" 2323 + source = "registry+https://github.com/rust-lang/crates.io-index" 2324 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 2325 + 2326 + [[package]] 2327 + name = "petname" 2328 + version = "2.0.2" 2329 + source = "registry+https://github.com/rust-lang/crates.io-index" 2330 + checksum = "9cd31dcfdbbd7431a807ef4df6edd6473228e94d5c805e8cf671227a21bad068" 2331 + dependencies = [ 2332 + "anyhow", 2333 + "clap", 2334 + "itertools", 2335 + "proc-macro2", 2336 + "quote", 2337 + "rand 0.8.5", 2338 + ] 2339 + 2340 + [[package]] 2341 + name = "pharos" 2342 + version = "0.5.3" 2343 + source = "registry+https://github.com/rust-lang/crates.io-index" 2344 + checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" 2345 + dependencies = [ 2346 + "futures", 2347 + "rustc_version", 2348 + ] 2349 + 2350 + [[package]] 2351 + name = "pin-project" 2352 + version = "1.1.10" 2353 + source = "registry+https://github.com/rust-lang/crates.io-index" 2354 + checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 2355 + dependencies = [ 2356 + "pin-project-internal", 2357 + ] 2358 + 2359 + [[package]] 2360 + name = "pin-project-internal" 2361 + version = "1.1.10" 2362 + source = "registry+https://github.com/rust-lang/crates.io-index" 2363 + checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 2364 + dependencies = [ 2365 + "proc-macro2", 2366 + "quote", 2367 + "syn", 2368 + ] 2369 + 2370 + [[package]] 2371 + name = "pin-project-lite" 2372 + version = "0.2.16" 2373 + source = "registry+https://github.com/rust-lang/crates.io-index" 2374 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 2375 + 2376 + [[package]] 2377 + name = "pin-utils" 2378 + version = "0.1.0" 2379 + source = "registry+https://github.com/rust-lang/crates.io-index" 2380 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2381 + 2382 + [[package]] 2383 + name = "pkarr" 2384 + version = "5.0.3" 2385 + source = "registry+https://github.com/rust-lang/crates.io-index" 2386 + checksum = "2f950360d31be432c0c9467fba5024a94f55128e7f32bc9d32db140369f24c77" 2387 + dependencies = [ 2388 + "async-compat", 2389 + "base32", 2390 + "bytes", 2391 + "cfg_aliases", 2392 + "document-features", 2393 + "dyn-clone", 2394 + "ed25519-dalek", 2395 + "futures-buffered", 2396 + "futures-lite", 2397 + "getrandom 0.4.1", 2398 + "log", 2399 + "lru", 2400 + "ntimestamp", 2401 + "reqwest 0.13.2", 2402 + "self_cell", 2403 + "serde", 2404 + "sha1_smol", 2405 + "simple-dns", 2406 + "thiserror 2.0.18", 2407 + "tokio", 2408 + "tracing", 2409 + "url", 2410 + "wasm-bindgen-futures", 2411 + ] 2412 + 2413 + [[package]] 2414 + name = "pkcs8" 2415 + version = "0.11.0-rc.11" 2416 + source = "registry+https://github.com/rust-lang/crates.io-index" 2417 + checksum = "12922b6296c06eb741b02d7b5161e3aaa22864af38dfa025a1a3ba3f68c84577" 2418 + dependencies = [ 2419 + "der", 2420 + "spki", 2421 + ] 2422 + 2423 + [[package]] 2424 + name = "plist" 2425 + version = "1.8.0" 2426 + source = "registry+https://github.com/rust-lang/crates.io-index" 2427 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 2428 + dependencies = [ 2429 + "base64", 2430 + "indexmap", 2431 + "quick-xml", 2432 + "serde", 2433 + "time", 2434 + ] 2435 + 2436 + [[package]] 2437 + name = "portable-atomic" 2438 + version = "1.13.1" 2439 + source = "registry+https://github.com/rust-lang/crates.io-index" 2440 + checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" 2441 + 2442 + [[package]] 2443 + name = "portable-atomic-util" 2444 + version = "0.2.5" 2445 + source = "registry+https://github.com/rust-lang/crates.io-index" 2446 + checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" 2447 + dependencies = [ 2448 + "portable-atomic", 2449 + ] 2450 + 2451 + [[package]] 2452 + name = "portmapper" 2453 + version = "0.14.0" 2454 + source = "registry+https://github.com/rust-lang/crates.io-index" 2455 + checksum = "7d2a8825353ace3285138da3378b1e21860d60351942f7aa3b99b13b41f80318" 2456 + dependencies = [ 2457 + "base64", 2458 + "bytes", 2459 + "derive_more", 2460 + "futures-lite", 2461 + "futures-util", 2462 + "hyper-util", 2463 + "igd-next", 2464 + "iroh-metrics", 2465 + "libc", 2466 + "n0-error", 2467 + "netwatch", 2468 + "num_enum", 2469 + "rand 0.9.2", 2470 + "serde", 2471 + "smallvec", 2472 + "socket2 0.6.2", 2473 + "time", 2474 + "tokio", 2475 + "tokio-util", 2476 + "tower-layer", 2477 + "tracing", 2478 + "url", 2479 + ] 2480 + 2481 + [[package]] 2482 + name = "postcard" 2483 + version = "1.1.3" 2484 + source = "registry+https://github.com/rust-lang/crates.io-index" 2485 + checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" 2486 + dependencies = [ 2487 + "cobs", 2488 + "embedded-io 0.4.0", 2489 + "embedded-io 0.6.1", 2490 + "heapless", 2491 + "postcard-derive", 2492 + "serde", 2493 + ] 2494 + 2495 + [[package]] 2496 + name = "postcard-derive" 2497 + version = "0.2.2" 2498 + source = "registry+https://github.com/rust-lang/crates.io-index" 2499 + checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" 2500 + dependencies = [ 2501 + "proc-macro2", 2502 + "quote", 2503 + "syn", 2504 + ] 2505 + 2506 + [[package]] 2507 + name = "potential_utf" 2508 + version = "0.1.4" 2509 + source = "registry+https://github.com/rust-lang/crates.io-index" 2510 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 2511 + dependencies = [ 2512 + "zerovec", 2513 + ] 2514 + 2515 + [[package]] 2516 + name = "powerfmt" 2517 + version = "0.2.0" 2518 + source = "registry+https://github.com/rust-lang/crates.io-index" 2519 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 2520 + 2521 + [[package]] 2522 + name = "ppv-lite86" 2523 + version = "0.2.21" 2524 + source = "registry+https://github.com/rust-lang/crates.io-index" 2525 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 2526 + dependencies = [ 2527 + "zerocopy", 2528 + ] 2529 + 2530 + [[package]] 2531 + name = "prettyplease" 2532 + version = "0.2.37" 2533 + source = "registry+https://github.com/rust-lang/crates.io-index" 2534 + checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 2535 + dependencies = [ 2536 + "proc-macro2", 2537 + "syn", 2538 + ] 2539 + 2540 + [[package]] 2541 + name = "proc-macro-crate" 2542 + version = "3.4.0" 2543 + source = "registry+https://github.com/rust-lang/crates.io-index" 2544 + checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 2545 + dependencies = [ 2546 + "toml_edit", 2547 + ] 2548 + 2549 + [[package]] 2550 + name = "proc-macro2" 2551 + version = "1.0.106" 2552 + source = "registry+https://github.com/rust-lang/crates.io-index" 2553 + checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" 2554 + dependencies = [ 2555 + "unicode-ident", 2556 + ] 2557 + 2558 + [[package]] 2559 + name = "quick-xml" 2560 + version = "0.38.4" 2561 + source = "registry+https://github.com/rust-lang/crates.io-index" 2562 + checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" 2563 + dependencies = [ 2564 + "memchr", 2565 + ] 2566 + 2567 + [[package]] 2568 + name = "quinn" 2569 + version = "0.11.9" 2570 + source = "registry+https://github.com/rust-lang/crates.io-index" 2571 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 2572 + dependencies = [ 2573 + "bytes", 2574 + "cfg_aliases", 2575 + "pin-project-lite", 2576 + "quinn-proto", 2577 + "quinn-udp", 2578 + "rustc-hash", 2579 + "rustls", 2580 + "socket2 0.6.2", 2581 + "thiserror 2.0.18", 2582 + "tokio", 2583 + "tracing", 2584 + "web-time", 2585 + ] 2586 + 2587 + [[package]] 2588 + name = "quinn-proto" 2589 + version = "0.11.13" 2590 + source = "registry+https://github.com/rust-lang/crates.io-index" 2591 + checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 2592 + dependencies = [ 2593 + "aws-lc-rs", 2594 + "bytes", 2595 + "getrandom 0.3.4", 2596 + "lru-slab", 2597 + "rand 0.9.2", 2598 + "ring", 2599 + "rustc-hash", 2600 + "rustls", 2601 + "rustls-pki-types", 2602 + "slab", 2603 + "thiserror 2.0.18", 2604 + "tinyvec", 2605 + "tracing", 2606 + "web-time", 2607 + ] 2608 + 2609 + [[package]] 2610 + name = "quinn-udp" 2611 + version = "0.5.14" 2612 + source = "registry+https://github.com/rust-lang/crates.io-index" 2613 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 2614 + dependencies = [ 2615 + "cfg_aliases", 2616 + "libc", 2617 + "once_cell", 2618 + "socket2 0.6.2", 2619 + "tracing", 2620 + "windows-sys 0.60.2", 2621 + ] 2622 + 2623 + [[package]] 2624 + name = "quote" 2625 + version = "1.0.44" 2626 + source = "registry+https://github.com/rust-lang/crates.io-index" 2627 + checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" 2628 + dependencies = [ 2629 + "proc-macro2", 2630 + ] 2631 + 2632 + [[package]] 2633 + name = "r-efi" 2634 + version = "5.3.0" 2635 + source = "registry+https://github.com/rust-lang/crates.io-index" 2636 + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 2637 + 2638 + [[package]] 2639 + name = "rand" 2640 + version = "0.8.5" 2641 + source = "registry+https://github.com/rust-lang/crates.io-index" 2642 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2643 + dependencies = [ 2644 + "libc", 2645 + "rand_chacha 0.3.1", 2646 + "rand_core 0.6.4", 2647 + ] 2648 + 2649 + [[package]] 2650 + name = "rand" 2651 + version = "0.9.2" 2652 + source = "registry+https://github.com/rust-lang/crates.io-index" 2653 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 2654 + dependencies = [ 2655 + "rand_chacha 0.9.0", 2656 + "rand_core 0.9.5", 2657 + ] 2658 + 2659 + [[package]] 2660 + name = "rand_chacha" 2661 + version = "0.3.1" 2662 + source = "registry+https://github.com/rust-lang/crates.io-index" 2663 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2664 + dependencies = [ 2665 + "ppv-lite86", 2666 + "rand_core 0.6.4", 2667 + ] 2668 + 2669 + [[package]] 2670 + name = "rand_chacha" 2671 + version = "0.9.0" 2672 + source = "registry+https://github.com/rust-lang/crates.io-index" 2673 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 2674 + dependencies = [ 2675 + "ppv-lite86", 2676 + "rand_core 0.9.5", 2677 + ] 2678 + 2679 + [[package]] 2680 + name = "rand_core" 2681 + version = "0.6.4" 2682 + source = "registry+https://github.com/rust-lang/crates.io-index" 2683 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2684 + dependencies = [ 2685 + "getrandom 0.2.17", 2686 + ] 2687 + 2688 + [[package]] 2689 + name = "rand_core" 2690 + version = "0.9.5" 2691 + source = "registry+https://github.com/rust-lang/crates.io-index" 2692 + checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" 2693 + dependencies = [ 2694 + "getrandom 0.3.4", 2695 + ] 2696 + 2697 + [[package]] 2698 + name = "redox_syscall" 2699 + version = "0.5.18" 2700 + source = "registry+https://github.com/rust-lang/crates.io-index" 2701 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 2702 + dependencies = [ 2703 + "bitflags", 2704 + ] 2705 + 2706 + [[package]] 2707 + name = "regex" 2708 + version = "1.12.3" 2709 + source = "registry+https://github.com/rust-lang/crates.io-index" 2710 + checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" 2711 + dependencies = [ 2712 + "aho-corasick", 2713 + "memchr", 2714 + "regex-automata", 2715 + "regex-syntax", 2716 + ] 2717 + 2718 + [[package]] 2719 + name = "regex-automata" 2720 + version = "0.4.14" 2721 + source = "registry+https://github.com/rust-lang/crates.io-index" 2722 + checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" 2723 + dependencies = [ 2724 + "aho-corasick", 2725 + "memchr", 2726 + "regex-syntax", 2727 + ] 2728 + 2729 + [[package]] 2730 + name = "regex-syntax" 2731 + version = "0.8.9" 2732 + source = "registry+https://github.com/rust-lang/crates.io-index" 2733 + checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" 2734 + 2735 + [[package]] 2736 + name = "reqwest" 2737 + version = "0.12.28" 2738 + source = "registry+https://github.com/rust-lang/crates.io-index" 2739 + checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" 2740 + dependencies = [ 2741 + "base64", 2742 + "bytes", 2743 + "futures-core", 2744 + "futures-util", 2745 + "http", 2746 + "http-body", 2747 + "http-body-util", 2748 + "hyper", 2749 + "hyper-rustls", 2750 + "hyper-util", 2751 + "js-sys", 2752 + "log", 2753 + "percent-encoding", 2754 + "pin-project-lite", 2755 + "quinn", 2756 + "rustls", 2757 + "rustls-pki-types", 2758 + "serde", 2759 + "serde_json", 2760 + "serde_urlencoded", 2761 + "sync_wrapper", 2762 + "tokio", 2763 + "tokio-rustls", 2764 + "tokio-util", 2765 + "tower", 2766 + "tower-http", 2767 + "tower-service", 2768 + "url", 2769 + "wasm-bindgen", 2770 + "wasm-bindgen-futures", 2771 + "wasm-streams", 2772 + "web-sys", 2773 + "webpki-roots", 2774 + ] 2775 + 2776 + [[package]] 2777 + name = "reqwest" 2778 + version = "0.13.2" 2779 + source = "registry+https://github.com/rust-lang/crates.io-index" 2780 + checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" 2781 + dependencies = [ 2782 + "base64", 2783 + "bytes", 2784 + "futures-core", 2785 + "http", 2786 + "http-body", 2787 + "http-body-util", 2788 + "hyper", 2789 + "hyper-rustls", 2790 + "hyper-util", 2791 + "js-sys", 2792 + "log", 2793 + "percent-encoding", 2794 + "pin-project-lite", 2795 + "quinn", 2796 + "rustls", 2797 + "rustls-pki-types", 2798 + "rustls-platform-verifier", 2799 + "sync_wrapper", 2800 + "tokio", 2801 + "tokio-rustls", 2802 + "tower", 2803 + "tower-http", 2804 + "tower-service", 2805 + "url", 2806 + "wasm-bindgen", 2807 + "wasm-bindgen-futures", 2808 + "web-sys", 2809 + ] 2810 + 2811 + [[package]] 2812 + name = "resolv-conf" 2813 + version = "0.7.6" 2814 + source = "registry+https://github.com/rust-lang/crates.io-index" 2815 + checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" 2816 + 2817 + [[package]] 2818 + name = "ring" 2819 + version = "0.17.14" 2820 + source = "registry+https://github.com/rust-lang/crates.io-index" 2821 + checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 2822 + dependencies = [ 2823 + "cc", 2824 + "cfg-if", 2825 + "getrandom 0.2.17", 2826 + "libc", 2827 + "untrusted", 2828 + "windows-sys 0.52.0", 2829 + ] 2830 + 2831 + [[package]] 2832 + name = "rustc-hash" 2833 + version = "2.1.1" 2834 + source = "registry+https://github.com/rust-lang/crates.io-index" 2835 + checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 2836 + 2837 + [[package]] 2838 + name = "rustc_version" 2839 + version = "0.4.1" 2840 + source = "registry+https://github.com/rust-lang/crates.io-index" 2841 + checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 2842 + dependencies = [ 2843 + "semver", 2844 + ] 2845 + 2846 + [[package]] 2847 + name = "rustls" 2848 + version = "0.23.36" 2849 + source = "registry+https://github.com/rust-lang/crates.io-index" 2850 + checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" 2851 + dependencies = [ 2852 + "aws-lc-rs", 2853 + "log", 2854 + "once_cell", 2855 + "ring", 2856 + "rustls-pki-types", 2857 + "rustls-webpki", 2858 + "subtle", 2859 + "zeroize", 2860 + ] 2861 + 2862 + [[package]] 2863 + name = "rustls-native-certs" 2864 + version = "0.8.3" 2865 + source = "registry+https://github.com/rust-lang/crates.io-index" 2866 + checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" 2867 + dependencies = [ 2868 + "openssl-probe", 2869 + "rustls-pki-types", 2870 + "schannel", 2871 + "security-framework", 2872 + ] 2873 + 2874 + [[package]] 2875 + name = "rustls-pki-types" 2876 + version = "1.14.0" 2877 + source = "registry+https://github.com/rust-lang/crates.io-index" 2878 + checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" 2879 + dependencies = [ 2880 + "web-time", 2881 + "zeroize", 2882 + ] 2883 + 2884 + [[package]] 2885 + name = "rustls-platform-verifier" 2886 + version = "0.6.2" 2887 + source = "registry+https://github.com/rust-lang/crates.io-index" 2888 + checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" 2889 + dependencies = [ 2890 + "core-foundation", 2891 + "core-foundation-sys", 2892 + "jni", 2893 + "log", 2894 + "once_cell", 2895 + "rustls", 2896 + "rustls-native-certs", 2897 + "rustls-platform-verifier-android", 2898 + "rustls-webpki", 2899 + "security-framework", 2900 + "security-framework-sys", 2901 + "webpki-root-certs", 2902 + "windows-sys 0.61.2", 2903 + ] 2904 + 2905 + [[package]] 2906 + name = "rustls-platform-verifier-android" 2907 + version = "0.1.1" 2908 + source = "registry+https://github.com/rust-lang/crates.io-index" 2909 + checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" 2910 + 2911 + [[package]] 2912 + name = "rustls-webpki" 2913 + version = "0.103.9" 2914 + source = "registry+https://github.com/rust-lang/crates.io-index" 2915 + checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" 2916 + dependencies = [ 2917 + "aws-lc-rs", 2918 + "ring", 2919 + "rustls-pki-types", 2920 + "untrusted", 2921 + ] 2922 + 2923 + [[package]] 2924 + name = "rustversion" 2925 + version = "1.0.22" 2926 + source = "registry+https://github.com/rust-lang/crates.io-index" 2927 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 2928 + 2929 + [[package]] 2930 + name = "ryu" 2931 + version = "1.0.23" 2932 + source = "registry+https://github.com/rust-lang/crates.io-index" 2933 + checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" 2934 + 2935 + [[package]] 2936 + name = "same-file" 2937 + version = "1.0.6" 2938 + source = "registry+https://github.com/rust-lang/crates.io-index" 2939 + checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2940 + dependencies = [ 2941 + "winapi-util", 2942 + ] 2943 + 2944 + [[package]] 2945 + name = "schannel" 2946 + version = "0.1.28" 2947 + source = "registry+https://github.com/rust-lang/crates.io-index" 2948 + checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" 2949 + dependencies = [ 2950 + "windows-sys 0.61.2", 2951 + ] 2952 + 2953 + [[package]] 2954 + name = "scoped-tls" 2955 + version = "1.0.1" 2956 + source = "registry+https://github.com/rust-lang/crates.io-index" 2957 + checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2958 + 2959 + [[package]] 2960 + name = "scopeguard" 2961 + version = "1.2.0" 2962 + source = "registry+https://github.com/rust-lang/crates.io-index" 2963 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2964 + 2965 + [[package]] 2966 + name = "security-framework" 2967 + version = "3.6.0" 2968 + source = "registry+https://github.com/rust-lang/crates.io-index" 2969 + checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" 2970 + dependencies = [ 2971 + "bitflags", 2972 + "core-foundation", 2973 + "core-foundation-sys", 2974 + "libc", 2975 + "security-framework-sys", 2976 + ] 2977 + 2978 + [[package]] 2979 + name = "security-framework-sys" 2980 + version = "2.16.0" 2981 + source = "registry+https://github.com/rust-lang/crates.io-index" 2982 + checksum = "321c8673b092a9a42605034a9879d73cb79101ed5fd117bc9a597b89b4e9e61a" 2983 + dependencies = [ 2984 + "core-foundation-sys", 2985 + "libc", 2986 + ] 2987 + 2988 + [[package]] 2989 + name = "seize" 2990 + version = "0.5.1" 2991 + source = "registry+https://github.com/rust-lang/crates.io-index" 2992 + checksum = "5b55fb86dfd3a2f5f76ea78310a88f96c4ea21a3031f8d212443d56123fd0521" 2993 + dependencies = [ 2994 + "libc", 2995 + "windows-sys 0.61.2", 2996 + ] 2997 + 2998 + [[package]] 2999 + name = "self_cell" 3000 + version = "1.2.2" 3001 + source = "registry+https://github.com/rust-lang/crates.io-index" 3002 + checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" 3003 + 3004 + [[package]] 3005 + name = "semver" 3006 + version = "1.0.27" 3007 + source = "registry+https://github.com/rust-lang/crates.io-index" 3008 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 3009 + 3010 + [[package]] 3011 + name = "send_wrapper" 3012 + version = "0.6.0" 3013 + source = "registry+https://github.com/rust-lang/crates.io-index" 3014 + checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 3015 + 3016 + [[package]] 3017 + name = "serde" 3018 + version = "1.0.228" 3019 + source = "registry+https://github.com/rust-lang/crates.io-index" 3020 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 3021 + dependencies = [ 3022 + "serde_core", 3023 + "serde_derive", 3024 + ] 3025 + 3026 + [[package]] 3027 + name = "serde_bytes" 3028 + version = "0.11.19" 3029 + source = "registry+https://github.com/rust-lang/crates.io-index" 3030 + checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" 3031 + dependencies = [ 3032 + "serde", 3033 + "serde_core", 3034 + ] 3035 + 3036 + [[package]] 3037 + name = "serde_core" 3038 + version = "1.0.228" 3039 + source = "registry+https://github.com/rust-lang/crates.io-index" 3040 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 3041 + dependencies = [ 3042 + "serde_derive", 3043 + ] 3044 + 3045 + [[package]] 3046 + name = "serde_derive" 3047 + version = "1.0.228" 3048 + source = "registry+https://github.com/rust-lang/crates.io-index" 3049 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 3050 + dependencies = [ 3051 + "proc-macro2", 3052 + "quote", 3053 + "syn", 3054 + ] 3055 + 3056 + [[package]] 3057 + name = "serde_json" 3058 + version = "1.0.149" 3059 + source = "registry+https://github.com/rust-lang/crates.io-index" 3060 + checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" 3061 + dependencies = [ 3062 + "itoa", 3063 + "memchr", 3064 + "serde", 3065 + "serde_core", 3066 + "zmij", 3067 + ] 3068 + 3069 + [[package]] 3070 + name = "serde_urlencoded" 3071 + version = "0.7.1" 3072 + source = "registry+https://github.com/rust-lang/crates.io-index" 3073 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 3074 + dependencies = [ 3075 + "form_urlencoded", 3076 + "itoa", 3077 + "ryu", 3078 + "serde", 3079 + ] 3080 + 3081 + [[package]] 3082 + name = "sha1_smol" 3083 + version = "1.0.1" 3084 + source = "registry+https://github.com/rust-lang/crates.io-index" 3085 + checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" 3086 + 3087 + [[package]] 3088 + name = "sha2" 3089 + version = "0.11.0-rc.2" 3090 + source = "registry+https://github.com/rust-lang/crates.io-index" 3091 + checksum = "d1e3878ab0f98e35b2df35fe53201d088299b41a6bb63e3e34dada2ac4abd924" 3092 + dependencies = [ 3093 + "cfg-if", 3094 + "cpufeatures", 3095 + "digest", 3096 + ] 3097 + 3098 + [[package]] 3099 + name = "sharded-slab" 3100 + version = "0.1.7" 3101 + source = "registry+https://github.com/rust-lang/crates.io-index" 3102 + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 3103 + dependencies = [ 3104 + "lazy_static", 3105 + ] 3106 + 3107 + [[package]] 3108 + name = "shlex" 3109 + version = "1.3.0" 3110 + source = "registry+https://github.com/rust-lang/crates.io-index" 3111 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 3112 + 3113 + [[package]] 3114 + name = "signal-hook-registry" 3115 + version = "1.4.8" 3116 + source = "registry+https://github.com/rust-lang/crates.io-index" 3117 + checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" 3118 + dependencies = [ 3119 + "errno", 3120 + "libc", 3121 + ] 3122 + 3123 + [[package]] 3124 + name = "signature" 3125 + version = "3.0.0-rc.10" 3126 + source = "registry+https://github.com/rust-lang/crates.io-index" 3127 + checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3" 3128 + 3129 + [[package]] 3130 + name = "simdutf8" 3131 + version = "0.1.5" 3132 + source = "registry+https://github.com/rust-lang/crates.io-index" 3133 + checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" 3134 + 3135 + [[package]] 3136 + name = "simple-dns" 3137 + version = "0.9.3" 3138 + source = "registry+https://github.com/rust-lang/crates.io-index" 3139 + checksum = "dee851d0e5e7af3721faea1843e8015e820a234f81fda3dea9247e15bac9a86a" 3140 + dependencies = [ 3141 + "bitflags", 3142 + ] 3143 + 3144 + [[package]] 3145 + name = "siphasher" 3146 + version = "1.0.2" 3147 + source = "registry+https://github.com/rust-lang/crates.io-index" 3148 + checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" 3149 + 3150 + [[package]] 3151 + name = "slab" 3152 + version = "0.4.12" 3153 + source = "registry+https://github.com/rust-lang/crates.io-index" 3154 + checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" 3155 + 3156 + [[package]] 3157 + name = "smallvec" 3158 + version = "1.15.1" 3159 + source = "registry+https://github.com/rust-lang/crates.io-index" 3160 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 3161 + 3162 + [[package]] 3163 + name = "smol_str" 3164 + version = "0.1.24" 3165 + source = "registry+https://github.com/rust-lang/crates.io-index" 3166 + checksum = "fad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9" 3167 + 3168 + [[package]] 3169 + name = "socket2" 3170 + version = "0.5.10" 3171 + source = "registry+https://github.com/rust-lang/crates.io-index" 3172 + checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" 3173 + dependencies = [ 3174 + "libc", 3175 + "windows-sys 0.52.0", 3176 + ] 3177 + 3178 + [[package]] 3179 + name = "socket2" 3180 + version = "0.6.2" 3181 + source = "registry+https://github.com/rust-lang/crates.io-index" 3182 + checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" 3183 + dependencies = [ 3184 + "libc", 3185 + "windows-sys 0.60.2", 3186 + ] 3187 + 3188 + [[package]] 3189 + name = "sorted-index-buffer" 3190 + version = "0.2.1" 3191 + source = "registry+https://github.com/rust-lang/crates.io-index" 3192 + checksum = "ea06cc588e43c632923a55450401b8f25e628131571d4e1baea1bdfdb2b5ed06" 3193 + 3194 + [[package]] 3195 + name = "spez" 3196 + version = "0.1.2" 3197 + source = "registry+https://github.com/rust-lang/crates.io-index" 3198 + checksum = "c87e960f4dca2788eeb86bbdde8dd246be8948790b7618d656e68f9b720a86e8" 3199 + dependencies = [ 3200 + "proc-macro2", 3201 + "quote", 3202 + "syn", 3203 + ] 3204 + 3205 + [[package]] 3206 + name = "spin" 3207 + version = "0.9.8" 3208 + source = "registry+https://github.com/rust-lang/crates.io-index" 3209 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 3210 + dependencies = [ 3211 + "lock_api", 3212 + ] 3213 + 3214 + [[package]] 3215 + name = "spin" 3216 + version = "0.10.0" 3217 + source = "registry+https://github.com/rust-lang/crates.io-index" 3218 + checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" 3219 + 3220 + [[package]] 3221 + name = "spki" 3222 + version = "0.8.0-rc.4" 3223 + source = "registry+https://github.com/rust-lang/crates.io-index" 3224 + checksum = "8baeff88f34ed0691978ec34440140e1572b68c7dd4a495fd14a3dc1944daa80" 3225 + dependencies = [ 3226 + "base64ct", 3227 + "der", 3228 + ] 3229 + 3230 + [[package]] 3231 + name = "stable_deref_trait" 3232 + version = "1.2.1" 3233 + source = "registry+https://github.com/rust-lang/crates.io-index" 3234 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 3235 + 3236 + [[package]] 3237 + name = "strsim" 3238 + version = "0.11.1" 3239 + source = "registry+https://github.com/rust-lang/crates.io-index" 3240 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 3241 + 3242 + [[package]] 3243 + name = "strum" 3244 + version = "0.27.2" 3245 + source = "registry+https://github.com/rust-lang/crates.io-index" 3246 + checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" 3247 + dependencies = [ 3248 + "strum_macros", 3249 + ] 3250 + 3251 + [[package]] 3252 + name = "strum_macros" 3253 + version = "0.27.2" 3254 + source = "registry+https://github.com/rust-lang/crates.io-index" 3255 + checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" 3256 + dependencies = [ 3257 + "heck", 3258 + "proc-macro2", 3259 + "quote", 3260 + "syn", 3261 + ] 3262 + 3263 + [[package]] 3264 + name = "subtle" 3265 + version = "2.6.1" 3266 + source = "registry+https://github.com/rust-lang/crates.io-index" 3267 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 3268 + 3269 + [[package]] 3270 + name = "swarm-discovery" 3271 + version = "0.5.0" 3272 + source = "registry+https://github.com/rust-lang/crates.io-index" 3273 + checksum = "1a5ab62937edac8b23fa40e55a358ea1924245b17fc1eb20d14929c8f11be98d" 3274 + dependencies = [ 3275 + "acto", 3276 + "hickory-proto", 3277 + "rand 0.9.2", 3278 + "socket2 0.6.2", 3279 + "thiserror 2.0.18", 3280 + "tokio", 3281 + "tracing", 3282 + ] 3283 + 3284 + [[package]] 3285 + name = "syn" 3286 + version = "2.0.116" 3287 + source = "registry+https://github.com/rust-lang/crates.io-index" 3288 + checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" 3289 + dependencies = [ 3290 + "proc-macro2", 3291 + "quote", 3292 + "unicode-ident", 3293 + ] 3294 + 3295 + [[package]] 3296 + name = "sync_wrapper" 3297 + version = "1.0.2" 3298 + source = "registry+https://github.com/rust-lang/crates.io-index" 3299 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 3300 + dependencies = [ 3301 + "futures-core", 3302 + ] 3303 + 3304 + [[package]] 3305 + name = "synstructure" 3306 + version = "0.13.2" 3307 + source = "registry+https://github.com/rust-lang/crates.io-index" 3308 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 3309 + dependencies = [ 3310 + "proc-macro2", 3311 + "quote", 3312 + "syn", 3313 + ] 3314 + 3315 + [[package]] 3316 + name = "tagptr" 3317 + version = "0.2.0" 3318 + source = "registry+https://github.com/rust-lang/crates.io-index" 3319 + checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" 3320 + 3321 + [[package]] 3322 + name = "thiserror" 3323 + version = "1.0.69" 3324 + source = "registry+https://github.com/rust-lang/crates.io-index" 3325 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 3326 + dependencies = [ 3327 + "thiserror-impl 1.0.69", 3328 + ] 3329 + 3330 + [[package]] 3331 + name = "thiserror" 3332 + version = "2.0.18" 3333 + source = "registry+https://github.com/rust-lang/crates.io-index" 3334 + checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" 3335 + dependencies = [ 3336 + "thiserror-impl 2.0.18", 3337 + ] 3338 + 3339 + [[package]] 3340 + name = "thiserror-impl" 3341 + version = "1.0.69" 3342 + source = "registry+https://github.com/rust-lang/crates.io-index" 3343 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 3344 + dependencies = [ 3345 + "proc-macro2", 3346 + "quote", 3347 + "syn", 3348 + ] 3349 + 3350 + [[package]] 3351 + name = "thiserror-impl" 3352 + version = "2.0.18" 3353 + source = "registry+https://github.com/rust-lang/crates.io-index" 3354 + checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" 3355 + dependencies = [ 3356 + "proc-macro2", 3357 + "quote", 3358 + "syn", 3359 + ] 3360 + 3361 + [[package]] 3362 + name = "thread_local" 3363 + version = "1.1.9" 3364 + source = "registry+https://github.com/rust-lang/crates.io-index" 3365 + checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" 3366 + dependencies = [ 3367 + "cfg-if", 3368 + ] 3369 + 3370 + [[package]] 3371 + name = "time" 3372 + version = "0.3.47" 3373 + source = "registry+https://github.com/rust-lang/crates.io-index" 3374 + checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" 3375 + dependencies = [ 3376 + "deranged", 3377 + "itoa", 3378 + "js-sys", 3379 + "libc", 3380 + "num-conv", 3381 + "num_threads", 3382 + "powerfmt", 3383 + "serde_core", 3384 + "time-core", 3385 + "time-macros", 3386 + ] 3387 + 3388 + [[package]] 3389 + name = "time-core" 3390 + version = "0.1.8" 3391 + source = "registry+https://github.com/rust-lang/crates.io-index" 3392 + checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" 3393 + 3394 + [[package]] 3395 + name = "time-macros" 3396 + version = "0.2.27" 3397 + source = "registry+https://github.com/rust-lang/crates.io-index" 3398 + checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" 3399 + dependencies = [ 3400 + "num-conv", 3401 + "time-core", 3402 + ] 3403 + 3404 + [[package]] 3405 + name = "tinystr" 3406 + version = "0.8.2" 3407 + source = "registry+https://github.com/rust-lang/crates.io-index" 3408 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 3409 + dependencies = [ 3410 + "displaydoc", 3411 + "zerovec", 3412 + ] 3413 + 3414 + [[package]] 3415 + name = "tinyvec" 3416 + version = "1.10.0" 3417 + source = "registry+https://github.com/rust-lang/crates.io-index" 3418 + checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 3419 + dependencies = [ 3420 + "tinyvec_macros", 3421 + ] 3422 + 3423 + [[package]] 3424 + name = "tinyvec_macros" 3425 + version = "0.1.1" 3426 + source = "registry+https://github.com/rust-lang/crates.io-index" 3427 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 3428 + 3429 + [[package]] 3430 + name = "tokio" 3431 + version = "1.49.0" 3432 + source = "registry+https://github.com/rust-lang/crates.io-index" 3433 + checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" 3434 + dependencies = [ 3435 + "bytes", 3436 + "libc", 3437 + "mio", 3438 + "pin-project-lite", 3439 + "signal-hook-registry", 3440 + "socket2 0.6.2", 3441 + "tokio-macros", 3442 + "windows-sys 0.61.2", 3443 + ] 3444 + 3445 + [[package]] 3446 + name = "tokio-macros" 3447 + version = "2.6.0" 3448 + source = "registry+https://github.com/rust-lang/crates.io-index" 3449 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 3450 + dependencies = [ 3451 + "proc-macro2", 3452 + "quote", 3453 + "syn", 3454 + ] 3455 + 3456 + [[package]] 3457 + name = "tokio-rustls" 3458 + version = "0.26.4" 3459 + source = "registry+https://github.com/rust-lang/crates.io-index" 3460 + checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 3461 + dependencies = [ 3462 + "rustls", 3463 + "tokio", 3464 + ] 3465 + 3466 + [[package]] 3467 + name = "tokio-stream" 3468 + version = "0.1.18" 3469 + source = "registry+https://github.com/rust-lang/crates.io-index" 3470 + checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" 3471 + dependencies = [ 3472 + "futures-core", 3473 + "pin-project-lite", 3474 + "tokio", 3475 + "tokio-util", 3476 + ] 3477 + 3478 + [[package]] 3479 + name = "tokio-util" 3480 + version = "0.7.18" 3481 + source = "registry+https://github.com/rust-lang/crates.io-index" 3482 + checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" 3483 + dependencies = [ 3484 + "bytes", 3485 + "futures-core", 3486 + "futures-sink", 3487 + "futures-util", 3488 + "pin-project-lite", 3489 + "tokio", 3490 + ] 3491 + 3492 + [[package]] 3493 + name = "tokio-websockets" 3494 + version = "0.12.3" 3495 + source = "registry+https://github.com/rust-lang/crates.io-index" 3496 + checksum = "b1b6348ebfaaecd771cecb69e832961d277f59845d4220a584701f72728152b7" 3497 + dependencies = [ 3498 + "base64", 3499 + "bytes", 3500 + "futures-core", 3501 + "futures-sink", 3502 + "getrandom 0.3.4", 3503 + "http", 3504 + "httparse", 3505 + "rand 0.9.2", 3506 + "ring", 3507 + "rustls-pki-types", 3508 + "simdutf8", 3509 + "tokio", 3510 + "tokio-rustls", 3511 + "tokio-util", 3512 + ] 3513 + 3514 + [[package]] 3515 + name = "toml_datetime" 3516 + version = "0.7.5+spec-1.1.0" 3517 + source = "registry+https://github.com/rust-lang/crates.io-index" 3518 + checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" 3519 + dependencies = [ 3520 + "serde_core", 3521 + ] 3522 + 3523 + [[package]] 3524 + name = "toml_edit" 3525 + version = "0.23.10+spec-1.0.0" 3526 + source = "registry+https://github.com/rust-lang/crates.io-index" 3527 + checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" 3528 + dependencies = [ 3529 + "indexmap", 3530 + "toml_datetime", 3531 + "toml_parser", 3532 + "winnow", 3533 + ] 3534 + 3535 + [[package]] 3536 + name = "toml_parser" 3537 + version = "1.0.9+spec-1.1.0" 3538 + source = "registry+https://github.com/rust-lang/crates.io-index" 3539 + checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" 3540 + dependencies = [ 3541 + "winnow", 3542 + ] 3543 + 3544 + [[package]] 3545 + name = "tower" 3546 + version = "0.5.3" 3547 + source = "registry+https://github.com/rust-lang/crates.io-index" 3548 + checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" 3549 + dependencies = [ 3550 + "futures-core", 3551 + "futures-util", 3552 + "pin-project-lite", 3553 + "sync_wrapper", 3554 + "tokio", 3555 + "tower-layer", 3556 + "tower-service", 3557 + ] 3558 + 3559 + [[package]] 3560 + name = "tower-http" 3561 + version = "0.6.8" 3562 + source = "registry+https://github.com/rust-lang/crates.io-index" 3563 + checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" 3564 + dependencies = [ 3565 + "bitflags", 3566 + "bytes", 3567 + "futures-util", 3568 + "http", 3569 + "http-body", 3570 + "iri-string", 3571 + "pin-project-lite", 3572 + "tower", 3573 + "tower-layer", 3574 + "tower-service", 3575 + ] 3576 + 3577 + [[package]] 3578 + name = "tower-layer" 3579 + version = "0.3.3" 3580 + source = "registry+https://github.com/rust-lang/crates.io-index" 3581 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 3582 + 3583 + [[package]] 3584 + name = "tower-service" 3585 + version = "0.3.3" 3586 + source = "registry+https://github.com/rust-lang/crates.io-index" 3587 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 3588 + 3589 + [[package]] 3590 + name = "tracing" 3591 + version = "0.1.44" 3592 + source = "registry+https://github.com/rust-lang/crates.io-index" 3593 + checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" 3594 + dependencies = [ 3595 + "log", 3596 + "pin-project-lite", 3597 + "tracing-attributes", 3598 + "tracing-core", 3599 + ] 3600 + 3601 + [[package]] 3602 + name = "tracing-attributes" 3603 + version = "0.1.31" 3604 + source = "registry+https://github.com/rust-lang/crates.io-index" 3605 + checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" 3606 + dependencies = [ 3607 + "proc-macro2", 3608 + "quote", 3609 + "syn", 3610 + ] 3611 + 3612 + [[package]] 3613 + name = "tracing-core" 3614 + version = "0.1.36" 3615 + source = "registry+https://github.com/rust-lang/crates.io-index" 3616 + checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" 3617 + dependencies = [ 3618 + "once_cell", 3619 + "valuable", 3620 + ] 3621 + 3622 + [[package]] 3623 + name = "tracing-log" 3624 + version = "0.2.0" 3625 + source = "registry+https://github.com/rust-lang/crates.io-index" 3626 + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 3627 + dependencies = [ 3628 + "log", 3629 + "once_cell", 3630 + "tracing-core", 3631 + ] 3632 + 3633 + [[package]] 3634 + name = "tracing-subscriber" 3635 + version = "0.3.22" 3636 + source = "registry+https://github.com/rust-lang/crates.io-index" 3637 + checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" 3638 + dependencies = [ 3639 + "matchers", 3640 + "nu-ansi-term", 3641 + "once_cell", 3642 + "regex-automata", 3643 + "sharded-slab", 3644 + "smallvec", 3645 + "thread_local", 3646 + "tracing", 3647 + "tracing-core", 3648 + "tracing-log", 3649 + ] 3650 + 3651 + [[package]] 3652 + name = "try-lock" 3653 + version = "0.2.5" 3654 + source = "registry+https://github.com/rust-lang/crates.io-index" 3655 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 3656 + 3657 + [[package]] 3658 + name = "typenum" 3659 + version = "1.19.0" 3660 + source = "registry+https://github.com/rust-lang/crates.io-index" 3661 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 3662 + 3663 + [[package]] 3664 + name = "unicode-ident" 3665 + version = "1.0.24" 3666 + source = "registry+https://github.com/rust-lang/crates.io-index" 3667 + checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" 3668 + 3669 + [[package]] 3670 + name = "unicode-segmentation" 3671 + version = "1.12.0" 3672 + source = "registry+https://github.com/rust-lang/crates.io-index" 3673 + checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 3674 + 3675 + [[package]] 3676 + name = "unicode-xid" 3677 + version = "0.2.6" 3678 + source = "registry+https://github.com/rust-lang/crates.io-index" 3679 + checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 3680 + 3681 + [[package]] 3682 + name = "untrusted" 3683 + version = "0.9.0" 3684 + source = "registry+https://github.com/rust-lang/crates.io-index" 3685 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 3686 + 3687 + [[package]] 3688 + name = "url" 3689 + version = "2.5.8" 3690 + source = "registry+https://github.com/rust-lang/crates.io-index" 3691 + checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" 3692 + dependencies = [ 3693 + "form_urlencoded", 3694 + "idna", 3695 + "percent-encoding", 3696 + "serde", 3697 + "serde_derive", 3698 + ] 3699 + 3700 + [[package]] 3701 + name = "utf8_iter" 3702 + version = "1.0.4" 3703 + source = "registry+https://github.com/rust-lang/crates.io-index" 3704 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 3705 + 3706 + [[package]] 3707 + name = "utf8parse" 3708 + version = "0.2.2" 3709 + source = "registry+https://github.com/rust-lang/crates.io-index" 3710 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 3711 + 3712 + [[package]] 3713 + name = "uuid" 3714 + version = "1.21.0" 3715 + source = "registry+https://github.com/rust-lang/crates.io-index" 3716 + checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" 3717 + dependencies = [ 3718 + "getrandom 0.4.1", 3719 + "js-sys", 3720 + "wasm-bindgen", 3721 + ] 3722 + 3723 + [[package]] 3724 + name = "valuable" 3725 + version = "0.1.1" 3726 + source = "registry+https://github.com/rust-lang/crates.io-index" 3727 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 3728 + 3729 + [[package]] 3730 + name = "vergen" 3731 + version = "9.1.0" 3732 + source = "registry+https://github.com/rust-lang/crates.io-index" 3733 + checksum = "b849a1f6d8639e8de261e81ee0fc881e3e3620db1af9f2e0da015d4382ceaf75" 3734 + dependencies = [ 3735 + "anyhow", 3736 + "derive_builder", 3737 + "rustversion", 3738 + "vergen-lib 9.1.0", 3739 + ] 3740 + 3741 + [[package]] 3742 + name = "vergen-gitcl" 3743 + version = "1.0.8" 3744 + source = "registry+https://github.com/rust-lang/crates.io-index" 3745 + checksum = "b9dfc1de6eb2e08a4ddf152f1b179529638bedc0ea95e6d667c014506377aefe" 3746 + dependencies = [ 3747 + "anyhow", 3748 + "derive_builder", 3749 + "rustversion", 3750 + "time", 3751 + "vergen", 3752 + "vergen-lib 0.1.6", 3753 + ] 3754 + 3755 + [[package]] 3756 + name = "vergen-lib" 3757 + version = "0.1.6" 3758 + source = "registry+https://github.com/rust-lang/crates.io-index" 3759 + checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" 3760 + dependencies = [ 3761 + "anyhow", 3762 + "derive_builder", 3763 + "rustversion", 3764 + ] 3765 + 3766 + [[package]] 3767 + name = "vergen-lib" 3768 + version = "9.1.0" 3769 + source = "registry+https://github.com/rust-lang/crates.io-index" 3770 + checksum = "b34a29ba7e9c59e62f229ae1932fb1b8fb8a6fdcc99215a641913f5f5a59a569" 3771 + dependencies = [ 3772 + "anyhow", 3773 + "derive_builder", 3774 + "rustversion", 3775 + ] 3776 + 3777 + [[package]] 3778 + name = "walkdir" 3779 + version = "2.5.0" 3780 + source = "registry+https://github.com/rust-lang/crates.io-index" 3781 + checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 3782 + dependencies = [ 3783 + "same-file", 3784 + "winapi-util", 3785 + ] 3786 + 3787 + [[package]] 3788 + name = "want" 3789 + version = "0.3.1" 3790 + source = "registry+https://github.com/rust-lang/crates.io-index" 3791 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 3792 + dependencies = [ 3793 + "try-lock", 3794 + ] 3795 + 3796 + [[package]] 3797 + name = "wasi" 3798 + version = "0.11.1+wasi-snapshot-preview1" 3799 + source = "registry+https://github.com/rust-lang/crates.io-index" 3800 + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 3801 + 3802 + [[package]] 3803 + name = "wasip2" 3804 + version = "1.0.2+wasi-0.2.9" 3805 + source = "registry+https://github.com/rust-lang/crates.io-index" 3806 + checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" 3807 + dependencies = [ 3808 + "wit-bindgen", 3809 + ] 3810 + 3811 + [[package]] 3812 + name = "wasip3" 3813 + version = "0.4.0+wasi-0.3.0-rc-2026-01-06" 3814 + source = "registry+https://github.com/rust-lang/crates.io-index" 3815 + checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" 3816 + dependencies = [ 3817 + "wit-bindgen", 3818 + ] 3819 + 3820 + [[package]] 3821 + name = "wasm-bindgen" 3822 + version = "0.2.108" 3823 + source = "registry+https://github.com/rust-lang/crates.io-index" 3824 + checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" 3825 + dependencies = [ 3826 + "cfg-if", 3827 + "once_cell", 3828 + "rustversion", 3829 + "wasm-bindgen-macro", 3830 + "wasm-bindgen-shared", 3831 + ] 3832 + 3833 + [[package]] 3834 + name = "wasm-bindgen-futures" 3835 + version = "0.4.58" 3836 + source = "registry+https://github.com/rust-lang/crates.io-index" 3837 + checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" 3838 + dependencies = [ 3839 + "cfg-if", 3840 + "futures-util", 3841 + "js-sys", 3842 + "once_cell", 3843 + "wasm-bindgen", 3844 + "web-sys", 3845 + ] 3846 + 3847 + [[package]] 3848 + name = "wasm-bindgen-macro" 3849 + version = "0.2.108" 3850 + source = "registry+https://github.com/rust-lang/crates.io-index" 3851 + checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" 3852 + dependencies = [ 3853 + "quote", 3854 + "wasm-bindgen-macro-support", 3855 + ] 3856 + 3857 + [[package]] 3858 + name = "wasm-bindgen-macro-support" 3859 + version = "0.2.108" 3860 + source = "registry+https://github.com/rust-lang/crates.io-index" 3861 + checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" 3862 + dependencies = [ 3863 + "bumpalo", 3864 + "proc-macro2", 3865 + "quote", 3866 + "syn", 3867 + "wasm-bindgen-shared", 3868 + ] 3869 + 3870 + [[package]] 3871 + name = "wasm-bindgen-shared" 3872 + version = "0.2.108" 3873 + source = "registry+https://github.com/rust-lang/crates.io-index" 3874 + checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" 3875 + dependencies = [ 3876 + "unicode-ident", 3877 + ] 3878 + 3879 + [[package]] 3880 + name = "wasm-encoder" 3881 + version = "0.244.0" 3882 + source = "registry+https://github.com/rust-lang/crates.io-index" 3883 + checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" 3884 + dependencies = [ 3885 + "leb128fmt", 3886 + "wasmparser", 3887 + ] 3888 + 3889 + [[package]] 3890 + name = "wasm-metadata" 3891 + version = "0.244.0" 3892 + source = "registry+https://github.com/rust-lang/crates.io-index" 3893 + checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" 3894 + dependencies = [ 3895 + "anyhow", 3896 + "indexmap", 3897 + "wasm-encoder", 3898 + "wasmparser", 3899 + ] 3900 + 3901 + [[package]] 3902 + name = "wasm-streams" 3903 + version = "0.4.2" 3904 + source = "registry+https://github.com/rust-lang/crates.io-index" 3905 + checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" 3906 + dependencies = [ 3907 + "futures-util", 3908 + "js-sys", 3909 + "wasm-bindgen", 3910 + "wasm-bindgen-futures", 3911 + "web-sys", 3912 + ] 3913 + 3914 + [[package]] 3915 + name = "wasmparser" 3916 + version = "0.244.0" 3917 + source = "registry+https://github.com/rust-lang/crates.io-index" 3918 + checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" 3919 + dependencies = [ 3920 + "bitflags", 3921 + "hashbrown 0.15.5", 3922 + "indexmap", 3923 + "semver", 3924 + ] 3925 + 3926 + [[package]] 3927 + name = "web-sys" 3928 + version = "0.3.85" 3929 + source = "registry+https://github.com/rust-lang/crates.io-index" 3930 + checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" 3931 + dependencies = [ 3932 + "js-sys", 3933 + "wasm-bindgen", 3934 + ] 3935 + 3936 + [[package]] 3937 + name = "web-time" 3938 + version = "1.1.0" 3939 + source = "registry+https://github.com/rust-lang/crates.io-index" 3940 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 3941 + dependencies = [ 3942 + "js-sys", 3943 + "wasm-bindgen", 3944 + ] 3945 + 3946 + [[package]] 3947 + name = "webpki-root-certs" 3948 + version = "1.0.6" 3949 + source = "registry+https://github.com/rust-lang/crates.io-index" 3950 + checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" 3951 + dependencies = [ 3952 + "rustls-pki-types", 3953 + ] 3954 + 3955 + [[package]] 3956 + name = "webpki-roots" 3957 + version = "1.0.6" 3958 + source = "registry+https://github.com/rust-lang/crates.io-index" 3959 + checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" 3960 + dependencies = [ 3961 + "rustls-pki-types", 3962 + ] 3963 + 3964 + [[package]] 3965 + name = "widestring" 3966 + version = "1.2.1" 3967 + source = "registry+https://github.com/rust-lang/crates.io-index" 3968 + checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" 3969 + 3970 + [[package]] 3971 + name = "winapi" 3972 + version = "0.3.9" 3973 + source = "registry+https://github.com/rust-lang/crates.io-index" 3974 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3975 + dependencies = [ 3976 + "winapi-i686-pc-windows-gnu", 3977 + "winapi-x86_64-pc-windows-gnu", 3978 + ] 3979 + 3980 + [[package]] 3981 + name = "winapi-i686-pc-windows-gnu" 3982 + version = "0.4.0" 3983 + source = "registry+https://github.com/rust-lang/crates.io-index" 3984 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3985 + 3986 + [[package]] 3987 + name = "winapi-util" 3988 + version = "0.1.11" 3989 + source = "registry+https://github.com/rust-lang/crates.io-index" 3990 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 3991 + dependencies = [ 3992 + "windows-sys 0.61.2", 3993 + ] 3994 + 3995 + [[package]] 3996 + name = "winapi-x86_64-pc-windows-gnu" 3997 + version = "0.4.0" 3998 + source = "registry+https://github.com/rust-lang/crates.io-index" 3999 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 4000 + 4001 + [[package]] 4002 + name = "windows" 4003 + version = "0.62.2" 4004 + source = "registry+https://github.com/rust-lang/crates.io-index" 4005 + checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" 4006 + dependencies = [ 4007 + "windows-collections", 4008 + "windows-core", 4009 + "windows-future", 4010 + "windows-numerics", 4011 + ] 4012 + 4013 + [[package]] 4014 + name = "windows-collections" 4015 + version = "0.3.2" 4016 + source = "registry+https://github.com/rust-lang/crates.io-index" 4017 + checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" 4018 + dependencies = [ 4019 + "windows-core", 4020 + ] 4021 + 4022 + [[package]] 4023 + name = "windows-core" 4024 + version = "0.62.2" 4025 + source = "registry+https://github.com/rust-lang/crates.io-index" 4026 + checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 4027 + dependencies = [ 4028 + "windows-implement", 4029 + "windows-interface", 4030 + "windows-link", 4031 + "windows-result", 4032 + "windows-strings", 4033 + ] 4034 + 4035 + [[package]] 4036 + name = "windows-future" 4037 + version = "0.3.2" 4038 + source = "registry+https://github.com/rust-lang/crates.io-index" 4039 + checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" 4040 + dependencies = [ 4041 + "windows-core", 4042 + "windows-link", 4043 + "windows-threading", 4044 + ] 4045 + 4046 + [[package]] 4047 + name = "windows-implement" 4048 + version = "0.60.2" 4049 + source = "registry+https://github.com/rust-lang/crates.io-index" 4050 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 4051 + dependencies = [ 4052 + "proc-macro2", 4053 + "quote", 4054 + "syn", 4055 + ] 4056 + 4057 + [[package]] 4058 + name = "windows-interface" 4059 + version = "0.59.3" 4060 + source = "registry+https://github.com/rust-lang/crates.io-index" 4061 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 4062 + dependencies = [ 4063 + "proc-macro2", 4064 + "quote", 4065 + "syn", 4066 + ] 4067 + 4068 + [[package]] 4069 + name = "windows-link" 4070 + version = "0.2.1" 4071 + source = "registry+https://github.com/rust-lang/crates.io-index" 4072 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 4073 + 4074 + [[package]] 4075 + name = "windows-numerics" 4076 + version = "0.3.1" 4077 + source = "registry+https://github.com/rust-lang/crates.io-index" 4078 + checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" 4079 + dependencies = [ 4080 + "windows-core", 4081 + "windows-link", 4082 + ] 4083 + 4084 + [[package]] 4085 + name = "windows-result" 4086 + version = "0.4.1" 4087 + source = "registry+https://github.com/rust-lang/crates.io-index" 4088 + checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 4089 + dependencies = [ 4090 + "windows-link", 4091 + ] 4092 + 4093 + [[package]] 4094 + name = "windows-strings" 4095 + version = "0.5.1" 4096 + source = "registry+https://github.com/rust-lang/crates.io-index" 4097 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 4098 + dependencies = [ 4099 + "windows-link", 4100 + ] 4101 + 4102 + [[package]] 4103 + name = "windows-sys" 4104 + version = "0.45.0" 4105 + source = "registry+https://github.com/rust-lang/crates.io-index" 4106 + checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 4107 + dependencies = [ 4108 + "windows-targets 0.42.2", 4109 + ] 4110 + 4111 + [[package]] 4112 + name = "windows-sys" 4113 + version = "0.48.0" 4114 + source = "registry+https://github.com/rust-lang/crates.io-index" 4115 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 4116 + dependencies = [ 4117 + "windows-targets 0.48.5", 4118 + ] 4119 + 4120 + [[package]] 4121 + name = "windows-sys" 4122 + version = "0.52.0" 4123 + source = "registry+https://github.com/rust-lang/crates.io-index" 4124 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 4125 + dependencies = [ 4126 + "windows-targets 0.52.6", 4127 + ] 4128 + 4129 + [[package]] 4130 + name = "windows-sys" 4131 + version = "0.59.0" 4132 + source = "registry+https://github.com/rust-lang/crates.io-index" 4133 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 4134 + dependencies = [ 4135 + "windows-targets 0.52.6", 4136 + ] 4137 + 4138 + [[package]] 4139 + name = "windows-sys" 4140 + version = "0.60.2" 4141 + source = "registry+https://github.com/rust-lang/crates.io-index" 4142 + checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 4143 + dependencies = [ 4144 + "windows-targets 0.53.5", 4145 + ] 4146 + 4147 + [[package]] 4148 + name = "windows-sys" 4149 + version = "0.61.2" 4150 + source = "registry+https://github.com/rust-lang/crates.io-index" 4151 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 4152 + dependencies = [ 4153 + "windows-link", 4154 + ] 4155 + 4156 + [[package]] 4157 + name = "windows-targets" 4158 + version = "0.42.2" 4159 + source = "registry+https://github.com/rust-lang/crates.io-index" 4160 + checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 4161 + dependencies = [ 4162 + "windows_aarch64_gnullvm 0.42.2", 4163 + "windows_aarch64_msvc 0.42.2", 4164 + "windows_i686_gnu 0.42.2", 4165 + "windows_i686_msvc 0.42.2", 4166 + "windows_x86_64_gnu 0.42.2", 4167 + "windows_x86_64_gnullvm 0.42.2", 4168 + "windows_x86_64_msvc 0.42.2", 4169 + ] 4170 + 4171 + [[package]] 4172 + name = "windows-targets" 4173 + version = "0.48.5" 4174 + source = "registry+https://github.com/rust-lang/crates.io-index" 4175 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 4176 + dependencies = [ 4177 + "windows_aarch64_gnullvm 0.48.5", 4178 + "windows_aarch64_msvc 0.48.5", 4179 + "windows_i686_gnu 0.48.5", 4180 + "windows_i686_msvc 0.48.5", 4181 + "windows_x86_64_gnu 0.48.5", 4182 + "windows_x86_64_gnullvm 0.48.5", 4183 + "windows_x86_64_msvc 0.48.5", 4184 + ] 4185 + 4186 + [[package]] 4187 + name = "windows-targets" 4188 + version = "0.52.6" 4189 + source = "registry+https://github.com/rust-lang/crates.io-index" 4190 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 4191 + dependencies = [ 4192 + "windows_aarch64_gnullvm 0.52.6", 4193 + "windows_aarch64_msvc 0.52.6", 4194 + "windows_i686_gnu 0.52.6", 4195 + "windows_i686_gnullvm 0.52.6", 4196 + "windows_i686_msvc 0.52.6", 4197 + "windows_x86_64_gnu 0.52.6", 4198 + "windows_x86_64_gnullvm 0.52.6", 4199 + "windows_x86_64_msvc 0.52.6", 4200 + ] 4201 + 4202 + [[package]] 4203 + name = "windows-targets" 4204 + version = "0.53.5" 4205 + source = "registry+https://github.com/rust-lang/crates.io-index" 4206 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 4207 + dependencies = [ 4208 + "windows-link", 4209 + "windows_aarch64_gnullvm 0.53.1", 4210 + "windows_aarch64_msvc 0.53.1", 4211 + "windows_i686_gnu 0.53.1", 4212 + "windows_i686_gnullvm 0.53.1", 4213 + "windows_i686_msvc 0.53.1", 4214 + "windows_x86_64_gnu 0.53.1", 4215 + "windows_x86_64_gnullvm 0.53.1", 4216 + "windows_x86_64_msvc 0.53.1", 4217 + ] 4218 + 4219 + [[package]] 4220 + name = "windows-threading" 4221 + version = "0.2.1" 4222 + source = "registry+https://github.com/rust-lang/crates.io-index" 4223 + checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" 4224 + dependencies = [ 4225 + "windows-link", 4226 + ] 4227 + 4228 + [[package]] 4229 + name = "windows_aarch64_gnullvm" 4230 + version = "0.42.2" 4231 + source = "registry+https://github.com/rust-lang/crates.io-index" 4232 + checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 4233 + 4234 + [[package]] 4235 + name = "windows_aarch64_gnullvm" 4236 + version = "0.48.5" 4237 + source = "registry+https://github.com/rust-lang/crates.io-index" 4238 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 4239 + 4240 + [[package]] 4241 + name = "windows_aarch64_gnullvm" 4242 + version = "0.52.6" 4243 + source = "registry+https://github.com/rust-lang/crates.io-index" 4244 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 4245 + 4246 + [[package]] 4247 + name = "windows_aarch64_gnullvm" 4248 + version = "0.53.1" 4249 + source = "registry+https://github.com/rust-lang/crates.io-index" 4250 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 4251 + 4252 + [[package]] 4253 + name = "windows_aarch64_msvc" 4254 + version = "0.42.2" 4255 + source = "registry+https://github.com/rust-lang/crates.io-index" 4256 + checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 4257 + 4258 + [[package]] 4259 + name = "windows_aarch64_msvc" 4260 + version = "0.48.5" 4261 + source = "registry+https://github.com/rust-lang/crates.io-index" 4262 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 4263 + 4264 + [[package]] 4265 + name = "windows_aarch64_msvc" 4266 + version = "0.52.6" 4267 + source = "registry+https://github.com/rust-lang/crates.io-index" 4268 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 4269 + 4270 + [[package]] 4271 + name = "windows_aarch64_msvc" 4272 + version = "0.53.1" 4273 + source = "registry+https://github.com/rust-lang/crates.io-index" 4274 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 4275 + 4276 + [[package]] 4277 + name = "windows_i686_gnu" 4278 + version = "0.42.2" 4279 + source = "registry+https://github.com/rust-lang/crates.io-index" 4280 + checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 4281 + 4282 + [[package]] 4283 + name = "windows_i686_gnu" 4284 + version = "0.48.5" 4285 + source = "registry+https://github.com/rust-lang/crates.io-index" 4286 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 4287 + 4288 + [[package]] 4289 + name = "windows_i686_gnu" 4290 + version = "0.52.6" 4291 + source = "registry+https://github.com/rust-lang/crates.io-index" 4292 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 4293 + 4294 + [[package]] 4295 + name = "windows_i686_gnu" 4296 + version = "0.53.1" 4297 + source = "registry+https://github.com/rust-lang/crates.io-index" 4298 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 4299 + 4300 + [[package]] 4301 + name = "windows_i686_gnullvm" 4302 + version = "0.52.6" 4303 + source = "registry+https://github.com/rust-lang/crates.io-index" 4304 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 4305 + 4306 + [[package]] 4307 + name = "windows_i686_gnullvm" 4308 + version = "0.53.1" 4309 + source = "registry+https://github.com/rust-lang/crates.io-index" 4310 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 4311 + 4312 + [[package]] 4313 + name = "windows_i686_msvc" 4314 + version = "0.42.2" 4315 + source = "registry+https://github.com/rust-lang/crates.io-index" 4316 + checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 4317 + 4318 + [[package]] 4319 + name = "windows_i686_msvc" 4320 + version = "0.48.5" 4321 + source = "registry+https://github.com/rust-lang/crates.io-index" 4322 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 4323 + 4324 + [[package]] 4325 + name = "windows_i686_msvc" 4326 + version = "0.52.6" 4327 + source = "registry+https://github.com/rust-lang/crates.io-index" 4328 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 4329 + 4330 + [[package]] 4331 + name = "windows_i686_msvc" 4332 + version = "0.53.1" 4333 + source = "registry+https://github.com/rust-lang/crates.io-index" 4334 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 4335 + 4336 + [[package]] 4337 + name = "windows_x86_64_gnu" 4338 + version = "0.42.2" 4339 + source = "registry+https://github.com/rust-lang/crates.io-index" 4340 + checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 4341 + 4342 + [[package]] 4343 + name = "windows_x86_64_gnu" 4344 + version = "0.48.5" 4345 + source = "registry+https://github.com/rust-lang/crates.io-index" 4346 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 4347 + 4348 + [[package]] 4349 + name = "windows_x86_64_gnu" 4350 + version = "0.52.6" 4351 + source = "registry+https://github.com/rust-lang/crates.io-index" 4352 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 4353 + 4354 + [[package]] 4355 + name = "windows_x86_64_gnu" 4356 + version = "0.53.1" 4357 + source = "registry+https://github.com/rust-lang/crates.io-index" 4358 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 4359 + 4360 + [[package]] 4361 + name = "windows_x86_64_gnullvm" 4362 + version = "0.42.2" 4363 + source = "registry+https://github.com/rust-lang/crates.io-index" 4364 + checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 4365 + 4366 + [[package]] 4367 + name = "windows_x86_64_gnullvm" 4368 + version = "0.48.5" 4369 + source = "registry+https://github.com/rust-lang/crates.io-index" 4370 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 4371 + 4372 + [[package]] 4373 + name = "windows_x86_64_gnullvm" 4374 + version = "0.52.6" 4375 + source = "registry+https://github.com/rust-lang/crates.io-index" 4376 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 4377 + 4378 + [[package]] 4379 + name = "windows_x86_64_gnullvm" 4380 + version = "0.53.1" 4381 + source = "registry+https://github.com/rust-lang/crates.io-index" 4382 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 4383 + 4384 + [[package]] 4385 + name = "windows_x86_64_msvc" 4386 + version = "0.42.2" 4387 + source = "registry+https://github.com/rust-lang/crates.io-index" 4388 + checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 4389 + 4390 + [[package]] 4391 + name = "windows_x86_64_msvc" 4392 + version = "0.48.5" 4393 + source = "registry+https://github.com/rust-lang/crates.io-index" 4394 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 4395 + 4396 + [[package]] 4397 + name = "windows_x86_64_msvc" 4398 + version = "0.52.6" 4399 + source = "registry+https://github.com/rust-lang/crates.io-index" 4400 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 4401 + 4402 + [[package]] 4403 + name = "windows_x86_64_msvc" 4404 + version = "0.53.1" 4405 + source = "registry+https://github.com/rust-lang/crates.io-index" 4406 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 4407 + 4408 + [[package]] 4409 + name = "winnow" 4410 + version = "0.7.14" 4411 + source = "registry+https://github.com/rust-lang/crates.io-index" 4412 + checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" 4413 + dependencies = [ 4414 + "memchr", 4415 + ] 4416 + 4417 + [[package]] 4418 + name = "winreg" 4419 + version = "0.50.0" 4420 + source = "registry+https://github.com/rust-lang/crates.io-index" 4421 + checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 4422 + dependencies = [ 4423 + "cfg-if", 4424 + "windows-sys 0.48.0", 4425 + ] 4426 + 4427 + [[package]] 4428 + name = "wit-bindgen" 4429 + version = "0.51.0" 4430 + source = "registry+https://github.com/rust-lang/crates.io-index" 4431 + checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" 4432 + dependencies = [ 4433 + "wit-bindgen-rust-macro", 4434 + ] 4435 + 4436 + [[package]] 4437 + name = "wit-bindgen-core" 4438 + version = "0.51.0" 4439 + source = "registry+https://github.com/rust-lang/crates.io-index" 4440 + checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" 4441 + dependencies = [ 4442 + "anyhow", 4443 + "heck", 4444 + "wit-parser", 4445 + ] 4446 + 4447 + [[package]] 4448 + name = "wit-bindgen-rust" 4449 + version = "0.51.0" 4450 + source = "registry+https://github.com/rust-lang/crates.io-index" 4451 + checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" 4452 + dependencies = [ 4453 + "anyhow", 4454 + "heck", 4455 + "indexmap", 4456 + "prettyplease", 4457 + "syn", 4458 + "wasm-metadata", 4459 + "wit-bindgen-core", 4460 + "wit-component", 4461 + ] 4462 + 4463 + [[package]] 4464 + name = "wit-bindgen-rust-macro" 4465 + version = "0.51.0" 4466 + source = "registry+https://github.com/rust-lang/crates.io-index" 4467 + checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" 4468 + dependencies = [ 4469 + "anyhow", 4470 + "prettyplease", 4471 + "proc-macro2", 4472 + "quote", 4473 + "syn", 4474 + "wit-bindgen-core", 4475 + "wit-bindgen-rust", 4476 + ] 4477 + 4478 + [[package]] 4479 + name = "wit-component" 4480 + version = "0.244.0" 4481 + source = "registry+https://github.com/rust-lang/crates.io-index" 4482 + checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" 4483 + dependencies = [ 4484 + "anyhow", 4485 + "bitflags", 4486 + "indexmap", 4487 + "log", 4488 + "serde", 4489 + "serde_derive", 4490 + "serde_json", 4491 + "wasm-encoder", 4492 + "wasm-metadata", 4493 + "wasmparser", 4494 + "wit-parser", 4495 + ] 4496 + 4497 + [[package]] 4498 + name = "wit-parser" 4499 + version = "0.244.0" 4500 + source = "registry+https://github.com/rust-lang/crates.io-index" 4501 + checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" 4502 + dependencies = [ 4503 + "anyhow", 4504 + "id-arena", 4505 + "indexmap", 4506 + "log", 4507 + "semver", 4508 + "serde", 4509 + "serde_derive", 4510 + "serde_json", 4511 + "unicode-xid", 4512 + "wasmparser", 4513 + ] 4514 + 4515 + [[package]] 4516 + name = "wmi" 4517 + version = "0.18.2" 4518 + source = "registry+https://github.com/rust-lang/crates.io-index" 4519 + checksum = "e49d9da833ef7c4419d8c3a18f0f7a8eca8ccc85f7ab8f359281c24100251211" 4520 + dependencies = [ 4521 + "chrono", 4522 + "futures", 4523 + "log", 4524 + "serde", 4525 + "thiserror 2.0.18", 4526 + "windows", 4527 + "windows-core", 4528 + ] 4529 + 4530 + [[package]] 4531 + name = "writeable" 4532 + version = "0.6.2" 4533 + source = "registry+https://github.com/rust-lang/crates.io-index" 4534 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 4535 + 4536 + [[package]] 4537 + name = "ws_stream_wasm" 4538 + version = "0.7.5" 4539 + source = "registry+https://github.com/rust-lang/crates.io-index" 4540 + checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" 4541 + dependencies = [ 4542 + "async_io_stream", 4543 + "futures", 4544 + "js-sys", 4545 + "log", 4546 + "pharos", 4547 + "rustc_version", 4548 + "send_wrapper", 4549 + "thiserror 2.0.18", 4550 + "wasm-bindgen", 4551 + "wasm-bindgen-futures", 4552 + "web-sys", 4553 + ] 4554 + 4555 + [[package]] 4556 + name = "xml-rs" 4557 + version = "0.8.28" 4558 + source = "registry+https://github.com/rust-lang/crates.io-index" 4559 + checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" 4560 + 4561 + [[package]] 4562 + name = "xmltree" 4563 + version = "0.10.3" 4564 + source = "registry+https://github.com/rust-lang/crates.io-index" 4565 + checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" 4566 + dependencies = [ 4567 + "xml-rs", 4568 + ] 4569 + 4570 + [[package]] 4571 + name = "yoke" 4572 + version = "0.8.1" 4573 + source = "registry+https://github.com/rust-lang/crates.io-index" 4574 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 4575 + dependencies = [ 4576 + "stable_deref_trait", 4577 + "yoke-derive", 4578 + "zerofrom", 4579 + ] 4580 + 4581 + [[package]] 4582 + name = "yoke-derive" 4583 + version = "0.8.1" 4584 + source = "registry+https://github.com/rust-lang/crates.io-index" 4585 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 4586 + dependencies = [ 4587 + "proc-macro2", 4588 + "quote", 4589 + "syn", 4590 + "synstructure", 4591 + ] 4592 + 4593 + [[package]] 4594 + name = "z32" 4595 + version = "1.3.0" 4596 + source = "registry+https://github.com/rust-lang/crates.io-index" 4597 + checksum = "2164e798d9e3d84ee2c91139ace54638059a3b23e361f5c11781c2c6459bde0f" 4598 + 4599 + [[package]] 4600 + name = "zerocopy" 4601 + version = "0.8.39" 4602 + source = "registry+https://github.com/rust-lang/crates.io-index" 4603 + checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" 4604 + dependencies = [ 4605 + "zerocopy-derive", 4606 + ] 4607 + 4608 + [[package]] 4609 + name = "zerocopy-derive" 4610 + version = "0.8.39" 4611 + source = "registry+https://github.com/rust-lang/crates.io-index" 4612 + checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" 4613 + dependencies = [ 4614 + "proc-macro2", 4615 + "quote", 4616 + "syn", 4617 + ] 4618 + 4619 + [[package]] 4620 + name = "zerofrom" 4621 + version = "0.1.6" 4622 + source = "registry+https://github.com/rust-lang/crates.io-index" 4623 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 4624 + dependencies = [ 4625 + "zerofrom-derive", 4626 + ] 4627 + 4628 + [[package]] 4629 + name = "zerofrom-derive" 4630 + version = "0.1.6" 4631 + source = "registry+https://github.com/rust-lang/crates.io-index" 4632 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 4633 + dependencies = [ 4634 + "proc-macro2", 4635 + "quote", 4636 + "syn", 4637 + "synstructure", 4638 + ] 4639 + 4640 + [[package]] 4641 + name = "zeroize" 4642 + version = "1.8.2" 4643 + source = "registry+https://github.com/rust-lang/crates.io-index" 4644 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 4645 + dependencies = [ 4646 + "zeroize_derive", 4647 + ] 4648 + 4649 + [[package]] 4650 + name = "zeroize_derive" 4651 + version = "1.4.3" 4652 + source = "registry+https://github.com/rust-lang/crates.io-index" 4653 + checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" 4654 + dependencies = [ 4655 + "proc-macro2", 4656 + "quote", 4657 + "syn", 4658 + ] 4659 + 4660 + [[package]] 4661 + name = "zerotrie" 4662 + version = "0.2.3" 4663 + source = "registry+https://github.com/rust-lang/crates.io-index" 4664 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 4665 + dependencies = [ 4666 + "displaydoc", 4667 + "yoke", 4668 + "zerofrom", 4669 + ] 4670 + 4671 + [[package]] 4672 + name = "zerovec" 4673 + version = "0.11.5" 4674 + source = "registry+https://github.com/rust-lang/crates.io-index" 4675 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 4676 + dependencies = [ 4677 + "yoke", 4678 + "zerofrom", 4679 + "zerovec-derive", 4680 + ] 4681 + 4682 + [[package]] 4683 + name = "zerovec-derive" 4684 + version = "0.11.2" 4685 + source = "registry+https://github.com/rust-lang/crates.io-index" 4686 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 4687 + dependencies = [ 4688 + "proc-macro2", 4689 + "quote", 4690 + "syn", 4691 + ] 4692 + 4693 + [[package]] 4694 + name = "zmij" 4695 + version = "1.0.21" 4696 + source = "registry+https://github.com/rust-lang/crates.io-index" 4697 + checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
+17
Cargo.toml
··· 1 + [package] 2 + name = "p2p_beaver" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + env_logger = "0.11" 8 + iroh = { version = "0.96", features = ["address-lookup-mdns"] } 9 + log = "0.4" 10 + n0-error = "0.1" 11 + n0-future = "0.3" 12 + parking_lot = "0.12" 13 + petname = "2.0" 14 + postcard = "1.1" 15 + serde = "1.0" 16 + thiserror = "2.0" 17 + tokio = { version = "1.49", features = ["signal"] }
+661
LICENSE.txt
··· 1 + GNU AFFERO GENERAL PUBLIC LICENSE 2 + Version 3, 19 November 2007 3 + 4 + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> 5 + Everyone is permitted to copy and distribute verbatim copies 6 + of this license document, but changing it is not allowed. 7 + 8 + Preamble 9 + 10 + The GNU Affero General Public License is a free, copyleft license for 11 + software and other kinds of works, specifically designed to ensure 12 + cooperation with the community in the case of network server software. 13 + 14 + The licenses for most software and other practical works are designed 15 + to take away your freedom to share and change the works. By contrast, 16 + our General Public Licenses are intended to guarantee your freedom to 17 + share and change all versions of a program--to make sure it remains free 18 + software for all its users. 19 + 20 + When we speak of free software, we are referring to freedom, not 21 + price. Our General Public Licenses are designed to make sure that you 22 + have the freedom to distribute copies of free software (and charge for 23 + them if you wish), that you receive source code or can get it if you 24 + want it, that you can change the software or use pieces of it in new 25 + free programs, and that you know you can do these things. 26 + 27 + Developers that use our General Public Licenses protect your rights 28 + with two steps: (1) assert copyright on the software, and (2) offer 29 + you this License which gives you legal permission to copy, distribute 30 + and/or modify the software. 31 + 32 + A secondary benefit of defending all users' freedom is that 33 + improvements made in alternate versions of the program, if they 34 + receive widespread use, become available for other developers to 35 + incorporate. Many developers of free software are heartened and 36 + encouraged by the resulting cooperation. However, in the case of 37 + software used on network servers, this result may fail to come about. 38 + The GNU General Public License permits making a modified version and 39 + letting the public access it on a server without ever releasing its 40 + source code to the public. 41 + 42 + The GNU Affero General Public License is designed specifically to 43 + ensure that, in such cases, the modified source code becomes available 44 + to the community. It requires the operator of a network server to 45 + provide the source code of the modified version running there to the 46 + users of that server. Therefore, public use of a modified version, on 47 + a publicly accessible server, gives the public access to the source 48 + code of the modified version. 49 + 50 + An older license, called the Affero General Public License and 51 + published by Affero, was designed to accomplish similar goals. This is 52 + a different license, not a version of the Affero GPL, but Affero has 53 + released a new version of the Affero GPL which permits relicensing under 54 + this license. 55 + 56 + The precise terms and conditions for copying, distribution and 57 + modification follow. 58 + 59 + TERMS AND CONDITIONS 60 + 61 + 0. Definitions. 62 + 63 + "This License" refers to version 3 of the GNU Affero General Public License. 64 + 65 + "Copyright" also means copyright-like laws that apply to other kinds of 66 + works, such as semiconductor masks. 67 + 68 + "The Program" refers to any copyrightable work licensed under this 69 + License. Each licensee is addressed as "you". "Licensees" and 70 + "recipients" may be individuals or organizations. 71 + 72 + To "modify" a work means to copy from or adapt all or part of the work 73 + in a fashion requiring copyright permission, other than the making of an 74 + exact copy. The resulting work is called a "modified version" of the 75 + earlier work or a work "based on" the earlier work. 76 + 77 + A "covered work" means either the unmodified Program or a work based 78 + on the Program. 79 + 80 + To "propagate" a work means to do anything with it that, without 81 + permission, would make you directly or secondarily liable for 82 + infringement under applicable copyright law, except executing it on a 83 + computer or modifying a private copy. Propagation includes copying, 84 + distribution (with or without modification), making available to the 85 + public, and in some countries other activities as well. 86 + 87 + To "convey" a work means any kind of propagation that enables other 88 + parties to make or receive copies. Mere interaction with a user through 89 + a computer network, with no transfer of a copy, is not conveying. 90 + 91 + An interactive user interface displays "Appropriate Legal Notices" 92 + to the extent that it includes a convenient and prominently visible 93 + feature that (1) displays an appropriate copyright notice, and (2) 94 + tells the user that there is no warranty for the work (except to the 95 + extent that warranties are provided), that licensees may convey the 96 + work under this License, and how to view a copy of this License. If 97 + the interface presents a list of user commands or options, such as a 98 + menu, a prominent item in the list meets this criterion. 99 + 100 + 1. Source Code. 101 + 102 + The "source code" for a work means the preferred form of the work 103 + for making modifications to it. "Object code" means any non-source 104 + form of a work. 105 + 106 + A "Standard Interface" means an interface that either is an official 107 + standard defined by a recognized standards body, or, in the case of 108 + interfaces specified for a particular programming language, one that 109 + is widely used among developers working in that language. 110 + 111 + The "System Libraries" of an executable work include anything, other 112 + than the work as a whole, that (a) is included in the normal form of 113 + packaging a Major Component, but which is not part of that Major 114 + Component, and (b) serves only to enable use of the work with that 115 + Major Component, or to implement a Standard Interface for which an 116 + implementation is available to the public in source code form. A 117 + "Major Component", in this context, means a major essential component 118 + (kernel, window system, and so on) of the specific operating system 119 + (if any) on which the executable work runs, or a compiler used to 120 + produce the work, or an object code interpreter used to run it. 121 + 122 + The "Corresponding Source" for a work in object code form means all 123 + the source code needed to generate, install, and (for an executable 124 + work) run the object code and to modify the work, including scripts to 125 + control those activities. However, it does not include the work's 126 + System Libraries, or general-purpose tools or generally available free 127 + programs which are used unmodified in performing those activities but 128 + which are not part of the work. For example, Corresponding Source 129 + includes interface definition files associated with source files for 130 + the work, and the source code for shared libraries and dynamically 131 + linked subprograms that the work is specifically designed to require, 132 + such as by intimate data communication or control flow between those 133 + subprograms and other parts of the work. 134 + 135 + The Corresponding Source need not include anything that users 136 + can regenerate automatically from other parts of the Corresponding 137 + Source. 138 + 139 + The Corresponding Source for a work in source code form is that 140 + same work. 141 + 142 + 2. Basic Permissions. 143 + 144 + All rights granted under this License are granted for the term of 145 + copyright on the Program, and are irrevocable provided the stated 146 + conditions are met. This License explicitly affirms your unlimited 147 + permission to run the unmodified Program. The output from running a 148 + covered work is covered by this License only if the output, given its 149 + content, constitutes a covered work. This License acknowledges your 150 + rights of fair use or other equivalent, as provided by copyright law. 151 + 152 + You may make, run and propagate covered works that you do not 153 + convey, without conditions so long as your license otherwise remains 154 + in force. You may convey covered works to others for the sole purpose 155 + of having them make modifications exclusively for you, or provide you 156 + with facilities for running those works, provided that you comply with 157 + the terms of this License in conveying all material for which you do 158 + not control copyright. Those thus making or running the covered works 159 + for you must do so exclusively on your behalf, under your direction 160 + and control, on terms that prohibit them from making any copies of 161 + your copyrighted material outside their relationship with you. 162 + 163 + Conveying under any other circumstances is permitted solely under 164 + the conditions stated below. Sublicensing is not allowed; section 10 165 + makes it unnecessary. 166 + 167 + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 168 + 169 + No covered work shall be deemed part of an effective technological 170 + measure under any applicable law fulfilling obligations under article 171 + 11 of the WIPO copyright treaty adopted on 20 December 1996, or 172 + similar laws prohibiting or restricting circumvention of such 173 + measures. 174 + 175 + When you convey a covered work, you waive any legal power to forbid 176 + circumvention of technological measures to the extent such circumvention 177 + is effected by exercising rights under this License with respect to 178 + the covered work, and you disclaim any intention to limit operation or 179 + modification of the work as a means of enforcing, against the work's 180 + users, your or third parties' legal rights to forbid circumvention of 181 + technological measures. 182 + 183 + 4. Conveying Verbatim Copies. 184 + 185 + You may convey verbatim copies of the Program's source code as you 186 + receive it, in any medium, provided that you conspicuously and 187 + appropriately publish on each copy an appropriate copyright notice; 188 + keep intact all notices stating that this License and any 189 + non-permissive terms added in accord with section 7 apply to the code; 190 + keep intact all notices of the absence of any warranty; and give all 191 + recipients a copy of this License along with the Program. 192 + 193 + You may charge any price or no price for each copy that you convey, 194 + and you may offer support or warranty protection for a fee. 195 + 196 + 5. Conveying Modified Source Versions. 197 + 198 + You may convey a work based on the Program, or the modifications to 199 + produce it from the Program, in the form of source code under the 200 + terms of section 4, provided that you also meet all of these conditions: 201 + 202 + a) The work must carry prominent notices stating that you modified 203 + it, and giving a relevant date. 204 + 205 + b) The work must carry prominent notices stating that it is 206 + released under this License and any conditions added under section 207 + 7. This requirement modifies the requirement in section 4 to 208 + "keep intact all notices". 209 + 210 + c) You must license the entire work, as a whole, under this 211 + License to anyone who comes into possession of a copy. This 212 + License will therefore apply, along with any applicable section 7 213 + additional terms, to the whole of the work, and all its parts, 214 + regardless of how they are packaged. This License gives no 215 + permission to license the work in any other way, but it does not 216 + invalidate such permission if you have separately received it. 217 + 218 + d) If the work has interactive user interfaces, each must display 219 + Appropriate Legal Notices; however, if the Program has interactive 220 + interfaces that do not display Appropriate Legal Notices, your 221 + work need not make them do so. 222 + 223 + A compilation of a covered work with other separate and independent 224 + works, which are not by their nature extensions of the covered work, 225 + and which are not combined with it such as to form a larger program, 226 + in or on a volume of a storage or distribution medium, is called an 227 + "aggregate" if the compilation and its resulting copyright are not 228 + used to limit the access or legal rights of the compilation's users 229 + beyond what the individual works permit. Inclusion of a covered work 230 + in an aggregate does not cause this License to apply to the other 231 + parts of the aggregate. 232 + 233 + 6. Conveying Non-Source Forms. 234 + 235 + You may convey a covered work in object code form under the terms 236 + of sections 4 and 5, provided that you also convey the 237 + machine-readable Corresponding Source under the terms of this License, 238 + in one of these ways: 239 + 240 + a) Convey the object code in, or embodied in, a physical product 241 + (including a physical distribution medium), accompanied by the 242 + Corresponding Source fixed on a durable physical medium 243 + customarily used for software interchange. 244 + 245 + b) Convey the object code in, or embodied in, a physical product 246 + (including a physical distribution medium), accompanied by a 247 + written offer, valid for at least three years and valid for as 248 + long as you offer spare parts or customer support for that product 249 + model, to give anyone who possesses the object code either (1) a 250 + copy of the Corresponding Source for all the software in the 251 + product that is covered by this License, on a durable physical 252 + medium customarily used for software interchange, for a price no 253 + more than your reasonable cost of physically performing this 254 + conveying of source, or (2) access to copy the 255 + Corresponding Source from a network server at no charge. 256 + 257 + c) Convey individual copies of the object code with a copy of the 258 + written offer to provide the Corresponding Source. This 259 + alternative is allowed only occasionally and noncommercially, and 260 + only if you received the object code with such an offer, in accord 261 + with subsection 6b. 262 + 263 + d) Convey the object code by offering access from a designated 264 + place (gratis or for a charge), and offer equivalent access to the 265 + Corresponding Source in the same way through the same place at no 266 + further charge. You need not require recipients to copy the 267 + Corresponding Source along with the object code. If the place to 268 + copy the object code is a network server, the Corresponding Source 269 + may be on a different server (operated by you or a third party) 270 + that supports equivalent copying facilities, provided you maintain 271 + clear directions next to the object code saying where to find the 272 + Corresponding Source. Regardless of what server hosts the 273 + Corresponding Source, you remain obligated to ensure that it is 274 + available for as long as needed to satisfy these requirements. 275 + 276 + e) Convey the object code using peer-to-peer transmission, provided 277 + you inform other peers where the object code and Corresponding 278 + Source of the work are being offered to the general public at no 279 + charge under subsection 6d. 280 + 281 + A separable portion of the object code, whose source code is excluded 282 + from the Corresponding Source as a System Library, need not be 283 + included in conveying the object code work. 284 + 285 + A "User Product" is either (1) a "consumer product", which means any 286 + tangible personal property which is normally used for personal, family, 287 + or household purposes, or (2) anything designed or sold for incorporation 288 + into a dwelling. In determining whether a product is a consumer product, 289 + doubtful cases shall be resolved in favor of coverage. For a particular 290 + product received by a particular user, "normally used" refers to a 291 + typical or common use of that class of product, regardless of the status 292 + of the particular user or of the way in which the particular user 293 + actually uses, or expects or is expected to use, the product. A product 294 + is a consumer product regardless of whether the product has substantial 295 + commercial, industrial or non-consumer uses, unless such uses represent 296 + the only significant mode of use of the product. 297 + 298 + "Installation Information" for a User Product means any methods, 299 + procedures, authorization keys, or other information required to install 300 + and execute modified versions of a covered work in that User Product from 301 + a modified version of its Corresponding Source. The information must 302 + suffice to ensure that the continued functioning of the modified object 303 + code is in no case prevented or interfered with solely because 304 + modification has been made. 305 + 306 + If you convey an object code work under this section in, or with, or 307 + specifically for use in, a User Product, and the conveying occurs as 308 + part of a transaction in which the right of possession and use of the 309 + User Product is transferred to the recipient in perpetuity or for a 310 + fixed term (regardless of how the transaction is characterized), the 311 + Corresponding Source conveyed under this section must be accompanied 312 + by the Installation Information. But this requirement does not apply 313 + if neither you nor any third party retains the ability to install 314 + modified object code on the User Product (for example, the work has 315 + been installed in ROM). 316 + 317 + The requirement to provide Installation Information does not include a 318 + requirement to continue to provide support service, warranty, or updates 319 + for a work that has been modified or installed by the recipient, or for 320 + the User Product in which it has been modified or installed. Access to a 321 + network may be denied when the modification itself materially and 322 + adversely affects the operation of the network or violates the rules and 323 + protocols for communication across the network. 324 + 325 + Corresponding Source conveyed, and Installation Information provided, 326 + in accord with this section must be in a format that is publicly 327 + documented (and with an implementation available to the public in 328 + source code form), and must require no special password or key for 329 + unpacking, reading or copying. 330 + 331 + 7. Additional Terms. 332 + 333 + "Additional permissions" are terms that supplement the terms of this 334 + License by making exceptions from one or more of its conditions. 335 + Additional permissions that are applicable to the entire Program shall 336 + be treated as though they were included in this License, to the extent 337 + that they are valid under applicable law. If additional permissions 338 + apply only to part of the Program, that part may be used separately 339 + under those permissions, but the entire Program remains governed by 340 + this License without regard to the additional permissions. 341 + 342 + When you convey a copy of a covered work, you may at your option 343 + remove any additional permissions from that copy, or from any part of 344 + it. (Additional permissions may be written to require their own 345 + removal in certain cases when you modify the work.) You may place 346 + additional permissions on material, added by you to a covered work, 347 + for which you have or can give appropriate copyright permission. 348 + 349 + Notwithstanding any other provision of this License, for material you 350 + add to a covered work, you may (if authorized by the copyright holders of 351 + that material) supplement the terms of this License with terms: 352 + 353 + a) Disclaiming warranty or limiting liability differently from the 354 + terms of sections 15 and 16 of this License; or 355 + 356 + b) Requiring preservation of specified reasonable legal notices or 357 + author attributions in that material or in the Appropriate Legal 358 + Notices displayed by works containing it; or 359 + 360 + c) Prohibiting misrepresentation of the origin of that material, or 361 + requiring that modified versions of such material be marked in 362 + reasonable ways as different from the original version; or 363 + 364 + d) Limiting the use for publicity purposes of names of licensors or 365 + authors of the material; or 366 + 367 + e) Declining to grant rights under trademark law for use of some 368 + trade names, trademarks, or service marks; or 369 + 370 + f) Requiring indemnification of licensors and authors of that 371 + material by anyone who conveys the material (or modified versions of 372 + it) with contractual assumptions of liability to the recipient, for 373 + any liability that these contractual assumptions directly impose on 374 + those licensors and authors. 375 + 376 + All other non-permissive additional terms are considered "further 377 + restrictions" within the meaning of section 10. If the Program as you 378 + received it, or any part of it, contains a notice stating that it is 379 + governed by this License along with a term that is a further 380 + restriction, you may remove that term. If a license document contains 381 + a further restriction but permits relicensing or conveying under this 382 + License, you may add to a covered work material governed by the terms 383 + of that license document, provided that the further restriction does 384 + not survive such relicensing or conveying. 385 + 386 + If you add terms to a covered work in accord with this section, you 387 + must place, in the relevant source files, a statement of the 388 + additional terms that apply to those files, or a notice indicating 389 + where to find the applicable terms. 390 + 391 + Additional terms, permissive or non-permissive, may be stated in the 392 + form of a separately written license, or stated as exceptions; 393 + the above requirements apply either way. 394 + 395 + 8. Termination. 396 + 397 + You may not propagate or modify a covered work except as expressly 398 + provided under this License. Any attempt otherwise to propagate or 399 + modify it is void, and will automatically terminate your rights under 400 + this License (including any patent licenses granted under the third 401 + paragraph of section 11). 402 + 403 + However, if you cease all violation of this License, then your 404 + license from a particular copyright holder is reinstated (a) 405 + provisionally, unless and until the copyright holder explicitly and 406 + finally terminates your license, and (b) permanently, if the copyright 407 + holder fails to notify you of the violation by some reasonable means 408 + prior to 60 days after the cessation. 409 + 410 + Moreover, your license from a particular copyright holder is 411 + reinstated permanently if the copyright holder notifies you of the 412 + violation by some reasonable means, this is the first time you have 413 + received notice of violation of this License (for any work) from that 414 + copyright holder, and you cure the violation prior to 30 days after 415 + your receipt of the notice. 416 + 417 + Termination of your rights under this section does not terminate the 418 + licenses of parties who have received copies or rights from you under 419 + this License. If your rights have been terminated and not permanently 420 + reinstated, you do not qualify to receive new licenses for the same 421 + material under section 10. 422 + 423 + 9. Acceptance Not Required for Having Copies. 424 + 425 + You are not required to accept this License in order to receive or 426 + run a copy of the Program. Ancillary propagation of a covered work 427 + occurring solely as a consequence of using peer-to-peer transmission 428 + to receive a copy likewise does not require acceptance. However, 429 + nothing other than this License grants you permission to propagate or 430 + modify any covered work. These actions infringe copyright if you do 431 + not accept this License. Therefore, by modifying or propagating a 432 + covered work, you indicate your acceptance of this License to do so. 433 + 434 + 10. Automatic Licensing of Downstream Recipients. 435 + 436 + Each time you convey a covered work, the recipient automatically 437 + receives a license from the original licensors, to run, modify and 438 + propagate that work, subject to this License. You are not responsible 439 + for enforcing compliance by third parties with this License. 440 + 441 + An "entity transaction" is a transaction transferring control of an 442 + organization, or substantially all assets of one, or subdividing an 443 + organization, or merging organizations. If propagation of a covered 444 + work results from an entity transaction, each party to that 445 + transaction who receives a copy of the work also receives whatever 446 + licenses to the work the party's predecessor in interest had or could 447 + give under the previous paragraph, plus a right to possession of the 448 + Corresponding Source of the work from the predecessor in interest, if 449 + the predecessor has it or can get it with reasonable efforts. 450 + 451 + You may not impose any further restrictions on the exercise of the 452 + rights granted or affirmed under this License. For example, you may 453 + not impose a license fee, royalty, or other charge for exercise of 454 + rights granted under this License, and you may not initiate litigation 455 + (including a cross-claim or counterclaim in a lawsuit) alleging that 456 + any patent claim is infringed by making, using, selling, offering for 457 + sale, or importing the Program or any portion of it. 458 + 459 + 11. Patents. 460 + 461 + A "contributor" is a copyright holder who authorizes use under this 462 + License of the Program or a work on which the Program is based. The 463 + work thus licensed is called the contributor's "contributor version". 464 + 465 + A contributor's "essential patent claims" are all patent claims 466 + owned or controlled by the contributor, whether already acquired or 467 + hereafter acquired, that would be infringed by some manner, permitted 468 + by this License, of making, using, or selling its contributor version, 469 + but do not include claims that would be infringed only as a 470 + consequence of further modification of the contributor version. For 471 + purposes of this definition, "control" includes the right to grant 472 + patent sublicenses in a manner consistent with the requirements of 473 + this License. 474 + 475 + Each contributor grants you a non-exclusive, worldwide, royalty-free 476 + patent license under the contributor's essential patent claims, to 477 + make, use, sell, offer for sale, import and otherwise run, modify and 478 + propagate the contents of its contributor version. 479 + 480 + In the following three paragraphs, a "patent license" is any express 481 + agreement or commitment, however denominated, not to enforce a patent 482 + (such as an express permission to practice a patent or covenant not to 483 + sue for patent infringement). To "grant" such a patent license to a 484 + party means to make such an agreement or commitment not to enforce a 485 + patent against the party. 486 + 487 + If you convey a covered work, knowingly relying on a patent license, 488 + and the Corresponding Source of the work is not available for anyone 489 + to copy, free of charge and under the terms of this License, through a 490 + publicly available network server or other readily accessible means, 491 + then you must either (1) cause the Corresponding Source to be so 492 + available, or (2) arrange to deprive yourself of the benefit of the 493 + patent license for this particular work, or (3) arrange, in a manner 494 + consistent with the requirements of this License, to extend the patent 495 + license to downstream recipients. "Knowingly relying" means you have 496 + actual knowledge that, but for the patent license, your conveying the 497 + covered work in a country, or your recipient's use of the covered work 498 + in a country, would infringe one or more identifiable patents in that 499 + country that you have reason to believe are valid. 500 + 501 + If, pursuant to or in connection with a single transaction or 502 + arrangement, you convey, or propagate by procuring conveyance of, a 503 + covered work, and grant a patent license to some of the parties 504 + receiving the covered work authorizing them to use, propagate, modify 505 + or convey a specific copy of the covered work, then the patent license 506 + you grant is automatically extended to all recipients of the covered 507 + work and works based on it. 508 + 509 + A patent license is "discriminatory" if it does not include within 510 + the scope of its coverage, prohibits the exercise of, or is 511 + conditioned on the non-exercise of one or more of the rights that are 512 + specifically granted under this License. You may not convey a covered 513 + work if you are a party to an arrangement with a third party that is 514 + in the business of distributing software, under which you make payment 515 + to the third party based on the extent of your activity of conveying 516 + the work, and under which the third party grants, to any of the 517 + parties who would receive the covered work from you, a discriminatory 518 + patent license (a) in connection with copies of the covered work 519 + conveyed by you (or copies made from those copies), or (b) primarily 520 + for and in connection with specific products or compilations that 521 + contain the covered work, unless you entered into that arrangement, 522 + or that patent license was granted, prior to 28 March 2007. 523 + 524 + Nothing in this License shall be construed as excluding or limiting 525 + any implied license or other defenses to infringement that may 526 + otherwise be available to you under applicable patent law. 527 + 528 + 12. No Surrender of Others' Freedom. 529 + 530 + If conditions are imposed on you (whether by court order, agreement or 531 + otherwise) that contradict the conditions of this License, they do not 532 + excuse you from the conditions of this License. If you cannot convey a 533 + covered work so as to satisfy simultaneously your obligations under this 534 + License and any other pertinent obligations, then as a consequence you may 535 + not convey it at all. For example, if you agree to terms that obligate you 536 + to collect a royalty for further conveying from those to whom you convey 537 + the Program, the only way you could satisfy both those terms and this 538 + License would be to refrain entirely from conveying the Program. 539 + 540 + 13. Remote Network Interaction; Use with the GNU General Public License. 541 + 542 + Notwithstanding any other provision of this License, if you modify the 543 + Program, your modified version must prominently offer all users 544 + interacting with it remotely through a computer network (if your version 545 + supports such interaction) an opportunity to receive the Corresponding 546 + Source of your version by providing access to the Corresponding Source 547 + from a network server at no charge, through some standard or customary 548 + means of facilitating copying of software. This Corresponding Source 549 + shall include the Corresponding Source for any work covered by version 3 550 + of the GNU General Public License that is incorporated pursuant to the 551 + following paragraph. 552 + 553 + Notwithstanding any other provision of this License, you have 554 + permission to link or combine any covered work with a work licensed 555 + under version 3 of the GNU General Public License into a single 556 + combined work, and to convey the resulting work. The terms of this 557 + License will continue to apply to the part which is the covered work, 558 + but the work with which it is combined will remain governed by version 559 + 3 of the GNU General Public License. 560 + 561 + 14. Revised Versions of this License. 562 + 563 + The Free Software Foundation may publish revised and/or new versions of 564 + the GNU Affero General Public License from time to time. Such new versions 565 + will be similar in spirit to the present version, but may differ in detail to 566 + address new problems or concerns. 567 + 568 + Each version is given a distinguishing version number. If the 569 + Program specifies that a certain numbered version of the GNU Affero General 570 + Public License "or any later version" applies to it, you have the 571 + option of following the terms and conditions either of that numbered 572 + version or of any later version published by the Free Software 573 + Foundation. If the Program does not specify a version number of the 574 + GNU Affero General Public License, you may choose any version ever published 575 + by the Free Software Foundation. 576 + 577 + If the Program specifies that a proxy can decide which future 578 + versions of the GNU Affero General Public License can be used, that proxy's 579 + public statement of acceptance of a version permanently authorizes you 580 + to choose that version for the Program. 581 + 582 + Later license versions may give you additional or different 583 + permissions. However, no additional obligations are imposed on any 584 + author or copyright holder as a result of your choosing to follow a 585 + later version. 586 + 587 + 15. Disclaimer of Warranty. 588 + 589 + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 590 + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 591 + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 592 + OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 593 + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 594 + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 595 + IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 596 + ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 597 + 598 + 16. Limitation of Liability. 599 + 600 + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 601 + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 602 + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 603 + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 604 + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 605 + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 606 + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 607 + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 608 + SUCH DAMAGES. 609 + 610 + 17. Interpretation of Sections 15 and 16. 611 + 612 + If the disclaimer of warranty and limitation of liability provided 613 + above cannot be given local legal effect according to their terms, 614 + reviewing courts shall apply local law that most closely approximates 615 + an absolute waiver of all civil liability in connection with the 616 + Program, unless a warranty or assumption of liability accompanies a 617 + copy of the Program in return for a fee. 618 + 619 + END OF TERMS AND CONDITIONS 620 + 621 + How to Apply These Terms to Your New Programs 622 + 623 + If you develop a new program, and you want it to be of the greatest 624 + possible use to the public, the best way to achieve this is to make it 625 + free software which everyone can redistribute and change under these terms. 626 + 627 + To do so, attach the following notices to the program. It is safest 628 + to attach them to the start of each source file to most effectively 629 + state the exclusion of warranty; and each file should have at least 630 + the "copyright" line and a pointer to where the full notice is found. 631 + 632 + <one line to give the program's name and a brief idea of what it does.> 633 + Copyright (C) <year> <name of author> 634 + 635 + This program is free software: you can redistribute it and/or modify 636 + it under the terms of the GNU Affero General Public License as published by 637 + the Free Software Foundation, either version 3 of the License, or 638 + (at your option) any later version. 639 + 640 + This program is distributed in the hope that it will be useful, 641 + but WITHOUT ANY WARRANTY; without even the implied warranty of 642 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 643 + GNU Affero General Public License for more details. 644 + 645 + You should have received a copy of the GNU Affero General Public License 646 + along with this program. If not, see <https://www.gnu.org/licenses/>. 647 + 648 + Also add information on how to contact you by electronic and paper mail. 649 + 650 + If your software can interact with users remotely through a computer 651 + network, you should also make sure that it provides a way for users to 652 + get its source. For example, if your program is a web application, its 653 + interface could display a "Source" link that leads users to an archive 654 + of the code. There are many ways you could offer source, and different 655 + solutions will be better for different programs; see section 13 for the 656 + specific requirements. 657 + 658 + You should also get your employer (if you work as a programmer) or school, 659 + if any, to sign a "copyright disclaimer" for the program, if necessary. 660 + For more information on this, and how to apply and follow the GNU AGPL, see 661 + <https://www.gnu.org/licenses/>.
+273
src/lib.rs
··· 1 + /* SPDX Id: AGPL-3.0-or-later */ 2 + 3 + mod message_protocol; 4 + mod packet; 5 + mod pairing_hook; 6 + mod pairing_protocol; 7 + mod state; 8 + 9 + use packet::PostcardPacket; 10 + use std::sync::Arc; 11 + use tokio::task::AbortHandle; 12 + 13 + use iroh::address_lookup::UserData; 14 + use iroh::address_lookup::mdns::MdnsAddressLookup; 15 + use iroh::endpoint::{ClosedStream, ConnectError, ConnectionError, WriteError}; 16 + use iroh::{Endpoint, EndpointId, RelayMode, protocol::Router}; 17 + use log::{error, info}; 18 + use n0_future::StreamExt; 19 + use parking_lot::Mutex; 20 + use std::sync::mpsc::Sender; 21 + use thiserror::Error; 22 + 23 + use crate::pairing_hook::PAIRING_ALPN; 24 + pub use crate::state::PeerEvent; 25 + use crate::state::{EndpointDescription, EndpointStatus, PairingCommand, SharedState, State}; 26 + 27 + #[derive(Debug, Error)] 28 + pub enum PairingError { 29 + #[error("Unknown remote endpoint")] 30 + UnknownRemote, 31 + #[error("Endpoint pairing already requested")] 32 + AlreadyRequested, 33 + #[error("Invalid state during pairing")] 34 + InvalidState, 35 + #[error("Failure to receive command Ack")] 36 + FailedAck, 37 + #[error("Pairing rejected")] 38 + Rejected, 39 + #[error("Failed to connect")] 40 + Connect(#[from] ConnectError), 41 + #[error("Connection error")] 42 + Connection(#[from] ConnectionError), 43 + #[error("Write error")] 44 + Write(#[from] WriteError), 45 + #[error("Closed stream")] 46 + ClosedStream(#[from] ClosedStream), 47 + #[error("Postcard error")] 48 + Postcard(#[from] postcard::Error), 49 + } 50 + 51 + #[derive(Clone)] 52 + pub struct PairingManagerInner { 53 + state: SharedState, 54 + 55 + router: Router, 56 + mdns_handle: AbortHandle, 57 + } 58 + 59 + #[derive(Clone)] 60 + pub struct PairingManager { 61 + inner: Option<PairingManagerInner>, 62 + } 63 + 64 + impl PairingManager { 65 + pub async fn create(sender: Sender<PeerEvent>, name: &str) -> Self { 66 + let state = Arc::new(Mutex::new(State::new(sender.clone()))); 67 + 68 + let user_data: UserData = name.to_owned().try_into().unwrap(); 69 + let endpoint = Endpoint::empty_builder(RelayMode::Disabled) 70 + .user_data_for_address_lookup(user_data) 71 + .hooks(pairing_hook::PairingHook::new(Arc::clone(&state))) 72 + .bind() 73 + .await 74 + .unwrap(); 75 + 76 + info!("Endpoint {name}, {}", endpoint.id()); 77 + 78 + let mdns = MdnsAddressLookup::builder().build(endpoint.id()).unwrap(); 79 + endpoint.address_lookup().add(mdns.clone()); 80 + 81 + let disco_state = Arc::clone(&state); 82 + let mdns_handle = tokio::spawn(async move { 83 + let mut events = mdns.subscribe().await; 84 + while let Some(event) = events.next().await { 85 + // Update the state. 86 + disco_state.lock().on_discovery(&event); 87 + } 88 + }); 89 + 90 + let router = Router::builder(endpoint) 91 + .accept( 92 + PAIRING_ALPN, 93 + pairing_protocol::PairingProtocol::new(Arc::clone(&state)), 94 + ) 95 + .spawn(); 96 + 97 + let inner = PairingManagerInner { 98 + state, 99 + router, 100 + mdns_handle: mdns_handle.abort_handle(), 101 + }; 102 + Self { inner: Some(inner) } 103 + } 104 + 105 + // Send a pairing request to an endpoint. 106 + pub async fn request_pairing(&self, id: &EndpointId) -> Result<(), PairingError> { 107 + info!("Pairing with {id}"); 108 + let Some(ref inner) = self.inner else { 109 + error!("Not initialized"); 110 + return Err(PairingError::InvalidState); 111 + }; 112 + 113 + let addr = { 114 + let state = inner.state.lock(); 115 + let Some(remote) = state.by_id(id) else { 116 + error!("Can't request pairing from unknown remote {id}"); 117 + return Err(PairingError::UnknownRemote); 118 + }; 119 + remote.addr() 120 + }; 121 + 122 + // Don't request pairing twice with the same endpoint. 123 + { 124 + let mut state = inner.state.lock(); 125 + if !state.has_requested(id) { 126 + state.set_pairing_requested(id); 127 + } else { 128 + error!("Already requested pairing with {id}"); 129 + return Err(PairingError::AlreadyRequested); 130 + } 131 + } 132 + 133 + let connection = inner.router.endpoint().connect(addr, PAIRING_ALPN).await?; 134 + 135 + // Send the the request. 136 + let (mut sender, mut receiver) = connection.open_bi().await?; 137 + 138 + let command = PairingCommand::Request; 139 + PostcardPacket::send(command, &mut sender) 140 + .await 141 + .expect("Failed to send"); 142 + 143 + // Wait for accept or reject 144 + let command: PairingCommand = PostcardPacket::recv(&mut receiver) 145 + .await 146 + .expect("Failed to receive"); 147 + 148 + let accepted = match command { 149 + PairingCommand::Accept => true, 150 + PairingCommand::Reject => false, 151 + PairingCommand::Request => { 152 + error!("Unexpected Request in response to a pairing request"); 153 + return Err(PairingError::InvalidState); 154 + } 155 + PairingCommand::Ack => { 156 + error!("Unexpected Ack in response to a pairing request"); 157 + return Err(PairingError::InvalidState); 158 + } 159 + }; 160 + 161 + // Send Ack 162 + PostcardPacket::send(PairingCommand::Ack, &mut sender) 163 + .await 164 + .expect("Failed to send Ack"); 165 + 166 + let mut state = inner.state.lock(); 167 + state.remove_pairing_requested(id); 168 + sender.finish()?; 169 + 170 + if accepted { 171 + state.notify(PeerEvent::PairingAccepted(*id)); 172 + state.set_status(id, EndpointStatus::PairedConnected); 173 + Ok(()) 174 + } else { 175 + state.remove_pairing_requested(id); 176 + state.notify(PeerEvent::PairingRejected(*id)); 177 + Err(PairingError::Rejected) 178 + } 179 + } 180 + 181 + // Common code for accept/reject of a pairing request 182 + async fn send_pairing_response( 183 + &self, 184 + from: &EndpointId, 185 + command: PairingCommand, 186 + ) -> Result<(), PairingError> { 187 + info!("Sending pairing response: {command:?}"); 188 + let Some(ref inner) = self.inner else { 189 + error!("Not initialized"); 190 + return Err(PairingError::InvalidState); 191 + }; 192 + 193 + if inner.state.lock().by_id(from).is_none() { 194 + error!("Can't send pairing response to unknown remote {from}"); 195 + return Err(PairingError::UnknownRemote); 196 + }; 197 + 198 + let (sender, mut ack_receiver) = { 199 + let mut state = inner.state.lock(); 200 + let Some((sender, ack_receiver)) = state.take_pairing_responder(from) else { 201 + error!("No responder for {from}"); 202 + return Err(PairingError::UnknownRemote); 203 + }; 204 + (sender, ack_receiver) 205 + }; 206 + 207 + sender 208 + .send(command) 209 + .await 210 + .expect("Failed to send to the responder"); 211 + 212 + // Wait for the Ack to be received. 213 + let ack = ack_receiver.recv().await.unwrap_or(false); 214 + 215 + if ack { 216 + Ok(()) 217 + } else { 218 + Err(PairingError::FailedAck) 219 + } 220 + } 221 + 222 + // Accept a pairing request 223 + pub async fn accept_pairing(&self, from: &EndpointId) -> Result<(), PairingError> { 224 + let Some(ref inner) = self.inner else { 225 + error!("Not initialized"); 226 + return Err(PairingError::InvalidState); 227 + }; 228 + 229 + self.send_pairing_response(from, PairingCommand::Accept) 230 + .await 231 + .map(|_| { 232 + // Add the endpoint to the set of pending acks if successfully sending. 233 + inner.state.lock().set_pending_ack(from); 234 + }) 235 + } 236 + 237 + // Reject a pairing request 238 + pub async fn reject_pairing(&self, from: &EndpointId) -> Result<(), PairingError> { 239 + self.send_pairing_response(from, PairingCommand::Reject) 240 + .await 241 + } 242 + 243 + // Get the list of current known peers. 244 + pub fn peers(&self) -> Vec<EndpointDescription> { 245 + let Some(ref inner) = self.inner else { 246 + error!("Not initialized"); 247 + return vec![]; 248 + }; 249 + 250 + inner 251 + .state 252 + .lock() 253 + .endpoints() 254 + .values() 255 + .map(|e| e.into()) 256 + .collect() 257 + } 258 + 259 + pub async fn stop(&mut self) { 260 + let Some(ref inner) = self.inner else { 261 + error!("Not initialized"); 262 + return; 263 + }; 264 + 265 + if !inner.router.is_shutdown() { 266 + let _ = inner.mdns_handle.abort(); 267 + let _ = inner.router.shutdown().await; 268 + } 269 + 270 + // Force dropping the mdns advertising tasks. 271 + self.inner = None; 272 + } 273 + }
+59
src/main.rs
··· 1 + use iroh::address_lookup::DiscoveryEvent; 2 + use log::info; 3 + use p2p_beaver::{PairingManager, PeerEvent}; 4 + use std::sync::mpsc::channel; 5 + 6 + #[tokio::main] 7 + async fn main() { 8 + env_logger::init(); 9 + 10 + let (sender, receiver) = channel(); 11 + let name = petname::petname(3, "-").unwrap(); 12 + let manager = PairingManager::create(sender, &name).await; 13 + info!("PairingManager started!"); 14 + 15 + let start_pairing = std::env::args().len() > 1; 16 + 17 + loop { 18 + match receiver.recv() { 19 + Ok(event) => match event { 20 + PeerEvent::Discovery(DiscoveryEvent::Discovered { endpoint_info, .. }) => { 21 + info!( 22 + "MDNS discovered: {:?} {:?}", 23 + endpoint_info.endpoint_id, 24 + endpoint_info.user_data() 25 + ); 26 + if start_pairing { 27 + let _ = manager.request_pairing(&endpoint_info.endpoint_id).await; 28 + } 29 + } 30 + PeerEvent::Discovery(DiscoveryEvent::Expired { endpoint_id }) => { 31 + info!("MDNS expired: {endpoint_id}"); 32 + } 33 + PeerEvent::PairingRequest(endpoint_id) => { 34 + info!("Accepting pairing request from {endpoint_id}"); 35 + manager 36 + .accept_pairing(&endpoint_id) 37 + .await 38 + .expect("Failed to accept"); 39 + } 40 + PeerEvent::PairingAccepted(endpoint_id) => { 41 + info!("Pairing accepted from {endpoint_id}"); 42 + } 43 + PeerEvent::PairingRejected(endpoint_id) => { 44 + info!("Pairing rejected from {endpoint_id}"); 45 + } 46 + PeerEvent::PairingFailed(endpoint_id) => { 47 + info!("Pairing failed with {endpoint_id}"); 48 + } 49 + PeerEvent::Message(endpoint_id, payload) => { 50 + info!("Message of {} bytes from {}", payload.len(), endpoint_id); 51 + } 52 + }, 53 + Err(err) => { 54 + println!("Channel closed: {err}"); 55 + break; 56 + } 57 + } 58 + } 59 + }
+53
src/message_protocol.rs
··· 1 + /* SPDX Id: AGPL-3.0-or-later */ 2 + 3 + use iroh::{ 4 + endpoint::Connection, 5 + protocol::{AcceptError, ProtocolHandler}, 6 + }; 7 + use log::{error, info}; 8 + 9 + use crate::{PeerEvent, packet::BasePacket, state::SharedState}; 10 + 11 + #[derive(Debug)] 12 + pub(crate) struct MessageProtocol { 13 + state: SharedState, 14 + } 15 + 16 + impl MessageProtocol { 17 + pub(crate) fn new(state: SharedState) -> Self { 18 + Self { state } 19 + } 20 + } 21 + 22 + /// Message protocol. 23 + /// Both sides can send messages back and forth with 24 + /// no pre-determined pattern. 25 + impl ProtocolHandler for MessageProtocol { 26 + async fn accept(&self, connection: Connection) -> Result<(), AcceptError> { 27 + let remote_id = connection.remote_id(); 28 + info!( 29 + "accepted connection on {:?} from {:?}", 30 + String::from_utf8_lossy(connection.alpn()), 31 + remote_id 32 + ); 33 + 34 + // 1. Accept the bidirectional stream. 35 + let (mut sender, mut receiver) = connection.accept_bi().await?; 36 + 37 + // 2. Relay all the incoming messages. 38 + loop { 39 + match BasePacket::recv(&mut receiver).await { 40 + Ok(payload) => { 41 + self.state 42 + .lock() 43 + .notify(PeerEvent::Message(remote_id, payload)); 44 + } 45 + Err(err) => { 46 + error!("Error reading message packet: {err}"); 47 + break; 48 + } 49 + } 50 + } 51 + Ok(()) 52 + } 53 + }
+59
src/packet.rs
··· 1 + /* SPDX Id: AGPL-3.0-or-later */ 2 + 3 + use iroh::endpoint::{ReadExactError, RecvStream, SendStream, WriteError}; 4 + use serde::Serialize; 5 + use serde::de::DeserializeOwned; 6 + use thiserror::Error; 7 + 8 + #[derive(Debug, Error)] 9 + pub enum PacketError { 10 + #[error("ReadExact error")] 11 + ReadExact(#[from] ReadExactError), 12 + #[error("Write error")] 13 + Write(#[from] WriteError), 14 + #[error("Postcard error")] 15 + Postcard(#[from] postcard::Error), 16 + #[error("I/O error")] 17 + Io(#[from] std::io::Error), 18 + } 19 + 20 + pub(crate) struct BasePacket {} 21 + 22 + impl BasePacket { 23 + pub(crate) async fn send(value: &[u8], stream: &mut SendStream) -> Result<(), PacketError> { 24 + let len: u32 = value.len() as _; 25 + stream.write_all(&len.to_be_bytes()).await?; 26 + stream.write_all(value).await?; 27 + Ok(()) 28 + } 29 + 30 + pub(crate) async fn recv(stream: &mut RecvStream) -> Result<Vec<u8>, PacketError> { 31 + let mut len_buf: [u8; 4] = [0; 4]; 32 + stream.read_exact(&mut len_buf).await?; 33 + let len = u32::from_be_bytes(len_buf); 34 + let mut payload = Vec::with_capacity(len as _); 35 + let _remaining = payload.spare_capacity_mut(); 36 + unsafe { payload.set_len(len as _) }; 37 + stream.read_exact(&mut payload).await?; 38 + Ok(payload) 39 + } 40 + } 41 + 42 + pub(crate) struct PostcardPacket {} 43 + 44 + impl PostcardPacket { 45 + pub(crate) async fn send<T: Serialize>( 46 + value: T, 47 + stream: &mut SendStream, 48 + ) -> Result<(), PacketError> { 49 + let data = postcard::to_allocvec(&value)?; 50 + BasePacket::send(&data, stream).await 51 + } 52 + 53 + pub(crate) async fn recv<T: DeserializeOwned>( 54 + stream: &mut RecvStream, 55 + ) -> Result<T, PacketError> { 56 + let payload = BasePacket::recv(stream).await?; 57 + Ok(postcard::from_bytes(&payload)?) 58 + } 59 + }
+50
src/pairing_hook.rs
··· 1 + /* SPDX Id: AGPL-3.0-or-later */ 2 + 3 + use iroh::endpoint::{AfterHandshakeOutcome, ConnectionInfo, EndpointHooks, Side}; 4 + use log::info; 5 + 6 + use crate::state::EndpointStatus; 7 + use crate::state::SharedState; 8 + 9 + pub(crate) static PAIRING_ALPN: &[u8] = b"beaver-web/pairing/1"; 10 + pub(crate) static MESSAGE_ALPN: &[u8] = b"beaver-web/message/1"; 11 + 12 + #[derive(Debug)] 13 + pub(crate) struct PairingHook { 14 + state: SharedState, 15 + } 16 + 17 + impl PairingHook { 18 + pub(crate) fn new(state: SharedState) -> Self { 19 + Self { state } 20 + } 21 + } 22 + 23 + impl EndpointHooks for PairingHook { 24 + async fn after_handshake<'a>(&'a self, conn: &'a ConnectionInfo) -> AfterHandshakeOutcome { 25 + // Always allow outgoing connections. 26 + if conn.side() == Side::Client { 27 + return AfterHandshakeOutcome::Accept; 28 + } 29 + 30 + info!( 31 + "Incoming hook with alpn={:?}", 32 + String::from_utf8_lossy(conn.alpn()) 33 + ); 34 + 35 + // For message protocol, only allow PairedConnected endpoints. 36 + if conn.alpn() == MESSAGE_ALPN 37 + && !self 38 + .state 39 + .lock() 40 + .has(&conn.remote_id(), EndpointStatus::PairedConnected) 41 + { 42 + return AfterHandshakeOutcome::Reject { 43 + error_code: 401u32.into(), 44 + reason: b"not paired".into(), 45 + }; 46 + } 47 + 48 + AfterHandshakeOutcome::Accept 49 + } 50 + }
+138
src/pairing_protocol.rs
··· 1 + /* SPDX Id: AGPL-3.0-or-later */ 2 + 3 + use std::collections::BTreeSet; 4 + 5 + use iroh::EndpointAddr; 6 + use iroh::endpoint::Connection; 7 + use iroh::protocol::{AcceptError, ProtocolHandler}; 8 + use log::{error, info}; 9 + 10 + use tokio::sync::mpsc::channel as tokio_channel; 11 + 12 + use crate::packet::PostcardPacket; 13 + pub use crate::state::PeerEvent; 14 + use crate::state::{EndpointProxy, EndpointStatus, PairingCommand, SharedState}; 15 + 16 + #[derive(Debug)] 17 + pub(crate) struct PairingProtocol { 18 + state: SharedState, 19 + } 20 + 21 + impl PairingProtocol { 22 + pub(crate) fn new(state: SharedState) -> Self { 23 + Self { state } 24 + } 25 + } 26 + 27 + /// Pairing handshake: 28 + /// NodeA NodeB 29 + /// Request -----------------> 30 + /// <---------------------- Accept/Reject 31 + /// Ack ----------------------> 32 + /// 33 + impl ProtocolHandler for PairingProtocol { 34 + async fn accept(&self, connection: Connection) -> Result<(), AcceptError> { 35 + let remote_id = connection.remote_id(); 36 + info!( 37 + "accepted connection on {:?} from {:?}", 38 + String::from_utf8_lossy(connection.alpn()), 39 + remote_id 40 + ); 41 + 42 + let path_info = connection.to_info().selected_path().unwrap(); 43 + let remote_addr = path_info.remote_addr(); 44 + let mut addrs = BTreeSet::new(); 45 + addrs.insert(remote_addr.clone()); 46 + let addr = EndpointAddr { 47 + id: remote_id, 48 + addrs, 49 + }; 50 + 51 + // If we don't know about this endpoint yet, add it to our set as Discovered. 52 + { 53 + let mut state = self.state.lock(); 54 + if !state.has_any(&remote_id) { 55 + info!("Registering auto-discovered endpoint at {remote_id}"); 56 + let description = EndpointProxy::new( 57 + "<auto-discovered>", 58 + remote_id, 59 + addr.clone(), 60 + EndpointStatus::Discovered, 61 + ); 62 + state.add_endpoint(&remote_id, description); 63 + } 64 + } 65 + 66 + let (mut sender, mut receiver) = connection.accept_bi().await?; 67 + 68 + let command: PairingCommand = PostcardPacket::recv(&mut receiver) 69 + .await 70 + .expect("Failed to read"); 71 + 72 + // Step 1. Receive a request, store the tokio channel sender and ack receiver in the state. 73 + match command { 74 + PairingCommand::Request => { 75 + self.state 76 + .lock() 77 + .notify(PeerEvent::PairingRequest(remote_id)); 78 + } 79 + _ => { 80 + error!("Unexpected command: {command:?}"); 81 + return Err(AcceptError::from(n0_error::AnyError::from(format!( 82 + "Unexpected command: {command:?}" 83 + )))); 84 + } 85 + } 86 + 87 + let (tokio_sender, mut tokio_receiver) = tokio_channel(2); 88 + let (ack_sender, ack_receiver) = tokio_channel(2); 89 + { 90 + let mut state = self.state.lock(); 91 + state.set_pairing_responder(&remote_id, (tokio_sender, ack_receiver)); 92 + } 93 + 94 + // Step 2. Wait for the Accept or Reject response on the channel and send it back. 95 + let answer = tokio_receiver 96 + .recv() 97 + .await 98 + .expect("Failed to receive pairing answer"); 99 + 100 + let accepted = answer == PairingCommand::Accept; 101 + 102 + PostcardPacket::send(answer, &mut sender) 103 + .await 104 + .expect("Failed to send"); 105 + 106 + // Step 3. Wait for the Ack from the other side. 107 + let command: PairingCommand = PostcardPacket::recv(&mut receiver) 108 + .await 109 + .expect("Failed to read"); 110 + 111 + match command { 112 + PairingCommand::Ack => { 113 + { 114 + let mut state = self.state.lock(); 115 + if accepted { 116 + state.notify(PeerEvent::PairingAccepted(remote_id)); 117 + state.set_status(&remote_id, EndpointStatus::PairedConnected); 118 + } else { 119 + state.notify(PeerEvent::PairingRejected(remote_id)); 120 + } 121 + } 122 + let _ = ack_sender.send(true).await; 123 + } 124 + _ => { 125 + self.state 126 + .lock() 127 + .notify(PeerEvent::PairingFailed(remote_id)); 128 + let _ = ack_sender.send(false).await; 129 + error!("Unexpected command: {command:?}"); 130 + return Err(AcceptError::from(n0_error::AnyError::from(format!( 131 + "Unexpected command: {command:?}" 132 + )))); 133 + } 134 + } 135 + 136 + Ok(()) 137 + } 138 + }
+254
src/state.rs
··· 1 + /* SPDX Id: AGPL-3.0-or-later */ 2 + 3 + use std::{ 4 + collections::{HashMap, HashSet}, 5 + sync::Arc, 6 + }; 7 + 8 + use iroh::{ 9 + EndpointAddr, EndpointId, 10 + address_lookup::DiscoveryEvent, 11 + endpoint::{RecvStream, SendStream}, 12 + }; 13 + 14 + use log::{info, warn}; 15 + use parking_lot::Mutex; 16 + use serde::{Deserialize, Serialize}; 17 + use std::sync::mpsc::Sender; 18 + use tokio::sync::mpsc::{Receiver as TokioReceiver, Sender as TokioSender}; 19 + 20 + pub(crate) type SharedState = Arc<Mutex<State>>; 21 + 22 + #[derive(Clone, Debug, PartialEq)] 23 + pub enum EndpointStatus { 24 + PairedConnected, 25 + PairedDisconnected, 26 + Discovered, 27 + } 28 + 29 + #[derive(Debug)] 30 + 31 + pub(crate) struct EndpointProxy { 32 + name: String, 33 + id: EndpointId, 34 + addr: EndpointAddr, 35 + status: EndpointStatus, 36 + message_sender: Option<SendStream>, 37 + } 38 + 39 + impl EndpointProxy { 40 + pub(crate) fn new( 41 + name: &str, 42 + id: EndpointId, 43 + addr: EndpointAddr, 44 + status: EndpointStatus, 45 + ) -> Self { 46 + Self { 47 + name: name.to_owned(), 48 + id: id.to_owned(), 49 + addr, 50 + status, 51 + message_sender: None, 52 + } 53 + } 54 + 55 + pub(crate) fn addr(&self) -> EndpointAddr { 56 + self.addr.clone() 57 + } 58 + } 59 + 60 + // PairingFailed represents protocol errors such as 61 + // failure to complete the Ack handshake. 62 + #[derive(Debug)] 63 + pub enum PeerEvent { 64 + Discovery(DiscoveryEvent), 65 + PairingRequest(EndpointId), 66 + PairingAccepted(EndpointId), 67 + PairingRejected(EndpointId), 68 + PairingFailed(EndpointId), 69 + Message(EndpointId, Vec<u8>), 70 + } 71 + 72 + #[derive(Serialize, Deserialize, Debug, PartialEq)] 73 + pub(crate) enum PairingCommand { 74 + Request, 75 + Accept, 76 + Reject, 77 + Ack, 78 + } 79 + 80 + #[derive(Debug)] 81 + pub struct EndpointDescription { 82 + pub name: String, 83 + pub id: EndpointId, 84 + pub addr: EndpointAddr, 85 + pub status: EndpointStatus, 86 + } 87 + 88 + impl From<&EndpointProxy> for EndpointDescription { 89 + fn from(value: &EndpointProxy) -> Self { 90 + Self { 91 + name: value.name.clone(), 92 + id: value.id, 93 + addr: value.addr.clone(), 94 + status: value.status.clone(), 95 + } 96 + } 97 + } 98 + 99 + #[derive(Debug)] 100 + pub(crate) struct State { 101 + /// The list of known endpoints, with their status. 102 + endpoints: HashMap<EndpointId, EndpointProxy>, 103 + 104 + /// The set of endpoints that we sent pairing requests to. 105 + pairing_requested: HashSet<EndpointId>, 106 + 107 + /// The senders used to provide accept/reject responses 108 + pairing_responders: HashMap<EndpointId, (TokioSender<PairingCommand>, TokioReceiver<bool>)>, 109 + 110 + /// The set of endpoints that we are waiting to receive ack from. 111 + pending_ack: HashSet<EndpointId>, 112 + 113 + /// The sender side of the channel used to receive high level events. 114 + sender: Sender<PeerEvent>, 115 + } 116 + 117 + impl State { 118 + pub(crate) fn new(sender: Sender<PeerEvent>) -> Self { 119 + Self { 120 + endpoints: HashMap::new(), 121 + pairing_requested: HashSet::new(), 122 + pairing_responders: HashMap::new(), 123 + pending_ack: HashSet::new(), 124 + sender, 125 + } 126 + } 127 + 128 + pub(crate) fn endpoints(&self) -> &HashMap<EndpointId, EndpointProxy> { 129 + &self.endpoints 130 + } 131 + 132 + pub(crate) fn notify(&self, event: PeerEvent) { 133 + self.sender.send(event).expect("Failed to send {event:?}"); 134 + } 135 + 136 + pub(crate) fn has(&self, id: &EndpointId, status: EndpointStatus) -> bool { 137 + self.endpoints 138 + .get(id) 139 + .is_some_and(|desc| desc.status == status) 140 + } 141 + 142 + pub(crate) fn has_any(&self, id: &EndpointId) -> bool { 143 + self.endpoints.contains_key(id) 144 + } 145 + 146 + pub(crate) fn by_id(&self, id: &EndpointId) -> Option<&EndpointProxy> { 147 + self.endpoints.get(id) 148 + } 149 + 150 + pub(crate) fn add_endpoint(&mut self, id: &EndpointId, description: EndpointProxy) { 151 + self.endpoints.insert(*id, description); 152 + } 153 + 154 + fn set_message_sender(&mut self, id: &EndpointId, stream: SendStream) { 155 + info!("set_message_sender for {id}"); 156 + if let Some(desc) = self.endpoints.get_mut(id) { 157 + desc.message_sender = Some(stream); 158 + } 159 + } 160 + 161 + fn remove_message_sender(&mut self, id: &EndpointId) { 162 + info!("remove_message_sender for {id}"); 163 + if let Some(desc) = self.endpoints.get_mut(id) { 164 + desc.message_sender = None; 165 + } 166 + } 167 + 168 + pub(crate) fn set_status(&mut self, id: &EndpointId, status: EndpointStatus) { 169 + if let Some(desc) = self.endpoints.get_mut(id) { 170 + desc.status = status; 171 + } 172 + } 173 + 174 + fn discovered(&self, id: &EndpointId) -> bool { 175 + self.endpoints 176 + .get(id) 177 + .is_some_and(|desc| desc.status != EndpointStatus::PairedDisconnected) 178 + } 179 + 180 + pub(crate) fn has_requested(&self, id: &EndpointId) -> bool { 181 + self.pairing_requested.contains(id) 182 + } 183 + 184 + pub(crate) fn set_pairing_requested(&mut self, id: &EndpointId) { 185 + self.pairing_requested.insert(*id); 186 + } 187 + 188 + pub(crate) fn remove_pairing_requested(&mut self, id: &EndpointId) { 189 + self.pairing_requested.remove(id); 190 + } 191 + 192 + pub(crate) fn set_pending_ack(&mut self, id: &EndpointId) { 193 + self.pending_ack.insert(*id); 194 + } 195 + 196 + pub(crate) fn set_pairing_responder( 197 + &mut self, 198 + id: &EndpointId, 199 + params: (TokioSender<PairingCommand>, TokioReceiver<bool>), 200 + ) { 201 + self.pairing_responders.insert(*id, params); 202 + } 203 + 204 + pub(crate) fn take_pairing_responder( 205 + &mut self, 206 + id: &EndpointId, 207 + ) -> Option<(TokioSender<PairingCommand>, TokioReceiver<bool>)> { 208 + self.pairing_responders.remove(id) 209 + } 210 + 211 + pub(crate) fn on_discovery(&mut self, event: &DiscoveryEvent) { 212 + match event { 213 + DiscoveryEvent::Discovered { endpoint_info, .. } => { 214 + // Ignore if we already know about this endpoint. 215 + if self.discovered(&endpoint_info.endpoint_id) { 216 + return; 217 + } 218 + 219 + // Add it as Discovered and notify the listener. 220 + let description = EndpointProxy { 221 + name: endpoint_info 222 + .data 223 + .user_data() 224 + .map(|d| d.as_ref()) 225 + .unwrap_or_else(|| "<no name>") 226 + .into(), 227 + id: endpoint_info.endpoint_id, 228 + addr: endpoint_info.to_endpoint_addr(), 229 + status: EndpointStatus::Discovered, 230 + message_sender: None, 231 + }; 232 + self.endpoints 233 + .insert(endpoint_info.endpoint_id, description); 234 + self.notify(PeerEvent::Discovery(event.clone())); 235 + } 236 + DiscoveryEvent::Expired { endpoint_id } => { 237 + // PairedConnected -> PairedDisconnected 238 + // Discovered -> removed 239 + if let Some(mut old_desc) = self.endpoints.remove(endpoint_id) { 240 + if old_desc.status == EndpointStatus::PairedConnected { 241 + old_desc.status = EndpointStatus::PairedDisconnected; 242 + self.endpoints.insert(*endpoint_id, old_desc); 243 + } else if old_desc.status != EndpointStatus::Discovered { 244 + warn!( 245 + "Unexpected status for expired endpoint: {:?}", 246 + old_desc.status 247 + ); 248 + } 249 + self.notify(PeerEvent::Discovery(event.clone())); 250 + } 251 + } 252 + } 253 + } 254 + }
+327
tests/pairing.rs
··· 1 + use iroh::{EndpointId, address_lookup::DiscoveryEvent}; 2 + use p2p_beaver::{PairingError, PairingManager, PeerEvent}; 3 + use parking_lot::Mutex; 4 + use std::sync::Arc; 5 + use std::sync::mpsc::{Receiver, channel}; 6 + 7 + type PairingReceiver = Receiver<PeerEvent>; 8 + 9 + // Helper: create a named pairing manager. 10 + async fn create_manager(name: &str) -> (PairingManager, PairingReceiver) { 11 + let (sender, receiver) = channel(); 12 + let manager = PairingManager::create(sender, name).await; 13 + (manager, receiver) 14 + } 15 + 16 + // Helper: wait for 2 managers to have discovered each other. 17 + // Returns the endpoints discovered by each receiver. 18 + fn wait_for_discovery( 19 + receiver1: Arc<Mutex<PairingReceiver>>, 20 + receiver2: Arc<Mutex<PairingReceiver>>, 21 + ) -> (EndpointId, EndpointId) { 22 + let handle1 = std::thread::spawn(move || { 23 + loop { 24 + match receiver1.lock().recv() { 25 + Ok(event) => match event { 26 + PeerEvent::Discovery(DiscoveryEvent::Discovered { endpoint_info, .. }) => { 27 + return endpoint_info.endpoint_id; 28 + } 29 + _ => {} 30 + }, 31 + Err(err) => { 32 + panic!("Should not error! {err:?}"); 33 + } 34 + } 35 + } 36 + }); 37 + 38 + let handle2 = std::thread::spawn(move || { 39 + loop { 40 + match receiver2.lock().recv() { 41 + Ok(event) => match event { 42 + PeerEvent::Discovery(DiscoveryEvent::Discovered { endpoint_info, .. }) => { 43 + return endpoint_info.endpoint_id; 44 + } 45 + _ => {} 46 + }, 47 + Err(err) => { 48 + panic!("Should not error! {err:?}"); 49 + } 50 + } 51 + } 52 + }); 53 + 54 + let endpoint1 = handle1.join().unwrap(); 55 + let endpoint2 = handle2.join().unwrap(); 56 + 57 + (endpoint1, endpoint2) 58 + } 59 + 60 + // Easier assert for PairingError 61 + macro_rules! assert_pairing { 62 + ($observed:expr, $expected:pat) => { 63 + match $observed.err().unwrap() { 64 + $expected => {} 65 + _ => panic!("expected: {{$expected}} but got {{$observed}}"), 66 + } 67 + }; 68 + } 69 + 70 + // Discover and stop. 71 + #[tokio::test(flavor = "multi_thread")] 72 + async fn discover_and_shutdown() { 73 + let (mut manager1, receiver1) = create_manager("test-1").await; 74 + let (mut manager2, receiver2) = create_manager("test-2").await; 75 + 76 + let handle1 = std::thread::spawn(move || { 77 + loop { 78 + match receiver1.recv() { 79 + Ok(event) => match event { 80 + PeerEvent::Discovery(DiscoveryEvent::Discovered { endpoint_info, .. }) => { 81 + let endpoint_name = format!("{}", endpoint_info.user_data().unwrap()); 82 + assert_eq!(endpoint_name, "test-2"); 83 + break; 84 + } 85 + _ => {} 86 + }, 87 + Err(_err) => { 88 + break; 89 + } 90 + } 91 + } 92 + }); 93 + 94 + let handle2 = std::thread::spawn(move || { 95 + loop { 96 + match receiver2.recv() { 97 + Ok(event) => match event { 98 + PeerEvent::Discovery(DiscoveryEvent::Discovered { endpoint_info, .. }) => { 99 + let endpoint_name = format!("{}", endpoint_info.user_data().unwrap()); 100 + assert_eq!(endpoint_name, "test-1"); 101 + break; 102 + } 103 + _ => {} 104 + }, 105 + Err(_err) => { 106 + break; 107 + } 108 + } 109 + } 110 + }); 111 + 112 + let _ = handle1.join(); 113 + let _ = handle2.join(); 114 + 115 + manager1.stop().await; 116 + manager2.stop().await; 117 + } 118 + 119 + // Discover, and wait for second peer to disappear 120 + #[tokio::test(flavor = "multi_thread")] 121 + async fn discover_and_expire() { 122 + env_logger::init(); 123 + 124 + let (mut manager1, receiver1) = create_manager("test-1").await; 125 + let (mut manager2, receiver2) = create_manager("test-2").await; 126 + 127 + let receiver1 = Arc::new(Mutex::new(receiver1)); 128 + let receiver2 = Arc::new(Mutex::new(receiver2)); 129 + 130 + let (_endpoint1, endpoint2) = 131 + wait_for_discovery(Arc::clone(&receiver1), Arc::clone(&receiver2)); 132 + 133 + let handle1 = std::thread::spawn(move || { 134 + loop { 135 + match receiver1.lock().recv() { 136 + Ok(event) => { 137 + println!("mgr1 event: {event:?}"); 138 + match event { 139 + PeerEvent::Discovery(DiscoveryEvent::Discovered { 140 + endpoint_info, .. 141 + }) => { 142 + let endpoint_name = format!("{}", endpoint_info.user_data().unwrap()); 143 + assert_eq!(endpoint_name, "test-2"); 144 + } 145 + PeerEvent::Discovery(DiscoveryEvent::Expired { endpoint_id }) => { 146 + assert_eq!(endpoint_id, endpoint2); 147 + break; 148 + } 149 + _ => {} 150 + } 151 + } 152 + Err(_err) => { 153 + break; 154 + } 155 + } 156 + } 157 + }); 158 + 159 + assert_eq!(manager2.peers().len(), 1); 160 + assert_eq!(manager1.peers().len(), 1); 161 + manager2.stop().await; 162 + 163 + let _ = handle1.join(); 164 + assert_eq!(manager1.peers().len(), 0); 165 + manager1.stop().await; 166 + } 167 + 168 + // Peer1 requests pairing, peer2 rejects it. 169 + #[tokio::test(flavor = "multi_thread")] 170 + async fn reject_pairing() { 171 + env_logger::init(); 172 + 173 + let (mut manager1, receiver1) = create_manager("test-1").await; 174 + let (mut manager2, receiver2) = create_manager("test-2").await; 175 + 176 + let receiver1 = Arc::new(Mutex::new(receiver1)); 177 + let receiver2 = Arc::new(Mutex::new(receiver2)); 178 + 179 + let (endpoint1, endpoint2) = wait_for_discovery(Arc::clone(&receiver1), Arc::clone(&receiver2)); 180 + 181 + let handle1 = std::thread::spawn(move || { 182 + // let mut peer2_id = None; 183 + loop { 184 + match receiver1.lock().recv() { 185 + Ok(event) => { 186 + println!("mgr1 event: {event:?}"); 187 + match event { 188 + PeerEvent::PairingRejected(endpoint) => { 189 + assert_eq!(endpoint, endpoint1); 190 + break; 191 + } 192 + _ => {} 193 + } 194 + } 195 + Err(_err) => { 196 + break; 197 + } 198 + } 199 + } 200 + }); 201 + 202 + let mgr = manager2.clone(); 203 + let handle2 = std::thread::spawn(move || { 204 + loop { 205 + let rt = tokio::runtime::Builder::new_current_thread() 206 + .enable_all() 207 + .build() 208 + .unwrap(); 209 + 210 + match receiver2.lock().recv() { 211 + Ok(event) => { 212 + println!("mgr2 event: {event:?}"); 213 + let mgr = mgr.clone(); 214 + match event { 215 + PeerEvent::PairingRequest(endpoint) => { 216 + assert_eq!(endpoint, endpoint2); 217 + rt.block_on(async { 218 + mgr.reject_pairing(&endpoint) 219 + .await 220 + .expect("failed to reject pairing"); 221 + }); 222 + } 223 + PeerEvent::PairingRejected(endpoint) => { 224 + assert_eq!(endpoint, endpoint2); 225 + break; 226 + } 227 + _ => {} 228 + } 229 + } 230 + Err(_err) => { 231 + break; 232 + } 233 + } 234 + } 235 + }); 236 + 237 + let response = manager1.request_pairing(&endpoint1).await; 238 + assert_pairing!(response, PairingError::Rejected); 239 + 240 + let _ = handle1.join(); 241 + let _ = handle2.join(); 242 + 243 + manager1.stop().await; 244 + manager2.stop().await; 245 + } 246 + 247 + // Peer1 requests pairing, peer2 accepts it. 248 + #[tokio::test(flavor = "multi_thread")] 249 + async fn accept_pairing() { 250 + env_logger::init(); 251 + 252 + let (mut manager1, receiver1) = create_manager("test-1").await; 253 + let (mut manager2, receiver2) = create_manager("test-2").await; 254 + 255 + let receiver1 = Arc::new(Mutex::new(receiver1)); 256 + let receiver2 = Arc::new(Mutex::new(receiver2)); 257 + 258 + let (endpoint1, endpoint2) = wait_for_discovery(Arc::clone(&receiver1), Arc::clone(&receiver2)); 259 + 260 + let handle1 = std::thread::spawn(move || { 261 + // let mut peer2_id = None; 262 + loop { 263 + match receiver1.lock().recv() { 264 + Ok(event) => { 265 + println!("mgr1 event: {event:?}"); 266 + match event { 267 + PeerEvent::PairingAccepted(endpoint) => { 268 + assert_eq!(endpoint, endpoint1); 269 + break; 270 + } 271 + _ => {} 272 + } 273 + } 274 + Err(_err) => { 275 + break; 276 + } 277 + } 278 + } 279 + }); 280 + 281 + let mgr = manager2.clone(); 282 + let handle2 = std::thread::spawn(move || { 283 + loop { 284 + let rt = tokio::runtime::Builder::new_current_thread() 285 + .enable_all() 286 + .build() 287 + .unwrap(); 288 + 289 + match receiver2.lock().recv() { 290 + Ok(event) => { 291 + println!("mgr2 event: {event:?}"); 292 + let mgr = mgr.clone(); 293 + match event { 294 + PeerEvent::PairingRequest(endpoint) => { 295 + assert_eq!(endpoint, endpoint2); 296 + rt.block_on(async { 297 + mgr.accept_pairing(&endpoint) 298 + .await 299 + .expect("failed to reject pairing"); 300 + }); 301 + } 302 + PeerEvent::PairingAccepted(endpoint) => { 303 + assert_eq!(endpoint, endpoint2); 304 + break; 305 + } 306 + _ => {} 307 + } 308 + } 309 + Err(_err) => { 310 + break; 311 + } 312 + } 313 + } 314 + }); 315 + 316 + let response = manager1.request_pairing(&endpoint1).await; 317 + assert!(response.is_ok()); 318 + 319 + let _ = handle1.join(); 320 + let _ = handle2.join(); 321 + 322 + assert_eq!(manager1.peers().len(), 1); 323 + assert_eq!(manager2.peers().len(), 1); 324 + 325 + manager1.stop().await; 326 + manager2.stop().await; 327 + }