aturi indexer with listRecords and countRecords endpoints

initial impl

ptr.pet 34de0548 8c99eabc

verified
+2721
+5
.gitignore
··· 2 .envrc 3 result 4 target
··· 2 .envrc 3 result 4 target 5 + .scratchpad 6 + aturlist_fjall 7 + aturlist.log 8 + tap.log 9 + tap.db
+2259
Cargo.lock
···
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "android_system_properties" 7 + version = "0.1.5" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 10 + dependencies = [ 11 + "libc", 12 + ] 13 + 14 + [[package]] 15 + name = "anyhow" 16 + version = "1.0.100" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 19 + 20 + [[package]] 21 + name = "async-trait" 22 + version = "0.1.89" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 25 + dependencies = [ 26 + "proc-macro2", 27 + "quote", 28 + "syn", 29 + ] 30 + 31 + [[package]] 32 + name = "atomic-waker" 33 + version = "1.1.2" 34 + source = "registry+https://github.com/rust-lang/crates.io-index" 35 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 36 + 37 + [[package]] 38 + name = "aturlist" 39 + version = "0.1.0" 40 + dependencies = [ 41 + "anyhow", 42 + "axum", 43 + "chrono", 44 + "fjall", 45 + "futures", 46 + "serde", 47 + "serde_json", 48 + "tapped", 49 + "tokio", 50 + "tracing", 51 + "tracing-subscriber", 52 + ] 53 + 54 + [[package]] 55 + name = "autocfg" 56 + version = "1.5.0" 57 + source = "registry+https://github.com/rust-lang/crates.io-index" 58 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 59 + 60 + [[package]] 61 + name = "axum" 62 + version = "0.7.9" 63 + source = "registry+https://github.com/rust-lang/crates.io-index" 64 + checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" 65 + dependencies = [ 66 + "async-trait", 67 + "axum-core", 68 + "bytes", 69 + "futures-util", 70 + "http", 71 + "http-body", 72 + "http-body-util", 73 + "hyper", 74 + "hyper-util", 75 + "itoa", 76 + "matchit", 77 + "memchr", 78 + "mime", 79 + "percent-encoding", 80 + "pin-project-lite", 81 + "rustversion", 82 + "serde", 83 + "serde_json", 84 + "serde_path_to_error", 85 + "serde_urlencoded", 86 + "sync_wrapper", 87 + "tokio", 88 + "tower", 89 + "tower-layer", 90 + "tower-service", 91 + "tracing", 92 + ] 93 + 94 + [[package]] 95 + name = "axum-core" 96 + version = "0.4.5" 97 + source = "registry+https://github.com/rust-lang/crates.io-index" 98 + checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" 99 + dependencies = [ 100 + "async-trait", 101 + "bytes", 102 + "futures-util", 103 + "http", 104 + "http-body", 105 + "http-body-util", 106 + "mime", 107 + "pin-project-lite", 108 + "rustversion", 109 + "sync_wrapper", 110 + "tower-layer", 111 + "tower-service", 112 + "tracing", 113 + ] 114 + 115 + [[package]] 116 + name = "base64" 117 + version = "0.22.1" 118 + source = "registry+https://github.com/rust-lang/crates.io-index" 119 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 120 + 121 + [[package]] 122 + name = "bitflags" 123 + version = "2.10.0" 124 + source = "registry+https://github.com/rust-lang/crates.io-index" 125 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 126 + 127 + [[package]] 128 + name = "block-buffer" 129 + version = "0.10.4" 130 + source = "registry+https://github.com/rust-lang/crates.io-index" 131 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 132 + dependencies = [ 133 + "generic-array", 134 + ] 135 + 136 + [[package]] 137 + name = "bumpalo" 138 + version = "3.19.1" 139 + source = "registry+https://github.com/rust-lang/crates.io-index" 140 + checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" 141 + 142 + [[package]] 143 + name = "byteorder-lite" 144 + version = "0.1.0" 145 + source = "registry+https://github.com/rust-lang/crates.io-index" 146 + checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 147 + 148 + [[package]] 149 + name = "bytes" 150 + version = "1.11.0" 151 + source = "registry+https://github.com/rust-lang/crates.io-index" 152 + checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" 153 + 154 + [[package]] 155 + name = "byteview" 156 + version = "0.10.0" 157 + source = "registry+https://github.com/rust-lang/crates.io-index" 158 + checksum = "dda4398f387cc6395a3e93b3867cd9abda914c97a0b344d1eefb2e5c51785fca" 159 + 160 + [[package]] 161 + name = "cc" 162 + version = "1.2.53" 163 + source = "registry+https://github.com/rust-lang/crates.io-index" 164 + checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" 165 + dependencies = [ 166 + "find-msvc-tools", 167 + "shlex", 168 + ] 169 + 170 + [[package]] 171 + name = "cfg-if" 172 + version = "1.0.4" 173 + source = "registry+https://github.com/rust-lang/crates.io-index" 174 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 175 + 176 + [[package]] 177 + name = "cfg_aliases" 178 + version = "0.2.1" 179 + source = "registry+https://github.com/rust-lang/crates.io-index" 180 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 181 + 182 + [[package]] 183 + name = "chrono" 184 + version = "0.4.43" 185 + source = "registry+https://github.com/rust-lang/crates.io-index" 186 + checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" 187 + dependencies = [ 188 + "iana-time-zone", 189 + "js-sys", 190 + "num-traits", 191 + "wasm-bindgen", 192 + "windows-link", 193 + ] 194 + 195 + [[package]] 196 + name = "compare" 197 + version = "0.0.6" 198 + source = "registry+https://github.com/rust-lang/crates.io-index" 199 + checksum = "ea0095f6103c2a8b44acd6fd15960c801dafebf02e21940360833e0673f48ba7" 200 + 201 + [[package]] 202 + name = "core-foundation" 203 + version = "0.10.1" 204 + source = "registry+https://github.com/rust-lang/crates.io-index" 205 + checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" 206 + dependencies = [ 207 + "core-foundation-sys", 208 + "libc", 209 + ] 210 + 211 + [[package]] 212 + name = "core-foundation-sys" 213 + version = "0.8.7" 214 + source = "registry+https://github.com/rust-lang/crates.io-index" 215 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 216 + 217 + [[package]] 218 + name = "cpufeatures" 219 + version = "0.2.17" 220 + source = "registry+https://github.com/rust-lang/crates.io-index" 221 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 222 + dependencies = [ 223 + "libc", 224 + ] 225 + 226 + [[package]] 227 + name = "crossbeam-epoch" 228 + version = "0.9.18" 229 + source = "registry+https://github.com/rust-lang/crates.io-index" 230 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 231 + dependencies = [ 232 + "crossbeam-utils", 233 + ] 234 + 235 + [[package]] 236 + name = "crossbeam-skiplist" 237 + version = "0.1.3" 238 + source = "registry+https://github.com/rust-lang/crates.io-index" 239 + checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b" 240 + dependencies = [ 241 + "crossbeam-epoch", 242 + "crossbeam-utils", 243 + ] 244 + 245 + [[package]] 246 + name = "crossbeam-utils" 247 + version = "0.8.21" 248 + source = "registry+https://github.com/rust-lang/crates.io-index" 249 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 250 + 251 + [[package]] 252 + name = "crypto-common" 253 + version = "0.1.7" 254 + source = "registry+https://github.com/rust-lang/crates.io-index" 255 + checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" 256 + dependencies = [ 257 + "generic-array", 258 + "typenum", 259 + ] 260 + 261 + [[package]] 262 + name = "dashmap" 263 + version = "6.1.0" 264 + source = "registry+https://github.com/rust-lang/crates.io-index" 265 + checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" 266 + dependencies = [ 267 + "cfg-if", 268 + "crossbeam-utils", 269 + "hashbrown 0.14.5", 270 + "lock_api", 271 + "once_cell", 272 + "parking_lot_core", 273 + ] 274 + 275 + [[package]] 276 + name = "data-encoding" 277 + version = "2.10.0" 278 + source = "registry+https://github.com/rust-lang/crates.io-index" 279 + checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" 280 + 281 + [[package]] 282 + name = "digest" 283 + version = "0.10.7" 284 + source = "registry+https://github.com/rust-lang/crates.io-index" 285 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 286 + dependencies = [ 287 + "block-buffer", 288 + "crypto-common", 289 + ] 290 + 291 + [[package]] 292 + name = "displaydoc" 293 + version = "0.2.5" 294 + source = "registry+https://github.com/rust-lang/crates.io-index" 295 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 296 + dependencies = [ 297 + "proc-macro2", 298 + "quote", 299 + "syn", 300 + ] 301 + 302 + [[package]] 303 + name = "enum_dispatch" 304 + version = "0.3.13" 305 + source = "registry+https://github.com/rust-lang/crates.io-index" 306 + checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" 307 + dependencies = [ 308 + "once_cell", 309 + "proc-macro2", 310 + "quote", 311 + "syn", 312 + ] 313 + 314 + [[package]] 315 + name = "equivalent" 316 + version = "1.0.2" 317 + source = "registry+https://github.com/rust-lang/crates.io-index" 318 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 319 + 320 + [[package]] 321 + name = "errno" 322 + version = "0.3.14" 323 + source = "registry+https://github.com/rust-lang/crates.io-index" 324 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 325 + dependencies = [ 326 + "libc", 327 + "windows-sys 0.61.2", 328 + ] 329 + 330 + [[package]] 331 + name = "fastrand" 332 + version = "2.3.0" 333 + source = "registry+https://github.com/rust-lang/crates.io-index" 334 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 335 + 336 + [[package]] 337 + name = "find-msvc-tools" 338 + version = "0.1.8" 339 + source = "registry+https://github.com/rust-lang/crates.io-index" 340 + checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" 341 + 342 + [[package]] 343 + name = "fjall" 344 + version = "3.0.1" 345 + source = "registry+https://github.com/rust-lang/crates.io-index" 346 + checksum = "4f69637c02d38ad1b0f003101d0195a60368130aa17d9ef78b1557d265a22093" 347 + dependencies = [ 348 + "byteorder-lite", 349 + "byteview", 350 + "dashmap", 351 + "flume", 352 + "log", 353 + "lsm-tree", 354 + "lz4_flex", 355 + "tempfile", 356 + "xxhash-rust", 357 + ] 358 + 359 + [[package]] 360 + name = "flume" 361 + version = "0.12.0" 362 + source = "registry+https://github.com/rust-lang/crates.io-index" 363 + checksum = "5e139bc46ca777eb5efaf62df0ab8cc5fd400866427e56c68b22e414e53bd3be" 364 + dependencies = [ 365 + "spin", 366 + ] 367 + 368 + [[package]] 369 + name = "form_urlencoded" 370 + version = "1.2.2" 371 + source = "registry+https://github.com/rust-lang/crates.io-index" 372 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 373 + dependencies = [ 374 + "percent-encoding", 375 + ] 376 + 377 + [[package]] 378 + name = "futures" 379 + version = "0.3.31" 380 + source = "registry+https://github.com/rust-lang/crates.io-index" 381 + checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 382 + dependencies = [ 383 + "futures-channel", 384 + "futures-core", 385 + "futures-executor", 386 + "futures-io", 387 + "futures-sink", 388 + "futures-task", 389 + "futures-util", 390 + ] 391 + 392 + [[package]] 393 + name = "futures-channel" 394 + version = "0.3.31" 395 + source = "registry+https://github.com/rust-lang/crates.io-index" 396 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 397 + dependencies = [ 398 + "futures-core", 399 + "futures-sink", 400 + ] 401 + 402 + [[package]] 403 + name = "futures-core" 404 + version = "0.3.31" 405 + source = "registry+https://github.com/rust-lang/crates.io-index" 406 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 407 + 408 + [[package]] 409 + name = "futures-executor" 410 + version = "0.3.31" 411 + source = "registry+https://github.com/rust-lang/crates.io-index" 412 + checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 413 + dependencies = [ 414 + "futures-core", 415 + "futures-task", 416 + "futures-util", 417 + ] 418 + 419 + [[package]] 420 + name = "futures-io" 421 + version = "0.3.31" 422 + source = "registry+https://github.com/rust-lang/crates.io-index" 423 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 424 + 425 + [[package]] 426 + name = "futures-macro" 427 + version = "0.3.31" 428 + source = "registry+https://github.com/rust-lang/crates.io-index" 429 + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 430 + dependencies = [ 431 + "proc-macro2", 432 + "quote", 433 + "syn", 434 + ] 435 + 436 + [[package]] 437 + name = "futures-sink" 438 + version = "0.3.31" 439 + source = "registry+https://github.com/rust-lang/crates.io-index" 440 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 441 + 442 + [[package]] 443 + name = "futures-task" 444 + version = "0.3.31" 445 + source = "registry+https://github.com/rust-lang/crates.io-index" 446 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 447 + 448 + [[package]] 449 + name = "futures-util" 450 + version = "0.3.31" 451 + source = "registry+https://github.com/rust-lang/crates.io-index" 452 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 453 + dependencies = [ 454 + "futures-channel", 455 + "futures-core", 456 + "futures-io", 457 + "futures-macro", 458 + "futures-sink", 459 + "futures-task", 460 + "memchr", 461 + "pin-project-lite", 462 + "pin-utils", 463 + "slab", 464 + ] 465 + 466 + [[package]] 467 + name = "generic-array" 468 + version = "0.14.7" 469 + source = "registry+https://github.com/rust-lang/crates.io-index" 470 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 471 + dependencies = [ 472 + "typenum", 473 + "version_check", 474 + ] 475 + 476 + [[package]] 477 + name = "getrandom" 478 + version = "0.2.17" 479 + source = "registry+https://github.com/rust-lang/crates.io-index" 480 + checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" 481 + dependencies = [ 482 + "cfg-if", 483 + "js-sys", 484 + "libc", 485 + "wasi", 486 + "wasm-bindgen", 487 + ] 488 + 489 + [[package]] 490 + name = "getrandom" 491 + version = "0.3.4" 492 + source = "registry+https://github.com/rust-lang/crates.io-index" 493 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 494 + dependencies = [ 495 + "cfg-if", 496 + "js-sys", 497 + "libc", 498 + "r-efi", 499 + "wasip2", 500 + "wasm-bindgen", 501 + ] 502 + 503 + [[package]] 504 + name = "hashbrown" 505 + version = "0.14.5" 506 + source = "registry+https://github.com/rust-lang/crates.io-index" 507 + checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 508 + 509 + [[package]] 510 + name = "hashbrown" 511 + version = "0.16.1" 512 + source = "registry+https://github.com/rust-lang/crates.io-index" 513 + checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 514 + 515 + [[package]] 516 + name = "http" 517 + version = "1.4.0" 518 + source = "registry+https://github.com/rust-lang/crates.io-index" 519 + checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" 520 + dependencies = [ 521 + "bytes", 522 + "itoa", 523 + ] 524 + 525 + [[package]] 526 + name = "http-body" 527 + version = "1.0.1" 528 + source = "registry+https://github.com/rust-lang/crates.io-index" 529 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 530 + dependencies = [ 531 + "bytes", 532 + "http", 533 + ] 534 + 535 + [[package]] 536 + name = "http-body-util" 537 + version = "0.1.3" 538 + source = "registry+https://github.com/rust-lang/crates.io-index" 539 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 540 + dependencies = [ 541 + "bytes", 542 + "futures-core", 543 + "http", 544 + "http-body", 545 + "pin-project-lite", 546 + ] 547 + 548 + [[package]] 549 + name = "httparse" 550 + version = "1.10.1" 551 + source = "registry+https://github.com/rust-lang/crates.io-index" 552 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 553 + 554 + [[package]] 555 + name = "httpdate" 556 + version = "1.0.3" 557 + source = "registry+https://github.com/rust-lang/crates.io-index" 558 + checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 559 + 560 + [[package]] 561 + name = "hyper" 562 + version = "1.8.1" 563 + source = "registry+https://github.com/rust-lang/crates.io-index" 564 + checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" 565 + dependencies = [ 566 + "atomic-waker", 567 + "bytes", 568 + "futures-channel", 569 + "futures-core", 570 + "http", 571 + "http-body", 572 + "httparse", 573 + "httpdate", 574 + "itoa", 575 + "pin-project-lite", 576 + "pin-utils", 577 + "smallvec", 578 + "tokio", 579 + "want", 580 + ] 581 + 582 + [[package]] 583 + name = "hyper-rustls" 584 + version = "0.27.7" 585 + source = "registry+https://github.com/rust-lang/crates.io-index" 586 + checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 587 + dependencies = [ 588 + "http", 589 + "hyper", 590 + "hyper-util", 591 + "rustls", 592 + "rustls-pki-types", 593 + "tokio", 594 + "tokio-rustls", 595 + "tower-service", 596 + "webpki-roots", 597 + ] 598 + 599 + [[package]] 600 + name = "hyper-util" 601 + version = "0.1.19" 602 + source = "registry+https://github.com/rust-lang/crates.io-index" 603 + checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" 604 + dependencies = [ 605 + "base64", 606 + "bytes", 607 + "futures-channel", 608 + "futures-core", 609 + "futures-util", 610 + "http", 611 + "http-body", 612 + "hyper", 613 + "ipnet", 614 + "libc", 615 + "percent-encoding", 616 + "pin-project-lite", 617 + "socket2", 618 + "tokio", 619 + "tower-service", 620 + "tracing", 621 + ] 622 + 623 + [[package]] 624 + name = "iana-time-zone" 625 + version = "0.1.64" 626 + source = "registry+https://github.com/rust-lang/crates.io-index" 627 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 628 + dependencies = [ 629 + "android_system_properties", 630 + "core-foundation-sys", 631 + "iana-time-zone-haiku", 632 + "js-sys", 633 + "log", 634 + "wasm-bindgen", 635 + "windows-core", 636 + ] 637 + 638 + [[package]] 639 + name = "iana-time-zone-haiku" 640 + version = "0.1.2" 641 + source = "registry+https://github.com/rust-lang/crates.io-index" 642 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 643 + dependencies = [ 644 + "cc", 645 + ] 646 + 647 + [[package]] 648 + name = "icu_collections" 649 + version = "2.1.1" 650 + source = "registry+https://github.com/rust-lang/crates.io-index" 651 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 652 + dependencies = [ 653 + "displaydoc", 654 + "potential_utf", 655 + "yoke", 656 + "zerofrom", 657 + "zerovec", 658 + ] 659 + 660 + [[package]] 661 + name = "icu_locale_core" 662 + version = "2.1.1" 663 + source = "registry+https://github.com/rust-lang/crates.io-index" 664 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 665 + dependencies = [ 666 + "displaydoc", 667 + "litemap", 668 + "tinystr", 669 + "writeable", 670 + "zerovec", 671 + ] 672 + 673 + [[package]] 674 + name = "icu_normalizer" 675 + version = "2.1.1" 676 + source = "registry+https://github.com/rust-lang/crates.io-index" 677 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 678 + dependencies = [ 679 + "icu_collections", 680 + "icu_normalizer_data", 681 + "icu_properties", 682 + "icu_provider", 683 + "smallvec", 684 + "zerovec", 685 + ] 686 + 687 + [[package]] 688 + name = "icu_normalizer_data" 689 + version = "2.1.1" 690 + source = "registry+https://github.com/rust-lang/crates.io-index" 691 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 692 + 693 + [[package]] 694 + name = "icu_properties" 695 + version = "2.1.2" 696 + source = "registry+https://github.com/rust-lang/crates.io-index" 697 + checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" 698 + dependencies = [ 699 + "icu_collections", 700 + "icu_locale_core", 701 + "icu_properties_data", 702 + "icu_provider", 703 + "zerotrie", 704 + "zerovec", 705 + ] 706 + 707 + [[package]] 708 + name = "icu_properties_data" 709 + version = "2.1.2" 710 + source = "registry+https://github.com/rust-lang/crates.io-index" 711 + checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" 712 + 713 + [[package]] 714 + name = "icu_provider" 715 + version = "2.1.1" 716 + source = "registry+https://github.com/rust-lang/crates.io-index" 717 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 718 + dependencies = [ 719 + "displaydoc", 720 + "icu_locale_core", 721 + "writeable", 722 + "yoke", 723 + "zerofrom", 724 + "zerotrie", 725 + "zerovec", 726 + ] 727 + 728 + [[package]] 729 + name = "idna" 730 + version = "1.1.0" 731 + source = "registry+https://github.com/rust-lang/crates.io-index" 732 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 733 + dependencies = [ 734 + "idna_adapter", 735 + "smallvec", 736 + "utf8_iter", 737 + ] 738 + 739 + [[package]] 740 + name = "idna_adapter" 741 + version = "1.2.1" 742 + source = "registry+https://github.com/rust-lang/crates.io-index" 743 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 744 + dependencies = [ 745 + "icu_normalizer", 746 + "icu_properties", 747 + ] 748 + 749 + [[package]] 750 + name = "interval-heap" 751 + version = "0.0.5" 752 + source = "registry+https://github.com/rust-lang/crates.io-index" 753 + checksum = "11274e5e8e89b8607cfedc2910b6626e998779b48a019151c7604d0adcb86ac6" 754 + dependencies = [ 755 + "compare", 756 + ] 757 + 758 + [[package]] 759 + name = "ipnet" 760 + version = "2.11.0" 761 + source = "registry+https://github.com/rust-lang/crates.io-index" 762 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 763 + 764 + [[package]] 765 + name = "iri-string" 766 + version = "0.7.10" 767 + source = "registry+https://github.com/rust-lang/crates.io-index" 768 + checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" 769 + dependencies = [ 770 + "memchr", 771 + "serde", 772 + ] 773 + 774 + [[package]] 775 + name = "itoa" 776 + version = "1.0.17" 777 + source = "registry+https://github.com/rust-lang/crates.io-index" 778 + checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" 779 + 780 + [[package]] 781 + name = "js-sys" 782 + version = "0.3.85" 783 + source = "registry+https://github.com/rust-lang/crates.io-index" 784 + checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" 785 + dependencies = [ 786 + "once_cell", 787 + "wasm-bindgen", 788 + ] 789 + 790 + [[package]] 791 + name = "lazy_static" 792 + version = "1.5.0" 793 + source = "registry+https://github.com/rust-lang/crates.io-index" 794 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 795 + 796 + [[package]] 797 + name = "libc" 798 + version = "0.2.180" 799 + source = "registry+https://github.com/rust-lang/crates.io-index" 800 + checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" 801 + 802 + [[package]] 803 + name = "linux-raw-sys" 804 + version = "0.11.0" 805 + source = "registry+https://github.com/rust-lang/crates.io-index" 806 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 807 + 808 + [[package]] 809 + name = "litemap" 810 + version = "0.8.1" 811 + source = "registry+https://github.com/rust-lang/crates.io-index" 812 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 813 + 814 + [[package]] 815 + name = "lock_api" 816 + version = "0.4.14" 817 + source = "registry+https://github.com/rust-lang/crates.io-index" 818 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 819 + dependencies = [ 820 + "scopeguard", 821 + ] 822 + 823 + [[package]] 824 + name = "log" 825 + version = "0.4.29" 826 + source = "registry+https://github.com/rust-lang/crates.io-index" 827 + checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 828 + 829 + [[package]] 830 + name = "lru-slab" 831 + version = "0.1.2" 832 + source = "registry+https://github.com/rust-lang/crates.io-index" 833 + checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 834 + 835 + [[package]] 836 + name = "lsm-tree" 837 + version = "3.0.1" 838 + source = "registry+https://github.com/rust-lang/crates.io-index" 839 + checksum = "b875f1dfe14f557f805b167fb9b0fc54c5560c7a4bd6ae02535b2846f276a8cb" 840 + dependencies = [ 841 + "byteorder-lite", 842 + "byteview", 843 + "crossbeam-skiplist", 844 + "enum_dispatch", 845 + "interval-heap", 846 + "log", 847 + "lz4_flex", 848 + "quick_cache", 849 + "rustc-hash", 850 + "self_cell", 851 + "sfa", 852 + "tempfile", 853 + "varint-rs", 854 + "xxhash-rust", 855 + ] 856 + 857 + [[package]] 858 + name = "lz4_flex" 859 + version = "0.11.5" 860 + source = "registry+https://github.com/rust-lang/crates.io-index" 861 + checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" 862 + dependencies = [ 863 + "twox-hash", 864 + ] 865 + 866 + [[package]] 867 + name = "matchit" 868 + version = "0.7.3" 869 + source = "registry+https://github.com/rust-lang/crates.io-index" 870 + checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 871 + 872 + [[package]] 873 + name = "memchr" 874 + version = "2.7.6" 875 + source = "registry+https://github.com/rust-lang/crates.io-index" 876 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 877 + 878 + [[package]] 879 + name = "mime" 880 + version = "0.3.17" 881 + source = "registry+https://github.com/rust-lang/crates.io-index" 882 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 883 + 884 + [[package]] 885 + name = "mio" 886 + version = "1.1.1" 887 + source = "registry+https://github.com/rust-lang/crates.io-index" 888 + checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" 889 + dependencies = [ 890 + "libc", 891 + "wasi", 892 + "windows-sys 0.61.2", 893 + ] 894 + 895 + [[package]] 896 + name = "nu-ansi-term" 897 + version = "0.50.3" 898 + source = "registry+https://github.com/rust-lang/crates.io-index" 899 + checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" 900 + dependencies = [ 901 + "windows-sys 0.61.2", 902 + ] 903 + 904 + [[package]] 905 + name = "num-traits" 906 + version = "0.2.19" 907 + source = "registry+https://github.com/rust-lang/crates.io-index" 908 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 909 + dependencies = [ 910 + "autocfg", 911 + ] 912 + 913 + [[package]] 914 + name = "once_cell" 915 + version = "1.21.3" 916 + source = "registry+https://github.com/rust-lang/crates.io-index" 917 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 918 + 919 + [[package]] 920 + name = "openssl-probe" 921 + version = "0.2.0" 922 + source = "registry+https://github.com/rust-lang/crates.io-index" 923 + checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" 924 + 925 + [[package]] 926 + name = "parking_lot" 927 + version = "0.12.5" 928 + source = "registry+https://github.com/rust-lang/crates.io-index" 929 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 930 + dependencies = [ 931 + "lock_api", 932 + "parking_lot_core", 933 + ] 934 + 935 + [[package]] 936 + name = "parking_lot_core" 937 + version = "0.9.12" 938 + source = "registry+https://github.com/rust-lang/crates.io-index" 939 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 940 + dependencies = [ 941 + "cfg-if", 942 + "libc", 943 + "redox_syscall", 944 + "smallvec", 945 + "windows-link", 946 + ] 947 + 948 + [[package]] 949 + name = "percent-encoding" 950 + version = "2.3.2" 951 + source = "registry+https://github.com/rust-lang/crates.io-index" 952 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 953 + 954 + [[package]] 955 + name = "pin-project-lite" 956 + version = "0.2.16" 957 + source = "registry+https://github.com/rust-lang/crates.io-index" 958 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 959 + 960 + [[package]] 961 + name = "pin-utils" 962 + version = "0.1.0" 963 + source = "registry+https://github.com/rust-lang/crates.io-index" 964 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 965 + 966 + [[package]] 967 + name = "potential_utf" 968 + version = "0.1.4" 969 + source = "registry+https://github.com/rust-lang/crates.io-index" 970 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 971 + dependencies = [ 972 + "zerovec", 973 + ] 974 + 975 + [[package]] 976 + name = "ppv-lite86" 977 + version = "0.2.21" 978 + source = "registry+https://github.com/rust-lang/crates.io-index" 979 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 980 + dependencies = [ 981 + "zerocopy", 982 + ] 983 + 984 + [[package]] 985 + name = "proc-macro2" 986 + version = "1.0.105" 987 + source = "registry+https://github.com/rust-lang/crates.io-index" 988 + checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" 989 + dependencies = [ 990 + "unicode-ident", 991 + ] 992 + 993 + [[package]] 994 + name = "quick_cache" 995 + version = "0.6.18" 996 + source = "registry+https://github.com/rust-lang/crates.io-index" 997 + checksum = "7ada44a88ef953a3294f6eb55d2007ba44646015e18613d2f213016379203ef3" 998 + dependencies = [ 999 + "equivalent", 1000 + "hashbrown 0.16.1", 1001 + ] 1002 + 1003 + [[package]] 1004 + name = "quinn" 1005 + version = "0.11.9" 1006 + source = "registry+https://github.com/rust-lang/crates.io-index" 1007 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 1008 + dependencies = [ 1009 + "bytes", 1010 + "cfg_aliases", 1011 + "pin-project-lite", 1012 + "quinn-proto", 1013 + "quinn-udp", 1014 + "rustc-hash", 1015 + "rustls", 1016 + "socket2", 1017 + "thiserror", 1018 + "tokio", 1019 + "tracing", 1020 + "web-time", 1021 + ] 1022 + 1023 + [[package]] 1024 + name = "quinn-proto" 1025 + version = "0.11.13" 1026 + source = "registry+https://github.com/rust-lang/crates.io-index" 1027 + checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 1028 + dependencies = [ 1029 + "bytes", 1030 + "getrandom 0.3.4", 1031 + "lru-slab", 1032 + "rand", 1033 + "ring", 1034 + "rustc-hash", 1035 + "rustls", 1036 + "rustls-pki-types", 1037 + "slab", 1038 + "thiserror", 1039 + "tinyvec", 1040 + "tracing", 1041 + "web-time", 1042 + ] 1043 + 1044 + [[package]] 1045 + name = "quinn-udp" 1046 + version = "0.5.14" 1047 + source = "registry+https://github.com/rust-lang/crates.io-index" 1048 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 1049 + dependencies = [ 1050 + "cfg_aliases", 1051 + "libc", 1052 + "once_cell", 1053 + "socket2", 1054 + "tracing", 1055 + "windows-sys 0.60.2", 1056 + ] 1057 + 1058 + [[package]] 1059 + name = "quote" 1060 + version = "1.0.43" 1061 + source = "registry+https://github.com/rust-lang/crates.io-index" 1062 + checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" 1063 + dependencies = [ 1064 + "proc-macro2", 1065 + ] 1066 + 1067 + [[package]] 1068 + name = "r-efi" 1069 + version = "5.3.0" 1070 + source = "registry+https://github.com/rust-lang/crates.io-index" 1071 + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1072 + 1073 + [[package]] 1074 + name = "rand" 1075 + version = "0.9.2" 1076 + source = "registry+https://github.com/rust-lang/crates.io-index" 1077 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 1078 + dependencies = [ 1079 + "rand_chacha", 1080 + "rand_core", 1081 + ] 1082 + 1083 + [[package]] 1084 + name = "rand_chacha" 1085 + version = "0.9.0" 1086 + source = "registry+https://github.com/rust-lang/crates.io-index" 1087 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1088 + dependencies = [ 1089 + "ppv-lite86", 1090 + "rand_core", 1091 + ] 1092 + 1093 + [[package]] 1094 + name = "rand_core" 1095 + version = "0.9.5" 1096 + source = "registry+https://github.com/rust-lang/crates.io-index" 1097 + checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" 1098 + dependencies = [ 1099 + "getrandom 0.3.4", 1100 + ] 1101 + 1102 + [[package]] 1103 + name = "redox_syscall" 1104 + version = "0.5.18" 1105 + source = "registry+https://github.com/rust-lang/crates.io-index" 1106 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 1107 + dependencies = [ 1108 + "bitflags", 1109 + ] 1110 + 1111 + [[package]] 1112 + name = "reqwest" 1113 + version = "0.12.28" 1114 + source = "registry+https://github.com/rust-lang/crates.io-index" 1115 + checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" 1116 + dependencies = [ 1117 + "base64", 1118 + "bytes", 1119 + "futures-core", 1120 + "http", 1121 + "http-body", 1122 + "http-body-util", 1123 + "hyper", 1124 + "hyper-rustls", 1125 + "hyper-util", 1126 + "js-sys", 1127 + "log", 1128 + "percent-encoding", 1129 + "pin-project-lite", 1130 + "quinn", 1131 + "rustls", 1132 + "rustls-pki-types", 1133 + "serde", 1134 + "serde_json", 1135 + "serde_urlencoded", 1136 + "sync_wrapper", 1137 + "tokio", 1138 + "tokio-rustls", 1139 + "tower", 1140 + "tower-http", 1141 + "tower-service", 1142 + "url", 1143 + "wasm-bindgen", 1144 + "wasm-bindgen-futures", 1145 + "web-sys", 1146 + "webpki-roots", 1147 + ] 1148 + 1149 + [[package]] 1150 + name = "ring" 1151 + version = "0.17.14" 1152 + source = "registry+https://github.com/rust-lang/crates.io-index" 1153 + checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1154 + dependencies = [ 1155 + "cc", 1156 + "cfg-if", 1157 + "getrandom 0.2.17", 1158 + "libc", 1159 + "untrusted", 1160 + "windows-sys 0.52.0", 1161 + ] 1162 + 1163 + [[package]] 1164 + name = "rustc-hash" 1165 + version = "2.1.1" 1166 + source = "registry+https://github.com/rust-lang/crates.io-index" 1167 + checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 1168 + 1169 + [[package]] 1170 + name = "rustix" 1171 + version = "1.1.3" 1172 + source = "registry+https://github.com/rust-lang/crates.io-index" 1173 + checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" 1174 + dependencies = [ 1175 + "bitflags", 1176 + "errno", 1177 + "libc", 1178 + "linux-raw-sys", 1179 + "windows-sys 0.61.2", 1180 + ] 1181 + 1182 + [[package]] 1183 + name = "rustls" 1184 + version = "0.23.36" 1185 + source = "registry+https://github.com/rust-lang/crates.io-index" 1186 + checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" 1187 + dependencies = [ 1188 + "once_cell", 1189 + "ring", 1190 + "rustls-pki-types", 1191 + "rustls-webpki", 1192 + "subtle", 1193 + "zeroize", 1194 + ] 1195 + 1196 + [[package]] 1197 + name = "rustls-native-certs" 1198 + version = "0.8.3" 1199 + source = "registry+https://github.com/rust-lang/crates.io-index" 1200 + checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" 1201 + dependencies = [ 1202 + "openssl-probe", 1203 + "rustls-pki-types", 1204 + "schannel", 1205 + "security-framework", 1206 + ] 1207 + 1208 + [[package]] 1209 + name = "rustls-pki-types" 1210 + version = "1.14.0" 1211 + source = "registry+https://github.com/rust-lang/crates.io-index" 1212 + checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" 1213 + dependencies = [ 1214 + "web-time", 1215 + "zeroize", 1216 + ] 1217 + 1218 + [[package]] 1219 + name = "rustls-webpki" 1220 + version = "0.103.9" 1221 + source = "registry+https://github.com/rust-lang/crates.io-index" 1222 + checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" 1223 + dependencies = [ 1224 + "ring", 1225 + "rustls-pki-types", 1226 + "untrusted", 1227 + ] 1228 + 1229 + [[package]] 1230 + name = "rustversion" 1231 + version = "1.0.22" 1232 + source = "registry+https://github.com/rust-lang/crates.io-index" 1233 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1234 + 1235 + [[package]] 1236 + name = "ryu" 1237 + version = "1.0.22" 1238 + source = "registry+https://github.com/rust-lang/crates.io-index" 1239 + checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" 1240 + 1241 + [[package]] 1242 + name = "schannel" 1243 + version = "0.1.28" 1244 + source = "registry+https://github.com/rust-lang/crates.io-index" 1245 + checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" 1246 + dependencies = [ 1247 + "windows-sys 0.61.2", 1248 + ] 1249 + 1250 + [[package]] 1251 + name = "scopeguard" 1252 + version = "1.2.0" 1253 + source = "registry+https://github.com/rust-lang/crates.io-index" 1254 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1255 + 1256 + [[package]] 1257 + name = "security-framework" 1258 + version = "3.5.1" 1259 + source = "registry+https://github.com/rust-lang/crates.io-index" 1260 + checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" 1261 + dependencies = [ 1262 + "bitflags", 1263 + "core-foundation", 1264 + "core-foundation-sys", 1265 + "libc", 1266 + "security-framework-sys", 1267 + ] 1268 + 1269 + [[package]] 1270 + name = "security-framework-sys" 1271 + version = "2.15.0" 1272 + source = "registry+https://github.com/rust-lang/crates.io-index" 1273 + checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" 1274 + dependencies = [ 1275 + "core-foundation-sys", 1276 + "libc", 1277 + ] 1278 + 1279 + [[package]] 1280 + name = "self_cell" 1281 + version = "1.2.2" 1282 + source = "registry+https://github.com/rust-lang/crates.io-index" 1283 + checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" 1284 + 1285 + [[package]] 1286 + name = "serde" 1287 + version = "1.0.228" 1288 + source = "registry+https://github.com/rust-lang/crates.io-index" 1289 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 1290 + dependencies = [ 1291 + "serde_core", 1292 + "serde_derive", 1293 + ] 1294 + 1295 + [[package]] 1296 + name = "serde_core" 1297 + version = "1.0.228" 1298 + source = "registry+https://github.com/rust-lang/crates.io-index" 1299 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 1300 + dependencies = [ 1301 + "serde_derive", 1302 + ] 1303 + 1304 + [[package]] 1305 + name = "serde_derive" 1306 + version = "1.0.228" 1307 + source = "registry+https://github.com/rust-lang/crates.io-index" 1308 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 1309 + dependencies = [ 1310 + "proc-macro2", 1311 + "quote", 1312 + "syn", 1313 + ] 1314 + 1315 + [[package]] 1316 + name = "serde_json" 1317 + version = "1.0.149" 1318 + source = "registry+https://github.com/rust-lang/crates.io-index" 1319 + checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" 1320 + dependencies = [ 1321 + "itoa", 1322 + "memchr", 1323 + "serde", 1324 + "serde_core", 1325 + "zmij", 1326 + ] 1327 + 1328 + [[package]] 1329 + name = "serde_path_to_error" 1330 + version = "0.1.20" 1331 + source = "registry+https://github.com/rust-lang/crates.io-index" 1332 + checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" 1333 + dependencies = [ 1334 + "itoa", 1335 + "serde", 1336 + "serde_core", 1337 + ] 1338 + 1339 + [[package]] 1340 + name = "serde_urlencoded" 1341 + version = "0.7.1" 1342 + source = "registry+https://github.com/rust-lang/crates.io-index" 1343 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1344 + dependencies = [ 1345 + "form_urlencoded", 1346 + "itoa", 1347 + "ryu", 1348 + "serde", 1349 + ] 1350 + 1351 + [[package]] 1352 + name = "sfa" 1353 + version = "1.0.0" 1354 + source = "registry+https://github.com/rust-lang/crates.io-index" 1355 + checksum = "a1296838937cab56cd6c4eeeb8718ec777383700c33f060e2869867bd01d1175" 1356 + dependencies = [ 1357 + "byteorder-lite", 1358 + "log", 1359 + "xxhash-rust", 1360 + ] 1361 + 1362 + [[package]] 1363 + name = "sha1" 1364 + version = "0.10.6" 1365 + source = "registry+https://github.com/rust-lang/crates.io-index" 1366 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1367 + dependencies = [ 1368 + "cfg-if", 1369 + "cpufeatures", 1370 + "digest", 1371 + ] 1372 + 1373 + [[package]] 1374 + name = "sharded-slab" 1375 + version = "0.1.7" 1376 + source = "registry+https://github.com/rust-lang/crates.io-index" 1377 + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1378 + dependencies = [ 1379 + "lazy_static", 1380 + ] 1381 + 1382 + [[package]] 1383 + name = "shlex" 1384 + version = "1.3.0" 1385 + source = "registry+https://github.com/rust-lang/crates.io-index" 1386 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1387 + 1388 + [[package]] 1389 + name = "signal-hook-registry" 1390 + version = "1.4.8" 1391 + source = "registry+https://github.com/rust-lang/crates.io-index" 1392 + checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" 1393 + dependencies = [ 1394 + "errno", 1395 + "libc", 1396 + ] 1397 + 1398 + [[package]] 1399 + name = "slab" 1400 + version = "0.4.11" 1401 + source = "registry+https://github.com/rust-lang/crates.io-index" 1402 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 1403 + 1404 + [[package]] 1405 + name = "smallvec" 1406 + version = "1.15.1" 1407 + source = "registry+https://github.com/rust-lang/crates.io-index" 1408 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1409 + 1410 + [[package]] 1411 + name = "socket2" 1412 + version = "0.6.1" 1413 + source = "registry+https://github.com/rust-lang/crates.io-index" 1414 + checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 1415 + dependencies = [ 1416 + "libc", 1417 + "windows-sys 0.60.2", 1418 + ] 1419 + 1420 + [[package]] 1421 + name = "spin" 1422 + version = "0.9.8" 1423 + source = "registry+https://github.com/rust-lang/crates.io-index" 1424 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1425 + dependencies = [ 1426 + "lock_api", 1427 + ] 1428 + 1429 + [[package]] 1430 + name = "stable_deref_trait" 1431 + version = "1.2.1" 1432 + source = "registry+https://github.com/rust-lang/crates.io-index" 1433 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 1434 + 1435 + [[package]] 1436 + name = "subtle" 1437 + version = "2.6.1" 1438 + source = "registry+https://github.com/rust-lang/crates.io-index" 1439 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1440 + 1441 + [[package]] 1442 + name = "syn" 1443 + version = "2.0.114" 1444 + source = "registry+https://github.com/rust-lang/crates.io-index" 1445 + checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" 1446 + dependencies = [ 1447 + "proc-macro2", 1448 + "quote", 1449 + "unicode-ident", 1450 + ] 1451 + 1452 + [[package]] 1453 + name = "sync_wrapper" 1454 + version = "1.0.2" 1455 + source = "registry+https://github.com/rust-lang/crates.io-index" 1456 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1457 + dependencies = [ 1458 + "futures-core", 1459 + ] 1460 + 1461 + [[package]] 1462 + name = "synstructure" 1463 + version = "0.13.2" 1464 + source = "registry+https://github.com/rust-lang/crates.io-index" 1465 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1466 + dependencies = [ 1467 + "proc-macro2", 1468 + "quote", 1469 + "syn", 1470 + ] 1471 + 1472 + [[package]] 1473 + name = "tapped" 1474 + version = "0.1.0" 1475 + source = "git+https://github.com/thombles/tapped#c7f38d365901218d35489175f711ce5495512ef7" 1476 + dependencies = [ 1477 + "base64", 1478 + "futures-util", 1479 + "libc", 1480 + "reqwest", 1481 + "serde", 1482 + "serde_json", 1483 + "thiserror", 1484 + "tokio", 1485 + "tokio-tungstenite", 1486 + "tracing", 1487 + "url", 1488 + ] 1489 + 1490 + [[package]] 1491 + name = "tempfile" 1492 + version = "3.24.0" 1493 + source = "registry+https://github.com/rust-lang/crates.io-index" 1494 + checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" 1495 + dependencies = [ 1496 + "fastrand", 1497 + "getrandom 0.3.4", 1498 + "once_cell", 1499 + "rustix", 1500 + "windows-sys 0.61.2", 1501 + ] 1502 + 1503 + [[package]] 1504 + name = "thiserror" 1505 + version = "2.0.18" 1506 + source = "registry+https://github.com/rust-lang/crates.io-index" 1507 + checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" 1508 + dependencies = [ 1509 + "thiserror-impl", 1510 + ] 1511 + 1512 + [[package]] 1513 + name = "thiserror-impl" 1514 + version = "2.0.18" 1515 + source = "registry+https://github.com/rust-lang/crates.io-index" 1516 + checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" 1517 + dependencies = [ 1518 + "proc-macro2", 1519 + "quote", 1520 + "syn", 1521 + ] 1522 + 1523 + [[package]] 1524 + name = "thread_local" 1525 + version = "1.1.9" 1526 + source = "registry+https://github.com/rust-lang/crates.io-index" 1527 + checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" 1528 + dependencies = [ 1529 + "cfg-if", 1530 + ] 1531 + 1532 + [[package]] 1533 + name = "tinystr" 1534 + version = "0.8.2" 1535 + source = "registry+https://github.com/rust-lang/crates.io-index" 1536 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 1537 + dependencies = [ 1538 + "displaydoc", 1539 + "zerovec", 1540 + ] 1541 + 1542 + [[package]] 1543 + name = "tinyvec" 1544 + version = "1.10.0" 1545 + source = "registry+https://github.com/rust-lang/crates.io-index" 1546 + checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 1547 + dependencies = [ 1548 + "tinyvec_macros", 1549 + ] 1550 + 1551 + [[package]] 1552 + name = "tinyvec_macros" 1553 + version = "0.1.1" 1554 + source = "registry+https://github.com/rust-lang/crates.io-index" 1555 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1556 + 1557 + [[package]] 1558 + name = "tokio" 1559 + version = "1.49.0" 1560 + source = "registry+https://github.com/rust-lang/crates.io-index" 1561 + checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" 1562 + dependencies = [ 1563 + "bytes", 1564 + "libc", 1565 + "mio", 1566 + "parking_lot", 1567 + "pin-project-lite", 1568 + "signal-hook-registry", 1569 + "socket2", 1570 + "tokio-macros", 1571 + "windows-sys 0.61.2", 1572 + ] 1573 + 1574 + [[package]] 1575 + name = "tokio-macros" 1576 + version = "2.6.0" 1577 + source = "registry+https://github.com/rust-lang/crates.io-index" 1578 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 1579 + dependencies = [ 1580 + "proc-macro2", 1581 + "quote", 1582 + "syn", 1583 + ] 1584 + 1585 + [[package]] 1586 + name = "tokio-rustls" 1587 + version = "0.26.4" 1588 + source = "registry+https://github.com/rust-lang/crates.io-index" 1589 + checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 1590 + dependencies = [ 1591 + "rustls", 1592 + "tokio", 1593 + ] 1594 + 1595 + [[package]] 1596 + name = "tokio-tungstenite" 1597 + version = "0.26.2" 1598 + source = "registry+https://github.com/rust-lang/crates.io-index" 1599 + checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" 1600 + dependencies = [ 1601 + "futures-util", 1602 + "log", 1603 + "rustls", 1604 + "rustls-native-certs", 1605 + "rustls-pki-types", 1606 + "tokio", 1607 + "tokio-rustls", 1608 + "tungstenite", 1609 + ] 1610 + 1611 + [[package]] 1612 + name = "tower" 1613 + version = "0.5.3" 1614 + source = "registry+https://github.com/rust-lang/crates.io-index" 1615 + checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" 1616 + dependencies = [ 1617 + "futures-core", 1618 + "futures-util", 1619 + "pin-project-lite", 1620 + "sync_wrapper", 1621 + "tokio", 1622 + "tower-layer", 1623 + "tower-service", 1624 + "tracing", 1625 + ] 1626 + 1627 + [[package]] 1628 + name = "tower-http" 1629 + version = "0.6.8" 1630 + source = "registry+https://github.com/rust-lang/crates.io-index" 1631 + checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" 1632 + dependencies = [ 1633 + "bitflags", 1634 + "bytes", 1635 + "futures-util", 1636 + "http", 1637 + "http-body", 1638 + "iri-string", 1639 + "pin-project-lite", 1640 + "tower", 1641 + "tower-layer", 1642 + "tower-service", 1643 + ] 1644 + 1645 + [[package]] 1646 + name = "tower-layer" 1647 + version = "0.3.3" 1648 + source = "registry+https://github.com/rust-lang/crates.io-index" 1649 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1650 + 1651 + [[package]] 1652 + name = "tower-service" 1653 + version = "0.3.3" 1654 + source = "registry+https://github.com/rust-lang/crates.io-index" 1655 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1656 + 1657 + [[package]] 1658 + name = "tracing" 1659 + version = "0.1.44" 1660 + source = "registry+https://github.com/rust-lang/crates.io-index" 1661 + checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" 1662 + dependencies = [ 1663 + "log", 1664 + "pin-project-lite", 1665 + "tracing-attributes", 1666 + "tracing-core", 1667 + ] 1668 + 1669 + [[package]] 1670 + name = "tracing-attributes" 1671 + version = "0.1.31" 1672 + source = "registry+https://github.com/rust-lang/crates.io-index" 1673 + checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" 1674 + dependencies = [ 1675 + "proc-macro2", 1676 + "quote", 1677 + "syn", 1678 + ] 1679 + 1680 + [[package]] 1681 + name = "tracing-core" 1682 + version = "0.1.36" 1683 + source = "registry+https://github.com/rust-lang/crates.io-index" 1684 + checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" 1685 + dependencies = [ 1686 + "once_cell", 1687 + "valuable", 1688 + ] 1689 + 1690 + [[package]] 1691 + name = "tracing-log" 1692 + version = "0.2.0" 1693 + source = "registry+https://github.com/rust-lang/crates.io-index" 1694 + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1695 + dependencies = [ 1696 + "log", 1697 + "once_cell", 1698 + "tracing-core", 1699 + ] 1700 + 1701 + [[package]] 1702 + name = "tracing-subscriber" 1703 + version = "0.3.22" 1704 + source = "registry+https://github.com/rust-lang/crates.io-index" 1705 + checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" 1706 + dependencies = [ 1707 + "nu-ansi-term", 1708 + "sharded-slab", 1709 + "smallvec", 1710 + "thread_local", 1711 + "tracing-core", 1712 + "tracing-log", 1713 + ] 1714 + 1715 + [[package]] 1716 + name = "try-lock" 1717 + version = "0.2.5" 1718 + source = "registry+https://github.com/rust-lang/crates.io-index" 1719 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1720 + 1721 + [[package]] 1722 + name = "tungstenite" 1723 + version = "0.26.2" 1724 + source = "registry+https://github.com/rust-lang/crates.io-index" 1725 + checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" 1726 + dependencies = [ 1727 + "bytes", 1728 + "data-encoding", 1729 + "http", 1730 + "httparse", 1731 + "log", 1732 + "rand", 1733 + "rustls", 1734 + "rustls-pki-types", 1735 + "sha1", 1736 + "thiserror", 1737 + "utf-8", 1738 + ] 1739 + 1740 + [[package]] 1741 + name = "twox-hash" 1742 + version = "2.1.2" 1743 + source = "registry+https://github.com/rust-lang/crates.io-index" 1744 + checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" 1745 + 1746 + [[package]] 1747 + name = "typenum" 1748 + version = "1.19.0" 1749 + source = "registry+https://github.com/rust-lang/crates.io-index" 1750 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 1751 + 1752 + [[package]] 1753 + name = "unicode-ident" 1754 + version = "1.0.22" 1755 + source = "registry+https://github.com/rust-lang/crates.io-index" 1756 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 1757 + 1758 + [[package]] 1759 + name = "untrusted" 1760 + version = "0.9.0" 1761 + source = "registry+https://github.com/rust-lang/crates.io-index" 1762 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1763 + 1764 + [[package]] 1765 + name = "url" 1766 + version = "2.5.8" 1767 + source = "registry+https://github.com/rust-lang/crates.io-index" 1768 + checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" 1769 + dependencies = [ 1770 + "form_urlencoded", 1771 + "idna", 1772 + "percent-encoding", 1773 + "serde", 1774 + "serde_derive", 1775 + ] 1776 + 1777 + [[package]] 1778 + name = "utf-8" 1779 + version = "0.7.6" 1780 + source = "registry+https://github.com/rust-lang/crates.io-index" 1781 + checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 1782 + 1783 + [[package]] 1784 + name = "utf8_iter" 1785 + version = "1.0.4" 1786 + source = "registry+https://github.com/rust-lang/crates.io-index" 1787 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1788 + 1789 + [[package]] 1790 + name = "valuable" 1791 + version = "0.1.1" 1792 + source = "registry+https://github.com/rust-lang/crates.io-index" 1793 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 1794 + 1795 + [[package]] 1796 + name = "varint-rs" 1797 + version = "2.2.0" 1798 + source = "registry+https://github.com/rust-lang/crates.io-index" 1799 + checksum = "8f54a172d0620933a27a4360d3db3e2ae0dd6cceae9730751a036bbf182c4b23" 1800 + 1801 + [[package]] 1802 + name = "version_check" 1803 + version = "0.9.5" 1804 + source = "registry+https://github.com/rust-lang/crates.io-index" 1805 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1806 + 1807 + [[package]] 1808 + name = "want" 1809 + version = "0.3.1" 1810 + source = "registry+https://github.com/rust-lang/crates.io-index" 1811 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1812 + dependencies = [ 1813 + "try-lock", 1814 + ] 1815 + 1816 + [[package]] 1817 + name = "wasi" 1818 + version = "0.11.1+wasi-snapshot-preview1" 1819 + source = "registry+https://github.com/rust-lang/crates.io-index" 1820 + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 1821 + 1822 + [[package]] 1823 + name = "wasip2" 1824 + version = "1.0.2+wasi-0.2.9" 1825 + source = "registry+https://github.com/rust-lang/crates.io-index" 1826 + checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" 1827 + dependencies = [ 1828 + "wit-bindgen", 1829 + ] 1830 + 1831 + [[package]] 1832 + name = "wasm-bindgen" 1833 + version = "0.2.108" 1834 + source = "registry+https://github.com/rust-lang/crates.io-index" 1835 + checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" 1836 + dependencies = [ 1837 + "cfg-if", 1838 + "once_cell", 1839 + "rustversion", 1840 + "wasm-bindgen-macro", 1841 + "wasm-bindgen-shared", 1842 + ] 1843 + 1844 + [[package]] 1845 + name = "wasm-bindgen-futures" 1846 + version = "0.4.58" 1847 + source = "registry+https://github.com/rust-lang/crates.io-index" 1848 + checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" 1849 + dependencies = [ 1850 + "cfg-if", 1851 + "futures-util", 1852 + "js-sys", 1853 + "once_cell", 1854 + "wasm-bindgen", 1855 + "web-sys", 1856 + ] 1857 + 1858 + [[package]] 1859 + name = "wasm-bindgen-macro" 1860 + version = "0.2.108" 1861 + source = "registry+https://github.com/rust-lang/crates.io-index" 1862 + checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" 1863 + dependencies = [ 1864 + "quote", 1865 + "wasm-bindgen-macro-support", 1866 + ] 1867 + 1868 + [[package]] 1869 + name = "wasm-bindgen-macro-support" 1870 + version = "0.2.108" 1871 + source = "registry+https://github.com/rust-lang/crates.io-index" 1872 + checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" 1873 + dependencies = [ 1874 + "bumpalo", 1875 + "proc-macro2", 1876 + "quote", 1877 + "syn", 1878 + "wasm-bindgen-shared", 1879 + ] 1880 + 1881 + [[package]] 1882 + name = "wasm-bindgen-shared" 1883 + version = "0.2.108" 1884 + source = "registry+https://github.com/rust-lang/crates.io-index" 1885 + checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" 1886 + dependencies = [ 1887 + "unicode-ident", 1888 + ] 1889 + 1890 + [[package]] 1891 + name = "web-sys" 1892 + version = "0.3.85" 1893 + source = "registry+https://github.com/rust-lang/crates.io-index" 1894 + checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" 1895 + dependencies = [ 1896 + "js-sys", 1897 + "wasm-bindgen", 1898 + ] 1899 + 1900 + [[package]] 1901 + name = "web-time" 1902 + version = "1.1.0" 1903 + source = "registry+https://github.com/rust-lang/crates.io-index" 1904 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 1905 + dependencies = [ 1906 + "js-sys", 1907 + "wasm-bindgen", 1908 + ] 1909 + 1910 + [[package]] 1911 + name = "webpki-roots" 1912 + version = "1.0.5" 1913 + source = "registry+https://github.com/rust-lang/crates.io-index" 1914 + checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c" 1915 + dependencies = [ 1916 + "rustls-pki-types", 1917 + ] 1918 + 1919 + [[package]] 1920 + name = "windows-core" 1921 + version = "0.62.2" 1922 + source = "registry+https://github.com/rust-lang/crates.io-index" 1923 + checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 1924 + dependencies = [ 1925 + "windows-implement", 1926 + "windows-interface", 1927 + "windows-link", 1928 + "windows-result", 1929 + "windows-strings", 1930 + ] 1931 + 1932 + [[package]] 1933 + name = "windows-implement" 1934 + version = "0.60.2" 1935 + source = "registry+https://github.com/rust-lang/crates.io-index" 1936 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 1937 + dependencies = [ 1938 + "proc-macro2", 1939 + "quote", 1940 + "syn", 1941 + ] 1942 + 1943 + [[package]] 1944 + name = "windows-interface" 1945 + version = "0.59.3" 1946 + source = "registry+https://github.com/rust-lang/crates.io-index" 1947 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 1948 + dependencies = [ 1949 + "proc-macro2", 1950 + "quote", 1951 + "syn", 1952 + ] 1953 + 1954 + [[package]] 1955 + name = "windows-link" 1956 + version = "0.2.1" 1957 + source = "registry+https://github.com/rust-lang/crates.io-index" 1958 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 1959 + 1960 + [[package]] 1961 + name = "windows-result" 1962 + version = "0.4.1" 1963 + source = "registry+https://github.com/rust-lang/crates.io-index" 1964 + checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 1965 + dependencies = [ 1966 + "windows-link", 1967 + ] 1968 + 1969 + [[package]] 1970 + name = "windows-strings" 1971 + version = "0.5.1" 1972 + source = "registry+https://github.com/rust-lang/crates.io-index" 1973 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 1974 + dependencies = [ 1975 + "windows-link", 1976 + ] 1977 + 1978 + [[package]] 1979 + name = "windows-sys" 1980 + version = "0.52.0" 1981 + source = "registry+https://github.com/rust-lang/crates.io-index" 1982 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1983 + dependencies = [ 1984 + "windows-targets 0.52.6", 1985 + ] 1986 + 1987 + [[package]] 1988 + name = "windows-sys" 1989 + version = "0.60.2" 1990 + source = "registry+https://github.com/rust-lang/crates.io-index" 1991 + checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 1992 + dependencies = [ 1993 + "windows-targets 0.53.5", 1994 + ] 1995 + 1996 + [[package]] 1997 + name = "windows-sys" 1998 + version = "0.61.2" 1999 + source = "registry+https://github.com/rust-lang/crates.io-index" 2000 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 2001 + dependencies = [ 2002 + "windows-link", 2003 + ] 2004 + 2005 + [[package]] 2006 + name = "windows-targets" 2007 + version = "0.52.6" 2008 + source = "registry+https://github.com/rust-lang/crates.io-index" 2009 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2010 + dependencies = [ 2011 + "windows_aarch64_gnullvm 0.52.6", 2012 + "windows_aarch64_msvc 0.52.6", 2013 + "windows_i686_gnu 0.52.6", 2014 + "windows_i686_gnullvm 0.52.6", 2015 + "windows_i686_msvc 0.52.6", 2016 + "windows_x86_64_gnu 0.52.6", 2017 + "windows_x86_64_gnullvm 0.52.6", 2018 + "windows_x86_64_msvc 0.52.6", 2019 + ] 2020 + 2021 + [[package]] 2022 + name = "windows-targets" 2023 + version = "0.53.5" 2024 + source = "registry+https://github.com/rust-lang/crates.io-index" 2025 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 2026 + dependencies = [ 2027 + "windows-link", 2028 + "windows_aarch64_gnullvm 0.53.1", 2029 + "windows_aarch64_msvc 0.53.1", 2030 + "windows_i686_gnu 0.53.1", 2031 + "windows_i686_gnullvm 0.53.1", 2032 + "windows_i686_msvc 0.53.1", 2033 + "windows_x86_64_gnu 0.53.1", 2034 + "windows_x86_64_gnullvm 0.53.1", 2035 + "windows_x86_64_msvc 0.53.1", 2036 + ] 2037 + 2038 + [[package]] 2039 + name = "windows_aarch64_gnullvm" 2040 + version = "0.52.6" 2041 + source = "registry+https://github.com/rust-lang/crates.io-index" 2042 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2043 + 2044 + [[package]] 2045 + name = "windows_aarch64_gnullvm" 2046 + version = "0.53.1" 2047 + source = "registry+https://github.com/rust-lang/crates.io-index" 2048 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 2049 + 2050 + [[package]] 2051 + name = "windows_aarch64_msvc" 2052 + version = "0.52.6" 2053 + source = "registry+https://github.com/rust-lang/crates.io-index" 2054 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2055 + 2056 + [[package]] 2057 + name = "windows_aarch64_msvc" 2058 + version = "0.53.1" 2059 + source = "registry+https://github.com/rust-lang/crates.io-index" 2060 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 2061 + 2062 + [[package]] 2063 + name = "windows_i686_gnu" 2064 + version = "0.52.6" 2065 + source = "registry+https://github.com/rust-lang/crates.io-index" 2066 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2067 + 2068 + [[package]] 2069 + name = "windows_i686_gnu" 2070 + version = "0.53.1" 2071 + source = "registry+https://github.com/rust-lang/crates.io-index" 2072 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 2073 + 2074 + [[package]] 2075 + name = "windows_i686_gnullvm" 2076 + version = "0.52.6" 2077 + source = "registry+https://github.com/rust-lang/crates.io-index" 2078 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2079 + 2080 + [[package]] 2081 + name = "windows_i686_gnullvm" 2082 + version = "0.53.1" 2083 + source = "registry+https://github.com/rust-lang/crates.io-index" 2084 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 2085 + 2086 + [[package]] 2087 + name = "windows_i686_msvc" 2088 + version = "0.52.6" 2089 + source = "registry+https://github.com/rust-lang/crates.io-index" 2090 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2091 + 2092 + [[package]] 2093 + name = "windows_i686_msvc" 2094 + version = "0.53.1" 2095 + source = "registry+https://github.com/rust-lang/crates.io-index" 2096 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 2097 + 2098 + [[package]] 2099 + name = "windows_x86_64_gnu" 2100 + version = "0.52.6" 2101 + source = "registry+https://github.com/rust-lang/crates.io-index" 2102 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2103 + 2104 + [[package]] 2105 + name = "windows_x86_64_gnu" 2106 + version = "0.53.1" 2107 + source = "registry+https://github.com/rust-lang/crates.io-index" 2108 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 2109 + 2110 + [[package]] 2111 + name = "windows_x86_64_gnullvm" 2112 + version = "0.52.6" 2113 + source = "registry+https://github.com/rust-lang/crates.io-index" 2114 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2115 + 2116 + [[package]] 2117 + name = "windows_x86_64_gnullvm" 2118 + version = "0.53.1" 2119 + source = "registry+https://github.com/rust-lang/crates.io-index" 2120 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 2121 + 2122 + [[package]] 2123 + name = "windows_x86_64_msvc" 2124 + version = "0.52.6" 2125 + source = "registry+https://github.com/rust-lang/crates.io-index" 2126 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2127 + 2128 + [[package]] 2129 + name = "windows_x86_64_msvc" 2130 + version = "0.53.1" 2131 + source = "registry+https://github.com/rust-lang/crates.io-index" 2132 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 2133 + 2134 + [[package]] 2135 + name = "wit-bindgen" 2136 + version = "0.51.0" 2137 + source = "registry+https://github.com/rust-lang/crates.io-index" 2138 + checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" 2139 + 2140 + [[package]] 2141 + name = "writeable" 2142 + version = "0.6.2" 2143 + source = "registry+https://github.com/rust-lang/crates.io-index" 2144 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 2145 + 2146 + [[package]] 2147 + name = "xxhash-rust" 2148 + version = "0.8.15" 2149 + source = "registry+https://github.com/rust-lang/crates.io-index" 2150 + checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" 2151 + 2152 + [[package]] 2153 + name = "yoke" 2154 + version = "0.8.1" 2155 + source = "registry+https://github.com/rust-lang/crates.io-index" 2156 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 2157 + dependencies = [ 2158 + "stable_deref_trait", 2159 + "yoke-derive", 2160 + "zerofrom", 2161 + ] 2162 + 2163 + [[package]] 2164 + name = "yoke-derive" 2165 + version = "0.8.1" 2166 + source = "registry+https://github.com/rust-lang/crates.io-index" 2167 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 2168 + dependencies = [ 2169 + "proc-macro2", 2170 + "quote", 2171 + "syn", 2172 + "synstructure", 2173 + ] 2174 + 2175 + [[package]] 2176 + name = "zerocopy" 2177 + version = "0.8.33" 2178 + source = "registry+https://github.com/rust-lang/crates.io-index" 2179 + checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" 2180 + dependencies = [ 2181 + "zerocopy-derive", 2182 + ] 2183 + 2184 + [[package]] 2185 + name = "zerocopy-derive" 2186 + version = "0.8.33" 2187 + source = "registry+https://github.com/rust-lang/crates.io-index" 2188 + checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" 2189 + dependencies = [ 2190 + "proc-macro2", 2191 + "quote", 2192 + "syn", 2193 + ] 2194 + 2195 + [[package]] 2196 + name = "zerofrom" 2197 + version = "0.1.6" 2198 + source = "registry+https://github.com/rust-lang/crates.io-index" 2199 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2200 + dependencies = [ 2201 + "zerofrom-derive", 2202 + ] 2203 + 2204 + [[package]] 2205 + name = "zerofrom-derive" 2206 + version = "0.1.6" 2207 + source = "registry+https://github.com/rust-lang/crates.io-index" 2208 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2209 + dependencies = [ 2210 + "proc-macro2", 2211 + "quote", 2212 + "syn", 2213 + "synstructure", 2214 + ] 2215 + 2216 + [[package]] 2217 + name = "zeroize" 2218 + version = "1.8.2" 2219 + source = "registry+https://github.com/rust-lang/crates.io-index" 2220 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 2221 + 2222 + [[package]] 2223 + name = "zerotrie" 2224 + version = "0.2.3" 2225 + source = "registry+https://github.com/rust-lang/crates.io-index" 2226 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 2227 + dependencies = [ 2228 + "displaydoc", 2229 + "yoke", 2230 + "zerofrom", 2231 + ] 2232 + 2233 + [[package]] 2234 + name = "zerovec" 2235 + version = "0.11.5" 2236 + source = "registry+https://github.com/rust-lang/crates.io-index" 2237 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 2238 + dependencies = [ 2239 + "yoke", 2240 + "zerofrom", 2241 + "zerovec-derive", 2242 + ] 2243 + 2244 + [[package]] 2245 + name = "zerovec-derive" 2246 + version = "0.11.2" 2247 + source = "registry+https://github.com/rust-lang/crates.io-index" 2248 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 2249 + dependencies = [ 2250 + "proc-macro2", 2251 + "quote", 2252 + "syn", 2253 + ] 2254 + 2255 + [[package]] 2256 + name = "zmij" 2257 + version = "1.0.16" 2258 + source = "registry+https://github.com/rust-lang/crates.io-index" 2259 + checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
+17
Cargo.toml
···
··· 1 + [package] 2 + name = "aturlist" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [dependencies] 7 + tapped = { git = "https://github.com/thombles/tapped" } 8 + tokio = { version = "1", features = ["full"] } 9 + axum = "0.7" 10 + serde = { version = "1", features = ["derive"] } 11 + serde_json = "1" 12 + anyhow = "1" 13 + fjall = "3.0.1" 14 + tracing = "0.1" 15 + tracing-subscriber = "0.3" 16 + futures = "0.3" 17 + chrono = "0.4"
+23
default.nix
···
··· 1 + { 2 + lib, 3 + rustPlatform, 4 + ... 5 + }: 6 + rustPlatform.buildRustPackage { 7 + pname = "aturlist"; 8 + version = "main"; 9 + 10 + src = lib.fileset.toSource { 11 + root = ./.; 12 + fileset = lib.fileset.unions [ 13 + ./src ./Cargo.toml ./Cargo.lock 14 + ]; 15 + }; 16 + 17 + cargoLock = { 18 + lockFile = ./Cargo.lock; 19 + outputHashes = { 20 + "tapped-0.1.0" = "sha256-hhmlyR9BomcyZMTQAoJWLmTF9cyuVEjU4yceQFmHi9I="; 21 + }; 22 + }; 23 + }
+3
flake.nix
··· 13 ... 14 }: 15 { 16 devShells = { 17 default = pkgs.mkShell { 18 buildInputs = with pkgs; [ 19 rust-analyzer 20 cargo 21 ]; 22 }; 23 };
··· 13 ... 14 }: 15 { 16 + packages.default = pkgs.callPackage ./default.nix {}; 17 devShells = { 18 default = pkgs.mkShell { 19 buildInputs = with pkgs; [ 20 rust-analyzer 21 cargo 22 + gemini-cli 23 + go 24 ]; 25 }; 26 };
+303
src/main.rs
···
··· 1 + use axum::{ 2 + extract::{Query, State}, 3 + routing::get, 4 + Json, Router, 5 + }; 6 + use serde::{Deserialize, Serialize}; 7 + use tracing::{info, error, warn}; 8 + use tapped::{TapClient, Event, RecordAction, RecordEvent}; 9 + use fjall::{Database, Keyspace, KeyspaceCreateOptions}; 10 + 11 + #[derive(Clone)] 12 + struct AppState { 13 + db: Database, 14 + counts: Keyspace, 15 + } 16 + 17 + #[tokio::main] 18 + async fn main() -> anyhow::Result<()> { 19 + tracing_subscriber::fmt::init(); 20 + 21 + let db = Database::builder("aturlist_fjall").open()?; 22 + // open keyspaces 23 + let counts = db.keyspace("counts", || KeyspaceCreateOptions::default())?; 24 + 25 + let state = AppState { 26 + db: db.clone(), 27 + counts: counts.clone(), 28 + }; 29 + 30 + // start tap consumer 31 + let db_clone = state.db.clone(); 32 + let counts_clone = state.counts.clone(); 33 + tokio::spawn(async move { 34 + run_tap_consumer(db_clone, counts_clone).await; 35 + }); 36 + 37 + let app = Router::new() 38 + .route("/xrpc/systems.gaze.aturlist.listRecords", get(list_records)) 39 + .route("/xrpc/systems.gaze.aturlist.countRecords", get(count_records)) 40 + .with_state(state); 41 + 42 + let listener = tokio::net::TcpListener::bind("0.0.0.0:7155").await?; 43 + info!("listening on {}", listener.local_addr()?); 44 + axum::serve(listener, app).await?; 45 + 46 + Ok(()) 47 + } 48 + 49 + async fn run_tap_consumer(db: Database, counts: Keyspace) { 50 + let tap_url = "http://localhost:2480"; 51 + 52 + loop { 53 + info!("connecting to tap at {}", tap_url); 54 + match TapClient::new(tap_url) { 55 + Ok(client) => { 56 + if let Err(e) = client.health().await { 57 + warn!("tap health check failed: {}", e); 58 + tokio::time::sleep(std::time::Duration::from_secs(5)).await; 59 + continue; 60 + } 61 + 62 + match client.channel().await { 63 + Ok(mut receiver) => { 64 + info!("connected to tap firehose"); 65 + while let Ok(event) = receiver.recv().await { 66 + if let Event::Record(rec) = &*event { 67 + if let Err(e) = handle_record(&db, &counts, rec) { 68 + error!("error handling record: {}", e); 69 + } 70 + } 71 + } 72 + warn!("tap channel closed"); 73 + } 74 + Err(e) => { 75 + warn!("failed to subscribe to channel: {}", e); 76 + } 77 + } 78 + } 79 + Err(e) => { 80 + warn!("failed to create tap client: {}", e); 81 + } 82 + } 83 + tokio::time::sleep(std::time::Duration::from_secs(5)).await; 84 + } 85 + } 86 + 87 + fn strip_did_prefix(did: &str) -> &str { 88 + did.strip_prefix("did:").unwrap_or(did) 89 + } 90 + 91 + fn handle_record(db: &Database, counts: &Keyspace, rec: &RecordEvent) -> anyhow::Result<()> { 92 + // partition by collection 93 + let records = db.keyspace(&rec.collection, KeyspaceCreateOptions::default)?; 94 + 95 + // index everything, no filter. 96 + // key: strip_did(did)|rkey 97 + let key = make_key(strip_did_prefix(&rec.did), &rec.rkey); 98 + 99 + // logic to maintain counts: 100 + // create: insert and increment. 101 + // update: insert (overwrite). no count change. 102 + // delete: remove and decrement. 103 + 104 + match rec.action { 105 + RecordAction::Create => { 106 + info!("creating {} {} {}", rec.did, rec.collection, rec.rkey); 107 + records.insert(&key, &[])?; 108 + increment_count(counts, strip_did_prefix(&rec.did), &rec.collection)?; 109 + } 110 + RecordAction::Update => { 111 + info!("updating {} {} {}", rec.did, rec.collection, rec.rkey); 112 + records.insert(&key, &[])?; 113 + } 114 + RecordAction::Delete => { 115 + info!("deleting {} {} {}", rec.did, rec.collection, rec.rkey); 116 + records.remove(&key)?; 117 + decrement_count(counts, strip_did_prefix(&rec.did), &rec.collection)?; 118 + } 119 + _ => {} 120 + } 121 + Ok(()) 122 + } 123 + 124 + fn make_key(repo_stripped: &str, rkey: &str) -> Vec<u8> { 125 + format!("{}|{}", repo_stripped, rkey).into_bytes() 126 + } 127 + 128 + fn make_count_key(repo_stripped: &str, collection: &str) -> Vec<u8> { 129 + format!("{}|{}", repo_stripped, collection).into_bytes() 130 + } 131 + 132 + fn increment_count(counts: &Keyspace, repo_stripped: &str, collection: &str) -> anyhow::Result<()> { 133 + let key = make_count_key(repo_stripped, collection); 134 + let mut current = 0u64; 135 + if let Some(val) = counts.get(&key)? { 136 + if val.len() == 8 { 137 + current = u64::from_le_bytes(val[..].try_into().unwrap()); 138 + } 139 + } 140 + current += 1; 141 + counts.insert(&key, current.to_le_bytes())?; 142 + Ok(()) 143 + } 144 + 145 + fn decrement_count(counts: &Keyspace, repo_stripped: &str, collection: &str) -> anyhow::Result<()> { 146 + let key = make_count_key(repo_stripped, collection); 147 + let mut current = 0u64; 148 + if let Some(val) = counts.get(&key)? { 149 + if val.len() == 8 { 150 + current = u64::from_le_bytes(val[..].try_into().unwrap()); 151 + } 152 + } 153 + if current > 0 { 154 + current -= 1; 155 + counts.insert(&key, current.to_le_bytes())?; 156 + } 157 + Ok(()) 158 + } 159 + 160 + // handlers 161 + 162 + #[derive(Deserialize)] 163 + struct ListRecordsParams { 164 + repo: String, 165 + collection: String, 166 + cursor: Option<String>, 167 + reverse: Option<bool>, 168 + limit: Option<usize>, 169 + } 170 + 171 + #[derive(Serialize)] 172 + struct ListRecordsResponse { 173 + aturis: Vec<String>, 174 + // count field is usually empty in listRecords but we can leave it 0 175 + count: usize, 176 + #[serde(skip_serializing_if = "Option::is_none")] 177 + cursor: Option<String>, 178 + } 179 + 180 + async fn list_records( 181 + State(state): State<AppState>, 182 + Query(params): Query<ListRecordsParams>, 183 + ) -> Json<ListRecordsResponse> { 184 + let records = match state.db.keyspace(&params.collection, || KeyspaceCreateOptions::default()) { 185 + Ok(p) => p, 186 + Err(_) => { 187 + return Json(ListRecordsResponse { 188 + aturis: Vec::new(), 189 + count: 0, 190 + cursor: None, 191 + }); 192 + } 193 + }; 194 + 195 + let repo_stripped = strip_did_prefix(&params.repo); 196 + let prefix_str = format!("{}|", repo_stripped); 197 + let prefix = prefix_str.as_bytes(); 198 + 199 + // default to descending (newest first) -> reverse=false means descending. 200 + // reverse=true means ascending. 201 + let ascending = params.reverse.unwrap_or(false); 202 + let limit = params.limit.unwrap_or(50).min(500); 203 + 204 + let mut aturis = Vec::new(); 205 + let mut last_rkey = None; 206 + 207 + let start_bound = if ascending { 208 + if let Some(c) = &params.cursor { 209 + let mut k = make_key(repo_stripped, c); 210 + k.push(0); // start after cursor 211 + k 212 + } else { 213 + prefix.to_vec() 214 + } 215 + } else { 216 + // descending 217 + prefix.to_vec() 218 + }; 219 + 220 + let end_bound = if ascending { 221 + let mut p = prefix.to_vec(); 222 + p.push(0xFF); 223 + p 224 + } else { 225 + // descending 226 + if let Some(c) = &params.cursor { 227 + make_key(repo_stripped, c) 228 + } else { 229 + let mut p = prefix.to_vec(); 230 + p.push(0xFF); 231 + p 232 + } 233 + }; 234 + 235 + let range = records.range(start_bound..end_bound); 236 + 237 + let mut process_key = |k: &[u8]| { 238 + let k_str = String::from_utf8_lossy(k); 239 + let parts: Vec<&str> = k_str.split('|').collect(); 240 + // key format: repo_stripped|rkey 241 + if parts.len() == 2 { 242 + let rkey = parts[1]; 243 + aturis.push(format!("at://{}/{}/{}", params.repo, params.collection, rkey)); 244 + last_rkey = Some(rkey.to_string()); 245 + } 246 + }; 247 + 248 + if ascending { 249 + for item in range.take(limit) { 250 + if let Ok(k) = item.key() { 251 + process_key(&k); 252 + } 253 + } 254 + } else { 255 + for item in range.rev().take(limit) { 256 + if let Ok(k) = item.key() { 257 + process_key(&k); 258 + } 259 + } 260 + } 261 + 262 + let count = aturis.len(); 263 + 264 + Json(ListRecordsResponse { 265 + aturis, 266 + count, 267 + cursor: last_rkey, 268 + }) 269 + } 270 + 271 + #[derive(Deserialize)] 272 + struct CountRecordsParams { 273 + repo: String, 274 + collection: String, 275 + } 276 + 277 + #[derive(Serialize)] 278 + struct CountRecordsResponse { 279 + repo: String, 280 + collection: String, 281 + count: u64, 282 + } 283 + 284 + async fn count_records( 285 + State(state): State<AppState>, 286 + Query(params): Query<CountRecordsParams>, 287 + ) -> Json<CountRecordsResponse> { 288 + let repo_stripped = strip_did_prefix(&params.repo); 289 + let key = make_count_key(repo_stripped, &params.collection); 290 + let mut count = 0u64; 291 + 292 + if let Ok(Some(val)) = state.counts.get(&key) { 293 + if val.len() == 8 { 294 + count = u64::from_le_bytes(val[..].try_into().unwrap()); 295 + } 296 + } 297 + 298 + Json(CountRecordsResponse { 299 + repo: params.repo, 300 + collection: params.collection, 301 + count, 302 + }) 303 + }
+111
verify_pds.nu
···
··· 1 + #!/usr/bin/env nu 2 + 3 + let did = "did:plc:dfl62fgb7wtjj3fcbb72naae" 4 + let pds_host = "https://zwsp.xyz" 5 + 6 + # wait for indexing 7 + print "waiting for services to stabilize..." 8 + sleep 5sec 9 + 10 + # add dids to tap 11 + let dids = ["did:plc:dfl62fgb7wtjj3fcbb72naae", "did:plc:dumbmutt4po52ept2tczimje"] 12 + try { 13 + let body = {dids: $dids} | to json 14 + http post --content-type application/json "http://127.0.0.1:2480/repos/add" $body 15 + } catch { 16 + print "tap add repos failed (maybe already running)" 17 + } 18 + 19 + sleep 5sec 20 + 21 + # 1. test app.bsky.actor.profile (single record) 22 + let collection = "app.bsky.actor.profile" 23 + print $"verifying ($collection) for ($did)..." 24 + 25 + let atur_url = $"http://127.0.0.1:7155/xrpc/systems.gaze.aturlist.listRecords?repo=($did)&collection=($collection)" 26 + print $"aturlist url: ($atur_url)" 27 + let atur_res = (http get $atur_url) 28 + let atur_uris = ($atur_res.aturis | sort) 29 + 30 + let pds_url = $"($pds_host)/xrpc/com.atproto.repo.listRecords?repo=($did)&collection=($collection)" 31 + print $"pds url: ($pds_url)" 32 + let pds_res = (http get $pds_url) 33 + let pds_uris = ($pds_res.records | each {|r| $r.uri } | sort) 34 + 35 + if ($atur_uris == $pds_uris) { 36 + print "success: profile matches." 37 + } else { 38 + print "failure: profile mismatch." 39 + print "aturlist: " $atur_uris 40 + print "pds: " $pds_uris 41 + exit 1 42 + } 43 + 44 + # 2. test app.bsky.feed.like (multiple records) 45 + let collection = "app.bsky.feed.like" 46 + let limit = 20 47 + 48 + # ascending check (oldest) 49 + print $"\nverifying ($collection) ascending \(oldest\)..." 50 + # aturlist: reverse=true -> ascending 51 + let atur_url_asc = $"http://127.0.0.1:7155/xrpc/systems.gaze.aturlist.listRecords?repo=($did)&collection=($collection)&reverse=true" 52 + print $"aturlist asc url: ($atur_url_asc)" 53 + let atur_res_asc = (http get $atur_url_asc) 54 + let atur_uris_asc = ($atur_res_asc.aturis | first $limit) 55 + 56 + # pds: reverse=true -> ascending 57 + let pds_url_asc = $"($pds_host)/xrpc/com.atproto.repo.listRecords?repo=($did)&collection=($collection)&limit=($limit)&reverse=true" 58 + print $"pds asc url: ($pds_url_asc)" 59 + let pds_res_asc = (http get $pds_url_asc) 60 + let pds_uris_asc = ($pds_res_asc.records | each {|r| $r.uri }) 61 + 62 + if ($atur_uris_asc == $pds_uris_asc) { 63 + print "success: ascending (oldest) matches." 64 + } else { 65 + print "failure: ascending mismatch." 66 + print "aturlist:" $atur_uris_asc 67 + print "pds:" $pds_uris_asc 68 + exit 1 69 + } 70 + 71 + # descending check (newest) 72 + print $"\nverifying ($collection) descending \(newest\)..." 73 + # aturlist: reverse=false (default) -> descending 74 + let atur_url_desc = $"http://127.0.0.1:7155/xrpc/systems.gaze.aturlist.listRecords?repo=($did)&collection=($collection)&reverse=false" 75 + print $"aturlist desc url: ($atur_url_desc)" 76 + let atur_res_desc = (http get $atur_url_desc) 77 + let atur_uris_desc = ($atur_res_desc.aturis | first $limit) 78 + 79 + # pds: reverse=false (default) -> descending 80 + let pds_url_desc = $"($pds_host)/xrpc/com.atproto.repo.listRecords?repo=($did)&collection=($collection)&limit=($limit)&reverse=false" 81 + print $"pds desc url: ($pds_url_desc)" 82 + let pds_res_desc = (http get $pds_url_desc) 83 + let pds_uris_desc = ($pds_res_desc.records | each {|r| $r.uri }) 84 + 85 + if ($atur_uris_desc == $pds_uris_desc) { 86 + print "success: descending (newest) matches perfectly." 87 + } else { 88 + # check for lag consistency 89 + let head = ($atur_uris_desc | first) 90 + if ($head in $pds_uris_desc) { 91 + print "warning: lag detected, but consistent." 92 + } else { 93 + print "failure: descending mismatch (and head not found in pds top 20)." 94 + exit 1 95 + } 96 + } 97 + 98 + # 3. test countrecords 99 + print $"\nverifying countrecords for ($collection)..." 100 + let atur_count_url = $"http://127.0.0.1:7155/xrpc/systems.gaze.aturlist.countRecords?repo=($did)&collection=($collection)" 101 + print $"aturlist count url: ($atur_count_url)" 102 + let atur_count_res = (http get $atur_count_url) 103 + print $"aturlist count: ($atur_count_res.count)" 104 + 105 + if ($atur_count_res.count > 0) { 106 + print "success: count is positive." 107 + } else { 108 + print "warning: count is 0 (expected if db was reused without migration/reindex)." 109 + } 110 + 111 + print "\nverification summary: success."