QuickDID is a high-performance AT Protocol identity resolution service written in Rust. It provides handle-to-DID resolution with Redis-backed caching and queue processing.

feature: lexicon resolution

+503 -514
Cargo.lock
··· 3 version = 4 4 5 [[package]] 6 - name = "addr2line" 7 - version = "0.24.2" 8 - source = "registry+https://github.com/rust-lang/crates.io-index" 9 - checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 - dependencies = [ 11 - "gimli", 12 - ] 13 - 14 - [[package]] 15 - name = "adler2" 16 - version = "2.0.1" 17 - source = "registry+https://github.com/rust-lang/crates.io-index" 18 - checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 - 20 - [[package]] 21 name = "aho-corasick" 22 - version = "1.1.3" 23 source = "registry+https://github.com/rust-lang/crates.io-index" 24 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 dependencies = [ 26 "memchr", 27 ] ··· 34 35 [[package]] 36 name = "anyhow" 37 - version = "1.0.99" 38 source = "registry+https://github.com/rust-lang/crates.io-index" 39 - checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" 40 41 [[package]] 42 name = "arc-swap" ··· 52 dependencies = [ 53 "proc-macro2", 54 "quote", 55 - "syn", 56 ] 57 58 [[package]] ··· 71 checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 72 73 [[package]] 74 name = "atproto-identity" 75 - version = "0.11.3" 76 - source = "registry+https://github.com/rust-lang/crates.io-index" 77 - checksum = "aaac8751c7e4329a95714c01d9e47d22d94bc8c96e78079098312235128acb9f" 78 dependencies = [ 79 "anyhow", 80 "async-trait", ··· 91 "serde", 92 "serde_ipld_dagcbor", 93 "serde_json", 94 - "thiserror 2.0.16", 95 "tokio", 96 "tracing", 97 ] 98 99 [[package]] 100 name = "atproto-jetstream" 101 - version = "0.11.3" 102 - source = "registry+https://github.com/rust-lang/crates.io-index" 103 - checksum = "9e55d1140fcf5c6be0c03e7db773c6a9258986340118015d9bb536bf22689de2" 104 dependencies = [ 105 "anyhow", 106 "async-trait", ··· 109 "http", 110 "serde", 111 "serde_json", 112 - "thiserror 2.0.16", 113 "tokio", 114 "tokio-util", 115 "tokio-websockets", ··· 120 ] 121 122 [[package]] 123 name = "autocfg" 124 version = "1.5.0" 125 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 127 128 [[package]] 129 name = "axum" 130 - version = "0.8.4" 131 source = "registry+https://github.com/rust-lang/crates.io-index" 132 - checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" 133 dependencies = [ 134 "axum-core", 135 "bytes", ··· 146 "mime", 147 "percent-encoding", 148 "pin-project-lite", 149 - "rustversion", 150 - "serde", 151 "serde_json", 152 "serde_path_to_error", 153 "serde_urlencoded", ··· 161 162 [[package]] 163 name = "axum-core" 164 - version = "0.5.2" 165 source = "registry+https://github.com/rust-lang/crates.io-index" 166 - checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" 167 dependencies = [ 168 "bytes", 169 "futures-core", ··· 172 "http-body-util", 173 "mime", 174 "pin-project-lite", 175 - "rustversion", 176 "sync_wrapper", 177 "tower-layer", 178 "tower-service", ··· 181 182 [[package]] 183 name = "backon" 184 - version = "1.5.2" 185 source = "registry+https://github.com/rust-lang/crates.io-index" 186 - checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" 187 dependencies = [ 188 "fastrand", 189 ] 190 191 [[package]] 192 - name = "backtrace" 193 - version = "0.3.75" 194 - source = "registry+https://github.com/rust-lang/crates.io-index" 195 - checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 196 - dependencies = [ 197 - "addr2line", 198 - "cfg-if", 199 - "libc", 200 - "miniz_oxide", 201 - "object", 202 - "rustc-demangle", 203 - "windows-targets 0.52.6", 204 - ] 205 - 206 - [[package]] 207 name = "base-x" 208 version = "0.2.11" 209 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 214 version = "0.2.0" 215 source = "registry+https://github.com/rust-lang/crates.io-index" 216 checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 217 218 [[package]] 219 name = "base64" ··· 249 250 [[package]] 251 name = "bitflags" 252 - version = "2.9.4" 253 source = "registry+https://github.com/rust-lang/crates.io-index" 254 - checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 255 dependencies = [ 256 - "serde", 257 ] 258 259 [[package]] ··· 303 304 [[package]] 305 name = "cc" 306 - version = "1.2.36" 307 source = "registry+https://github.com/rust-lang/crates.io-index" 308 - checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" 309 dependencies = [ 310 "find-msvc-tools", 311 "jobserver", ··· 315 316 [[package]] 317 name = "cfg-if" 318 - version = "1.0.3" 319 source = "registry+https://github.com/rust-lang/crates.io-index" 320 - checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 321 322 [[package]] 323 name = "cfg_aliases" ··· 326 checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 327 328 [[package]] 329 name = "cid" 330 version = "0.11.1" 331 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 369 checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 370 371 [[package]] 372 name = "core-foundation" 373 version = "0.9.4" 374 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 511 checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" 512 dependencies = [ 513 "data-encoding", 514 - "syn", 515 ] 516 517 [[package]] ··· 576 dependencies = [ 577 "proc-macro2", 578 "quote", 579 - "syn", 580 ] 581 582 [[package]] ··· 595 "digest", 596 "elliptic-curve", 597 "rfc6979", 598 "signature", 599 "spki", 600 ] ··· 650 "heck", 651 "proc-macro2", 652 "quote", 653 - "syn", 654 ] 655 656 [[package]] ··· 661 662 [[package]] 663 name = "errno" 664 - version = "0.3.13" 665 source = "registry+https://github.com/rust-lang/crates.io-index" 666 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 667 dependencies = [ 668 "libc", 669 - "windows-sys 0.60.2", 670 ] 671 672 [[package]] ··· 709 710 [[package]] 711 name = "find-msvc-tools" 712 - version = "0.1.1" 713 source = "registry+https://github.com/rust-lang/crates.io-index" 714 - checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" 715 716 [[package]] 717 name = "flume" ··· 827 dependencies = [ 828 "proc-macro2", 829 "quote", 830 - "syn", 831 ] 832 833 [[package]] ··· 861 ] 862 863 [[package]] 864 - name = "generator" 865 - version = "0.8.7" 866 - source = "registry+https://github.com/rust-lang/crates.io-index" 867 - checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" 868 - dependencies = [ 869 - "cc", 870 - "cfg-if", 871 - "libc", 872 - "log", 873 - "rustversion", 874 - "windows", 875 - ] 876 - 877 - [[package]] 878 name = "generic-array" 879 - version = "0.14.7" 880 source = "registry+https://github.com/rust-lang/crates.io-index" 881 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 882 dependencies = [ 883 "typenum", 884 "version_check", ··· 894 "cfg-if", 895 "js-sys", 896 "libc", 897 - "wasi 0.11.1+wasi-snapshot-preview1", 898 "wasm-bindgen", 899 ] 900 901 [[package]] 902 name = "getrandom" 903 - version = "0.3.3" 904 source = "registry+https://github.com/rust-lang/crates.io-index" 905 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 906 dependencies = [ 907 "cfg-if", 908 "js-sys", 909 "libc", 910 "r-efi", 911 - "wasi 0.14.3+wasi-0.2.4", 912 "wasm-bindgen", 913 ] 914 - 915 - [[package]] 916 - name = "gimli" 917 - version = "0.31.1" 918 - source = "registry+https://github.com/rust-lang/crates.io-index" 919 - checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 920 921 [[package]] 922 name = "group" ··· 960 ] 961 962 [[package]] 963 name = "hashlink" 964 version = "0.10.0" 965 source = "registry+https://github.com/rust-lang/crates.io-index" 966 checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 967 dependencies = [ 968 - "hashbrown", 969 ] 970 971 [[package]] ··· 1004 "once_cell", 1005 "rand 0.9.2", 1006 "ring", 1007 - "thiserror 2.0.16", 1008 "tinyvec", 1009 "tokio", 1010 "tracing", ··· 1027 "rand 0.9.2", 1028 "resolv-conf", 1029 "smallvec", 1030 - "thiserror 2.0.16", 1031 "tokio", 1032 "tracing", 1033 ] ··· 1052 1053 [[package]] 1054 name = "home" 1055 - version = "0.5.11" 1056 source = "registry+https://github.com/rust-lang/crates.io-index" 1057 - checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 1058 dependencies = [ 1059 - "windows-sys 0.59.0", 1060 ] 1061 1062 [[package]] ··· 1169 1170 [[package]] 1171 name = "hyper-util" 1172 - version = "0.1.16" 1173 source = "registry+https://github.com/rust-lang/crates.io-index" 1174 - checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 1175 dependencies = [ 1176 "base64", 1177 "bytes", ··· 1185 "libc", 1186 "percent-encoding", 1187 "pin-project-lite", 1188 - "socket2 0.6.0", 1189 "system-configuration", 1190 "tokio", 1191 "tower-service", ··· 1195 1196 [[package]] 1197 name = "icu_collections" 1198 - version = "2.0.0" 1199 source = "registry+https://github.com/rust-lang/crates.io-index" 1200 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1201 dependencies = [ 1202 "displaydoc", 1203 "potential_utf", ··· 1208 1209 [[package]] 1210 name = "icu_locale_core" 1211 - version = "2.0.0" 1212 source = "registry+https://github.com/rust-lang/crates.io-index" 1213 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1214 dependencies = [ 1215 "displaydoc", 1216 "litemap", ··· 1221 1222 [[package]] 1223 name = "icu_normalizer" 1224 - version = "2.0.0" 1225 source = "registry+https://github.com/rust-lang/crates.io-index" 1226 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1227 dependencies = [ 1228 - "displaydoc", 1229 "icu_collections", 1230 "icu_normalizer_data", 1231 "icu_properties", ··· 1236 1237 [[package]] 1238 name = "icu_normalizer_data" 1239 - version = "2.0.0" 1240 source = "registry+https://github.com/rust-lang/crates.io-index" 1241 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1242 1243 [[package]] 1244 name = "icu_properties" 1245 - version = "2.0.1" 1246 source = "registry+https://github.com/rust-lang/crates.io-index" 1247 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1248 dependencies = [ 1249 - "displaydoc", 1250 "icu_collections", 1251 "icu_locale_core", 1252 "icu_properties_data", 1253 "icu_provider", 1254 - "potential_utf", 1255 "zerotrie", 1256 "zerovec", 1257 ] 1258 1259 [[package]] 1260 name = "icu_properties_data" 1261 - version = "2.0.1" 1262 source = "registry+https://github.com/rust-lang/crates.io-index" 1263 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1264 1265 [[package]] 1266 name = "icu_provider" 1267 - version = "2.0.0" 1268 source = "registry+https://github.com/rust-lang/crates.io-index" 1269 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1270 dependencies = [ 1271 "displaydoc", 1272 "icu_locale_core", 1273 - "stable_deref_trait", 1274 - "tinystr", 1275 "writeable", 1276 "yoke", 1277 "zerofrom", ··· 1302 1303 [[package]] 1304 name = "indexmap" 1305 - version = "2.11.0" 1306 source = "registry+https://github.com/rust-lang/crates.io-index" 1307 - checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" 1308 dependencies = [ 1309 "equivalent", 1310 - "hashbrown", 1311 - ] 1312 - 1313 - [[package]] 1314 - name = "io-uring" 1315 - version = "0.7.10" 1316 - source = "registry+https://github.com/rust-lang/crates.io-index" 1317 - checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 1318 - dependencies = [ 1319 - "bitflags", 1320 - "cfg-if", 1321 - "libc", 1322 ] 1323 1324 [[package]] ··· 1372 source = "registry+https://github.com/rust-lang/crates.io-index" 1373 checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 1374 dependencies = [ 1375 - "getrandom 0.3.3", 1376 "libc", 1377 ] 1378 1379 [[package]] 1380 name = "js-sys" 1381 - version = "0.3.78" 1382 source = "registry+https://github.com/rust-lang/crates.io-index" 1383 - checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" 1384 dependencies = [ 1385 "once_cell", 1386 "wasm-bindgen", ··· 1411 1412 [[package]] 1413 name = "libc" 1414 - version = "0.2.175" 1415 source = "registry+https://github.com/rust-lang/crates.io-index" 1416 - checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 1417 1418 [[package]] 1419 name = "libm" ··· 1423 1424 [[package]] 1425 name = "libredox" 1426 - version = "0.1.9" 1427 source = "registry+https://github.com/rust-lang/crates.io-index" 1428 - checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" 1429 dependencies = [ 1430 "bitflags", 1431 "libc", ··· 1445 1446 [[package]] 1447 name = "linux-raw-sys" 1448 - version = "0.9.4" 1449 source = "registry+https://github.com/rust-lang/crates.io-index" 1450 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 1451 1452 [[package]] 1453 name = "litemap" 1454 - version = "0.8.0" 1455 source = "registry+https://github.com/rust-lang/crates.io-index" 1456 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1457 1458 [[package]] 1459 name = "lock_api" 1460 - version = "0.4.13" 1461 source = "registry+https://github.com/rust-lang/crates.io-index" 1462 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 1463 dependencies = [ 1464 - "autocfg", 1465 "scopeguard", 1466 ] 1467 ··· 1470 version = "0.4.28" 1471 source = "registry+https://github.com/rust-lang/crates.io-index" 1472 checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 1473 - 1474 - [[package]] 1475 - name = "loom" 1476 - version = "0.7.2" 1477 - source = "registry+https://github.com/rust-lang/crates.io-index" 1478 - checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" 1479 - dependencies = [ 1480 - "cfg-if", 1481 - "generator", 1482 - "scoped-tls", 1483 - "tracing", 1484 - "tracing-subscriber", 1485 - ] 1486 1487 [[package]] 1488 name = "lru" ··· 1490 source = "registry+https://github.com/rust-lang/crates.io-index" 1491 checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 1492 dependencies = [ 1493 - "hashbrown", 1494 ] 1495 1496 [[package]] ··· 1498 version = "0.1.2" 1499 source = "registry+https://github.com/rust-lang/crates.io-index" 1500 checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 1501 1502 [[package]] 1503 name = "matchers" ··· 1526 1527 [[package]] 1528 name = "memchr" 1529 - version = "2.7.5" 1530 source = "registry+https://github.com/rust-lang/crates.io-index" 1531 - checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 1532 1533 [[package]] 1534 name = "metrohash" ··· 1553 ] 1554 1555 [[package]] 1556 - name = "miniz_oxide" 1557 - version = "0.8.9" 1558 - source = "registry+https://github.com/rust-lang/crates.io-index" 1559 - checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 1560 - dependencies = [ 1561 - "adler2", 1562 - ] 1563 - 1564 - [[package]] 1565 name = "mio" 1566 - version = "1.0.4" 1567 source = "registry+https://github.com/rust-lang/crates.io-index" 1568 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 1569 dependencies = [ 1570 "libc", 1571 - "wasi 0.11.1+wasi-snapshot-preview1", 1572 - "windows-sys 0.59.0", 1573 ] 1574 1575 [[package]] 1576 name = "moka" 1577 - version = "0.12.10" 1578 source = "registry+https://github.com/rust-lang/crates.io-index" 1579 - checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" 1580 dependencies = [ 1581 "crossbeam-channel", 1582 "crossbeam-epoch", 1583 "crossbeam-utils", 1584 - "loom", 1585 "parking_lot", 1586 "portable-atomic", 1587 "rustc_version", 1588 "smallvec", 1589 "tagptr", 1590 - "thiserror 1.0.69", 1591 "uuid", 1592 ] 1593 1594 [[package]] 1595 name = "multibase" 1596 - version = "0.9.1" 1597 source = "registry+https://github.com/rust-lang/crates.io-index" 1598 - checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" 1599 dependencies = [ 1600 "base-x", 1601 "data-encoding", 1602 "data-encoding-macro", 1603 ] ··· 1632 1633 [[package]] 1634 name = "nu-ansi-term" 1635 - version = "0.50.1" 1636 source = "registry+https://github.com/rust-lang/crates.io-index" 1637 - checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" 1638 dependencies = [ 1639 - "windows-sys 0.52.0", 1640 ] 1641 1642 [[package]] ··· 1651 1652 [[package]] 1653 name = "num-bigint-dig" 1654 - version = "0.8.4" 1655 source = "registry+https://github.com/rust-lang/crates.io-index" 1656 - checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1657 dependencies = [ 1658 - "byteorder", 1659 "lazy_static", 1660 "libm", 1661 "num-integer", ··· 1707 ] 1708 1709 [[package]] 1710 - name = "object" 1711 - version = "0.36.7" 1712 - source = "registry+https://github.com/rust-lang/crates.io-index" 1713 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1714 - dependencies = [ 1715 - "memchr", 1716 - ] 1717 - 1718 - [[package]] 1719 name = "once_cell" 1720 version = "1.21.3" 1721 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1727 1728 [[package]] 1729 name = "openssl" 1730 - version = "0.10.73" 1731 source = "registry+https://github.com/rust-lang/crates.io-index" 1732 - checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 1733 dependencies = [ 1734 "bitflags", 1735 "cfg-if", ··· 1748 dependencies = [ 1749 "proc-macro2", 1750 "quote", 1751 - "syn", 1752 ] 1753 1754 [[package]] ··· 1759 1760 [[package]] 1761 name = "openssl-sys" 1762 - version = "0.9.109" 1763 source = "registry+https://github.com/rust-lang/crates.io-index" 1764 - checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 1765 dependencies = [ 1766 "cc", 1767 "libc", ··· 1778 "ecdsa", 1779 "elliptic-curve", 1780 "primeorder", 1781 "sha2", 1782 ] 1783 ··· 1790 "ecdsa", 1791 "elliptic-curve", 1792 "primeorder", 1793 "sha2", 1794 ] 1795 ··· 1801 1802 [[package]] 1803 name = "parking_lot" 1804 - version = "0.12.4" 1805 source = "registry+https://github.com/rust-lang/crates.io-index" 1806 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 1807 dependencies = [ 1808 "lock_api", 1809 "parking_lot_core", ··· 1811 1812 [[package]] 1813 name = "parking_lot_core" 1814 - version = "0.9.11" 1815 source = "registry+https://github.com/rust-lang/crates.io-index" 1816 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 1817 dependencies = [ 1818 "cfg-if", 1819 "libc", 1820 "redox_syscall", 1821 "smallvec", 1822 - "windows-targets 0.52.6", 1823 ] 1824 1825 [[package]] ··· 1884 1885 [[package]] 1886 name = "potential_utf" 1887 - version = "0.1.3" 1888 source = "registry+https://github.com/rust-lang/crates.io-index" 1889 - checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" 1890 dependencies = [ 1891 "zerovec", 1892 ] ··· 1907 checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" 1908 dependencies = [ 1909 "elliptic-curve", 1910 ] 1911 1912 [[package]] 1913 name = "proc-macro2" 1914 - version = "1.0.101" 1915 source = "registry+https://github.com/rust-lang/crates.io-index" 1916 - checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 1917 dependencies = [ 1918 "unicode-ident", 1919 ] ··· 1926 "async-trait", 1927 "atproto-identity", 1928 "atproto-jetstream", 1929 "axum", 1930 "bincode", 1931 "cadence", ··· 1937 "serde", 1938 "serde_json", 1939 "sqlx", 1940 - "thiserror 2.0.16", 1941 "tokio", 1942 "tokio-util", 1943 "tower-http", ··· 1958 "quinn-udp", 1959 "rustc-hash", 1960 "rustls", 1961 - "socket2 0.6.0", 1962 - "thiserror 2.0.16", 1963 "tokio", 1964 "tracing", 1965 "web-time", ··· 1972 checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 1973 dependencies = [ 1974 "bytes", 1975 - "getrandom 0.3.3", 1976 "lru-slab", 1977 "rand 0.9.2", 1978 "ring", ··· 1980 "rustls", 1981 "rustls-pki-types", 1982 "slab", 1983 - "thiserror 2.0.16", 1984 "tinyvec", 1985 "tracing", 1986 "web-time", ··· 1995 "cfg_aliases", 1996 "libc", 1997 "once_cell", 1998 - "socket2 0.6.0", 1999 "tracing", 2000 "windows-sys 0.60.2", 2001 ] 2002 2003 [[package]] 2004 name = "quote" 2005 - version = "1.0.40" 2006 source = "registry+https://github.com/rust-lang/crates.io-index" 2007 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 2008 dependencies = [ 2009 "proc-macro2", 2010 ] ··· 2071 source = "registry+https://github.com/rust-lang/crates.io-index" 2072 checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 2073 dependencies = [ 2074 - "getrandom 0.3.3", 2075 ] 2076 2077 [[package]] 2078 name = "redis" 2079 - version = "0.32.5" 2080 source = "registry+https://github.com/rust-lang/crates.io-index" 2081 - checksum = "7cd3650deebc68526b304898b192fa4102a4ef0b9ada24da096559cb60e0eef8" 2082 dependencies = [ 2083 "arc-swap", 2084 "backon", ··· 2094 "rustls", 2095 "rustls-native-certs", 2096 "ryu", 2097 - "socket2 0.6.0", 2098 "tokio", 2099 "tokio-rustls", 2100 "tokio-util", ··· 2103 2104 [[package]] 2105 name = "redox_syscall" 2106 - version = "0.5.17" 2107 source = "registry+https://github.com/rust-lang/crates.io-index" 2108 - checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 2109 dependencies = [ 2110 "bitflags", 2111 ] 2112 2113 [[package]] 2114 name = "regex-automata" 2115 - version = "0.4.10" 2116 source = "registry+https://github.com/rust-lang/crates.io-index" 2117 - checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" 2118 dependencies = [ 2119 "aho-corasick", 2120 "memchr", ··· 2123 2124 [[package]] 2125 name = "regex-syntax" 2126 - version = "0.8.6" 2127 source = "registry+https://github.com/rust-lang/crates.io-index" 2128 - checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" 2129 2130 [[package]] 2131 name = "reqwest" 2132 - version = "0.12.23" 2133 source = "registry+https://github.com/rust-lang/crates.io-index" 2134 - checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" 2135 dependencies = [ 2136 "base64", 2137 "bytes", 2138 "encoding_rs", 2139 "futures-core", 2140 "h2", 2141 "http", 2142 "http-body", ··· 2148 "js-sys", 2149 "log", 2150 "mime", 2151 "native-tls", 2152 "percent-encoding", 2153 "pin-project-lite", ··· 2172 ] 2173 2174 [[package]] 2175 name = "resolv-conf" 2176 - version = "0.7.4" 2177 source = "registry+https://github.com/rust-lang/crates.io-index" 2178 - checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" 2179 2180 [[package]] 2181 name = "rfc6979" ··· 2222 ] 2223 2224 [[package]] 2225 - name = "rustc-demangle" 2226 - version = "0.1.26" 2227 - source = "registry+https://github.com/rust-lang/crates.io-index" 2228 - checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 2229 - 2230 - [[package]] 2231 name = "rustc-hash" 2232 version = "2.1.1" 2233 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2244 2245 [[package]] 2246 name = "rustix" 2247 - version = "1.0.8" 2248 source = "registry+https://github.com/rust-lang/crates.io-index" 2249 - checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 2250 dependencies = [ 2251 "bitflags", 2252 "errno", 2253 "libc", 2254 "linux-raw-sys", 2255 - "windows-sys 0.60.2", 2256 ] 2257 2258 [[package]] 2259 name = "rustls" 2260 - version = "0.23.31" 2261 source = "registry+https://github.com/rust-lang/crates.io-index" 2262 - checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" 2263 dependencies = [ 2264 "once_cell", 2265 "ring", ··· 2271 2272 [[package]] 2273 name = "rustls-native-certs" 2274 - version = "0.8.1" 2275 source = "registry+https://github.com/rust-lang/crates.io-index" 2276 - checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" 2277 dependencies = [ 2278 "openssl-probe", 2279 "rustls-pki-types", 2280 "schannel", 2281 - "security-framework 3.3.0", 2282 ] 2283 2284 [[package]] 2285 name = "rustls-pki-types" 2286 - version = "1.12.0" 2287 source = "registry+https://github.com/rust-lang/crates.io-index" 2288 - checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 2289 dependencies = [ 2290 "web-time", 2291 "zeroize", ··· 2293 2294 [[package]] 2295 name = "rustls-webpki" 2296 - version = "0.103.4" 2297 source = "registry+https://github.com/rust-lang/crates.io-index" 2298 - checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" 2299 dependencies = [ 2300 "ring", 2301 "rustls-pki-types", ··· 2316 2317 [[package]] 2318 name = "schannel" 2319 - version = "0.1.27" 2320 source = "registry+https://github.com/rust-lang/crates.io-index" 2321 - checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 2322 dependencies = [ 2323 - "windows-sys 0.59.0", 2324 ] 2325 - 2326 - [[package]] 2327 - name = "scoped-tls" 2328 - version = "1.0.1" 2329 - source = "registry+https://github.com/rust-lang/crates.io-index" 2330 - checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2331 2332 [[package]] 2333 name = "scopeguard" ··· 2365 2366 [[package]] 2367 name = "security-framework" 2368 - version = "3.3.0" 2369 source = "registry+https://github.com/rust-lang/crates.io-index" 2370 - checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" 2371 dependencies = [ 2372 "bitflags", 2373 "core-foundation 0.10.1", ··· 2378 2379 [[package]] 2380 name = "security-framework-sys" 2381 - version = "2.14.0" 2382 source = "registry+https://github.com/rust-lang/crates.io-index" 2383 - checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 2384 dependencies = [ 2385 "core-foundation-sys", 2386 "libc", ··· 2388 2389 [[package]] 2390 name = "semver" 2391 - version = "1.0.26" 2392 source = "registry+https://github.com/rust-lang/crates.io-index" 2393 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 2394 2395 [[package]] 2396 name = "serde" 2397 - version = "1.0.219" 2398 source = "registry+https://github.com/rust-lang/crates.io-index" 2399 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 2400 dependencies = [ 2401 "serde_derive", 2402 ] 2403 2404 [[package]] 2405 name = "serde_bytes" 2406 - version = "0.11.17" 2407 source = "registry+https://github.com/rust-lang/crates.io-index" 2408 - checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" 2409 dependencies = [ 2410 "serde", 2411 ] 2412 2413 [[package]] 2414 name = "serde_derive" 2415 - version = "1.0.219" 2416 source = "registry+https://github.com/rust-lang/crates.io-index" 2417 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 2418 dependencies = [ 2419 "proc-macro2", 2420 "quote", 2421 - "syn", 2422 ] 2423 2424 [[package]] 2425 name = "serde_ipld_dagcbor" 2426 - version = "0.6.3" 2427 source = "registry+https://github.com/rust-lang/crates.io-index" 2428 - checksum = "99600723cf53fb000a66175555098db7e75217c415bdd9a16a65d52a19dcc4fc" 2429 dependencies = [ 2430 "cbor4ii", 2431 "ipld-core", ··· 2435 2436 [[package]] 2437 name = "serde_json" 2438 - version = "1.0.143" 2439 source = "registry+https://github.com/rust-lang/crates.io-index" 2440 - checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" 2441 dependencies = [ 2442 "itoa", 2443 "memchr", 2444 "ryu", 2445 "serde", 2446 ] 2447 2448 [[package]] 2449 name = "serde_path_to_error" 2450 - version = "0.1.17" 2451 source = "registry+https://github.com/rust-lang/crates.io-index" 2452 - checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" 2453 dependencies = [ 2454 "itoa", 2455 "serde", 2456 ] 2457 2458 [[package]] ··· 2566 2567 [[package]] 2568 name = "socket2" 2569 - version = "0.6.0" 2570 source = "registry+https://github.com/rust-lang/crates.io-index" 2571 - checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 2572 dependencies = [ 2573 "libc", 2574 - "windows-sys 0.59.0", 2575 ] 2576 2577 [[package]] ··· 2622 "futures-intrusive", 2623 "futures-io", 2624 "futures-util", 2625 - "hashbrown", 2626 "hashlink", 2627 "indexmap", 2628 "log", ··· 2633 "serde_json", 2634 "sha2", 2635 "smallvec", 2636 - "thiserror 2.0.16", 2637 "tokio", 2638 "tokio-stream", 2639 "tracing", ··· 2650 "quote", 2651 "sqlx-core", 2652 "sqlx-macros-core", 2653 - "syn", 2654 ] 2655 2656 [[package]] ··· 2673 "sqlx-mysql", 2674 "sqlx-postgres", 2675 "sqlx-sqlite", 2676 - "syn", 2677 "tokio", 2678 "url", 2679 ] ··· 2715 "smallvec", 2716 "sqlx-core", 2717 "stringprep", 2718 - "thiserror 2.0.16", 2719 "tracing", 2720 "whoami", 2721 ] ··· 2752 "smallvec", 2753 "sqlx-core", 2754 "stringprep", 2755 - "thiserror 2.0.16", 2756 "tracing", 2757 "whoami", 2758 ] ··· 2776 "serde", 2777 "serde_urlencoded", 2778 "sqlx-core", 2779 - "thiserror 2.0.16", 2780 "tracing", 2781 "url", 2782 ] 2783 2784 [[package]] 2785 name = "stable_deref_trait" 2786 - version = "1.2.0" 2787 source = "registry+https://github.com/rust-lang/crates.io-index" 2788 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2789 2790 [[package]] 2791 name = "stringprep" ··· 2806 2807 [[package]] 2808 name = "syn" 2809 - version = "2.0.106" 2810 source = "registry+https://github.com/rust-lang/crates.io-index" 2811 - checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 2812 dependencies = [ 2813 "proc-macro2", 2814 "quote", ··· 2832 dependencies = [ 2833 "proc-macro2", 2834 "quote", 2835 - "syn", 2836 ] 2837 2838 [[package]] ··· 2864 2865 [[package]] 2866 name = "tempfile" 2867 - version = "3.21.0" 2868 source = "registry+https://github.com/rust-lang/crates.io-index" 2869 - checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" 2870 dependencies = [ 2871 "fastrand", 2872 - "getrandom 0.3.3", 2873 "once_cell", 2874 "rustix", 2875 - "windows-sys 0.60.2", 2876 ] 2877 2878 [[package]] ··· 2886 2887 [[package]] 2888 name = "thiserror" 2889 - version = "2.0.16" 2890 source = "registry+https://github.com/rust-lang/crates.io-index" 2891 - checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" 2892 dependencies = [ 2893 - "thiserror-impl 2.0.16", 2894 ] 2895 2896 [[package]] ··· 2901 dependencies = [ 2902 "proc-macro2", 2903 "quote", 2904 - "syn", 2905 ] 2906 2907 [[package]] 2908 name = "thiserror-impl" 2909 - version = "2.0.16" 2910 source = "registry+https://github.com/rust-lang/crates.io-index" 2911 - checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" 2912 dependencies = [ 2913 "proc-macro2", 2914 "quote", 2915 - "syn", 2916 ] 2917 2918 [[package]] ··· 2926 2927 [[package]] 2928 name = "tinystr" 2929 - version = "0.8.1" 2930 source = "registry+https://github.com/rust-lang/crates.io-index" 2931 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 2932 dependencies = [ 2933 "displaydoc", 2934 "zerovec", ··· 2951 2952 [[package]] 2953 name = "tokio" 2954 - version = "1.47.1" 2955 source = "registry+https://github.com/rust-lang/crates.io-index" 2956 - checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 2957 dependencies = [ 2958 - "backtrace", 2959 "bytes", 2960 - "io-uring", 2961 "libc", 2962 "mio", 2963 "parking_lot", 2964 "pin-project-lite", 2965 "signal-hook-registry", 2966 - "slab", 2967 - "socket2 0.6.0", 2968 "tokio-macros", 2969 - "windows-sys 0.59.0", 2970 ] 2971 2972 [[package]] 2973 name = "tokio-macros" 2974 - version = "2.5.0" 2975 source = "registry+https://github.com/rust-lang/crates.io-index" 2976 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2977 dependencies = [ 2978 "proc-macro2", 2979 "quote", 2980 - "syn", 2981 ] 2982 2983 [[package]] ··· 2992 2993 [[package]] 2994 name = "tokio-rustls" 2995 - version = "0.26.2" 2996 source = "registry+https://github.com/rust-lang/crates.io-index" 2997 - checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 2998 dependencies = [ 2999 "rustls", 3000 "tokio", ··· 3013 3014 [[package]] 3015 name = "tokio-util" 3016 - version = "0.7.16" 3017 source = "registry+https://github.com/rust-lang/crates.io-index" 3018 - checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" 3019 dependencies = [ 3020 "bytes", 3021 "futures-core", ··· 3123 dependencies = [ 3124 "proc-macro2", 3125 "quote", 3126 - "syn", 3127 ] 3128 3129 [[package]] ··· 3173 3174 [[package]] 3175 name = "typenum" 3176 - version = "1.18.0" 3177 source = "registry+https://github.com/rust-lang/crates.io-index" 3178 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 3179 3180 [[package]] 3181 name = "unicase" ··· 3191 3192 [[package]] 3193 name = "unicode-ident" 3194 - version = "1.0.18" 3195 source = "registry+https://github.com/rust-lang/crates.io-index" 3196 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 3197 3198 [[package]] 3199 name = "unicode-normalization" 3200 - version = "0.1.24" 3201 source = "registry+https://github.com/rust-lang/crates.io-index" 3202 - checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 3203 dependencies = [ 3204 "tinyvec", 3205 ] 3206 3207 [[package]] 3208 name = "unicode-properties" 3209 - version = "0.1.3" 3210 source = "registry+https://github.com/rust-lang/crates.io-index" 3211 - checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 3212 3213 [[package]] 3214 name = "unsigned-varint" ··· 3258 source = "registry+https://github.com/rust-lang/crates.io-index" 3259 checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 3260 dependencies = [ 3261 - "getrandom 0.3.3", 3262 "js-sys", 3263 "wasm-bindgen", 3264 ] ··· 3303 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 3304 3305 [[package]] 3306 - name = "wasi" 3307 - version = "0.14.3+wasi-0.2.4" 3308 source = "registry+https://github.com/rust-lang/crates.io-index" 3309 - checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" 3310 dependencies = [ 3311 "wit-bindgen", 3312 ] ··· 3319 3320 [[package]] 3321 name = "wasm-bindgen" 3322 - version = "0.2.101" 3323 source = "registry+https://github.com/rust-lang/crates.io-index" 3324 - checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" 3325 dependencies = [ 3326 "cfg-if", 3327 "once_cell", ··· 3331 ] 3332 3333 [[package]] 3334 - name = "wasm-bindgen-backend" 3335 - version = "0.2.101" 3336 - source = "registry+https://github.com/rust-lang/crates.io-index" 3337 - checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" 3338 - dependencies = [ 3339 - "bumpalo", 3340 - "log", 3341 - "proc-macro2", 3342 - "quote", 3343 - "syn", 3344 - "wasm-bindgen-shared", 3345 - ] 3346 - 3347 - [[package]] 3348 name = "wasm-bindgen-futures" 3349 - version = "0.4.51" 3350 source = "registry+https://github.com/rust-lang/crates.io-index" 3351 - checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" 3352 dependencies = [ 3353 "cfg-if", 3354 "js-sys", ··· 3359 3360 [[package]] 3361 name = "wasm-bindgen-macro" 3362 - version = "0.2.101" 3363 source = "registry+https://github.com/rust-lang/crates.io-index" 3364 - checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" 3365 dependencies = [ 3366 "quote", 3367 "wasm-bindgen-macro-support", ··· 3369 3370 [[package]] 3371 name = "wasm-bindgen-macro-support" 3372 - version = "0.2.101" 3373 source = "registry+https://github.com/rust-lang/crates.io-index" 3374 - checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" 3375 dependencies = [ 3376 "proc-macro2", 3377 "quote", 3378 - "syn", 3379 - "wasm-bindgen-backend", 3380 "wasm-bindgen-shared", 3381 ] 3382 3383 [[package]] 3384 name = "wasm-bindgen-shared" 3385 - version = "0.2.101" 3386 source = "registry+https://github.com/rust-lang/crates.io-index" 3387 - checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" 3388 dependencies = [ 3389 "unicode-ident", 3390 ] 3391 3392 [[package]] 3393 name = "web-sys" 3394 - version = "0.3.78" 3395 source = "registry+https://github.com/rust-lang/crates.io-index" 3396 - checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" 3397 dependencies = [ 3398 "js-sys", 3399 "wasm-bindgen", ··· 3411 3412 [[package]] 3413 name = "webpki-roots" 3414 - version = "1.0.2" 3415 source = "registry+https://github.com/rust-lang/crates.io-index" 3416 - checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" 3417 dependencies = [ 3418 "rustls-pki-types", 3419 ] ··· 3430 3431 [[package]] 3432 name = "widestring" 3433 - version = "1.2.0" 3434 - source = "registry+https://github.com/rust-lang/crates.io-index" 3435 - checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" 3436 - 3437 - [[package]] 3438 - name = "windows" 3439 - version = "0.61.3" 3440 source = "registry+https://github.com/rust-lang/crates.io-index" 3441 - checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 3442 - dependencies = [ 3443 - "windows-collections", 3444 - "windows-core", 3445 - "windows-future", 3446 - "windows-link", 3447 - "windows-numerics", 3448 - ] 3449 - 3450 - [[package]] 3451 - name = "windows-collections" 3452 - version = "0.2.0" 3453 - source = "registry+https://github.com/rust-lang/crates.io-index" 3454 - checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 3455 - dependencies = [ 3456 - "windows-core", 3457 - ] 3458 - 3459 - [[package]] 3460 - name = "windows-core" 3461 - version = "0.61.2" 3462 - source = "registry+https://github.com/rust-lang/crates.io-index" 3463 - checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" 3464 - dependencies = [ 3465 - "windows-implement", 3466 - "windows-interface", 3467 - "windows-link", 3468 - "windows-result", 3469 - "windows-strings", 3470 - ] 3471 - 3472 - [[package]] 3473 - name = "windows-future" 3474 - version = "0.2.1" 3475 - source = "registry+https://github.com/rust-lang/crates.io-index" 3476 - checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 3477 - dependencies = [ 3478 - "windows-core", 3479 - "windows-link", 3480 - "windows-threading", 3481 - ] 3482 - 3483 - [[package]] 3484 - name = "windows-implement" 3485 - version = "0.60.0" 3486 - source = "registry+https://github.com/rust-lang/crates.io-index" 3487 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 3488 - dependencies = [ 3489 - "proc-macro2", 3490 - "quote", 3491 - "syn", 3492 - ] 3493 - 3494 - [[package]] 3495 - name = "windows-interface" 3496 - version = "0.59.1" 3497 - source = "registry+https://github.com/rust-lang/crates.io-index" 3498 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 3499 - dependencies = [ 3500 - "proc-macro2", 3501 - "quote", 3502 - "syn", 3503 - ] 3504 3505 [[package]] 3506 name = "windows-link" ··· 3509 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 3510 3511 [[package]] 3512 - name = "windows-numerics" 3513 - version = "0.2.0" 3514 source = "registry+https://github.com/rust-lang/crates.io-index" 3515 - checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 3516 - dependencies = [ 3517 - "windows-core", 3518 - "windows-link", 3519 - ] 3520 3521 [[package]] 3522 name = "windows-registry" ··· 3524 source = "registry+https://github.com/rust-lang/crates.io-index" 3525 checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" 3526 dependencies = [ 3527 - "windows-link", 3528 "windows-result", 3529 "windows-strings", 3530 ] ··· 3535 source = "registry+https://github.com/rust-lang/crates.io-index" 3536 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 3537 dependencies = [ 3538 - "windows-link", 3539 ] 3540 3541 [[package]] ··· 3544 source = "registry+https://github.com/rust-lang/crates.io-index" 3545 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 3546 dependencies = [ 3547 - "windows-link", 3548 ] 3549 3550 [[package]] ··· 3567 3568 [[package]] 3569 name = "windows-sys" 3570 - version = "0.59.0" 3571 source = "registry+https://github.com/rust-lang/crates.io-index" 3572 - checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 3573 dependencies = [ 3574 - "windows-targets 0.52.6", 3575 ] 3576 3577 [[package]] 3578 name = "windows-sys" 3579 - version = "0.60.2" 3580 source = "registry+https://github.com/rust-lang/crates.io-index" 3581 - checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 3582 dependencies = [ 3583 - "windows-targets 0.53.3", 3584 ] 3585 3586 [[package]] ··· 3616 3617 [[package]] 3618 name = "windows-targets" 3619 - version = "0.53.3" 3620 - source = "registry+https://github.com/rust-lang/crates.io-index" 3621 - checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 3622 - dependencies = [ 3623 - "windows-link", 3624 - "windows_aarch64_gnullvm 0.53.0", 3625 - "windows_aarch64_msvc 0.53.0", 3626 - "windows_i686_gnu 0.53.0", 3627 - "windows_i686_gnullvm 0.53.0", 3628 - "windows_i686_msvc 0.53.0", 3629 - "windows_x86_64_gnu 0.53.0", 3630 - "windows_x86_64_gnullvm 0.53.0", 3631 - "windows_x86_64_msvc 0.53.0", 3632 - ] 3633 - 3634 - [[package]] 3635 - name = "windows-threading" 3636 - version = "0.1.0" 3637 source = "registry+https://github.com/rust-lang/crates.io-index" 3638 - checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 3639 dependencies = [ 3640 - "windows-link", 3641 ] 3642 3643 [[package]] ··· 3654 3655 [[package]] 3656 name = "windows_aarch64_gnullvm" 3657 - version = "0.53.0" 3658 source = "registry+https://github.com/rust-lang/crates.io-index" 3659 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 3660 3661 [[package]] 3662 name = "windows_aarch64_msvc" ··· 3672 3673 [[package]] 3674 name = "windows_aarch64_msvc" 3675 - version = "0.53.0" 3676 source = "registry+https://github.com/rust-lang/crates.io-index" 3677 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 3678 3679 [[package]] 3680 name = "windows_i686_gnu" ··· 3690 3691 [[package]] 3692 name = "windows_i686_gnu" 3693 - version = "0.53.0" 3694 source = "registry+https://github.com/rust-lang/crates.io-index" 3695 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 3696 3697 [[package]] 3698 name = "windows_i686_gnullvm" ··· 3702 3703 [[package]] 3704 name = "windows_i686_gnullvm" 3705 - version = "0.53.0" 3706 source = "registry+https://github.com/rust-lang/crates.io-index" 3707 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 3708 3709 [[package]] 3710 name = "windows_i686_msvc" ··· 3720 3721 [[package]] 3722 name = "windows_i686_msvc" 3723 - version = "0.53.0" 3724 source = "registry+https://github.com/rust-lang/crates.io-index" 3725 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 3726 3727 [[package]] 3728 name = "windows_x86_64_gnu" ··· 3738 3739 [[package]] 3740 name = "windows_x86_64_gnu" 3741 - version = "0.53.0" 3742 source = "registry+https://github.com/rust-lang/crates.io-index" 3743 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 3744 3745 [[package]] 3746 name = "windows_x86_64_gnullvm" ··· 3756 3757 [[package]] 3758 name = "windows_x86_64_gnullvm" 3759 - version = "0.53.0" 3760 source = "registry+https://github.com/rust-lang/crates.io-index" 3761 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 3762 3763 [[package]] 3764 name = "windows_x86_64_msvc" ··· 3774 3775 [[package]] 3776 name = "windows_x86_64_msvc" 3777 - version = "0.53.0" 3778 source = "registry+https://github.com/rust-lang/crates.io-index" 3779 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 3780 3781 [[package]] 3782 name = "winreg" ··· 3790 3791 [[package]] 3792 name = "wit-bindgen" 3793 - version = "0.45.1" 3794 source = "registry+https://github.com/rust-lang/crates.io-index" 3795 - checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" 3796 3797 [[package]] 3798 name = "writeable" 3799 - version = "0.6.1" 3800 source = "registry+https://github.com/rust-lang/crates.io-index" 3801 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 3802 3803 [[package]] 3804 name = "yoke" 3805 - version = "0.8.0" 3806 source = "registry+https://github.com/rust-lang/crates.io-index" 3807 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 3808 dependencies = [ 3809 - "serde", 3810 "stable_deref_trait", 3811 "yoke-derive", 3812 "zerofrom", ··· 3814 3815 [[package]] 3816 name = "yoke-derive" 3817 - version = "0.8.0" 3818 source = "registry+https://github.com/rust-lang/crates.io-index" 3819 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 3820 dependencies = [ 3821 "proc-macro2", 3822 "quote", 3823 - "syn", 3824 "synstructure", 3825 ] 3826 3827 [[package]] 3828 name = "zerocopy" 3829 - version = "0.8.26" 3830 source = "registry+https://github.com/rust-lang/crates.io-index" 3831 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 3832 dependencies = [ 3833 "zerocopy-derive", 3834 ] 3835 3836 [[package]] 3837 name = "zerocopy-derive" 3838 - version = "0.8.26" 3839 source = "registry+https://github.com/rust-lang/crates.io-index" 3840 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 3841 dependencies = [ 3842 "proc-macro2", 3843 "quote", 3844 - "syn", 3845 ] 3846 3847 [[package]] ··· 3861 dependencies = [ 3862 "proc-macro2", 3863 "quote", 3864 - "syn", 3865 "synstructure", 3866 ] 3867 3868 [[package]] 3869 name = "zeroize" 3870 - version = "1.8.1" 3871 source = "registry+https://github.com/rust-lang/crates.io-index" 3872 - checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 3873 3874 [[package]] 3875 name = "zerotrie" 3876 - version = "0.2.2" 3877 source = "registry+https://github.com/rust-lang/crates.io-index" 3878 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 3879 dependencies = [ 3880 "displaydoc", 3881 "yoke", ··· 3884 3885 [[package]] 3886 name = "zerovec" 3887 - version = "0.11.4" 3888 source = "registry+https://github.com/rust-lang/crates.io-index" 3889 - checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 3890 dependencies = [ 3891 "yoke", 3892 "zerofrom", ··· 3895 3896 [[package]] 3897 name = "zerovec-derive" 3898 - version = "0.11.1" 3899 source = "registry+https://github.com/rust-lang/crates.io-index" 3900 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 3901 dependencies = [ 3902 "proc-macro2", 3903 "quote", 3904 - "syn", 3905 ] 3906 3907 [[package]]
··· 3 version = 4 4 5 [[package]] 6 name = "aho-corasick" 7 + version = "1.1.4" 8 source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 10 dependencies = [ 11 "memchr", 12 ] ··· 19 20 [[package]] 21 name = "anyhow" 22 + version = "1.0.100" 23 source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 25 26 [[package]] 27 name = "arc-swap" ··· 37 dependencies = [ 38 "proc-macro2", 39 "quote", 40 + "syn 2.0.108", 41 ] 42 43 [[package]] ··· 56 checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 57 58 [[package]] 59 + name = "atproto-client" 60 + version = "0.13.0" 61 + source = "git+https://tangled.org/@smokesignal.events/atproto-identity-rs#8a38edecc8ebebd74d511ae7863c7eecd0b877ad" 62 + dependencies = [ 63 + "anyhow", 64 + "async-trait", 65 + "atproto-identity", 66 + "atproto-oauth", 67 + "atproto-record", 68 + "bytes", 69 + "reqwest", 70 + "reqwest-chain", 71 + "reqwest-middleware", 72 + "serde", 73 + "serde_json", 74 + "thiserror 2.0.17", 75 + "tokio", 76 + "tracing", 77 + "urlencoding", 78 + ] 79 + 80 + [[package]] 81 name = "atproto-identity" 82 + version = "0.13.0" 83 + source = "git+https://tangled.org/@smokesignal.events/atproto-identity-rs#8a38edecc8ebebd74d511ae7863c7eecd0b877ad" 84 dependencies = [ 85 "anyhow", 86 "async-trait", ··· 97 "serde", 98 "serde_ipld_dagcbor", 99 "serde_json", 100 + "thiserror 2.0.17", 101 "tokio", 102 "tracing", 103 + "url", 104 + "urlencoding", 105 ] 106 107 [[package]] 108 name = "atproto-jetstream" 109 + version = "0.13.0" 110 + source = "git+https://tangled.org/@smokesignal.events/atproto-identity-rs#8a38edecc8ebebd74d511ae7863c7eecd0b877ad" 111 dependencies = [ 112 "anyhow", 113 "async-trait", ··· 116 "http", 117 "serde", 118 "serde_json", 119 + "thiserror 2.0.17", 120 "tokio", 121 "tokio-util", 122 "tokio-websockets", ··· 127 ] 128 129 [[package]] 130 + name = "atproto-lexicon" 131 + version = "0.13.0" 132 + source = "git+https://tangled.org/@smokesignal.events/atproto-identity-rs#8a38edecc8ebebd74d511ae7863c7eecd0b877ad" 133 + dependencies = [ 134 + "anyhow", 135 + "async-trait", 136 + "atproto-client", 137 + "atproto-identity", 138 + "hickory-resolver", 139 + "reqwest", 140 + "serde", 141 + "serde_json", 142 + "thiserror 2.0.17", 143 + "tokio", 144 + "tracing", 145 + ] 146 + 147 + [[package]] 148 + name = "atproto-oauth" 149 + version = "0.13.0" 150 + source = "git+https://tangled.org/@smokesignal.events/atproto-identity-rs#8a38edecc8ebebd74d511ae7863c7eecd0b877ad" 151 + dependencies = [ 152 + "anyhow", 153 + "async-trait", 154 + "atproto-identity", 155 + "base64", 156 + "chrono", 157 + "ecdsa", 158 + "elliptic-curve", 159 + "k256", 160 + "lru", 161 + "multibase", 162 + "p256", 163 + "p384", 164 + "rand 0.8.5", 165 + "reqwest", 166 + "reqwest-chain", 167 + "reqwest-middleware", 168 + "serde", 169 + "serde_ipld_dagcbor", 170 + "serde_json", 171 + "sha2", 172 + "thiserror 2.0.17", 173 + "tokio", 174 + "tracing", 175 + "ulid", 176 + ] 177 + 178 + [[package]] 179 + name = "atproto-record" 180 + version = "0.13.0" 181 + source = "git+https://tangled.org/@smokesignal.events/atproto-identity-rs#8a38edecc8ebebd74d511ae7863c7eecd0b877ad" 182 + dependencies = [ 183 + "anyhow", 184 + "atproto-identity", 185 + "base64", 186 + "chrono", 187 + "cid", 188 + "multihash", 189 + "rand 0.8.5", 190 + "serde", 191 + "serde_ipld_dagcbor", 192 + "serde_json", 193 + "sha2", 194 + "thiserror 2.0.17", 195 + ] 196 + 197 + [[package]] 198 name = "autocfg" 199 version = "1.5.0" 200 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 202 203 [[package]] 204 name = "axum" 205 + version = "0.8.6" 206 source = "registry+https://github.com/rust-lang/crates.io-index" 207 + checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" 208 dependencies = [ 209 "axum-core", 210 "bytes", ··· 221 "mime", 222 "percent-encoding", 223 "pin-project-lite", 224 + "serde_core", 225 "serde_json", 226 "serde_path_to_error", 227 "serde_urlencoded", ··· 235 236 [[package]] 237 name = "axum-core" 238 + version = "0.5.5" 239 source = "registry+https://github.com/rust-lang/crates.io-index" 240 + checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" 241 dependencies = [ 242 "bytes", 243 "futures-core", ··· 246 "http-body-util", 247 "mime", 248 "pin-project-lite", 249 "sync_wrapper", 250 "tower-layer", 251 "tower-service", ··· 254 255 [[package]] 256 name = "backon" 257 + version = "1.6.0" 258 source = "registry+https://github.com/rust-lang/crates.io-index" 259 + checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" 260 dependencies = [ 261 "fastrand", 262 ] 263 264 [[package]] 265 name = "base-x" 266 version = "0.2.11" 267 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 272 version = "0.2.0" 273 source = "registry+https://github.com/rust-lang/crates.io-index" 274 checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 275 + 276 + [[package]] 277 + name = "base256emoji" 278 + version = "1.0.2" 279 + source = "registry+https://github.com/rust-lang/crates.io-index" 280 + checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" 281 + dependencies = [ 282 + "const-str", 283 + "match-lookup", 284 + ] 285 286 [[package]] 287 name = "base64" ··· 317 318 [[package]] 319 name = "bitflags" 320 + version = "2.10.0" 321 source = "registry+https://github.com/rust-lang/crates.io-index" 322 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 323 dependencies = [ 324 + "serde_core", 325 ] 326 327 [[package]] ··· 371 372 [[package]] 373 name = "cc" 374 + version = "1.2.44" 375 source = "registry+https://github.com/rust-lang/crates.io-index" 376 + checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" 377 dependencies = [ 378 "find-msvc-tools", 379 "jobserver", ··· 383 384 [[package]] 385 name = "cfg-if" 386 + version = "1.0.4" 387 source = "registry+https://github.com/rust-lang/crates.io-index" 388 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 389 390 [[package]] 391 name = "cfg_aliases" ··· 394 checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 395 396 [[package]] 397 + name = "chrono" 398 + version = "0.4.42" 399 + source = "registry+https://github.com/rust-lang/crates.io-index" 400 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 401 + dependencies = [ 402 + "num-traits", 403 + "serde", 404 + ] 405 + 406 + [[package]] 407 name = "cid" 408 version = "0.11.1" 409 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 447 checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 448 449 [[package]] 450 + name = "const-str" 451 + version = "0.4.3" 452 + source = "registry+https://github.com/rust-lang/crates.io-index" 453 + checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" 454 + 455 + [[package]] 456 name = "core-foundation" 457 version = "0.9.4" 458 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 595 checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" 596 dependencies = [ 597 "data-encoding", 598 + "syn 2.0.108", 599 ] 600 601 [[package]] ··· 660 dependencies = [ 661 "proc-macro2", 662 "quote", 663 + "syn 2.0.108", 664 ] 665 666 [[package]] ··· 679 "digest", 680 "elliptic-curve", 681 "rfc6979", 682 + "serdect", 683 "signature", 684 "spki", 685 ] ··· 735 "heck", 736 "proc-macro2", 737 "quote", 738 + "syn 2.0.108", 739 ] 740 741 [[package]] ··· 746 747 [[package]] 748 name = "errno" 749 + version = "0.3.14" 750 source = "registry+https://github.com/rust-lang/crates.io-index" 751 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 752 dependencies = [ 753 "libc", 754 + "windows-sys 0.61.2", 755 ] 756 757 [[package]] ··· 794 795 [[package]] 796 name = "find-msvc-tools" 797 + version = "0.1.4" 798 source = "registry+https://github.com/rust-lang/crates.io-index" 799 + checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" 800 801 [[package]] 802 name = "flume" ··· 912 dependencies = [ 913 "proc-macro2", 914 "quote", 915 + "syn 2.0.108", 916 ] 917 918 [[package]] ··· 946 ] 947 948 [[package]] 949 name = "generic-array" 950 + version = "0.14.9" 951 source = "registry+https://github.com/rust-lang/crates.io-index" 952 + checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" 953 dependencies = [ 954 "typenum", 955 "version_check", ··· 965 "cfg-if", 966 "js-sys", 967 "libc", 968 + "wasi", 969 "wasm-bindgen", 970 ] 971 972 [[package]] 973 name = "getrandom" 974 + version = "0.3.4" 975 source = "registry+https://github.com/rust-lang/crates.io-index" 976 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 977 dependencies = [ 978 "cfg-if", 979 "js-sys", 980 "libc", 981 "r-efi", 982 + "wasip2", 983 "wasm-bindgen", 984 ] 985 986 [[package]] 987 name = "group" ··· 1025 ] 1026 1027 [[package]] 1028 + name = "hashbrown" 1029 + version = "0.16.0" 1030 + source = "registry+https://github.com/rust-lang/crates.io-index" 1031 + checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 1032 + 1033 + [[package]] 1034 name = "hashlink" 1035 version = "0.10.0" 1036 source = "registry+https://github.com/rust-lang/crates.io-index" 1037 checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 1038 dependencies = [ 1039 + "hashbrown 0.15.5", 1040 ] 1041 1042 [[package]] ··· 1075 "once_cell", 1076 "rand 0.9.2", 1077 "ring", 1078 + "thiserror 2.0.17", 1079 "tinyvec", 1080 "tokio", 1081 "tracing", ··· 1098 "rand 0.9.2", 1099 "resolv-conf", 1100 "smallvec", 1101 + "thiserror 2.0.17", 1102 "tokio", 1103 "tracing", 1104 ] ··· 1123 1124 [[package]] 1125 name = "home" 1126 + version = "0.5.12" 1127 source = "registry+https://github.com/rust-lang/crates.io-index" 1128 + checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" 1129 dependencies = [ 1130 + "windows-sys 0.61.2", 1131 ] 1132 1133 [[package]] ··· 1240 1241 [[package]] 1242 name = "hyper-util" 1243 + version = "0.1.17" 1244 source = "registry+https://github.com/rust-lang/crates.io-index" 1245 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1246 dependencies = [ 1247 "base64", 1248 "bytes", ··· 1256 "libc", 1257 "percent-encoding", 1258 "pin-project-lite", 1259 + "socket2 0.6.1", 1260 "system-configuration", 1261 "tokio", 1262 "tower-service", ··· 1266 1267 [[package]] 1268 name = "icu_collections" 1269 + version = "2.1.1" 1270 source = "registry+https://github.com/rust-lang/crates.io-index" 1271 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 1272 dependencies = [ 1273 "displaydoc", 1274 "potential_utf", ··· 1279 1280 [[package]] 1281 name = "icu_locale_core" 1282 + version = "2.1.1" 1283 source = "registry+https://github.com/rust-lang/crates.io-index" 1284 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 1285 dependencies = [ 1286 "displaydoc", 1287 "litemap", ··· 1292 1293 [[package]] 1294 name = "icu_normalizer" 1295 + version = "2.1.1" 1296 source = "registry+https://github.com/rust-lang/crates.io-index" 1297 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 1298 dependencies = [ 1299 "icu_collections", 1300 "icu_normalizer_data", 1301 "icu_properties", ··· 1306 1307 [[package]] 1308 name = "icu_normalizer_data" 1309 + version = "2.1.1" 1310 source = "registry+https://github.com/rust-lang/crates.io-index" 1311 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 1312 1313 [[package]] 1314 name = "icu_properties" 1315 + version = "2.1.1" 1316 source = "registry+https://github.com/rust-lang/crates.io-index" 1317 + checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" 1318 dependencies = [ 1319 "icu_collections", 1320 "icu_locale_core", 1321 "icu_properties_data", 1322 "icu_provider", 1323 "zerotrie", 1324 "zerovec", 1325 ] 1326 1327 [[package]] 1328 name = "icu_properties_data" 1329 + version = "2.1.1" 1330 source = "registry+https://github.com/rust-lang/crates.io-index" 1331 + checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" 1332 1333 [[package]] 1334 name = "icu_provider" 1335 + version = "2.1.1" 1336 source = "registry+https://github.com/rust-lang/crates.io-index" 1337 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 1338 dependencies = [ 1339 "displaydoc", 1340 "icu_locale_core", 1341 "writeable", 1342 "yoke", 1343 "zerofrom", ··· 1368 1369 [[package]] 1370 name = "indexmap" 1371 + version = "2.12.0" 1372 source = "registry+https://github.com/rust-lang/crates.io-index" 1373 + checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" 1374 dependencies = [ 1375 "equivalent", 1376 + "hashbrown 0.16.0", 1377 ] 1378 1379 [[package]] ··· 1427 source = "registry+https://github.com/rust-lang/crates.io-index" 1428 checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 1429 dependencies = [ 1430 + "getrandom 0.3.4", 1431 "libc", 1432 ] 1433 1434 [[package]] 1435 name = "js-sys" 1436 + version = "0.3.82" 1437 source = "registry+https://github.com/rust-lang/crates.io-index" 1438 + checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" 1439 dependencies = [ 1440 "once_cell", 1441 "wasm-bindgen", ··· 1466 1467 [[package]] 1468 name = "libc" 1469 + version = "0.2.177" 1470 source = "registry+https://github.com/rust-lang/crates.io-index" 1471 + checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" 1472 1473 [[package]] 1474 name = "libm" ··· 1478 1479 [[package]] 1480 name = "libredox" 1481 + version = "0.1.10" 1482 source = "registry+https://github.com/rust-lang/crates.io-index" 1483 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 1484 dependencies = [ 1485 "bitflags", 1486 "libc", ··· 1500 1501 [[package]] 1502 name = "linux-raw-sys" 1503 + version = "0.11.0" 1504 source = "registry+https://github.com/rust-lang/crates.io-index" 1505 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 1506 1507 [[package]] 1508 name = "litemap" 1509 + version = "0.8.1" 1510 source = "registry+https://github.com/rust-lang/crates.io-index" 1511 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 1512 1513 [[package]] 1514 name = "lock_api" 1515 + version = "0.4.14" 1516 source = "registry+https://github.com/rust-lang/crates.io-index" 1517 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 1518 dependencies = [ 1519 "scopeguard", 1520 ] 1521 ··· 1524 version = "0.4.28" 1525 source = "registry+https://github.com/rust-lang/crates.io-index" 1526 checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 1527 1528 [[package]] 1529 name = "lru" ··· 1531 source = "registry+https://github.com/rust-lang/crates.io-index" 1532 checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 1533 dependencies = [ 1534 + "hashbrown 0.15.5", 1535 ] 1536 1537 [[package]] ··· 1539 version = "0.1.2" 1540 source = "registry+https://github.com/rust-lang/crates.io-index" 1541 checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 1542 + 1543 + [[package]] 1544 + name = "match-lookup" 1545 + version = "0.1.1" 1546 + source = "registry+https://github.com/rust-lang/crates.io-index" 1547 + checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" 1548 + dependencies = [ 1549 + "proc-macro2", 1550 + "quote", 1551 + "syn 1.0.109", 1552 + ] 1553 1554 [[package]] 1555 name = "matchers" ··· 1578 1579 [[package]] 1580 name = "memchr" 1581 + version = "2.7.6" 1582 source = "registry+https://github.com/rust-lang/crates.io-index" 1583 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 1584 1585 [[package]] 1586 name = "metrohash" ··· 1605 ] 1606 1607 [[package]] 1608 name = "mio" 1609 + version = "1.1.0" 1610 source = "registry+https://github.com/rust-lang/crates.io-index" 1611 + checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" 1612 dependencies = [ 1613 "libc", 1614 + "wasi", 1615 + "windows-sys 0.61.2", 1616 ] 1617 1618 [[package]] 1619 name = "moka" 1620 + version = "0.12.11" 1621 source = "registry+https://github.com/rust-lang/crates.io-index" 1622 + checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" 1623 dependencies = [ 1624 "crossbeam-channel", 1625 "crossbeam-epoch", 1626 "crossbeam-utils", 1627 + "equivalent", 1628 "parking_lot", 1629 "portable-atomic", 1630 "rustc_version", 1631 "smallvec", 1632 "tagptr", 1633 "uuid", 1634 ] 1635 1636 [[package]] 1637 name = "multibase" 1638 + version = "0.9.2" 1639 source = "registry+https://github.com/rust-lang/crates.io-index" 1640 + checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" 1641 dependencies = [ 1642 "base-x", 1643 + "base256emoji", 1644 "data-encoding", 1645 "data-encoding-macro", 1646 ] ··· 1675 1676 [[package]] 1677 name = "nu-ansi-term" 1678 + version = "0.50.3" 1679 source = "registry+https://github.com/rust-lang/crates.io-index" 1680 + checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" 1681 dependencies = [ 1682 + "windows-sys 0.61.2", 1683 ] 1684 1685 [[package]] ··· 1694 1695 [[package]] 1696 name = "num-bigint-dig" 1697 + version = "0.8.5" 1698 source = "registry+https://github.com/rust-lang/crates.io-index" 1699 + checksum = "82c79c15c05d4bf82b6f5ef163104cc81a760d8e874d38ac50ab67c8877b647b" 1700 dependencies = [ 1701 "lazy_static", 1702 "libm", 1703 "num-integer", ··· 1749 ] 1750 1751 [[package]] 1752 name = "once_cell" 1753 version = "1.21.3" 1754 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1760 1761 [[package]] 1762 name = "openssl" 1763 + version = "0.10.74" 1764 source = "registry+https://github.com/rust-lang/crates.io-index" 1765 + checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" 1766 dependencies = [ 1767 "bitflags", 1768 "cfg-if", ··· 1781 dependencies = [ 1782 "proc-macro2", 1783 "quote", 1784 + "syn 2.0.108", 1785 ] 1786 1787 [[package]] ··· 1792 1793 [[package]] 1794 name = "openssl-sys" 1795 + version = "0.9.110" 1796 source = "registry+https://github.com/rust-lang/crates.io-index" 1797 + checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" 1798 dependencies = [ 1799 "cc", 1800 "libc", ··· 1811 "ecdsa", 1812 "elliptic-curve", 1813 "primeorder", 1814 + "serdect", 1815 "sha2", 1816 ] 1817 ··· 1824 "ecdsa", 1825 "elliptic-curve", 1826 "primeorder", 1827 + "serdect", 1828 "sha2", 1829 ] 1830 ··· 1836 1837 [[package]] 1838 name = "parking_lot" 1839 + version = "0.12.5" 1840 source = "registry+https://github.com/rust-lang/crates.io-index" 1841 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 1842 dependencies = [ 1843 "lock_api", 1844 "parking_lot_core", ··· 1846 1847 [[package]] 1848 name = "parking_lot_core" 1849 + version = "0.9.12" 1850 source = "registry+https://github.com/rust-lang/crates.io-index" 1851 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 1852 dependencies = [ 1853 "cfg-if", 1854 "libc", 1855 "redox_syscall", 1856 "smallvec", 1857 + "windows-link 0.2.1", 1858 ] 1859 1860 [[package]] ··· 1919 1920 [[package]] 1921 name = "potential_utf" 1922 + version = "0.1.4" 1923 source = "registry+https://github.com/rust-lang/crates.io-index" 1924 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 1925 dependencies = [ 1926 "zerovec", 1927 ] ··· 1942 checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" 1943 dependencies = [ 1944 "elliptic-curve", 1945 + "serdect", 1946 ] 1947 1948 [[package]] 1949 name = "proc-macro2" 1950 + version = "1.0.103" 1951 source = "registry+https://github.com/rust-lang/crates.io-index" 1952 + checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 1953 dependencies = [ 1954 "unicode-ident", 1955 ] ··· 1962 "async-trait", 1963 "atproto-identity", 1964 "atproto-jetstream", 1965 + "atproto-lexicon", 1966 "axum", 1967 "bincode", 1968 "cadence", ··· 1974 "serde", 1975 "serde_json", 1976 "sqlx", 1977 + "thiserror 2.0.17", 1978 "tokio", 1979 "tokio-util", 1980 "tower-http", ··· 1995 "quinn-udp", 1996 "rustc-hash", 1997 "rustls", 1998 + "socket2 0.6.1", 1999 + "thiserror 2.0.17", 2000 "tokio", 2001 "tracing", 2002 "web-time", ··· 2009 checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 2010 dependencies = [ 2011 "bytes", 2012 + "getrandom 0.3.4", 2013 "lru-slab", 2014 "rand 0.9.2", 2015 "ring", ··· 2017 "rustls", 2018 "rustls-pki-types", 2019 "slab", 2020 + "thiserror 2.0.17", 2021 "tinyvec", 2022 "tracing", 2023 "web-time", ··· 2032 "cfg_aliases", 2033 "libc", 2034 "once_cell", 2035 + "socket2 0.6.1", 2036 "tracing", 2037 "windows-sys 0.60.2", 2038 ] 2039 2040 [[package]] 2041 name = "quote" 2042 + version = "1.0.41" 2043 source = "registry+https://github.com/rust-lang/crates.io-index" 2044 + checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" 2045 dependencies = [ 2046 "proc-macro2", 2047 ] ··· 2108 source = "registry+https://github.com/rust-lang/crates.io-index" 2109 checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 2110 dependencies = [ 2111 + "getrandom 0.3.4", 2112 ] 2113 2114 [[package]] 2115 name = "redis" 2116 + version = "0.32.7" 2117 source = "registry+https://github.com/rust-lang/crates.io-index" 2118 + checksum = "014cc767fefab6a3e798ca45112bccad9c6e0e218fbd49720042716c73cfef44" 2119 dependencies = [ 2120 "arc-swap", 2121 "backon", ··· 2131 "rustls", 2132 "rustls-native-certs", 2133 "ryu", 2134 + "socket2 0.6.1", 2135 "tokio", 2136 "tokio-rustls", 2137 "tokio-util", ··· 2140 2141 [[package]] 2142 name = "redox_syscall" 2143 + version = "0.5.18" 2144 source = "registry+https://github.com/rust-lang/crates.io-index" 2145 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 2146 dependencies = [ 2147 "bitflags", 2148 ] 2149 2150 [[package]] 2151 name = "regex-automata" 2152 + version = "0.4.13" 2153 source = "registry+https://github.com/rust-lang/crates.io-index" 2154 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 2155 dependencies = [ 2156 "aho-corasick", 2157 "memchr", ··· 2160 2161 [[package]] 2162 name = "regex-syntax" 2163 + version = "0.8.8" 2164 source = "registry+https://github.com/rust-lang/crates.io-index" 2165 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 2166 2167 [[package]] 2168 name = "reqwest" 2169 + version = "0.12.24" 2170 source = "registry+https://github.com/rust-lang/crates.io-index" 2171 + checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" 2172 dependencies = [ 2173 "base64", 2174 "bytes", 2175 "encoding_rs", 2176 "futures-core", 2177 + "futures-util", 2178 "h2", 2179 "http", 2180 "http-body", ··· 2186 "js-sys", 2187 "log", 2188 "mime", 2189 + "mime_guess", 2190 "native-tls", 2191 "percent-encoding", 2192 "pin-project-lite", ··· 2211 ] 2212 2213 [[package]] 2214 + name = "reqwest-chain" 2215 + version = "1.0.0" 2216 + source = "registry+https://github.com/rust-lang/crates.io-index" 2217 + checksum = "da5c014fb79a8227db44a0433d748107750d2550b7fca55c59a3d7ee7d2ee2b2" 2218 + dependencies = [ 2219 + "anyhow", 2220 + "async-trait", 2221 + "http", 2222 + "reqwest-middleware", 2223 + ] 2224 + 2225 + [[package]] 2226 + name = "reqwest-middleware" 2227 + version = "0.4.2" 2228 + source = "registry+https://github.com/rust-lang/crates.io-index" 2229 + checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" 2230 + dependencies = [ 2231 + "anyhow", 2232 + "async-trait", 2233 + "http", 2234 + "reqwest", 2235 + "serde", 2236 + "thiserror 1.0.69", 2237 + "tower-service", 2238 + ] 2239 + 2240 + [[package]] 2241 name = "resolv-conf" 2242 + version = "0.7.5" 2243 source = "registry+https://github.com/rust-lang/crates.io-index" 2244 + checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" 2245 2246 [[package]] 2247 name = "rfc6979" ··· 2288 ] 2289 2290 [[package]] 2291 name = "rustc-hash" 2292 version = "2.1.1" 2293 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2304 2305 [[package]] 2306 name = "rustix" 2307 + version = "1.1.2" 2308 source = "registry+https://github.com/rust-lang/crates.io-index" 2309 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 2310 dependencies = [ 2311 "bitflags", 2312 "errno", 2313 "libc", 2314 "linux-raw-sys", 2315 + "windows-sys 0.61.2", 2316 ] 2317 2318 [[package]] 2319 name = "rustls" 2320 + version = "0.23.34" 2321 source = "registry+https://github.com/rust-lang/crates.io-index" 2322 + checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" 2323 dependencies = [ 2324 "once_cell", 2325 "ring", ··· 2331 2332 [[package]] 2333 name = "rustls-native-certs" 2334 + version = "0.8.2" 2335 source = "registry+https://github.com/rust-lang/crates.io-index" 2336 + checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" 2337 dependencies = [ 2338 "openssl-probe", 2339 "rustls-pki-types", 2340 "schannel", 2341 + "security-framework 3.5.1", 2342 ] 2343 2344 [[package]] 2345 name = "rustls-pki-types" 2346 + version = "1.13.0" 2347 source = "registry+https://github.com/rust-lang/crates.io-index" 2348 + checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" 2349 dependencies = [ 2350 "web-time", 2351 "zeroize", ··· 2353 2354 [[package]] 2355 name = "rustls-webpki" 2356 + version = "0.103.8" 2357 source = "registry+https://github.com/rust-lang/crates.io-index" 2358 + checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" 2359 dependencies = [ 2360 "ring", 2361 "rustls-pki-types", ··· 2376 2377 [[package]] 2378 name = "schannel" 2379 + version = "0.1.28" 2380 source = "registry+https://github.com/rust-lang/crates.io-index" 2381 + checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" 2382 dependencies = [ 2383 + "windows-sys 0.61.2", 2384 ] 2385 2386 [[package]] 2387 name = "scopeguard" ··· 2419 2420 [[package]] 2421 name = "security-framework" 2422 + version = "3.5.1" 2423 source = "registry+https://github.com/rust-lang/crates.io-index" 2424 + checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" 2425 dependencies = [ 2426 "bitflags", 2427 "core-foundation 0.10.1", ··· 2432 2433 [[package]] 2434 name = "security-framework-sys" 2435 + version = "2.15.0" 2436 source = "registry+https://github.com/rust-lang/crates.io-index" 2437 + checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" 2438 dependencies = [ 2439 "core-foundation-sys", 2440 "libc", ··· 2442 2443 [[package]] 2444 name = "semver" 2445 + version = "1.0.27" 2446 source = "registry+https://github.com/rust-lang/crates.io-index" 2447 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 2448 2449 [[package]] 2450 name = "serde" 2451 + version = "1.0.228" 2452 source = "registry+https://github.com/rust-lang/crates.io-index" 2453 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 2454 dependencies = [ 2455 + "serde_core", 2456 "serde_derive", 2457 ] 2458 2459 [[package]] 2460 name = "serde_bytes" 2461 + version = "0.11.19" 2462 source = "registry+https://github.com/rust-lang/crates.io-index" 2463 + checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" 2464 dependencies = [ 2465 "serde", 2466 + "serde_core", 2467 + ] 2468 + 2469 + [[package]] 2470 + name = "serde_core" 2471 + version = "1.0.228" 2472 + source = "registry+https://github.com/rust-lang/crates.io-index" 2473 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 2474 + dependencies = [ 2475 + "serde_derive", 2476 ] 2477 2478 [[package]] 2479 name = "serde_derive" 2480 + version = "1.0.228" 2481 source = "registry+https://github.com/rust-lang/crates.io-index" 2482 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 2483 dependencies = [ 2484 "proc-macro2", 2485 "quote", 2486 + "syn 2.0.108", 2487 ] 2488 2489 [[package]] 2490 name = "serde_ipld_dagcbor" 2491 + version = "0.6.4" 2492 source = "registry+https://github.com/rust-lang/crates.io-index" 2493 + checksum = "46182f4f08349a02b45c998ba3215d3f9de826246ba02bb9dddfe9a2a2100778" 2494 dependencies = [ 2495 "cbor4ii", 2496 "ipld-core", ··· 2500 2501 [[package]] 2502 name = "serde_json" 2503 + version = "1.0.145" 2504 source = "registry+https://github.com/rust-lang/crates.io-index" 2505 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 2506 dependencies = [ 2507 "itoa", 2508 "memchr", 2509 "ryu", 2510 "serde", 2511 + "serde_core", 2512 ] 2513 2514 [[package]] 2515 name = "serde_path_to_error" 2516 + version = "0.1.20" 2517 source = "registry+https://github.com/rust-lang/crates.io-index" 2518 + checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" 2519 dependencies = [ 2520 "itoa", 2521 "serde", 2522 + "serde_core", 2523 ] 2524 2525 [[package]] ··· 2633 2634 [[package]] 2635 name = "socket2" 2636 + version = "0.6.1" 2637 source = "registry+https://github.com/rust-lang/crates.io-index" 2638 + checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 2639 dependencies = [ 2640 "libc", 2641 + "windows-sys 0.60.2", 2642 ] 2643 2644 [[package]] ··· 2689 "futures-intrusive", 2690 "futures-io", 2691 "futures-util", 2692 + "hashbrown 0.15.5", 2693 "hashlink", 2694 "indexmap", 2695 "log", ··· 2700 "serde_json", 2701 "sha2", 2702 "smallvec", 2703 + "thiserror 2.0.17", 2704 "tokio", 2705 "tokio-stream", 2706 "tracing", ··· 2717 "quote", 2718 "sqlx-core", 2719 "sqlx-macros-core", 2720 + "syn 2.0.108", 2721 ] 2722 2723 [[package]] ··· 2740 "sqlx-mysql", 2741 "sqlx-postgres", 2742 "sqlx-sqlite", 2743 + "syn 2.0.108", 2744 "tokio", 2745 "url", 2746 ] ··· 2782 "smallvec", 2783 "sqlx-core", 2784 "stringprep", 2785 + "thiserror 2.0.17", 2786 "tracing", 2787 "whoami", 2788 ] ··· 2819 "smallvec", 2820 "sqlx-core", 2821 "stringprep", 2822 + "thiserror 2.0.17", 2823 "tracing", 2824 "whoami", 2825 ] ··· 2843 "serde", 2844 "serde_urlencoded", 2845 "sqlx-core", 2846 + "thiserror 2.0.17", 2847 "tracing", 2848 "url", 2849 ] 2850 2851 [[package]] 2852 name = "stable_deref_trait" 2853 + version = "1.2.1" 2854 source = "registry+https://github.com/rust-lang/crates.io-index" 2855 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 2856 2857 [[package]] 2858 name = "stringprep" ··· 2873 2874 [[package]] 2875 name = "syn" 2876 + version = "1.0.109" 2877 source = "registry+https://github.com/rust-lang/crates.io-index" 2878 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2879 + dependencies = [ 2880 + "proc-macro2", 2881 + "quote", 2882 + "unicode-ident", 2883 + ] 2884 + 2885 + [[package]] 2886 + name = "syn" 2887 + version = "2.0.108" 2888 + source = "registry+https://github.com/rust-lang/crates.io-index" 2889 + checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" 2890 dependencies = [ 2891 "proc-macro2", 2892 "quote", ··· 2910 dependencies = [ 2911 "proc-macro2", 2912 "quote", 2913 + "syn 2.0.108", 2914 ] 2915 2916 [[package]] ··· 2942 2943 [[package]] 2944 name = "tempfile" 2945 + version = "3.23.0" 2946 source = "registry+https://github.com/rust-lang/crates.io-index" 2947 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 2948 dependencies = [ 2949 "fastrand", 2950 + "getrandom 0.3.4", 2951 "once_cell", 2952 "rustix", 2953 + "windows-sys 0.61.2", 2954 ] 2955 2956 [[package]] ··· 2964 2965 [[package]] 2966 name = "thiserror" 2967 + version = "2.0.17" 2968 source = "registry+https://github.com/rust-lang/crates.io-index" 2969 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 2970 dependencies = [ 2971 + "thiserror-impl 2.0.17", 2972 ] 2973 2974 [[package]] ··· 2979 dependencies = [ 2980 "proc-macro2", 2981 "quote", 2982 + "syn 2.0.108", 2983 ] 2984 2985 [[package]] 2986 name = "thiserror-impl" 2987 + version = "2.0.17" 2988 source = "registry+https://github.com/rust-lang/crates.io-index" 2989 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 2990 dependencies = [ 2991 "proc-macro2", 2992 "quote", 2993 + "syn 2.0.108", 2994 ] 2995 2996 [[package]] ··· 3004 3005 [[package]] 3006 name = "tinystr" 3007 + version = "0.8.2" 3008 source = "registry+https://github.com/rust-lang/crates.io-index" 3009 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 3010 dependencies = [ 3011 "displaydoc", 3012 "zerovec", ··· 3029 3030 [[package]] 3031 name = "tokio" 3032 + version = "1.48.0" 3033 source = "registry+https://github.com/rust-lang/crates.io-index" 3034 + checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 3035 dependencies = [ 3036 "bytes", 3037 "libc", 3038 "mio", 3039 "parking_lot", 3040 "pin-project-lite", 3041 "signal-hook-registry", 3042 + "socket2 0.6.1", 3043 "tokio-macros", 3044 + "windows-sys 0.61.2", 3045 ] 3046 3047 [[package]] 3048 name = "tokio-macros" 3049 + version = "2.6.0" 3050 source = "registry+https://github.com/rust-lang/crates.io-index" 3051 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 3052 dependencies = [ 3053 "proc-macro2", 3054 "quote", 3055 + "syn 2.0.108", 3056 ] 3057 3058 [[package]] ··· 3067 3068 [[package]] 3069 name = "tokio-rustls" 3070 + version = "0.26.4" 3071 source = "registry+https://github.com/rust-lang/crates.io-index" 3072 + checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 3073 dependencies = [ 3074 "rustls", 3075 "tokio", ··· 3088 3089 [[package]] 3090 name = "tokio-util" 3091 + version = "0.7.17" 3092 source = "registry+https://github.com/rust-lang/crates.io-index" 3093 + checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" 3094 dependencies = [ 3095 "bytes", 3096 "futures-core", ··· 3198 dependencies = [ 3199 "proc-macro2", 3200 "quote", 3201 + "syn 2.0.108", 3202 ] 3203 3204 [[package]] ··· 3248 3249 [[package]] 3250 name = "typenum" 3251 + version = "1.19.0" 3252 + source = "registry+https://github.com/rust-lang/crates.io-index" 3253 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 3254 + 3255 + [[package]] 3256 + name = "ulid" 3257 + version = "1.2.1" 3258 source = "registry+https://github.com/rust-lang/crates.io-index" 3259 + checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" 3260 + dependencies = [ 3261 + "rand 0.9.2", 3262 + "web-time", 3263 + ] 3264 3265 [[package]] 3266 name = "unicase" ··· 3276 3277 [[package]] 3278 name = "unicode-ident" 3279 + version = "1.0.22" 3280 source = "registry+https://github.com/rust-lang/crates.io-index" 3281 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 3282 3283 [[package]] 3284 name = "unicode-normalization" 3285 + version = "0.1.25" 3286 source = "registry+https://github.com/rust-lang/crates.io-index" 3287 + checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" 3288 dependencies = [ 3289 "tinyvec", 3290 ] 3291 3292 [[package]] 3293 name = "unicode-properties" 3294 + version = "0.1.4" 3295 source = "registry+https://github.com/rust-lang/crates.io-index" 3296 + checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" 3297 3298 [[package]] 3299 name = "unsigned-varint" ··· 3343 source = "registry+https://github.com/rust-lang/crates.io-index" 3344 checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 3345 dependencies = [ 3346 + "getrandom 0.3.4", 3347 "js-sys", 3348 "wasm-bindgen", 3349 ] ··· 3388 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 3389 3390 [[package]] 3391 + name = "wasip2" 3392 + version = "1.0.1+wasi-0.2.4" 3393 source = "registry+https://github.com/rust-lang/crates.io-index" 3394 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 3395 dependencies = [ 3396 "wit-bindgen", 3397 ] ··· 3404 3405 [[package]] 3406 name = "wasm-bindgen" 3407 + version = "0.2.105" 3408 source = "registry+https://github.com/rust-lang/crates.io-index" 3409 + checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" 3410 dependencies = [ 3411 "cfg-if", 3412 "once_cell", ··· 3416 ] 3417 3418 [[package]] 3419 name = "wasm-bindgen-futures" 3420 + version = "0.4.55" 3421 source = "registry+https://github.com/rust-lang/crates.io-index" 3422 + checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" 3423 dependencies = [ 3424 "cfg-if", 3425 "js-sys", ··· 3430 3431 [[package]] 3432 name = "wasm-bindgen-macro" 3433 + version = "0.2.105" 3434 source = "registry+https://github.com/rust-lang/crates.io-index" 3435 + checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" 3436 dependencies = [ 3437 "quote", 3438 "wasm-bindgen-macro-support", ··· 3440 3441 [[package]] 3442 name = "wasm-bindgen-macro-support" 3443 + version = "0.2.105" 3444 source = "registry+https://github.com/rust-lang/crates.io-index" 3445 + checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" 3446 dependencies = [ 3447 + "bumpalo", 3448 "proc-macro2", 3449 "quote", 3450 + "syn 2.0.108", 3451 "wasm-bindgen-shared", 3452 ] 3453 3454 [[package]] 3455 name = "wasm-bindgen-shared" 3456 + version = "0.2.105" 3457 source = "registry+https://github.com/rust-lang/crates.io-index" 3458 + checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" 3459 dependencies = [ 3460 "unicode-ident", 3461 ] 3462 3463 [[package]] 3464 name = "web-sys" 3465 + version = "0.3.82" 3466 source = "registry+https://github.com/rust-lang/crates.io-index" 3467 + checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" 3468 dependencies = [ 3469 "js-sys", 3470 "wasm-bindgen", ··· 3482 3483 [[package]] 3484 name = "webpki-roots" 3485 + version = "1.0.4" 3486 source = "registry+https://github.com/rust-lang/crates.io-index" 3487 + checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" 3488 dependencies = [ 3489 "rustls-pki-types", 3490 ] ··· 3501 3502 [[package]] 3503 name = "widestring" 3504 + version = "1.2.1" 3505 source = "registry+https://github.com/rust-lang/crates.io-index" 3506 + checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" 3507 3508 [[package]] 3509 name = "windows-link" ··· 3512 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 3513 3514 [[package]] 3515 + name = "windows-link" 3516 + version = "0.2.1" 3517 source = "registry+https://github.com/rust-lang/crates.io-index" 3518 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 3519 3520 [[package]] 3521 name = "windows-registry" ··· 3523 source = "registry+https://github.com/rust-lang/crates.io-index" 3524 checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" 3525 dependencies = [ 3526 + "windows-link 0.1.3", 3527 "windows-result", 3528 "windows-strings", 3529 ] ··· 3534 source = "registry+https://github.com/rust-lang/crates.io-index" 3535 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 3536 dependencies = [ 3537 + "windows-link 0.1.3", 3538 ] 3539 3540 [[package]] ··· 3543 source = "registry+https://github.com/rust-lang/crates.io-index" 3544 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 3545 dependencies = [ 3546 + "windows-link 0.1.3", 3547 ] 3548 3549 [[package]] ··· 3566 3567 [[package]] 3568 name = "windows-sys" 3569 + version = "0.60.2" 3570 source = "registry+https://github.com/rust-lang/crates.io-index" 3571 + checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 3572 dependencies = [ 3573 + "windows-targets 0.53.5", 3574 ] 3575 3576 [[package]] 3577 name = "windows-sys" 3578 + version = "0.61.2" 3579 source = "registry+https://github.com/rust-lang/crates.io-index" 3580 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 3581 dependencies = [ 3582 + "windows-link 0.2.1", 3583 ] 3584 3585 [[package]] ··· 3615 3616 [[package]] 3617 name = "windows-targets" 3618 + version = "0.53.5" 3619 source = "registry+https://github.com/rust-lang/crates.io-index" 3620 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 3621 dependencies = [ 3622 + "windows-link 0.2.1", 3623 + "windows_aarch64_gnullvm 0.53.1", 3624 + "windows_aarch64_msvc 0.53.1", 3625 + "windows_i686_gnu 0.53.1", 3626 + "windows_i686_gnullvm 0.53.1", 3627 + "windows_i686_msvc 0.53.1", 3628 + "windows_x86_64_gnu 0.53.1", 3629 + "windows_x86_64_gnullvm 0.53.1", 3630 + "windows_x86_64_msvc 0.53.1", 3631 ] 3632 3633 [[package]] ··· 3644 3645 [[package]] 3646 name = "windows_aarch64_gnullvm" 3647 + version = "0.53.1" 3648 source = "registry+https://github.com/rust-lang/crates.io-index" 3649 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 3650 3651 [[package]] 3652 name = "windows_aarch64_msvc" ··· 3662 3663 [[package]] 3664 name = "windows_aarch64_msvc" 3665 + version = "0.53.1" 3666 source = "registry+https://github.com/rust-lang/crates.io-index" 3667 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 3668 3669 [[package]] 3670 name = "windows_i686_gnu" ··· 3680 3681 [[package]] 3682 name = "windows_i686_gnu" 3683 + version = "0.53.1" 3684 source = "registry+https://github.com/rust-lang/crates.io-index" 3685 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 3686 3687 [[package]] 3688 name = "windows_i686_gnullvm" ··· 3692 3693 [[package]] 3694 name = "windows_i686_gnullvm" 3695 + version = "0.53.1" 3696 source = "registry+https://github.com/rust-lang/crates.io-index" 3697 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 3698 3699 [[package]] 3700 name = "windows_i686_msvc" ··· 3710 3711 [[package]] 3712 name = "windows_i686_msvc" 3713 + version = "0.53.1" 3714 source = "registry+https://github.com/rust-lang/crates.io-index" 3715 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 3716 3717 [[package]] 3718 name = "windows_x86_64_gnu" ··· 3728 3729 [[package]] 3730 name = "windows_x86_64_gnu" 3731 + version = "0.53.1" 3732 source = "registry+https://github.com/rust-lang/crates.io-index" 3733 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 3734 3735 [[package]] 3736 name = "windows_x86_64_gnullvm" ··· 3746 3747 [[package]] 3748 name = "windows_x86_64_gnullvm" 3749 + version = "0.53.1" 3750 source = "registry+https://github.com/rust-lang/crates.io-index" 3751 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 3752 3753 [[package]] 3754 name = "windows_x86_64_msvc" ··· 3764 3765 [[package]] 3766 name = "windows_x86_64_msvc" 3767 + version = "0.53.1" 3768 source = "registry+https://github.com/rust-lang/crates.io-index" 3769 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 3770 3771 [[package]] 3772 name = "winreg" ··· 3780 3781 [[package]] 3782 name = "wit-bindgen" 3783 + version = "0.46.0" 3784 source = "registry+https://github.com/rust-lang/crates.io-index" 3785 + checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 3786 3787 [[package]] 3788 name = "writeable" 3789 + version = "0.6.2" 3790 source = "registry+https://github.com/rust-lang/crates.io-index" 3791 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 3792 3793 [[package]] 3794 name = "yoke" 3795 + version = "0.8.1" 3796 source = "registry+https://github.com/rust-lang/crates.io-index" 3797 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 3798 dependencies = [ 3799 "stable_deref_trait", 3800 "yoke-derive", 3801 "zerofrom", ··· 3803 3804 [[package]] 3805 name = "yoke-derive" 3806 + version = "0.8.1" 3807 source = "registry+https://github.com/rust-lang/crates.io-index" 3808 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 3809 dependencies = [ 3810 "proc-macro2", 3811 "quote", 3812 + "syn 2.0.108", 3813 "synstructure", 3814 ] 3815 3816 [[package]] 3817 name = "zerocopy" 3818 + version = "0.8.27" 3819 source = "registry+https://github.com/rust-lang/crates.io-index" 3820 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 3821 dependencies = [ 3822 "zerocopy-derive", 3823 ] 3824 3825 [[package]] 3826 name = "zerocopy-derive" 3827 + version = "0.8.27" 3828 source = "registry+https://github.com/rust-lang/crates.io-index" 3829 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 3830 dependencies = [ 3831 "proc-macro2", 3832 "quote", 3833 + "syn 2.0.108", 3834 ] 3835 3836 [[package]] ··· 3850 dependencies = [ 3851 "proc-macro2", 3852 "quote", 3853 + "syn 2.0.108", 3854 "synstructure", 3855 ] 3856 3857 [[package]] 3858 name = "zeroize" 3859 + version = "1.8.2" 3860 source = "registry+https://github.com/rust-lang/crates.io-index" 3861 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 3862 3863 [[package]] 3864 name = "zerotrie" 3865 + version = "0.2.3" 3866 source = "registry+https://github.com/rust-lang/crates.io-index" 3867 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 3868 dependencies = [ 3869 "displaydoc", 3870 "yoke", ··· 3873 3874 [[package]] 3875 name = "zerovec" 3876 + version = "0.11.5" 3877 source = "registry+https://github.com/rust-lang/crates.io-index" 3878 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 3879 dependencies = [ 3880 "yoke", 3881 "zerofrom", ··· 3884 3885 [[package]] 3886 name = "zerovec-derive" 3887 + version = "0.11.2" 3888 source = "registry+https://github.com/rust-lang/crates.io-index" 3889 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 3890 dependencies = [ 3891 "proc-macro2", 3892 "quote", 3893 + "syn 2.0.108", 3894 ] 3895 3896 [[package]]
+6 -5
Cargo.toml
··· 16 [dependencies] 17 anyhow = "1.0" 18 async-trait = "0.1" 19 - atproto-identity = { version = "0.11.3" } 20 - atproto-jetstream = { version = "0.11.3" } 21 axum = { version = "0.8" } 22 - bincode = { version = "2.0.1", features = ["serde"] } 23 - cadence = "1.6.0" 24 deadpool-redis = { version = "0.22", features = ["connection-manager", "tokio-comp", "tokio-rustls-comp"] } 25 httpdate = "1.0" 26 - metrohash = "1.0.7" 27 reqwest = { version = "0.12", features = ["json"] } 28 serde = { version = "1.0", features = ["derive"] } 29 serde_json = "1.0"
··· 16 [dependencies] 17 anyhow = "1.0" 18 async-trait = "0.1" 19 + atproto-identity = { git = "https://tangled.org/@smokesignal.events/atproto-identity-rs" } 20 + atproto-jetstream = { git = "https://tangled.org/@smokesignal.events/atproto-identity-rs" } 21 + atproto-lexicon = { git = "https://tangled.org/@smokesignal.events/atproto-identity-rs" } 22 axum = { version = "0.8" } 23 + bincode = { version = "2.0", features = ["serde"] } 24 + cadence = "1.6" 25 deadpool-redis = { version = "0.22", features = ["connection-manager", "tokio-comp", "tokio-rustls-comp"] } 26 httpdate = "1.0" 27 + metrohash = "1.0" 28 reqwest = { version = "0.12", features = ["json"] } 29 serde = { version = "1.0", features = ["derive"] } 30 serde_json = "1.0"
+32 -3
src/bin/quickdid.rs
··· 4 resolve::HickoryDnsResolver, 5 }; 6 use atproto_jetstream::{Consumer as JetstreamConsumer, ConsumerTaskConfig}; 7 use quickdid::{ 8 cache::create_redis_pool, 9 config::Config, ··· 15 handle_resolver_task::{HandleResolverTaskConfig, create_handle_resolver_task_with_config}, 16 http::{AppContext, create_router}, 17 jetstream_handler::QuickDidEventHandler, 18 metrics::create_metrics_publisher, 19 queue::{ 20 HandleResolutionWork, QueueAdapter, create_mpsc_queue_from_channel, create_noop_queue, ··· 230 // Create DNS resolver 231 let dns_resolver = HickoryDnsResolver::create_resolver(dns_nameservers.as_ref()); 232 233 - // Create DNS resolver Arc for sharing 234 let dns_resolver_arc = Arc::new(dns_resolver); 235 236 // Create metrics publisher based on configuration ··· 412 let (mut handle_resolver, cache_ttl): ( 413 Arc<dyn quickdid::handle_resolver::HandleResolver>, 414 u64, 415 - ) = if let Some(pool) = redis_pool { 416 tracing::info!( 417 "Using Redis-backed handle resolver with {}-second cache TTL", 418 config.cache_ttl_redis ··· 420 ( 421 create_redis_resolver_with_ttl( 422 base_handle_resolver, 423 - pool, 424 config.cache_ttl_redis, 425 metrics_publisher.clone(), 426 ), ··· 475 ); 476 } 477 478 // Setup background handle resolution task 479 { 480 let adapter_for_task = handle_queue.clone(); ··· 531 let app_context = AppContext::new( 532 handle_resolver.clone(), 533 handle_queue, 534 metrics_publisher.clone(), 535 config.etag_seed.clone(), 536 config.cache_control_header.clone(),
··· 4 resolve::HickoryDnsResolver, 5 }; 6 use atproto_jetstream::{Consumer as JetstreamConsumer, ConsumerTaskConfig}; 7 + use atproto_lexicon::resolve::{DefaultLexiconResolver, LexiconResolver}; 8 use quickdid::{ 9 cache::create_redis_pool, 10 config::Config, ··· 16 handle_resolver_task::{HandleResolverTaskConfig, create_handle_resolver_task_with_config}, 17 http::{AppContext, create_router}, 18 jetstream_handler::QuickDidEventHandler, 19 + lexicon_resolver::create_redis_lexicon_resolver_with_ttl, 20 metrics::create_metrics_publisher, 21 queue::{ 22 HandleResolutionWork, QueueAdapter, create_mpsc_queue_from_channel, create_noop_queue, ··· 232 // Create DNS resolver 233 let dns_resolver = HickoryDnsResolver::create_resolver(dns_nameservers.as_ref()); 234 235 + // Clone DNS resolver for lexicon resolution before wrapping in Arc 236 + let lexicon_dns_resolver = dns_resolver.clone(); 237 + 238 + // Wrap DNS resolver in Arc for handle resolution 239 let dns_resolver_arc = Arc::new(dns_resolver); 240 241 // Create metrics publisher based on configuration ··· 417 let (mut handle_resolver, cache_ttl): ( 418 Arc<dyn quickdid::handle_resolver::HandleResolver>, 419 u64, 420 + ) = if let Some(ref pool) = redis_pool { 421 tracing::info!( 422 "Using Redis-backed handle resolver with {}-second cache TTL", 423 config.cache_ttl_redis ··· 425 ( 426 create_redis_resolver_with_ttl( 427 base_handle_resolver, 428 + pool.clone(), 429 config.cache_ttl_redis, 430 metrics_publisher.clone(), 431 ), ··· 480 ); 481 } 482 483 + // Create lexicon resolver with Redis caching if available 484 + let lexicon_resolver: Arc<dyn LexiconResolver> = { 485 + let base_lexicon_resolver: Arc<dyn LexiconResolver> = Arc::new( 486 + DefaultLexiconResolver::new(http_client.clone(), lexicon_dns_resolver), 487 + ); 488 + 489 + if let Some(ref pool) = redis_pool { 490 + tracing::info!( 491 + "Using Redis-backed lexicon resolver with {}-second cache TTL", 492 + config.cache_ttl_redis 493 + ); 494 + create_redis_lexicon_resolver_with_ttl( 495 + base_lexicon_resolver, 496 + pool.clone(), 497 + config.cache_ttl_redis, 498 + metrics_publisher.clone(), 499 + ) 500 + } else { 501 + tracing::info!("Using base lexicon resolver without caching"); 502 + base_lexicon_resolver 503 + } 504 + }; 505 + 506 // Setup background handle resolution task 507 { 508 let adapter_for_task = handle_queue.clone(); ··· 559 let app_context = AppContext::new( 560 handle_resolver.clone(), 561 handle_queue, 562 + lexicon_resolver, 563 metrics_publisher.clone(), 564 config.etag_seed.clone(), 565 config.cache_control_header.clone(),
+126
src/http/handle_xrpc_resolve_lexicon.rs
···
··· 1 + use std::sync::Arc; 2 + 3 + use atproto_lexicon::resolve::LexiconResolver; 4 + use axum::{ 5 + extract::{Query, State}, 6 + http::{HeaderMap, HeaderValue, StatusCode, header}, 7 + response::{IntoResponse, Json}, 8 + }; 9 + use serde::{Deserialize, Serialize}; 10 + 11 + use crate::metrics::SharedMetricsPublisher; 12 + 13 + #[derive(Deserialize)] 14 + pub(super) struct ResolveLexiconParams { 15 + nsid: Option<String>, 16 + } 17 + 18 + #[derive(Serialize)] 19 + pub(super) struct ErrorResponse { 20 + error: String, 21 + message: String, 22 + } 23 + 24 + pub(super) async fn handle_xrpc_resolve_lexicon( 25 + Query(params): Query<ResolveLexiconParams>, 26 + State(lexicon_resolver): State<Arc<dyn LexiconResolver>>, 27 + State(metrics): State<SharedMetricsPublisher>, 28 + ) -> impl IntoResponse { 29 + // Validate that nsid is provided 30 + let nsid = match params.nsid { 31 + Some(n) => n, 32 + None => { 33 + metrics 34 + .incr_with_tags( 35 + "xrpc.com.atproto.lexicon.resolveLexicon.invalid_nsid", 36 + &[("reason", "missing")], 37 + ) 38 + .await; 39 + return ( 40 + StatusCode::BAD_REQUEST, 41 + Json(ErrorResponse { 42 + error: "InvalidRequest".to_string(), 43 + message: "Error: Params must have the property \"nsid\"".to_string(), 44 + }), 45 + ) 46 + .into_response(); 47 + } 48 + }; 49 + 50 + tracing::debug!(nsid, "Resolving lexicon"); 51 + 52 + // Perform the lexicon resolution 53 + match lexicon_resolver.resolve(&nsid).await { 54 + Ok(resolved) => { 55 + tracing::debug!(nsid, "Successfully resolved lexicon"); 56 + 57 + metrics 58 + .incr_with_tags("lexicon.resolution.request", &[("success", "1")]) 59 + .await; 60 + 61 + let mut headers = HeaderMap::new(); 62 + add_cors_headers(&mut headers); 63 + 64 + // The resolved value is already a serde_json::Value, so just return it as JSON 65 + (StatusCode::OK, headers, Json(resolved)).into_response() 66 + } 67 + Err(err) => { 68 + tracing::debug!(error = ?err, nsid, "Error resolving lexicon"); 69 + 70 + metrics 71 + .incr_with_tags("lexicon.resolution.request", &[("success", "0")]) 72 + .await; 73 + 74 + let mut headers = HeaderMap::new(); 75 + add_cors_headers(&mut headers); 76 + 77 + ( 78 + StatusCode::BAD_REQUEST, 79 + headers, 80 + Json(ErrorResponse { 81 + error: "LexiconNotFound".to_string(), 82 + message: "No lexicon was resolved for the NSID".to_string(), 83 + }), 84 + ) 85 + .into_response() 86 + } 87 + } 88 + } 89 + 90 + pub(super) async fn handle_xrpc_resolve_lexicon_options() -> impl IntoResponse { 91 + let mut headers = HeaderMap::new(); 92 + add_cors_headers(&mut headers); 93 + (StatusCode::NO_CONTENT, headers) 94 + } 95 + 96 + fn add_cors_headers(headers: &mut HeaderMap) { 97 + headers.insert("Allow", HeaderValue::from_static("GET, HEAD, OPTIONS")); 98 + headers.insert( 99 + header::ACCESS_CONTROL_ALLOW_HEADERS, 100 + HeaderValue::from_static("*"), 101 + ); 102 + headers.insert( 103 + header::ACCESS_CONTROL_ALLOW_METHODS, 104 + HeaderValue::from_static("GET, HEAD, OPTIONS"), 105 + ); 106 + headers.insert( 107 + header::ACCESS_CONTROL_ALLOW_ORIGIN, 108 + HeaderValue::from_static("*"), 109 + ); 110 + headers.insert( 111 + header::ACCESS_CONTROL_EXPOSE_HEADERS, 112 + HeaderValue::from_static("*"), 113 + ); 114 + headers.insert( 115 + header::ACCESS_CONTROL_MAX_AGE, 116 + HeaderValue::from_static("86400"), 117 + ); 118 + headers.insert( 119 + "Access-Control-Request-Headers", 120 + HeaderValue::from_static("*"), 121 + ); 122 + headers.insert( 123 + "Access-Control-Request-Method", 124 + HeaderValue::from_static("GET"), 125 + ); 126 + }
+1
src/http/mod.rs
··· 1 mod handle_xrpc_resolve_handle; // Internal handler 2 mod server; // Internal server module 3 4 // Re-export only what the binary needs
··· 1 mod handle_xrpc_resolve_handle; // Internal handler 2 + mod handle_xrpc_resolve_lexicon; // Internal handler 3 mod server; // Internal server module 4 5 // Re-export only what the binary needs
+10
src/http/server.rs
··· 1 use crate::handle_resolver::HandleResolver; 2 use crate::metrics::SharedMetricsPublisher; 3 use crate::queue::{HandleResolutionWork, QueueAdapter}; 4 use axum::{ 5 Router, 6 extract::{MatchedPath, State}, ··· 17 pub(crate) struct InnerAppContext { 18 pub(crate) handle_resolver: Arc<dyn HandleResolver>, 19 pub(crate) handle_queue: Arc<dyn QueueAdapter<HandleResolutionWork>>, 20 pub(crate) metrics: SharedMetricsPublisher, 21 pub(crate) etag_seed: String, 22 pub(crate) cache_control_header: Option<String>, ··· 31 pub fn new( 32 handle_resolver: Arc<dyn HandleResolver>, 33 handle_queue: Arc<dyn QueueAdapter<HandleResolutionWork>>, 34 metrics: SharedMetricsPublisher, 35 etag_seed: String, 36 cache_control_header: Option<String>, ··· 39 Self(Arc::new(InnerAppContext { 40 handle_resolver, 41 handle_queue, 42 metrics, 43 etag_seed, 44 cache_control_header, ··· 78 handle_queue, 79 Arc<dyn QueueAdapter<HandleResolutionWork>> 80 ); 81 impl_from_ref!(AppContext, metrics, SharedMetricsPublisher); 82 83 /// Middleware to track HTTP request metrics ··· 126 "/xrpc/com.atproto.identity.resolveHandle", 127 get(super::handle_xrpc_resolve_handle::handle_xrpc_resolve_handle) 128 .options(super::handle_xrpc_resolve_handle::handle_xrpc_resolve_handle_options), 129 ) 130 .fallback_service(ServeDir::new(static_dir)) 131 .layer(middleware::from_fn_with_state(
··· 1 use crate::handle_resolver::HandleResolver; 2 use crate::metrics::SharedMetricsPublisher; 3 use crate::queue::{HandleResolutionWork, QueueAdapter}; 4 + use atproto_lexicon::resolve::LexiconResolver; 5 use axum::{ 6 Router, 7 extract::{MatchedPath, State}, ··· 18 pub(crate) struct InnerAppContext { 19 pub(crate) handle_resolver: Arc<dyn HandleResolver>, 20 pub(crate) handle_queue: Arc<dyn QueueAdapter<HandleResolutionWork>>, 21 + pub(crate) lexicon_resolver: Arc<dyn LexiconResolver>, 22 pub(crate) metrics: SharedMetricsPublisher, 23 pub(crate) etag_seed: String, 24 pub(crate) cache_control_header: Option<String>, ··· 33 pub fn new( 34 handle_resolver: Arc<dyn HandleResolver>, 35 handle_queue: Arc<dyn QueueAdapter<HandleResolutionWork>>, 36 + lexicon_resolver: Arc<dyn LexiconResolver>, 37 metrics: SharedMetricsPublisher, 38 etag_seed: String, 39 cache_control_header: Option<String>, ··· 42 Self(Arc::new(InnerAppContext { 43 handle_resolver, 44 handle_queue, 45 + lexicon_resolver, 46 metrics, 47 etag_seed, 48 cache_control_header, ··· 82 handle_queue, 83 Arc<dyn QueueAdapter<HandleResolutionWork>> 84 ); 85 + impl_from_ref!(AppContext, lexicon_resolver, Arc<dyn LexiconResolver>); 86 impl_from_ref!(AppContext, metrics, SharedMetricsPublisher); 87 88 /// Middleware to track HTTP request metrics ··· 131 "/xrpc/com.atproto.identity.resolveHandle", 132 get(super::handle_xrpc_resolve_handle::handle_xrpc_resolve_handle) 133 .options(super::handle_xrpc_resolve_handle::handle_xrpc_resolve_handle_options), 134 + ) 135 + .route( 136 + "/xrpc/com.atproto.lexicon.resolveLexicon", 137 + get(super::handle_xrpc_resolve_lexicon::handle_xrpc_resolve_lexicon) 138 + .options(super::handle_xrpc_resolve_lexicon::handle_xrpc_resolve_lexicon_options), 139 ) 140 .fallback_service(ServeDir::new(static_dir)) 141 .layer(middleware::from_fn_with_state(
+3 -3
src/jetstream_handler.rs
··· 207 did: "did:plc:test123".to_string(), 208 kind: "deleted".to_string(), 209 time_us: 0, 210 - identity: json!(null), 211 }; 212 213 handler.handle_event(event).await.unwrap(); ··· 229 did: "did:plc:test456".to_string(), 230 kind: "deactivated".to_string(), 231 time_us: 0, 232 - identity: json!(null), 233 }; 234 235 handler.handle_event(event).await.unwrap(); ··· 251 did: "did:plc:test789".to_string(), 252 kind: "active".to_string(), 253 time_us: 0, 254 - identity: json!(null), 255 }; 256 257 handler.handle_event(event).await.unwrap();
··· 207 did: "did:plc:test123".to_string(), 208 kind: "deleted".to_string(), 209 time_us: 0, 210 + account: json!(null), 211 }; 212 213 handler.handle_event(event).await.unwrap(); ··· 229 did: "did:plc:test456".to_string(), 230 kind: "deactivated".to_string(), 231 time_us: 0, 232 + account: json!(null), 233 }; 234 235 handler.handle_event(event).await.unwrap(); ··· 251 did: "did:plc:test789".to_string(), 252 kind: "active".to_string(), 253 time_us: 0, 254 + account: json!(null), 255 }; 256 257 handler.handle_event(event).await.unwrap();
+8
src/lexicon_resolver/mod.rs
···
··· 1 + //! Lexicon resolution with caching support. 2 + //! 3 + //! This module provides implementations for resolving AT Protocol lexicons (NSIDs) 4 + //! to their schemas with various caching strategies. 5 + 6 + mod redis; 7 + 8 + pub use redis::{create_redis_lexicon_resolver, create_redis_lexicon_resolver_with_ttl};
+458
src/lexicon_resolver/redis.rs
···
··· 1 + //! Redis-backed caching lexicon resolver. 2 + //! 3 + //! This module provides a lexicon resolver that caches resolution results in Redis 4 + //! with configurable expiration times. Redis caching provides persistence across 5 + //! service restarts and allows sharing of cached results across multiple instances. 6 + 7 + use crate::metrics::SharedMetricsPublisher; 8 + use async_trait::async_trait; 9 + use atproto_lexicon::resolve::LexiconResolver; 10 + use deadpool_redis::{Pool as RedisPool, redis::AsyncCommands}; 11 + use metrohash::MetroHash64; 12 + use std::hash::Hasher as _; 13 + use std::sync::Arc; 14 + 15 + /// Redis-backed caching lexicon resolver. 16 + /// 17 + /// This resolver caches lexicon resolution results in Redis with a configurable TTL. 18 + /// Results are stored as JSON bytes to minimize storage overhead while maintaining 19 + /// the schema structure. 20 + /// 21 + /// # Features 22 + /// 23 + /// - Persistent caching across service restarts 24 + /// - Shared cache across multiple service instances 25 + /// - Configurable TTL (default: 90 days) 26 + /// - JSON storage format for lexicon schemas 27 + /// - Graceful fallback if Redis is unavailable 28 + /// 29 + /// # Example 30 + /// 31 + /// ```no_run 32 + /// use std::sync::Arc; 33 + /// use deadpool_redis::Pool; 34 + /// use atproto_lexicon::resolve::LexiconResolver; 35 + /// use quickdid::lexicon_resolver::create_redis_lexicon_resolver; 36 + /// use quickdid::metrics::NoOpMetricsPublisher; 37 + /// 38 + /// # async fn example() { 39 + /// # let inner_resolver: Arc<dyn LexiconResolver> = todo!(); 40 + /// # let redis_pool: Pool = todo!(); 41 + /// # let metrics = Arc::new(NoOpMetricsPublisher); 42 + /// // Create with default 90-day TTL 43 + /// let resolver = create_redis_lexicon_resolver( 44 + /// inner_resolver, 45 + /// redis_pool, 46 + /// metrics 47 + /// ); 48 + /// # } 49 + /// ``` 50 + pub(super) struct RedisLexiconResolver { 51 + /// Base lexicon resolver to perform actual resolution 52 + inner: Arc<dyn LexiconResolver>, 53 + /// Redis connection pool 54 + pool: RedisPool, 55 + /// Redis key prefix for lexicon resolution cache 56 + key_prefix: String, 57 + /// TTL for cache entries in seconds 58 + ttl_seconds: u64, 59 + /// Metrics publisher for telemetry 60 + metrics: SharedMetricsPublisher, 61 + } 62 + 63 + impl RedisLexiconResolver { 64 + /// Create a new Redis-backed lexicon resolver with default 90-day TTL. 65 + fn new( 66 + inner: Arc<dyn LexiconResolver>, 67 + pool: RedisPool, 68 + metrics: SharedMetricsPublisher, 69 + ) -> Self { 70 + Self::with_ttl(inner, pool, 90 * 24 * 60 * 60, metrics) // 90 days default 71 + } 72 + 73 + /// Create a new Redis-backed lexicon resolver with custom TTL. 74 + fn with_ttl( 75 + inner: Arc<dyn LexiconResolver>, 76 + pool: RedisPool, 77 + ttl_seconds: u64, 78 + metrics: SharedMetricsPublisher, 79 + ) -> Self { 80 + Self::with_full_config(inner, pool, "lexicon:".to_string(), ttl_seconds, metrics) 81 + } 82 + 83 + /// Create a new Redis-backed lexicon resolver with full configuration. 84 + fn with_full_config( 85 + inner: Arc<dyn LexiconResolver>, 86 + pool: RedisPool, 87 + key_prefix: String, 88 + ttl_seconds: u64, 89 + metrics: SharedMetricsPublisher, 90 + ) -> Self { 91 + Self { 92 + inner, 93 + pool, 94 + key_prefix, 95 + ttl_seconds, 96 + metrics, 97 + } 98 + } 99 + 100 + /// Generate the Redis key for an NSID. 101 + /// 102 + /// Uses MetroHash64 to generate a consistent hash of the NSID 103 + /// for use as the Redis key. This provides better key distribution 104 + /// and avoids issues with special characters in NSIDs. 105 + fn make_key(&self, nsid: &str) -> String { 106 + let mut h = MetroHash64::default(); 107 + h.write(nsid.as_bytes()); 108 + format!("{}{}", self.key_prefix, h.finish()) 109 + } 110 + 111 + /// Get the TTL in seconds. 112 + fn ttl_seconds(&self) -> u64 { 113 + self.ttl_seconds 114 + } 115 + } 116 + 117 + #[async_trait] 118 + impl LexiconResolver for RedisLexiconResolver { 119 + async fn resolve(&self, nsid: &str) -> Result<serde_json::Value, anyhow::Error> { 120 + let key = self.make_key(nsid); 121 + 122 + // Try to get from Redis cache first 123 + match self.pool.get().await { 124 + Ok(mut conn) => { 125 + // Check if the key exists in Redis (stored as JSON bytes) 126 + let cached: Option<Vec<u8>> = match conn.get(&key).await { 127 + Ok(value) => value, 128 + Err(e) => { 129 + self.metrics.incr("lexicon_resolver.redis.get_error").await; 130 + tracing::warn!("Failed to get NSID from Redis cache: {}", e); 131 + None 132 + } 133 + }; 134 + 135 + if let Some(cached_bytes) = cached { 136 + // Deserialize the cached JSON 137 + match serde_json::from_slice::<serde_json::Value>(&cached_bytes) { 138 + Ok(cached_value) => { 139 + tracing::debug!("Cache hit for NSID {}", nsid); 140 + self.metrics.incr("lexicon_resolver.redis.cache_hit").await; 141 + return Ok(cached_value); 142 + } 143 + Err(e) => { 144 + tracing::warn!( 145 + "Failed to deserialize cached lexicon for NSID {}: {}", 146 + nsid, 147 + e 148 + ); 149 + self.metrics 150 + .incr("lexicon_resolver.redis.deserialize_error") 151 + .await; 152 + // Fall through to re-resolve if deserialization fails 153 + } 154 + } 155 + } 156 + 157 + // Not in cache, resolve through inner resolver 158 + tracing::debug!("Cache miss for NSID {}, resolving...", nsid); 159 + self.metrics.incr("lexicon_resolver.redis.cache_miss").await; 160 + let result = self.inner.resolve(nsid).await; 161 + 162 + // Cache successful result 163 + if let Ok(ref schema) = result { 164 + // Serialize to JSON bytes 165 + match serde_json::to_vec(schema) { 166 + Ok(bytes) => { 167 + // Set with expiration (ignore errors to not fail the resolution) 168 + if let Err(e) = conn 169 + .set_ex::<_, _, ()>(&key, bytes, self.ttl_seconds()) 170 + .await 171 + { 172 + tracing::warn!( 173 + "Failed to cache lexicon resolution in Redis: {}", 174 + e 175 + ); 176 + self.metrics 177 + .incr("lexicon_resolver.redis.cache_set_error") 178 + .await; 179 + } else { 180 + tracing::debug!("Cached lexicon for NSID {}", nsid); 181 + self.metrics.incr("lexicon_resolver.redis.cache_set").await; 182 + } 183 + } 184 + Err(e) => { 185 + tracing::warn!( 186 + "Failed to serialize lexicon result for NSID {}: {}", 187 + nsid, 188 + e 189 + ); 190 + self.metrics 191 + .incr("lexicon_resolver.redis.serialize_error") 192 + .await; 193 + } 194 + } 195 + } 196 + 197 + result 198 + } 199 + Err(e) => { 200 + // Redis connection failed, fall back to inner resolver 201 + tracing::warn!( 202 + "Failed to get Redis connection, falling back to uncached resolution: {}", 203 + e 204 + ); 205 + self.metrics 206 + .incr("lexicon_resolver.redis.connection_error") 207 + .await; 208 + self.inner.resolve(nsid).await 209 + } 210 + } 211 + } 212 + } 213 + 214 + /// Create a new Redis-backed lexicon resolver with default 90-day TTL. 215 + /// 216 + /// # Arguments 217 + /// 218 + /// * `inner` - The underlying resolver to use for actual resolution 219 + /// * `pool` - Redis connection pool 220 + /// * `metrics` - Metrics publisher for telemetry 221 + /// 222 + /// # Example 223 + /// 224 + /// ```no_run 225 + /// use std::sync::Arc; 226 + /// use atproto_lexicon::resolve::{DefaultLexiconResolver, LexiconResolver}; 227 + /// use quickdid::lexicon_resolver::create_redis_lexicon_resolver; 228 + /// use quickdid::cache::create_redis_pool; 229 + /// use quickdid::metrics::NoOpMetricsPublisher; 230 + /// 231 + /// # async fn example() -> anyhow::Result<()> { 232 + /// # use atproto_identity::resolve::HickoryDnsResolver; 233 + /// # use reqwest::Client; 234 + /// # let dns_resolver = HickoryDnsResolver::create_resolver(&[]); 235 + /// # let http_client = Client::new(); 236 + /// # let metrics = Arc::new(NoOpMetricsPublisher); 237 + /// let base: Arc<dyn LexiconResolver> = Arc::new( 238 + /// DefaultLexiconResolver::new(http_client, dns_resolver) 239 + /// ); 240 + /// 241 + /// let pool = create_redis_pool("redis://localhost:6379")?; 242 + /// let resolver = create_redis_lexicon_resolver(base, pool, metrics); 243 + /// let schema = resolver.resolve("app.bsky.feed.post").await.unwrap(); 244 + /// # Ok(()) 245 + /// # } 246 + /// ``` 247 + pub fn create_redis_lexicon_resolver( 248 + inner: Arc<dyn LexiconResolver>, 249 + pool: RedisPool, 250 + metrics: SharedMetricsPublisher, 251 + ) -> Arc<dyn LexiconResolver> { 252 + Arc::new(RedisLexiconResolver::new(inner, pool, metrics)) 253 + } 254 + 255 + /// Create a new Redis-backed lexicon resolver with custom TTL. 256 + /// 257 + /// # Arguments 258 + /// 259 + /// * `inner` - The underlying resolver to use for actual resolution 260 + /// * `pool` - Redis connection pool 261 + /// * `ttl_seconds` - TTL for cache entries in seconds 262 + /// * `metrics` - Metrics publisher for telemetry 263 + pub fn create_redis_lexicon_resolver_with_ttl( 264 + inner: Arc<dyn LexiconResolver>, 265 + pool: RedisPool, 266 + ttl_seconds: u64, 267 + metrics: SharedMetricsPublisher, 268 + ) -> Arc<dyn LexiconResolver> { 269 + Arc::new(RedisLexiconResolver::with_ttl( 270 + inner, 271 + pool, 272 + ttl_seconds, 273 + metrics, 274 + )) 275 + } 276 + 277 + #[cfg(test)] 278 + mod tests { 279 + use super::*; 280 + 281 + // Mock lexicon resolver for testing 282 + #[derive(Clone)] 283 + struct MockLexiconResolver { 284 + should_fail: bool, 285 + expected_schema: serde_json::Value, 286 + } 287 + 288 + #[async_trait] 289 + impl LexiconResolver for MockLexiconResolver { 290 + async fn resolve(&self, _nsid: &str) -> Result<serde_json::Value, anyhow::Error> { 291 + if self.should_fail { 292 + Err(anyhow::anyhow!("Mock resolution failure")) 293 + } else { 294 + Ok(self.expected_schema.clone()) 295 + } 296 + } 297 + } 298 + 299 + #[tokio::test] 300 + async fn test_redis_lexicon_resolver_cache_hit() { 301 + let pool = match crate::test_helpers::get_test_redis_pool() { 302 + Some(p) => p, 303 + None => return, 304 + }; 305 + 306 + // Create mock resolver with sample schema 307 + let schema = serde_json::json!({ 308 + "lexicon": 1, 309 + "id": "app.bsky.feed.post", 310 + "defs": { 311 + "main": { 312 + "type": "record", 313 + "description": "A post record" 314 + } 315 + } 316 + }); 317 + 318 + let mock_resolver = Arc::new(MockLexiconResolver { 319 + should_fail: false, 320 + expected_schema: schema.clone(), 321 + }); 322 + 323 + // Create metrics publisher 324 + let metrics = Arc::new(crate::metrics::NoOpMetricsPublisher); 325 + 326 + // Create Redis-backed resolver with a unique key prefix for testing 327 + let test_prefix = format!( 328 + "test:lexicon:{}:", 329 + std::time::SystemTime::now() 330 + .duration_since(std::time::UNIX_EPOCH) 331 + .unwrap() 332 + .as_nanos() 333 + ); 334 + let redis_resolver = RedisLexiconResolver::with_full_config( 335 + mock_resolver, 336 + pool.clone(), 337 + test_prefix.clone(), 338 + 3600, 339 + metrics, 340 + ); 341 + 342 + let test_nsid = "app.bsky.feed.post"; 343 + 344 + // First resolution - should call inner resolver 345 + let result1 = redis_resolver.resolve(test_nsid).await.unwrap(); 346 + assert_eq!(result1, schema); 347 + 348 + // Second resolution - should hit cache 349 + let result2 = redis_resolver.resolve(test_nsid).await.unwrap(); 350 + assert_eq!(result2, schema); 351 + 352 + // Clean up test data 353 + if let Ok(mut conn) = pool.get().await { 354 + let mut h = MetroHash64::default(); 355 + h.write(test_nsid.as_bytes()); 356 + let key = format!("{}{}", test_prefix, h.finish()); 357 + let _: Result<(), _> = conn.del(key).await; 358 + } 359 + } 360 + 361 + #[tokio::test] 362 + async fn test_redis_lexicon_resolver_cache_miss() { 363 + let pool = match crate::test_helpers::get_test_redis_pool() { 364 + Some(p) => p, 365 + None => return, 366 + }; 367 + 368 + let schema = serde_json::json!({ 369 + "lexicon": 1, 370 + "id": "com.example.test", 371 + }); 372 + 373 + let mock_resolver = Arc::new(MockLexiconResolver { 374 + should_fail: false, 375 + expected_schema: schema.clone(), 376 + }); 377 + 378 + let metrics = Arc::new(crate::metrics::NoOpMetricsPublisher); 379 + 380 + let test_prefix = format!( 381 + "test:lexicon:{}:", 382 + std::time::SystemTime::now() 383 + .duration_since(std::time::UNIX_EPOCH) 384 + .unwrap() 385 + .as_nanos() 386 + ); 387 + let redis_resolver = RedisLexiconResolver::with_full_config( 388 + mock_resolver, 389 + pool.clone(), 390 + test_prefix.clone(), 391 + 3600, 392 + metrics, 393 + ); 394 + 395 + let test_nsid = "com.example.test"; 396 + 397 + // Ensure key doesn't exist 398 + if let Ok(mut conn) = pool.get().await { 399 + let mut h = MetroHash64::default(); 400 + h.write(test_nsid.as_bytes()); 401 + let key = format!("{}{}", test_prefix, h.finish()); 402 + let _: Result<(), _> = conn.del(&key).await; 403 + } 404 + 405 + // Resolution should succeed and cache the result 406 + let result = redis_resolver.resolve(test_nsid).await.unwrap(); 407 + assert_eq!(result, schema); 408 + 409 + // Verify the result was cached 410 + if let Ok(mut conn) = pool.get().await { 411 + let mut h = MetroHash64::default(); 412 + h.write(test_nsid.as_bytes()); 413 + let key = format!("{}{}", test_prefix, h.finish()); 414 + let exists: bool = conn.exists(&key).await.unwrap(); 415 + assert!(exists, "Result should be cached"); 416 + 417 + // Clean up 418 + let _: Result<(), _> = conn.del(key).await; 419 + } 420 + } 421 + 422 + #[tokio::test] 423 + async fn test_redis_lexicon_resolver_error_handling() { 424 + let pool = match crate::test_helpers::get_test_redis_pool() { 425 + Some(p) => p, 426 + None => return, 427 + }; 428 + 429 + // Create mock resolver that fails 430 + let mock_resolver = Arc::new(MockLexiconResolver { 431 + should_fail: true, 432 + expected_schema: serde_json::Value::Null, 433 + }); 434 + 435 + let metrics = Arc::new(crate::metrics::NoOpMetricsPublisher); 436 + 437 + let test_prefix = format!( 438 + "test:lexicon:{}:", 439 + std::time::SystemTime::now() 440 + .duration_since(std::time::UNIX_EPOCH) 441 + .unwrap() 442 + .as_nanos() 443 + ); 444 + let redis_resolver = RedisLexiconResolver::with_full_config( 445 + mock_resolver, 446 + pool.clone(), 447 + test_prefix, 448 + 3600, 449 + metrics, 450 + ); 451 + 452 + let test_nsid = "com.example.nonexistent"; 453 + 454 + // Resolution should fail 455 + let result = redis_resolver.resolve(test_nsid).await; 456 + assert!(result.is_err()); 457 + } 458 + }
+1
src/lib.rs
··· 3 pub mod handle_resolver; // Only traits and factory functions exposed 4 pub mod http; // Only create_router exposed 5 pub mod jetstream_handler; // Jetstream event handler for AT Protocol events 6 7 // Semi-public modules - needed by binary but with limited exposure 8 pub mod cache; // Only create_redis_pool exposed
··· 3 pub mod handle_resolver; // Only traits and factory functions exposed 4 pub mod http; // Only create_router exposed 5 pub mod jetstream_handler; // Jetstream event handler for AT Protocol events 6 + pub mod lexicon_resolver; // Lexicon resolution with caching support 7 8 // Semi-public modules - needed by binary but with limited exposure 9 pub mod cache; // Only create_redis_pool exposed
+87 -31
www/index.html
··· 35 <!-- Stylesheet --> 36 <link rel="stylesheet" href="/css/pico.classless.green.min.css"> 37 <style> 38 - #resolveForm { 39 margin: 2rem 0; 40 padding: 1.5rem; 41 background: var(--card-background-color); ··· 43 border: 1px solid var(--muted-border-color); 44 } 45 46 - #result { 47 - margin-top: 2rem; 48 padding: 1.5rem; 49 background: var(--code-background-color); 50 border-radius: var(--border-radius); 51 border: 1px solid var(--muted-border-color); 52 } 53 54 - #resultContent { 55 background: transparent; 56 padding: 1rem; 57 overflow-x: auto; ··· 75 font-weight: bold; 76 margin-right: 0.5rem; 77 } 78 </style> 79 </head> 80 ··· 86 </hgroup> 87 </header> 88 <main> 89 - <p>QuickDID is a high-performance handle-to-DID resolution service for the AT Protocol ecosystem.</p> 90 91 <h2>Available Endpoints</h2> 92 93 - <h3>GET /xrpc/com.atproto.identity.resolveHandle</h3> 94 - <p>Resolve an AT Protocol handle to its DID</p> 95 - <p>Parameters: <code>?handle={handle}</code></p> 96 97 - <h2>Try It Out</h2> 98 - <form id="resolveForm"> 99 - <label for="handle"> 100 - Enter an AT Protocol handle to resolve: 101 - <input type="text" id="handle" name="handle" placeholder="e.g., alice.bsky.social" required> 102 - </label> 103 - <button type="submit">Resolve Handle</button> 104 - </form> 105 106 - <div id="result" style="display: none;"> 107 - <h3>Result</h3> 108 - <pre id="resultContent"></pre> 109 - </div> 110 111 - <h2>Example Usage</h2> 112 - <code>curl "https://quickdid.smokesignal.tools/xrpc/com.atproto.identity.resolveHandle?handle=ngerakines.me"</code> 113 114 <h2>Documentation</h2> 115 <p> ··· 122 </main> 123 124 <script> 125 - document.getElementById('resolveForm').addEventListener('submit', async (e) => { 126 e.preventDefault(); 127 128 - const handle = document.getElementById('handle').value.trim(); 129 - const resultDiv = document.getElementById('result'); 130 - const resultContent = document.getElementById('resultContent'); 131 132 // Show loading state 133 resultDiv.style.display = 'block'; ··· 155 } 156 }); 157 158 - // Allow pressing Enter in the input field to submit 159 - document.getElementById('handle').addEventListener('keypress', (e) => { 160 - if (e.key === 'Enter') { 161 - e.preventDefault(); 162 - document.getElementById('resolveForm').dispatchEvent(new Event('submit')); 163 } 164 }); 165 </script>
··· 35 <!-- Stylesheet --> 36 <link rel="stylesheet" href="/css/pico.classless.green.min.css"> 37 <style> 38 + .resolver-form { 39 margin: 2rem 0; 40 padding: 1.5rem; 41 background: var(--card-background-color); ··· 43 border: 1px solid var(--muted-border-color); 44 } 45 46 + .resolver-result { 47 + margin-top: 1rem; 48 padding: 1.5rem; 49 background: var(--code-background-color); 50 border-radius: var(--border-radius); 51 border: 1px solid var(--muted-border-color); 52 } 53 54 + .result-content { 55 background: transparent; 56 padding: 1rem; 57 overflow-x: auto; ··· 75 font-weight: bold; 76 margin-right: 0.5rem; 77 } 78 + 79 + .endpoint-section { 80 + margin-bottom: 3rem; 81 + } 82 </style> 83 </head> 84 ··· 90 </hgroup> 91 </header> 92 <main> 93 + <p>QuickDID provides high-performance resolution services for the AT Protocol ecosystem.</p> 94 95 <h2>Available Endpoints</h2> 96 97 + <section class="endpoint-section"> 98 + <h3>GET /xrpc/com.atproto.identity.resolveHandle</h3> 99 + <p>Resolve an AT Protocol handle to its DID</p> 100 + <p>Parameters: <code>?handle={handle}</code></p> 101 + 102 + <h4>Try It Out</h4> 103 + <form id="handleResolveForm" class="resolver-form"> 104 + <label for="handleInput"> 105 + Enter an AT Protocol handle to resolve: 106 + <input type="text" id="handleInput" name="handle" placeholder="e.g., alice.bsky.social" required> 107 + </label> 108 + <button type="submit">Resolve Handle</button> 109 + </form> 110 111 + <div id="handleResult" class="resolver-result" style="display: none;"> 112 + <h4>Result</h4> 113 + <pre id="handleResultContent" class="result-content"></pre> 114 + </div> 115 116 + <h4>Example Usage</h4> 117 + <code>curl "https://quickdid.smokesignal.tools/xrpc/com.atproto.identity.resolveHandle?handle=ngerakines.me"</code> 118 + </section> 119 120 + <section class="endpoint-section"> 121 + <h3>GET /xrpc/com.atproto.lexicon.resolveLexicon</h3> 122 + <p>Resolve an AT Protocol lexicon (NSID) to its schema</p> 123 + <p>Parameters: <code>?nsid={nsid}</code></p> 124 + 125 + <h4>Try It Out</h4> 126 + <form id="lexiconResolveForm" class="resolver-form"> 127 + <label for="nsidInput"> 128 + Enter an AT Protocol NSID to resolve: 129 + <input type="text" id="nsidInput" name="nsid" placeholder="e.g., app.bsky.feed.post" required> 130 + </label> 131 + <button type="submit">Resolve Lexicon</button> 132 + </form> 133 + 134 + <div id="lexiconResult" class="resolver-result" style="display: none;"> 135 + <h4>Result</h4> 136 + <pre id="lexiconResultContent" class="result-content"></pre> 137 + </div> 138 + 139 + <h4>Example Usage</h4> 140 + <code>curl "https://quickdid.smokesignal.tools/xrpc/com.atproto.lexicon.resolveLexicon?nsid=app.bsky.feed.post"</code> 141 + </section> 142 143 <h2>Documentation</h2> 144 <p> ··· 151 </main> 152 153 <script> 154 + // Handle form submission for handle resolution 155 + document.getElementById('handleResolveForm').addEventListener('submit', async (e) => { 156 e.preventDefault(); 157 158 + const handle = document.getElementById('handleInput').value.trim(); 159 + const resultDiv = document.getElementById('handleResult'); 160 + const resultContent = document.getElementById('handleResultContent'); 161 162 // Show loading state 163 resultDiv.style.display = 'block'; ··· 185 } 186 }); 187 188 + // Handle form submission for lexicon resolution 189 + document.getElementById('lexiconResolveForm').addEventListener('submit', async (e) => { 190 + e.preventDefault(); 191 + 192 + const nsid = document.getElementById('nsidInput').value.trim(); 193 + const resultDiv = document.getElementById('lexiconResult'); 194 + const resultContent = document.getElementById('lexiconResultContent'); 195 + 196 + // Show loading state 197 + resultDiv.style.display = 'block'; 198 + resultContent.textContent = 'Loading...'; 199 + 200 + try { 201 + // Build the request URL 202 + const url = `/xrpc/com.atproto.lexicon.resolveLexicon?nsid=${encodeURIComponent(nsid)}`; 203 + 204 + // Make the GET request 205 + const response = await fetch(url); 206 + const data = await response.json(); 207 + 208 + // Display the result 209 + if (response.ok) { 210 + resultContent.textContent = JSON.stringify(data, null, 2); 211 + resultContent.style.color = ''; 212 + } else { 213 + resultContent.textContent = `Error: ${JSON.stringify(data, null, 2)}`; 214 + resultContent.style.color = '#d32f2f'; 215 + } 216 + } catch (error) { 217 + resultContent.textContent = `Network Error: ${error.message}`; 218 + resultContent.style.color = '#d32f2f'; 219 } 220 }); 221 </script>