tangled.org trending bluesky account

A start

+2
.env.template
··· 1 + HANDLE=baileytownsend.dev 2 + APP_PASSWORD="PLEASE ONLY USE AN APP PASSWORD"
+5
.gitignore
··· 1 + /target 2 + /days/*.json 3 + .env 4 + .idea 5 + /wasm/dist
+3347
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 = "addr2line" 7 + version = "0.24.2" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 + dependencies = [ 11 + "gimli", 12 + ] 13 + 14 + [[package]] 15 + name = "adler2" 16 + version = "2.0.0" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 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 + "once_cell", 28 + "version_check", 29 + "zerocopy", 30 + ] 31 + 32 + [[package]] 33 + name = "aho-corasick" 34 + version = "1.1.3" 35 + source = "registry+https://github.com/rust-lang/crates.io-index" 36 + checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 37 + dependencies = [ 38 + "memchr", 39 + ] 40 + 41 + [[package]] 42 + name = "allocator-api2" 43 + version = "0.2.21" 44 + source = "registry+https://github.com/rust-lang/crates.io-index" 45 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 46 + 47 + [[package]] 48 + name = "android-tzdata" 49 + version = "0.1.1" 50 + source = "registry+https://github.com/rust-lang/crates.io-index" 51 + checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 52 + 53 + [[package]] 54 + name = "android_system_properties" 55 + version = "0.1.5" 56 + source = "registry+https://github.com/rust-lang/crates.io-index" 57 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 58 + dependencies = [ 59 + "libc", 60 + ] 61 + 62 + [[package]] 63 + name = "anstream" 64 + version = "0.6.18" 65 + source = "registry+https://github.com/rust-lang/crates.io-index" 66 + checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 67 + dependencies = [ 68 + "anstyle", 69 + "anstyle-parse", 70 + "anstyle-query", 71 + "anstyle-wincon", 72 + "colorchoice", 73 + "is_terminal_polyfill", 74 + "utf8parse", 75 + ] 76 + 77 + [[package]] 78 + name = "anstyle" 79 + version = "1.0.10" 80 + source = "registry+https://github.com/rust-lang/crates.io-index" 81 + checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 82 + 83 + [[package]] 84 + name = "anstyle-parse" 85 + version = "0.2.6" 86 + source = "registry+https://github.com/rust-lang/crates.io-index" 87 + checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 88 + dependencies = [ 89 + "utf8parse", 90 + ] 91 + 92 + [[package]] 93 + name = "anstyle-query" 94 + version = "1.1.2" 95 + source = "registry+https://github.com/rust-lang/crates.io-index" 96 + checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 97 + dependencies = [ 98 + "windows-sys 0.59.0", 99 + ] 100 + 101 + [[package]] 102 + name = "anstyle-wincon" 103 + version = "3.0.7" 104 + source = "registry+https://github.com/rust-lang/crates.io-index" 105 + checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 106 + dependencies = [ 107 + "anstyle", 108 + "once_cell", 109 + "windows-sys 0.59.0", 110 + ] 111 + 112 + [[package]] 113 + name = "anyhow" 114 + version = "1.0.98" 115 + source = "registry+https://github.com/rust-lang/crates.io-index" 116 + checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 117 + 118 + [[package]] 119 + name = "async-compression" 120 + version = "0.4.23" 121 + source = "registry+https://github.com/rust-lang/crates.io-index" 122 + checksum = "b37fc50485c4f3f736a4fb14199f6d5f5ba008d7f28fe710306c92780f004c07" 123 + dependencies = [ 124 + "flate2", 125 + "futures-core", 126 + "memchr", 127 + "pin-project-lite", 128 + "tokio", 129 + ] 130 + 131 + [[package]] 132 + name = "async-lock" 133 + version = "3.4.0" 134 + source = "registry+https://github.com/rust-lang/crates.io-index" 135 + checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 136 + dependencies = [ 137 + "event-listener", 138 + "event-listener-strategy", 139 + "pin-project-lite", 140 + ] 141 + 142 + [[package]] 143 + name = "async-trait" 144 + version = "0.1.88" 145 + source = "registry+https://github.com/rust-lang/crates.io-index" 146 + checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 147 + dependencies = [ 148 + "proc-macro2", 149 + "quote", 150 + "syn", 151 + ] 152 + 153 + [[package]] 154 + name = "atproto_api" 155 + version = "0.1.0" 156 + dependencies = [ 157 + "atrium-api", 158 + "serde", 159 + ] 160 + 161 + [[package]] 162 + name = "atrium-api" 163 + version = "0.25.5" 164 + source = "registry+https://github.com/rust-lang/crates.io-index" 165 + checksum = "8bceed6a87be6213040945254aa94191490fea22b7f49dec584e349f336cc17a" 166 + dependencies = [ 167 + "atrium-common", 168 + "atrium-xrpc", 169 + "chrono", 170 + "http 1.3.1", 171 + "ipld-core", 172 + "langtag", 173 + "regex", 174 + "serde", 175 + "serde_bytes", 176 + "serde_json", 177 + "thiserror 1.0.69", 178 + "tokio", 179 + "trait-variant", 180 + ] 181 + 182 + [[package]] 183 + name = "atrium-common" 184 + version = "0.1.2" 185 + source = "registry+https://github.com/rust-lang/crates.io-index" 186 + checksum = "9ed5610654043faa396a5a15afac0ac646d76aebe45aebd7cef4f8b96b0ab7f4" 187 + dependencies = [ 188 + "dashmap", 189 + "lru", 190 + "moka", 191 + "thiserror 1.0.69", 192 + "tokio", 193 + "trait-variant", 194 + "web-time", 195 + ] 196 + 197 + [[package]] 198 + name = "atrium-identity" 199 + version = "0.1.6" 200 + source = "registry+https://github.com/rust-lang/crates.io-index" 201 + checksum = "035d4fcfed4a42e10f343e7ffc2b4a5aba355ece4b272a25f683043f07728ce0" 202 + dependencies = [ 203 + "atrium-api", 204 + "atrium-common", 205 + "atrium-xrpc", 206 + "serde", 207 + "serde_html_form", 208 + "serde_json", 209 + "thiserror 1.0.69", 210 + "trait-variant", 211 + ] 212 + 213 + [[package]] 214 + name = "atrium-oauth" 215 + version = "0.1.4" 216 + source = "registry+https://github.com/rust-lang/crates.io-index" 217 + checksum = "d04c6818380cbaac6ae75f3b1ecf9f9210083fa8193dd9c218305a99fb4b34bd" 218 + dependencies = [ 219 + "atrium-api", 220 + "atrium-common", 221 + "atrium-identity", 222 + "atrium-xrpc", 223 + "base64 0.22.1", 224 + "chrono", 225 + "dashmap", 226 + "ecdsa", 227 + "elliptic-curve", 228 + "jose-jwa", 229 + "jose-jwk", 230 + "p256", 231 + "rand", 232 + "reqwest", 233 + "serde", 234 + "serde_html_form", 235 + "serde_json", 236 + "sha2", 237 + "thiserror 1.0.69", 238 + "tokio", 239 + "trait-variant", 240 + ] 241 + 242 + [[package]] 243 + name = "atrium-xrpc" 244 + version = "0.12.3" 245 + source = "registry+https://github.com/rust-lang/crates.io-index" 246 + checksum = "0216ad50ce34e9ff982e171c3659e65dedaa2ed5ac2994524debdc9a9647ffa8" 247 + dependencies = [ 248 + "http 1.3.1", 249 + "serde", 250 + "serde_html_form", 251 + "serde_json", 252 + "thiserror 1.0.69", 253 + "trait-variant", 254 + ] 255 + 256 + [[package]] 257 + name = "atrium-xrpc-client" 258 + version = "0.5.14" 259 + source = "registry+https://github.com/rust-lang/crates.io-index" 260 + checksum = "e099e5171f79faef52364ef0657a4cab086a71b384a779a29597a91b780de0d5" 261 + dependencies = [ 262 + "atrium-xrpc", 263 + "reqwest", 264 + ] 265 + 266 + [[package]] 267 + name = "autocfg" 268 + version = "1.4.0" 269 + source = "registry+https://github.com/rust-lang/crates.io-index" 270 + checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 271 + 272 + [[package]] 273 + name = "backtrace" 274 + version = "0.3.75" 275 + source = "registry+https://github.com/rust-lang/crates.io-index" 276 + checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 277 + dependencies = [ 278 + "addr2line", 279 + "cfg-if", 280 + "libc", 281 + "miniz_oxide", 282 + "object", 283 + "rustc-demangle", 284 + "windows-targets 0.52.6", 285 + ] 286 + 287 + [[package]] 288 + name = "base-x" 289 + version = "0.2.11" 290 + source = "registry+https://github.com/rust-lang/crates.io-index" 291 + checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" 292 + 293 + [[package]] 294 + name = "base16ct" 295 + version = "0.2.0" 296 + source = "registry+https://github.com/rust-lang/crates.io-index" 297 + checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 298 + 299 + [[package]] 300 + name = "base64" 301 + version = "0.21.7" 302 + source = "registry+https://github.com/rust-lang/crates.io-index" 303 + checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 304 + 305 + [[package]] 306 + name = "base64" 307 + version = "0.22.1" 308 + source = "registry+https://github.com/rust-lang/crates.io-index" 309 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 310 + 311 + [[package]] 312 + name = "base64ct" 313 + version = "1.7.3" 314 + source = "registry+https://github.com/rust-lang/crates.io-index" 315 + checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" 316 + 317 + [[package]] 318 + name = "bitflags" 319 + version = "2.9.1" 320 + source = "registry+https://github.com/rust-lang/crates.io-index" 321 + checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 322 + 323 + [[package]] 324 + name = "block-buffer" 325 + version = "0.10.4" 326 + source = "registry+https://github.com/rust-lang/crates.io-index" 327 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 328 + dependencies = [ 329 + "generic-array", 330 + ] 331 + 332 + [[package]] 333 + name = "bon" 334 + version = "3.6.3" 335 + source = "registry+https://github.com/rust-lang/crates.io-index" 336 + checksum = "ced38439e7a86a4761f7f7d5ded5ff009135939ecb464a24452eaa4c1696af7d" 337 + dependencies = [ 338 + "bon-macros", 339 + "rustversion", 340 + ] 341 + 342 + [[package]] 343 + name = "bon-macros" 344 + version = "3.6.3" 345 + source = "registry+https://github.com/rust-lang/crates.io-index" 346 + checksum = "0ce61d2d3844c6b8d31b2353d9f66cf5e632b3e9549583fe3cac2f4f6136725e" 347 + dependencies = [ 348 + "darling", 349 + "ident_case", 350 + "prettyplease", 351 + "proc-macro2", 352 + "quote", 353 + "rustversion", 354 + "syn", 355 + ] 356 + 357 + [[package]] 358 + name = "bot" 359 + version = "0.1.0" 360 + dependencies = [ 361 + "anyhow", 362 + "clap", 363 + "dotenv", 364 + "env_logger", 365 + "log", 366 + "logic", 367 + "tokio", 368 + ] 369 + 370 + [[package]] 371 + name = "bumpalo" 372 + version = "3.17.0" 373 + source = "registry+https://github.com/rust-lang/crates.io-index" 374 + checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 375 + 376 + [[package]] 377 + name = "byteorder" 378 + version = "1.5.0" 379 + source = "registry+https://github.com/rust-lang/crates.io-index" 380 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 381 + 382 + [[package]] 383 + name = "bytes" 384 + version = "1.10.1" 385 + source = "registry+https://github.com/rust-lang/crates.io-index" 386 + checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 387 + 388 + [[package]] 389 + name = "cc" 390 + version = "1.2.23" 391 + source = "registry+https://github.com/rust-lang/crates.io-index" 392 + checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" 393 + dependencies = [ 394 + "jobserver", 395 + "libc", 396 + "shlex", 397 + ] 398 + 399 + [[package]] 400 + name = "cfg-if" 401 + version = "1.0.0" 402 + source = "registry+https://github.com/rust-lang/crates.io-index" 403 + checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 404 + 405 + [[package]] 406 + name = "chrono" 407 + version = "0.4.41" 408 + source = "registry+https://github.com/rust-lang/crates.io-index" 409 + checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 410 + dependencies = [ 411 + "android-tzdata", 412 + "iana-time-zone", 413 + "js-sys", 414 + "num-traits", 415 + "serde", 416 + "wasm-bindgen", 417 + "windows-link", 418 + ] 419 + 420 + [[package]] 421 + name = "cid" 422 + version = "0.11.1" 423 + source = "registry+https://github.com/rust-lang/crates.io-index" 424 + checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" 425 + dependencies = [ 426 + "core2", 427 + "multibase", 428 + "multihash", 429 + "serde", 430 + "serde_bytes", 431 + "unsigned-varint", 432 + ] 433 + 434 + [[package]] 435 + name = "clap" 436 + version = "4.5.38" 437 + source = "registry+https://github.com/rust-lang/crates.io-index" 438 + checksum = "ed93b9805f8ba930df42c2590f05453d5ec36cbb85d018868a5b24d31f6ac000" 439 + dependencies = [ 440 + "clap_builder", 441 + "clap_derive", 442 + ] 443 + 444 + [[package]] 445 + name = "clap_builder" 446 + version = "4.5.38" 447 + source = "registry+https://github.com/rust-lang/crates.io-index" 448 + checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120" 449 + dependencies = [ 450 + "anstream", 451 + "anstyle", 452 + "clap_lex", 453 + "strsim", 454 + ] 455 + 456 + [[package]] 457 + name = "clap_derive" 458 + version = "4.5.32" 459 + source = "registry+https://github.com/rust-lang/crates.io-index" 460 + checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" 461 + dependencies = [ 462 + "heck", 463 + "proc-macro2", 464 + "quote", 465 + "syn", 466 + ] 467 + 468 + [[package]] 469 + name = "clap_lex" 470 + version = "0.7.4" 471 + source = "registry+https://github.com/rust-lang/crates.io-index" 472 + checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 473 + 474 + [[package]] 475 + name = "colorchoice" 476 + version = "1.0.3" 477 + source = "registry+https://github.com/rust-lang/crates.io-index" 478 + checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 479 + 480 + [[package]] 481 + name = "concurrent-queue" 482 + version = "2.5.0" 483 + source = "registry+https://github.com/rust-lang/crates.io-index" 484 + checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 485 + dependencies = [ 486 + "crossbeam-utils", 487 + ] 488 + 489 + [[package]] 490 + name = "const-oid" 491 + version = "0.9.6" 492 + source = "registry+https://github.com/rust-lang/crates.io-index" 493 + checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 494 + 495 + [[package]] 496 + name = "core-foundation" 497 + version = "0.9.4" 498 + source = "registry+https://github.com/rust-lang/crates.io-index" 499 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 500 + dependencies = [ 501 + "core-foundation-sys", 502 + "libc", 503 + ] 504 + 505 + [[package]] 506 + name = "core-foundation-sys" 507 + version = "0.8.7" 508 + source = "registry+https://github.com/rust-lang/crates.io-index" 509 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 510 + 511 + [[package]] 512 + name = "core2" 513 + version = "0.4.0" 514 + source = "registry+https://github.com/rust-lang/crates.io-index" 515 + checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" 516 + dependencies = [ 517 + "memchr", 518 + ] 519 + 520 + [[package]] 521 + name = "cpufeatures" 522 + version = "0.2.17" 523 + source = "registry+https://github.com/rust-lang/crates.io-index" 524 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 525 + dependencies = [ 526 + "libc", 527 + ] 528 + 529 + [[package]] 530 + name = "crc32fast" 531 + version = "1.4.2" 532 + source = "registry+https://github.com/rust-lang/crates.io-index" 533 + checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 534 + dependencies = [ 535 + "cfg-if", 536 + ] 537 + 538 + [[package]] 539 + name = "crossbeam-channel" 540 + version = "0.5.15" 541 + source = "registry+https://github.com/rust-lang/crates.io-index" 542 + checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 543 + dependencies = [ 544 + "crossbeam-utils", 545 + ] 546 + 547 + [[package]] 548 + name = "crossbeam-epoch" 549 + version = "0.9.18" 550 + source = "registry+https://github.com/rust-lang/crates.io-index" 551 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 552 + dependencies = [ 553 + "crossbeam-utils", 554 + ] 555 + 556 + [[package]] 557 + name = "crossbeam-utils" 558 + version = "0.8.21" 559 + source = "registry+https://github.com/rust-lang/crates.io-index" 560 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 561 + 562 + [[package]] 563 + name = "crypto-bigint" 564 + version = "0.5.5" 565 + source = "registry+https://github.com/rust-lang/crates.io-index" 566 + checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 567 + dependencies = [ 568 + "generic-array", 569 + "rand_core", 570 + "subtle", 571 + "zeroize", 572 + ] 573 + 574 + [[package]] 575 + name = "crypto-common" 576 + version = "0.1.6" 577 + source = "registry+https://github.com/rust-lang/crates.io-index" 578 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 579 + dependencies = [ 580 + "generic-array", 581 + "typenum", 582 + ] 583 + 584 + [[package]] 585 + name = "darling" 586 + version = "0.20.11" 587 + source = "registry+https://github.com/rust-lang/crates.io-index" 588 + checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 589 + dependencies = [ 590 + "darling_core", 591 + "darling_macro", 592 + ] 593 + 594 + [[package]] 595 + name = "darling_core" 596 + version = "0.20.11" 597 + source = "registry+https://github.com/rust-lang/crates.io-index" 598 + checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 599 + dependencies = [ 600 + "fnv", 601 + "ident_case", 602 + "proc-macro2", 603 + "quote", 604 + "strsim", 605 + "syn", 606 + ] 607 + 608 + [[package]] 609 + name = "darling_macro" 610 + version = "0.20.11" 611 + source = "registry+https://github.com/rust-lang/crates.io-index" 612 + checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 613 + dependencies = [ 614 + "darling_core", 615 + "quote", 616 + "syn", 617 + ] 618 + 619 + [[package]] 620 + name = "dashmap" 621 + version = "6.1.0" 622 + source = "registry+https://github.com/rust-lang/crates.io-index" 623 + checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" 624 + dependencies = [ 625 + "cfg-if", 626 + "crossbeam-utils", 627 + "hashbrown 0.14.5", 628 + "lock_api", 629 + "once_cell", 630 + "parking_lot_core", 631 + ] 632 + 633 + [[package]] 634 + name = "data-encoding" 635 + version = "2.9.0" 636 + source = "registry+https://github.com/rust-lang/crates.io-index" 637 + checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 638 + 639 + [[package]] 640 + name = "data-encoding-macro" 641 + version = "0.1.18" 642 + source = "registry+https://github.com/rust-lang/crates.io-index" 643 + checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" 644 + dependencies = [ 645 + "data-encoding", 646 + "data-encoding-macro-internal", 647 + ] 648 + 649 + [[package]] 650 + name = "data-encoding-macro-internal" 651 + version = "0.1.16" 652 + source = "registry+https://github.com/rust-lang/crates.io-index" 653 + checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" 654 + dependencies = [ 655 + "data-encoding", 656 + "syn", 657 + ] 658 + 659 + [[package]] 660 + name = "der" 661 + version = "0.7.10" 662 + source = "registry+https://github.com/rust-lang/crates.io-index" 663 + checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 664 + dependencies = [ 665 + "const-oid", 666 + "zeroize", 667 + ] 668 + 669 + [[package]] 670 + name = "derive_builder" 671 + version = "0.20.2" 672 + source = "registry+https://github.com/rust-lang/crates.io-index" 673 + checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" 674 + dependencies = [ 675 + "derive_builder_macro", 676 + ] 677 + 678 + [[package]] 679 + name = "derive_builder_core" 680 + version = "0.20.2" 681 + source = "registry+https://github.com/rust-lang/crates.io-index" 682 + checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" 683 + dependencies = [ 684 + "darling", 685 + "proc-macro2", 686 + "quote", 687 + "syn", 688 + ] 689 + 690 + [[package]] 691 + name = "derive_builder_macro" 692 + version = "0.20.2" 693 + source = "registry+https://github.com/rust-lang/crates.io-index" 694 + checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" 695 + dependencies = [ 696 + "derive_builder_core", 697 + "syn", 698 + ] 699 + 700 + [[package]] 701 + name = "digest" 702 + version = "0.10.7" 703 + source = "registry+https://github.com/rust-lang/crates.io-index" 704 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 705 + dependencies = [ 706 + "block-buffer", 707 + "const-oid", 708 + "crypto-common", 709 + "subtle", 710 + ] 711 + 712 + [[package]] 713 + name = "displaydoc" 714 + version = "0.2.5" 715 + source = "registry+https://github.com/rust-lang/crates.io-index" 716 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 717 + dependencies = [ 718 + "proc-macro2", 719 + "quote", 720 + "syn", 721 + ] 722 + 723 + [[package]] 724 + name = "dotenv" 725 + version = "0.15.0" 726 + source = "registry+https://github.com/rust-lang/crates.io-index" 727 + checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" 728 + 729 + [[package]] 730 + name = "ecdsa" 731 + version = "0.16.9" 732 + source = "registry+https://github.com/rust-lang/crates.io-index" 733 + checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 734 + dependencies = [ 735 + "der", 736 + "digest", 737 + "elliptic-curve", 738 + "rfc6979", 739 + "signature", 740 + ] 741 + 742 + [[package]] 743 + name = "elliptic-curve" 744 + version = "0.13.8" 745 + source = "registry+https://github.com/rust-lang/crates.io-index" 746 + checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" 747 + dependencies = [ 748 + "base16ct", 749 + "crypto-bigint", 750 + "digest", 751 + "ff", 752 + "generic-array", 753 + "group", 754 + "rand_core", 755 + "sec1", 756 + "subtle", 757 + "zeroize", 758 + ] 759 + 760 + [[package]] 761 + name = "env_filter" 762 + version = "0.1.3" 763 + source = "registry+https://github.com/rust-lang/crates.io-index" 764 + checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" 765 + dependencies = [ 766 + "log", 767 + "regex", 768 + ] 769 + 770 + [[package]] 771 + name = "env_logger" 772 + version = "0.11.8" 773 + source = "registry+https://github.com/rust-lang/crates.io-index" 774 + checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" 775 + dependencies = [ 776 + "anstream", 777 + "anstyle", 778 + "env_filter", 779 + "jiff", 780 + "log", 781 + ] 782 + 783 + [[package]] 784 + name = "equivalent" 785 + version = "1.0.2" 786 + source = "registry+https://github.com/rust-lang/crates.io-index" 787 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 788 + 789 + [[package]] 790 + name = "errno" 791 + version = "0.3.12" 792 + source = "registry+https://github.com/rust-lang/crates.io-index" 793 + checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" 794 + dependencies = [ 795 + "libc", 796 + "windows-sys 0.59.0", 797 + ] 798 + 799 + [[package]] 800 + name = "event-listener" 801 + version = "5.4.0" 802 + source = "registry+https://github.com/rust-lang/crates.io-index" 803 + checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 804 + dependencies = [ 805 + "concurrent-queue", 806 + "parking", 807 + "pin-project-lite", 808 + ] 809 + 810 + [[package]] 811 + name = "event-listener-strategy" 812 + version = "0.5.4" 813 + source = "registry+https://github.com/rust-lang/crates.io-index" 814 + checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 815 + dependencies = [ 816 + "event-listener", 817 + "pin-project-lite", 818 + ] 819 + 820 + [[package]] 821 + name = "fastrand" 822 + version = "2.3.0" 823 + source = "registry+https://github.com/rust-lang/crates.io-index" 824 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 825 + 826 + [[package]] 827 + name = "ff" 828 + version = "0.13.1" 829 + source = "registry+https://github.com/rust-lang/crates.io-index" 830 + checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" 831 + dependencies = [ 832 + "rand_core", 833 + "subtle", 834 + ] 835 + 836 + [[package]] 837 + name = "flate2" 838 + version = "1.1.1" 839 + source = "registry+https://github.com/rust-lang/crates.io-index" 840 + checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" 841 + dependencies = [ 842 + "crc32fast", 843 + "miniz_oxide", 844 + ] 845 + 846 + [[package]] 847 + name = "flume" 848 + version = "0.11.1" 849 + source = "registry+https://github.com/rust-lang/crates.io-index" 850 + checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 851 + dependencies = [ 852 + "futures-core", 853 + "futures-sink", 854 + "nanorand", 855 + "spin", 856 + ] 857 + 858 + [[package]] 859 + name = "fnv" 860 + version = "1.0.7" 861 + source = "registry+https://github.com/rust-lang/crates.io-index" 862 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 863 + 864 + [[package]] 865 + name = "foldhash" 866 + version = "0.1.5" 867 + source = "registry+https://github.com/rust-lang/crates.io-index" 868 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 869 + 870 + [[package]] 871 + name = "foreign-types" 872 + version = "0.3.2" 873 + source = "registry+https://github.com/rust-lang/crates.io-index" 874 + checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 875 + dependencies = [ 876 + "foreign-types-shared", 877 + ] 878 + 879 + [[package]] 880 + name = "foreign-types-shared" 881 + version = "0.1.1" 882 + source = "registry+https://github.com/rust-lang/crates.io-index" 883 + checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 884 + 885 + [[package]] 886 + name = "form_urlencoded" 887 + version = "1.2.1" 888 + source = "registry+https://github.com/rust-lang/crates.io-index" 889 + checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 890 + dependencies = [ 891 + "percent-encoding", 892 + ] 893 + 894 + [[package]] 895 + name = "futures-channel" 896 + version = "0.3.31" 897 + source = "registry+https://github.com/rust-lang/crates.io-index" 898 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 899 + dependencies = [ 900 + "futures-core", 901 + ] 902 + 903 + [[package]] 904 + name = "futures-core" 905 + version = "0.3.31" 906 + source = "registry+https://github.com/rust-lang/crates.io-index" 907 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 908 + 909 + [[package]] 910 + name = "futures-macro" 911 + version = "0.3.31" 912 + source = "registry+https://github.com/rust-lang/crates.io-index" 913 + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 914 + dependencies = [ 915 + "proc-macro2", 916 + "quote", 917 + "syn", 918 + ] 919 + 920 + [[package]] 921 + name = "futures-sink" 922 + version = "0.3.31" 923 + source = "registry+https://github.com/rust-lang/crates.io-index" 924 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 925 + 926 + [[package]] 927 + name = "futures-task" 928 + version = "0.3.31" 929 + source = "registry+https://github.com/rust-lang/crates.io-index" 930 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 931 + 932 + [[package]] 933 + name = "futures-util" 934 + version = "0.3.31" 935 + source = "registry+https://github.com/rust-lang/crates.io-index" 936 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 937 + dependencies = [ 938 + "futures-core", 939 + "futures-macro", 940 + "futures-sink", 941 + "futures-task", 942 + "pin-project-lite", 943 + "pin-utils", 944 + "slab", 945 + ] 946 + 947 + [[package]] 948 + name = "generator" 949 + version = "0.8.5" 950 + source = "registry+https://github.com/rust-lang/crates.io-index" 951 + checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" 952 + dependencies = [ 953 + "cc", 954 + "cfg-if", 955 + "libc", 956 + "log", 957 + "rustversion", 958 + "windows", 959 + ] 960 + 961 + [[package]] 962 + name = "generic-array" 963 + version = "0.14.7" 964 + source = "registry+https://github.com/rust-lang/crates.io-index" 965 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 966 + dependencies = [ 967 + "typenum", 968 + "version_check", 969 + "zeroize", 970 + ] 971 + 972 + [[package]] 973 + name = "getrandom" 974 + version = "0.2.16" 975 + source = "registry+https://github.com/rust-lang/crates.io-index" 976 + checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 977 + dependencies = [ 978 + "cfg-if", 979 + "js-sys", 980 + "libc", 981 + "wasi 0.11.0+wasi-snapshot-preview1", 982 + "wasm-bindgen", 983 + ] 984 + 985 + [[package]] 986 + name = "getrandom" 987 + version = "0.3.3" 988 + source = "registry+https://github.com/rust-lang/crates.io-index" 989 + checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 990 + dependencies = [ 991 + "cfg-if", 992 + "libc", 993 + "r-efi", 994 + "wasi 0.14.2+wasi-0.2.4", 995 + ] 996 + 997 + [[package]] 998 + name = "gimli" 999 + version = "0.31.1" 1000 + source = "registry+https://github.com/rust-lang/crates.io-index" 1001 + checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1002 + 1003 + [[package]] 1004 + name = "gloo-utils" 1005 + version = "0.2.0" 1006 + source = "registry+https://github.com/rust-lang/crates.io-index" 1007 + checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" 1008 + dependencies = [ 1009 + "js-sys", 1010 + "serde", 1011 + "serde_json", 1012 + "wasm-bindgen", 1013 + "web-sys", 1014 + ] 1015 + 1016 + [[package]] 1017 + name = "group" 1018 + version = "0.13.0" 1019 + source = "registry+https://github.com/rust-lang/crates.io-index" 1020 + checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" 1021 + dependencies = [ 1022 + "ff", 1023 + "rand_core", 1024 + "subtle", 1025 + ] 1026 + 1027 + [[package]] 1028 + name = "hashbrown" 1029 + version = "0.14.5" 1030 + source = "registry+https://github.com/rust-lang/crates.io-index" 1031 + checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1032 + 1033 + [[package]] 1034 + name = "hashbrown" 1035 + version = "0.15.3" 1036 + source = "registry+https://github.com/rust-lang/crates.io-index" 1037 + checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" 1038 + dependencies = [ 1039 + "allocator-api2", 1040 + "equivalent", 1041 + "foldhash", 1042 + ] 1043 + 1044 + [[package]] 1045 + name = "heck" 1046 + version = "0.5.0" 1047 + source = "registry+https://github.com/rust-lang/crates.io-index" 1048 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1049 + 1050 + [[package]] 1051 + name = "hmac" 1052 + version = "0.12.1" 1053 + source = "registry+https://github.com/rust-lang/crates.io-index" 1054 + checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1055 + dependencies = [ 1056 + "digest", 1057 + ] 1058 + 1059 + [[package]] 1060 + name = "http" 1061 + version = "0.2.12" 1062 + source = "registry+https://github.com/rust-lang/crates.io-index" 1063 + checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1064 + dependencies = [ 1065 + "bytes", 1066 + "fnv", 1067 + "itoa", 1068 + ] 1069 + 1070 + [[package]] 1071 + name = "http" 1072 + version = "1.3.1" 1073 + source = "registry+https://github.com/rust-lang/crates.io-index" 1074 + checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 1075 + dependencies = [ 1076 + "bytes", 1077 + "fnv", 1078 + "itoa", 1079 + ] 1080 + 1081 + [[package]] 1082 + name = "http-body" 1083 + version = "1.0.1" 1084 + source = "registry+https://github.com/rust-lang/crates.io-index" 1085 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1086 + dependencies = [ 1087 + "bytes", 1088 + "http 1.3.1", 1089 + ] 1090 + 1091 + [[package]] 1092 + name = "http-body-util" 1093 + version = "0.1.3" 1094 + source = "registry+https://github.com/rust-lang/crates.io-index" 1095 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 1096 + dependencies = [ 1097 + "bytes", 1098 + "futures-core", 1099 + "http 1.3.1", 1100 + "http-body", 1101 + "pin-project-lite", 1102 + ] 1103 + 1104 + [[package]] 1105 + name = "httparse" 1106 + version = "1.10.1" 1107 + source = "registry+https://github.com/rust-lang/crates.io-index" 1108 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 1109 + 1110 + [[package]] 1111 + name = "hyper" 1112 + version = "1.6.0" 1113 + source = "registry+https://github.com/rust-lang/crates.io-index" 1114 + checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1115 + dependencies = [ 1116 + "bytes", 1117 + "futures-channel", 1118 + "futures-util", 1119 + "http 1.3.1", 1120 + "http-body", 1121 + "httparse", 1122 + "itoa", 1123 + "pin-project-lite", 1124 + "smallvec", 1125 + "tokio", 1126 + "want", 1127 + ] 1128 + 1129 + [[package]] 1130 + name = "hyper-tls" 1131 + version = "0.6.0" 1132 + source = "registry+https://github.com/rust-lang/crates.io-index" 1133 + checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 1134 + dependencies = [ 1135 + "bytes", 1136 + "http-body-util", 1137 + "hyper", 1138 + "hyper-util", 1139 + "native-tls", 1140 + "tokio", 1141 + "tokio-native-tls", 1142 + "tower-service", 1143 + ] 1144 + 1145 + [[package]] 1146 + name = "hyper-util" 1147 + version = "0.1.11" 1148 + source = "registry+https://github.com/rust-lang/crates.io-index" 1149 + checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" 1150 + dependencies = [ 1151 + "bytes", 1152 + "futures-channel", 1153 + "futures-util", 1154 + "http 1.3.1", 1155 + "http-body", 1156 + "hyper", 1157 + "libc", 1158 + "pin-project-lite", 1159 + "socket2", 1160 + "tokio", 1161 + "tower-service", 1162 + "tracing", 1163 + ] 1164 + 1165 + [[package]] 1166 + name = "iana-time-zone" 1167 + version = "0.1.63" 1168 + source = "registry+https://github.com/rust-lang/crates.io-index" 1169 + checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1170 + dependencies = [ 1171 + "android_system_properties", 1172 + "core-foundation-sys", 1173 + "iana-time-zone-haiku", 1174 + "js-sys", 1175 + "log", 1176 + "wasm-bindgen", 1177 + "windows-core", 1178 + ] 1179 + 1180 + [[package]] 1181 + name = "iana-time-zone-haiku" 1182 + version = "0.1.2" 1183 + source = "registry+https://github.com/rust-lang/crates.io-index" 1184 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1185 + dependencies = [ 1186 + "cc", 1187 + ] 1188 + 1189 + [[package]] 1190 + name = "icu_collections" 1191 + version = "2.0.0" 1192 + source = "registry+https://github.com/rust-lang/crates.io-index" 1193 + checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1194 + dependencies = [ 1195 + "displaydoc", 1196 + "potential_utf", 1197 + "yoke", 1198 + "zerofrom", 1199 + "zerovec", 1200 + ] 1201 + 1202 + [[package]] 1203 + name = "icu_locale_core" 1204 + version = "2.0.0" 1205 + source = "registry+https://github.com/rust-lang/crates.io-index" 1206 + checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1207 + dependencies = [ 1208 + "displaydoc", 1209 + "litemap", 1210 + "tinystr", 1211 + "writeable", 1212 + "zerovec", 1213 + ] 1214 + 1215 + [[package]] 1216 + name = "icu_normalizer" 1217 + version = "2.0.0" 1218 + source = "registry+https://github.com/rust-lang/crates.io-index" 1219 + checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1220 + dependencies = [ 1221 + "displaydoc", 1222 + "icu_collections", 1223 + "icu_normalizer_data", 1224 + "icu_properties", 1225 + "icu_provider", 1226 + "smallvec", 1227 + "zerovec", 1228 + ] 1229 + 1230 + [[package]] 1231 + name = "icu_normalizer_data" 1232 + version = "2.0.0" 1233 + source = "registry+https://github.com/rust-lang/crates.io-index" 1234 + checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1235 + 1236 + [[package]] 1237 + name = "icu_properties" 1238 + version = "2.0.0" 1239 + source = "registry+https://github.com/rust-lang/crates.io-index" 1240 + checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" 1241 + dependencies = [ 1242 + "displaydoc", 1243 + "icu_collections", 1244 + "icu_locale_core", 1245 + "icu_properties_data", 1246 + "icu_provider", 1247 + "potential_utf", 1248 + "zerotrie", 1249 + "zerovec", 1250 + ] 1251 + 1252 + [[package]] 1253 + name = "icu_properties_data" 1254 + version = "2.0.0" 1255 + source = "registry+https://github.com/rust-lang/crates.io-index" 1256 + checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" 1257 + 1258 + [[package]] 1259 + name = "icu_provider" 1260 + version = "2.0.0" 1261 + source = "registry+https://github.com/rust-lang/crates.io-index" 1262 + checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1263 + dependencies = [ 1264 + "displaydoc", 1265 + "icu_locale_core", 1266 + "stable_deref_trait", 1267 + "tinystr", 1268 + "writeable", 1269 + "yoke", 1270 + "zerofrom", 1271 + "zerotrie", 1272 + "zerovec", 1273 + ] 1274 + 1275 + [[package]] 1276 + name = "ident_case" 1277 + version = "1.0.1" 1278 + source = "registry+https://github.com/rust-lang/crates.io-index" 1279 + checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1280 + 1281 + [[package]] 1282 + name = "idna" 1283 + version = "1.0.3" 1284 + source = "registry+https://github.com/rust-lang/crates.io-index" 1285 + checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1286 + dependencies = [ 1287 + "idna_adapter", 1288 + "smallvec", 1289 + "utf8_iter", 1290 + ] 1291 + 1292 + [[package]] 1293 + name = "idna_adapter" 1294 + version = "1.2.1" 1295 + source = "registry+https://github.com/rust-lang/crates.io-index" 1296 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 1297 + dependencies = [ 1298 + "icu_normalizer", 1299 + "icu_properties", 1300 + ] 1301 + 1302 + [[package]] 1303 + name = "indexmap" 1304 + version = "2.9.0" 1305 + source = "registry+https://github.com/rust-lang/crates.io-index" 1306 + checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 1307 + dependencies = [ 1308 + "equivalent", 1309 + "hashbrown 0.15.3", 1310 + ] 1311 + 1312 + [[package]] 1313 + name = "ipld-core" 1314 + version = "0.4.2" 1315 + source = "registry+https://github.com/rust-lang/crates.io-index" 1316 + checksum = "104718b1cc124d92a6d01ca9c9258a7df311405debb3408c445a36452f9bf8db" 1317 + dependencies = [ 1318 + "cid", 1319 + "serde", 1320 + "serde_bytes", 1321 + ] 1322 + 1323 + [[package]] 1324 + name = "ipnet" 1325 + version = "2.11.0" 1326 + source = "registry+https://github.com/rust-lang/crates.io-index" 1327 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1328 + 1329 + [[package]] 1330 + name = "is_terminal_polyfill" 1331 + version = "1.70.1" 1332 + source = "registry+https://github.com/rust-lang/crates.io-index" 1333 + checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1334 + 1335 + [[package]] 1336 + name = "itoa" 1337 + version = "1.0.15" 1338 + source = "registry+https://github.com/rust-lang/crates.io-index" 1339 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1340 + 1341 + [[package]] 1342 + name = "jiff" 1343 + version = "0.2.13" 1344 + source = "registry+https://github.com/rust-lang/crates.io-index" 1345 + checksum = "f02000660d30638906021176af16b17498bd0d12813dbfe7b276d8bc7f3c0806" 1346 + dependencies = [ 1347 + "jiff-static", 1348 + "log", 1349 + "portable-atomic", 1350 + "portable-atomic-util", 1351 + "serde", 1352 + ] 1353 + 1354 + [[package]] 1355 + name = "jiff-static" 1356 + version = "0.2.13" 1357 + source = "registry+https://github.com/rust-lang/crates.io-index" 1358 + checksum = "f3c30758ddd7188629c6713fc45d1188af4f44c90582311d0c8d8c9907f60c48" 1359 + dependencies = [ 1360 + "proc-macro2", 1361 + "quote", 1362 + "syn", 1363 + ] 1364 + 1365 + [[package]] 1366 + name = "jobserver" 1367 + version = "0.1.33" 1368 + source = "registry+https://github.com/rust-lang/crates.io-index" 1369 + checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 1370 + dependencies = [ 1371 + "getrandom 0.3.3", 1372 + "libc", 1373 + ] 1374 + 1375 + [[package]] 1376 + name = "jose-b64" 1377 + version = "0.1.2" 1378 + source = "registry+https://github.com/rust-lang/crates.io-index" 1379 + checksum = "bec69375368709666b21c76965ce67549f2d2db7605f1f8707d17c9656801b56" 1380 + dependencies = [ 1381 + "base64ct", 1382 + "serde", 1383 + "subtle", 1384 + "zeroize", 1385 + ] 1386 + 1387 + [[package]] 1388 + name = "jose-jwa" 1389 + version = "0.1.2" 1390 + source = "registry+https://github.com/rust-lang/crates.io-index" 1391 + checksum = "9ab78e053fe886a351d67cf0d194c000f9d0dcb92906eb34d853d7e758a4b3a7" 1392 + dependencies = [ 1393 + "serde", 1394 + ] 1395 + 1396 + [[package]] 1397 + name = "jose-jwk" 1398 + version = "0.1.2" 1399 + source = "registry+https://github.com/rust-lang/crates.io-index" 1400 + checksum = "280fa263807fe0782ecb6f2baadc28dffc04e00558a58e33bfdb801d11fd58e7" 1401 + dependencies = [ 1402 + "jose-b64", 1403 + "jose-jwa", 1404 + "p256", 1405 + "serde", 1406 + "zeroize", 1407 + ] 1408 + 1409 + [[package]] 1410 + name = "js-sys" 1411 + version = "0.3.77" 1412 + source = "registry+https://github.com/rust-lang/crates.io-index" 1413 + checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1414 + dependencies = [ 1415 + "once_cell", 1416 + "wasm-bindgen", 1417 + ] 1418 + 1419 + [[package]] 1420 + name = "langtag" 1421 + version = "0.3.4" 1422 + source = "registry+https://github.com/rust-lang/crates.io-index" 1423 + checksum = "ed60c85f254d6ae8450cec15eedd921efbc4d1bdf6fcf6202b9a58b403f6f805" 1424 + dependencies = [ 1425 + "serde", 1426 + ] 1427 + 1428 + [[package]] 1429 + name = "lazy_static" 1430 + version = "1.5.0" 1431 + source = "registry+https://github.com/rust-lang/crates.io-index" 1432 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1433 + 1434 + [[package]] 1435 + name = "libc" 1436 + version = "0.2.172" 1437 + source = "registry+https://github.com/rust-lang/crates.io-index" 1438 + checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 1439 + 1440 + [[package]] 1441 + name = "linux-raw-sys" 1442 + version = "0.9.4" 1443 + source = "registry+https://github.com/rust-lang/crates.io-index" 1444 + checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 1445 + 1446 + [[package]] 1447 + name = "litemap" 1448 + version = "0.8.0" 1449 + source = "registry+https://github.com/rust-lang/crates.io-index" 1450 + checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1451 + 1452 + [[package]] 1453 + name = "lock_api" 1454 + version = "0.4.12" 1455 + source = "registry+https://github.com/rust-lang/crates.io-index" 1456 + checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1457 + dependencies = [ 1458 + "autocfg", 1459 + "scopeguard", 1460 + ] 1461 + 1462 + [[package]] 1463 + name = "log" 1464 + version = "0.4.27" 1465 + source = "registry+https://github.com/rust-lang/crates.io-index" 1466 + checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 1467 + 1468 + [[package]] 1469 + name = "logic" 1470 + version = "0.1.0" 1471 + dependencies = [ 1472 + "anyhow", 1473 + "async-trait", 1474 + "atproto_api", 1475 + "atrium-api", 1476 + "atrium-common", 1477 + "atrium-identity", 1478 + "atrium-oauth", 1479 + "atrium-xrpc-client", 1480 + "clap", 1481 + "flume", 1482 + "getrandom 0.2.16", 1483 + "gloo-utils", 1484 + "js-sys", 1485 + "reqwest", 1486 + "rocketman", 1487 + "serde", 1488 + "serde_json", 1489 + "thiserror 2.0.12", 1490 + "tokio", 1491 + "tungstenite", 1492 + "wasm-bindgen", 1493 + "web-sys", 1494 + ] 1495 + 1496 + [[package]] 1497 + name = "loom" 1498 + version = "0.7.2" 1499 + source = "registry+https://github.com/rust-lang/crates.io-index" 1500 + checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" 1501 + dependencies = [ 1502 + "cfg-if", 1503 + "generator", 1504 + "scoped-tls", 1505 + "tracing", 1506 + "tracing-subscriber", 1507 + ] 1508 + 1509 + [[package]] 1510 + name = "lru" 1511 + version = "0.12.5" 1512 + source = "registry+https://github.com/rust-lang/crates.io-index" 1513 + checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 1514 + dependencies = [ 1515 + "hashbrown 0.15.3", 1516 + ] 1517 + 1518 + [[package]] 1519 + name = "matchers" 1520 + version = "0.1.0" 1521 + source = "registry+https://github.com/rust-lang/crates.io-index" 1522 + checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1523 + dependencies = [ 1524 + "regex-automata 0.1.10", 1525 + ] 1526 + 1527 + [[package]] 1528 + name = "memchr" 1529 + version = "2.7.4" 1530 + source = "registry+https://github.com/rust-lang/crates.io-index" 1531 + checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1532 + 1533 + [[package]] 1534 + name = "metrics" 1535 + version = "0.24.2" 1536 + source = "registry+https://github.com/rust-lang/crates.io-index" 1537 + checksum = "25dea7ac8057892855ec285c440160265225438c3c45072613c25a4b26e98ef5" 1538 + dependencies = [ 1539 + "ahash", 1540 + "portable-atomic", 1541 + ] 1542 + 1543 + [[package]] 1544 + name = "mime" 1545 + version = "0.3.17" 1546 + source = "registry+https://github.com/rust-lang/crates.io-index" 1547 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1548 + 1549 + [[package]] 1550 + name = "miniz_oxide" 1551 + version = "0.8.8" 1552 + source = "registry+https://github.com/rust-lang/crates.io-index" 1553 + checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 1554 + dependencies = [ 1555 + "adler2", 1556 + ] 1557 + 1558 + [[package]] 1559 + name = "mio" 1560 + version = "1.0.3" 1561 + source = "registry+https://github.com/rust-lang/crates.io-index" 1562 + checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1563 + dependencies = [ 1564 + "libc", 1565 + "wasi 0.11.0+wasi-snapshot-preview1", 1566 + "windows-sys 0.52.0", 1567 + ] 1568 + 1569 + [[package]] 1570 + name = "moka" 1571 + version = "0.12.10" 1572 + source = "registry+https://github.com/rust-lang/crates.io-index" 1573 + checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" 1574 + dependencies = [ 1575 + "async-lock", 1576 + "crossbeam-channel", 1577 + "crossbeam-epoch", 1578 + "crossbeam-utils", 1579 + "event-listener", 1580 + "futures-util", 1581 + "loom", 1582 + "parking_lot", 1583 + "portable-atomic", 1584 + "rustc_version", 1585 + "smallvec", 1586 + "tagptr", 1587 + "thiserror 1.0.69", 1588 + "uuid", 1589 + ] 1590 + 1591 + [[package]] 1592 + name = "multibase" 1593 + version = "0.9.1" 1594 + source = "registry+https://github.com/rust-lang/crates.io-index" 1595 + checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" 1596 + dependencies = [ 1597 + "base-x", 1598 + "data-encoding", 1599 + "data-encoding-macro", 1600 + ] 1601 + 1602 + [[package]] 1603 + name = "multihash" 1604 + version = "0.19.3" 1605 + source = "registry+https://github.com/rust-lang/crates.io-index" 1606 + checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" 1607 + dependencies = [ 1608 + "core2", 1609 + "serde", 1610 + "unsigned-varint", 1611 + ] 1612 + 1613 + [[package]] 1614 + name = "nanorand" 1615 + version = "0.7.0" 1616 + source = "registry+https://github.com/rust-lang/crates.io-index" 1617 + checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" 1618 + dependencies = [ 1619 + "getrandom 0.2.16", 1620 + ] 1621 + 1622 + [[package]] 1623 + name = "native-tls" 1624 + version = "0.2.14" 1625 + source = "registry+https://github.com/rust-lang/crates.io-index" 1626 + checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 1627 + dependencies = [ 1628 + "libc", 1629 + "log", 1630 + "openssl", 1631 + "openssl-probe", 1632 + "openssl-sys", 1633 + "schannel", 1634 + "security-framework", 1635 + "security-framework-sys", 1636 + "tempfile", 1637 + ] 1638 + 1639 + [[package]] 1640 + name = "nu-ansi-term" 1641 + version = "0.46.0" 1642 + source = "registry+https://github.com/rust-lang/crates.io-index" 1643 + checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1644 + dependencies = [ 1645 + "overload", 1646 + "winapi", 1647 + ] 1648 + 1649 + [[package]] 1650 + name = "num-traits" 1651 + version = "0.2.19" 1652 + source = "registry+https://github.com/rust-lang/crates.io-index" 1653 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1654 + dependencies = [ 1655 + "autocfg", 1656 + ] 1657 + 1658 + [[package]] 1659 + name = "object" 1660 + version = "0.36.7" 1661 + source = "registry+https://github.com/rust-lang/crates.io-index" 1662 + checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1663 + dependencies = [ 1664 + "memchr", 1665 + ] 1666 + 1667 + [[package]] 1668 + name = "once_cell" 1669 + version = "1.21.3" 1670 + source = "registry+https://github.com/rust-lang/crates.io-index" 1671 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1672 + 1673 + [[package]] 1674 + name = "openssl" 1675 + version = "0.10.72" 1676 + source = "registry+https://github.com/rust-lang/crates.io-index" 1677 + checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" 1678 + dependencies = [ 1679 + "bitflags", 1680 + "cfg-if", 1681 + "foreign-types", 1682 + "libc", 1683 + "once_cell", 1684 + "openssl-macros", 1685 + "openssl-sys", 1686 + ] 1687 + 1688 + [[package]] 1689 + name = "openssl-macros" 1690 + version = "0.1.1" 1691 + source = "registry+https://github.com/rust-lang/crates.io-index" 1692 + checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1693 + dependencies = [ 1694 + "proc-macro2", 1695 + "quote", 1696 + "syn", 1697 + ] 1698 + 1699 + [[package]] 1700 + name = "openssl-probe" 1701 + version = "0.1.6" 1702 + source = "registry+https://github.com/rust-lang/crates.io-index" 1703 + checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1704 + 1705 + [[package]] 1706 + name = "openssl-sys" 1707 + version = "0.9.108" 1708 + source = "registry+https://github.com/rust-lang/crates.io-index" 1709 + checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" 1710 + dependencies = [ 1711 + "cc", 1712 + "libc", 1713 + "pkg-config", 1714 + "vcpkg", 1715 + ] 1716 + 1717 + [[package]] 1718 + name = "overload" 1719 + version = "0.1.1" 1720 + source = "registry+https://github.com/rust-lang/crates.io-index" 1721 + checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1722 + 1723 + [[package]] 1724 + name = "p256" 1725 + version = "0.13.2" 1726 + source = "registry+https://github.com/rust-lang/crates.io-index" 1727 + checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" 1728 + dependencies = [ 1729 + "ecdsa", 1730 + "elliptic-curve", 1731 + "primeorder", 1732 + "sha2", 1733 + ] 1734 + 1735 + [[package]] 1736 + name = "parking" 1737 + version = "2.2.1" 1738 + source = "registry+https://github.com/rust-lang/crates.io-index" 1739 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 1740 + 1741 + [[package]] 1742 + name = "parking_lot" 1743 + version = "0.12.3" 1744 + source = "registry+https://github.com/rust-lang/crates.io-index" 1745 + checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1746 + dependencies = [ 1747 + "lock_api", 1748 + "parking_lot_core", 1749 + ] 1750 + 1751 + [[package]] 1752 + name = "parking_lot_core" 1753 + version = "0.9.10" 1754 + source = "registry+https://github.com/rust-lang/crates.io-index" 1755 + checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1756 + dependencies = [ 1757 + "cfg-if", 1758 + "libc", 1759 + "redox_syscall", 1760 + "smallvec", 1761 + "windows-targets 0.52.6", 1762 + ] 1763 + 1764 + [[package]] 1765 + name = "percent-encoding" 1766 + version = "2.3.1" 1767 + source = "registry+https://github.com/rust-lang/crates.io-index" 1768 + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1769 + 1770 + [[package]] 1771 + name = "pin-project-lite" 1772 + version = "0.2.16" 1773 + source = "registry+https://github.com/rust-lang/crates.io-index" 1774 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1775 + 1776 + [[package]] 1777 + name = "pin-utils" 1778 + version = "0.1.0" 1779 + source = "registry+https://github.com/rust-lang/crates.io-index" 1780 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1781 + 1782 + [[package]] 1783 + name = "pkg-config" 1784 + version = "0.3.32" 1785 + source = "registry+https://github.com/rust-lang/crates.io-index" 1786 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1787 + 1788 + [[package]] 1789 + name = "portable-atomic" 1790 + version = "1.11.0" 1791 + source = "registry+https://github.com/rust-lang/crates.io-index" 1792 + checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" 1793 + 1794 + [[package]] 1795 + name = "portable-atomic-util" 1796 + version = "0.2.4" 1797 + source = "registry+https://github.com/rust-lang/crates.io-index" 1798 + checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 1799 + dependencies = [ 1800 + "portable-atomic", 1801 + ] 1802 + 1803 + [[package]] 1804 + name = "potential_utf" 1805 + version = "0.1.2" 1806 + source = "registry+https://github.com/rust-lang/crates.io-index" 1807 + checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 1808 + dependencies = [ 1809 + "zerovec", 1810 + ] 1811 + 1812 + [[package]] 1813 + name = "ppv-lite86" 1814 + version = "0.2.21" 1815 + source = "registry+https://github.com/rust-lang/crates.io-index" 1816 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1817 + dependencies = [ 1818 + "zerocopy", 1819 + ] 1820 + 1821 + [[package]] 1822 + name = "prettyplease" 1823 + version = "0.2.32" 1824 + source = "registry+https://github.com/rust-lang/crates.io-index" 1825 + checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" 1826 + dependencies = [ 1827 + "proc-macro2", 1828 + "syn", 1829 + ] 1830 + 1831 + [[package]] 1832 + name = "primeorder" 1833 + version = "0.13.6" 1834 + source = "registry+https://github.com/rust-lang/crates.io-index" 1835 + checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" 1836 + dependencies = [ 1837 + "elliptic-curve", 1838 + ] 1839 + 1840 + [[package]] 1841 + name = "proc-macro2" 1842 + version = "1.0.95" 1843 + source = "registry+https://github.com/rust-lang/crates.io-index" 1844 + checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 1845 + dependencies = [ 1846 + "unicode-ident", 1847 + ] 1848 + 1849 + [[package]] 1850 + name = "quote" 1851 + version = "1.0.40" 1852 + source = "registry+https://github.com/rust-lang/crates.io-index" 1853 + checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1854 + dependencies = [ 1855 + "proc-macro2", 1856 + ] 1857 + 1858 + [[package]] 1859 + name = "r-efi" 1860 + version = "5.2.0" 1861 + source = "registry+https://github.com/rust-lang/crates.io-index" 1862 + checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1863 + 1864 + [[package]] 1865 + name = "rand" 1866 + version = "0.8.5" 1867 + source = "registry+https://github.com/rust-lang/crates.io-index" 1868 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1869 + dependencies = [ 1870 + "libc", 1871 + "rand_chacha", 1872 + "rand_core", 1873 + ] 1874 + 1875 + [[package]] 1876 + name = "rand_chacha" 1877 + version = "0.3.1" 1878 + source = "registry+https://github.com/rust-lang/crates.io-index" 1879 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1880 + dependencies = [ 1881 + "ppv-lite86", 1882 + "rand_core", 1883 + ] 1884 + 1885 + [[package]] 1886 + name = "rand_core" 1887 + version = "0.6.4" 1888 + source = "registry+https://github.com/rust-lang/crates.io-index" 1889 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1890 + dependencies = [ 1891 + "getrandom 0.2.16", 1892 + ] 1893 + 1894 + [[package]] 1895 + name = "redox_syscall" 1896 + version = "0.5.12" 1897 + source = "registry+https://github.com/rust-lang/crates.io-index" 1898 + checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" 1899 + dependencies = [ 1900 + "bitflags", 1901 + ] 1902 + 1903 + [[package]] 1904 + name = "regex" 1905 + version = "1.11.1" 1906 + source = "registry+https://github.com/rust-lang/crates.io-index" 1907 + checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1908 + dependencies = [ 1909 + "aho-corasick", 1910 + "memchr", 1911 + "regex-automata 0.4.9", 1912 + "regex-syntax 0.8.5", 1913 + ] 1914 + 1915 + [[package]] 1916 + name = "regex-automata" 1917 + version = "0.1.10" 1918 + source = "registry+https://github.com/rust-lang/crates.io-index" 1919 + checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1920 + dependencies = [ 1921 + "regex-syntax 0.6.29", 1922 + ] 1923 + 1924 + [[package]] 1925 + name = "regex-automata" 1926 + version = "0.4.9" 1927 + source = "registry+https://github.com/rust-lang/crates.io-index" 1928 + checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1929 + dependencies = [ 1930 + "aho-corasick", 1931 + "memchr", 1932 + "regex-syntax 0.8.5", 1933 + ] 1934 + 1935 + [[package]] 1936 + name = "regex-syntax" 1937 + version = "0.6.29" 1938 + source = "registry+https://github.com/rust-lang/crates.io-index" 1939 + checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1940 + 1941 + [[package]] 1942 + name = "regex-syntax" 1943 + version = "0.8.5" 1944 + source = "registry+https://github.com/rust-lang/crates.io-index" 1945 + checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1946 + 1947 + [[package]] 1948 + name = "reqwest" 1949 + version = "0.12.15" 1950 + source = "registry+https://github.com/rust-lang/crates.io-index" 1951 + checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" 1952 + dependencies = [ 1953 + "async-compression", 1954 + "base64 0.22.1", 1955 + "bytes", 1956 + "futures-core", 1957 + "futures-util", 1958 + "http 1.3.1", 1959 + "http-body", 1960 + "http-body-util", 1961 + "hyper", 1962 + "hyper-tls", 1963 + "hyper-util", 1964 + "ipnet", 1965 + "js-sys", 1966 + "log", 1967 + "mime", 1968 + "native-tls", 1969 + "once_cell", 1970 + "percent-encoding", 1971 + "pin-project-lite", 1972 + "rustls-pemfile 2.2.0", 1973 + "serde", 1974 + "serde_json", 1975 + "serde_urlencoded", 1976 + "sync_wrapper", 1977 + "tokio", 1978 + "tokio-native-tls", 1979 + "tokio-util", 1980 + "tower", 1981 + "tower-service", 1982 + "url", 1983 + "wasm-bindgen", 1984 + "wasm-bindgen-futures", 1985 + "web-sys", 1986 + "windows-registry", 1987 + ] 1988 + 1989 + [[package]] 1990 + name = "rfc6979" 1991 + version = "0.4.0" 1992 + source = "registry+https://github.com/rust-lang/crates.io-index" 1993 + checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" 1994 + dependencies = [ 1995 + "hmac", 1996 + "subtle", 1997 + ] 1998 + 1999 + [[package]] 2000 + name = "ring" 2001 + version = "0.17.14" 2002 + source = "registry+https://github.com/rust-lang/crates.io-index" 2003 + checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 2004 + dependencies = [ 2005 + "cc", 2006 + "cfg-if", 2007 + "getrandom 0.2.16", 2008 + "libc", 2009 + "untrusted", 2010 + "windows-sys 0.52.0", 2011 + ] 2012 + 2013 + [[package]] 2014 + name = "rocketman" 2015 + version = "0.2.5" 2016 + source = "registry+https://github.com/rust-lang/crates.io-index" 2017 + checksum = "90cfc4ee9daf6e9d0ee217b9709aa3bd6c921e6926aa15c6ff5ba9162c2c649a" 2018 + dependencies = [ 2019 + "anyhow", 2020 + "async-trait", 2021 + "bon", 2022 + "derive_builder", 2023 + "flume", 2024 + "futures-util", 2025 + "metrics", 2026 + "rand", 2027 + "serde", 2028 + "serde_json", 2029 + "tokio", 2030 + "tokio-tungstenite", 2031 + "tracing", 2032 + "tracing-subscriber", 2033 + "url", 2034 + "zstd", 2035 + ] 2036 + 2037 + [[package]] 2038 + name = "rustc-demangle" 2039 + version = "0.1.24" 2040 + source = "registry+https://github.com/rust-lang/crates.io-index" 2041 + checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 2042 + 2043 + [[package]] 2044 + name = "rustc_version" 2045 + version = "0.4.1" 2046 + source = "registry+https://github.com/rust-lang/crates.io-index" 2047 + checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 2048 + dependencies = [ 2049 + "semver", 2050 + ] 2051 + 2052 + [[package]] 2053 + name = "rustix" 2054 + version = "1.0.7" 2055 + source = "registry+https://github.com/rust-lang/crates.io-index" 2056 + checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" 2057 + dependencies = [ 2058 + "bitflags", 2059 + "errno", 2060 + "libc", 2061 + "linux-raw-sys", 2062 + "windows-sys 0.59.0", 2063 + ] 2064 + 2065 + [[package]] 2066 + name = "rustls" 2067 + version = "0.21.12" 2068 + source = "registry+https://github.com/rust-lang/crates.io-index" 2069 + checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" 2070 + dependencies = [ 2071 + "log", 2072 + "ring", 2073 + "rustls-webpki", 2074 + "sct", 2075 + ] 2076 + 2077 + [[package]] 2078 + name = "rustls-native-certs" 2079 + version = "0.6.3" 2080 + source = "registry+https://github.com/rust-lang/crates.io-index" 2081 + checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" 2082 + dependencies = [ 2083 + "openssl-probe", 2084 + "rustls-pemfile 1.0.4", 2085 + "schannel", 2086 + "security-framework", 2087 + ] 2088 + 2089 + [[package]] 2090 + name = "rustls-pemfile" 2091 + version = "1.0.4" 2092 + source = "registry+https://github.com/rust-lang/crates.io-index" 2093 + checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 2094 + dependencies = [ 2095 + "base64 0.21.7", 2096 + ] 2097 + 2098 + [[package]] 2099 + name = "rustls-pemfile" 2100 + version = "2.2.0" 2101 + source = "registry+https://github.com/rust-lang/crates.io-index" 2102 + checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 2103 + dependencies = [ 2104 + "rustls-pki-types", 2105 + ] 2106 + 2107 + [[package]] 2108 + name = "rustls-pki-types" 2109 + version = "1.12.0" 2110 + source = "registry+https://github.com/rust-lang/crates.io-index" 2111 + checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 2112 + dependencies = [ 2113 + "zeroize", 2114 + ] 2115 + 2116 + [[package]] 2117 + name = "rustls-webpki" 2118 + version = "0.101.7" 2119 + source = "registry+https://github.com/rust-lang/crates.io-index" 2120 + checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 2121 + dependencies = [ 2122 + "ring", 2123 + "untrusted", 2124 + ] 2125 + 2126 + [[package]] 2127 + name = "rustversion" 2128 + version = "1.0.20" 2129 + source = "registry+https://github.com/rust-lang/crates.io-index" 2130 + checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 2131 + 2132 + [[package]] 2133 + name = "ryu" 2134 + version = "1.0.20" 2135 + source = "registry+https://github.com/rust-lang/crates.io-index" 2136 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 2137 + 2138 + [[package]] 2139 + name = "schannel" 2140 + version = "0.1.27" 2141 + source = "registry+https://github.com/rust-lang/crates.io-index" 2142 + checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 2143 + dependencies = [ 2144 + "windows-sys 0.59.0", 2145 + ] 2146 + 2147 + [[package]] 2148 + name = "scoped-tls" 2149 + version = "1.0.1" 2150 + source = "registry+https://github.com/rust-lang/crates.io-index" 2151 + checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2152 + 2153 + [[package]] 2154 + name = "scopeguard" 2155 + version = "1.2.0" 2156 + source = "registry+https://github.com/rust-lang/crates.io-index" 2157 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2158 + 2159 + [[package]] 2160 + name = "sct" 2161 + version = "0.7.1" 2162 + source = "registry+https://github.com/rust-lang/crates.io-index" 2163 + checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 2164 + dependencies = [ 2165 + "ring", 2166 + "untrusted", 2167 + ] 2168 + 2169 + [[package]] 2170 + name = "sec1" 2171 + version = "0.7.3" 2172 + source = "registry+https://github.com/rust-lang/crates.io-index" 2173 + checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 2174 + dependencies = [ 2175 + "base16ct", 2176 + "der", 2177 + "generic-array", 2178 + "subtle", 2179 + "zeroize", 2180 + ] 2181 + 2182 + [[package]] 2183 + name = "security-framework" 2184 + version = "2.11.1" 2185 + source = "registry+https://github.com/rust-lang/crates.io-index" 2186 + checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 2187 + dependencies = [ 2188 + "bitflags", 2189 + "core-foundation", 2190 + "core-foundation-sys", 2191 + "libc", 2192 + "security-framework-sys", 2193 + ] 2194 + 2195 + [[package]] 2196 + name = "security-framework-sys" 2197 + version = "2.14.0" 2198 + source = "registry+https://github.com/rust-lang/crates.io-index" 2199 + checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 2200 + dependencies = [ 2201 + "core-foundation-sys", 2202 + "libc", 2203 + ] 2204 + 2205 + [[package]] 2206 + name = "semver" 2207 + version = "1.0.26" 2208 + source = "registry+https://github.com/rust-lang/crates.io-index" 2209 + checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 2210 + 2211 + [[package]] 2212 + name = "serde" 2213 + version = "1.0.219" 2214 + source = "registry+https://github.com/rust-lang/crates.io-index" 2215 + checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 2216 + dependencies = [ 2217 + "serde_derive", 2218 + ] 2219 + 2220 + [[package]] 2221 + name = "serde_bytes" 2222 + version = "0.11.17" 2223 + source = "registry+https://github.com/rust-lang/crates.io-index" 2224 + checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" 2225 + dependencies = [ 2226 + "serde", 2227 + ] 2228 + 2229 + [[package]] 2230 + name = "serde_derive" 2231 + version = "1.0.219" 2232 + source = "registry+https://github.com/rust-lang/crates.io-index" 2233 + checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 2234 + dependencies = [ 2235 + "proc-macro2", 2236 + "quote", 2237 + "syn", 2238 + ] 2239 + 2240 + [[package]] 2241 + name = "serde_html_form" 2242 + version = "0.2.7" 2243 + source = "registry+https://github.com/rust-lang/crates.io-index" 2244 + checksum = "9d2de91cf02bbc07cde38891769ccd5d4f073d22a40683aa4bc7a95781aaa2c4" 2245 + dependencies = [ 2246 + "form_urlencoded", 2247 + "indexmap", 2248 + "itoa", 2249 + "ryu", 2250 + "serde", 2251 + ] 2252 + 2253 + [[package]] 2254 + name = "serde_json" 2255 + version = "1.0.140" 2256 + source = "registry+https://github.com/rust-lang/crates.io-index" 2257 + checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 2258 + dependencies = [ 2259 + "itoa", 2260 + "memchr", 2261 + "ryu", 2262 + "serde", 2263 + ] 2264 + 2265 + [[package]] 2266 + name = "serde_urlencoded" 2267 + version = "0.7.1" 2268 + source = "registry+https://github.com/rust-lang/crates.io-index" 2269 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2270 + dependencies = [ 2271 + "form_urlencoded", 2272 + "itoa", 2273 + "ryu", 2274 + "serde", 2275 + ] 2276 + 2277 + [[package]] 2278 + name = "sha1" 2279 + version = "0.10.6" 2280 + source = "registry+https://github.com/rust-lang/crates.io-index" 2281 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 2282 + dependencies = [ 2283 + "cfg-if", 2284 + "cpufeatures", 2285 + "digest", 2286 + ] 2287 + 2288 + [[package]] 2289 + name = "sha2" 2290 + version = "0.10.9" 2291 + source = "registry+https://github.com/rust-lang/crates.io-index" 2292 + checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 2293 + dependencies = [ 2294 + "cfg-if", 2295 + "cpufeatures", 2296 + "digest", 2297 + ] 2298 + 2299 + [[package]] 2300 + name = "sharded-slab" 2301 + version = "0.1.7" 2302 + source = "registry+https://github.com/rust-lang/crates.io-index" 2303 + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 2304 + dependencies = [ 2305 + "lazy_static", 2306 + ] 2307 + 2308 + [[package]] 2309 + name = "shlex" 2310 + version = "1.3.0" 2311 + source = "registry+https://github.com/rust-lang/crates.io-index" 2312 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2313 + 2314 + [[package]] 2315 + name = "signal-hook-registry" 2316 + version = "1.4.5" 2317 + source = "registry+https://github.com/rust-lang/crates.io-index" 2318 + checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 2319 + dependencies = [ 2320 + "libc", 2321 + ] 2322 + 2323 + [[package]] 2324 + name = "signature" 2325 + version = "2.2.0" 2326 + source = "registry+https://github.com/rust-lang/crates.io-index" 2327 + checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 2328 + dependencies = [ 2329 + "digest", 2330 + "rand_core", 2331 + ] 2332 + 2333 + [[package]] 2334 + name = "slab" 2335 + version = "0.4.9" 2336 + source = "registry+https://github.com/rust-lang/crates.io-index" 2337 + checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2338 + dependencies = [ 2339 + "autocfg", 2340 + ] 2341 + 2342 + [[package]] 2343 + name = "smallvec" 2344 + version = "1.15.0" 2345 + source = "registry+https://github.com/rust-lang/crates.io-index" 2346 + checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 2347 + 2348 + [[package]] 2349 + name = "socket2" 2350 + version = "0.5.9" 2351 + source = "registry+https://github.com/rust-lang/crates.io-index" 2352 + checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 2353 + dependencies = [ 2354 + "libc", 2355 + "windows-sys 0.52.0", 2356 + ] 2357 + 2358 + [[package]] 2359 + name = "spin" 2360 + version = "0.9.8" 2361 + source = "registry+https://github.com/rust-lang/crates.io-index" 2362 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 2363 + dependencies = [ 2364 + "lock_api", 2365 + ] 2366 + 2367 + [[package]] 2368 + name = "stable_deref_trait" 2369 + version = "1.2.0" 2370 + source = "registry+https://github.com/rust-lang/crates.io-index" 2371 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2372 + 2373 + [[package]] 2374 + name = "strsim" 2375 + version = "0.11.1" 2376 + source = "registry+https://github.com/rust-lang/crates.io-index" 2377 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2378 + 2379 + [[package]] 2380 + name = "subtle" 2381 + version = "2.6.1" 2382 + source = "registry+https://github.com/rust-lang/crates.io-index" 2383 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2384 + 2385 + [[package]] 2386 + name = "syn" 2387 + version = "2.0.101" 2388 + source = "registry+https://github.com/rust-lang/crates.io-index" 2389 + checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 2390 + dependencies = [ 2391 + "proc-macro2", 2392 + "quote", 2393 + "unicode-ident", 2394 + ] 2395 + 2396 + [[package]] 2397 + name = "sync_wrapper" 2398 + version = "1.0.2" 2399 + source = "registry+https://github.com/rust-lang/crates.io-index" 2400 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 2401 + dependencies = [ 2402 + "futures-core", 2403 + ] 2404 + 2405 + [[package]] 2406 + name = "synstructure" 2407 + version = "0.13.2" 2408 + source = "registry+https://github.com/rust-lang/crates.io-index" 2409 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 2410 + dependencies = [ 2411 + "proc-macro2", 2412 + "quote", 2413 + "syn", 2414 + ] 2415 + 2416 + [[package]] 2417 + name = "tagptr" 2418 + version = "0.2.0" 2419 + source = "registry+https://github.com/rust-lang/crates.io-index" 2420 + checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" 2421 + 2422 + [[package]] 2423 + name = "tempfile" 2424 + version = "3.20.0" 2425 + source = "registry+https://github.com/rust-lang/crates.io-index" 2426 + checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 2427 + dependencies = [ 2428 + "fastrand", 2429 + "getrandom 0.3.3", 2430 + "once_cell", 2431 + "rustix", 2432 + "windows-sys 0.59.0", 2433 + ] 2434 + 2435 + [[package]] 2436 + name = "thiserror" 2437 + version = "1.0.69" 2438 + source = "registry+https://github.com/rust-lang/crates.io-index" 2439 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2440 + dependencies = [ 2441 + "thiserror-impl 1.0.69", 2442 + ] 2443 + 2444 + [[package]] 2445 + name = "thiserror" 2446 + version = "2.0.12" 2447 + source = "registry+https://github.com/rust-lang/crates.io-index" 2448 + checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 2449 + dependencies = [ 2450 + "thiserror-impl 2.0.12", 2451 + ] 2452 + 2453 + [[package]] 2454 + name = "thiserror-impl" 2455 + version = "1.0.69" 2456 + source = "registry+https://github.com/rust-lang/crates.io-index" 2457 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2458 + dependencies = [ 2459 + "proc-macro2", 2460 + "quote", 2461 + "syn", 2462 + ] 2463 + 2464 + [[package]] 2465 + name = "thiserror-impl" 2466 + version = "2.0.12" 2467 + source = "registry+https://github.com/rust-lang/crates.io-index" 2468 + checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 2469 + dependencies = [ 2470 + "proc-macro2", 2471 + "quote", 2472 + "syn", 2473 + ] 2474 + 2475 + [[package]] 2476 + name = "thread_local" 2477 + version = "1.1.8" 2478 + source = "registry+https://github.com/rust-lang/crates.io-index" 2479 + checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2480 + dependencies = [ 2481 + "cfg-if", 2482 + "once_cell", 2483 + ] 2484 + 2485 + [[package]] 2486 + name = "tinystr" 2487 + version = "0.8.1" 2488 + source = "registry+https://github.com/rust-lang/crates.io-index" 2489 + checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 2490 + dependencies = [ 2491 + "displaydoc", 2492 + "zerovec", 2493 + ] 2494 + 2495 + [[package]] 2496 + name = "tokio" 2497 + version = "1.45.0" 2498 + source = "registry+https://github.com/rust-lang/crates.io-index" 2499 + checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" 2500 + dependencies = [ 2501 + "backtrace", 2502 + "bytes", 2503 + "libc", 2504 + "mio", 2505 + "parking_lot", 2506 + "pin-project-lite", 2507 + "signal-hook-registry", 2508 + "socket2", 2509 + "tokio-macros", 2510 + "windows-sys 0.52.0", 2511 + ] 2512 + 2513 + [[package]] 2514 + name = "tokio-macros" 2515 + version = "2.5.0" 2516 + source = "registry+https://github.com/rust-lang/crates.io-index" 2517 + checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2518 + dependencies = [ 2519 + "proc-macro2", 2520 + "quote", 2521 + "syn", 2522 + ] 2523 + 2524 + [[package]] 2525 + name = "tokio-native-tls" 2526 + version = "0.3.1" 2527 + source = "registry+https://github.com/rust-lang/crates.io-index" 2528 + checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 2529 + dependencies = [ 2530 + "native-tls", 2531 + "tokio", 2532 + ] 2533 + 2534 + [[package]] 2535 + name = "tokio-rustls" 2536 + version = "0.24.1" 2537 + source = "registry+https://github.com/rust-lang/crates.io-index" 2538 + checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 2539 + dependencies = [ 2540 + "rustls", 2541 + "tokio", 2542 + ] 2543 + 2544 + [[package]] 2545 + name = "tokio-tungstenite" 2546 + version = "0.20.1" 2547 + source = "registry+https://github.com/rust-lang/crates.io-index" 2548 + checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" 2549 + dependencies = [ 2550 + "futures-util", 2551 + "log", 2552 + "rustls", 2553 + "rustls-native-certs", 2554 + "tokio", 2555 + "tokio-rustls", 2556 + "tungstenite", 2557 + "webpki-roots", 2558 + ] 2559 + 2560 + [[package]] 2561 + name = "tokio-util" 2562 + version = "0.7.15" 2563 + source = "registry+https://github.com/rust-lang/crates.io-index" 2564 + checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 2565 + dependencies = [ 2566 + "bytes", 2567 + "futures-core", 2568 + "futures-sink", 2569 + "pin-project-lite", 2570 + "tokio", 2571 + ] 2572 + 2573 + [[package]] 2574 + name = "tower" 2575 + version = "0.5.2" 2576 + source = "registry+https://github.com/rust-lang/crates.io-index" 2577 + checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 2578 + dependencies = [ 2579 + "futures-core", 2580 + "futures-util", 2581 + "pin-project-lite", 2582 + "sync_wrapper", 2583 + "tokio", 2584 + "tower-layer", 2585 + "tower-service", 2586 + ] 2587 + 2588 + [[package]] 2589 + name = "tower-layer" 2590 + version = "0.3.3" 2591 + source = "registry+https://github.com/rust-lang/crates.io-index" 2592 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2593 + 2594 + [[package]] 2595 + name = "tower-service" 2596 + version = "0.3.3" 2597 + source = "registry+https://github.com/rust-lang/crates.io-index" 2598 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2599 + 2600 + [[package]] 2601 + name = "tracing" 2602 + version = "0.1.41" 2603 + source = "registry+https://github.com/rust-lang/crates.io-index" 2604 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2605 + dependencies = [ 2606 + "pin-project-lite", 2607 + "tracing-attributes", 2608 + "tracing-core", 2609 + ] 2610 + 2611 + [[package]] 2612 + name = "tracing-attributes" 2613 + version = "0.1.28" 2614 + source = "registry+https://github.com/rust-lang/crates.io-index" 2615 + checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 2616 + dependencies = [ 2617 + "proc-macro2", 2618 + "quote", 2619 + "syn", 2620 + ] 2621 + 2622 + [[package]] 2623 + name = "tracing-core" 2624 + version = "0.1.33" 2625 + source = "registry+https://github.com/rust-lang/crates.io-index" 2626 + checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2627 + dependencies = [ 2628 + "once_cell", 2629 + "valuable", 2630 + ] 2631 + 2632 + [[package]] 2633 + name = "tracing-log" 2634 + version = "0.2.0" 2635 + source = "registry+https://github.com/rust-lang/crates.io-index" 2636 + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2637 + dependencies = [ 2638 + "log", 2639 + "once_cell", 2640 + "tracing-core", 2641 + ] 2642 + 2643 + [[package]] 2644 + name = "tracing-subscriber" 2645 + version = "0.3.19" 2646 + source = "registry+https://github.com/rust-lang/crates.io-index" 2647 + checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 2648 + dependencies = [ 2649 + "matchers", 2650 + "nu-ansi-term", 2651 + "once_cell", 2652 + "regex", 2653 + "sharded-slab", 2654 + "smallvec", 2655 + "thread_local", 2656 + "tracing", 2657 + "tracing-core", 2658 + "tracing-log", 2659 + ] 2660 + 2661 + [[package]] 2662 + name = "trait-variant" 2663 + version = "0.1.2" 2664 + source = "registry+https://github.com/rust-lang/crates.io-index" 2665 + checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" 2666 + dependencies = [ 2667 + "proc-macro2", 2668 + "quote", 2669 + "syn", 2670 + ] 2671 + 2672 + [[package]] 2673 + name = "try-lock" 2674 + version = "0.2.5" 2675 + source = "registry+https://github.com/rust-lang/crates.io-index" 2676 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2677 + 2678 + [[package]] 2679 + name = "tungstenite" 2680 + version = "0.20.1" 2681 + source = "registry+https://github.com/rust-lang/crates.io-index" 2682 + checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" 2683 + dependencies = [ 2684 + "byteorder", 2685 + "bytes", 2686 + "data-encoding", 2687 + "http 0.2.12", 2688 + "httparse", 2689 + "log", 2690 + "rand", 2691 + "rustls", 2692 + "sha1", 2693 + "thiserror 1.0.69", 2694 + "url", 2695 + "utf-8", 2696 + ] 2697 + 2698 + [[package]] 2699 + name = "typenum" 2700 + version = "1.18.0" 2701 + source = "registry+https://github.com/rust-lang/crates.io-index" 2702 + checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 2703 + 2704 + [[package]] 2705 + name = "unicode-ident" 2706 + version = "1.0.18" 2707 + source = "registry+https://github.com/rust-lang/crates.io-index" 2708 + checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 2709 + 2710 + [[package]] 2711 + name = "unsigned-varint" 2712 + version = "0.8.0" 2713 + source = "registry+https://github.com/rust-lang/crates.io-index" 2714 + checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" 2715 + 2716 + [[package]] 2717 + name = "untrusted" 2718 + version = "0.9.0" 2719 + source = "registry+https://github.com/rust-lang/crates.io-index" 2720 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2721 + 2722 + [[package]] 2723 + name = "url" 2724 + version = "2.5.4" 2725 + source = "registry+https://github.com/rust-lang/crates.io-index" 2726 + checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2727 + dependencies = [ 2728 + "form_urlencoded", 2729 + "idna", 2730 + "percent-encoding", 2731 + ] 2732 + 2733 + [[package]] 2734 + name = "utf-8" 2735 + version = "0.7.6" 2736 + source = "registry+https://github.com/rust-lang/crates.io-index" 2737 + checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2738 + 2739 + [[package]] 2740 + name = "utf8_iter" 2741 + version = "1.0.4" 2742 + source = "registry+https://github.com/rust-lang/crates.io-index" 2743 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2744 + 2745 + [[package]] 2746 + name = "utf8parse" 2747 + version = "0.2.2" 2748 + source = "registry+https://github.com/rust-lang/crates.io-index" 2749 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2750 + 2751 + [[package]] 2752 + name = "uuid" 2753 + version = "1.16.0" 2754 + source = "registry+https://github.com/rust-lang/crates.io-index" 2755 + checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" 2756 + dependencies = [ 2757 + "getrandom 0.3.3", 2758 + ] 2759 + 2760 + [[package]] 2761 + name = "valuable" 2762 + version = "0.1.1" 2763 + source = "registry+https://github.com/rust-lang/crates.io-index" 2764 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 2765 + 2766 + [[package]] 2767 + name = "vcpkg" 2768 + version = "0.2.15" 2769 + source = "registry+https://github.com/rust-lang/crates.io-index" 2770 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2771 + 2772 + [[package]] 2773 + name = "version_check" 2774 + version = "0.9.5" 2775 + source = "registry+https://github.com/rust-lang/crates.io-index" 2776 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2777 + 2778 + [[package]] 2779 + name = "want" 2780 + version = "0.3.1" 2781 + source = "registry+https://github.com/rust-lang/crates.io-index" 2782 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2783 + dependencies = [ 2784 + "try-lock", 2785 + ] 2786 + 2787 + [[package]] 2788 + name = "wasi" 2789 + version = "0.11.0+wasi-snapshot-preview1" 2790 + source = "registry+https://github.com/rust-lang/crates.io-index" 2791 + checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2792 + 2793 + [[package]] 2794 + name = "wasi" 2795 + version = "0.14.2+wasi-0.2.4" 2796 + source = "registry+https://github.com/rust-lang/crates.io-index" 2797 + checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 2798 + dependencies = [ 2799 + "wit-bindgen-rt", 2800 + ] 2801 + 2802 + [[package]] 2803 + name = "wasm-bindgen" 2804 + version = "0.2.100" 2805 + source = "registry+https://github.com/rust-lang/crates.io-index" 2806 + checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2807 + dependencies = [ 2808 + "cfg-if", 2809 + "once_cell", 2810 + "rustversion", 2811 + "serde_json", 2812 + "wasm-bindgen-macro", 2813 + ] 2814 + 2815 + [[package]] 2816 + name = "wasm-bindgen-backend" 2817 + version = "0.2.100" 2818 + source = "registry+https://github.com/rust-lang/crates.io-index" 2819 + checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2820 + dependencies = [ 2821 + "bumpalo", 2822 + "log", 2823 + "proc-macro2", 2824 + "quote", 2825 + "syn", 2826 + "wasm-bindgen-shared", 2827 + ] 2828 + 2829 + [[package]] 2830 + name = "wasm-bindgen-futures" 2831 + version = "0.4.50" 2832 + source = "registry+https://github.com/rust-lang/crates.io-index" 2833 + checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 2834 + dependencies = [ 2835 + "cfg-if", 2836 + "js-sys", 2837 + "once_cell", 2838 + "wasm-bindgen", 2839 + "web-sys", 2840 + ] 2841 + 2842 + [[package]] 2843 + name = "wasm-bindgen-macro" 2844 + version = "0.2.100" 2845 + source = "registry+https://github.com/rust-lang/crates.io-index" 2846 + checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2847 + dependencies = [ 2848 + "quote", 2849 + "wasm-bindgen-macro-support", 2850 + ] 2851 + 2852 + [[package]] 2853 + name = "wasm-bindgen-macro-support" 2854 + version = "0.2.100" 2855 + source = "registry+https://github.com/rust-lang/crates.io-index" 2856 + checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2857 + dependencies = [ 2858 + "proc-macro2", 2859 + "quote", 2860 + "syn", 2861 + "wasm-bindgen-backend", 2862 + "wasm-bindgen-shared", 2863 + ] 2864 + 2865 + [[package]] 2866 + name = "wasm-bindgen-shared" 2867 + version = "0.2.100" 2868 + source = "registry+https://github.com/rust-lang/crates.io-index" 2869 + checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2870 + dependencies = [ 2871 + "unicode-ident", 2872 + ] 2873 + 2874 + [[package]] 2875 + name = "web-sys" 2876 + version = "0.3.77" 2877 + source = "registry+https://github.com/rust-lang/crates.io-index" 2878 + checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2879 + dependencies = [ 2880 + "js-sys", 2881 + "wasm-bindgen", 2882 + ] 2883 + 2884 + [[package]] 2885 + name = "web-time" 2886 + version = "1.1.0" 2887 + source = "registry+https://github.com/rust-lang/crates.io-index" 2888 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 2889 + dependencies = [ 2890 + "js-sys", 2891 + "wasm-bindgen", 2892 + ] 2893 + 2894 + [[package]] 2895 + name = "webpki-roots" 2896 + version = "0.25.4" 2897 + source = "registry+https://github.com/rust-lang/crates.io-index" 2898 + checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" 2899 + 2900 + [[package]] 2901 + name = "winapi" 2902 + version = "0.3.9" 2903 + source = "registry+https://github.com/rust-lang/crates.io-index" 2904 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2905 + dependencies = [ 2906 + "winapi-i686-pc-windows-gnu", 2907 + "winapi-x86_64-pc-windows-gnu", 2908 + ] 2909 + 2910 + [[package]] 2911 + name = "winapi-i686-pc-windows-gnu" 2912 + version = "0.4.0" 2913 + source = "registry+https://github.com/rust-lang/crates.io-index" 2914 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2915 + 2916 + [[package]] 2917 + name = "winapi-x86_64-pc-windows-gnu" 2918 + version = "0.4.0" 2919 + source = "registry+https://github.com/rust-lang/crates.io-index" 2920 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2921 + 2922 + [[package]] 2923 + name = "windows" 2924 + version = "0.61.1" 2925 + source = "registry+https://github.com/rust-lang/crates.io-index" 2926 + checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" 2927 + dependencies = [ 2928 + "windows-collections", 2929 + "windows-core", 2930 + "windows-future", 2931 + "windows-link", 2932 + "windows-numerics", 2933 + ] 2934 + 2935 + [[package]] 2936 + name = "windows-collections" 2937 + version = "0.2.0" 2938 + source = "registry+https://github.com/rust-lang/crates.io-index" 2939 + checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 2940 + dependencies = [ 2941 + "windows-core", 2942 + ] 2943 + 2944 + [[package]] 2945 + name = "windows-core" 2946 + version = "0.61.1" 2947 + source = "registry+https://github.com/rust-lang/crates.io-index" 2948 + checksum = "46ec44dc15085cea82cf9c78f85a9114c463a369786585ad2882d1ff0b0acf40" 2949 + dependencies = [ 2950 + "windows-implement", 2951 + "windows-interface", 2952 + "windows-link", 2953 + "windows-result", 2954 + "windows-strings 0.4.1", 2955 + ] 2956 + 2957 + [[package]] 2958 + name = "windows-future" 2959 + version = "0.2.1" 2960 + source = "registry+https://github.com/rust-lang/crates.io-index" 2961 + checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 2962 + dependencies = [ 2963 + "windows-core", 2964 + "windows-link", 2965 + "windows-threading", 2966 + ] 2967 + 2968 + [[package]] 2969 + name = "windows-implement" 2970 + version = "0.60.0" 2971 + source = "registry+https://github.com/rust-lang/crates.io-index" 2972 + checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 2973 + dependencies = [ 2974 + "proc-macro2", 2975 + "quote", 2976 + "syn", 2977 + ] 2978 + 2979 + [[package]] 2980 + name = "windows-interface" 2981 + version = "0.59.1" 2982 + source = "registry+https://github.com/rust-lang/crates.io-index" 2983 + checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 2984 + dependencies = [ 2985 + "proc-macro2", 2986 + "quote", 2987 + "syn", 2988 + ] 2989 + 2990 + [[package]] 2991 + name = "windows-link" 2992 + version = "0.1.1" 2993 + source = "registry+https://github.com/rust-lang/crates.io-index" 2994 + checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 2995 + 2996 + [[package]] 2997 + name = "windows-numerics" 2998 + version = "0.2.0" 2999 + source = "registry+https://github.com/rust-lang/crates.io-index" 3000 + checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 3001 + dependencies = [ 3002 + "windows-core", 3003 + "windows-link", 3004 + ] 3005 + 3006 + [[package]] 3007 + name = "windows-registry" 3008 + version = "0.4.0" 3009 + source = "registry+https://github.com/rust-lang/crates.io-index" 3010 + checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" 3011 + dependencies = [ 3012 + "windows-result", 3013 + "windows-strings 0.3.1", 3014 + "windows-targets 0.53.0", 3015 + ] 3016 + 3017 + [[package]] 3018 + name = "windows-result" 3019 + version = "0.3.3" 3020 + source = "registry+https://github.com/rust-lang/crates.io-index" 3021 + checksum = "4b895b5356fc36103d0f64dd1e94dfa7ac5633f1c9dd6e80fe9ec4adef69e09d" 3022 + dependencies = [ 3023 + "windows-link", 3024 + ] 3025 + 3026 + [[package]] 3027 + name = "windows-strings" 3028 + version = "0.3.1" 3029 + source = "registry+https://github.com/rust-lang/crates.io-index" 3030 + checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" 3031 + dependencies = [ 3032 + "windows-link", 3033 + ] 3034 + 3035 + [[package]] 3036 + name = "windows-strings" 3037 + version = "0.4.1" 3038 + source = "registry+https://github.com/rust-lang/crates.io-index" 3039 + checksum = "2a7ab927b2637c19b3dbe0965e75d8f2d30bdd697a1516191cad2ec4df8fb28a" 3040 + dependencies = [ 3041 + "windows-link", 3042 + ] 3043 + 3044 + [[package]] 3045 + name = "windows-sys" 3046 + version = "0.52.0" 3047 + source = "registry+https://github.com/rust-lang/crates.io-index" 3048 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3049 + dependencies = [ 3050 + "windows-targets 0.52.6", 3051 + ] 3052 + 3053 + [[package]] 3054 + name = "windows-sys" 3055 + version = "0.59.0" 3056 + source = "registry+https://github.com/rust-lang/crates.io-index" 3057 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 3058 + dependencies = [ 3059 + "windows-targets 0.52.6", 3060 + ] 3061 + 3062 + [[package]] 3063 + name = "windows-targets" 3064 + version = "0.52.6" 3065 + source = "registry+https://github.com/rust-lang/crates.io-index" 3066 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3067 + dependencies = [ 3068 + "windows_aarch64_gnullvm 0.52.6", 3069 + "windows_aarch64_msvc 0.52.6", 3070 + "windows_i686_gnu 0.52.6", 3071 + "windows_i686_gnullvm 0.52.6", 3072 + "windows_i686_msvc 0.52.6", 3073 + "windows_x86_64_gnu 0.52.6", 3074 + "windows_x86_64_gnullvm 0.52.6", 3075 + "windows_x86_64_msvc 0.52.6", 3076 + ] 3077 + 3078 + [[package]] 3079 + name = "windows-targets" 3080 + version = "0.53.0" 3081 + source = "registry+https://github.com/rust-lang/crates.io-index" 3082 + checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" 3083 + dependencies = [ 3084 + "windows_aarch64_gnullvm 0.53.0", 3085 + "windows_aarch64_msvc 0.53.0", 3086 + "windows_i686_gnu 0.53.0", 3087 + "windows_i686_gnullvm 0.53.0", 3088 + "windows_i686_msvc 0.53.0", 3089 + "windows_x86_64_gnu 0.53.0", 3090 + "windows_x86_64_gnullvm 0.53.0", 3091 + "windows_x86_64_msvc 0.53.0", 3092 + ] 3093 + 3094 + [[package]] 3095 + name = "windows-threading" 3096 + version = "0.1.0" 3097 + source = "registry+https://github.com/rust-lang/crates.io-index" 3098 + checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 3099 + dependencies = [ 3100 + "windows-link", 3101 + ] 3102 + 3103 + [[package]] 3104 + name = "windows_aarch64_gnullvm" 3105 + version = "0.52.6" 3106 + source = "registry+https://github.com/rust-lang/crates.io-index" 3107 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3108 + 3109 + [[package]] 3110 + name = "windows_aarch64_gnullvm" 3111 + version = "0.53.0" 3112 + source = "registry+https://github.com/rust-lang/crates.io-index" 3113 + checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 3114 + 3115 + [[package]] 3116 + name = "windows_aarch64_msvc" 3117 + version = "0.52.6" 3118 + source = "registry+https://github.com/rust-lang/crates.io-index" 3119 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3120 + 3121 + [[package]] 3122 + name = "windows_aarch64_msvc" 3123 + version = "0.53.0" 3124 + source = "registry+https://github.com/rust-lang/crates.io-index" 3125 + checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 3126 + 3127 + [[package]] 3128 + name = "windows_i686_gnu" 3129 + version = "0.52.6" 3130 + source = "registry+https://github.com/rust-lang/crates.io-index" 3131 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3132 + 3133 + [[package]] 3134 + name = "windows_i686_gnu" 3135 + version = "0.53.0" 3136 + source = "registry+https://github.com/rust-lang/crates.io-index" 3137 + checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 3138 + 3139 + [[package]] 3140 + name = "windows_i686_gnullvm" 3141 + version = "0.52.6" 3142 + source = "registry+https://github.com/rust-lang/crates.io-index" 3143 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3144 + 3145 + [[package]] 3146 + name = "windows_i686_gnullvm" 3147 + version = "0.53.0" 3148 + source = "registry+https://github.com/rust-lang/crates.io-index" 3149 + checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 3150 + 3151 + [[package]] 3152 + name = "windows_i686_msvc" 3153 + version = "0.52.6" 3154 + source = "registry+https://github.com/rust-lang/crates.io-index" 3155 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3156 + 3157 + [[package]] 3158 + name = "windows_i686_msvc" 3159 + version = "0.53.0" 3160 + source = "registry+https://github.com/rust-lang/crates.io-index" 3161 + checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 3162 + 3163 + [[package]] 3164 + name = "windows_x86_64_gnu" 3165 + version = "0.52.6" 3166 + source = "registry+https://github.com/rust-lang/crates.io-index" 3167 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3168 + 3169 + [[package]] 3170 + name = "windows_x86_64_gnu" 3171 + version = "0.53.0" 3172 + source = "registry+https://github.com/rust-lang/crates.io-index" 3173 + checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 3174 + 3175 + [[package]] 3176 + name = "windows_x86_64_gnullvm" 3177 + version = "0.52.6" 3178 + source = "registry+https://github.com/rust-lang/crates.io-index" 3179 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3180 + 3181 + [[package]] 3182 + name = "windows_x86_64_gnullvm" 3183 + version = "0.53.0" 3184 + source = "registry+https://github.com/rust-lang/crates.io-index" 3185 + checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 3186 + 3187 + [[package]] 3188 + name = "windows_x86_64_msvc" 3189 + version = "0.52.6" 3190 + source = "registry+https://github.com/rust-lang/crates.io-index" 3191 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3192 + 3193 + [[package]] 3194 + name = "windows_x86_64_msvc" 3195 + version = "0.53.0" 3196 + source = "registry+https://github.com/rust-lang/crates.io-index" 3197 + checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 3198 + 3199 + [[package]] 3200 + name = "wit-bindgen-rt" 3201 + version = "0.39.0" 3202 + source = "registry+https://github.com/rust-lang/crates.io-index" 3203 + checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 3204 + dependencies = [ 3205 + "bitflags", 3206 + ] 3207 + 3208 + [[package]] 3209 + name = "writeable" 3210 + version = "0.6.1" 3211 + source = "registry+https://github.com/rust-lang/crates.io-index" 3212 + checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 3213 + 3214 + [[package]] 3215 + name = "yoke" 3216 + version = "0.8.0" 3217 + source = "registry+https://github.com/rust-lang/crates.io-index" 3218 + checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 3219 + dependencies = [ 3220 + "serde", 3221 + "stable_deref_trait", 3222 + "yoke-derive", 3223 + "zerofrom", 3224 + ] 3225 + 3226 + [[package]] 3227 + name = "yoke-derive" 3228 + version = "0.8.0" 3229 + source = "registry+https://github.com/rust-lang/crates.io-index" 3230 + checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 3231 + dependencies = [ 3232 + "proc-macro2", 3233 + "quote", 3234 + "syn", 3235 + "synstructure", 3236 + ] 3237 + 3238 + [[package]] 3239 + name = "zerocopy" 3240 + version = "0.8.25" 3241 + source = "registry+https://github.com/rust-lang/crates.io-index" 3242 + checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" 3243 + dependencies = [ 3244 + "zerocopy-derive", 3245 + ] 3246 + 3247 + [[package]] 3248 + name = "zerocopy-derive" 3249 + version = "0.8.25" 3250 + source = "registry+https://github.com/rust-lang/crates.io-index" 3251 + checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" 3252 + dependencies = [ 3253 + "proc-macro2", 3254 + "quote", 3255 + "syn", 3256 + ] 3257 + 3258 + [[package]] 3259 + name = "zerofrom" 3260 + version = "0.1.6" 3261 + source = "registry+https://github.com/rust-lang/crates.io-index" 3262 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 3263 + dependencies = [ 3264 + "zerofrom-derive", 3265 + ] 3266 + 3267 + [[package]] 3268 + name = "zerofrom-derive" 3269 + version = "0.1.6" 3270 + source = "registry+https://github.com/rust-lang/crates.io-index" 3271 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 3272 + dependencies = [ 3273 + "proc-macro2", 3274 + "quote", 3275 + "syn", 3276 + "synstructure", 3277 + ] 3278 + 3279 + [[package]] 3280 + name = "zeroize" 3281 + version = "1.8.1" 3282 + source = "registry+https://github.com/rust-lang/crates.io-index" 3283 + checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 3284 + dependencies = [ 3285 + "serde", 3286 + ] 3287 + 3288 + [[package]] 3289 + name = "zerotrie" 3290 + version = "0.2.2" 3291 + source = "registry+https://github.com/rust-lang/crates.io-index" 3292 + checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 3293 + dependencies = [ 3294 + "displaydoc", 3295 + "yoke", 3296 + "zerofrom", 3297 + ] 3298 + 3299 + [[package]] 3300 + name = "zerovec" 3301 + version = "0.11.2" 3302 + source = "registry+https://github.com/rust-lang/crates.io-index" 3303 + checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 3304 + dependencies = [ 3305 + "yoke", 3306 + "zerofrom", 3307 + "zerovec-derive", 3308 + ] 3309 + 3310 + [[package]] 3311 + name = "zerovec-derive" 3312 + version = "0.11.1" 3313 + source = "registry+https://github.com/rust-lang/crates.io-index" 3314 + checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 3315 + dependencies = [ 3316 + "proc-macro2", 3317 + "quote", 3318 + "syn", 3319 + ] 3320 + 3321 + [[package]] 3322 + name = "zstd" 3323 + version = "0.13.3" 3324 + source = "registry+https://github.com/rust-lang/crates.io-index" 3325 + checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" 3326 + dependencies = [ 3327 + "zstd-safe", 3328 + ] 3329 + 3330 + [[package]] 3331 + name = "zstd-safe" 3332 + version = "7.2.4" 3333 + source = "registry+https://github.com/rust-lang/crates.io-index" 3334 + checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" 3335 + dependencies = [ 3336 + "zstd-sys", 3337 + ] 3338 + 3339 + [[package]] 3340 + name = "zstd-sys" 3341 + version = "2.0.15+zstd.1.5.7" 3342 + source = "registry+https://github.com/rust-lang/crates.io-index" 3343 + checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" 3344 + dependencies = [ 3345 + "cc", 3346 + "pkg-config", 3347 + ]
+22
Cargo.toml
··· 1 + [workspace] 2 + members = ['atproto_api', "bot", "logic"] 3 + resolver = "2" 4 + 5 + [workspace.dependencies] 6 + atproto_api = { path = "atproto_api" } 7 + atrium-api = "0.25.5" 8 + atrium-common = "0.1.2" 9 + atrium-identity = "0.1.6" 10 + atrium-oauth = "0.1.4" 11 + atrium-xrpc = "0.12.3" 12 + atrium-xrpc-client = "0.5.14" 13 + clap = { version = "4.0", features = ["derive"] } 14 + log = "0.4.27" 15 + logic = { path = "logic" } 16 + serde = { version = "1.0.219", features = ["derive"] } 17 + rocketman = "0.2.5" 18 + tokio = { version = "1.45.0", features = ["full"] } 19 + wasm-bindgen = { version = "0.2.100", features = ["default", "serde_json"] } 20 + web-sys = "0.3.77" 21 + gloo = "0.11.0" 22 + gloo-utils = "0.2.0"
+48
README.md
··· 1 + # Rust atproto template 2 + 3 + A simple template 4 + for getting started 5 + with writing code using [atrium](https://github.com/atrium-rs/atrium) to interact with atproto repos. 6 + This is the minimal setup, 7 + but we're using the Statusphere lexicon to create some examples that can be used as studs to create your own 8 + application. 9 + 10 + # [atproto_api](./atproto_api) 11 + 12 + Holds your rust types created from [lexicon json schema files](./atproto_api/lexicons) 13 + using [esquema-cli](https://github.com/fatfingers23/esquema) 14 + 15 + ### How to change and setup lexicons 16 + 17 + 1. Setup and put your lexicon schema files in [./atproto_api/lexicons](/atproto_api/lexicons) 18 + 2. Install with `cargo install esquema-cli --locked --git https://github.com/fatfingers23/esquema.git` 19 + 3. Run with from root repo `esquema-cli generate local -l atproto_api/lexicons/ -o atproto_api/src/` 20 + 4. You now have Rust types for your lexicon schema in [/atproto_api/src](./atproto_api/src) 21 + 22 + # [logic](./logic) 23 + 24 + This crate holds all your logic for interacting with the atmosphere (jetstream, repos, etc). Can import it into a 25 + backend, WASM, or in our case a CLI. 26 + 27 + # [cli](./cli) 28 + 29 + This is a binary showcasing how it can run on the backend 30 + `cargo run --bin cli -- --help` for a list of commands. You can also copy [.env.template](./.env.template) and change it 31 + to `.env` to save your handle and app password there. 32 + 33 + #[wasm](./wasm) 34 + This is a simple WASM project showcasing the same logic crate as used in the cli binary. 35 + 36 + To run make sure you have [Trunk](https://trunkrs.dev/guide/) setup and then run `trunk serve` in the directory 37 + 38 + ## CLI and WASM Features to showcase examples 39 + 40 + All of these features are implemented in the Logic crate and share a lot of code. 41 + JetStream is a bit of an exception and has 2 different implementations. 42 + [Rocketman](https://crates.io/crates/rocketman) for the cli and just a quick and dirty web_sys websocket connection for 43 + the WASM one 44 + 45 + - Create a new Statusphere status 46 + - Get your current Statusphere status 47 + - Look up someone's status via handle to show did resolver 48 + - Start a JetStream listener to listen for updates (Includes atrium did resolver via http)
+1
atproto_api/.gitignore
··· 1 + /target
+8
atproto_api/Cargo.toml
··· 1 + [package] 2 + name = "atproto_api" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + atrium-api.workspace = true 8 + serde.workspace = true
+29
atproto_api/lexicons/star.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.tangled.feed.star", 4 + "needsCbor": true, 5 + "needsType": true, 6 + "defs": { 7 + "main": { 8 + "type": "record", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": [ 13 + "subject", 14 + "createdAt" 15 + ], 16 + "properties": { 17 + "subject": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "createdAt": { 22 + "type": "string", 23 + "format": "datetime" 24 + } 25 + } 26 + } 27 + } 28 + } 29 + }
+29
atproto_api/lexicons/status.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "xyz.statusphere.status", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "record": { 9 + "type": "object", 10 + "required": [ 11 + "status", 12 + "createdAt" 13 + ], 14 + "properties": { 15 + "status": { 16 + "type": "string", 17 + "minLength": 1, 18 + "maxGraphemes": 1, 19 + "maxLength": 32 20 + }, 21 + "createdAt": { 22 + "type": "string", 23 + "format": "datetime" 24 + } 25 + } 26 + } 27 + } 28 + } 29 + }
+3
atproto_api/src/dev.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `dev` namespace. 3 + pub mod baileytownsend;
+3
atproto_api/src/dev/baileytownsend.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `dev.baileytownsend` namespace. 3 + pub mod retrospective;
+3
atproto_api/src/dev/baileytownsend/retrospective.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `dev.baileytownsend.retrospective` namespace. 3 + pub mod day;
+40
atproto_api/src/dev/baileytownsend/retrospective/day.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `dev.baileytownsend.retrospective.day` namespace. 3 + use atrium_api::types::TryFromUnknown; 4 + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] 5 + #[serde(rename_all = "camelCase")] 6 + pub struct RecordData { 7 + ///An array of retrospective countables that happened in your day. 8 + pub countables: Vec<Countable>, 9 + ///An array of retrospective events that happened in your day. 10 + pub events: Vec<Event>, 11 + ///A text summary of your day, 300 character limit so it can be used as a post as well 12 + #[serde(skip_serializing_if = "core::option::Option::is_none")] 13 + pub summary: core::option::Option<String>, 14 + } 15 + pub type Record = atrium_api::types::Object<RecordData>; 16 + impl From<atrium_api::types::Unknown> for RecordData { 17 + fn from(value: atrium_api::types::Unknown) -> Self { 18 + Self::try_from_unknown(value).unwrap() 19 + } 20 + } 21 + ///Something that happened in your day that can be counted. Steps, water consumed, etc. 22 + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] 23 + #[serde(rename_all = "camelCase")] 24 + pub struct CountableData { 25 + ///The count for the event. This is the number of times the event happened. 26 + pub count: i64, 27 + ///a slugable key for the countable item using underscores instead of spaces. ounces_water, cookies_eaten, etc. 28 + pub key: String, 29 + } 30 + pub type Countable = atrium_api::types::Object<CountableData>; 31 + ///Something that happened in your day. Maybe you read a book, told a funny joke, or went on a fun outing. This is a record of that event. 32 + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] 33 + #[serde(rename_all = "camelCase")] 34 + pub struct EventData { 35 + ///What was the event? Watched a movie, what movie? Went to the beach? 36 + pub description: String, 37 + ///a slugable key for the event item using underscores instead of spaces. Like movies_watched, books_read, or restaurants_tried. 38 + pub key: String, 39 + } 40 + pub type Event = atrium_api::types::Object<EventData>;
+4
atproto_api/src/lib.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + pub mod record; 3 + pub mod xyz; 4 + pub mod sh;
+35
atproto_api/src/record.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!A collection of known record types. 3 + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] 4 + #[serde(tag = "$type")] 5 + pub enum KnownRecord { 6 + #[serde(rename = "sh.tangled.feed.star")] 7 + ShTangledFeedStar(Box<crate::sh::tangled::feed::star::Record>), 8 + #[serde(rename = "xyz.statusphere.status")] 9 + XyzStatusphereStatus(Box<crate::xyz::statusphere::status::Record>), 10 + } 11 + impl From<crate::sh::tangled::feed::star::Record> for KnownRecord { 12 + fn from(record: crate::sh::tangled::feed::star::Record) -> Self { 13 + KnownRecord::ShTangledFeedStar(Box::new(record)) 14 + } 15 + } 16 + impl From<crate::sh::tangled::feed::star::RecordData> for KnownRecord { 17 + fn from(record_data: crate::sh::tangled::feed::star::RecordData) -> Self { 18 + KnownRecord::ShTangledFeedStar(Box::new(record_data.into())) 19 + } 20 + } 21 + impl From<crate::xyz::statusphere::status::Record> for KnownRecord { 22 + fn from(record: crate::xyz::statusphere::status::Record) -> Self { 23 + KnownRecord::XyzStatusphereStatus(Box::new(record)) 24 + } 25 + } 26 + impl From<crate::xyz::statusphere::status::RecordData> for KnownRecord { 27 + fn from(record_data: crate::xyz::statusphere::status::RecordData) -> Self { 28 + KnownRecord::XyzStatusphereStatus(Box::new(record_data.into())) 29 + } 30 + } 31 + impl Into<atrium_api::types::Unknown> for KnownRecord { 32 + fn into(self) -> atrium_api::types::Unknown { 33 + atrium_api::types::TryIntoUnknown::try_into_unknown(&self).unwrap() 34 + } 35 + }
+3
atproto_api/src/sh.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `sh` namespace. 3 + pub mod tangled;
+3
atproto_api/src/sh/tangled.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `sh.tangled` namespace. 3 + pub mod feed;
+9
atproto_api/src/sh/tangled/feed.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `sh.tangled.feed` namespace. 3 + pub mod star; 4 + #[derive(Debug)] 5 + pub struct Star; 6 + impl atrium_api::types::Collection for Star { 7 + const NSID: &'static str = "sh.tangled.feed.star"; 8 + type Record = star::Record; 9 + }
+15
atproto_api/src/sh/tangled/feed/star.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `sh.tangled.feed.star` namespace. 3 + use atrium_api::types::TryFromUnknown; 4 + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] 5 + #[serde(rename_all = "camelCase")] 6 + pub struct RecordData { 7 + pub created_at: atrium_api::types::string::Datetime, 8 + pub subject: String, 9 + } 10 + pub type Record = atrium_api::types::Object<RecordData>; 11 + impl From<atrium_api::types::Unknown> for RecordData { 12 + fn from(value: atrium_api::types::Unknown) -> Self { 13 + Self::try_from_unknown(value).unwrap() 14 + } 15 + }
+3
atproto_api/src/xyz.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `xyz` namespace. 3 + pub mod statusphere;
+9
atproto_api/src/xyz/statusphere.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `xyz.statusphere` namespace. 3 + pub mod status; 4 + #[derive(Debug)] 5 + pub struct Status; 6 + impl atrium_api::types::Collection for Status { 7 + const NSID: &'static str = "xyz.statusphere.status"; 8 + type Record = status::Record; 9 + }
+15
atproto_api/src/xyz/statusphere/status.rs
··· 1 + // @generated - This file is generated by esquema-codegen (forked from atrium-codegen). DO NOT EDIT. 2 + //!Definitions for the `xyz.statusphere.status` namespace. 3 + use atrium_api::types::TryFromUnknown; 4 + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] 5 + #[serde(rename_all = "camelCase")] 6 + pub struct RecordData { 7 + pub created_at: atrium_api::types::string::Datetime, 8 + pub status: String, 9 + } 10 + pub type Record = atrium_api::types::Object<RecordData>; 11 + impl From<atrium_api::types::Unknown> for RecordData { 12 + fn from(value: atrium_api::types::Unknown) -> Self { 13 + Self::try_from_unknown(value).unwrap() 14 + } 15 + }
+1
bot/.gitignore
··· 1 + /target
+14
bot/Cargo.toml
··· 1 + [package] 2 + name = "bot" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + anyhow = "1.0.98" 8 + clap.workspace = true 9 + logic = { workspace = true, features = ["cli"] } 10 + log.workspace = true 11 + env_logger = "0.11.8" 12 + dotenv = "0.15.0" 13 + tokio.workspace = true 14 +
+129
bot/src/main.rs
··· 1 + extern crate dotenv; 2 + 3 + use anyhow::anyhow; 4 + use clap::{Parser, Subcommand, arg}; 5 + use dotenv::dotenv; 6 + use logic::emoji::Emoji; 7 + use logic::{ 8 + Error, HydratedStatus, StatusSphereListener, BotApi, StatusphereIngesterTrait, 9 + }; 10 + 11 + #[derive(Parser, Debug)] 12 + #[command(version, about, long_about = None)] 13 + #[command(propagate_version = true)] 14 + struct Cli { 15 + #[command(subcommand)] 16 + command: Commands, 17 + } 18 + 19 + #[derive(Subcommand, Debug)] 20 + enum Commands { 21 + /// Create a new Statusphere emoji status 22 + NewStatus(NewStatusArgs), 23 + ///Shows your current Statusphere status 24 + CurrentStatus(CurrentStatusArgs), 25 + /// Starts a JetStream listener listening for Statusphere updates 26 + Listen, 27 + } 28 + 29 + #[derive(Parser, Debug)] 30 + struct NewStatusArgs { 31 + #[arg(short, long)] 32 + emoji: Emoji, 33 + } 34 + 35 + #[derive(Parser, Debug)] 36 + struct CurrentStatusArgs { 37 + /// If you're not getting your own Statusphere can look up someone else's 38 + #[arg(long, default_value = None)] 39 + handle: Option<String>, 40 + } 41 + 42 + #[tokio::main] 43 + async fn main() -> anyhow::Result<()> { 44 + env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); 45 + dotenv().ok(); 46 + 47 + let cli = Cli::parse(); 48 + match &cli.command { 49 + Commands::NewStatus(args) => { 50 + //We check .env variables 51 + let handle = std::env::var("HANDLE") 52 + .expect("The env variable HANDLE is not set. Check the .env"); 53 + 54 + let password = std::env::var("APP_PASSWORD") 55 + .expect("The env variable APP_PASSWORD is not set. Check the .env"); 56 + 57 + let status_sphere_client = BotApi::new_logged_in(handle, password).await?; 58 + match status_sphere_client.new_status(args.emoji.to_emoji()).await { 59 + Ok(_) => { 60 + log::info!( 61 + "You just set {:?} as your current status.", 62 + args.emoji.to_emoji() 63 + ); 64 + } 65 + Err(err) => { 66 + log::error!("Error setting status: {}", err); 67 + } 68 + } 69 + } 70 + Commands::CurrentStatus(args) => { 71 + let status_sphere_client = BotApi::new(); 72 + 73 + let handle = match args.handle.as_ref() { 74 + None => { 75 + log::info!("No handle passed, using the one in the env variable HANDLE"); 76 + &match std::env::var("HANDLE") { 77 + Ok(handle) => handle, 78 + Err(_) => { 79 + return Err(anyhow!( 80 + "You did not pass a handle and The env variable HANDLE is not set" 81 + )); 82 + } 83 + } 84 + } 85 + Some(handle) => handle, 86 + }; 87 + 88 + match status_sphere_client.get_latest_status(handle.clone()).await { 89 + Ok(result) => match result { 90 + None => { 91 + log::info!("{} has no status", handle); 92 + } 93 + Some(status) => { 94 + log::info!( 95 + "{} has a status of {} that was set on {}", 96 + handle, 97 + status.status, 98 + status.created_at.as_str() 99 + ) 100 + } 101 + }, 102 + 103 + Err(err) => { 104 + return Err(anyhow!(err)); 105 + } 106 + } 107 + } 108 + &Commands::Listen => { 109 + let status_sphere_listener = StatusSphereListener::new(ExampleIngestor); 110 + status_sphere_listener.listen().await?; 111 + } 112 + } 113 + 114 + Ok(()) 115 + } 116 + 117 + pub struct ExampleIngestor; 118 + 119 + impl StatusphereIngesterTrait for ExampleIngestor { 120 + fn ingest(&self, status: HydratedStatus) -> Result<(), Error> { 121 + log::info!( 122 + "{} just posted the status {}", 123 + status.handle.unwrap_or(status.did), 124 + //Eh. i'm keeping the name but yeah 125 + status.status.status 126 + ); 127 + Ok(()) 128 + } 129 + }
+1
logic/.gitignore
··· 1 + /target
+44
logic/Cargo.toml
··· 1 + [package] 2 + name = "logic" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + atproto_api.workspace = true 8 + atrium-api.workspace = true 9 + atrium-common.workspace = true 10 + atrium-identity.workspace = true 11 + atrium-oauth.workspace = true 12 + atrium-xrpc-client.workspace = true 13 + serde.workspace = true 14 + reqwest = { version = "0.12", default-features = false, features = ["gzip", "json"] } 15 + thiserror = "2.0.12" 16 + anyhow = "1.0.98" 17 + serde_json = "1.0.140" 18 + 19 + [target.'cfg(not(target_arch = "wasm32"))'.dependencies] 20 + flume = "0.11.1" 21 + tokio.workspace = true 22 + rocketman.workspace = true 23 + tungstenite = "0.20.1" 24 + async-trait = "0.1.88" 25 + clap = { workspace = true, optional = true } 26 + 27 + [target.'cfg(target_arch = "wasm32")'.dependencies] 28 + wasm-bindgen.workspace = true 29 + getrandom = { version = "0.2.16", features = ["js"] } 30 + web-sys = { workspace = true, features = [ 31 + "BinaryType", 32 + "Blob", 33 + "ErrorEvent", 34 + "FileReader", 35 + "MessageEvent", 36 + "ProgressEvent", 37 + "WebSocket", 38 + ] } 39 + js-sys = "0.3.77" 40 + gloo-utils.workspace = true 41 + 42 + [features] 43 + default = [] 44 + cli = ["dep:clap"]
+2
logic/bacon.toml
··· 1 + [jobs.check-wasm] 2 + command = ["cargo", "check", "--target", "wasm32-unknown-unknown"]
+106
logic/src/emoji.rs
··· 1 + use serde::Serialize; 2 + 3 + #[derive(Clone, Debug, Serialize)] 4 + #[cfg_attr(feature = "cli", derive(clap::ValueEnum))] 5 + #[serde(rename_all = "kebab-case")] 6 + pub enum Emoji { 7 + ThumbsUp, 8 + ThumbsDown, 9 + BlueHeart, 10 + PleadingFace, 11 + AnguishedFace, 12 + AngryFace, 13 + UpsideDownFace, 14 + WinkingFace, 15 + SunglassesFace, 16 + GlassesFace, 17 + RaisedEyebrowFace, 18 + PartyingFace, 19 + CryingFace, 20 + SteamFromNose, 21 + ExplodingHead, 22 + Saluting, 23 + Skull, 24 + RaisedFist, 25 + RockOn, 26 + Eyes, 27 + Brain, 28 + WomanTechnologist, 29 + PersonTechnologist, 30 + Ninja, 31 + Troll, 32 + Butterfly, 33 + Rocket, 34 + Potato, 35 + Crab, 36 + } 37 + 38 + impl Emoji { 39 + pub fn to_emoji(&self) -> &'static str { 40 + match self { 41 + Emoji::ThumbsUp => "👍", 42 + Emoji::ThumbsDown => "👎", 43 + Emoji::BlueHeart => "💙", 44 + Emoji::PleadingFace => "🥹", 45 + Emoji::AnguishedFace => "😧", 46 + Emoji::AngryFace => "😤", 47 + Emoji::UpsideDownFace => "🙃", 48 + Emoji::WinkingFace => "😉", 49 + Emoji::SunglassesFace => "😎", 50 + Emoji::GlassesFace => "🤓", 51 + Emoji::RaisedEyebrowFace => "🤨", 52 + Emoji::PartyingFace => "🥳", 53 + Emoji::CryingFace => "😭", 54 + Emoji::SteamFromNose => "😤", 55 + Emoji::ExplodingHead => "🤯", 56 + Emoji::Saluting => "🫡", 57 + Emoji::Skull => "💀", 58 + Emoji::RaisedFist => "✊", 59 + Emoji::RockOn => "🤘", 60 + Emoji::Eyes => "👀", 61 + Emoji::Brain => "🧠", 62 + Emoji::WomanTechnologist => "👩‍💻", 63 + Emoji::PersonTechnologist => "🧑‍💻", 64 + Emoji::Ninja => "🥷", 65 + Emoji::Troll => "🧌", 66 + Emoji::Butterfly => "🦋", 67 + Emoji::Rocket => "🚀", 68 + Emoji::Potato => "🥔", 69 + Emoji::Crab => "🦀", 70 + } 71 + } 72 + } 73 + 74 + pub fn emojis() -> Vec<Emoji> { 75 + vec![ 76 + Emoji::ThumbsUp, 77 + Emoji::ThumbsDown, 78 + Emoji::BlueHeart, 79 + Emoji::PleadingFace, 80 + Emoji::AnguishedFace, 81 + Emoji::AngryFace, 82 + Emoji::UpsideDownFace, 83 + Emoji::WinkingFace, 84 + Emoji::SunglassesFace, 85 + Emoji::GlassesFace, 86 + Emoji::RaisedEyebrowFace, 87 + Emoji::PartyingFace, 88 + Emoji::CryingFace, 89 + Emoji::SteamFromNose, 90 + Emoji::ExplodingHead, 91 + Emoji::Saluting, 92 + Emoji::Skull, 93 + Emoji::RaisedFist, 94 + Emoji::RockOn, 95 + Emoji::Eyes, 96 + Emoji::Brain, 97 + Emoji::WomanTechnologist, 98 + Emoji::PersonTechnologist, 99 + Emoji::Ninja, 100 + Emoji::Troll, 101 + Emoji::Butterfly, 102 + Emoji::Rocket, 103 + Emoji::Potato, 104 + Emoji::Crab, 105 + ] 106 + }
+490
logic/src/lib.rs
··· 1 + pub mod emoji; 2 + mod resolver; 3 + 4 + use crate::Error::RequestError; 5 + use crate::resolver::ApiDNSTxtResolver; 6 + #[cfg(not(target_arch = "wasm32"))] 7 + use async_trait::async_trait; 8 + use atproto_api::record::KnownRecord; 9 + use atrium_api::agent::atp_agent::store::MemorySessionStore; 10 + use atrium_api::agent::atp_agent::{AtpSession, CredentialSession}; 11 + use atrium_api::agent::{Agent, Configure}; 12 + use atrium_api::did_doc::DidDocument; 13 + use atrium_api::types::string::{Datetime, Did, Handle}; 14 + use atrium_api::types::{Collection, LimitedNonZeroU8}; 15 + use atrium_common::resolver::Resolver; 16 + use atrium_common::store::memory::MemoryStore; 17 + use atrium_identity::did::{CommonDidResolver, CommonDidResolverConfig, DEFAULT_PLC_DIRECTORY_URL}; 18 + use atrium_identity::handle::{AtprotoHandleResolver, AtprotoHandleResolverConfig}; 19 + use atrium_oauth::DefaultHttpClient; 20 + use atrium_xrpc_client::reqwest::ReqwestClient; 21 + #[cfg(not(target_arch = "wasm32"))] 22 + use rocketman::{ 23 + connection::JetstreamConnection, handler, ingestion::LexiconIngestor, 24 + options::JetstreamOptions, types::event::Operation, 25 + }; 26 + use serde::{Deserialize, Serialize}; 27 + #[cfg(not(target_arch = "wasm32"))] 28 + use std::collections::HashMap; 29 + use std::sync::Arc; 30 + #[cfg(not(target_arch = "wasm32"))] 31 + use std::sync::Mutex; 32 + use thiserror::Error; 33 + #[cfg(not(target_arch = "wasm32"))] 34 + use tungstenite::Message; 35 + #[cfg(target_arch = "wasm32")] 36 + use wasm_bindgen::{JsCast, closure::Closure}; 37 + #[cfg(target_arch = "wasm32")] 38 + use web_sys::{ErrorEvent, MessageEvent, WebSocket}; 39 + 40 + #[derive(Debug, Error)] 41 + pub enum Error { 42 + #[error("General error: {0}")] 43 + GeneralError(String), 44 + #[error("Login error: {0}")] 45 + LoginError(String), 46 + #[error("Write error: {0}")] 47 + WriteError(String), 48 + #[error("Request error: {0}")] 49 + RequestError(String), 50 + #[error("Authentication required")] 51 + NeedsAuthentication, 52 + #[error("Parse error: {0}")] 53 + ParseError(String), 54 + #[error("Jet stream: {0}")] 55 + JetstreamError(String), 56 + } 57 + 58 + #[derive(Clone)] 59 + pub struct BotApi { 60 + agent: Arc<Agent<CredentialSession<MemoryStore<(), AtpSession>, ReqwestClient>>>, 61 + handle_resolver: Arc<AtprotoHandleResolver<ApiDNSTxtResolver, DefaultHttpClient>>, 62 + did_resolver: Arc<CommonDidResolver<DefaultHttpClient>>, 63 + authenticated: bool, 64 + } 65 + 66 + fn get_new_session() -> CredentialSession<MemoryStore<(), AtpSession>, ReqwestClient> { 67 + CredentialSession::new( 68 + ReqwestClient::new("https://bsky.social"), 69 + MemorySessionStore::default(), 70 + ) 71 + } 72 + 73 + /// Parses the PDS url from the DidDocument 74 + fn get_pds_from_doc<'a>(doc: DidDocument) -> Result<String, Error> { 75 + Ok(doc 76 + .service 77 + .as_ref() 78 + .and_then(|services| { 79 + services 80 + .iter() 81 + .find(|service| service.r#type == "AtprotoPersonalDataServer") 82 + .map(|service| service.service_endpoint.clone()) 83 + }) 84 + .ok_or_else(|| Error::ParseError("No valid PDS URL found for this DID".to_string()))?) 85 + } 86 + 87 + impl BotApi { 88 + /// Creates a new StatusphereApi to make unauthenticated calls to atproto repos 89 + pub fn new() -> Self { 90 + let session = get_new_session(); 91 + let agent = Agent::new(session); 92 + let http_client = Arc::new(DefaultHttpClient::default()); 93 + let handle_resolver = AtprotoHandleResolver::new(AtprotoHandleResolverConfig { 94 + dns_txt_resolver: ApiDNSTxtResolver::default(), 95 + http_client: Arc::new(DefaultHttpClient::default()), 96 + }); 97 + let did_resolver = CommonDidResolver::new(CommonDidResolverConfig { 98 + plc_directory_url: DEFAULT_PLC_DIRECTORY_URL.to_string(), 99 + http_client, 100 + }); 101 + Self { 102 + agent: Arc::new(agent), 103 + handle_resolver: Arc::new(handle_resolver), 104 + did_resolver: Arc::new(did_resolver), 105 + authenticated: false, 106 + } 107 + } 108 + 109 + /// Creates a new StatusphereAPi to make authenticated requests to your atproto repo 110 + pub async fn new_logged_in(handle: String, password: String) -> Result<Self, Error> { 111 + let session = get_new_session(); 112 + if let Err(error) = session.login(&handle, &password).await { 113 + return Err(Error::LoginError(error.to_string())); 114 + } 115 + let agent = Agent::new(session); 116 + let handle_resolver = AtprotoHandleResolver::new(AtprotoHandleResolverConfig { 117 + dns_txt_resolver: ApiDNSTxtResolver::default(), 118 + http_client: Arc::new(DefaultHttpClient::default()), 119 + }); 120 + 121 + let did_resolver = CommonDidResolver::new(CommonDidResolverConfig { 122 + plc_directory_url: DEFAULT_PLC_DIRECTORY_URL.to_string(), 123 + http_client: Arc::new(DefaultHttpClient::default()), 124 + }); 125 + 126 + Ok(Self { 127 + agent: Arc::new(agent), 128 + handle_resolver: Arc::new(handle_resolver), 129 + did_resolver: Arc::new(did_resolver), 130 + authenticated: true, 131 + }) 132 + } 133 + 134 + /// Updates a user's Statusphere status on their atproto repo 135 + pub async fn new_status(&self, status: &str) -> Result<(), Error> { 136 + if !self.authenticated { 137 + return Err(Error::NeedsAuthentication); 138 + } 139 + 140 + let status: KnownRecord = atproto_api::xyz::statusphere::status::RecordData { 141 + created_at: Datetime::now(), 142 + status: status.to_string(), 143 + } 144 + .into(); 145 + 146 + let did = self.agent.did().await.unwrap(); 147 + match self 148 + .agent 149 + .api 150 + .com 151 + .atproto 152 + .repo 153 + .create_record( 154 + atrium_api::com::atproto::repo::create_record::InputData { 155 + collection: atproto_api::xyz::statusphere::Status::NSID.parse().unwrap(), 156 + record: status.into(), 157 + repo: did.clone().parse().unwrap(), 158 + rkey: None, 159 + swap_commit: None, 160 + validate: None, 161 + } 162 + .into(), 163 + ) 164 + .await 165 + { 166 + Ok(_) => Ok(()), 167 + Err(err) => Err(Error::WriteError(err.to_string())), 168 + } 169 + } 170 + 171 + /// Gets the users latest Statusphere status if they do not have one returns None 172 + pub async fn get_latest_status( 173 + &self, 174 + handle: String, 175 + ) -> Result<Option<atproto_api::xyz::statusphere::status::RecordData>, Error> { 176 + let handle = match Handle::new(handle) { 177 + Ok(handle) => handle, 178 + Err(err) => Err(Error::ParseError(err.to_string()))?, 179 + }; 180 + 181 + let did = match self.handle_resolver.resolve(&handle).await { 182 + Ok(did) => did, 183 + Err(err) => { 184 + return Err(RequestError(format!( 185 + "Could not resolve the users handle: {:?}", 186 + err.to_string() 187 + )))?; 188 + } 189 + }; 190 + 191 + let pds_url = match self.did_resolver.resolve(&did).await { 192 + Ok(did_doc) => get_pds_from_doc(did_doc)?, 193 + Err(err) => Err(RequestError(err.to_string()))?, 194 + }; 195 + 196 + //changing the agent to call the users pds 197 + self.agent.configure_endpoint(pds_url); 198 + 199 + let result = self 200 + .agent 201 + .api 202 + .com 203 + .atproto 204 + .repo 205 + .list_records( 206 + atrium_api::com::atproto::repo::list_records::ParametersData { 207 + collection: atproto_api::xyz::statusphere::Status::NSID.parse().unwrap(), 208 + cursor: None, 209 + limit: Some(LimitedNonZeroU8::<100>::try_from(10_u8).unwrap()), 210 + repo: handle.parse().unwrap(), 211 + reverse: None, 212 + } 213 + .into(), 214 + ) 215 + .await 216 + .map_err(|e| Error::RequestError(e.to_string()))?; 217 + 218 + if let Some(record) = result.records.first() { 219 + let status: atproto_api::xyz::statusphere::status::RecordData = 220 + atproto_api::xyz::statusphere::status::RecordData::from(record.value.clone()); 221 + return Ok(Some(status)); 222 + } 223 + Ok(None) 224 + } 225 + 226 + ///Takes a users handle like @baileytownsend.dev and resolves it ot the did 227 + pub async fn resolve_handle(&self, handle: String) -> Result<Did, Error> { 228 + let handle = Handle::new(handle).map_err(|e| Error::ParseError(e.to_string()))?; 229 + self.handle_resolver 230 + .resolve(&handle) 231 + .await 232 + .map_err(|e| Error::RequestError(e.to_string())) 233 + } 234 + 235 + /// Takes a did and returns a handle 236 + pub async fn get_handle(&self, did: String) -> Result<String, Error> { 237 + let did = Did::new(did).map_err(|e| Error::ParseError(e.to_string()))?; 238 + match self.did_resolver.resolve(&did).await { 239 + Ok(did_doc) => { 240 + match did_doc.also_known_as { 241 + None => Err(Error::ParseError( 242 + "No also_known_as field found".to_string(), 243 + ))?, 244 + Some(also_known_as) => { 245 + match also_known_as.is_empty() { 246 + true => Err(Error::ParseError("also_known_as is empty".to_string()))?, 247 + false => { 248 + //also_known as a list starts the array with the highest priority handle 249 + let formatted_handle = 250 + format!("@{}", also_known_as[0]).replace("at://", ""); 251 + Ok(formatted_handle) 252 + } 253 + } 254 + } 255 + } 256 + } 257 + Err(err) => Err(Error::ParseError(err.to_string()))?, 258 + } 259 + } 260 + } 261 + 262 + /// A Jetstream listener using Rocketman 263 + #[cfg(not(target_arch = "wasm32"))] 264 + pub struct StatusSphereListener { 265 + pub cursor: Arc<Mutex<Option<u64>>>, 266 + pub ingestors: Arc<HashMap<String, Box<dyn LexiconIngestor + Send + Sync>>>, 267 + jetstream_connection: JetstreamConnection, 268 + pub msg_rx: flume::Receiver<Message>, 269 + pub reconnect_tx: flume::Sender<()>, 270 + } 271 + 272 + /// The data we get back from handlers of the Jetstream. 273 + #[derive(Serialize, Deserialize)] 274 + pub struct HydratedStatus { 275 + ///Handle may not always be hydrated depending on the target. 276 + pub handle: Option<String>, 277 + pub did: String, 278 + pub status: atproto_api::xyz::statusphere::status::RecordData, 279 + } 280 + 281 + /// Trait to share some similar types between jetstream implementations 282 + pub trait StatusphereIngesterTrait: Send + Sync { 283 + fn ingest(&self, status: HydratedStatus) -> Result<(), Error>; 284 + } 285 + 286 + /// our non wasm32 Injester 287 + #[cfg(not(target_arch = "wasm32"))] 288 + pub struct StatusphereIngester<F> 289 + where 290 + F: StatusphereIngesterTrait, 291 + { 292 + status_sphere_agent: BotApi, 293 + handler: F, 294 + } 295 + 296 + #[cfg(not(target_arch = "wasm32"))] 297 + impl StatusSphereListener { 298 + pub fn new<F>(handler: F) -> Self 299 + where 300 + F: StatusphereIngesterTrait + Send + Sync + 'static, 301 + { 302 + // init the builder 303 + let opts = JetstreamOptions::builder() 304 + // your EXACT nsids 305 + .wanted_collections(vec![ 306 + atproto_api::xyz::statusphere::Status::NSID.to_string(), 307 + ]) 308 + .build(); 309 + // create the jetstream connector 310 + let jetstream = JetstreamConnection::new(opts); 311 + 312 + // tracks the last message we've processed 313 + let cursor: Arc<Mutex<Option<u64>>> = Arc::new(Mutex::new(None)); 314 + 315 + // get channels 316 + let msg_rx = jetstream.get_msg_rx(); 317 + let reconnect_tx = jetstream.get_reconnect_tx(); 318 + 319 + // create your ingestors 320 + let mut injestors: HashMap<String, Box<dyn LexiconIngestor + Send + Sync>> = HashMap::new(); 321 + 322 + injestors.insert( 323 + atproto_api::xyz::statusphere::Status::NSID.to_string(), 324 + Box::new(StatusphereIngester { 325 + status_sphere_agent: BotApi::new(), 326 + handler, 327 + }), 328 + ); 329 + Self { 330 + cursor, 331 + ingestors: Arc::new(injestors), 332 + jetstream_connection: jetstream, 333 + msg_rx, 334 + reconnect_tx, 335 + } 336 + } 337 + 338 + /// Start listening to the jetstream for new statusphere updates 339 + pub async fn listen(&self) -> Result<(), Error> { 340 + let msg_rx = self.msg_rx.clone(); 341 + let ingestors = Arc::clone(&self.ingestors); 342 + let reconnect_tx = self.reconnect_tx.clone(); 343 + let cursor = self.cursor.clone(); 344 + 345 + tokio::spawn(async move { 346 + while let Ok(message) = msg_rx.recv_async().await { 347 + if let Err(e) = handler::handle_message( 348 + message, 349 + &ingestors, 350 + reconnect_tx.clone(), 351 + cursor.clone(), 352 + ) 353 + .await 354 + { 355 + //Just error internally since this is a template 356 + eprintln!("Error processing message: {}", e); 357 + }; 358 + } 359 + }); 360 + 361 + // connect to jetstream 362 + // retries internally, but may fail if there is an extreme error. 363 + self.jetstream_connection 364 + .connect(self.cursor.clone()) 365 + .await 366 + .map_err(|e| Error::GeneralError(e.to_string())) 367 + } 368 + } 369 + 370 + /// Shows a Jestream Listener for desktop or server side 371 + #[cfg(not(target_arch = "wasm32"))] 372 + #[async_trait] 373 + impl<F: StatusphereIngesterTrait + Send + Sync> LexiconIngestor for StatusphereIngester<F> { 374 + async fn ingest( 375 + &self, 376 + message: rocketman::types::event::Event<serde_json::Value>, 377 + ) -> anyhow::Result<()> { 378 + if let Some(commit) = &message.commit { 379 + let handle = self 380 + .status_sphere_agent 381 + .get_handle(message.did.clone()) 382 + .await?; 383 + 384 + match commit.operation { 385 + Operation::Create | Operation::Update => { 386 + if let Some(record) = &commit.record { 387 + let status_at_proto_record = serde_json::from_value::< 388 + atproto_api::xyz::statusphere::status::RecordData, 389 + >(record.clone())?; 390 + 391 + if let Some(ref _cid) = commit.cid { 392 + self.handler.ingest(HydratedStatus { 393 + handle: Some(handle), 394 + did: message.did, 395 + status: status_at_proto_record.clone(), 396 + })?; 397 + } 398 + Ok::<(), anyhow::Error>(()) 399 + } else { 400 + Ok::<(), anyhow::Error>(()) 401 + } 402 + } 403 + Operation::Delete => Ok::<(), anyhow::Error>(()), 404 + } 405 + } else { 406 + Ok(()) 407 + } 408 + } 409 + } 410 + 411 + #[cfg(target_arch = "wasm32")] 412 + /// Just a simple jetstream listener with a lot less features than Rocketman but just to show it can happen and sharing code 413 + pub fn listen<F>(on_message_handler: F) -> Result<(), Error> 414 + where 415 + F: StatusphereIngesterTrait + 'static, 416 + { 417 + // Connect to an echo server 418 + let ws = WebSocket::new( 419 + "wss://jetstream1.us-east.bsky.network/subscribe?wantedCollections=xyz.statusphere.status", 420 + ) 421 + //HACK prob dont want that unwrap either, but this is just a template 422 + .map_err(|e| Error::GeneralError(String::try_from(e).unwrap()))?; 423 + // For small binary messages, like CBOR, Arraybuffer is more efficient than Blob handling 424 + ws.set_binary_type(web_sys::BinaryType::Arraybuffer); 425 + // create callback 426 + let on_message = Closure::<dyn FnMut(_)>::new(move |e: MessageEvent| { 427 + //We're just handling txt to make it easy 428 + if let Ok(txt) = e.data().dyn_into::<js_sys::JsString>() { 429 + //HACK .into_Serde() on jsvalue of e.data() was not working for some reason 430 + let txt_str = String::from(txt); 431 + let envelope: WasmEvent<atproto_api::xyz::statusphere::status::RecordData> = 432 + serde_json::from_str(&txt_str).unwrap(); 433 + if let Some(commit) = envelope.commit { 434 + if let Some(record) = commit.record { 435 + let _ = on_message_handler.ingest(HydratedStatus { 436 + handle: None, 437 + did: envelope.did, 438 + status: record, 439 + }); 440 + } 441 + } 442 + } 443 + }); 444 + 445 + // set message event handler on WebSocket 446 + ws.set_onmessage(Some(on_message.as_ref().unchecked_ref())); 447 + // forget the callback to keep it alive 448 + on_message.forget(); 449 + 450 + let onerror_callback = Closure::<dyn FnMut(_)>::new(move |_e: ErrorEvent| { 451 + //HACK would put an actual error handler here 452 + }); 453 + ws.set_onerror(Some(onerror_callback.as_ref().unchecked_ref())); 454 + onerror_callback.forget(); 455 + let onopen_callback = Closure::<dyn FnMut()>::new(move || { 456 + //HACK 457 + }); 458 + ws.set_onopen(Some(onopen_callback.as_ref().unchecked_ref())); 459 + onopen_callback.forget(); 460 + Ok(()) 461 + } 462 + 463 + ///Shamelessly taken from rocketman. reimplmenting because Rocketman is not wasm compatible 464 + /// Ideally you would have the same types between packages but just a proof of concept 465 + /// https://github.com/espeon/cadet/blob/f034b19b73df4ac97e3ae54162d48883f81ff168/rocketman/src/types/event.rs#L14 466 + #[derive(Debug, Serialize, Deserialize)] 467 + #[serde(rename_all = "snake_case")] 468 + struct WasmEvent<T> { 469 + pub did: String, 470 + pub commit: Option<WasmCommit<T>>, 471 + } 472 + 473 + #[derive(Debug, Serialize, Deserialize)] 474 + #[serde(rename_all = "camelCase")] 475 + struct WasmCommit<T> { 476 + pub rev: String, 477 + pub operation: WasmOperation, 478 + pub collection: String, 479 + pub rkey: String, 480 + pub record: Option<T>, 481 + pub cid: Option<String>, 482 + } 483 + // 484 + #[derive(Debug, Serialize, Deserialize)] 485 + #[serde(rename_all = "lowercase")] 486 + enum WasmOperation { 487 + Create, 488 + Update, 489 + Delete, 490 + }
+83
logic/src/resolver.rs
··· 1 + #[allow(dead_code)] 2 + use atrium_identity::handle::DnsTxtResolver; 3 + use reqwest::Client; 4 + use serde::{Deserialize, Serialize}; 5 + use std::sync::Arc; 6 + 7 + /// Setup for dns resolver for the handle resolver 8 + pub struct ApiDNSTxtResolver { 9 + client: Arc<Client>, 10 + } 11 + 12 + impl Default for ApiDNSTxtResolver { 13 + fn default() -> Self { 14 + Self { 15 + client: Arc::new(Client::new()), 16 + } 17 + } 18 + } 19 + 20 + // curl --http2 --header "accept: application/dns-json" "https://one.one.one.one/dns-query?name=_atproto.baileytownsend.dev&type=TXT" 21 + impl DnsTxtResolver for ApiDNSTxtResolver { 22 + async fn resolve( 23 + &self, 24 + query: &str, 25 + ) -> core::result::Result<Vec<String>, Box<dyn std::error::Error + Send + Sync + 'static>> { 26 + let request_url = format!( 27 + "https://one.one.one.one/dns-query?name={}&type=TXT", 28 + query.to_lowercase() 29 + ); 30 + 31 + let resp = self 32 + .client 33 + .get(request_url) 34 + .header("accept", "application/dns-json") 35 + .send() 36 + .await?; 37 + if !resp.status().is_success() { 38 + return Err(format!("HTTP request failed with status: {}", resp.status()).into()); 39 + } 40 + 41 + let resp: DnsResponse = resp 42 + .json() 43 + .await 44 + .map_err(|e| Box::new(e) as Box<dyn std::error::Error + Send + Sync + 'static>)?; 45 + 46 + let response_data = resp 47 + .Answer 48 + .iter() 49 + .map(|a| a.data.clone().replace("\"", "")) 50 + .collect::<Vec<String>>(); 51 + Ok(response_data) 52 + } 53 + } 54 + 55 + #[derive(Debug, Serialize, Deserialize)] 56 + #[allow(non_snake_case)] 57 + pub struct DnsResponse { 58 + pub Status: i32, 59 + pub TC: bool, 60 + pub RD: bool, 61 + pub RA: bool, 62 + pub AD: bool, 63 + pub CD: bool, 64 + pub Question: Vec<Question>, 65 + pub Answer: Vec<Answer>, 66 + } 67 + 68 + #[derive(Debug, Serialize, Deserialize)] 69 + pub struct Question { 70 + pub name: String, 71 + #[serde(rename = "type")] 72 + pub type_: i32, 73 + } 74 + 75 + #[derive(Debug, Serialize, Deserialize)] 76 + #[allow(non_snake_case)] 77 + pub struct Answer { 78 + pub name: String, 79 + #[serde(rename = "type")] 80 + pub type_: i32, 81 + pub TTL: i32, 82 + pub data: String, 83 + }