Firehose event processing & storing in stupid db :3 #1

merged
opened by lewis.moe targeting main
  • Add firehose.rs that processes events
  • Add postgres db connection that saves the events (can turn to timescale or something silly later)
+1
.gitignore
··· 1 1 /target 2 + /.sqlx
+1291 -52
Cargo.lock
··· 17 17 source = "registry+https://github.com/rust-lang/crates.io-index" 18 18 checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 19 20 + [[package]] 21 + name = "ahash" 22 + version = "0.8.12" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" 25 + dependencies = [ 26 + "cfg-if", 27 + "getrandom 0.3.3", 28 + "once_cell", 29 + "version_check", 30 + "zerocopy", 31 + ] 32 + 33 + [[package]] 34 + name = "allocator-api2" 35 + version = "0.2.21" 36 + source = "registry+https://github.com/rust-lang/crates.io-index" 37 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 38 + 39 + [[package]] 40 + name = "android_system_properties" 41 + version = "0.1.5" 42 + source = "registry+https://github.com/rust-lang/crates.io-index" 43 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 44 + dependencies = [ 45 + "libc", 46 + ] 47 + 48 + [[package]] 49 + name = "arrayref" 50 + version = "0.3.9" 51 + source = "registry+https://github.com/rust-lang/crates.io-index" 52 + checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 53 + 54 + [[package]] 55 + name = "arrayvec" 56 + version = "0.7.6" 57 + source = "registry+https://github.com/rust-lang/crates.io-index" 58 + checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 59 + 60 + [[package]] 61 + name = "async-stream" 62 + version = "0.3.6" 63 + source = "registry+https://github.com/rust-lang/crates.io-index" 64 + checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" 65 + dependencies = [ 66 + "async-stream-impl", 67 + "futures-core", 68 + "pin-project-lite", 69 + ] 70 + 71 + [[package]] 72 + name = "async-stream-impl" 73 + version = "0.3.6" 74 + source = "registry+https://github.com/rust-lang/crates.io-index" 75 + checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" 76 + dependencies = [ 77 + "proc-macro2", 78 + "quote", 79 + "syn 2.0.106", 80 + ] 81 + 82 + [[package]] 83 + name = "atoi" 84 + version = "2.0.0" 85 + source = "registry+https://github.com/rust-lang/crates.io-index" 86 + checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 87 + dependencies = [ 88 + "num-traits", 89 + ] 90 + 20 91 [[package]] 21 92 name = "atomic-waker" 22 93 version = "1.1.2" ··· 95 166 "miniz_oxide", 96 167 "object", 97 168 "rustc-demangle", 98 - "windows-targets", 169 + "windows-targets 0.52.6", 99 170 ] 100 171 172 + [[package]] 173 + name = "base-x" 174 + version = "0.2.11" 175 + source = "registry+https://github.com/rust-lang/crates.io-index" 176 + checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" 177 + 178 + [[package]] 179 + name = "base256emoji" 180 + version = "1.0.2" 181 + source = "registry+https://github.com/rust-lang/crates.io-index" 182 + checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" 183 + dependencies = [ 184 + "const-str", 185 + "match-lookup", 186 + ] 187 + 188 + [[package]] 189 + name = "base64" 190 + version = "0.21.7" 191 + source = "registry+https://github.com/rust-lang/crates.io-index" 192 + checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 193 + 101 194 [[package]] 102 195 name = "base64" 103 196 version = "0.22.1" 104 197 source = "registry+https://github.com/rust-lang/crates.io-index" 105 198 checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 106 199 200 + [[package]] 201 + name = "base64ct" 202 + version = "1.8.0" 203 + source = "registry+https://github.com/rust-lang/crates.io-index" 204 + checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" 205 + 107 206 [[package]] 108 207 name = "bitflags" 109 208 version = "2.9.4" 110 209 source = "registry+https://github.com/rust-lang/crates.io-index" 111 210 checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 211 + dependencies = [ 212 + "serde", 213 + ] 214 + 215 + [[package]] 216 + name = "blake2b_simd" 217 + version = "1.0.3" 218 + source = "registry+https://github.com/rust-lang/crates.io-index" 219 + checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" 220 + dependencies = [ 221 + "arrayref", 222 + "arrayvec", 223 + "constant_time_eq", 224 + ] 112 225 113 226 [[package]] 114 227 name = "block-buffer" ··· 125 238 source = "registry+https://github.com/rust-lang/crates.io-index" 126 239 checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 127 240 241 + [[package]] 242 + name = "byteorder" 243 + version = "1.5.0" 244 + source = "registry+https://github.com/rust-lang/crates.io-index" 245 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 246 + 128 247 [[package]] 129 248 name = "bytes" 130 249 version = "1.10.1" 131 250 source = "registry+https://github.com/rust-lang/crates.io-index" 132 251 checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 133 252 253 + [[package]] 254 + name = "cbor4ii" 255 + version = "0.2.14" 256 + source = "registry+https://github.com/rust-lang/crates.io-index" 257 + checksum = "b544cf8c89359205f4f990d0e6f3828db42df85b5dac95d09157a250eb0749c4" 258 + dependencies = [ 259 + "serde", 260 + ] 261 + 134 262 [[package]] 135 263 name = "cc" 136 264 version = "1.2.39" ··· 147 275 source = "registry+https://github.com/rust-lang/crates.io-index" 148 276 checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 149 277 278 + [[package]] 279 + name = "chrono" 280 + version = "0.4.42" 281 + source = "registry+https://github.com/rust-lang/crates.io-index" 282 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 283 + dependencies = [ 284 + "iana-time-zone", 285 + "js-sys", 286 + "num-traits", 287 + "wasm-bindgen", 288 + "windows-link 0.2.0", 289 + ] 290 + 291 + [[package]] 292 + name = "cid" 293 + version = "0.11.1" 294 + source = "registry+https://github.com/rust-lang/crates.io-index" 295 + checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" 296 + dependencies = [ 297 + "core2", 298 + "multibase", 299 + "multihash", 300 + "serde", 301 + "serde_bytes", 302 + "unsigned-varint", 303 + ] 304 + 305 + [[package]] 306 + name = "const-oid" 307 + version = "0.9.6" 308 + source = "registry+https://github.com/rust-lang/crates.io-index" 309 + checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 310 + 311 + [[package]] 312 + name = "const-str" 313 + version = "0.4.3" 314 + source = "registry+https://github.com/rust-lang/crates.io-index" 315 + checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" 316 + 317 + [[package]] 318 + name = "constant_time_eq" 319 + version = "0.3.1" 320 + source = "registry+https://github.com/rust-lang/crates.io-index" 321 + checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" 322 + 150 323 [[package]] 151 324 name = "core-foundation" 152 325 version = "0.9.4" ··· 163 336 source = "registry+https://github.com/rust-lang/crates.io-index" 164 337 checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 165 338 339 + [[package]] 340 + name = "core2" 341 + version = "0.4.0" 342 + source = "registry+https://github.com/rust-lang/crates.io-index" 343 + checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" 344 + dependencies = [ 345 + "memchr", 346 + ] 347 + 166 348 [[package]] 167 349 name = "cpufeatures" 168 350 version = "0.2.17" ··· 172 354 "libc", 173 355 ] 174 356 357 + [[package]] 358 + name = "crc" 359 + version = "3.3.0" 360 + source = "registry+https://github.com/rust-lang/crates.io-index" 361 + checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" 362 + dependencies = [ 363 + "crc-catalog", 364 + ] 365 + 366 + [[package]] 367 + name = "crc-catalog" 368 + version = "2.4.0" 369 + source = "registry+https://github.com/rust-lang/crates.io-index" 370 + checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 371 + 372 + [[package]] 373 + name = "crossbeam-queue" 374 + version = "0.3.12" 375 + source = "registry+https://github.com/rust-lang/crates.io-index" 376 + checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 377 + dependencies = [ 378 + "crossbeam-utils", 379 + ] 380 + 381 + [[package]] 382 + name = "crossbeam-utils" 383 + version = "0.8.21" 384 + source = "registry+https://github.com/rust-lang/crates.io-index" 385 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 386 + 175 387 [[package]] 176 388 name = "crypto-common" 177 389 version = "0.1.6" ··· 188 400 source = "registry+https://github.com/rust-lang/crates.io-index" 189 401 checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 190 402 403 + [[package]] 404 + name = "data-encoding-macro" 405 + version = "0.1.18" 406 + source = "registry+https://github.com/rust-lang/crates.io-index" 407 + checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" 408 + dependencies = [ 409 + "data-encoding", 410 + "data-encoding-macro-internal", 411 + ] 412 + 413 + [[package]] 414 + name = "data-encoding-macro-internal" 415 + version = "0.1.16" 416 + source = "registry+https://github.com/rust-lang/crates.io-index" 417 + checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" 418 + dependencies = [ 419 + "data-encoding", 420 + "syn 2.0.106", 421 + ] 422 + 423 + [[package]] 424 + name = "der" 425 + version = "0.7.10" 426 + source = "registry+https://github.com/rust-lang/crates.io-index" 427 + checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 428 + dependencies = [ 429 + "const-oid", 430 + "pem-rfc7468", 431 + "zeroize", 432 + ] 433 + 191 434 [[package]] 192 435 name = "digest" 193 436 version = "0.10.7" ··· 195 438 checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 196 439 dependencies = [ 197 440 "block-buffer", 441 + "const-oid", 198 442 "crypto-common", 443 + "subtle", 199 444 ] 200 445 201 446 [[package]] ··· 206 451 dependencies = [ 207 452 "proc-macro2", 208 453 "quote", 209 - "syn", 454 + "syn 2.0.106", 455 + ] 456 + 457 + [[package]] 458 + name = "dotenvy" 459 + version = "0.15.7" 460 + source = "registry+https://github.com/rust-lang/crates.io-index" 461 + checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 462 + 463 + [[package]] 464 + name = "either" 465 + version = "1.15.0" 466 + source = "registry+https://github.com/rust-lang/crates.io-index" 467 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 468 + dependencies = [ 469 + "serde", 210 470 ] 211 471 212 472 [[package]] ··· 234 494 "windows-sys 0.61.1", 235 495 ] 236 496 497 + [[package]] 498 + name = "etcetera" 499 + version = "0.8.0" 500 + source = "registry+https://github.com/rust-lang/crates.io-index" 501 + checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 502 + dependencies = [ 503 + "cfg-if", 504 + "home", 505 + "windows-sys 0.48.0", 506 + ] 507 + 508 + [[package]] 509 + name = "event-listener" 510 + version = "2.5.3" 511 + source = "registry+https://github.com/rust-lang/crates.io-index" 512 + checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 513 + 237 514 [[package]] 238 515 name = "fastrand" 239 516 version = "2.3.0" ··· 246 523 source = "registry+https://github.com/rust-lang/crates.io-index" 247 524 checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" 248 525 526 + [[package]] 527 + name = "flume" 528 + version = "0.11.1" 529 + source = "registry+https://github.com/rust-lang/crates.io-index" 530 + checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 531 + dependencies = [ 532 + "futures-core", 533 + "futures-sink", 534 + "spin", 535 + ] 536 + 249 537 [[package]] 250 538 name = "fnv" 251 539 version = "1.0.7" ··· 318 606 "futures-util", 319 607 ] 320 608 609 + [[package]] 610 + name = "futures-intrusive" 611 + version = "0.5.0" 612 + source = "registry+https://github.com/rust-lang/crates.io-index" 613 + checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 614 + dependencies = [ 615 + "futures-core", 616 + "lock_api", 617 + "parking_lot", 618 + ] 619 + 321 620 [[package]] 322 621 name = "futures-io" 323 622 version = "0.3.31" ··· 332 631 dependencies = [ 333 632 "proc-macro2", 334 633 "quote", 335 - "syn", 634 + "syn 2.0.106", 336 635 ] 337 636 338 637 [[package]] ··· 423 722 "tracing", 424 723 ] 425 724 725 + [[package]] 726 + name = "half" 727 + version = "1.8.3" 728 + source = "registry+https://github.com/rust-lang/crates.io-index" 729 + checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" 730 + 731 + [[package]] 732 + name = "hashbrown" 733 + version = "0.14.5" 734 + source = "registry+https://github.com/rust-lang/crates.io-index" 735 + checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 736 + dependencies = [ 737 + "ahash", 738 + "allocator-api2", 739 + ] 740 + 426 741 [[package]] 427 742 name = "hashbrown" 428 743 version = "0.16.0" 429 744 source = "registry+https://github.com/rust-lang/crates.io-index" 430 745 checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 431 746 747 + [[package]] 748 + name = "hashlink" 749 + version = "0.8.4" 750 + source = "registry+https://github.com/rust-lang/crates.io-index" 751 + checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" 752 + dependencies = [ 753 + "hashbrown 0.14.5", 754 + ] 755 + 756 + [[package]] 757 + name = "heck" 758 + version = "0.4.1" 759 + source = "registry+https://github.com/rust-lang/crates.io-index" 760 + checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 761 + dependencies = [ 762 + "unicode-segmentation", 763 + ] 764 + 765 + [[package]] 766 + name = "hex" 767 + version = "0.4.3" 768 + source = "registry+https://github.com/rust-lang/crates.io-index" 769 + checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 770 + 771 + [[package]] 772 + name = "hkdf" 773 + version = "0.12.4" 774 + source = "registry+https://github.com/rust-lang/crates.io-index" 775 + checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 776 + dependencies = [ 777 + "hmac", 778 + ] 779 + 780 + [[package]] 781 + name = "hmac" 782 + version = "0.12.1" 783 + source = "registry+https://github.com/rust-lang/crates.io-index" 784 + checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 785 + dependencies = [ 786 + "digest", 787 + ] 788 + 789 + [[package]] 790 + name = "home" 791 + version = "0.5.11" 792 + source = "registry+https://github.com/rust-lang/crates.io-index" 793 + checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 794 + dependencies = [ 795 + "windows-sys 0.59.0", 796 + ] 797 + 432 798 [[package]] 433 799 name = "http" 434 800 version = "1.3.1" ··· 507 873 "http", 508 874 "hyper", 509 875 "hyper-util", 510 - "rustls", 876 + "rustls 0.23.32", 511 877 "rustls-pki-types", 512 878 "tokio", 513 879 "tokio-rustls", ··· 536 902 source = "registry+https://github.com/rust-lang/crates.io-index" 537 903 checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 538 904 dependencies = [ 539 - "base64", 905 + "base64 0.22.1", 540 906 "bytes", 541 907 "futures-channel", 542 908 "futures-core", ··· 556 922 "windows-registry", 557 923 ] 558 924 925 + [[package]] 926 + name = "iana-time-zone" 927 + version = "0.1.64" 928 + source = "registry+https://github.com/rust-lang/crates.io-index" 929 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 930 + dependencies = [ 931 + "android_system_properties", 932 + "core-foundation-sys", 933 + "iana-time-zone-haiku", 934 + "js-sys", 935 + "log", 936 + "wasm-bindgen", 937 + "windows-core", 938 + ] 939 + 940 + [[package]] 941 + name = "iana-time-zone-haiku" 942 + version = "0.1.2" 943 + source = "registry+https://github.com/rust-lang/crates.io-index" 944 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 945 + dependencies = [ 946 + "cc", 947 + ] 948 + 559 949 [[package]] 560 950 name = "icu_collections" 561 951 version = "2.0.0" ··· 670 1060 checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" 671 1061 dependencies = [ 672 1062 "equivalent", 673 - "hashbrown", 1063 + "hashbrown 0.16.0", 674 1064 ] 675 1065 676 1066 [[package]] ··· 684 1074 "libc", 685 1075 ] 686 1076 1077 + [[package]] 1078 + name = "ipld-core" 1079 + version = "0.4.2" 1080 + source = "registry+https://github.com/rust-lang/crates.io-index" 1081 + checksum = "104718b1cc124d92a6d01ca9c9258a7df311405debb3408c445a36452f9bf8db" 1082 + dependencies = [ 1083 + "cid", 1084 + "serde", 1085 + "serde_bytes", 1086 + ] 1087 + 687 1088 [[package]] 688 1089 name = "ipnet" 689 1090 version = "2.11.0" ··· 721 1122 version = "1.5.0" 722 1123 source = "registry+https://github.com/rust-lang/crates.io-index" 723 1124 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1125 + dependencies = [ 1126 + "spin", 1127 + ] 724 1128 725 1129 [[package]] 726 1130 name = "libc" ··· 729 1133 checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 730 1134 731 1135 [[package]] 732 - name = "linux-raw-sys" 733 - version = "0.11.0" 1136 + name = "libm" 1137 + version = "0.2.15" 1138 + source = "registry+https://github.com/rust-lang/crates.io-index" 1139 + checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 1140 + 1141 + [[package]] 1142 + name = "libredox" 1143 + version = "0.1.10" 1144 + source = "registry+https://github.com/rust-lang/crates.io-index" 1145 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 1146 + dependencies = [ 1147 + "bitflags", 1148 + "libc", 1149 + "redox_syscall", 1150 + ] 1151 + 1152 + [[package]] 1153 + name = "libsqlite3-sys" 1154 + version = "0.27.0" 1155 + source = "registry+https://github.com/rust-lang/crates.io-index" 1156 + checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" 1157 + dependencies = [ 1158 + "cc", 1159 + "pkg-config", 1160 + "vcpkg", 1161 + ] 1162 + 1163 + [[package]] 1164 + name = "linux-raw-sys" 1165 + version = "0.11.0" 734 1166 source = "registry+https://github.com/rust-lang/crates.io-index" 735 1167 checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 736 1168 ··· 767 1199 source = "registry+https://github.com/rust-lang/crates.io-index" 768 1200 checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 769 1201 1202 + [[package]] 1203 + name = "match-lookup" 1204 + version = "0.1.1" 1205 + source = "registry+https://github.com/rust-lang/crates.io-index" 1206 + checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" 1207 + dependencies = [ 1208 + "proc-macro2", 1209 + "quote", 1210 + "syn 1.0.109", 1211 + ] 1212 + 770 1213 [[package]] 771 1214 name = "matchit" 772 1215 version = "0.8.4" ··· 794 1237 "proc-macro2", 795 1238 "proc-macro2-diagnostics", 796 1239 "quote", 797 - "syn", 1240 + "syn 2.0.106", 1241 + ] 1242 + 1243 + [[package]] 1244 + name = "md-5" 1245 + version = "0.10.6" 1246 + source = "registry+https://github.com/rust-lang/crates.io-index" 1247 + checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1248 + dependencies = [ 1249 + "cfg-if", 1250 + "digest", 798 1251 ] 799 1252 800 1253 [[package]] ··· 809 1262 source = "registry+https://github.com/rust-lang/crates.io-index" 810 1263 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 811 1264 1265 + [[package]] 1266 + name = "minimal-lexical" 1267 + version = "0.2.1" 1268 + source = "registry+https://github.com/rust-lang/crates.io-index" 1269 + checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1270 + 812 1271 [[package]] 813 1272 name = "miniz_oxide" 814 1273 version = "0.8.9" ··· 829 1288 "windows-sys 0.59.0", 830 1289 ] 831 1290 1291 + [[package]] 1292 + name = "multibase" 1293 + version = "0.9.2" 1294 + source = "registry+https://github.com/rust-lang/crates.io-index" 1295 + checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" 1296 + dependencies = [ 1297 + "base-x", 1298 + "base256emoji", 1299 + "data-encoding", 1300 + "data-encoding-macro", 1301 + ] 1302 + 1303 + [[package]] 1304 + name = "multihash" 1305 + version = "0.19.3" 1306 + source = "registry+https://github.com/rust-lang/crates.io-index" 1307 + checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" 1308 + dependencies = [ 1309 + "core2", 1310 + "serde", 1311 + "unsigned-varint", 1312 + ] 1313 + 832 1314 [[package]] 833 1315 name = "native-tls" 834 1316 version = "0.2.14" ··· 846 1328 "tempfile", 847 1329 ] 848 1330 1331 + [[package]] 1332 + name = "nom" 1333 + version = "7.1.3" 1334 + source = "registry+https://github.com/rust-lang/crates.io-index" 1335 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1336 + dependencies = [ 1337 + "memchr", 1338 + "minimal-lexical", 1339 + ] 1340 + 849 1341 [[package]] 850 1342 name = "nu-ansi-term" 851 1343 version = "0.50.1" ··· 855 1347 "windows-sys 0.52.0", 856 1348 ] 857 1349 1350 + [[package]] 1351 + name = "num-bigint-dig" 1352 + version = "0.8.4" 1353 + source = "registry+https://github.com/rust-lang/crates.io-index" 1354 + checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1355 + dependencies = [ 1356 + "byteorder", 1357 + "lazy_static", 1358 + "libm", 1359 + "num-integer", 1360 + "num-iter", 1361 + "num-traits", 1362 + "rand 0.8.5", 1363 + "smallvec", 1364 + "zeroize", 1365 + ] 1366 + 1367 + [[package]] 1368 + name = "num-integer" 1369 + version = "0.1.46" 1370 + source = "registry+https://github.com/rust-lang/crates.io-index" 1371 + checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1372 + dependencies = [ 1373 + "num-traits", 1374 + ] 1375 + 1376 + [[package]] 1377 + name = "num-iter" 1378 + version = "0.1.45" 1379 + source = "registry+https://github.com/rust-lang/crates.io-index" 1380 + checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1381 + dependencies = [ 1382 + "autocfg", 1383 + "num-integer", 1384 + "num-traits", 1385 + ] 1386 + 1387 + [[package]] 1388 + name = "num-traits" 1389 + version = "0.2.19" 1390 + source = "registry+https://github.com/rust-lang/crates.io-index" 1391 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1392 + dependencies = [ 1393 + "autocfg", 1394 + "libm", 1395 + ] 1396 + 858 1397 [[package]] 859 1398 name = "object" 860 1399 version = "0.36.7" ··· 893 1432 dependencies = [ 894 1433 "proc-macro2", 895 1434 "quote", 896 - "syn", 1435 + "syn 2.0.106", 897 1436 ] 898 1437 899 1438 [[package]] ··· 934 1473 "libc", 935 1474 "redox_syscall", 936 1475 "smallvec", 937 - "windows-targets", 1476 + "windows-targets 0.52.6", 1477 + ] 1478 + 1479 + [[package]] 1480 + name = "paste" 1481 + version = "1.0.15" 1482 + source = "registry+https://github.com/rust-lang/crates.io-index" 1483 + checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1484 + 1485 + [[package]] 1486 + name = "pem-rfc7468" 1487 + version = "0.7.0" 1488 + source = "registry+https://github.com/rust-lang/crates.io-index" 1489 + checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1490 + dependencies = [ 1491 + "base64ct", 938 1492 ] 939 1493 940 1494 [[package]] ··· 955 1509 source = "registry+https://github.com/rust-lang/crates.io-index" 956 1510 checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 957 1511 1512 + [[package]] 1513 + name = "pkcs1" 1514 + version = "0.7.5" 1515 + source = "registry+https://github.com/rust-lang/crates.io-index" 1516 + checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1517 + dependencies = [ 1518 + "der", 1519 + "pkcs8", 1520 + "spki", 1521 + ] 1522 + 1523 + [[package]] 1524 + name = "pkcs8" 1525 + version = "0.10.2" 1526 + source = "registry+https://github.com/rust-lang/crates.io-index" 1527 + checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1528 + dependencies = [ 1529 + "der", 1530 + "spki", 1531 + ] 1532 + 958 1533 [[package]] 959 1534 name = "pkg-config" 960 1535 version = "0.3.32" ··· 996 1571 dependencies = [ 997 1572 "proc-macro2", 998 1573 "quote", 999 - "syn", 1574 + "syn 2.0.106", 1000 1575 "version_check", 1001 1576 ] 1002 1577 ··· 1015 1590 source = "registry+https://github.com/rust-lang/crates.io-index" 1016 1591 checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1017 1592 1593 + [[package]] 1594 + name = "rand" 1595 + version = "0.8.5" 1596 + source = "registry+https://github.com/rust-lang/crates.io-index" 1597 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1598 + dependencies = [ 1599 + "libc", 1600 + "rand_chacha 0.3.1", 1601 + "rand_core 0.6.4", 1602 + ] 1603 + 1018 1604 [[package]] 1019 1605 name = "rand" 1020 1606 version = "0.9.2" 1021 1607 source = "registry+https://github.com/rust-lang/crates.io-index" 1022 1608 checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 1023 1609 dependencies = [ 1024 - "rand_chacha", 1025 - "rand_core", 1610 + "rand_chacha 0.9.0", 1611 + "rand_core 0.9.3", 1612 + ] 1613 + 1614 + [[package]] 1615 + name = "rand_chacha" 1616 + version = "0.3.1" 1617 + source = "registry+https://github.com/rust-lang/crates.io-index" 1618 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1619 + dependencies = [ 1620 + "ppv-lite86", 1621 + "rand_core 0.6.4", 1026 1622 ] 1027 1623 1028 1624 [[package]] ··· 1032 1628 checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1033 1629 dependencies = [ 1034 1630 "ppv-lite86", 1035 - "rand_core", 1631 + "rand_core 0.9.3", 1632 + ] 1633 + 1634 + [[package]] 1635 + name = "rand_core" 1636 + version = "0.6.4" 1637 + source = "registry+https://github.com/rust-lang/crates.io-index" 1638 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1639 + dependencies = [ 1640 + "getrandom 0.2.16", 1036 1641 ] 1037 1642 1038 1643 [[package]] ··· 1059 1664 source = "registry+https://github.com/rust-lang/crates.io-index" 1060 1665 checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" 1061 1666 dependencies = [ 1062 - "base64", 1667 + "base64 0.22.1", 1063 1668 "bytes", 1064 1669 "encoding_rs", 1065 1670 "futures-core", ··· 1107 1712 "windows-sys 0.52.0", 1108 1713 ] 1109 1714 1715 + [[package]] 1716 + name = "rs-car" 1717 + version = "0.5.0" 1718 + source = "registry+https://github.com/rust-lang/crates.io-index" 1719 + checksum = "660d1576a918f8ccab9a98025367f6c1996e7551d5059833ddf0995e2f444cbf" 1720 + dependencies = [ 1721 + "blake2b_simd", 1722 + "futures", 1723 + "ipld-core", 1724 + "serde_ipld_dagcbor", 1725 + "sha2", 1726 + ] 1727 + 1728 + [[package]] 1729 + name = "rsa" 1730 + version = "0.9.8" 1731 + source = "registry+https://github.com/rust-lang/crates.io-index" 1732 + checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" 1733 + dependencies = [ 1734 + "const-oid", 1735 + "digest", 1736 + "num-bigint-dig", 1737 + "num-integer", 1738 + "num-traits", 1739 + "pkcs1", 1740 + "pkcs8", 1741 + "rand_core 0.6.4", 1742 + "signature", 1743 + "spki", 1744 + "subtle", 1745 + "zeroize", 1746 + ] 1747 + 1110 1748 [[package]] 1111 1749 name = "rustc-demangle" 1112 1750 version = "0.1.26" ··· 1126 1764 "windows-sys 0.61.1", 1127 1765 ] 1128 1766 1767 + [[package]] 1768 + name = "rustls" 1769 + version = "0.21.12" 1770 + source = "registry+https://github.com/rust-lang/crates.io-index" 1771 + checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" 1772 + dependencies = [ 1773 + "ring", 1774 + "rustls-webpki 0.101.7", 1775 + "sct", 1776 + ] 1777 + 1129 1778 [[package]] 1130 1779 name = "rustls" 1131 1780 version = "0.23.32" ··· 1134 1783 dependencies = [ 1135 1784 "once_cell", 1136 1785 "rustls-pki-types", 1137 - "rustls-webpki", 1786 + "rustls-webpki 0.103.6", 1138 1787 "subtle", 1139 1788 "zeroize", 1140 1789 ] 1141 1790 1791 + [[package]] 1792 + name = "rustls-pemfile" 1793 + version = "1.0.4" 1794 + source = "registry+https://github.com/rust-lang/crates.io-index" 1795 + checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1796 + dependencies = [ 1797 + "base64 0.21.7", 1798 + ] 1799 + 1142 1800 [[package]] 1143 1801 name = "rustls-pki-types" 1144 1802 version = "1.12.0" ··· 1148 1806 "zeroize", 1149 1807 ] 1150 1808 1809 + [[package]] 1810 + name = "rustls-webpki" 1811 + version = "0.101.7" 1812 + source = "registry+https://github.com/rust-lang/crates.io-index" 1813 + checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 1814 + dependencies = [ 1815 + "ring", 1816 + "untrusted", 1817 + ] 1818 + 1151 1819 [[package]] 1152 1820 name = "rustls-webpki" 1153 1821 version = "0.103.6" ··· 1186 1854 source = "registry+https://github.com/rust-lang/crates.io-index" 1187 1855 checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1188 1856 1857 + [[package]] 1858 + name = "sct" 1859 + version = "0.7.1" 1860 + source = "registry+https://github.com/rust-lang/crates.io-index" 1861 + checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 1862 + dependencies = [ 1863 + "ring", 1864 + "untrusted", 1865 + ] 1866 + 1189 1867 [[package]] 1190 1868 name = "security-framework" 1191 1869 version = "2.11.1" ··· 1211 1889 1212 1890 [[package]] 1213 1891 name = "serde" 1214 - version = "1.0.219" 1892 + version = "1.0.228" 1893 + source = "registry+https://github.com/rust-lang/crates.io-index" 1894 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 1895 + dependencies = [ 1896 + "serde_core", 1897 + "serde_derive", 1898 + ] 1899 + 1900 + [[package]] 1901 + name = "serde_bytes" 1902 + version = "0.11.19" 1903 + source = "registry+https://github.com/rust-lang/crates.io-index" 1904 + checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" 1905 + dependencies = [ 1906 + "serde", 1907 + "serde_core", 1908 + ] 1909 + 1910 + [[package]] 1911 + name = "serde_cbor" 1912 + version = "0.11.2" 1913 + source = "registry+https://github.com/rust-lang/crates.io-index" 1914 + checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" 1915 + dependencies = [ 1916 + "half", 1917 + "serde", 1918 + ] 1919 + 1920 + [[package]] 1921 + name = "serde_core" 1922 + version = "1.0.228" 1215 1923 source = "registry+https://github.com/rust-lang/crates.io-index" 1216 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1924 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 1217 1925 dependencies = [ 1218 1926 "serde_derive", 1219 1927 ] 1220 1928 1221 1929 [[package]] 1222 1930 name = "serde_derive" 1223 - version = "1.0.219" 1931 + version = "1.0.228" 1224 1932 source = "registry+https://github.com/rust-lang/crates.io-index" 1225 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1933 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 1226 1934 dependencies = [ 1227 1935 "proc-macro2", 1228 1936 "quote", 1229 - "syn", 1937 + "syn 2.0.106", 1938 + ] 1939 + 1940 + [[package]] 1941 + name = "serde_ipld_dagcbor" 1942 + version = "0.6.4" 1943 + source = "registry+https://github.com/rust-lang/crates.io-index" 1944 + checksum = "46182f4f08349a02b45c998ba3215d3f9de826246ba02bb9dddfe9a2a2100778" 1945 + dependencies = [ 1946 + "cbor4ii", 1947 + "ipld-core", 1948 + "scopeguard", 1949 + "serde", 1230 1950 ] 1231 1951 1232 1952 [[package]] ··· 1274 1994 "digest", 1275 1995 ] 1276 1996 1997 + [[package]] 1998 + name = "sha2" 1999 + version = "0.10.9" 2000 + source = "registry+https://github.com/rust-lang/crates.io-index" 2001 + checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 2002 + dependencies = [ 2003 + "cfg-if", 2004 + "cpufeatures", 2005 + "digest", 2006 + ] 2007 + 1277 2008 [[package]] 1278 2009 name = "sharded-slab" 1279 2010 version = "0.1.7" ··· 1287 2018 name = "shitsky" 1288 2019 version = "0.1.0" 1289 2020 dependencies = [ 2021 + "async-stream", 1290 2022 "axum", 1291 - "base64", 2023 + "chrono", 2024 + "cid", 2025 + "dotenvy", 1292 2026 "futures", 2027 + "futures-util", 1293 2028 "listenfd", 1294 2029 "maud", 1295 2030 "reqwest", 2031 + "rs-car", 2032 + "serde", 2033 + "serde_bytes", 2034 + "serde_cbor", 2035 + "serde_ipld_dagcbor", 2036 + "serde_json", 2037 + "sha2", 2038 + "sqlx", 2039 + "thiserror 2.0.17", 1296 2040 "tokio", 1297 2041 "tokio-tungstenite", 1298 2042 "tower-http", 1299 2043 "tracing", 1300 2044 "tracing-subscriber", 2045 + "url", 1301 2046 ] 1302 2047 1303 2048 [[package]] ··· 1315 2060 "libc", 1316 2061 ] 1317 2062 2063 + [[package]] 2064 + name = "signature" 2065 + version = "2.2.0" 2066 + source = "registry+https://github.com/rust-lang/crates.io-index" 2067 + checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 2068 + dependencies = [ 2069 + "digest", 2070 + "rand_core 0.6.4", 2071 + ] 2072 + 1318 2073 [[package]] 1319 2074 name = "slab" 1320 2075 version = "0.4.11" ··· 1337 2092 "windows-sys 0.59.0", 1338 2093 ] 1339 2094 2095 + [[package]] 2096 + name = "spin" 2097 + version = "0.9.8" 2098 + source = "registry+https://github.com/rust-lang/crates.io-index" 2099 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 2100 + dependencies = [ 2101 + "lock_api", 2102 + ] 2103 + 2104 + [[package]] 2105 + name = "spki" 2106 + version = "0.7.3" 2107 + source = "registry+https://github.com/rust-lang/crates.io-index" 2108 + checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 2109 + dependencies = [ 2110 + "base64ct", 2111 + "der", 2112 + ] 2113 + 2114 + [[package]] 2115 + name = "sqlformat" 2116 + version = "0.2.6" 2117 + source = "registry+https://github.com/rust-lang/crates.io-index" 2118 + checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" 2119 + dependencies = [ 2120 + "nom", 2121 + "unicode_categories", 2122 + ] 2123 + 2124 + [[package]] 2125 + name = "sqlx" 2126 + version = "0.7.4" 2127 + source = "registry+https://github.com/rust-lang/crates.io-index" 2128 + checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" 2129 + dependencies = [ 2130 + "sqlx-core", 2131 + "sqlx-macros", 2132 + "sqlx-mysql", 2133 + "sqlx-postgres", 2134 + "sqlx-sqlite", 2135 + ] 2136 + 2137 + [[package]] 2138 + name = "sqlx-core" 2139 + version = "0.7.4" 2140 + source = "registry+https://github.com/rust-lang/crates.io-index" 2141 + checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" 2142 + dependencies = [ 2143 + "ahash", 2144 + "atoi", 2145 + "byteorder", 2146 + "bytes", 2147 + "chrono", 2148 + "crc", 2149 + "crossbeam-queue", 2150 + "either", 2151 + "event-listener", 2152 + "futures-channel", 2153 + "futures-core", 2154 + "futures-intrusive", 2155 + "futures-io", 2156 + "futures-util", 2157 + "hashlink", 2158 + "hex", 2159 + "indexmap", 2160 + "log", 2161 + "memchr", 2162 + "once_cell", 2163 + "paste", 2164 + "percent-encoding", 2165 + "rustls 0.21.12", 2166 + "rustls-pemfile", 2167 + "serde", 2168 + "serde_json", 2169 + "sha2", 2170 + "smallvec", 2171 + "sqlformat", 2172 + "thiserror 1.0.69", 2173 + "tokio", 2174 + "tokio-stream", 2175 + "tracing", 2176 + "url", 2177 + "webpki-roots", 2178 + ] 2179 + 2180 + [[package]] 2181 + name = "sqlx-macros" 2182 + version = "0.7.4" 2183 + source = "registry+https://github.com/rust-lang/crates.io-index" 2184 + checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" 2185 + dependencies = [ 2186 + "proc-macro2", 2187 + "quote", 2188 + "sqlx-core", 2189 + "sqlx-macros-core", 2190 + "syn 1.0.109", 2191 + ] 2192 + 2193 + [[package]] 2194 + name = "sqlx-macros-core" 2195 + version = "0.7.4" 2196 + source = "registry+https://github.com/rust-lang/crates.io-index" 2197 + checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" 2198 + dependencies = [ 2199 + "dotenvy", 2200 + "either", 2201 + "heck", 2202 + "hex", 2203 + "once_cell", 2204 + "proc-macro2", 2205 + "quote", 2206 + "serde", 2207 + "serde_json", 2208 + "sha2", 2209 + "sqlx-core", 2210 + "sqlx-mysql", 2211 + "sqlx-postgres", 2212 + "sqlx-sqlite", 2213 + "syn 1.0.109", 2214 + "tempfile", 2215 + "tokio", 2216 + "url", 2217 + ] 2218 + 2219 + [[package]] 2220 + name = "sqlx-mysql" 2221 + version = "0.7.4" 2222 + source = "registry+https://github.com/rust-lang/crates.io-index" 2223 + checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" 2224 + dependencies = [ 2225 + "atoi", 2226 + "base64 0.21.7", 2227 + "bitflags", 2228 + "byteorder", 2229 + "bytes", 2230 + "chrono", 2231 + "crc", 2232 + "digest", 2233 + "dotenvy", 2234 + "either", 2235 + "futures-channel", 2236 + "futures-core", 2237 + "futures-io", 2238 + "futures-util", 2239 + "generic-array", 2240 + "hex", 2241 + "hkdf", 2242 + "hmac", 2243 + "itoa", 2244 + "log", 2245 + "md-5", 2246 + "memchr", 2247 + "once_cell", 2248 + "percent-encoding", 2249 + "rand 0.8.5", 2250 + "rsa", 2251 + "serde", 2252 + "sha1", 2253 + "sha2", 2254 + "smallvec", 2255 + "sqlx-core", 2256 + "stringprep", 2257 + "thiserror 1.0.69", 2258 + "tracing", 2259 + "whoami", 2260 + ] 2261 + 2262 + [[package]] 2263 + name = "sqlx-postgres" 2264 + version = "0.7.4" 2265 + source = "registry+https://github.com/rust-lang/crates.io-index" 2266 + checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" 2267 + dependencies = [ 2268 + "atoi", 2269 + "base64 0.21.7", 2270 + "bitflags", 2271 + "byteorder", 2272 + "chrono", 2273 + "crc", 2274 + "dotenvy", 2275 + "etcetera", 2276 + "futures-channel", 2277 + "futures-core", 2278 + "futures-io", 2279 + "futures-util", 2280 + "hex", 2281 + "hkdf", 2282 + "hmac", 2283 + "home", 2284 + "itoa", 2285 + "log", 2286 + "md-5", 2287 + "memchr", 2288 + "once_cell", 2289 + "rand 0.8.5", 2290 + "serde", 2291 + "serde_json", 2292 + "sha2", 2293 + "smallvec", 2294 + "sqlx-core", 2295 + "stringprep", 2296 + "thiserror 1.0.69", 2297 + "tracing", 2298 + "whoami", 2299 + ] 2300 + 2301 + [[package]] 2302 + name = "sqlx-sqlite" 2303 + version = "0.7.4" 2304 + source = "registry+https://github.com/rust-lang/crates.io-index" 2305 + checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" 2306 + dependencies = [ 2307 + "atoi", 2308 + "chrono", 2309 + "flume", 2310 + "futures-channel", 2311 + "futures-core", 2312 + "futures-executor", 2313 + "futures-intrusive", 2314 + "futures-util", 2315 + "libsqlite3-sys", 2316 + "log", 2317 + "percent-encoding", 2318 + "serde", 2319 + "sqlx-core", 2320 + "tracing", 2321 + "url", 2322 + "urlencoding", 2323 + ] 2324 + 1340 2325 [[package]] 1341 2326 name = "stable_deref_trait" 1342 2327 version = "1.2.0" 1343 2328 source = "registry+https://github.com/rust-lang/crates.io-index" 1344 2329 checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1345 2330 2331 + [[package]] 2332 + name = "stringprep" 2333 + version = "0.1.5" 2334 + source = "registry+https://github.com/rust-lang/crates.io-index" 2335 + checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 2336 + dependencies = [ 2337 + "unicode-bidi", 2338 + "unicode-normalization", 2339 + "unicode-properties", 2340 + ] 2341 + 1346 2342 [[package]] 1347 2343 name = "subtle" 1348 2344 version = "2.6.1" 1349 2345 source = "registry+https://github.com/rust-lang/crates.io-index" 1350 2346 checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1351 2347 2348 + [[package]] 2349 + name = "syn" 2350 + version = "1.0.109" 2351 + source = "registry+https://github.com/rust-lang/crates.io-index" 2352 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2353 + dependencies = [ 2354 + "proc-macro2", 2355 + "quote", 2356 + "unicode-ident", 2357 + ] 2358 + 1352 2359 [[package]] 1353 2360 name = "syn" 1354 2361 version = "2.0.106" ··· 1377 2384 dependencies = [ 1378 2385 "proc-macro2", 1379 2386 "quote", 1380 - "syn", 2387 + "syn 2.0.106", 1381 2388 ] 1382 2389 1383 2390 [[package]] ··· 1416 2423 1417 2424 [[package]] 1418 2425 name = "thiserror" 1419 - version = "2.0.16" 2426 + version = "1.0.69" 2427 + source = "registry+https://github.com/rust-lang/crates.io-index" 2428 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2429 + dependencies = [ 2430 + "thiserror-impl 1.0.69", 2431 + ] 2432 + 2433 + [[package]] 2434 + name = "thiserror" 2435 + version = "2.0.17" 2436 + source = "registry+https://github.com/rust-lang/crates.io-index" 2437 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 2438 + dependencies = [ 2439 + "thiserror-impl 2.0.17", 2440 + ] 2441 + 2442 + [[package]] 2443 + name = "thiserror-impl" 2444 + version = "1.0.69" 1420 2445 source = "registry+https://github.com/rust-lang/crates.io-index" 1421 - checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" 2446 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1422 2447 dependencies = [ 1423 - "thiserror-impl", 2448 + "proc-macro2", 2449 + "quote", 2450 + "syn 2.0.106", 1424 2451 ] 1425 2452 1426 2453 [[package]] 1427 2454 name = "thiserror-impl" 1428 - version = "2.0.16" 2455 + version = "2.0.17" 1429 2456 source = "registry+https://github.com/rust-lang/crates.io-index" 1430 - checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" 2457 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 1431 2458 dependencies = [ 1432 2459 "proc-macro2", 1433 2460 "quote", 1434 - "syn", 2461 + "syn 2.0.106", 1435 2462 ] 1436 2463 1437 2464 [[package]] ··· 1453 2480 "zerovec", 1454 2481 ] 1455 2482 2483 + [[package]] 2484 + name = "tinyvec" 2485 + version = "1.10.0" 2486 + source = "registry+https://github.com/rust-lang/crates.io-index" 2487 + checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 2488 + dependencies = [ 2489 + "tinyvec_macros", 2490 + ] 2491 + 2492 + [[package]] 2493 + name = "tinyvec_macros" 2494 + version = "0.1.1" 2495 + source = "registry+https://github.com/rust-lang/crates.io-index" 2496 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2497 + 1456 2498 [[package]] 1457 2499 name = "tokio" 1458 2500 version = "1.47.1" ··· 1481 2523 dependencies = [ 1482 2524 "proc-macro2", 1483 2525 "quote", 1484 - "syn", 2526 + "syn 2.0.106", 1485 2527 ] 1486 2528 1487 2529 [[package]] ··· 1500 2542 source = "registry+https://github.com/rust-lang/crates.io-index" 1501 2543 checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 1502 2544 dependencies = [ 1503 - "rustls", 2545 + "rustls 0.23.32", 2546 + "tokio", 2547 + ] 2548 + 2549 + [[package]] 2550 + name = "tokio-stream" 2551 + version = "0.1.17" 2552 + source = "registry+https://github.com/rust-lang/crates.io-index" 2553 + checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 2554 + dependencies = [ 2555 + "futures-core", 2556 + "pin-project-lite", 1504 2557 "tokio", 1505 2558 ] 1506 2559 ··· 1598 2651 dependencies = [ 1599 2652 "proc-macro2", 1600 2653 "quote", 1601 - "syn", 2654 + "syn 2.0.106", 1602 2655 ] 1603 2656 1604 2657 [[package]] ··· 1654 2707 "httparse", 1655 2708 "log", 1656 2709 "native-tls", 1657 - "rand", 2710 + "rand 0.9.2", 1658 2711 "sha1", 1659 - "thiserror", 2712 + "thiserror 2.0.17", 1660 2713 "utf-8", 1661 2714 ] 1662 2715 ··· 1666 2719 source = "registry+https://github.com/rust-lang/crates.io-index" 1667 2720 checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 1668 2721 2722 + [[package]] 2723 + name = "unicode-bidi" 2724 + version = "0.3.18" 2725 + source = "registry+https://github.com/rust-lang/crates.io-index" 2726 + checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 2727 + 1669 2728 [[package]] 1670 2729 name = "unicode-ident" 1671 2730 version = "1.0.19" 1672 2731 source = "registry+https://github.com/rust-lang/crates.io-index" 1673 2732 checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" 1674 2733 2734 + [[package]] 2735 + name = "unicode-normalization" 2736 + version = "0.1.24" 2737 + source = "registry+https://github.com/rust-lang/crates.io-index" 2738 + checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 2739 + dependencies = [ 2740 + "tinyvec", 2741 + ] 2742 + 2743 + [[package]] 2744 + name = "unicode-properties" 2745 + version = "0.1.3" 2746 + source = "registry+https://github.com/rust-lang/crates.io-index" 2747 + checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 2748 + 2749 + [[package]] 2750 + name = "unicode-segmentation" 2751 + version = "1.12.0" 2752 + source = "registry+https://github.com/rust-lang/crates.io-index" 2753 + checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 2754 + 2755 + [[package]] 2756 + name = "unicode_categories" 2757 + version = "0.1.1" 2758 + source = "registry+https://github.com/rust-lang/crates.io-index" 2759 + checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" 2760 + 2761 + [[package]] 2762 + name = "unsigned-varint" 2763 + version = "0.8.0" 2764 + source = "registry+https://github.com/rust-lang/crates.io-index" 2765 + checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" 2766 + 1675 2767 [[package]] 1676 2768 name = "untrusted" 1677 2769 version = "0.9.0" ··· 1690 2782 "serde", 1691 2783 ] 1692 2784 2785 + [[package]] 2786 + name = "urlencoding" 2787 + version = "2.1.3" 2788 + source = "registry+https://github.com/rust-lang/crates.io-index" 2789 + checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 2790 + 1693 2791 [[package]] 1694 2792 name = "utf-8" 1695 2793 version = "0.7.6" ··· 1763 2861 "wit-bindgen", 1764 2862 ] 1765 2863 2864 + [[package]] 2865 + name = "wasite" 2866 + version = "0.1.0" 2867 + source = "registry+https://github.com/rust-lang/crates.io-index" 2868 + checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 2869 + 1766 2870 [[package]] 1767 2871 name = "wasm-bindgen" 1768 2872 version = "0.2.101" ··· 1786 2890 "log", 1787 2891 "proc-macro2", 1788 2892 "quote", 1789 - "syn", 2893 + "syn 2.0.106", 1790 2894 "wasm-bindgen-shared", 1791 2895 ] 1792 2896 ··· 1821 2925 dependencies = [ 1822 2926 "proc-macro2", 1823 2927 "quote", 1824 - "syn", 2928 + "syn 2.0.106", 1825 2929 "wasm-bindgen-backend", 1826 2930 "wasm-bindgen-shared", 1827 2931 ] ··· 1845 2949 "wasm-bindgen", 1846 2950 ] 1847 2951 2952 + [[package]] 2953 + name = "webpki-roots" 2954 + version = "0.25.4" 2955 + source = "registry+https://github.com/rust-lang/crates.io-index" 2956 + checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" 2957 + 2958 + [[package]] 2959 + name = "whoami" 2960 + version = "1.6.1" 2961 + source = "registry+https://github.com/rust-lang/crates.io-index" 2962 + checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" 2963 + dependencies = [ 2964 + "libredox", 2965 + "wasite", 2966 + ] 2967 + 1848 2968 [[package]] 1849 2969 name = "winapi" 1850 2970 version = "0.3.9" ··· 1867 2987 source = "registry+https://github.com/rust-lang/crates.io-index" 1868 2988 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1869 2989 2990 + [[package]] 2991 + name = "windows-core" 2992 + version = "0.62.1" 2993 + source = "registry+https://github.com/rust-lang/crates.io-index" 2994 + checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" 2995 + dependencies = [ 2996 + "windows-implement", 2997 + "windows-interface", 2998 + "windows-link 0.2.0", 2999 + "windows-result 0.4.0", 3000 + "windows-strings 0.5.0", 3001 + ] 3002 + 3003 + [[package]] 3004 + name = "windows-implement" 3005 + version = "0.60.1" 3006 + source = "registry+https://github.com/rust-lang/crates.io-index" 3007 + checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" 3008 + dependencies = [ 3009 + "proc-macro2", 3010 + "quote", 3011 + "syn 2.0.106", 3012 + ] 3013 + 3014 + [[package]] 3015 + name = "windows-interface" 3016 + version = "0.59.2" 3017 + source = "registry+https://github.com/rust-lang/crates.io-index" 3018 + checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" 3019 + dependencies = [ 3020 + "proc-macro2", 3021 + "quote", 3022 + "syn 2.0.106", 3023 + ] 3024 + 1870 3025 [[package]] 1871 3026 name = "windows-link" 1872 3027 version = "0.1.3" ··· 1886 3041 checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" 1887 3042 dependencies = [ 1888 3043 "windows-link 0.1.3", 1889 - "windows-result", 1890 - "windows-strings", 3044 + "windows-result 0.3.4", 3045 + "windows-strings 0.4.2", 1891 3046 ] 1892 3047 1893 3048 [[package]] ··· 1899 3054 "windows-link 0.1.3", 1900 3055 ] 1901 3056 3057 + [[package]] 3058 + name = "windows-result" 3059 + version = "0.4.0" 3060 + source = "registry+https://github.com/rust-lang/crates.io-index" 3061 + checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" 3062 + dependencies = [ 3063 + "windows-link 0.2.0", 3064 + ] 3065 + 1902 3066 [[package]] 1903 3067 name = "windows-strings" 1904 3068 version = "0.4.2" ··· 1908 3072 "windows-link 0.1.3", 1909 3073 ] 1910 3074 3075 + [[package]] 3076 + name = "windows-strings" 3077 + version = "0.5.0" 3078 + source = "registry+https://github.com/rust-lang/crates.io-index" 3079 + checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" 3080 + dependencies = [ 3081 + "windows-link 0.2.0", 3082 + ] 3083 + 3084 + [[package]] 3085 + name = "windows-sys" 3086 + version = "0.48.0" 3087 + source = "registry+https://github.com/rust-lang/crates.io-index" 3088 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3089 + dependencies = [ 3090 + "windows-targets 0.48.5", 3091 + ] 3092 + 1911 3093 [[package]] 1912 3094 name = "windows-sys" 1913 3095 version = "0.52.0" 1914 3096 source = "registry+https://github.com/rust-lang/crates.io-index" 1915 3097 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1916 3098 dependencies = [ 1917 - "windows-targets", 3099 + "windows-targets 0.52.6", 1918 3100 ] 1919 3101 1920 3102 [[package]] ··· 1923 3105 source = "registry+https://github.com/rust-lang/crates.io-index" 1924 3106 checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1925 3107 dependencies = [ 1926 - "windows-targets", 3108 + "windows-targets 0.52.6", 1927 3109 ] 1928 3110 1929 3111 [[package]] ··· 1935 3117 "windows-link 0.2.0", 1936 3118 ] 1937 3119 3120 + [[package]] 3121 + name = "windows-targets" 3122 + version = "0.48.5" 3123 + source = "registry+https://github.com/rust-lang/crates.io-index" 3124 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3125 + dependencies = [ 3126 + "windows_aarch64_gnullvm 0.48.5", 3127 + "windows_aarch64_msvc 0.48.5", 3128 + "windows_i686_gnu 0.48.5", 3129 + "windows_i686_msvc 0.48.5", 3130 + "windows_x86_64_gnu 0.48.5", 3131 + "windows_x86_64_gnullvm 0.48.5", 3132 + "windows_x86_64_msvc 0.48.5", 3133 + ] 3134 + 1938 3135 [[package]] 1939 3136 name = "windows-targets" 1940 3137 version = "0.52.6" 1941 3138 source = "registry+https://github.com/rust-lang/crates.io-index" 1942 3139 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1943 3140 dependencies = [ 1944 - "windows_aarch64_gnullvm", 1945 - "windows_aarch64_msvc", 1946 - "windows_i686_gnu", 3141 + "windows_aarch64_gnullvm 0.52.6", 3142 + "windows_aarch64_msvc 0.52.6", 3143 + "windows_i686_gnu 0.52.6", 1947 3144 "windows_i686_gnullvm", 1948 - "windows_i686_msvc", 1949 - "windows_x86_64_gnu", 1950 - "windows_x86_64_gnullvm", 1951 - "windows_x86_64_msvc", 3145 + "windows_i686_msvc 0.52.6", 3146 + "windows_x86_64_gnu 0.52.6", 3147 + "windows_x86_64_gnullvm 0.52.6", 3148 + "windows_x86_64_msvc 0.52.6", 1952 3149 ] 1953 3150 3151 + [[package]] 3152 + name = "windows_aarch64_gnullvm" 3153 + version = "0.48.5" 3154 + source = "registry+https://github.com/rust-lang/crates.io-index" 3155 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3156 + 1954 3157 [[package]] 1955 3158 name = "windows_aarch64_gnullvm" 1956 3159 version = "0.52.6" 1957 3160 source = "registry+https://github.com/rust-lang/crates.io-index" 1958 3161 checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1959 3162 3163 + [[package]] 3164 + name = "windows_aarch64_msvc" 3165 + version = "0.48.5" 3166 + source = "registry+https://github.com/rust-lang/crates.io-index" 3167 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3168 + 1960 3169 [[package]] 1961 3170 name = "windows_aarch64_msvc" 1962 3171 version = "0.52.6" 1963 3172 source = "registry+https://github.com/rust-lang/crates.io-index" 1964 3173 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1965 3174 3175 + [[package]] 3176 + name = "windows_i686_gnu" 3177 + version = "0.48.5" 3178 + source = "registry+https://github.com/rust-lang/crates.io-index" 3179 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3180 + 1966 3181 [[package]] 1967 3182 name = "windows_i686_gnu" 1968 3183 version = "0.52.6" ··· 1975 3190 source = "registry+https://github.com/rust-lang/crates.io-index" 1976 3191 checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1977 3192 3193 + [[package]] 3194 + name = "windows_i686_msvc" 3195 + version = "0.48.5" 3196 + source = "registry+https://github.com/rust-lang/crates.io-index" 3197 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3198 + 1978 3199 [[package]] 1979 3200 name = "windows_i686_msvc" 1980 3201 version = "0.52.6" 1981 3202 source = "registry+https://github.com/rust-lang/crates.io-index" 1982 3203 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1983 3204 3205 + [[package]] 3206 + name = "windows_x86_64_gnu" 3207 + version = "0.48.5" 3208 + source = "registry+https://github.com/rust-lang/crates.io-index" 3209 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3210 + 1984 3211 [[package]] 1985 3212 name = "windows_x86_64_gnu" 1986 3213 version = "0.52.6" 1987 3214 source = "registry+https://github.com/rust-lang/crates.io-index" 1988 3215 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1989 3216 3217 + [[package]] 3218 + name = "windows_x86_64_gnullvm" 3219 + version = "0.48.5" 3220 + source = "registry+https://github.com/rust-lang/crates.io-index" 3221 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3222 + 1990 3223 [[package]] 1991 3224 name = "windows_x86_64_gnullvm" 1992 3225 version = "0.52.6" 1993 3226 source = "registry+https://github.com/rust-lang/crates.io-index" 1994 3227 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1995 3228 3229 + [[package]] 3230 + name = "windows_x86_64_msvc" 3231 + version = "0.48.5" 3232 + source = "registry+https://github.com/rust-lang/crates.io-index" 3233 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3234 + 1996 3235 [[package]] 1997 3236 name = "windows_x86_64_msvc" 1998 3237 version = "0.52.6" ··· 2031 3270 dependencies = [ 2032 3271 "proc-macro2", 2033 3272 "quote", 2034 - "syn", 3273 + "syn 2.0.106", 2035 3274 "synstructure", 2036 3275 ] 2037 3276 ··· 2052 3291 dependencies = [ 2053 3292 "proc-macro2", 2054 3293 "quote", 2055 - "syn", 3294 + "syn 2.0.106", 2056 3295 ] 2057 3296 2058 3297 [[package]] ··· 2072 3311 dependencies = [ 2073 3312 "proc-macro2", 2074 3313 "quote", 2075 - "syn", 3314 + "syn 2.0.106", 2076 3315 "synstructure", 2077 3316 ] 2078 3317 ··· 2112 3351 dependencies = [ 2113 3352 "proc-macro2", 2114 3353 "quote", 2115 - "syn", 3354 + "syn 2.0.106", 2116 3355 ]
+15 -1
Cargo.toml
··· 4 4 edition = "2024" 5 5 6 6 [dependencies] 7 + async-stream = "0.3.6" 7 8 axum = "0.8" 8 - base64 = "0.22.1" 9 + chrono = "0.4.42" 10 + cid = { version = "0.11", features = ["serde-codec"] } 11 + dotenvy = "0.15.7" 9 12 futures = "0.3.31" 13 + futures-util = "0.3.31" 10 14 listenfd = "1.0.2" 11 15 maud = { version = "0.27", features = ["axum"] } 12 16 reqwest = "0.12.23" 17 + rs-car = "0.5.0" 18 + serde = { version = "1.0", features = ["derive"] } 19 + serde_bytes = "0.11.19" 20 + serde_cbor = "0.11" 21 + serde_ipld_dagcbor = "0.6.4" 22 + serde_json = "1.0" 23 + sha2 = "0.10" 24 + sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres", "macros", "json", "chrono"] } 25 + thiserror = "2.0.17" 13 26 tokio = { version = "1.0", features = ["full"] } 14 27 tokio-tungstenite = { version = "0.28.0", features = ["native-tls"] } 15 28 tower-http = { version = "0.6", features = ["trace"] } 16 29 tracing = "0.1" 17 30 tracing-subscriber = "0.3" 31 + url = "2.5.7"
+283
src/firehose.rs
··· 1 + use async_stream::try_stream; 2 + use cid::Cid; 3 + use futures_util::{ 4 + TryStreamExt, 5 + stream::{Stream, StreamExt}, 6 + }; 7 + use serde::{Deserialize, Serialize}; 8 + use serde_json::Value as JsonValue; 9 + use std::collections::HashMap; 10 + use std::time::Duration; 11 + use thiserror::Error; 12 + use tokio_tungstenite::{connect_async, tungstenite::protocol::Message}; 13 + 14 + #[derive(Error, Debug)] 15 + pub enum FirehoseError { 16 + #[error("WebSocket connection error: {0}")] 17 + WebSocket(#[from] tokio_tungstenite::tungstenite::Error), 18 + #[error("URL parsing error: {0}")] 19 + Url(#[from] url::ParseError), 20 + #[error("Failed to deserialize CBOR data: {0}")] 21 + Cbor(#[from] std::io::Error), 22 + #[error("Failed to read CAR file: {0}")] 23 + CarRead(#[from] rs_car::CarDecodeError), 24 + #[error("Invalid message frame received from relay")] 25 + InvalidFrame, 26 + #[error("Received an error message from the relay: {name} - {message}")] 27 + RelayError { name: String, message: String }, 28 + #[error("Unknown message type received: {0}")] 29 + UnknownMessageType(String), 30 + #[error("Connection timed out after {0:?} without receiving a message")] 31 + Timeout(Duration), 32 + } 33 + 34 + #[derive(Debug, Clone, Serialize, Deserialize)] 35 + #[serde(tag = "action", rename_all = "camelCase")] 36 + pub enum RepoOp { 37 + Create { 38 + path: String, 39 + cid: Cid, 40 + record: JsonValue, 41 + }, 42 + Update { 43 + path: String, 44 + cid: Cid, 45 + record: JsonValue, 46 + }, 47 + Delete { 48 + path: String, 49 + }, 50 + } 51 + 52 + #[derive(Debug, Clone, Serialize, Deserialize)] 53 + pub struct CommitEvent { 54 + #[serde(rename = "seq")] 55 + pub sequence: i64, 56 + pub repo: String, 57 + pub commit: Cid, 58 + pub rev: String, 59 + pub since: Option<String>, 60 + pub ops: Vec<RepoOp>, 61 + #[serde(rename = "time")] 62 + pub timestamp: String, 63 + } 64 + 65 + #[derive(Debug, Clone, Serialize)] 66 + #[serde(untagged)] 67 + pub enum FirehoseEvent { 68 + Commit(CommitEvent), 69 + Info(JsonValue), 70 + Account(JsonValue), 71 + Identity(JsonValue), 72 + Unknown(JsonValue), 73 + } 74 + 75 + #[derive(Debug, Clone)] 76 + pub struct FirehoseOptions { 77 + pub relay_url: String, 78 + pub cursor: Option<i64>, 79 + pub auto_reconnect: bool, 80 + } 81 + 82 + impl Default for FirehoseOptions { 83 + fn default() -> Self { 84 + Self { 85 + relay_url: "wss://relay.upcloud.world".to_string(), 86 + cursor: None, 87 + auto_reconnect: true, 88 + } 89 + } 90 + } 91 + 92 + #[derive(Deserialize, Debug)] 93 + pub struct FrameHeader { 94 + #[serde(rename = "op")] 95 + operation: i64, 96 + #[serde(rename = "t")] 97 + message_type: String, 98 + } 99 + 100 + #[derive(Deserialize, Debug)] 101 + struct ErrorBody { 102 + error: String, 103 + message: String, 104 + } 105 + 106 + #[derive(Deserialize, Debug, Clone)] 107 + struct RawRepoOp { 108 + action: String, 109 + path: String, 110 + cid: Option<Cid>, 111 + } 112 + 113 + #[derive(Deserialize, Debug)] 114 + struct RawCommitEvent { 115 + seq: i64, 116 + repo: String, 117 + commit: Cid, 118 + rev: String, 119 + since: Option<String>, 120 + blocks: serde_bytes::ByteBuf, 121 + ops: Vec<RawRepoOp>, 122 + time: String, 123 + } 124 + 125 + pub fn subscribe_repos( 126 + options: FirehoseOptions, 127 + ) -> impl Stream<Item = Result<FirehoseEvent, FirehoseError>> { 128 + let mut last_cursor = options.cursor; 129 + 130 + try_stream! { 131 + loop { 132 + let mut url_str = format!( 133 + "{}/xrpc/com.atproto.sync.subscribeRepos", 134 + options.relay_url 135 + ); 136 + if let Some(cursor_val) = last_cursor { 137 + url_str.push_str(&format!("?cursor={}", cursor_val)); 138 + } 139 + 140 + tracing::info!("Connecting to {}...", url_str); 141 + 142 + let (mut ws_stream, _) = connect_async(&url_str).await?; 143 + 144 + tracing::info!("Successfully connected to firehose."); 145 + 146 + loop { 147 + let next_message = tokio::time::timeout( 148 + Duration::from_secs(15), 149 + ws_stream.next() 150 + ); 151 + 152 + match next_message.await { 153 + Err(_) => { 154 + tracing::info!("Connection timed out. Attempting to reconnect..."); 155 + ws_stream.close(None).await?; 156 + break; 157 + }, 158 + Ok(Some(Ok(msg))) => { 159 + if let Message::Binary(data) = msg { 160 + let mut deserializer = serde_ipld_dagcbor::de::Deserializer::from_slice(&data); 161 + let map_cbor_err = |e: serde_ipld_dagcbor::DecodeError<std::convert::Infallible>| { 162 + std::io::Error::other(e.to_string()) 163 + }; 164 + 165 + let header: FrameHeader = match serde::Deserialize::deserialize(&mut deserializer).map_err(map_cbor_err) { 166 + Ok(h) => h, 167 + Err(e) => { 168 + tracing::error!("Failed to deserialize frame header: {}. Skipping message.", e); 169 + continue; 170 + } 171 + }; 172 + 173 + if header.operation == -1 { 174 + let body: ErrorBody = match serde::Deserialize::deserialize(&mut deserializer).map_err(map_cbor_err) { 175 + Ok(b) => b, 176 + Err(e) => { 177 + tracing::error!("Failed to deserialize relay error body: {}. Skipping message.", e); 178 + continue; 179 + } 180 + }; 181 + Err(FirehoseError::RelayError { name: body.error, message: body.message })?; 182 + } 183 + 184 + let event = match header.message_type.as_str() { 185 + "#commit" => { 186 + let raw_commit: RawCommitEvent = match serde::Deserialize::deserialize(&mut deserializer).map_err(map_cbor_err) { 187 + Ok(c) => c, 188 + Err(e) => { 189 + tracing::error!("Failed to deserialize commit body: {}. Skipping message.", e); 190 + continue; 191 + } 192 + }; 193 + last_cursor = Some(raw_commit.seq); 194 + let commit_event = process_commit_event(raw_commit).await?; 195 + FirehoseEvent::Commit(commit_event) 196 + } 197 + t => { 198 + let body: JsonValue = match serde::Deserialize::deserialize(&mut deserializer).map_err(map_cbor_err) { 199 + Ok(b) => b, 200 + Err(e) => { 201 + tracing::error!("Failed to deserialize event body for type '{}': {}. Skipping message.", t, e); 202 + continue; 203 + } 204 + }; 205 + if let Some(seq) = body.get("seq").and_then(|v| v.as_i64()) { 206 + last_cursor = Some(seq); 207 + } 208 + match t { 209 + "#info" => FirehoseEvent::Info(body), 210 + "#account" => FirehoseEvent::Account(body), 211 + "#identity" => FirehoseEvent::Identity(body), 212 + _ => FirehoseEvent::Unknown(body) 213 + } 214 + } 215 + }; 216 + yield event; 217 + } 218 + } 219 + Ok(Some(Err(e))) => { 220 + tracing::info!("WebSocket error: {}", e); 221 + break; 222 + } 223 + Ok(None) => { 224 + tracing::info!("WebSocket stream closed by server."); 225 + break; 226 + } 227 + } 228 + } 229 + 230 + if !options.auto_reconnect { 231 + tracing::info!("Auto-reconnect is disabled. Exiting."); 232 + break; 233 + } 234 + tokio::time::sleep(Duration::from_secs(1)).await; 235 + } 236 + } 237 + } 238 + 239 + async fn process_commit_event(raw: RawCommitEvent) -> Result<CommitEvent, FirehoseError> { 240 + let mut blocks_reader = raw.blocks.as_ref(); 241 + let car_reader = rs_car::CarReader::new(&mut blocks_reader, false).await?; 242 + 243 + let records_map: HashMap<Cid, Vec<u8>> = car_reader.try_collect::<HashMap<_, _>>().await?; 244 + 245 + let mut ops = Vec::new(); 246 + for op in raw.ops { 247 + let repo_op = match op.action.as_str() { 248 + "create" | "update" => { 249 + let cid = op.cid.expect("Create/Update operation must have a CID"); 250 + let record_bytes = records_map.get(&cid).cloned().unwrap_or_default(); 251 + let record: JsonValue = 252 + serde_ipld_dagcbor::from_slice(&record_bytes).unwrap_or(JsonValue::Null); 253 + 254 + if op.action == "create" { 255 + RepoOp::Create { 256 + path: op.path, 257 + cid, 258 + record, 259 + } 260 + } else { 261 + RepoOp::Update { 262 + path: op.path, 263 + cid, 264 + record, 265 + } 266 + } 267 + } 268 + "delete" => RepoOp::Delete { path: op.path }, 269 + _ => continue, 270 + }; 271 + ops.push(repo_op); 272 + } 273 + 274 + Ok(CommitEvent { 275 + sequence: raw.seq, 276 + repo: raw.repo, 277 + commit: raw.commit, 278 + rev: raw.rev, 279 + since: raw.since, 280 + ops, 281 + timestamp: raw.time, 282 + }) 283 + }
+109 -40
src/main.rs
··· 1 - use std::sync::Arc; 2 - 3 - use axum::{Extension, Router, routing::get}; 4 - use base64::{Engine, prelude::BASE64_STANDARD}; 5 - use futures::{StreamExt as _, lock::Mutex}; 1 + use axum::{Router, extract::State, routing::get}; 2 + use chrono::{DateTime, NaiveDateTime, Utc}; 3 + use futures::StreamExt as _; 6 4 use listenfd::ListenFd; 7 5 use maud::{DOCTYPE, Markup, html}; 8 - use reqwest::Url; 6 + use serde_json::Value as JsonValue; 7 + use sqlx::postgres::PgPoolOptions; 8 + use sqlx::{Error, PgPool}; 9 9 use tokio::net::TcpListener; 10 - use tokio_tungstenite::tungstenite::Message; 11 10 use tower_http::trace::TraceLayer; 12 11 13 - type Db = Arc<Mutex<Vec<String>>>; 12 + pub mod firehose; 13 + use firehose::{FirehoseEvent, FirehoseOptions, subscribe_repos}; 14 + 15 + type Db = PgPool; 14 16 15 17 #[tokio::main] 16 - async fn main() { 18 + async fn main() -> Result<(), Box<dyn std::error::Error>> { 17 19 tracing_subscriber::fmt::init(); 20 + dotenvy::dotenv().ok(); 18 21 19 - let db = Arc::new(Mutex::new(Vec::new())); 22 + let db_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); 23 + let pool = PgPoolOptions::new() 24 + .max_connections(5) 25 + .connect(&db_url) 26 + .await?; 20 27 21 - let web_server_db = db.clone(); 22 - tokio::spawn(async move { web_server(web_server_db).await }); 28 + sqlx::migrate!("./migrations").run(&pool).await?; 23 29 24 - let jetstream_db = db.clone(); 25 - firehose_subscriber(jetstream_db).await 26 - } 30 + tracing::info!("Database connected and migrations are up to date."); 27 31 28 - async fn firehose_subscriber(db: Db) { 29 - tracing::info!("Connecting to firehose..."); 32 + let web_server_pool = pool.clone(); 33 + tokio::spawn(async move { web_server(web_server_pool).await }); 30 34 31 - let (mut socket, response) = tokio_tungstenite::connect_async( 32 - // Url::parse("wss://relay.upcloud.world/xrpc/com.atproto.sync.subscribeRepos") 33 - Url::parse("wss://bsky.network/xrpc/com.atproto.sync.subscribeRepos") 34 - .unwrap() 35 - .as_str(), 36 - ) 37 - .await 38 - .unwrap(); 35 + firehose_subscriber(pool).await; 39 36 40 - tracing::info!("{:?}", response); 37 + Ok(()) 38 + } 41 39 42 - tracing::info!("Connected to firehose!"); 40 + async fn firehose_subscriber(db: Db) { 41 + tracing::info!("Starting firehose subscriber..."); 42 + 43 + let options = FirehoseOptions { 44 + relay_url: "wss://relay.upcloud.world".to_string(), 45 + ..Default::default() 46 + }; 43 47 44 - loop { 45 - while let Some(Ok(Message::Binary(message))) = socket.next().await { 46 - let msg = BASE64_STANDARD.encode(message); 47 - let mut database = db.lock().await; 48 - database.push(msg); 48 + let mut stream = Box::pin(subscribe_repos(options)); 49 + 50 + while let Some(event_result) = stream.next().await { 51 + match event_result { 52 + Ok(FirehoseEvent::Commit(commit)) => { 53 + tracing::debug!( 54 + "Received a commit from {} with {} ops", 55 + commit.repo, 56 + commit.ops.len() 57 + ); 58 + 59 + match serde_json::to_value(&commit) { 60 + Ok(json_value) => { 61 + if let Err(e) = create_firehose_record(&db, &json_value).await { 62 + tracing::error!("Failed to write record to DB: {}", e); 63 + } 64 + } 65 + Err(e) => { 66 + tracing::error!("Failed to serialize commit to JSON: {}", e); 67 + } 68 + } 69 + } 70 + Ok(event) => { 71 + tracing::info!("Received other event: {:?}", event); 72 + } 73 + Err(e) => { 74 + tracing::error!("Firehose stream error: {}", e); 75 + } 49 76 } 50 77 } 51 78 } ··· 55 82 56 83 let app = Router::new() 57 84 .route("/", get(index)) 58 - .layer(Extension(db)) 85 + .with_state(db) 59 86 .layer(TraceLayer::new_for_http()); 60 87 61 88 let mut listenfd = ListenFd::from_env(); ··· 66 93 TcpListener::from_std(listener).unwrap() 67 94 } 68 95 // otherwise fall back to local listening 69 - None => TcpListener::bind("127.0.0.1:3000").await.unwrap(), 96 + _none => TcpListener::bind("127.0.0.1:3000").await.unwrap(), 70 97 }; 71 98 72 - let server = axum::serve(listener, app); 73 99 tracing::info!("Web server started!"); 100 + axum::serve(listener, app).await.unwrap(); 101 + } 74 102 75 - server.await.unwrap(); 103 + struct FirehoseMessage { 104 + message: JsonValue, 76 105 } 77 106 78 - async fn index(Extension(db): Extension<Db>) -> Markup { 79 - let borrowed_db = db.lock().await; 80 - let items = borrowed_db.iter().rev().take(100).collect::<Vec<&String>>(); 107 + async fn index(State(db): State<Db>) -> Markup { 108 + let query_result = sqlx::query_as!( 109 + FirehoseMessage, 110 + "SELECT message FROM firehose_messages ORDER BY created_at DESC LIMIT 100" 111 + ) 112 + .fetch_all(&db) 113 + .await; 114 + 115 + let items = match query_result { 116 + Ok(messages) => messages, 117 + Err(e) => { 118 + tracing::error!("Failed to fetch messages from DB: {}", e); 119 + vec![] 120 + } 121 + }; 81 122 82 123 page( 83 124 "ShitSky", ··· 85 126 p { "Hello from ShitSky" } 86 127 @for item in &items { 87 128 pre { 88 - (item) 129 + (serde_json::to_string_pretty(&item.message).unwrap_or_default()) 89 130 } 90 131 } 91 132 }, ··· 106 147 } 107 148 } 108 149 } 150 + 151 + async fn create_firehose_record(db: &PgPool, record: &JsonValue) -> Result<(), Error> { 152 + let created_at_opt: Option<NaiveDateTime> = record 153 + .get("time") 154 + .and_then(|val| val.as_str()) 155 + .filter(|s| !s.is_empty()) 156 + .and_then(|s| s.parse::<DateTime<Utc>>().ok()) 157 + .map(|dt_utc| dt_utc.naive_utc()); 158 + 159 + if let Some(created_at) = created_at_opt { 160 + sqlx::query!( 161 + "INSERT INTO firehose_messages (message, created_at) VALUES ($1, $2)", 162 + record, 163 + created_at 164 + ) 165 + .execute(db) 166 + .await?; 167 + } else { 168 + sqlx::query!( 169 + "INSERT INTO firehose_messages (message) VALUES ($1)", 170 + record, 171 + ) 172 + .execute(db) 173 + .await?; 174 + } 175 + 176 + Ok(()) 177 + }