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.

Compare changes

Choose any two refs to compare.

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