Rewild Your Web
18
fork

Configure Feed

Select the types of activity you want to include in your feed.

build: vendor the beaver_p2p crate

Signed-off-by: webbeef <me@webbeef.org>

webbeef d90980c1 35b2b10e

+4276 -116
+2135 -115
Cargo.lock
··· 39 39 ] 40 40 41 41 [[package]] 42 + name = "acto" 43 + version = "0.8.0" 44 + source = "registry+https://github.com/rust-lang/crates.io-index" 45 + checksum = "148541f13c28e3e840354ee4d6c99046c10be2c81068bbd23b9e3a38f95a917e" 46 + dependencies = [ 47 + "parking_lot", 48 + "pin-project-lite", 49 + "rustc_version", 50 + "smol_str 0.1.24", 51 + "sync_wrapper", 52 + "tokio", 53 + "tracing", 54 + ] 55 + 56 + [[package]] 42 57 name = "addr2line" 43 58 version = "0.25.1" 44 59 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 59 74 source = "registry+https://github.com/rust-lang/crates.io-index" 60 75 checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" 61 76 dependencies = [ 62 - "crypto-common", 77 + "crypto-common 0.1.7", 63 78 "generic-array", 64 79 ] 65 80 66 81 [[package]] 82 + name = "aead" 83 + version = "0.6.0-rc.10" 84 + source = "registry+https://github.com/rust-lang/crates.io-index" 85 + checksum = "6b657e772794c6b04730ea897b66a058ccd866c16d1967da05eeeecec39043fe" 86 + dependencies = [ 87 + "crypto-common 0.2.1", 88 + "inout 0.2.2", 89 + ] 90 + 91 + [[package]] 67 92 name = "aes" 68 93 version = "0.8.4" 69 94 source = "registry+https://github.com/rust-lang/crates.io-index" 70 95 checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" 71 96 dependencies = [ 72 97 "cfg-if", 73 - "cipher", 74 - "cpufeatures", 98 + "cipher 0.4.4", 99 + "cpufeatures 0.2.17", 100 + ] 101 + 102 + [[package]] 103 + name = "aes" 104 + version = "0.9.0-rc.4" 105 + source = "registry+https://github.com/rust-lang/crates.io-index" 106 + checksum = "04097e08a47d9ad181c2e1f4a5fabc9ae06ce8839a333ba9a949bcb0d31fd2a3" 107 + dependencies = [ 108 + "cipher 0.5.1", 109 + "cpubits", 110 + "cpufeatures 0.2.17", 111 + "zeroize", 75 112 ] 76 113 77 114 [[package]] ··· 80 117 source = "registry+https://github.com/rust-lang/crates.io-index" 81 118 checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" 82 119 dependencies = [ 83 - "aead", 84 - "aes", 85 - "cipher", 86 - "ctr", 87 - "ghash", 120 + "aead 0.5.2", 121 + "aes 0.8.4", 122 + "cipher 0.4.4", 123 + "ctr 0.9.2", 124 + "ghash 0.5.1", 125 + "subtle", 126 + ] 127 + 128 + [[package]] 129 + name = "aes-gcm" 130 + version = "0.11.0-rc.3" 131 + source = "registry+https://github.com/rust-lang/crates.io-index" 132 + checksum = "e22c0c90bbe8d4f77c3ca9ddabe41a1f8382d6fc1f7cea89459d0f320371f972" 133 + dependencies = [ 134 + "aead 0.6.0-rc.10", 135 + "aes 0.9.0-rc.4", 136 + "cipher 0.5.1", 137 + "ctr 0.10.0-rc.4", 138 + "ghash 0.6.0", 88 139 "subtle", 140 + "zeroize", 89 141 ] 90 142 91 143 [[package]] ··· 94 146 source = "registry+https://github.com/rust-lang/crates.io-index" 95 147 checksum = "69fa2b352dcefb5f7f3a5fb840e02665d311d878955380515e4fd50095dd3d8c" 96 148 dependencies = [ 97 - "aes", 149 + "aes 0.8.4", 98 150 ] 99 151 100 152 [[package]] ··· 314 366 dependencies = [ 315 367 "base64ct", 316 368 "blake2", 317 - "cpufeatures", 369 + "cpufeatures 0.2.17", 318 370 "password-hash", 319 371 ] 320 372 ··· 358 410 ] 359 411 360 412 [[package]] 413 + name = "async-compat" 414 + version = "0.2.5" 415 + source = "registry+https://github.com/rust-lang/crates.io-index" 416 + checksum = "a1ba85bc55464dcbf728b56d97e119d673f4cf9062be330a9a26f3acf504a590" 417 + dependencies = [ 418 + "futures-core", 419 + "futures-io", 420 + "once_cell", 421 + "pin-project-lite", 422 + "tokio", 423 + ] 424 + 425 + [[package]] 361 426 name = "async-compression" 362 427 version = "0.4.41" 363 428 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 381 446 ] 382 447 383 448 [[package]] 449 + name = "async-trait" 450 + version = "0.1.89" 451 + source = "registry+https://github.com/rust-lang/crates.io-index" 452 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 453 + dependencies = [ 454 + "proc-macro2", 455 + "quote", 456 + "syn 2.0.117", 457 + ] 458 + 459 + [[package]] 384 460 name = "async-tungstenite" 385 461 version = "0.33.0" 386 462 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 401 477 ] 402 478 403 479 [[package]] 480 + name = "async_io_stream" 481 + version = "0.3.3" 482 + source = "registry+https://github.com/rust-lang/crates.io-index" 483 + checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" 484 + dependencies = [ 485 + "futures", 486 + "pharos", 487 + "rustc_version", 488 + ] 489 + 490 + [[package]] 404 491 name = "atk" 405 492 version = "0.18.2" 406 493 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 424 511 ] 425 512 426 513 [[package]] 514 + name = "atomic-polyfill" 515 + version = "1.0.3" 516 + source = "registry+https://github.com/rust-lang/crates.io-index" 517 + checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" 518 + dependencies = [ 519 + "critical-section", 520 + ] 521 + 522 + [[package]] 427 523 name = "atomic-waker" 428 524 version = "1.1.2" 429 525 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 434 530 version = "0.1.13" 435 531 source = "registry+https://github.com/rust-lang/crates.io-index" 436 532 checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" 533 + 534 + [[package]] 535 + name = "attohttpc" 536 + version = "0.30.1" 537 + source = "registry+https://github.com/rust-lang/crates.io-index" 538 + checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" 539 + dependencies = [ 540 + "base64 0.22.1", 541 + "http 1.4.0", 542 + "log", 543 + "url", 544 + ] 437 545 438 546 [[package]] 439 547 name = "autocfg" ··· 559 667 ] 560 668 561 669 [[package]] 670 + name = "backon" 671 + version = "1.6.0" 672 + source = "registry+https://github.com/rust-lang/crates.io-index" 673 + checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" 674 + dependencies = [ 675 + "fastrand", 676 + "gloo-timers", 677 + "tokio", 678 + ] 679 + 680 + [[package]] 562 681 name = "backtrace" 563 682 version = "0.3.76" 564 683 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 580 699 checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 581 700 582 701 [[package]] 702 + name = "base16ct" 703 + version = "1.0.0" 704 + source = "registry+https://github.com/rust-lang/crates.io-index" 705 + checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" 706 + 707 + [[package]] 708 + name = "base32" 709 + version = "0.5.1" 710 + source = "registry+https://github.com/rust-lang/crates.io-index" 711 + checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" 712 + 713 + [[package]] 583 714 name = "base64" 584 715 version = "0.12.3" 585 716 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 602 733 version = "1.8.3" 603 734 source = "registry+https://github.com/rust-lang/crates.io-index" 604 735 checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" 736 + 737 + [[package]] 738 + name = "beaver-p2p" 739 + version = "0.1.0" 740 + dependencies = [ 741 + "env_logger", 742 + "iroh", 743 + "iroh-persist", 744 + "log", 745 + "n0-error", 746 + "n0-future", 747 + "parking_lot", 748 + "petname", 749 + "postcard", 750 + "serde", 751 + "thiserror 2.0.18", 752 + "tokio", 753 + ] 605 754 606 755 [[package]] 607 756 name = "beaver-shell" ··· 715 864 source = "registry+https://github.com/rust-lang/crates.io-index" 716 865 checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" 717 866 dependencies = [ 718 - "digest", 867 + "digest 0.10.7", 868 + ] 869 + 870 + [[package]] 871 + name = "blake3" 872 + version = "1.8.3" 873 + source = "registry+https://github.com/rust-lang/crates.io-index" 874 + checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" 875 + dependencies = [ 876 + "arrayref", 877 + "arrayvec", 878 + "cc", 879 + "cfg-if", 880 + "constant_time_eq", 881 + "cpufeatures 0.2.17", 719 882 ] 720 883 721 884 [[package]] ··· 731 894 checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 732 895 dependencies = [ 733 896 "generic-array", 897 + ] 898 + 899 + [[package]] 900 + name = "block-buffer" 901 + version = "0.11.0" 902 + source = "registry+https://github.com/rust-lang/crates.io-index" 903 + checksum = "96eb4cdd6cf1b31d671e9efe75c5d1ec614776856cefbe109ca373554a6d514f" 904 + dependencies = [ 905 + "hybrid-array 0.4.7", 906 + ] 907 + 908 + [[package]] 909 + name = "block-buffer" 910 + version = "0.12.0" 911 + source = "registry+https://github.com/rust-lang/crates.io-index" 912 + checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" 913 + dependencies = [ 914 + "hybrid-array 0.4.7", 915 + "zeroize", 734 916 ] 735 917 736 918 [[package]] ··· 960 1142 source = "registry+https://github.com/rust-lang/crates.io-index" 961 1143 checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" 962 1144 dependencies = [ 963 - "cipher", 1145 + "cipher 0.4.4", 964 1146 ] 965 1147 966 1148 [[package]] ··· 1002 1184 1003 1185 [[package]] 1004 1186 name = "cfg-expr" 1005 - version = "0.20.6" 1187 + version = "0.20.7" 1006 1188 source = "registry+https://github.com/rust-lang/crates.io-index" 1007 - checksum = "78cef5b5a1a6827c7322ae2a636368a573006b27cfa76c7ebd53e834daeaab6a" 1189 + checksum = "3c6b04e07d8080154ed4ac03546d9a2b303cc2fe1901ba0b35b301516e289368" 1008 1190 dependencies = [ 1009 1191 "smallvec", 1010 1192 "target-lexicon 0.13.3", ··· 1038 1220 checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" 1039 1221 dependencies = [ 1040 1222 "cfg-if", 1041 - "cipher", 1042 - "cpufeatures", 1223 + "cipher 0.4.4", 1224 + "cpufeatures 0.2.17", 1225 + ] 1226 + 1227 + [[package]] 1228 + name = "chacha20" 1229 + version = "0.10.0" 1230 + source = "registry+https://github.com/rust-lang/crates.io-index" 1231 + checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" 1232 + dependencies = [ 1233 + "cfg-if", 1234 + "cipher 0.5.1", 1235 + "cpufeatures 0.3.0", 1236 + "zeroize", 1043 1237 ] 1044 1238 1045 1239 [[package]] ··· 1048 1242 source = "registry+https://github.com/rust-lang/crates.io-index" 1049 1243 checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" 1050 1244 dependencies = [ 1051 - "aead", 1052 - "chacha20", 1053 - "cipher", 1054 - "poly1305", 1245 + "aead 0.5.2", 1246 + "chacha20 0.9.1", 1247 + "cipher 0.4.4", 1248 + "poly1305 0.8.0", 1055 1249 "zeroize", 1056 1250 ] 1057 1251 ··· 1113 1307 source = "registry+https://github.com/rust-lang/crates.io-index" 1114 1308 checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 1115 1309 dependencies = [ 1116 - "crypto-common", 1117 - "inout", 1310 + "crypto-common 0.1.7", 1311 + "inout 0.1.4", 1312 + "zeroize", 1313 + ] 1314 + 1315 + [[package]] 1316 + name = "cipher" 1317 + version = "0.5.1" 1318 + source = "registry+https://github.com/rust-lang/crates.io-index" 1319 + checksum = "e34d8227fe1ba289043aeb13792056ff80fd6de1a9f49137a5f499de8e8c78ea" 1320 + dependencies = [ 1321 + "block-buffer 0.12.0", 1322 + "crypto-common 0.2.1", 1323 + "inout 0.2.2", 1118 1324 "zeroize", 1119 1325 ] 1120 1326 ··· 1136 1342 checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" 1137 1343 dependencies = [ 1138 1344 "clap_builder", 1345 + "clap_derive", 1139 1346 ] 1140 1347 1141 1348 [[package]] ··· 1144 1351 source = "registry+https://github.com/rust-lang/crates.io-index" 1145 1352 checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" 1146 1353 dependencies = [ 1354 + "anstream", 1147 1355 "anstyle", 1148 1356 "clap_lex", 1357 + "strsim", 1358 + ] 1359 + 1360 + [[package]] 1361 + name = "clap_derive" 1362 + version = "4.5.55" 1363 + source = "registry+https://github.com/rust-lang/crates.io-index" 1364 + checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" 1365 + dependencies = [ 1366 + "heck 0.5.0", 1367 + "proc-macro2", 1368 + "quote", 1369 + "syn 2.0.117", 1149 1370 ] 1150 1371 1151 1372 [[package]] ··· 1171 1392 dependencies = [ 1172 1393 "cc", 1173 1394 ] 1395 + 1396 + [[package]] 1397 + name = "cmov" 1398 + version = "0.5.2" 1399 + source = "registry+https://github.com/rust-lang/crates.io-index" 1400 + checksum = "de0758edba32d61d1fd9f4d69491b47604b91ee2f7e6b33de7e54ca4ebe55dc3" 1174 1401 1175 1402 [[package]] 1176 1403 name = "cobs" ··· 1259 1486 checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 1260 1487 1261 1488 [[package]] 1489 + name = "const-oid" 1490 + version = "0.10.2" 1491 + source = "registry+https://github.com/rust-lang/crates.io-index" 1492 + checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" 1493 + 1494 + [[package]] 1495 + name = "constant_time_eq" 1496 + version = "0.4.2" 1497 + source = "registry+https://github.com/rust-lang/crates.io-index" 1498 + checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" 1499 + 1500 + [[package]] 1262 1501 name = "content-security-policy" 1263 1502 version = "0.6.0" 1264 1503 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1270 1509 "percent-encoding", 1271 1510 "regex", 1272 1511 "serde", 1273 - "sha2", 1512 + "sha2 0.10.9", 1274 1513 "url", 1275 1514 ] 1276 1515 1277 1516 [[package]] 1517 + name = "convert_case" 1518 + version = "0.10.0" 1519 + source = "registry+https://github.com/rust-lang/crates.io-index" 1520 + checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" 1521 + dependencies = [ 1522 + "unicode-segmentation", 1523 + ] 1524 + 1525 + [[package]] 1278 1526 name = "cookie" 1279 1527 version = "0.16.2" 1280 1528 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1292 1540 dependencies = [ 1293 1541 "time", 1294 1542 "version_check", 1543 + ] 1544 + 1545 + [[package]] 1546 + name = "cordyceps" 1547 + version = "0.3.4" 1548 + source = "registry+https://github.com/rust-lang/crates.io-index" 1549 + checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" 1550 + dependencies = [ 1551 + "loom", 1552 + "tracing", 1295 1553 ] 1296 1554 1297 1555 [[package]] ··· 1386 1644 ] 1387 1645 1388 1646 [[package]] 1647 + name = "cpubits" 1648 + version = "0.1.0" 1649 + source = "registry+https://github.com/rust-lang/crates.io-index" 1650 + checksum = "5ef0c543070d296ea414df2dd7625d1b24866ce206709d8a4a424f28377f5861" 1651 + 1652 + [[package]] 1389 1653 name = "cpufeatures" 1390 1654 version = "0.2.17" 1391 1655 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1395 1659 ] 1396 1660 1397 1661 [[package]] 1662 + name = "cpufeatures" 1663 + version = "0.3.0" 1664 + source = "registry+https://github.com/rust-lang/crates.io-index" 1665 + checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" 1666 + dependencies = [ 1667 + "libc", 1668 + ] 1669 + 1670 + [[package]] 1398 1671 name = "crc32fast" 1399 1672 version = "1.5.0" 1400 1673 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1438 1711 "cast", 1439 1712 "itertools 0.10.5", 1440 1713 ] 1714 + 1715 + [[package]] 1716 + name = "critical-section" 1717 + version = "1.2.0" 1718 + source = "registry+https://github.com/rust-lang/crates.io-index" 1719 + checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" 1441 1720 1442 1721 [[package]] 1443 1722 name = "crossbeam-channel" ··· 1503 1782 ] 1504 1783 1505 1784 [[package]] 1785 + name = "crypto-common" 1786 + version = "0.2.1" 1787 + source = "registry+https://github.com/rust-lang/crates.io-index" 1788 + checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" 1789 + dependencies = [ 1790 + "hybrid-array 0.4.7", 1791 + ] 1792 + 1793 + [[package]] 1506 1794 name = "cssparser" 1507 1795 version = "0.36.0" 1508 1796 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1532 1820 source = "registry+https://github.com/rust-lang/crates.io-index" 1533 1821 checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" 1534 1822 dependencies = [ 1535 - "cipher", 1823 + "cipher 0.4.4", 1824 + ] 1825 + 1826 + [[package]] 1827 + name = "ctr" 1828 + version = "0.10.0-rc.4" 1829 + source = "registry+https://github.com/rust-lang/crates.io-index" 1830 + checksum = "fee683dd898fbd052617b4514bc31f98bc32081a83b69ec46adef3b1ef4ae36f" 1831 + dependencies = [ 1832 + "cipher 0.5.1", 1833 + ] 1834 + 1835 + [[package]] 1836 + name = "ctutils" 1837 + version = "0.4.0" 1838 + source = "registry+https://github.com/rust-lang/crates.io-index" 1839 + checksum = "1005a6d4446f5120ef475ad3d2af2b30c49c2c9c6904258e3bb30219bebed5e4" 1840 + dependencies = [ 1841 + "cmov", 1536 1842 ] 1537 1843 1538 1844 [[package]] ··· 1548 1854 checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" 1549 1855 dependencies = [ 1550 1856 "cfg-if", 1551 - "cpufeatures", 1857 + "cpufeatures 0.2.17", 1858 + "curve25519-dalek-derive", 1859 + "fiat-crypto 0.2.9", 1860 + "rustc_version", 1861 + "subtle", 1862 + "zeroize", 1863 + ] 1864 + 1865 + [[package]] 1866 + name = "curve25519-dalek" 1867 + version = "5.0.0-pre.1" 1868 + source = "registry+https://github.com/rust-lang/crates.io-index" 1869 + checksum = "6f9200d1d13637f15a6acb71e758f64624048d85b31a5fdbfd8eca1e2687d0b7" 1870 + dependencies = [ 1871 + "cfg-if", 1872 + "cpufeatures 0.2.17", 1552 1873 "curve25519-dalek-derive", 1553 - "fiat-crypto", 1874 + "digest 0.11.0-rc.10", 1875 + "fiat-crypto 0.3.0", 1876 + "rand_core 0.9.5", 1554 1877 "rustc_version", 1878 + "serde", 1555 1879 "subtle", 1556 1880 "zeroize", 1557 1881 ] ··· 1587 1911 "ident_case", 1588 1912 "proc-macro2", 1589 1913 "quote", 1914 + "strsim", 1590 1915 "syn 2.0.117", 1591 1916 ] 1592 1917 ··· 1629 1954 source = "registry+https://github.com/rust-lang/crates.io-index" 1630 1955 checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 1631 1956 dependencies = [ 1632 - "const-oid", 1957 + "const-oid 0.9.6", 1633 1958 "der_derive", 1634 - "pem-rfc7468", 1959 + "pem-rfc7468 0.7.0", 1960 + "zeroize", 1961 + ] 1962 + 1963 + [[package]] 1964 + name = "der" 1965 + version = "0.8.0" 1966 + source = "registry+https://github.com/rust-lang/crates.io-index" 1967 + checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" 1968 + dependencies = [ 1969 + "const-oid 0.10.2", 1970 + "pem-rfc7468 1.0.0", 1635 1971 "zeroize", 1636 1972 ] 1637 1973 ··· 1654 1990 dependencies = [ 1655 1991 "powerfmt", 1656 1992 "serde_core", 1993 + ] 1994 + 1995 + [[package]] 1996 + name = "derive_builder" 1997 + version = "0.20.2" 1998 + source = "registry+https://github.com/rust-lang/crates.io-index" 1999 + checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" 2000 + dependencies = [ 2001 + "derive_builder_macro", 2002 + ] 2003 + 2004 + [[package]] 2005 + name = "derive_builder_core" 2006 + version = "0.20.2" 2007 + source = "registry+https://github.com/rust-lang/crates.io-index" 2008 + checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" 2009 + dependencies = [ 2010 + "darling", 2011 + "proc-macro2", 2012 + "quote", 2013 + "syn 2.0.117", 2014 + ] 2015 + 2016 + [[package]] 2017 + name = "derive_builder_macro" 2018 + version = "0.20.2" 2019 + source = "registry+https://github.com/rust-lang/crates.io-index" 2020 + checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" 2021 + dependencies = [ 2022 + "derive_builder_core", 2023 + "syn 2.0.117", 1657 2024 ] 1658 2025 1659 2026 [[package]] ··· 1671 2038 source = "registry+https://github.com/rust-lang/crates.io-index" 1672 2039 checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" 1673 2040 dependencies = [ 2041 + "convert_case", 1674 2042 "proc-macro2", 1675 2043 "quote", 1676 2044 "rustc_version", 1677 2045 "syn 2.0.117", 2046 + "unicode-xid", 1678 2047 ] 2048 + 2049 + [[package]] 2050 + name = "des" 2051 + version = "0.9.0-rc.3" 2052 + source = "registry+https://github.com/rust-lang/crates.io-index" 2053 + checksum = "3214053e68a813b9c06ef61075c844f3a1cdeb307d8998ea8555c063caa52fa9" 2054 + dependencies = [ 2055 + "cipher 0.5.1", 2056 + ] 2057 + 2058 + [[package]] 2059 + name = "diatomic-waker" 2060 + version = "0.2.3" 2061 + source = "registry+https://github.com/rust-lang/crates.io-index" 2062 + checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" 1679 2063 1680 2064 [[package]] 1681 2065 name = "digest" ··· 1683 2067 source = "registry+https://github.com/rust-lang/crates.io-index" 1684 2068 checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 1685 2069 dependencies = [ 1686 - "block-buffer", 1687 - "const-oid", 1688 - "crypto-common", 2070 + "block-buffer 0.10.4", 2071 + "const-oid 0.9.6", 2072 + "crypto-common 0.1.7", 1689 2073 "subtle", 2074 + ] 2075 + 2076 + [[package]] 2077 + name = "digest" 2078 + version = "0.11.0-rc.10" 2079 + source = "registry+https://github.com/rust-lang/crates.io-index" 2080 + checksum = "afa94b64bfc6549e6e4b5a3216f22593224174083da7a90db47e951c4fb31725" 2081 + dependencies = [ 2082 + "block-buffer 0.11.0", 2083 + "const-oid 0.10.2", 2084 + "crypto-common 0.2.1", 1690 2085 ] 1691 2086 1692 2087 [[package]] ··· 1756 2151 checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" 1757 2152 dependencies = [ 1758 2153 "bitflags 2.11.0", 2154 + "block2 0.6.2", 2155 + "libc", 1759 2156 "objc2 0.6.4", 1760 2157 ] 1761 2158 ··· 1777 2174 checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" 1778 2175 dependencies = [ 1779 2176 "libloading 0.8.9", 2177 + ] 2178 + 2179 + [[package]] 2180 + name = "dlopen2" 2181 + version = "0.5.0" 2182 + source = "registry+https://github.com/rust-lang/crates.io-index" 2183 + checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" 2184 + dependencies = [ 2185 + "libc", 2186 + "once_cell", 2187 + "winapi", 1780 2188 ] 1781 2189 1782 2190 [[package]] ··· 1834 2242 "winapi", 1835 2243 "wio", 1836 2244 ] 2245 + 2246 + [[package]] 2247 + name = "dyn-clone" 2248 + version = "1.0.20" 2249 + source = "registry+https://github.com/rust-lang/crates.io-index" 2250 + checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 1837 2251 1838 2252 [[package]] 1839 2253 name = "ecdsa" ··· 1841 2255 source = "registry+https://github.com/rust-lang/crates.io-index" 1842 2256 checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 1843 2257 dependencies = [ 1844 - "der", 1845 - "digest", 2258 + "der 0.7.10", 2259 + "digest 0.10.7", 1846 2260 "elliptic-curve", 1847 2261 "rfc6979", 1848 - "signature", 1849 - "spki", 2262 + "signature 2.2.0", 2263 + "spki 0.7.3", 2264 + ] 2265 + 2266 + [[package]] 2267 + name = "ed25519" 2268 + version = "3.0.0-rc.4" 2269 + source = "registry+https://github.com/rust-lang/crates.io-index" 2270 + checksum = "c6e914c7c52decb085cea910552e24c63ac019e3ab8bf001ff736da9a9d9d890" 2271 + dependencies = [ 2272 + "pkcs8 0.11.0-rc.11", 2273 + "serde", 2274 + "signature 3.0.0-rc.10", 2275 + ] 2276 + 2277 + [[package]] 2278 + name = "ed25519-dalek" 2279 + version = "3.0.0-pre.1" 2280 + source = "registry+https://github.com/rust-lang/crates.io-index" 2281 + checksum = "ad207ed88a133091f83224265eac21109930db09bedcad05d5252f2af2de20a1" 2282 + dependencies = [ 2283 + "curve25519-dalek 5.0.0-pre.1", 2284 + "ed25519", 2285 + "rand_core 0.9.5", 2286 + "serde", 2287 + "sha2 0.11.0-rc.2", 2288 + "signature 3.0.0-rc.10", 2289 + "subtle", 2290 + "zeroize", 1850 2291 ] 1851 2292 1852 2293 [[package]] ··· 1861 2302 source = "registry+https://github.com/rust-lang/crates.io-index" 1862 2303 checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" 1863 2304 dependencies = [ 1864 - "base16ct", 2305 + "base16ct 0.2.0", 1865 2306 "crypto-bigint", 1866 - "digest", 2307 + "digest 0.10.7", 1867 2308 "ff", 1868 2309 "generic-array", 1869 2310 "group", 1870 2311 "hkdf", 1871 - "pem-rfc7468", 1872 - "pkcs8", 2312 + "pem-rfc7468 0.7.0", 2313 + "pkcs8 0.10.2", 1873 2314 "rand_core 0.6.4", 1874 - "sec1", 2315 + "sec1 0.7.3", 1875 2316 "subtle", 1876 2317 "zeroize", 1877 2318 ] ··· 1917 2358 ] 1918 2359 1919 2360 [[package]] 2361 + name = "enum-as-inner" 2362 + version = "0.6.1" 2363 + source = "registry+https://github.com/rust-lang/crates.io-index" 2364 + checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" 2365 + dependencies = [ 2366 + "heck 0.5.0", 2367 + "proc-macro2", 2368 + "quote", 2369 + "syn 2.0.117", 2370 + ] 2371 + 2372 + [[package]] 2373 + name = "enum-assoc" 2374 + version = "1.3.0" 2375 + source = "registry+https://github.com/rust-lang/crates.io-index" 2376 + checksum = "3ed8956bd5c1f0415200516e78ff07ec9e16415ade83c056c230d7b7ea0d55b7" 2377 + dependencies = [ 2378 + "proc-macro2", 2379 + "quote", 2380 + "syn 2.0.117", 2381 + ] 2382 + 2383 + [[package]] 1920 2384 name = "enumn" 1921 2385 version = "0.1.14" 1922 2386 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2041 2505 checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" 2042 2506 2043 2507 [[package]] 2508 + name = "fastbloom" 2509 + version = "0.14.1" 2510 + source = "registry+https://github.com/rust-lang/crates.io-index" 2511 + checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" 2512 + dependencies = [ 2513 + "getrandom 0.3.4", 2514 + "libm", 2515 + "rand 0.9.2", 2516 + "siphasher", 2517 + ] 2518 + 2519 + [[package]] 2044 2520 name = "fastrand" 2045 2521 version = "2.3.0" 2046 2522 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2099 2575 version = "0.2.9" 2100 2576 source = "registry+https://github.com/rust-lang/crates.io-index" 2101 2577 checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" 2578 + 2579 + [[package]] 2580 + name = "fiat-crypto" 2581 + version = "0.3.0" 2582 + source = "registry+https://github.com/rust-lang/crates.io-index" 2583 + checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" 2102 2584 2103 2585 [[package]] 2104 2586 name = "field-offset" ··· 2173 2655 checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 2174 2656 2175 2657 [[package]] 2658 + name = "foldhash" 2659 + version = "0.2.0" 2660 + source = "registry+https://github.com/rust-lang/crates.io-index" 2661 + checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" 2662 + 2663 + [[package]] 2176 2664 name = "font-types" 2177 2665 version = "0.10.1" 2178 2666 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2304 2792 dependencies = [ 2305 2793 "futures-channel", 2306 2794 "futures-core", 2795 + "futures-executor", 2307 2796 "futures-io", 2308 2797 "futures-sink", 2309 2798 "futures-task", ··· 2311 2800 ] 2312 2801 2313 2802 [[package]] 2803 + name = "futures-buffered" 2804 + version = "0.2.13" 2805 + source = "registry+https://github.com/rust-lang/crates.io-index" 2806 + checksum = "4421cb78ee172b6b06080093479d3c50f058e7c81b7d577bbb8d118d551d4cd5" 2807 + dependencies = [ 2808 + "cordyceps", 2809 + "diatomic-waker", 2810 + "futures-core", 2811 + "pin-project-lite", 2812 + "spin 0.10.0", 2813 + ] 2814 + 2815 + [[package]] 2314 2816 name = "futures-channel" 2315 2817 version = "0.3.32" 2316 2818 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2355 2857 checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" 2356 2858 2357 2859 [[package]] 2860 + name = "futures-lite" 2861 + version = "2.6.1" 2862 + source = "registry+https://github.com/rust-lang/crates.io-index" 2863 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 2864 + dependencies = [ 2865 + "fastrand", 2866 + "futures-core", 2867 + "futures-io", 2868 + "parking", 2869 + "pin-project-lite", 2870 + ] 2871 + 2872 + [[package]] 2358 2873 name = "futures-macro" 2359 2874 version = "0.3.32" 2360 2875 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2383 2898 source = "registry+https://github.com/rust-lang/crates.io-index" 2384 2899 checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" 2385 2900 dependencies = [ 2901 + "futures-channel", 2386 2902 "futures-core", 2903 + "futures-io", 2387 2904 "futures-macro", 2388 2905 "futures-sink", 2389 2906 "futures-task", 2907 + "memchr", 2390 2908 "pin-project-lite", 2391 2909 "slab", 2392 2910 ] ··· 2460 2978 ] 2461 2979 2462 2980 [[package]] 2981 + name = "generator" 2982 + version = "0.8.8" 2983 + source = "registry+https://github.com/rust-lang/crates.io-index" 2984 + checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" 2985 + dependencies = [ 2986 + "cc", 2987 + "cfg-if", 2988 + "libc", 2989 + "log", 2990 + "rustversion", 2991 + "windows-link 0.2.1", 2992 + "windows-result 0.4.1", 2993 + ] 2994 + 2995 + [[package]] 2463 2996 name = "generic-array" 2464 2997 version = "0.14.7" 2465 2998 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2498 3031 checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" 2499 3032 dependencies = [ 2500 3033 "cfg-if", 3034 + "js-sys", 2501 3035 "libc", 2502 3036 "wasi 0.11.1+wasi-snapshot-preview1", 3037 + "wasm-bindgen", 2503 3038 ] 2504 3039 2505 3040 [[package]] ··· 2509 3044 checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 2510 3045 dependencies = [ 2511 3046 "cfg-if", 3047 + "js-sys", 2512 3048 "libc", 2513 3049 "r-efi 5.3.0", 2514 3050 "wasip2", 3051 + "wasm-bindgen", 2515 3052 ] 2516 3053 2517 3054 [[package]] ··· 2521 3058 checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" 2522 3059 dependencies = [ 2523 3060 "cfg-if", 3061 + "js-sys", 2524 3062 "libc", 2525 3063 "r-efi 6.0.0", 2526 3064 "rand_core 0.10.0", 2527 3065 "wasip2", 2528 3066 "wasip3", 3067 + "wasm-bindgen", 2529 3068 ] 2530 3069 2531 3070 [[package]] ··· 2535 3074 checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" 2536 3075 dependencies = [ 2537 3076 "opaque-debug", 2538 - "polyval", 3077 + "polyval 0.6.2", 3078 + ] 3079 + 3080 + [[package]] 3081 + name = "ghash" 3082 + version = "0.6.0" 3083 + source = "registry+https://github.com/rust-lang/crates.io-index" 3084 + checksum = "2eecf2d5dc9b66b732b97707a0210906b1d30523eb773193ab777c0c84b3e8d5" 3085 + dependencies = [ 3086 + "polyval 0.7.1", 2539 3087 ] 2540 3088 2541 3089 [[package]] ··· 2800 3348 ] 2801 3349 2802 3350 [[package]] 3351 + name = "gloo-timers" 3352 + version = "0.3.0" 3353 + source = "registry+https://github.com/rust-lang/crates.io-index" 3354 + checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" 3355 + dependencies = [ 3356 + "futures-channel", 3357 + "futures-core", 3358 + "js-sys", 3359 + "wasm-bindgen", 3360 + ] 3361 + 3362 + [[package]] 2803 3363 name = "glow" 2804 3364 version = "0.16.0" 2805 3365 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3390 3950 ] 3391 3951 3392 3952 [[package]] 3953 + name = "hash32" 3954 + version = "0.2.1" 3955 + source = "registry+https://github.com/rust-lang/crates.io-index" 3956 + checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" 3957 + dependencies = [ 3958 + "byteorder", 3959 + ] 3960 + 3961 + [[package]] 3393 3962 name = "hashbrown" 3394 3963 version = "0.15.5" 3395 3964 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3397 3966 dependencies = [ 3398 3967 "allocator-api2", 3399 3968 "equivalent", 3400 - "foldhash", 3969 + "foldhash 0.1.5", 3401 3970 "serde", 3402 3971 ] 3403 3972 ··· 3406 3975 version = "0.16.1" 3407 3976 source = "registry+https://github.com/rust-lang/crates.io-index" 3408 3977 checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 3978 + dependencies = [ 3979 + "allocator-api2", 3980 + "equivalent", 3981 + "foldhash 0.2.0", 3982 + ] 3409 3983 3410 3984 [[package]] 3411 3985 name = "hashlink" ··· 3465 4039 ] 3466 4040 3467 4041 [[package]] 4042 + name = "heapless" 4043 + version = "0.7.17" 4044 + source = "registry+https://github.com/rust-lang/crates.io-index" 4045 + checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" 4046 + dependencies = [ 4047 + "atomic-polyfill", 4048 + "hash32", 4049 + "rustc_version", 4050 + "serde", 4051 + "spin 0.9.8", 4052 + "stable_deref_trait", 4053 + ] 4054 + 4055 + [[package]] 3468 4056 name = "heck" 3469 4057 version = "0.4.1" 3470 4058 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3495 4083 checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" 3496 4084 3497 4085 [[package]] 4086 + name = "hickory-proto" 4087 + version = "0.25.2" 4088 + source = "registry+https://github.com/rust-lang/crates.io-index" 4089 + checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" 4090 + dependencies = [ 4091 + "async-trait", 4092 + "bytes", 4093 + "cfg-if", 4094 + "data-encoding", 4095 + "enum-as-inner", 4096 + "futures-channel", 4097 + "futures-io", 4098 + "futures-util", 4099 + "h2 0.4.13", 4100 + "http 1.4.0", 4101 + "idna", 4102 + "ipnet", 4103 + "once_cell", 4104 + "rand 0.9.2", 4105 + "ring", 4106 + "rustls", 4107 + "thiserror 2.0.18", 4108 + "tinyvec", 4109 + "tokio", 4110 + "tokio-rustls", 4111 + "tracing", 4112 + "url", 4113 + ] 4114 + 4115 + [[package]] 4116 + name = "hickory-resolver" 4117 + version = "0.25.2" 4118 + source = "registry+https://github.com/rust-lang/crates.io-index" 4119 + checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" 4120 + dependencies = [ 4121 + "cfg-if", 4122 + "futures-util", 4123 + "hickory-proto", 4124 + "ipconfig", 4125 + "moka", 4126 + "once_cell", 4127 + "parking_lot", 4128 + "rand 0.9.2", 4129 + "resolv-conf", 4130 + "rustls", 4131 + "smallvec", 4132 + "thiserror 2.0.18", 4133 + "tokio", 4134 + "tokio-rustls", 4135 + "tracing", 4136 + ] 4137 + 4138 + [[package]] 3498 4139 name = "hkdf" 3499 4140 version = "0.12.4" 3500 4141 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3509 4150 source = "registry+https://github.com/rust-lang/crates.io-index" 3510 4151 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 3511 4152 dependencies = [ 3512 - "digest", 4153 + "digest 0.10.7", 4154 + ] 4155 + 4156 + [[package]] 4157 + name = "home" 4158 + version = "0.5.12" 4159 + source = "registry+https://github.com/rust-lang/crates.io-index" 4160 + checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" 4161 + dependencies = [ 4162 + "windows-sys 0.61.2", 3513 4163 ] 3514 4164 3515 4165 [[package]] ··· 3614 4264 ] 3615 4265 3616 4266 [[package]] 4267 + name = "hybrid-array" 4268 + version = "0.4.7" 4269 + source = "registry+https://github.com/rust-lang/crates.io-index" 4270 + checksum = "e1b229d73f5803b562cc26e4da0396c8610a4ee209f4fac8fa4f8d709166dc45" 4271 + dependencies = [ 4272 + "typenum", 4273 + "zeroize", 4274 + ] 4275 + 4276 + [[package]] 3617 4277 name = "hyper" 3618 4278 version = "0.14.32" 3619 4279 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3695 4355 "libc", 3696 4356 "percent-encoding", 3697 4357 "pin-project-lite", 3698 - "socket2 0.6.2", 4358 + "socket2 0.6.3", 3699 4359 "tokio", 3700 4360 "tower-service", 3701 4361 "tracing", ··· 4278 4938 checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 4279 4939 4280 4940 [[package]] 4941 + name = "identity-hash" 4942 + version = "0.1.0" 4943 + source = "registry+https://github.com/rust-lang/crates.io-index" 4944 + checksum = "dfdd7caa900436d8f13b2346fe10257e0c05c1f1f9e351f4f5d57c03bd5f45da" 4945 + 4946 + [[package]] 4281 4947 name = "idna" 4282 4948 version = "1.1.0" 4283 4949 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4299 4965 ] 4300 4966 4301 4967 [[package]] 4968 + name = "igd-next" 4969 + version = "0.16.2" 4970 + source = "registry+https://github.com/rust-lang/crates.io-index" 4971 + checksum = "516893339c97f6011282d5825ac94fc1c7aad5cad26bdc2d0cee068c0bf97f97" 4972 + dependencies = [ 4973 + "async-trait", 4974 + "attohttpc", 4975 + "bytes", 4976 + "futures", 4977 + "http 1.4.0", 4978 + "http-body-util", 4979 + "hyper 1.8.1", 4980 + "hyper-util", 4981 + "log", 4982 + "rand 0.9.2", 4983 + "tokio", 4984 + "url", 4985 + "xmltree", 4986 + ] 4987 + 4988 + [[package]] 4302 4989 name = "image" 4303 4990 version = "0.25.9" 4304 4991 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4383 5070 ] 4384 5071 4385 5072 [[package]] 5073 + name = "inout" 5074 + version = "0.2.2" 5075 + source = "registry+https://github.com/rust-lang/crates.io-index" 5076 + checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7" 5077 + dependencies = [ 5078 + "hybrid-array 0.4.7", 5079 + ] 5080 + 5081 + [[package]] 4386 5082 name = "interpolate_name" 4387 5083 version = "0.2.4" 4388 5084 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4410 5106 "thiserror 2.0.18", 4411 5107 "uuid", 4412 5108 "windows 0.61.3", 5109 + ] 5110 + 5111 + [[package]] 5112 + name = "ipconfig" 5113 + version = "0.3.2" 5114 + source = "registry+https://github.com/rust-lang/crates.io-index" 5115 + checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" 5116 + dependencies = [ 5117 + "socket2 0.5.10", 5118 + "widestring", 5119 + "windows-sys 0.48.0", 5120 + "winreg", 4413 5121 ] 4414 5122 4415 5123 [[package]] ··· 4419 5127 checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" 4420 5128 4421 5129 [[package]] 5130 + name = "iri-string" 5131 + version = "0.7.10" 5132 + source = "registry+https://github.com/rust-lang/crates.io-index" 5133 + checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" 5134 + dependencies = [ 5135 + "memchr", 5136 + "serde", 5137 + ] 5138 + 5139 + [[package]] 5140 + name = "iroh" 5141 + version = "0.96.1" 5142 + source = "registry+https://github.com/rust-lang/crates.io-index" 5143 + checksum = "5236da4d5681f317ec393c8fe2b7e3d360d31c6bb40383991d0b7429ca5ad117" 5144 + dependencies = [ 5145 + "backon", 5146 + "bytes", 5147 + "cfg_aliases", 5148 + "data-encoding", 5149 + "derive_more", 5150 + "ed25519-dalek", 5151 + "futures-util", 5152 + "getrandom 0.3.4", 5153 + "hickory-resolver", 5154 + "http 1.4.0", 5155 + "igd-next", 5156 + "iroh-base", 5157 + "iroh-metrics", 5158 + "iroh-quinn", 5159 + "iroh-quinn-proto", 5160 + "iroh-quinn-udp", 5161 + "iroh-relay", 5162 + "n0-error", 5163 + "n0-future", 5164 + "n0-watcher", 5165 + "netdev", 5166 + "netwatch", 5167 + "papaya", 5168 + "pin-project", 5169 + "pkarr", 5170 + "pkcs8 0.11.0-rc.11", 5171 + "portmapper", 5172 + "rand 0.9.2", 5173 + "reqwest 0.12.28", 5174 + "rustc-hash 2.1.1", 5175 + "rustls", 5176 + "rustls-pki-types", 5177 + "rustls-webpki", 5178 + "serde", 5179 + "smallvec", 5180 + "strum", 5181 + "swarm-discovery", 5182 + "sync_wrapper", 5183 + "time", 5184 + "tokio", 5185 + "tokio-stream", 5186 + "tokio-util", 5187 + "tracing", 5188 + "url", 5189 + "wasm-bindgen-futures", 5190 + "webpki-roots", 5191 + ] 5192 + 5193 + [[package]] 5194 + name = "iroh-base" 5195 + version = "0.96.1" 5196 + source = "registry+https://github.com/rust-lang/crates.io-index" 5197 + checksum = "20c99d836a1c99e037e98d1bf3ef209c3a4df97555a00ce9510eb78eccdf5567" 5198 + dependencies = [ 5199 + "curve25519-dalek 5.0.0-pre.1", 5200 + "data-encoding", 5201 + "derive_more", 5202 + "digest 0.11.0-rc.10", 5203 + "ed25519-dalek", 5204 + "n0-error", 5205 + "rand_core 0.9.5", 5206 + "serde", 5207 + "sha2 0.11.0-rc.2", 5208 + "url", 5209 + "zeroize", 5210 + "zeroize_derive", 5211 + ] 5212 + 5213 + [[package]] 5214 + name = "iroh-metrics" 5215 + version = "0.38.2" 5216 + source = "registry+https://github.com/rust-lang/crates.io-index" 5217 + checksum = "c946095f060e6e59b9ff30cc26c75cdb758e7fb0cde8312c89e2144654989fcb" 5218 + dependencies = [ 5219 + "iroh-metrics-derive", 5220 + "itoa", 5221 + "n0-error", 5222 + "postcard", 5223 + "ryu", 5224 + "serde", 5225 + "tracing", 5226 + ] 5227 + 5228 + [[package]] 5229 + name = "iroh-metrics-derive" 5230 + version = "0.4.1" 5231 + source = "registry+https://github.com/rust-lang/crates.io-index" 5232 + checksum = "cab063c2bfd6c3d5a33a913d4fdb5252f140db29ec67c704f20f3da7e8f92dbf" 5233 + dependencies = [ 5234 + "heck 0.5.0", 5235 + "proc-macro2", 5236 + "quote", 5237 + "syn 2.0.117", 5238 + ] 5239 + 5240 + [[package]] 5241 + name = "iroh-persist" 5242 + version = "0.1.5" 5243 + source = "git+https://github.com/webbeef/iroh-persist.git?branch=iroh-0.96#67839547424ae4ea527e85f8851a1410b2f948ad" 5244 + dependencies = [ 5245 + "dirs", 5246 + "iroh", 5247 + "n0-error", 5248 + "rand 0.9.2", 5249 + "ssh-key", 5250 + "test-log", 5251 + "tokio", 5252 + "tracing", 5253 + ] 5254 + 5255 + [[package]] 5256 + name = "iroh-quinn" 5257 + version = "0.16.1" 5258 + source = "registry+https://github.com/rust-lang/crates.io-index" 5259 + checksum = "034ed21f34c657a123d39525d948c885aacba59508805e4dd67d71f022e7151b" 5260 + dependencies = [ 5261 + "bytes", 5262 + "cfg_aliases", 5263 + "iroh-quinn-proto", 5264 + "iroh-quinn-udp", 5265 + "pin-project-lite", 5266 + "rustc-hash 2.1.1", 5267 + "rustls", 5268 + "socket2 0.6.3", 5269 + "thiserror 2.0.18", 5270 + "tokio", 5271 + "tokio-stream", 5272 + "tracing", 5273 + "web-time", 5274 + ] 5275 + 5276 + [[package]] 5277 + name = "iroh-quinn-proto" 5278 + version = "0.15.1" 5279 + source = "registry+https://github.com/rust-lang/crates.io-index" 5280 + checksum = "0de99ad8adc878ee0e68509ad256152ce23b8bbe45f5539d04e179630aca40a9" 5281 + dependencies = [ 5282 + "bytes", 5283 + "derive_more", 5284 + "enum-assoc", 5285 + "fastbloom", 5286 + "getrandom 0.3.4", 5287 + "identity-hash", 5288 + "lru-slab", 5289 + "rand 0.9.2", 5290 + "ring", 5291 + "rustc-hash 2.1.1", 5292 + "rustls", 5293 + "rustls-pki-types", 5294 + "slab", 5295 + "sorted-index-buffer", 5296 + "thiserror 2.0.18", 5297 + "tinyvec", 5298 + "tracing", 5299 + "web-time", 5300 + ] 5301 + 5302 + [[package]] 5303 + name = "iroh-quinn-udp" 5304 + version = "0.8.0" 5305 + source = "registry+https://github.com/rust-lang/crates.io-index" 5306 + checksum = "f981dadd5a072a9e0efcd24bdcc388e570073f7e51b33505ceb1ef4668c80c86" 5307 + dependencies = [ 5308 + "cfg_aliases", 5309 + "libc", 5310 + "socket2 0.6.3", 5311 + "tracing", 5312 + "windows-sys 0.61.2", 5313 + ] 5314 + 5315 + [[package]] 5316 + name = "iroh-relay" 5317 + version = "0.96.1" 5318 + source = "registry+https://github.com/rust-lang/crates.io-index" 5319 + checksum = "cd2b63e654b9dec799a73372cdc79b529ca6c7248c0c8de7da78a02e3a46f03c" 5320 + dependencies = [ 5321 + "blake3", 5322 + "bytes", 5323 + "cfg_aliases", 5324 + "data-encoding", 5325 + "derive_more", 5326 + "getrandom 0.3.4", 5327 + "hickory-resolver", 5328 + "http 1.4.0", 5329 + "http-body-util", 5330 + "hyper 1.8.1", 5331 + "hyper-util", 5332 + "iroh-base", 5333 + "iroh-metrics", 5334 + "iroh-quinn", 5335 + "iroh-quinn-proto", 5336 + "lru", 5337 + "n0-error", 5338 + "n0-future", 5339 + "num_enum", 5340 + "pin-project", 5341 + "pkarr", 5342 + "postcard", 5343 + "rand 0.9.2", 5344 + "reqwest 0.12.28", 5345 + "rustls", 5346 + "rustls-pki-types", 5347 + "serde", 5348 + "serde_bytes", 5349 + "strum", 5350 + "tokio", 5351 + "tokio-rustls", 5352 + "tokio-util", 5353 + "tokio-websockets", 5354 + "tracing", 5355 + "url", 5356 + "vergen-gitcl", 5357 + "webpki-roots", 5358 + "ws_stream_wasm", 5359 + "z32", 5360 + ] 5361 + 5362 + [[package]] 4422 5363 name = "is-terminal" 4423 5364 version = "0.4.17" 4424 5365 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4549 5490 source = "registry+https://github.com/rust-lang/crates.io-index" 4550 5491 checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" 4551 5492 dependencies = [ 4552 - "cpufeatures", 5493 + "cpufeatures 0.2.17", 4553 5494 ] 4554 5495 4555 5496 [[package]] ··· 4639 5580 source = "registry+https://github.com/rust-lang/crates.io-index" 4640 5581 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 4641 5582 dependencies = [ 4642 - "spin", 5583 + "spin 0.9.8", 4643 5584 ] 4644 5585 4645 5586 [[package]] ··· 4909 5850 checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 4910 5851 4911 5852 [[package]] 5853 + name = "loom" 5854 + version = "0.7.2" 5855 + source = "registry+https://github.com/rust-lang/crates.io-index" 5856 + checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" 5857 + dependencies = [ 5858 + "cfg-if", 5859 + "generator", 5860 + "scoped-tls", 5861 + "tracing", 5862 + "tracing-subscriber", 5863 + ] 5864 + 5865 + [[package]] 4912 5866 name = "loop9" 4913 5867 version = "0.1.5" 4914 5868 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4918 5872 ] 4919 5873 4920 5874 [[package]] 5875 + name = "lru" 5876 + version = "0.16.3" 5877 + source = "registry+https://github.com/rust-lang/crates.io-index" 5878 + checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" 5879 + dependencies = [ 5880 + "hashbrown 0.16.1", 5881 + ] 5882 + 5883 + [[package]] 5884 + name = "lru-slab" 5885 + version = "0.1.2" 5886 + source = "registry+https://github.com/rust-lang/crates.io-index" 5887 + checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 5888 + 5889 + [[package]] 5890 + name = "mac-addr" 5891 + version = "0.3.0" 5892 + source = "registry+https://github.com/rust-lang/crates.io-index" 5893 + checksum = "d3d25b0e0b648a86960ac23b7ad4abb9717601dec6f66c165f5b037f3f03065f" 5894 + 5895 + [[package]] 4921 5896 name = "mach2" 4922 5897 version = "0.6.0" 4923 5898 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5082 6057 source = "registry+https://github.com/rust-lang/crates.io-index" 5083 6058 checksum = "ac4a46643af2001eafebcc37031fc459eb72d45057aac5d7a15b00046a2ad6db" 5084 6059 dependencies = [ 5085 - "const-oid", 6060 + "const-oid 0.9.6", 5086 6061 "hybrid-array 0.3.1", 5087 6062 "num-traits", 5088 - "pkcs8", 6063 + "pkcs8 0.10.2", 5089 6064 "rand_core 0.6.4", 5090 6065 "sha3", 5091 - "signature", 6066 + "signature 2.2.0", 5092 6067 ] 5093 6068 5094 6069 [[package]] ··· 5101 6076 "kem", 5102 6077 "rand_core 0.6.4", 5103 6078 "sha3", 6079 + ] 6080 + 6081 + [[package]] 6082 + name = "moka" 6083 + version = "0.12.14" 6084 + source = "registry+https://github.com/rust-lang/crates.io-index" 6085 + checksum = "85f8024e1c8e71c778968af91d43700ce1d11b219d127d79fb2934153b82b42b" 6086 + dependencies = [ 6087 + "crossbeam-channel", 6088 + "crossbeam-epoch", 6089 + "crossbeam-utils", 6090 + "equivalent", 6091 + "parking_lot", 6092 + "portable-atomic", 6093 + "smallvec", 6094 + "tagptr", 6095 + "uuid", 5104 6096 ] 5105 6097 5106 6098 [[package]] ··· 5187 6179 checksum = "956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0" 5188 6180 5189 6181 [[package]] 6182 + name = "n0-error" 6183 + version = "0.1.3" 6184 + source = "registry+https://github.com/rust-lang/crates.io-index" 6185 + checksum = "af4782b4baf92d686d161c15460c83d16ebcfd215918763903e9619842665cae" 6186 + dependencies = [ 6187 + "n0-error-macros", 6188 + "spez", 6189 + ] 6190 + 6191 + [[package]] 6192 + name = "n0-error-macros" 6193 + version = "0.1.3" 6194 + source = "registry+https://github.com/rust-lang/crates.io-index" 6195 + checksum = "03755949235714b2b307e5ae89dd8c1c2531fb127d9b8b7b4adf9c876cd3ed18" 6196 + dependencies = [ 6197 + "proc-macro2", 6198 + "quote", 6199 + "syn 2.0.117", 6200 + ] 6201 + 6202 + [[package]] 6203 + name = "n0-future" 6204 + version = "0.3.2" 6205 + source = "registry+https://github.com/rust-lang/crates.io-index" 6206 + checksum = "e2ab99dfb861450e68853d34ae665243a88b8c493d01ba957321a1e9b2312bbe" 6207 + dependencies = [ 6208 + "cfg_aliases", 6209 + "derive_more", 6210 + "futures-buffered", 6211 + "futures-lite", 6212 + "futures-util", 6213 + "js-sys", 6214 + "pin-project", 6215 + "send_wrapper", 6216 + "tokio", 6217 + "tokio-util", 6218 + "wasm-bindgen", 6219 + "wasm-bindgen-futures", 6220 + "web-time", 6221 + ] 6222 + 6223 + [[package]] 6224 + name = "n0-watcher" 6225 + version = "0.6.1" 6226 + source = "registry+https://github.com/rust-lang/crates.io-index" 6227 + checksum = "38795f7932e6e9d1c6e989270ef5b3ff24ebb910e2c9d4bed2d28d8bae3007dc" 6228 + dependencies = [ 6229 + "derive_more", 6230 + "n0-error", 6231 + "n0-future", 6232 + ] 6233 + 6234 + [[package]] 5190 6235 name = "naga" 5191 6236 version = "26.0.0" 5192 6237 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5243 6288 ] 5244 6289 5245 6290 [[package]] 6291 + name = "netdev" 6292 + version = "0.40.1" 6293 + source = "registry+https://github.com/rust-lang/crates.io-index" 6294 + checksum = "1b0a0096d9613ee878dba89bbe595f079d373e3f1960d882e4f2f78ff9c30a0a" 6295 + dependencies = [ 6296 + "block2 0.6.2", 6297 + "dispatch2", 6298 + "dlopen2", 6299 + "ipnet", 6300 + "libc", 6301 + "mac-addr", 6302 + "netlink-packet-core", 6303 + "netlink-packet-route 0.29.0", 6304 + "netlink-sys", 6305 + "objc2-core-foundation", 6306 + "objc2-system-configuration", 6307 + "once_cell", 6308 + "plist", 6309 + "windows-sys 0.59.0", 6310 + ] 6311 + 6312 + [[package]] 6313 + name = "netlink-packet-core" 6314 + version = "0.8.1" 6315 + source = "registry+https://github.com/rust-lang/crates.io-index" 6316 + checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" 6317 + dependencies = [ 6318 + "paste", 6319 + ] 6320 + 6321 + [[package]] 6322 + name = "netlink-packet-route" 6323 + version = "0.28.0" 6324 + source = "registry+https://github.com/rust-lang/crates.io-index" 6325 + checksum = "4ce3636fa715e988114552619582b530481fd5ef176a1e5c1bf024077c2c9445" 6326 + dependencies = [ 6327 + "bitflags 2.11.0", 6328 + "libc", 6329 + "log", 6330 + "netlink-packet-core", 6331 + ] 6332 + 6333 + [[package]] 6334 + name = "netlink-packet-route" 6335 + version = "0.29.0" 6336 + source = "registry+https://github.com/rust-lang/crates.io-index" 6337 + checksum = "df9854ea6ad14e3f4698a7f03b65bce0833dd2d81d594a0e4a984170537146b6" 6338 + dependencies = [ 6339 + "bitflags 2.11.0", 6340 + "libc", 6341 + "log", 6342 + "netlink-packet-core", 6343 + ] 6344 + 6345 + [[package]] 6346 + name = "netlink-proto" 6347 + version = "0.12.0" 6348 + source = "registry+https://github.com/rust-lang/crates.io-index" 6349 + checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" 6350 + dependencies = [ 6351 + "bytes", 6352 + "futures", 6353 + "log", 6354 + "netlink-packet-core", 6355 + "netlink-sys", 6356 + "thiserror 2.0.18", 6357 + ] 6358 + 6359 + [[package]] 6360 + name = "netlink-sys" 6361 + version = "0.8.8" 6362 + source = "registry+https://github.com/rust-lang/crates.io-index" 6363 + checksum = "cd6c30ed10fa69cc491d491b85cc971f6bdeb8e7367b7cde2ee6cc878d583fae" 6364 + dependencies = [ 6365 + "bytes", 6366 + "futures-util", 6367 + "libc", 6368 + "log", 6369 + "tokio", 6370 + ] 6371 + 6372 + [[package]] 6373 + name = "netwatch" 6374 + version = "0.14.0" 6375 + source = "registry+https://github.com/rust-lang/crates.io-index" 6376 + checksum = "454b8c0759b2097581f25ed5180b4a1d14c324fde6d0734932a288e044d06232" 6377 + dependencies = [ 6378 + "atomic-waker", 6379 + "bytes", 6380 + "cfg_aliases", 6381 + "derive_more", 6382 + "iroh-quinn-udp", 6383 + "js-sys", 6384 + "libc", 6385 + "n0-error", 6386 + "n0-future", 6387 + "n0-watcher", 6388 + "netdev", 6389 + "netlink-packet-core", 6390 + "netlink-packet-route 0.28.0", 6391 + "netlink-proto", 6392 + "netlink-sys", 6393 + "objc2-core-foundation", 6394 + "objc2-system-configuration", 6395 + "pin-project-lite", 6396 + "serde", 6397 + "socket2 0.6.3", 6398 + "time", 6399 + "tokio", 6400 + "tokio-util", 6401 + "tracing", 6402 + "web-sys", 6403 + "windows 0.62.2", 6404 + "windows-result 0.4.1", 6405 + "wmi", 6406 + ] 6407 + 6408 + [[package]] 5246 6409 name = "new_debug_unreachable" 5247 6410 version = "1.0.6" 5248 6411 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5307 6470 checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" 5308 6471 5309 6472 [[package]] 6473 + name = "ntimestamp" 6474 + version = "1.0.0" 6475 + source = "registry+https://github.com/rust-lang/crates.io-index" 6476 + checksum = "c50f94c405726d3e0095e89e72f75ce7f6587b94a8bd8dc8054b73f65c0fd68c" 6477 + dependencies = [ 6478 + "base32", 6479 + "document-features", 6480 + "getrandom 0.2.17", 6481 + "httpdate", 6482 + "js-sys", 6483 + "once_cell", 6484 + "serde", 6485 + ] 6486 + 6487 + [[package]] 5310 6488 name = "nu-ansi-term" 5311 6489 version = "0.50.3" 5312 6490 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5742 6920 ] 5743 6921 5744 6922 [[package]] 6923 + name = "objc2-security" 6924 + version = "0.3.2" 6925 + source = "registry+https://github.com/rust-lang/crates.io-index" 6926 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 6927 + dependencies = [ 6928 + "bitflags 2.11.0", 6929 + "objc2 0.6.4", 6930 + "objc2-core-foundation", 6931 + ] 6932 + 6933 + [[package]] 5745 6934 name = "objc2-symbols" 5746 6935 version = "0.2.2" 5747 6936 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5749 6938 dependencies = [ 5750 6939 "objc2 0.5.2", 5751 6940 "objc2-foundation 0.2.2", 6941 + ] 6942 + 6943 + [[package]] 6944 + name = "objc2-system-configuration" 6945 + version = "0.3.2" 6946 + source = "registry+https://github.com/rust-lang/crates.io-index" 6947 + checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" 6948 + dependencies = [ 6949 + "bitflags 2.11.0", 6950 + "dispatch2", 6951 + "libc", 6952 + "objc2 0.6.4", 6953 + "objc2-core-foundation", 6954 + "objc2-security", 5752 6955 ] 5753 6956 5754 6957 [[package]] ··· 5811 7014 source = "registry+https://github.com/rust-lang/crates.io-index" 5812 7015 checksum = "c196e0276c471c843dd5777e7543a36a298a4be942a2a688d8111cd43390dedb" 5813 7016 dependencies = [ 5814 - "aead", 5815 - "cipher", 5816 - "ctr", 7017 + "aead 0.5.2", 7018 + "cipher 0.4.4", 7019 + "ctr 0.9.2", 5817 7020 "subtle", 5818 7021 ] 5819 7022 ··· 5822 7025 version = "1.21.3" 5823 7026 source = "registry+https://github.com/rust-lang/crates.io-index" 5824 7027 checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 7028 + dependencies = [ 7029 + "critical-section", 7030 + "portable-atomic", 7031 + ] 5825 7032 5826 7033 [[package]] 5827 7034 name = "once_cell_polyfill" ··· 5926 7133 "ecdsa", 5927 7134 "elliptic-curve", 5928 7135 "primeorder", 5929 - "sha2", 7136 + "sha2 0.10.9", 5930 7137 ] 5931 7138 5932 7139 [[package]] ··· 5938 7145 "ecdsa", 5939 7146 "elliptic-curve", 5940 7147 "primeorder", 5941 - "sha2", 7148 + "sha2 0.10.9", 5942 7149 ] 5943 7150 5944 7151 [[package]] ··· 5947 7154 source = "registry+https://github.com/rust-lang/crates.io-index" 5948 7155 checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" 5949 7156 dependencies = [ 5950 - "base16ct", 7157 + "base16ct 0.2.0", 5951 7158 "ecdsa", 5952 7159 "elliptic-curve", 5953 7160 "primeorder", 5954 7161 "rand_core 0.6.4", 5955 - "sha2", 7162 + "sha2 0.10.9", 5956 7163 ] 5957 7164 5958 7165 [[package]] ··· 5981 7188 ] 5982 7189 5983 7190 [[package]] 7191 + name = "papaya" 7192 + version = "0.2.3" 7193 + source = "registry+https://github.com/rust-lang/crates.io-index" 7194 + checksum = "f92dd0b07c53a0a0c764db2ace8c541dc47320dad97c2200c2a637ab9dd2328f" 7195 + dependencies = [ 7196 + "equivalent", 7197 + "seize", 7198 + ] 7199 + 7200 + [[package]] 7201 + name = "parking" 7202 + version = "2.2.1" 7203 + source = "registry+https://github.com/rust-lang/crates.io-index" 7204 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 7205 + 7206 + [[package]] 5984 7207 name = "parking_lot" 5985 7208 version = "0.12.5" 5986 7209 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 6064 7287 ] 6065 7288 6066 7289 [[package]] 7290 + name = "pem-rfc7468" 7291 + version = "1.0.0" 7292 + source = "registry+https://github.com/rust-lang/crates.io-index" 7293 + checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" 7294 + dependencies = [ 7295 + "base64ct", 7296 + ] 7297 + 7298 + [[package]] 6067 7299 name = "peniko" 6068 7300 version = "0.5.0" 6069 7301 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 6090 7322 dependencies = [ 6091 7323 "fixedbitset", 6092 7324 "ordermap", 7325 + ] 7326 + 7327 + [[package]] 7328 + name = "petname" 7329 + version = "2.0.2" 7330 + source = "registry+https://github.com/rust-lang/crates.io-index" 7331 + checksum = "9cd31dcfdbbd7431a807ef4df6edd6473228e94d5c805e8cf671227a21bad068" 7332 + dependencies = [ 7333 + "anyhow", 7334 + "clap", 7335 + "itertools 0.14.0", 7336 + "proc-macro2", 7337 + "quote", 7338 + "rand 0.8.5", 7339 + ] 7340 + 7341 + [[package]] 7342 + name = "pharos" 7343 + version = "0.5.3" 7344 + source = "registry+https://github.com/rust-lang/crates.io-index" 7345 + checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" 7346 + dependencies = [ 7347 + "futures", 7348 + "rustc_version", 6093 7349 ] 6094 7350 6095 7351 [[package]] ··· 6184 7440 checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 6185 7441 6186 7442 [[package]] 7443 + name = "pkarr" 7444 + version = "5.0.3" 7445 + source = "registry+https://github.com/rust-lang/crates.io-index" 7446 + checksum = "2f950360d31be432c0c9467fba5024a94f55128e7f32bc9d32db140369f24c77" 7447 + dependencies = [ 7448 + "async-compat", 7449 + "base32", 7450 + "bytes", 7451 + "cfg_aliases", 7452 + "document-features", 7453 + "dyn-clone", 7454 + "ed25519-dalek", 7455 + "futures-buffered", 7456 + "futures-lite", 7457 + "getrandom 0.4.2", 7458 + "log", 7459 + "lru", 7460 + "ntimestamp", 7461 + "reqwest 0.13.2", 7462 + "self_cell", 7463 + "serde", 7464 + "sha1_smol", 7465 + "simple-dns", 7466 + "thiserror 2.0.18", 7467 + "tokio", 7468 + "tracing", 7469 + "url", 7470 + "wasm-bindgen-futures", 7471 + ] 7472 + 7473 + [[package]] 6187 7474 name = "pkcs1" 6188 7475 version = "0.7.5" 6189 7476 source = "registry+https://github.com/rust-lang/crates.io-index" 6190 7477 checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 6191 7478 dependencies = [ 6192 - "der", 6193 - "pkcs8", 6194 - "spki", 7479 + "der 0.7.10", 7480 + "pkcs8 0.10.2", 7481 + "spki 0.7.3", 6195 7482 ] 6196 7483 6197 7484 [[package]] ··· 6200 7487 source = "registry+https://github.com/rust-lang/crates.io-index" 6201 7488 checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 6202 7489 dependencies = [ 6203 - "der", 7490 + "der 0.7.10", 6204 7491 "rand_core 0.6.4", 6205 - "spki", 7492 + "spki 0.7.3", 7493 + ] 7494 + 7495 + [[package]] 7496 + name = "pkcs8" 7497 + version = "0.11.0-rc.11" 7498 + source = "registry+https://github.com/rust-lang/crates.io-index" 7499 + checksum = "12922b6296c06eb741b02d7b5161e3aaa22864af38dfa025a1a3ba3f68c84577" 7500 + dependencies = [ 7501 + "der 0.8.0", 7502 + "spki 0.8.0-rc.4", 6206 7503 ] 6207 7504 6208 7505 [[package]] ··· 6226 7523 "euclid", 6227 7524 "log", 6228 7525 "smallvec", 7526 + ] 7527 + 7528 + [[package]] 7529 + name = "plist" 7530 + version = "1.8.0" 7531 + source = "registry+https://github.com/rust-lang/crates.io-index" 7532 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 7533 + dependencies = [ 7534 + "base64 0.22.1", 7535 + "indexmap", 7536 + "quick-xml 0.38.4", 7537 + "serde", 7538 + "time", 6229 7539 ] 6230 7540 6231 7541 [[package]] ··· 6308 7618 source = "registry+https://github.com/rust-lang/crates.io-index" 6309 7619 checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" 6310 7620 dependencies = [ 6311 - "cpufeatures", 7621 + "cpufeatures 0.2.17", 6312 7622 "opaque-debug", 6313 - "universal-hash", 7623 + "universal-hash 0.5.1", 7624 + ] 7625 + 7626 + [[package]] 7627 + name = "poly1305" 7628 + version = "0.9.0-rc.6" 7629 + source = "registry+https://github.com/rust-lang/crates.io-index" 7630 + checksum = "19feddcbdf17fad33f40041c7f9e768faf19455f32a6d52ba1b8b65ffc7b1cae" 7631 + dependencies = [ 7632 + "cpufeatures 0.3.0", 7633 + "universal-hash 0.6.1", 7634 + "zeroize", 6314 7635 ] 6315 7636 6316 7637 [[package]] ··· 6320 7641 checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" 6321 7642 dependencies = [ 6322 7643 "cfg-if", 6323 - "cpufeatures", 7644 + "cpufeatures 0.2.17", 6324 7645 "opaque-debug", 6325 - "universal-hash", 7646 + "universal-hash 0.5.1", 7647 + ] 7648 + 7649 + [[package]] 7650 + name = "polyval" 7651 + version = "0.7.1" 7652 + source = "registry+https://github.com/rust-lang/crates.io-index" 7653 + checksum = "7dfc63250416fea14f5749b90725916a6c903f599d51cb635aa7a52bfd03eede" 7654 + dependencies = [ 7655 + "cpubits", 7656 + "cpufeatures 0.3.0", 7657 + "universal-hash 0.6.1", 6326 7658 ] 6327 7659 6328 7660 [[package]] ··· 6341 7673 ] 6342 7674 6343 7675 [[package]] 7676 + name = "portmapper" 7677 + version = "0.14.0" 7678 + source = "registry+https://github.com/rust-lang/crates.io-index" 7679 + checksum = "7d2a8825353ace3285138da3378b1e21860d60351942f7aa3b99b13b41f80318" 7680 + dependencies = [ 7681 + "base64 0.22.1", 7682 + "bytes", 7683 + "derive_more", 7684 + "futures-lite", 7685 + "futures-util", 7686 + "hyper-util", 7687 + "igd-next", 7688 + "iroh-metrics", 7689 + "libc", 7690 + "n0-error", 7691 + "netwatch", 7692 + "num_enum", 7693 + "rand 0.9.2", 7694 + "serde", 7695 + "smallvec", 7696 + "socket2 0.6.3", 7697 + "time", 7698 + "tokio", 7699 + "tokio-util", 7700 + "tower-layer", 7701 + "tracing", 7702 + "url", 7703 + ] 7704 + 7705 + [[package]] 6344 7706 name = "postcard" 6345 7707 version = "1.1.3" 6346 7708 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 6349 7711 "cobs", 6350 7712 "embedded-io 0.4.0", 6351 7713 "embedded-io 0.6.1", 7714 + "heapless", 7715 + "postcard-derive", 6352 7716 "serde", 7717 + ] 7718 + 7719 + [[package]] 7720 + name = "postcard-derive" 7721 + version = "0.2.2" 7722 + source = "registry+https://github.com/rust-lang/crates.io-index" 7723 + checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" 7724 + dependencies = [ 7725 + "proc-macro2", 7726 + "quote", 7727 + "syn 2.0.117", 6353 7728 ] 6354 7729 6355 7730 [[package]] ··· 6527 7902 6528 7903 [[package]] 6529 7904 name = "quick-xml" 7905 + version = "0.38.4" 7906 + source = "registry+https://github.com/rust-lang/crates.io-index" 7907 + checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" 7908 + dependencies = [ 7909 + "memchr", 7910 + ] 7911 + 7912 + [[package]] 7913 + name = "quick-xml" 6530 7914 version = "0.39.2" 6531 7915 source = "registry+https://github.com/rust-lang/crates.io-index" 6532 7916 checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" ··· 6557 7941 ] 6558 7942 6559 7943 [[package]] 7944 + name = "quinn" 7945 + version = "0.11.9" 7946 + source = "registry+https://github.com/rust-lang/crates.io-index" 7947 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 7948 + dependencies = [ 7949 + "bytes", 7950 + "cfg_aliases", 7951 + "pin-project-lite", 7952 + "quinn-proto", 7953 + "quinn-udp", 7954 + "rustc-hash 2.1.1", 7955 + "rustls", 7956 + "socket2 0.6.3", 7957 + "thiserror 2.0.18", 7958 + "tokio", 7959 + "tracing", 7960 + "web-time", 7961 + ] 7962 + 7963 + [[package]] 7964 + name = "quinn-proto" 7965 + version = "0.11.13" 7966 + source = "registry+https://github.com/rust-lang/crates.io-index" 7967 + checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 7968 + dependencies = [ 7969 + "aws-lc-rs", 7970 + "bytes", 7971 + "getrandom 0.3.4", 7972 + "lru-slab", 7973 + "rand 0.9.2", 7974 + "ring", 7975 + "rustc-hash 2.1.1", 7976 + "rustls", 7977 + "rustls-pki-types", 7978 + "slab", 7979 + "thiserror 2.0.18", 7980 + "tinyvec", 7981 + "tracing", 7982 + "web-time", 7983 + ] 7984 + 7985 + [[package]] 7986 + name = "quinn-udp" 7987 + version = "0.5.14" 7988 + source = "registry+https://github.com/rust-lang/crates.io-index" 7989 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 7990 + dependencies = [ 7991 + "cfg_aliases", 7992 + "libc", 7993 + "once_cell", 7994 + "socket2 0.6.3", 7995 + "tracing", 7996 + "windows-sys 0.60.2", 7997 + ] 7998 + 7999 + [[package]] 6560 8000 name = "quote" 6561 8001 version = "1.0.45" 6562 8002 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 6868 8308 checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" 6869 8309 6870 8310 [[package]] 8311 + name = "reqwest" 8312 + version = "0.12.28" 8313 + source = "registry+https://github.com/rust-lang/crates.io-index" 8314 + checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" 8315 + dependencies = [ 8316 + "base64 0.22.1", 8317 + "bytes", 8318 + "futures-core", 8319 + "futures-util", 8320 + "http 1.4.0", 8321 + "http-body 1.0.1", 8322 + "http-body-util", 8323 + "hyper 1.8.1", 8324 + "hyper-rustls", 8325 + "hyper-util", 8326 + "js-sys", 8327 + "log", 8328 + "percent-encoding", 8329 + "pin-project-lite", 8330 + "quinn", 8331 + "rustls", 8332 + "rustls-pki-types", 8333 + "serde", 8334 + "serde_json", 8335 + "serde_urlencoded", 8336 + "sync_wrapper", 8337 + "tokio", 8338 + "tokio-rustls", 8339 + "tokio-util", 8340 + "tower", 8341 + "tower-http", 8342 + "tower-service", 8343 + "url", 8344 + "wasm-bindgen", 8345 + "wasm-bindgen-futures", 8346 + "wasm-streams", 8347 + "web-sys", 8348 + "webpki-roots", 8349 + ] 8350 + 8351 + [[package]] 8352 + name = "reqwest" 8353 + version = "0.13.2" 8354 + source = "registry+https://github.com/rust-lang/crates.io-index" 8355 + checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" 8356 + dependencies = [ 8357 + "base64 0.22.1", 8358 + "bytes", 8359 + "futures-core", 8360 + "http 1.4.0", 8361 + "http-body 1.0.1", 8362 + "http-body-util", 8363 + "hyper 1.8.1", 8364 + "hyper-rustls", 8365 + "hyper-util", 8366 + "js-sys", 8367 + "log", 8368 + "percent-encoding", 8369 + "pin-project-lite", 8370 + "quinn", 8371 + "rustls", 8372 + "rustls-pki-types", 8373 + "rustls-platform-verifier", 8374 + "sync_wrapper", 8375 + "tokio", 8376 + "tokio-rustls", 8377 + "tower", 8378 + "tower-http", 8379 + "tower-service", 8380 + "url", 8381 + "wasm-bindgen", 8382 + "wasm-bindgen-futures", 8383 + "web-sys", 8384 + ] 8385 + 8386 + [[package]] 8387 + name = "resolv-conf" 8388 + version = "0.7.6" 8389 + source = "registry+https://github.com/rust-lang/crates.io-index" 8390 + checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" 8391 + 8392 + [[package]] 6871 8393 name = "resvg" 6872 8394 version = "0.45.1" 6873 8395 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 6942 8464 source = "registry+https://github.com/rust-lang/crates.io-index" 6943 8465 checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" 6944 8466 dependencies = [ 6945 - "const-oid", 6946 - "digest", 8467 + "const-oid 0.9.6", 8468 + "digest 0.10.7", 6947 8469 "num-bigint-dig", 6948 8470 "num-integer", 6949 8471 "num-traits", 6950 8472 "pkcs1", 6951 - "pkcs8", 8473 + "pkcs8 0.10.2", 6952 8474 "rand_core 0.6.4", 6953 8475 "sha1", 6954 - "sha2", 6955 - "signature", 6956 - "spki", 8476 + "sha2 0.10.9", 8477 + "signature 2.2.0", 8478 + "spki 0.7.3", 6957 8479 "subtle", 6958 8480 "zeroize", 6959 8481 ] ··· 7034 8556 "aws-lc-rs", 7035 8557 "log", 7036 8558 "once_cell", 8559 + "ring", 7037 8560 "rustls-pki-types", 7038 8561 "rustls-webpki", 7039 8562 "subtle", ··· 7058 8581 source = "registry+https://github.com/rust-lang/crates.io-index" 7059 8582 checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" 7060 8583 dependencies = [ 8584 + "web-time", 7061 8585 "zeroize", 7062 8586 ] 7063 8587 ··· 7213 8737 source = "registry+https://github.com/rust-lang/crates.io-index" 7214 8738 checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 7215 8739 dependencies = [ 7216 - "base16ct", 7217 - "der", 8740 + "base16ct 0.2.0", 8741 + "der 0.7.10", 7218 8742 "generic-array", 7219 - "pkcs8", 8743 + "pkcs8 0.10.2", 7220 8744 "subtle", 7221 8745 "zeroize", 8746 + ] 8747 + 8748 + [[package]] 8749 + name = "sec1" 8750 + version = "0.8.0-rc.13" 8751 + source = "registry+https://github.com/rust-lang/crates.io-index" 8752 + checksum = "7a2400ed44a13193820aa528a19f376c3843141a8ce96ff34b11104cc79763f2" 8753 + dependencies = [ 8754 + "base16ct 1.0.0", 8755 + "hybrid-array 0.4.7", 7222 8756 ] 7223 8757 7224 8758 [[package]] ··· 7245 8779 ] 7246 8780 7247 8781 [[package]] 8782 + name = "seize" 8783 + version = "0.5.1" 8784 + source = "registry+https://github.com/rust-lang/crates.io-index" 8785 + checksum = "5b55fb86dfd3a2f5f76ea78310a88f96c4ea21a3031f8d212443d56123fd0521" 8786 + dependencies = [ 8787 + "libc", 8788 + "windows-sys 0.61.2", 8789 + ] 8790 + 8791 + [[package]] 7248 8792 name = "selectors" 7249 8793 version = "0.35.0" 7250 8794 source = "git+https://github.com/servo/stylo?rev=9b635629e627a611419745198de1b1ba6c8667c2#9b635629e627a611419745198de1b1ba6c8667c2" ··· 7265 8809 ] 7266 8810 7267 8811 [[package]] 8812 + name = "self_cell" 8813 + version = "1.2.2" 8814 + source = "registry+https://github.com/rust-lang/crates.io-index" 8815 + checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" 8816 + 8817 + [[package]] 7268 8818 name = "semver" 7269 8819 version = "1.0.27" 7270 8820 source = "registry+https://github.com/rust-lang/crates.io-index" 7271 8821 checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 8822 + 8823 + [[package]] 8824 + name = "send_wrapper" 8825 + version = "0.6.0" 8826 + source = "registry+https://github.com/rust-lang/crates.io-index" 8827 + checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 7272 8828 7273 8829 [[package]] 7274 8830 name = "serde" ··· 8202 9758 "servo-profile-traits", 8203 9759 "servo-url", 8204 9760 "servo_arc", 8205 - "sha2", 9761 + "sha2 0.10.9", 8206 9762 "time", 8207 9763 "tokio", 8208 9764 "tokio-rustls", ··· 8387 9943 version = "0.1.0" 8388 9944 dependencies = [ 8389 9945 "accountable-refcell", 8390 - "aes", 8391 - "aes-gcm", 9946 + "aes 0.8.4", 9947 + "aes-gcm 0.10.3", 8392 9948 "aes-kw", 8393 9949 "app_units", 8394 9950 "argon2", ··· 8404 9960 "chacha20poly1305", 8405 9961 "chardetng", 8406 9962 "chrono", 8407 - "cipher", 9963 + "cipher 0.4.4", 8408 9964 "content-security-policy", 8409 9965 "cookie 0.18.1", 8410 9966 "crossbeam-channel", 8411 9967 "cssparser", 8412 - "ctr", 9968 + "ctr 0.9.2", 8413 9969 "data-url", 8414 - "der", 8415 - "digest", 9970 + "der 0.7.10", 9971 + "digest 0.10.7", 8416 9972 "ecdsa", 8417 9973 "elliptic-curve", 8418 9974 "encoding_rs", ··· 8451 10007 "parking_lot", 8452 10008 "percent-encoding", 8453 10009 "phf", 8454 - "pkcs8", 10010 + "pkcs8 0.10.2", 8455 10011 "postcard", 8456 10012 "rand 0.9.2", 8457 10013 "regex", 8458 10014 "rsa", 8459 10015 "rustc-hash 2.1.1", 8460 - "sec1", 10016 + "sec1 0.7.3", 8461 10017 "selectors", 8462 10018 "serde", 8463 10019 "serde_json", ··· 8495 10051 "servo-xpath", 8496 10052 "servo_arc", 8497 10053 "sha1", 8498 - "sha2", 10054 + "sha2 0.10.9", 8499 10055 "sha3", 8500 10056 "smallvec", 8501 10057 "strum", ··· 8794 10350 checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 8795 10351 dependencies = [ 8796 10352 "cfg-if", 8797 - "cpufeatures", 8798 - "digest", 10353 + "cpufeatures 0.2.17", 10354 + "digest 0.10.7", 8799 10355 ] 8800 10356 8801 10357 [[package]] ··· 8811 10367 checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 8812 10368 dependencies = [ 8813 10369 "cfg-if", 8814 - "cpufeatures", 8815 - "digest", 10370 + "cpufeatures 0.2.17", 10371 + "digest 0.10.7", 10372 + ] 10373 + 10374 + [[package]] 10375 + name = "sha2" 10376 + version = "0.11.0-rc.2" 10377 + source = "registry+https://github.com/rust-lang/crates.io-index" 10378 + checksum = "d1e3878ab0f98e35b2df35fe53201d088299b41a6bb63e3e34dada2ac4abd924" 10379 + dependencies = [ 10380 + "cfg-if", 10381 + "cpufeatures 0.2.17", 10382 + "digest 0.11.0-rc.10", 8816 10383 ] 8817 10384 8818 10385 [[package]] ··· 8821 10388 source = "registry+https://github.com/rust-lang/crates.io-index" 8822 10389 checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" 8823 10390 dependencies = [ 8824 - "digest", 10391 + "digest 0.10.7", 8825 10392 "keccak", 8826 10393 ] 8827 10394 ··· 8841 10408 checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 8842 10409 8843 10410 [[package]] 10411 + name = "signal-hook-registry" 10412 + version = "1.4.8" 10413 + source = "registry+https://github.com/rust-lang/crates.io-index" 10414 + checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" 10415 + dependencies = [ 10416 + "errno", 10417 + "libc", 10418 + ] 10419 + 10420 + [[package]] 8844 10421 name = "signature" 8845 10422 version = "2.2.0" 8846 10423 source = "registry+https://github.com/rust-lang/crates.io-index" 8847 10424 checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 8848 10425 dependencies = [ 8849 - "digest", 10426 + "digest 0.10.7", 8850 10427 "rand_core 0.6.4", 8851 10428 ] 8852 10429 8853 10430 [[package]] 10431 + name = "signature" 10432 + version = "3.0.0-rc.10" 10433 + source = "registry+https://github.com/rust-lang/crates.io-index" 10434 + checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3" 10435 + 10436 + [[package]] 8854 10437 name = "simd-adler32" 8855 10438 version = "0.3.8" 8856 10439 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 8866 10449 ] 8867 10450 8868 10451 [[package]] 10452 + name = "simdutf8" 10453 + version = "0.1.5" 10454 + source = "registry+https://github.com/rust-lang/crates.io-index" 10455 + checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" 10456 + 10457 + [[package]] 10458 + name = "simple-dns" 10459 + version = "0.9.3" 10460 + source = "registry+https://github.com/rust-lang/crates.io-index" 10461 + checksum = "dee851d0e5e7af3721faea1843e8015e820a234f81fda3dea9247e15bac9a86a" 10462 + dependencies = [ 10463 + "bitflags 2.11.0", 10464 + ] 10465 + 10466 + [[package]] 8869 10467 name = "simplecss" 8870 10468 version = "0.2.2" 8871 10469 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 8947 10545 8948 10546 [[package]] 8949 10547 name = "smol_str" 10548 + version = "0.1.24" 10549 + source = "registry+https://github.com/rust-lang/crates.io-index" 10550 + checksum = "fad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9" 10551 + 10552 + [[package]] 10553 + name = "smol_str" 8950 10554 version = "0.2.2" 8951 10555 source = "registry+https://github.com/rust-lang/crates.io-index" 8952 10556 checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" ··· 8966 10570 8967 10571 [[package]] 8968 10572 name = "socket2" 8969 - version = "0.6.2" 10573 + version = "0.6.3" 8970 10574 source = "registry+https://github.com/rust-lang/crates.io-index" 8971 - checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" 10575 + checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" 8972 10576 dependencies = [ 8973 10577 "libc", 8974 - "windows-sys 0.60.2", 10578 + "windows-sys 0.61.2", 8975 10579 ] 8976 10580 8977 10581 [[package]] 10582 + name = "sorted-index-buffer" 10583 + version = "0.2.1" 10584 + source = "registry+https://github.com/rust-lang/crates.io-index" 10585 + checksum = "ea06cc588e43c632923a55450401b8f25e628131571d4e1baea1bdfdb2b5ed06" 10586 + 10587 + [[package]] 8978 10588 name = "speexdsp-resampler" 8979 10589 version = "0.1.0" 8980 10590 source = "registry+https://github.com/rust-lang/crates.io-index" 8981 10591 checksum = "b72d540d5c565dbe1f891d7e21ceb21d2649508306782f1066989fccb0b363d3" 8982 10592 8983 10593 [[package]] 10594 + name = "spez" 10595 + version = "0.1.2" 10596 + source = "registry+https://github.com/rust-lang/crates.io-index" 10597 + checksum = "c87e960f4dca2788eeb86bbdde8dd246be8948790b7618d656e68f9b720a86e8" 10598 + dependencies = [ 10599 + "proc-macro2", 10600 + "quote", 10601 + "syn 2.0.117", 10602 + ] 10603 + 10604 + [[package]] 8984 10605 name = "spin" 8985 10606 version = "0.9.8" 8986 10607 source = "registry+https://github.com/rust-lang/crates.io-index" 8987 10608 checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 10609 + dependencies = [ 10610 + "lock_api", 10611 + ] 10612 + 10613 + [[package]] 10614 + name = "spin" 10615 + version = "0.10.0" 10616 + source = "registry+https://github.com/rust-lang/crates.io-index" 10617 + checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" 8988 10618 8989 10619 [[package]] 8990 10620 name = "spirv" ··· 9002 10632 checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 9003 10633 dependencies = [ 9004 10634 "base64ct", 9005 - "der", 10635 + "der 0.7.10", 10636 + ] 10637 + 10638 + [[package]] 10639 + name = "spki" 10640 + version = "0.8.0-rc.4" 10641 + source = "registry+https://github.com/rust-lang/crates.io-index" 10642 + checksum = "8baeff88f34ed0691978ec34440140e1572b68c7dd4a495fd14a3dc1944daa80" 10643 + dependencies = [ 10644 + "base64ct", 10645 + "der 0.8.0", 10646 + ] 10647 + 10648 + [[package]] 10649 + name = "ssh-cipher" 10650 + version = "0.3.0-rc.6" 10651 + source = "registry+https://github.com/rust-lang/crates.io-index" 10652 + checksum = "df1cbedb8b39b0c806c55067e26d3af78ad6ba8e787e93ecac569dbbe7b9922f" 10653 + dependencies = [ 10654 + "aes 0.9.0-rc.4", 10655 + "aes-gcm 0.11.0-rc.3", 10656 + "chacha20 0.10.0", 10657 + "cipher 0.5.1", 10658 + "des", 10659 + "poly1305 0.9.0-rc.6", 10660 + "ssh-encoding", 10661 + "zeroize", 10662 + ] 10663 + 10664 + [[package]] 10665 + name = "ssh-encoding" 10666 + version = "0.3.0-rc.6" 10667 + source = "registry+https://github.com/rust-lang/crates.io-index" 10668 + checksum = "c0edd12dc43f9e7756430151976aad33df83d3983a4fdc11f93c0778a721c707" 10669 + dependencies = [ 10670 + "base64ct", 10671 + "digest 0.11.0-rc.10", 10672 + "pem-rfc7468 1.0.0", 10673 + "subtle", 10674 + "zeroize", 10675 + ] 10676 + 10677 + [[package]] 10678 + name = "ssh-key" 10679 + version = "0.7.0-rc.3" 10680 + source = "registry+https://github.com/rust-lang/crates.io-index" 10681 + checksum = "7307406fcbbeb6933b5c8cc84ec0fefee80fec53ba5b88b96674c0a75495090a" 10682 + dependencies = [ 10683 + "ed25519-dalek", 10684 + "home", 10685 + "rand_core 0.9.5", 10686 + "sec1 0.8.0-rc.13", 10687 + "sha2 0.11.0-rc.2", 10688 + "signature 3.0.0-rc.10", 10689 + "ssh-cipher", 10690 + "ssh-encoding", 10691 + "subtle", 10692 + "zeroize", 9006 10693 ] 9007 10694 9008 10695 [[package]] ··· 9066 10753 "proc-macro2", 9067 10754 "quote", 9068 10755 ] 10756 + 10757 + [[package]] 10758 + name = "strsim" 10759 + version = "0.11.1" 10760 + source = "registry+https://github.com/rust-lang/crates.io-index" 10761 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 9069 10762 9070 10763 [[package]] 9071 10764 name = "strum" ··· 9276 10969 checksum = "e454d048db5527d000bfddb77bd072bbf3a1e2ae785f16d9bd116e07c2ab45eb" 9277 10970 9278 10971 [[package]] 10972 + name = "swarm-discovery" 10973 + version = "0.5.0" 10974 + source = "registry+https://github.com/rust-lang/crates.io-index" 10975 + checksum = "1a5ab62937edac8b23fa40e55a358ea1924245b17fc1eb20d14929c8f11be98d" 10976 + dependencies = [ 10977 + "acto", 10978 + "hickory-proto", 10979 + "rand 0.9.2", 10980 + "socket2 0.6.3", 10981 + "thiserror 2.0.18", 10982 + "tokio", 10983 + "tracing", 10984 + ] 10985 + 10986 + [[package]] 9279 10987 name = "syn" 9280 10988 version = "1.0.109" 9281 10989 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 9301 11009 version = "1.0.2" 9302 11010 source = "registry+https://github.com/rust-lang/crates.io-index" 9303 11011 checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 11012 + dependencies = [ 11013 + "futures-core", 11014 + ] 9304 11015 9305 11016 [[package]] 9306 11017 name = "synstructure" ··· 9341 11052 source = "registry+https://github.com/rust-lang/crates.io-index" 9342 11053 checksum = "48c8f33736f986f16d69b6cb8b03f55ddcad5c41acc4ccc39dd88e84aa805e7f" 9343 11054 dependencies = [ 9344 - "cfg-expr 0.20.6", 11055 + "cfg-expr 0.20.7", 9345 11056 "heck 0.5.0", 9346 11057 "pkg-config", 9347 11058 "toml 0.9.12+spec-1.1.0", ··· 9359 11070 "serde", 9360 11071 "slotmap", 9361 11072 ] 11073 + 11074 + [[package]] 11075 + name = "tagptr" 11076 + version = "0.2.0" 11077 + source = "registry+https://github.com/rust-lang/crates.io-index" 11078 + checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" 9362 11079 9363 11080 [[package]] 9364 11081 name = "tar" ··· 9417 11134 ] 9418 11135 9419 11136 [[package]] 11137 + name = "test-log" 11138 + version = "0.2.19" 11139 + source = "registry+https://github.com/rust-lang/crates.io-index" 11140 + checksum = "37d53ac171c92a39e4769491c4b4dde7022c60042254b5fc044ae409d34a24d4" 11141 + dependencies = [ 11142 + "env_logger", 11143 + "test-log-macros", 11144 + "tracing-subscriber", 11145 + ] 11146 + 11147 + [[package]] 11148 + name = "test-log-macros" 11149 + version = "0.2.19" 11150 + source = "registry+https://github.com/rust-lang/crates.io-index" 11151 + checksum = "be35209fd0781c5401458ab66e4f98accf63553e8fae7425503e92fdd319783b" 11152 + dependencies = [ 11153 + "proc-macro2", 11154 + "quote", 11155 + "syn 2.0.117", 11156 + ] 11157 + 11158 + [[package]] 9420 11159 name = "textnonce" 9421 11160 version = "1.0.0" 9422 11161 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 9533 11272 dependencies = [ 9534 11273 "deranged", 9535 11274 "itoa", 11275 + "js-sys", 9536 11276 "libc", 9537 11277 "num-conv", 9538 11278 "num_threads", ··· 9665 11405 "libc", 9666 11406 "mio", 9667 11407 "pin-project-lite", 9668 - "socket2 0.6.2", 11408 + "signal-hook-registry", 11409 + "socket2 0.6.3", 9669 11410 "tokio-macros", 9670 11411 "windows-sys 0.61.2", 9671 11412 ] ··· 9700 11441 "futures-core", 9701 11442 "pin-project-lite", 9702 11443 "tokio", 11444 + "tokio-util", 9703 11445 ] 9704 11446 9705 11447 [[package]] ··· 9711 11453 "bytes", 9712 11454 "futures-core", 9713 11455 "futures-sink", 11456 + "futures-util", 9714 11457 "pin-project-lite", 9715 11458 "tokio", 9716 11459 ] 9717 11460 9718 11461 [[package]] 11462 + name = "tokio-websockets" 11463 + version = "0.12.3" 11464 + source = "registry+https://github.com/rust-lang/crates.io-index" 11465 + checksum = "b1b6348ebfaaecd771cecb69e832961d277f59845d4220a584701f72728152b7" 11466 + dependencies = [ 11467 + "base64 0.22.1", 11468 + "bytes", 11469 + "futures-core", 11470 + "futures-sink", 11471 + "getrandom 0.3.4", 11472 + "http 1.4.0", 11473 + "httparse", 11474 + "rand 0.9.2", 11475 + "ring", 11476 + "rustls-pki-types", 11477 + "simdutf8", 11478 + "tokio", 11479 + "tokio-rustls", 11480 + "tokio-util", 11481 + ] 11482 + 11483 + [[package]] 9719 11484 name = "toml" 9720 11485 version = "0.8.2" 9721 11486 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 9739 11504 "toml_datetime 0.7.5+spec-1.1.0", 9740 11505 "toml_parser", 9741 11506 "toml_writer", 9742 - "winnow 0.7.14", 11507 + "winnow 0.7.15", 9743 11508 ] 9744 11509 9745 11510 [[package]] ··· 9802 11567 "indexmap", 9803 11568 "toml_datetime 1.0.0+spec-1.1.0", 9804 11569 "toml_parser", 9805 - "winnow 0.7.14", 11570 + "winnow 0.7.15", 9806 11571 ] 9807 11572 9808 11573 [[package]] ··· 9811 11576 source = "registry+https://github.com/rust-lang/crates.io-index" 9812 11577 checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" 9813 11578 dependencies = [ 9814 - "winnow 0.7.14", 11579 + "winnow 0.7.15", 9815 11580 ] 9816 11581 9817 11582 [[package]] ··· 9858 11623 "http-body-util", 9859 11624 "http-range-header", 9860 11625 "httpdate", 11626 + "iri-string", 9861 11627 "mime", 9862 11628 "mime_guess", 9863 11629 "percent-encoding", 9864 11630 "pin-project-lite", 9865 11631 "tokio", 9866 11632 "tokio-util", 11633 + "tower", 9867 11634 "tower-layer", 9868 11635 "tower-service", 9869 11636 "tracing", ··· 10148 11915 source = "registry+https://github.com/rust-lang/crates.io-index" 10149 11916 checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" 10150 11917 dependencies = [ 10151 - "crypto-common", 11918 + "crypto-common 0.1.7", 10152 11919 "subtle", 10153 11920 ] 10154 11921 10155 11922 [[package]] 11923 + name = "universal-hash" 11924 + version = "0.6.1" 11925 + source = "registry+https://github.com/rust-lang/crates.io-index" 11926 + checksum = "f4987bdc12753382e0bec4a65c50738ffaabc998b9cdd1f952fb5f39b0048a96" 11927 + dependencies = [ 11928 + "crypto-common 0.2.1", 11929 + "ctutils", 11930 + ] 11931 + 11932 + [[package]] 10156 11933 name = "untrusted" 10157 11934 version = "0.9.0" 10158 11935 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 10236 12013 10237 12014 [[package]] 10238 12015 name = "uuid" 10239 - version = "1.21.0" 12016 + version = "1.22.0" 10240 12017 source = "registry+https://github.com/rust-lang/crates.io-index" 10241 - checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" 12018 + checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" 10242 12019 dependencies = [ 10243 12020 "getrandom 0.4.2", 10244 12021 "js-sys", ··· 10342 12119 ] 10343 12120 10344 12121 [[package]] 12122 + name = "vergen" 12123 + version = "9.1.0" 12124 + source = "registry+https://github.com/rust-lang/crates.io-index" 12125 + checksum = "b849a1f6d8639e8de261e81ee0fc881e3e3620db1af9f2e0da015d4382ceaf75" 12126 + dependencies = [ 12127 + "anyhow", 12128 + "derive_builder", 12129 + "rustversion", 12130 + "vergen-lib 9.1.0", 12131 + ] 12132 + 12133 + [[package]] 12134 + name = "vergen-gitcl" 12135 + version = "1.0.8" 12136 + source = "registry+https://github.com/rust-lang/crates.io-index" 12137 + checksum = "b9dfc1de6eb2e08a4ddf152f1b179529638bedc0ea95e6d667c014506377aefe" 12138 + dependencies = [ 12139 + "anyhow", 12140 + "derive_builder", 12141 + "rustversion", 12142 + "time", 12143 + "vergen", 12144 + "vergen-lib 0.1.6", 12145 + ] 12146 + 12147 + [[package]] 12148 + name = "vergen-lib" 12149 + version = "0.1.6" 12150 + source = "registry+https://github.com/rust-lang/crates.io-index" 12151 + checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" 12152 + dependencies = [ 12153 + "anyhow", 12154 + "derive_builder", 12155 + "rustversion", 12156 + ] 12157 + 12158 + [[package]] 12159 + name = "vergen-lib" 12160 + version = "9.1.0" 12161 + source = "registry+https://github.com/rust-lang/crates.io-index" 12162 + checksum = "b34a29ba7e9c59e62f229ae1932fb1b8fb8a6fdcc99215a641913f5f5a59a569" 12163 + dependencies = [ 12164 + "anyhow", 12165 + "derive_builder", 12166 + "rustversion", 12167 + ] 12168 + 12169 + [[package]] 10345 12170 name = "version-compare" 10346 12171 version = "0.2.1" 10347 12172 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 10517 12342 ] 10518 12343 10519 12344 [[package]] 12345 + name = "wasm-streams" 12346 + version = "0.4.2" 12347 + source = "registry+https://github.com/rust-lang/crates.io-index" 12348 + checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" 12349 + dependencies = [ 12350 + "futures-util", 12351 + "js-sys", 12352 + "wasm-bindgen", 12353 + "wasm-bindgen-futures", 12354 + "web-sys", 12355 + ] 12356 + 12357 + [[package]] 10520 12358 name = "wasmparser" 10521 12359 version = "0.244.0" 10522 12360 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 10530 12368 10531 12369 [[package]] 10532 12370 name = "wayland-backend" 10533 - version = "0.3.13" 12371 + version = "0.3.14" 10534 12372 source = "registry+https://github.com/rust-lang/crates.io-index" 10535 - checksum = "eaa6143502b9a87f759cb6a649ca801a226f77740eb54f3951cba2227790afeb" 12373 + checksum = "aa75f400b7f719bcd68b3f47cd939ba654cedeef690f486db71331eec4c6a406" 10536 12374 dependencies = [ 10537 12375 "cc", 10538 12376 "downcast-rs", ··· 10621 12459 checksum = "c86287151a309799b821ca709b7345a048a2956af05957c89cb824ab919fa4e3" 10622 12460 dependencies = [ 10623 12461 "proc-macro2", 10624 - "quick-xml", 12462 + "quick-xml 0.39.2", 10625 12463 "quote", 10626 12464 ] 10627 12465 10628 12466 [[package]] 10629 12467 name = "wayland-sys" 10630 - version = "0.31.9" 12468 + version = "0.31.10" 10631 12469 source = "registry+https://github.com/rust-lang/crates.io-index" 10632 - checksum = "81d2bd69b1dadd601d0e98ef2fc9339a1b1e00cec5ee7545a77b5a0f52a90394" 12470 + checksum = "374f6b70e8e0d6bf9461a32988fd553b59ff630964924dad6e4a4eb6bd538d17" 10633 12471 dependencies = [ 10634 12472 "dlib", 10635 12473 "log", ··· 10935 12773 ] 10936 12774 10937 12775 [[package]] 12776 + name = "widestring" 12777 + version = "1.2.1" 12778 + source = "registry+https://github.com/rust-lang/crates.io-index" 12779 + checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" 12780 + 12781 + [[package]] 10938 12782 name = "winapi" 10939 12783 version = "0.3.9" 10940 12784 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 10981 12825 source = "registry+https://github.com/rust-lang/crates.io-index" 10982 12826 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 10983 12827 dependencies = [ 10984 - "windows-collections", 12828 + "windows-collections 0.2.0", 10985 12829 "windows-core 0.61.2", 10986 - "windows-future", 12830 + "windows-future 0.2.1", 10987 12831 "windows-link 0.1.3", 10988 - "windows-numerics", 12832 + "windows-numerics 0.2.0", 12833 + ] 12834 + 12835 + [[package]] 12836 + name = "windows" 12837 + version = "0.62.2" 12838 + source = "registry+https://github.com/rust-lang/crates.io-index" 12839 + checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" 12840 + dependencies = [ 12841 + "windows-collections 0.3.2", 12842 + "windows-core 0.62.2", 12843 + "windows-future 0.3.2", 12844 + "windows-numerics 0.3.1", 10989 12845 ] 10990 12846 10991 12847 [[package]] ··· 10995 12851 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 10996 12852 dependencies = [ 10997 12853 "windows-core 0.61.2", 12854 + ] 12855 + 12856 + [[package]] 12857 + name = "windows-collections" 12858 + version = "0.3.2" 12859 + source = "registry+https://github.com/rust-lang/crates.io-index" 12860 + checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" 12861 + dependencies = [ 12862 + "windows-core 0.62.2", 10998 12863 ] 10999 12864 11000 12865 [[package]] ··· 11044 12909 dependencies = [ 11045 12910 "windows-core 0.61.2", 11046 12911 "windows-link 0.1.3", 11047 - "windows-threading", 12912 + "windows-threading 0.1.0", 12913 + ] 12914 + 12915 + [[package]] 12916 + name = "windows-future" 12917 + version = "0.3.2" 12918 + source = "registry+https://github.com/rust-lang/crates.io-index" 12919 + checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" 12920 + dependencies = [ 12921 + "windows-core 0.62.2", 12922 + "windows-link 0.2.1", 12923 + "windows-threading 0.2.1", 11048 12924 ] 11049 12925 11050 12926 [[package]] ··· 11114 12990 ] 11115 12991 11116 12992 [[package]] 12993 + name = "windows-numerics" 12994 + version = "0.3.1" 12995 + source = "registry+https://github.com/rust-lang/crates.io-index" 12996 + checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" 12997 + dependencies = [ 12998 + "windows-core 0.62.2", 12999 + "windows-link 0.2.1", 13000 + ] 13001 + 13002 + [[package]] 11117 13003 name = "windows-result" 11118 13004 version = "0.2.0" 11119 13005 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 11179 13065 11180 13066 [[package]] 11181 13067 name = "windows-sys" 13068 + version = "0.48.0" 13069 + source = "registry+https://github.com/rust-lang/crates.io-index" 13070 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 13071 + dependencies = [ 13072 + "windows-targets 0.48.5", 13073 + ] 13074 + 13075 + [[package]] 13076 + name = "windows-sys" 11182 13077 version = "0.52.0" 11183 13078 source = "registry+https://github.com/rust-lang/crates.io-index" 11184 13079 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" ··· 11230 13125 11231 13126 [[package]] 11232 13127 name = "windows-targets" 13128 + version = "0.48.5" 13129 + source = "registry+https://github.com/rust-lang/crates.io-index" 13130 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 13131 + dependencies = [ 13132 + "windows_aarch64_gnullvm 0.48.5", 13133 + "windows_aarch64_msvc 0.48.5", 13134 + "windows_i686_gnu 0.48.5", 13135 + "windows_i686_msvc 0.48.5", 13136 + "windows_x86_64_gnu 0.48.5", 13137 + "windows_x86_64_gnullvm 0.48.5", 13138 + "windows_x86_64_msvc 0.48.5", 13139 + ] 13140 + 13141 + [[package]] 13142 + name = "windows-targets" 11233 13143 version = "0.52.6" 11234 13144 source = "registry+https://github.com/rust-lang/crates.io-index" 11235 13145 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" ··· 11271 13181 ] 11272 13182 11273 13183 [[package]] 13184 + name = "windows-threading" 13185 + version = "0.2.1" 13186 + source = "registry+https://github.com/rust-lang/crates.io-index" 13187 + checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" 13188 + dependencies = [ 13189 + "windows-link 0.2.1", 13190 + ] 13191 + 13192 + [[package]] 11274 13193 name = "windows_aarch64_gnullvm" 11275 13194 version = "0.42.2" 11276 13195 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 11278 13197 11279 13198 [[package]] 11280 13199 name = "windows_aarch64_gnullvm" 13200 + version = "0.48.5" 13201 + source = "registry+https://github.com/rust-lang/crates.io-index" 13202 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 13203 + 13204 + [[package]] 13205 + name = "windows_aarch64_gnullvm" 11281 13206 version = "0.52.6" 11282 13207 source = "registry+https://github.com/rust-lang/crates.io-index" 11283 13208 checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" ··· 11296 13221 11297 13222 [[package]] 11298 13223 name = "windows_aarch64_msvc" 13224 + version = "0.48.5" 13225 + source = "registry+https://github.com/rust-lang/crates.io-index" 13226 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 13227 + 13228 + [[package]] 13229 + name = "windows_aarch64_msvc" 11299 13230 version = "0.52.6" 11300 13231 source = "registry+https://github.com/rust-lang/crates.io-index" 11301 13232 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" ··· 11314 13245 11315 13246 [[package]] 11316 13247 name = "windows_i686_gnu" 13248 + version = "0.48.5" 13249 + source = "registry+https://github.com/rust-lang/crates.io-index" 13250 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 13251 + 13252 + [[package]] 13253 + name = "windows_i686_gnu" 11317 13254 version = "0.52.6" 11318 13255 source = "registry+https://github.com/rust-lang/crates.io-index" 11319 13256 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" ··· 11344 13281 11345 13282 [[package]] 11346 13283 name = "windows_i686_msvc" 13284 + version = "0.48.5" 13285 + source = "registry+https://github.com/rust-lang/crates.io-index" 13286 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 13287 + 13288 + [[package]] 13289 + name = "windows_i686_msvc" 11347 13290 version = "0.52.6" 11348 13291 source = "registry+https://github.com/rust-lang/crates.io-index" 11349 13292 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" ··· 11362 13305 11363 13306 [[package]] 11364 13307 name = "windows_x86_64_gnu" 13308 + version = "0.48.5" 13309 + source = "registry+https://github.com/rust-lang/crates.io-index" 13310 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 13311 + 13312 + [[package]] 13313 + name = "windows_x86_64_gnu" 11365 13314 version = "0.52.6" 11366 13315 source = "registry+https://github.com/rust-lang/crates.io-index" 11367 13316 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" ··· 11380 13329 11381 13330 [[package]] 11382 13331 name = "windows_x86_64_gnullvm" 13332 + version = "0.48.5" 13333 + source = "registry+https://github.com/rust-lang/crates.io-index" 13334 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 13335 + 13336 + [[package]] 13337 + name = "windows_x86_64_gnullvm" 11383 13338 version = "0.52.6" 11384 13339 source = "registry+https://github.com/rust-lang/crates.io-index" 11385 13340 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" ··· 11398 13353 11399 13354 [[package]] 11400 13355 name = "windows_x86_64_msvc" 13356 + version = "0.48.5" 13357 + source = "registry+https://github.com/rust-lang/crates.io-index" 13358 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 13359 + 13360 + [[package]] 13361 + name = "windows_x86_64_msvc" 11401 13362 version = "0.52.6" 11402 13363 source = "registry+https://github.com/rust-lang/crates.io-index" 11403 13364 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" ··· 11443 13404 "rustix 0.38.44", 11444 13405 "sctk-adwaita", 11445 13406 "smithay-client-toolkit", 11446 - "smol_str", 13407 + "smol_str 0.2.2", 11447 13408 "tracing", 11448 13409 "unicode-segmentation", 11449 13410 "wasm-bindgen", ··· 11471 13432 11472 13433 [[package]] 11473 13434 name = "winnow" 11474 - version = "0.7.14" 13435 + version = "0.7.15" 11475 13436 source = "registry+https://github.com/rust-lang/crates.io-index" 11476 - checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" 13437 + checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" 11477 13438 dependencies = [ 11478 13439 "memchr", 11479 13440 ] 11480 13441 11481 13442 [[package]] 13443 + name = "winreg" 13444 + version = "0.50.0" 13445 + source = "registry+https://github.com/rust-lang/crates.io-index" 13446 + checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 13447 + dependencies = [ 13448 + "cfg-if", 13449 + "windows-sys 0.48.0", 13450 + ] 13451 + 13452 + [[package]] 11482 13453 name = "wio" 11483 13454 version = "0.2.2" 11484 13455 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 11576 13547 ] 11577 13548 11578 13549 [[package]] 13550 + name = "wmi" 13551 + version = "0.18.3" 13552 + source = "registry+https://github.com/rust-lang/crates.io-index" 13553 + checksum = "003e65f4934cf9449b9ce913ad822cd054a5af669d24f93db101fdb02856bb23" 13554 + dependencies = [ 13555 + "chrono", 13556 + "futures", 13557 + "log", 13558 + "serde", 13559 + "thiserror 2.0.18", 13560 + "windows 0.62.2", 13561 + "windows-core 0.62.2", 13562 + ] 13563 + 13564 + [[package]] 11579 13565 name = "wr_glyph_rasterizer" 11580 13566 version = "0.68.0" 11581 13567 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 11633 13619 checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 11634 13620 11635 13621 [[package]] 13622 + name = "ws_stream_wasm" 13623 + version = "0.7.5" 13624 + source = "registry+https://github.com/rust-lang/crates.io-index" 13625 + checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" 13626 + dependencies = [ 13627 + "async_io_stream", 13628 + "futures", 13629 + "js-sys", 13630 + "log", 13631 + "pharos", 13632 + "rustc_version", 13633 + "send_wrapper", 13634 + "thiserror 2.0.18", 13635 + "wasm-bindgen", 13636 + "wasm-bindgen-futures", 13637 + "web-sys", 13638 + ] 13639 + 13640 + [[package]] 11636 13641 name = "x11" 11637 13642 version = "2.21.0" 11638 13643 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 11680 13685 source = "registry+https://github.com/rust-lang/crates.io-index" 11681 13686 checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" 11682 13687 dependencies = [ 11683 - "curve25519-dalek", 13688 + "curve25519-dalek 4.1.3", 11684 13689 "rand_core 0.6.4", 11685 13690 "serde", 11686 13691 "zeroize", ··· 11750 13755 ] 11751 13756 11752 13757 [[package]] 13758 + name = "xmltree" 13759 + version = "0.10.3" 13760 + source = "registry+https://github.com/rust-lang/crates.io-index" 13761 + checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" 13762 + dependencies = [ 13763 + "xml-rs", 13764 + ] 13765 + 13766 + [[package]] 11753 13767 name = "xmlwriter" 11754 13768 version = "0.1.0" 11755 13769 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 11818 13832 "syn 2.0.117", 11819 13833 "synstructure", 11820 13834 ] 13835 + 13836 + [[package]] 13837 + name = "z32" 13838 + version = "1.3.0" 13839 + source = "registry+https://github.com/rust-lang/crates.io-index" 13840 + checksum = "2164e798d9e3d84ee2c91139ace54638059a3b23e361f5c11781c2c6459bde0f" 11821 13841 11822 13842 [[package]] 11823 13843 name = "zeitstempel"
+1 -1
Cargo.toml
··· 1 1 [workspace] 2 2 resolver = "2" 3 - members = ["crates/beaver_shell"] 3 + members = ["crates/beaver_p2p", "crates/beaver_shell"] 4 4 5 5 # Copied from the main Cargo.toml to allow 6 6 # workspace inheritance from component/ crates.
+1
crates/beaver_p2p/.gitignore
··· 1 + /target
+18
crates/beaver_p2p/Cargo.toml
··· 1 + [package] 2 + name = "beaver-p2p" 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 + iroh-persist = { git = "https://github.com/webbeef/iroh-persist.git", branch = "iroh-0.96" } 10 + log = "0.4" 11 + n0-error = "0.1" 12 + n0-future = "0.3" 13 + parking_lot = "0.12" 14 + petname = "2.0" 15 + postcard = "1.1" 16 + serde = "1.0" 17 + thiserror = "2.0" 18 + tokio = { version = "1.50", features = ["signal"] }
+661
crates/beaver_p2p/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/>.
+371
crates/beaver_p2p/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 iroh::SecretKey; 10 + use packet::PostcardPacket; 11 + use std::sync::Arc; 12 + use tokio::task::AbortHandle; 13 + 14 + use crate::packet::BasePacket; 15 + use iroh::address_lookup::UserData; 16 + use iroh::address_lookup::mdns::MdnsAddressLookup; 17 + use iroh::endpoint::{ClosedStream, ConnectError, ConnectionError, WriteError}; 18 + use iroh::{Endpoint, EndpointId, RelayMode, protocol::Router}; 19 + use log::{error, info}; 20 + use n0_future::StreamExt; 21 + use std::sync::mpsc::Sender; 22 + use thiserror::Error; 23 + use tokio::sync::Mutex; 24 + 25 + use crate::pairing_hook::{MESSAGE_ALPN, PAIRING_ALPN}; 26 + pub use crate::state::EndpointStatus; 27 + pub use crate::state::PeerEvent; 28 + use crate::state::{EndpointDescription, PairingCommand, SharedState, State}; 29 + 30 + #[derive(Debug, Error)] 31 + pub enum PairingError { 32 + #[error("Unknown remote endpoint")] 33 + UnknownRemote, 34 + #[error("Endpoint pairing already requested")] 35 + AlreadyRequested, 36 + #[error("Invalid state during pairing")] 37 + InvalidState, 38 + #[error("Failure to receive command Ack")] 39 + FailedAck, 40 + #[error("Pairing rejected")] 41 + Rejected, 42 + #[error("Failed to connect")] 43 + Connect(#[from] ConnectError), 44 + #[error("Connection error")] 45 + Connection(#[from] ConnectionError), 46 + #[error("Write error")] 47 + Write(#[from] WriteError), 48 + #[error("Closed stream")] 49 + ClosedStream(#[from] ClosedStream), 50 + #[error("Postcard error")] 51 + Postcard(#[from] postcard::Error), 52 + } 53 + 54 + #[derive(Debug, Error)] 55 + pub enum MessageError { 56 + #[error("Invalid state for messaging")] 57 + InvalidState, 58 + #[error("Unknown remote endpoint")] 59 + UnknownRemote, 60 + #[error("Peer is not paired")] 61 + Unpaired, 62 + #[error("Packet sending error")] 63 + Packet(#[from] packet::PacketError), 64 + #[error("Failed to connect")] 65 + Connect(#[from] ConnectError), 66 + #[error("Connection error")] 67 + Connection(#[from] ConnectionError), 68 + } 69 + 70 + #[derive(Clone)] 71 + pub struct PairingManagerInner { 72 + state: SharedState, 73 + 74 + router: Router, 75 + mdns_handle: AbortHandle, 76 + } 77 + 78 + #[derive(Clone)] 79 + pub struct PairingManager { 80 + inner: Option<PairingManagerInner>, 81 + } 82 + 83 + impl PairingManager { 84 + pub async fn create(sender: Sender<PeerEvent>, name: &str, secret_key: SecretKey) -> Self { 85 + let state = Arc::new(Mutex::new(State::new(sender.clone()))); 86 + 87 + let user_data: UserData = name.to_owned().try_into().unwrap(); 88 + let endpoint = Endpoint::empty_builder(RelayMode::Disabled) 89 + .secret_key(secret_key) 90 + .user_data_for_address_lookup(user_data) 91 + .hooks(pairing_hook::PairingHook::new(Arc::clone(&state))) 92 + .bind() 93 + .await 94 + .unwrap(); 95 + 96 + println!("Endpoint {name}, {}", endpoint.id()); 97 + 98 + let mdns = MdnsAddressLookup::builder().build(endpoint.id()).unwrap(); 99 + endpoint.address_lookup().add(mdns.clone()); 100 + 101 + let disco_state = Arc::clone(&state); 102 + let mdns_handle = tokio::spawn(async move { 103 + let mut events = mdns.subscribe().await; 104 + while let Some(event) = events.next().await { 105 + // Update the state. 106 + disco_state.lock().await.on_discovery(&event); 107 + } 108 + }); 109 + 110 + let router = Router::builder(endpoint) 111 + .accept( 112 + PAIRING_ALPN, 113 + pairing_protocol::PairingProtocol::new(Arc::clone(&state)), 114 + ) 115 + .accept( 116 + MESSAGE_ALPN, 117 + message_protocol::MessageProtocol::new(Arc::clone(&state)), 118 + ) 119 + .spawn(); 120 + 121 + let inner = PairingManagerInner { 122 + state, 123 + router, 124 + mdns_handle: mdns_handle.abort_handle(), 125 + }; 126 + Self { inner: Some(inner) } 127 + } 128 + 129 + // Send a pairing request to an endpoint. 130 + pub async fn request_pairing(&self, id: &EndpointId) -> Result<(), PairingError> { 131 + info!("Pairing with {id}"); 132 + let Some(ref inner) = self.inner else { 133 + error!("Not initialized"); 134 + return Err(PairingError::InvalidState); 135 + }; 136 + 137 + let addr = { 138 + let state = inner.state.lock().await; 139 + let Some(remote) = state.by_id(id) else { 140 + error!("Can't request pairing from unknown remote {id}"); 141 + return Err(PairingError::UnknownRemote); 142 + }; 143 + remote.addr() 144 + }; 145 + 146 + // Don't request pairing twice with the same endpoint. 147 + { 148 + let mut state = inner.state.lock().await; 149 + if !state.has_requested(id) { 150 + state.set_pairing_requested(id); 151 + } else { 152 + error!("Already requested pairing with {id}"); 153 + return Err(PairingError::AlreadyRequested); 154 + } 155 + } 156 + 157 + let connection = inner.router.endpoint().connect(addr, PAIRING_ALPN).await?; 158 + 159 + // Send the the request. 160 + let (mut sender, mut receiver) = connection.open_bi().await?; 161 + 162 + let command = PairingCommand::Request; 163 + PostcardPacket::send(command, &mut sender) 164 + .await 165 + .expect("Failed to send"); 166 + 167 + // Wait for accept or reject 168 + let command: PairingCommand = PostcardPacket::recv(&mut receiver) 169 + .await 170 + .expect("Failed to receive"); 171 + 172 + let accepted = match command { 173 + PairingCommand::Accept => true, 174 + PairingCommand::Reject => false, 175 + PairingCommand::Request => { 176 + error!("Unexpected Request in response to a pairing request"); 177 + return Err(PairingError::InvalidState); 178 + } 179 + PairingCommand::Ack => { 180 + error!("Unexpected Ack in response to a pairing request"); 181 + return Err(PairingError::InvalidState); 182 + } 183 + }; 184 + 185 + // Send Ack 186 + PostcardPacket::send(PairingCommand::Ack, &mut sender) 187 + .await 188 + .expect("Failed to send Ack"); 189 + 190 + let mut state = inner.state.lock().await; 191 + state.remove_pairing_requested(id); 192 + sender.finish()?; 193 + 194 + if accepted { 195 + state.notify(PeerEvent::PairingAccepted(*id)); 196 + state.set_status(id, EndpointStatus::PairedConnected); 197 + Ok(()) 198 + } else { 199 + state.remove_pairing_requested(id); 200 + state.notify(PeerEvent::PairingRejected(*id)); 201 + Err(PairingError::Rejected) 202 + } 203 + } 204 + 205 + // Common code for accept/reject of a pairing request 206 + async fn send_pairing_response( 207 + &self, 208 + from: &EndpointId, 209 + command: PairingCommand, 210 + ) -> Result<(), PairingError> { 211 + info!("Sending pairing response: {command:?}"); 212 + let Some(ref inner) = self.inner else { 213 + error!("Not initialized"); 214 + return Err(PairingError::InvalidState); 215 + }; 216 + 217 + if inner.state.lock().await.by_id(from).is_none() { 218 + error!("Can't send pairing response to unknown remote {from}"); 219 + return Err(PairingError::UnknownRemote); 220 + }; 221 + 222 + let (sender, mut ack_receiver) = { 223 + let mut state = inner.state.lock().await; 224 + let Some((sender, ack_receiver)) = state.take_pairing_responder(from) else { 225 + error!("No responder for {from}"); 226 + return Err(PairingError::UnknownRemote); 227 + }; 228 + (sender, ack_receiver) 229 + }; 230 + 231 + sender 232 + .send(command) 233 + .await 234 + .expect("Failed to send to the responder"); 235 + 236 + // Wait for the Ack to be received. 237 + let ack = ack_receiver.recv().await.unwrap_or(false); 238 + 239 + if ack { 240 + Ok(()) 241 + } else { 242 + Err(PairingError::FailedAck) 243 + } 244 + } 245 + 246 + // Accept a pairing request 247 + pub async fn accept_pairing(&self, from: &EndpointId) -> Result<(), PairingError> { 248 + let Some(ref inner) = self.inner else { 249 + error!("Not initialized"); 250 + return Err(PairingError::InvalidState); 251 + }; 252 + 253 + let res = self 254 + .send_pairing_response(from, PairingCommand::Accept) 255 + .await; 256 + println!("accept_pairing ok 3"); 257 + let mut state = inner.state.lock().await; 258 + let res = res.map(|_| { 259 + // Add the endpoint to the set of pending acks if successfully sending. 260 + state.set_pending_ack(from); 261 + }); 262 + res 263 + } 264 + 265 + // Reject a pairing request 266 + pub async fn reject_pairing(&self, from: &EndpointId) -> Result<(), PairingError> { 267 + self.send_pairing_response(from, PairingCommand::Reject) 268 + .await 269 + } 270 + 271 + // Get the list of current known peers. 272 + pub async fn peers(&self) -> Vec<EndpointDescription> { 273 + let Some(ref inner) = self.inner else { 274 + error!("Not initialized"); 275 + return vec![]; 276 + }; 277 + 278 + inner 279 + .state 280 + .lock() 281 + .await 282 + .endpoints() 283 + .values() 284 + .map(|e| e.into()) 285 + .collect() 286 + } 287 + 288 + // Send a message to a paired peer. 289 + pub async fn send_message(&self, to: &EndpointId, message: &[u8]) -> Result<(), MessageError> { 290 + let Some(ref inner) = self.inner else { 291 + error!("Not initialized"); 292 + return Err(MessageError::InvalidState); 293 + }; 294 + 295 + let addr = { 296 + let state = inner.state.lock().await; 297 + let Some(remote) = state.by_id(to) else { 298 + error!("Can't send messages to unknown remote {to}"); 299 + return Err(MessageError::UnknownRemote); 300 + }; 301 + if !remote.is_paired() { 302 + return Err(MessageError::Unpaired); 303 + } 304 + remote.addr() 305 + }; 306 + 307 + if inner.state.lock().await.by_id(to).is_none() { 308 + error!("Can't send message to unknown remote {to}"); 309 + return Err(MessageError::UnknownRemote); 310 + }; 311 + 312 + // If we have an existing sender for that endpoint, use it. 313 + if let Some(ref mut sender) = inner.state.lock().await.get_message_sender(to) { 314 + BasePacket::send(message, sender).await?; 315 + return Ok(()); 316 + } 317 + 318 + // Otherwise, create a new connection 319 + let connection = inner.router.endpoint().connect(addr, MESSAGE_ALPN).await?; 320 + let (mut sender, mut receiver) = connection.open_bi().await?; 321 + BasePacket::send(message, &mut sender).await?; 322 + inner.state.lock().await.set_message_sender(to, sender); 323 + 324 + // create the relaying task 325 + // TODO: share with message_protocol 326 + let state = Arc::clone(&inner.state); 327 + let remote_id = *to; 328 + tokio::spawn(async move { 329 + loop { 330 + match BasePacket::recv(&mut receiver).await { 331 + Ok(payload) => { 332 + state 333 + .lock() 334 + .await 335 + .notify(PeerEvent::Message(remote_id, payload)); 336 + } 337 + Err(err) => { 338 + error!("Error reading message packet: {err}"); 339 + break; 340 + } 341 + } 342 + } 343 + }); 344 + 345 + Ok(()) 346 + } 347 + 348 + pub async fn stop(&mut self) { 349 + let Some(ref inner) = self.inner else { 350 + error!("Not initialized"); 351 + return; 352 + }; 353 + 354 + if !inner.router.is_shutdown() { 355 + inner.mdns_handle.abort(); 356 + let _ = inner.router.shutdown().await; 357 + } 358 + 359 + // Force dropping the mdns advertising tasks. 360 + self.inner = None; 361 + } 362 + 363 + pub async fn set_status(&self, endpoint: &EndpointId, status: EndpointStatus) { 364 + let Some(ref inner) = self.inner else { 365 + error!("Not initialized"); 366 + return; 367 + }; 368 + 369 + inner.state.lock().await.set_status(endpoint, status); 370 + } 371 + }
+63
crates/beaver_p2p/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 secret = iroh_persist::KeyRetriever::new("test") 13 + .lenient() 14 + .get() 15 + .await; 16 + let manager = PairingManager::create(sender, &name, secret).await; 17 + info!("PairingManager started!"); 18 + 19 + let start_pairing = std::env::args().len() > 1; 20 + 21 + loop { 22 + match receiver.recv() { 23 + Ok(event) => match event { 24 + PeerEvent::Discovery(DiscoveryEvent::Discovered { endpoint_info, .. }) => { 25 + info!( 26 + "MDNS discovered: {:?} {:?}", 27 + endpoint_info.endpoint_id, 28 + endpoint_info.user_data() 29 + ); 30 + if start_pairing { 31 + let _ = manager.request_pairing(&endpoint_info.endpoint_id).await; 32 + } 33 + } 34 + PeerEvent::Discovery(DiscoveryEvent::Expired { endpoint_id }) => { 35 + info!("MDNS expired: {endpoint_id}"); 36 + } 37 + PeerEvent::PairingRequest(endpoint_id) => { 38 + info!("Accepting pairing request from {endpoint_id}"); 39 + manager 40 + .accept_pairing(&endpoint_id) 41 + .await 42 + .expect("Failed to accept"); 43 + } 44 + PeerEvent::PairingAccepted(endpoint_id) => { 45 + info!("Pairing accepted from {endpoint_id}"); 46 + } 47 + PeerEvent::PairingRejected(endpoint_id) => { 48 + info!("Pairing rejected from {endpoint_id}"); 49 + } 50 + PeerEvent::PairingFailed(endpoint_id) => { 51 + info!("Pairing failed with {endpoint_id}"); 52 + } 53 + PeerEvent::Message(endpoint_id, payload) => { 54 + info!("Message of {} bytes from {}", payload.len(), endpoint_id); 55 + } 56 + }, 57 + Err(err) => { 58 + println!("Channel closed: {err}"); 59 + break; 60 + } 61 + } 62 + } 63 + }
+64
crates/beaver_p2p/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 (sender, mut receiver) = connection.accept_bi().await?; 36 + 37 + // 2. Store the sender in the state for that remote ID. 38 + self.state 39 + .lock() 40 + .await 41 + .set_message_sender(&remote_id, sender); 42 + 43 + // 3. Relay all the incoming messages. 44 + loop { 45 + match BasePacket::recv(&mut receiver).await { 46 + Ok(payload) => { 47 + self.state 48 + .lock() 49 + .await 50 + .notify(PeerEvent::Message(remote_id, payload)); 51 + } 52 + Err(err) => { 53 + error!("Error reading message packet: {err}"); 54 + break; 55 + } 56 + } 57 + } 58 + 59 + // 4. Done with that connection? 60 + self.state.lock().await.remove_message_sender(&remote_id); 61 + 62 + Ok(()) 63 + } 64 + }
+59
crates/beaver_p2p/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 + }
+58
crates/beaver_p2p/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 + info!( 26 + "after_handshake alpn={} side={:?} remote={}", 27 + String::from_utf8_lossy(conn.alpn()), 28 + conn.side(), 29 + conn.remote_id() 30 + ); 31 + 32 + // Always allow outgoing connections. 33 + if conn.side() == Side::Client { 34 + return AfterHandshakeOutcome::Accept; 35 + } 36 + 37 + info!( 38 + "Incoming hook with alpn={:?}", 39 + String::from_utf8_lossy(conn.alpn()) 40 + ); 41 + 42 + // For message protocol, only allow PairedConnected endpoints. 43 + if conn.alpn() == MESSAGE_ALPN 44 + && !self 45 + .state 46 + .lock() 47 + .await 48 + .has(&conn.remote_id(), EndpointStatus::PairedConnected) 49 + { 50 + return AfterHandshakeOutcome::Reject { 51 + error_code: 401u32.into(), 52 + reason: b"not paired".into(), 53 + }; 54 + } 55 + 56 + AfterHandshakeOutcome::Accept 57 + } 58 + }
+140
crates/beaver_p2p/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().await; 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 + .await 78 + .notify(PeerEvent::PairingRequest(remote_id)); 79 + } 80 + _ => { 81 + error!("Unexpected command: {command:?}"); 82 + return Err(AcceptError::from(n0_error::AnyError::from(format!( 83 + "Unexpected command: {command:?}" 84 + )))); 85 + } 86 + } 87 + 88 + let (tokio_sender, mut tokio_receiver) = tokio_channel(2); 89 + let (ack_sender, ack_receiver) = tokio_channel(2); 90 + { 91 + let mut state = self.state.lock().await; 92 + state.set_pairing_responder(&remote_id, (tokio_sender, ack_receiver)); 93 + } 94 + 95 + // Step 2. Wait for the Accept or Reject response on the channel and send it back. 96 + let answer = tokio_receiver 97 + .recv() 98 + .await 99 + .expect("Failed to receive pairing answer"); 100 + 101 + let accepted = answer == PairingCommand::Accept; 102 + 103 + PostcardPacket::send(answer, &mut sender) 104 + .await 105 + .expect("Failed to send"); 106 + 107 + // Step 3. Wait for the Ack from the other side. 108 + let command: PairingCommand = PostcardPacket::recv(&mut receiver) 109 + .await 110 + .expect("Failed to read"); 111 + 112 + match command { 113 + PairingCommand::Ack => { 114 + { 115 + let mut state = self.state.lock().await; 116 + if accepted { 117 + state.notify(PeerEvent::PairingAccepted(remote_id)); 118 + state.set_status(&remote_id, EndpointStatus::PairedConnected); 119 + } else { 120 + state.notify(PeerEvent::PairingRejected(remote_id)); 121 + } 122 + } 123 + let _ = ack_sender.send(true).await; 124 + } 125 + _ => { 126 + self.state 127 + .lock() 128 + .await 129 + .notify(PeerEvent::PairingFailed(remote_id)); 130 + let _ = ack_sender.send(false).await; 131 + error!("Unexpected command: {command:?}"); 132 + return Err(AcceptError::from(n0_error::AnyError::from(format!( 133 + "Unexpected command: {command:?}" 134 + )))); 135 + } 136 + } 137 + 138 + Ok(()) 139 + } 140 + }
+263
crates/beaver_p2p/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::{EndpointAddr, EndpointId, address_lookup::DiscoveryEvent, endpoint::SendStream}; 9 + 10 + use log::{info, warn}; 11 + use serde::{Deserialize, Serialize}; 12 + use std::sync::mpsc::Sender; 13 + use tokio::sync::Mutex; 14 + use tokio::sync::mpsc::{Receiver as TokioReceiver, Sender as TokioSender}; 15 + 16 + pub(crate) type SharedState = Arc<Mutex<State>>; 17 + 18 + #[derive(Clone, Debug, PartialEq)] 19 + pub enum EndpointStatus { 20 + PairedConnected, 21 + PairedDisconnected, 22 + Discovered, 23 + } 24 + 25 + #[derive(Debug)] 26 + pub(crate) struct EndpointProxy { 27 + name: String, 28 + id: EndpointId, 29 + addr: EndpointAddr, 30 + status: EndpointStatus, 31 + message_sender: Option<SendStream>, 32 + } 33 + 34 + impl EndpointProxy { 35 + pub(crate) fn new( 36 + name: &str, 37 + id: EndpointId, 38 + addr: EndpointAddr, 39 + status: EndpointStatus, 40 + ) -> Self { 41 + Self { 42 + name: name.to_owned(), 43 + id: id.to_owned(), 44 + addr, 45 + status, 46 + message_sender: None, 47 + } 48 + } 49 + 50 + pub(crate) fn addr(&self) -> EndpointAddr { 51 + self.addr.clone() 52 + } 53 + 54 + pub(crate) fn is_paired(&self) -> bool { 55 + self.status == EndpointStatus::PairedConnected 56 + || self.status == EndpointStatus::PairedDisconnected 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 + pub(crate) 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 + pub(crate) fn get_message_sender(&mut self, id: &EndpointId) -> Option<&mut SendStream> { 162 + info!("get_message_sender for {id}"); 163 + if let Some(desc) = self.endpoints.get_mut(id) { 164 + desc.message_sender.as_mut() 165 + } else { 166 + None 167 + } 168 + } 169 + 170 + pub(crate) fn remove_message_sender(&mut self, id: &EndpointId) { 171 + info!("remove_message_sender for {id}"); 172 + if let Some(desc) = self.endpoints.get_mut(id) { 173 + desc.message_sender = None; 174 + } 175 + } 176 + 177 + pub(crate) fn set_status(&mut self, id: &EndpointId, status: EndpointStatus) { 178 + if let Some(desc) = self.endpoints.get_mut(id) { 179 + desc.status = status; 180 + } 181 + } 182 + 183 + fn discovered(&self, id: &EndpointId) -> bool { 184 + self.endpoints 185 + .get(id) 186 + .is_some_and(|desc| desc.status != EndpointStatus::PairedDisconnected) 187 + } 188 + 189 + pub(crate) fn has_requested(&self, id: &EndpointId) -> bool { 190 + self.pairing_requested.contains(id) 191 + } 192 + 193 + pub(crate) fn set_pairing_requested(&mut self, id: &EndpointId) { 194 + self.pairing_requested.insert(*id); 195 + } 196 + 197 + pub(crate) fn remove_pairing_requested(&mut self, id: &EndpointId) { 198 + self.pairing_requested.remove(id); 199 + } 200 + 201 + pub(crate) fn set_pending_ack(&mut self, id: &EndpointId) { 202 + self.pending_ack.insert(*id); 203 + } 204 + 205 + pub(crate) fn set_pairing_responder( 206 + &mut self, 207 + id: &EndpointId, 208 + params: (TokioSender<PairingCommand>, TokioReceiver<bool>), 209 + ) { 210 + self.pairing_responders.insert(*id, params); 211 + } 212 + 213 + pub(crate) fn take_pairing_responder( 214 + &mut self, 215 + id: &EndpointId, 216 + ) -> Option<(TokioSender<PairingCommand>, TokioReceiver<bool>)> { 217 + self.pairing_responders.remove(id) 218 + } 219 + 220 + pub(crate) fn on_discovery(&mut self, event: &DiscoveryEvent) { 221 + match event { 222 + DiscoveryEvent::Discovered { endpoint_info, .. } => { 223 + // Ignore if we already know about this endpoint. 224 + if self.discovered(&endpoint_info.endpoint_id) { 225 + return; 226 + } 227 + 228 + // Add it as Discovered and notify the listener. 229 + let description = EndpointProxy { 230 + name: endpoint_info 231 + .data 232 + .user_data() 233 + .map(|d| d.as_ref()) 234 + .unwrap_or_else(|| "<no name>") 235 + .into(), 236 + id: endpoint_info.endpoint_id, 237 + addr: endpoint_info.to_endpoint_addr(), 238 + status: EndpointStatus::Discovered, 239 + message_sender: None, 240 + }; 241 + self.endpoints 242 + .insert(endpoint_info.endpoint_id, description); 243 + self.notify(PeerEvent::Discovery(event.clone())); 244 + } 245 + DiscoveryEvent::Expired { endpoint_id } => { 246 + // PairedConnected -> PairedDisconnected 247 + // Discovered -> removed 248 + if let Some(mut old_desc) = self.endpoints.remove(endpoint_id) { 249 + if old_desc.status == EndpointStatus::PairedConnected { 250 + old_desc.status = EndpointStatus::PairedDisconnected; 251 + self.endpoints.insert(*endpoint_id, old_desc); 252 + } else if old_desc.status != EndpointStatus::Discovered { 253 + warn!( 254 + "Unexpected status for expired endpoint: {:?}", 255 + old_desc.status 256 + ); 257 + } 258 + self.notify(PeerEvent::Discovery(event.clone())); 259 + } 260 + } 261 + } 262 + } 263 + }
+442
crates/beaver_p2p/tests/pairing.rs
··· 1 + use iroh::{EndpointId, address_lookup::DiscoveryEvent}; 2 + use p2p_beaver::{EndpointStatus, MessageError, 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 secret = iroh_persist::KeyRetriever::new("test") 13 + .lenient() 14 + .get() 15 + .await; 16 + let manager = PairingManager::create(sender, name, secret).await; 17 + (manager, receiver) 18 + } 19 + 20 + // Helper: wait for 2 managers to have discovered each other. 21 + // Returns the endpoints discovered by each receiver. 22 + fn wait_for_discovery( 23 + receiver1: Arc<Mutex<PairingReceiver>>, 24 + receiver2: Arc<Mutex<PairingReceiver>>, 25 + ) -> (EndpointId, EndpointId) { 26 + let handle1 = std::thread::spawn(move || { 27 + loop { 28 + match receiver1.lock().recv() { 29 + Ok(event) => match event { 30 + PeerEvent::Discovery(DiscoveryEvent::Discovered { endpoint_info, .. }) => { 31 + return endpoint_info.endpoint_id; 32 + } 33 + _ => {} 34 + }, 35 + Err(err) => { 36 + panic!("Should not error! {err:?}"); 37 + } 38 + } 39 + } 40 + }); 41 + 42 + let handle2 = std::thread::spawn(move || { 43 + loop { 44 + match receiver2.lock().recv() { 45 + Ok(event) => match event { 46 + PeerEvent::Discovery(DiscoveryEvent::Discovered { endpoint_info, .. }) => { 47 + return endpoint_info.endpoint_id; 48 + } 49 + _ => {} 50 + }, 51 + Err(err) => { 52 + panic!("Should not error! {err:?}"); 53 + } 54 + } 55 + } 56 + }); 57 + 58 + let endpoint1 = handle1.join().unwrap(); 59 + let endpoint2 = handle2.join().unwrap(); 60 + 61 + (endpoint1, endpoint2) 62 + } 63 + 64 + // Easier assert for PairingError 65 + macro_rules! assert_pairing { 66 + ($observed:expr, $expected:pat) => { 67 + match $observed.err().unwrap() { 68 + $expected => {} 69 + _ => panic!("expected: {{$expected}} but got {{$observed}}"), 70 + } 71 + }; 72 + } 73 + 74 + // Discover and stop. 75 + #[tokio::test(flavor = "multi_thread")] 76 + async fn discover_and_shutdown() { 77 + let (mut manager1, receiver1) = create_manager("test-1").await; 78 + let (mut manager2, receiver2) = create_manager("test-2").await; 79 + 80 + let handle1 = std::thread::spawn(move || { 81 + loop { 82 + match receiver1.recv() { 83 + Ok(event) => match event { 84 + PeerEvent::Discovery(DiscoveryEvent::Discovered { endpoint_info, .. }) => { 85 + let endpoint_name = format!("{}", endpoint_info.user_data().unwrap()); 86 + assert_eq!(endpoint_name, "test-2"); 87 + break; 88 + } 89 + _ => {} 90 + }, 91 + Err(_err) => { 92 + break; 93 + } 94 + } 95 + } 96 + }); 97 + 98 + let handle2 = std::thread::spawn(move || { 99 + loop { 100 + match receiver2.recv() { 101 + Ok(event) => match event { 102 + PeerEvent::Discovery(DiscoveryEvent::Discovered { endpoint_info, .. }) => { 103 + let endpoint_name = format!("{}", endpoint_info.user_data().unwrap()); 104 + assert_eq!(endpoint_name, "test-1"); 105 + break; 106 + } 107 + _ => {} 108 + }, 109 + Err(_err) => { 110 + break; 111 + } 112 + } 113 + } 114 + }); 115 + 116 + let _ = handle1.join(); 117 + let _ = handle2.join(); 118 + 119 + manager1.stop().await; 120 + manager2.stop().await; 121 + } 122 + 123 + // Discover, and wait for second peer to disappear 124 + #[tokio::test(flavor = "multi_thread")] 125 + async fn discover_and_expire() { 126 + env_logger::init(); 127 + 128 + let (mut manager1, receiver1) = create_manager("test-1").await; 129 + let (mut manager2, receiver2) = create_manager("test-2").await; 130 + 131 + let receiver1 = Arc::new(Mutex::new(receiver1)); 132 + let receiver2 = Arc::new(Mutex::new(receiver2)); 133 + 134 + let (_endpoint1, endpoint2) = 135 + wait_for_discovery(Arc::clone(&receiver1), Arc::clone(&receiver2)); 136 + 137 + let handle1 = std::thread::spawn(move || { 138 + loop { 139 + match receiver1.lock().recv() { 140 + Ok(event) => { 141 + println!("mgr1 event: {event:?}"); 142 + match event { 143 + PeerEvent::Discovery(DiscoveryEvent::Discovered { 144 + endpoint_info, .. 145 + }) => { 146 + let endpoint_name = format!("{}", endpoint_info.user_data().unwrap()); 147 + assert_eq!(endpoint_name, "test-2"); 148 + } 149 + PeerEvent::Discovery(DiscoveryEvent::Expired { endpoint_id }) => { 150 + assert_eq!(endpoint_id, endpoint2); 151 + break; 152 + } 153 + _ => {} 154 + } 155 + } 156 + Err(_err) => { 157 + break; 158 + } 159 + } 160 + } 161 + }); 162 + 163 + assert_eq!(manager2.peers().await.len(), 1); 164 + assert_eq!(manager1.peers().await.len(), 1); 165 + manager2.stop().await; 166 + 167 + let _ = handle1.join(); 168 + assert_eq!(manager1.peers().await.len(), 0); 169 + manager1.stop().await; 170 + } 171 + 172 + // Peer1 requests pairing, peer2 rejects it. 173 + #[tokio::test(flavor = "multi_thread")] 174 + async fn reject_pairing() { 175 + env_logger::init(); 176 + 177 + let (mut manager1, receiver1) = create_manager("test-1").await; 178 + let (mut manager2, receiver2) = create_manager("test-2").await; 179 + 180 + let receiver1 = Arc::new(Mutex::new(receiver1)); 181 + let receiver2 = Arc::new(Mutex::new(receiver2)); 182 + 183 + let (endpoint1, endpoint2) = wait_for_discovery(Arc::clone(&receiver1), Arc::clone(&receiver2)); 184 + 185 + let handle1 = std::thread::spawn(move || { 186 + loop { 187 + match receiver1.lock().recv() { 188 + Ok(event) => { 189 + println!("mgr1 event: {event:?}"); 190 + match event { 191 + PeerEvent::PairingRejected(endpoint) => { 192 + assert_eq!(endpoint, endpoint1); 193 + break; 194 + } 195 + _ => {} 196 + } 197 + } 198 + Err(_err) => { 199 + break; 200 + } 201 + } 202 + } 203 + }); 204 + 205 + let mgr = manager2.clone(); 206 + let handle2 = std::thread::spawn(move || { 207 + loop { 208 + let rt = tokio::runtime::Builder::new_current_thread() 209 + .enable_all() 210 + .build() 211 + .unwrap(); 212 + 213 + match receiver2.lock().recv() { 214 + Ok(event) => { 215 + println!("mgr2 event: {event:?}"); 216 + let mgr = mgr.clone(); 217 + match event { 218 + PeerEvent::PairingRequest(endpoint) => { 219 + assert_eq!(endpoint, endpoint2); 220 + rt.block_on(async { 221 + mgr.reject_pairing(&endpoint) 222 + .await 223 + .expect("failed to reject pairing"); 224 + }); 225 + } 226 + PeerEvent::PairingRejected(endpoint) => { 227 + assert_eq!(endpoint, endpoint2); 228 + break; 229 + } 230 + _ => {} 231 + } 232 + } 233 + Err(_err) => { 234 + break; 235 + } 236 + } 237 + } 238 + }); 239 + 240 + let response = manager1.request_pairing(&endpoint1).await; 241 + assert_pairing!(response, PairingError::Rejected); 242 + 243 + let _ = handle1.join(); 244 + let _ = handle2.join(); 245 + 246 + manager1.stop().await; 247 + manager2.stop().await; 248 + } 249 + 250 + // Peer1 requests pairing, peer2 accepts it. 251 + #[tokio::test(flavor = "multi_thread")] 252 + async fn accept_pairing() { 253 + env_logger::init(); 254 + 255 + let (mut manager1, receiver1) = create_manager("test-1").await; 256 + let (mut manager2, receiver2) = create_manager("test-2").await; 257 + 258 + let receiver1 = Arc::new(Mutex::new(receiver1)); 259 + let receiver2 = Arc::new(Mutex::new(receiver2)); 260 + 261 + let (endpoint1, endpoint2) = wait_for_discovery(Arc::clone(&receiver1), Arc::clone(&receiver2)); 262 + 263 + println!("Discovery done"); 264 + 265 + let handle1 = std::thread::spawn(move || { 266 + loop { 267 + match receiver1.lock().recv() { 268 + Ok(event) => { 269 + println!("mgr1 event: {event:?}"); 270 + match event { 271 + PeerEvent::PairingAccepted(endpoint) => { 272 + assert_eq!(endpoint, endpoint1); 273 + break; 274 + } 275 + _ => {} 276 + } 277 + } 278 + Err(_err) => { 279 + break; 280 + } 281 + } 282 + } 283 + }); 284 + 285 + let mgr = manager2.clone(); 286 + let handle2 = std::thread::spawn(move || { 287 + loop { 288 + let rt = tokio::runtime::Builder::new_current_thread() 289 + .enable_all() 290 + .build() 291 + .unwrap(); 292 + 293 + match receiver2.lock().recv() { 294 + Ok(event) => { 295 + println!("mgr2 event: {event:?}"); 296 + let mgr = mgr.clone(); 297 + match event { 298 + PeerEvent::PairingRequest(endpoint) => { 299 + assert_eq!(endpoint, endpoint2); 300 + rt.block_on(async { 301 + mgr.accept_pairing(&endpoint) 302 + .await 303 + .expect("failed to accept pairing"); 304 + }); 305 + } 306 + PeerEvent::PairingAccepted(endpoint) => { 307 + assert_eq!(endpoint, endpoint2); 308 + break; 309 + } 310 + _ => {} 311 + } 312 + } 313 + Err(_err) => { 314 + break; 315 + } 316 + } 317 + } 318 + }); 319 + 320 + let response = manager1.request_pairing(&endpoint1).await; 321 + assert!(response.is_ok()); 322 + 323 + let _ = handle1.join(); 324 + let _ = handle2.join(); 325 + 326 + assert_eq!(manager1.peers().await.len(), 1); 327 + assert_eq!(manager2.peers().await.len(), 1); 328 + 329 + manager1.stop().await; 330 + manager2.stop().await; 331 + } 332 + 333 + // Try to send a message to an unpaired peer 334 + #[tokio::test(flavor = "multi_thread")] 335 + async fn message_to_unpaired() { 336 + env_logger::init(); 337 + 338 + let (mut manager1, receiver1) = create_manager("test-1").await; 339 + let (mut manager2, receiver2) = create_manager("test-2").await; 340 + 341 + let receiver1 = Arc::new(Mutex::new(receiver1)); 342 + let receiver2 = Arc::new(Mutex::new(receiver2)); 343 + 344 + let (endpoint1, _endpoint2) = 345 + wait_for_discovery(Arc::clone(&receiver1), Arc::clone(&receiver2)); 346 + 347 + println!("Discovery done"); 348 + 349 + let result = manager1.send_message(&endpoint1, b"Hello").await; 350 + assert!(result.is_err()); 351 + match result { 352 + Err(MessageError::Unpaired) => {} 353 + _ => panic!("Unexpected error: {result:?}"), 354 + } 355 + 356 + manager1.stop().await; 357 + manager2.stop().await; 358 + } 359 + 360 + // Exchange messages 361 + #[tokio::test(flavor = "multi_thread")] 362 + async fn message_to_paired() { 363 + env_logger::init(); 364 + 365 + let (mut manager1, receiver1) = create_manager("test-1").await; 366 + let (mut manager2, receiver2) = create_manager("test-2").await; 367 + 368 + let receiver1 = Arc::new(Mutex::new(receiver1)); 369 + let receiver2 = Arc::new(Mutex::new(receiver2)); 370 + 371 + let (endpoint1, endpoint2) = wait_for_discovery(Arc::clone(&receiver1), Arc::clone(&receiver2)); 372 + 373 + println!("Discovery done"); 374 + 375 + manager1 376 + .set_status(&endpoint1, EndpointStatus::PairedConnected) 377 + .await; 378 + manager2 379 + .set_status(&endpoint2, EndpointStatus::PairedConnected) 380 + .await; 381 + 382 + let handle1 = std::thread::spawn(move || { 383 + loop { 384 + match receiver1.lock().recv() { 385 + Ok(event) => { 386 + println!("mgr1 event: {event:?}"); 387 + match event { 388 + PeerEvent::Message(endpoint, data) => { 389 + assert_eq!(endpoint, endpoint1); 390 + assert_eq!(data, b"World"); 391 + break; 392 + } 393 + _ => {} 394 + } 395 + } 396 + Err(_err) => { 397 + break; 398 + } 399 + } 400 + } 401 + }); 402 + 403 + let mgr = manager2.clone(); 404 + let handle2 = std::thread::spawn(move || { 405 + loop { 406 + let rt = tokio::runtime::Builder::new_current_thread() 407 + .enable_all() 408 + .build() 409 + .unwrap(); 410 + 411 + match receiver2.lock().recv() { 412 + Ok(event) => { 413 + println!("mgr2 event: {event:?}"); 414 + match event { 415 + PeerEvent::Message(endpoint, data) => { 416 + assert_eq!(endpoint, endpoint2); 417 + assert_eq!(data, b"Hello"); 418 + 419 + rt.block_on(async { 420 + mgr.send_message(&endpoint2, b"World").await.unwrap(); 421 + }); 422 + 423 + break; 424 + } 425 + _ => {} 426 + } 427 + } 428 + Err(_err) => { 429 + break; 430 + } 431 + } 432 + } 433 + }); 434 + 435 + manager1.send_message(&endpoint1, b"Hello").await.unwrap(); 436 + 437 + let _ = handle2.join(); 438 + let _ = handle1.join(); 439 + 440 + manager1.stop().await; 441 + manager2.stop().await; 442 + }