Constellation, Spacedust, Slingshot, UFOs: atproto crates and services for microcosm
75
fork

Configure Feed

Select the types of activity you want to include in your feed.

initial commit

videah 794ac66b

+2490
+1
.gitignore
··· 1 + /target
+1842
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 = "aho-corasick" 22 + version = "1.1.3" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 + dependencies = [ 26 + "memchr", 27 + ] 28 + 29 + [[package]] 30 + name = "android-tzdata" 31 + version = "0.1.1" 32 + source = "registry+https://github.com/rust-lang/crates.io-index" 33 + checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 34 + 35 + [[package]] 36 + name = "android_system_properties" 37 + version = "0.1.5" 38 + source = "registry+https://github.com/rust-lang/crates.io-index" 39 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 40 + dependencies = [ 41 + "libc", 42 + ] 43 + 44 + [[package]] 45 + name = "anstream" 46 + version = "0.6.18" 47 + source = "registry+https://github.com/rust-lang/crates.io-index" 48 + checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 49 + dependencies = [ 50 + "anstyle", 51 + "anstyle-parse", 52 + "anstyle-query", 53 + "anstyle-wincon", 54 + "colorchoice", 55 + "is_terminal_polyfill", 56 + "utf8parse", 57 + ] 58 + 59 + [[package]] 60 + name = "anstyle" 61 + version = "1.0.10" 62 + source = "registry+https://github.com/rust-lang/crates.io-index" 63 + checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 64 + 65 + [[package]] 66 + name = "anstyle-parse" 67 + version = "0.2.6" 68 + source = "registry+https://github.com/rust-lang/crates.io-index" 69 + checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 70 + dependencies = [ 71 + "utf8parse", 72 + ] 73 + 74 + [[package]] 75 + name = "anstyle-query" 76 + version = "1.1.2" 77 + source = "registry+https://github.com/rust-lang/crates.io-index" 78 + checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 79 + dependencies = [ 80 + "windows-sys 0.59.0", 81 + ] 82 + 83 + [[package]] 84 + name = "anstyle-wincon" 85 + version = "3.0.6" 86 + source = "registry+https://github.com/rust-lang/crates.io-index" 87 + checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" 88 + dependencies = [ 89 + "anstyle", 90 + "windows-sys 0.59.0", 91 + ] 92 + 93 + [[package]] 94 + name = "anyhow" 95 + version = "1.0.93" 96 + source = "registry+https://github.com/rust-lang/crates.io-index" 97 + checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" 98 + 99 + [[package]] 100 + name = "async-trait" 101 + version = "0.1.83" 102 + source = "registry+https://github.com/rust-lang/crates.io-index" 103 + checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" 104 + dependencies = [ 105 + "proc-macro2", 106 + "quote", 107 + "syn 2.0.87", 108 + ] 109 + 110 + [[package]] 111 + name = "atrium-api" 112 + version = "0.24.7" 113 + source = "registry+https://github.com/rust-lang/crates.io-index" 114 + checksum = "ee68ddf7cde9eb121eed3a28b138f6a9b4c4a90ab0c5c2e38bc2817af0b06da3" 115 + dependencies = [ 116 + "atrium-xrpc", 117 + "chrono", 118 + "http", 119 + "ipld-core", 120 + "langtag", 121 + "regex", 122 + "serde", 123 + "serde_bytes", 124 + "serde_json", 125 + "thiserror 1.0.69", 126 + "trait-variant", 127 + ] 128 + 129 + [[package]] 130 + name = "atrium-xrpc" 131 + version = "0.11.6" 132 + source = "registry+https://github.com/rust-lang/crates.io-index" 133 + checksum = "737eea1de2eb174bbfe720619cb25a22c30b9640ae0d3b78386cedf007712963" 134 + dependencies = [ 135 + "http", 136 + "serde", 137 + "serde_html_form", 138 + "serde_json", 139 + "thiserror 1.0.69", 140 + "trait-variant", 141 + ] 142 + 143 + [[package]] 144 + name = "autocfg" 145 + version = "1.4.0" 146 + source = "registry+https://github.com/rust-lang/crates.io-index" 147 + checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 148 + 149 + [[package]] 150 + name = "backtrace" 151 + version = "0.3.74" 152 + source = "registry+https://github.com/rust-lang/crates.io-index" 153 + checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 154 + dependencies = [ 155 + "addr2line", 156 + "cfg-if", 157 + "libc", 158 + "miniz_oxide", 159 + "object", 160 + "rustc-demangle", 161 + "windows-targets", 162 + ] 163 + 164 + [[package]] 165 + name = "base-x" 166 + version = "0.2.11" 167 + source = "registry+https://github.com/rust-lang/crates.io-index" 168 + checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" 169 + 170 + [[package]] 171 + name = "bitflags" 172 + version = "2.6.0" 173 + source = "registry+https://github.com/rust-lang/crates.io-index" 174 + checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 175 + 176 + [[package]] 177 + name = "block-buffer" 178 + version = "0.10.4" 179 + source = "registry+https://github.com/rust-lang/crates.io-index" 180 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 181 + dependencies = [ 182 + "generic-array", 183 + ] 184 + 185 + [[package]] 186 + name = "bumpalo" 187 + version = "3.16.0" 188 + source = "registry+https://github.com/rust-lang/crates.io-index" 189 + checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 190 + 191 + [[package]] 192 + name = "byteorder" 193 + version = "1.5.0" 194 + source = "registry+https://github.com/rust-lang/crates.io-index" 195 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 196 + 197 + [[package]] 198 + name = "bytes" 199 + version = "1.8.0" 200 + source = "registry+https://github.com/rust-lang/crates.io-index" 201 + checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" 202 + 203 + [[package]] 204 + name = "cc" 205 + version = "1.2.0" 206 + source = "registry+https://github.com/rust-lang/crates.io-index" 207 + checksum = "1aeb932158bd710538c73702db6945cb68a8fb08c519e6e12706b94263b36db8" 208 + dependencies = [ 209 + "jobserver", 210 + "libc", 211 + "shlex", 212 + ] 213 + 214 + [[package]] 215 + name = "cfg-if" 216 + version = "1.0.0" 217 + source = "registry+https://github.com/rust-lang/crates.io-index" 218 + checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 219 + 220 + [[package]] 221 + name = "chrono" 222 + version = "0.4.38" 223 + source = "registry+https://github.com/rust-lang/crates.io-index" 224 + checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 225 + dependencies = [ 226 + "android-tzdata", 227 + "iana-time-zone", 228 + "js-sys", 229 + "num-traits", 230 + "serde", 231 + "wasm-bindgen", 232 + "windows-targets", 233 + ] 234 + 235 + [[package]] 236 + name = "cid" 237 + version = "0.11.1" 238 + source = "registry+https://github.com/rust-lang/crates.io-index" 239 + checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" 240 + dependencies = [ 241 + "core2", 242 + "multibase", 243 + "multihash", 244 + "serde", 245 + "serde_bytes", 246 + "unsigned-varint", 247 + ] 248 + 249 + [[package]] 250 + name = "clap" 251 + version = "4.5.21" 252 + source = "registry+https://github.com/rust-lang/crates.io-index" 253 + checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" 254 + dependencies = [ 255 + "clap_builder", 256 + "clap_derive", 257 + ] 258 + 259 + [[package]] 260 + name = "clap_builder" 261 + version = "4.5.21" 262 + source = "registry+https://github.com/rust-lang/crates.io-index" 263 + checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" 264 + dependencies = [ 265 + "anstream", 266 + "anstyle", 267 + "clap_lex", 268 + "strsim", 269 + ] 270 + 271 + [[package]] 272 + name = "clap_derive" 273 + version = "4.5.18" 274 + source = "registry+https://github.com/rust-lang/crates.io-index" 275 + checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" 276 + dependencies = [ 277 + "heck", 278 + "proc-macro2", 279 + "quote", 280 + "syn 2.0.87", 281 + ] 282 + 283 + [[package]] 284 + name = "clap_lex" 285 + version = "0.7.3" 286 + source = "registry+https://github.com/rust-lang/crates.io-index" 287 + checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" 288 + 289 + [[package]] 290 + name = "colorchoice" 291 + version = "1.0.3" 292 + source = "registry+https://github.com/rust-lang/crates.io-index" 293 + checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 294 + 295 + [[package]] 296 + name = "core-foundation" 297 + version = "0.9.4" 298 + source = "registry+https://github.com/rust-lang/crates.io-index" 299 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 300 + dependencies = [ 301 + "core-foundation-sys", 302 + "libc", 303 + ] 304 + 305 + [[package]] 306 + name = "core-foundation-sys" 307 + version = "0.8.7" 308 + source = "registry+https://github.com/rust-lang/crates.io-index" 309 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 310 + 311 + [[package]] 312 + name = "core2" 313 + version = "0.4.0" 314 + source = "registry+https://github.com/rust-lang/crates.io-index" 315 + checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" 316 + dependencies = [ 317 + "memchr", 318 + ] 319 + 320 + [[package]] 321 + name = "cpufeatures" 322 + version = "0.2.15" 323 + source = "registry+https://github.com/rust-lang/crates.io-index" 324 + checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" 325 + dependencies = [ 326 + "libc", 327 + ] 328 + 329 + [[package]] 330 + name = "crypto-common" 331 + version = "0.1.6" 332 + source = "registry+https://github.com/rust-lang/crates.io-index" 333 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 334 + dependencies = [ 335 + "generic-array", 336 + "typenum", 337 + ] 338 + 339 + [[package]] 340 + name = "data-encoding" 341 + version = "2.6.0" 342 + source = "registry+https://github.com/rust-lang/crates.io-index" 343 + checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" 344 + 345 + [[package]] 346 + name = "data-encoding-macro" 347 + version = "0.1.15" 348 + source = "registry+https://github.com/rust-lang/crates.io-index" 349 + checksum = "f1559b6cba622276d6d63706db152618eeb15b89b3e4041446b05876e352e639" 350 + dependencies = [ 351 + "data-encoding", 352 + "data-encoding-macro-internal", 353 + ] 354 + 355 + [[package]] 356 + name = "data-encoding-macro-internal" 357 + version = "0.1.13" 358 + source = "registry+https://github.com/rust-lang/crates.io-index" 359 + checksum = "332d754c0af53bc87c108fed664d121ecf59207ec4196041f04d6ab9002ad33f" 360 + dependencies = [ 361 + "data-encoding", 362 + "syn 1.0.109", 363 + ] 364 + 365 + [[package]] 366 + name = "digest" 367 + version = "0.10.7" 368 + source = "registry+https://github.com/rust-lang/crates.io-index" 369 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 370 + dependencies = [ 371 + "block-buffer", 372 + "crypto-common", 373 + ] 374 + 375 + [[package]] 376 + name = "displaydoc" 377 + version = "0.2.5" 378 + source = "registry+https://github.com/rust-lang/crates.io-index" 379 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 380 + dependencies = [ 381 + "proc-macro2", 382 + "quote", 383 + "syn 2.0.87", 384 + ] 385 + 386 + [[package]] 387 + name = "equivalent" 388 + version = "1.0.1" 389 + source = "registry+https://github.com/rust-lang/crates.io-index" 390 + checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 391 + 392 + [[package]] 393 + name = "errno" 394 + version = "0.3.9" 395 + source = "registry+https://github.com/rust-lang/crates.io-index" 396 + checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 397 + dependencies = [ 398 + "libc", 399 + "windows-sys 0.52.0", 400 + ] 401 + 402 + [[package]] 403 + name = "fastrand" 404 + version = "2.2.0" 405 + source = "registry+https://github.com/rust-lang/crates.io-index" 406 + checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" 407 + 408 + [[package]] 409 + name = "flume" 410 + version = "0.11.1" 411 + source = "registry+https://github.com/rust-lang/crates.io-index" 412 + checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 413 + dependencies = [ 414 + "futures-core", 415 + "futures-sink", 416 + "nanorand", 417 + "spin", 418 + ] 419 + 420 + [[package]] 421 + name = "fnv" 422 + version = "1.0.7" 423 + source = "registry+https://github.com/rust-lang/crates.io-index" 424 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 425 + 426 + [[package]] 427 + name = "foreign-types" 428 + version = "0.3.2" 429 + source = "registry+https://github.com/rust-lang/crates.io-index" 430 + checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 431 + dependencies = [ 432 + "foreign-types-shared", 433 + ] 434 + 435 + [[package]] 436 + name = "foreign-types-shared" 437 + version = "0.1.1" 438 + source = "registry+https://github.com/rust-lang/crates.io-index" 439 + checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 440 + 441 + [[package]] 442 + name = "form_urlencoded" 443 + version = "1.2.1" 444 + source = "registry+https://github.com/rust-lang/crates.io-index" 445 + checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 446 + dependencies = [ 447 + "percent-encoding", 448 + ] 449 + 450 + [[package]] 451 + name = "futures-core" 452 + version = "0.3.31" 453 + source = "registry+https://github.com/rust-lang/crates.io-index" 454 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 455 + 456 + [[package]] 457 + name = "futures-macro" 458 + version = "0.3.31" 459 + source = "registry+https://github.com/rust-lang/crates.io-index" 460 + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 461 + dependencies = [ 462 + "proc-macro2", 463 + "quote", 464 + "syn 2.0.87", 465 + ] 466 + 467 + [[package]] 468 + name = "futures-sink" 469 + version = "0.3.31" 470 + source = "registry+https://github.com/rust-lang/crates.io-index" 471 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 472 + 473 + [[package]] 474 + name = "futures-task" 475 + version = "0.3.31" 476 + source = "registry+https://github.com/rust-lang/crates.io-index" 477 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 478 + 479 + [[package]] 480 + name = "futures-util" 481 + version = "0.3.31" 482 + source = "registry+https://github.com/rust-lang/crates.io-index" 483 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 484 + dependencies = [ 485 + "futures-core", 486 + "futures-macro", 487 + "futures-sink", 488 + "futures-task", 489 + "pin-project-lite", 490 + "pin-utils", 491 + "slab", 492 + ] 493 + 494 + [[package]] 495 + name = "generic-array" 496 + version = "0.14.7" 497 + source = "registry+https://github.com/rust-lang/crates.io-index" 498 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 499 + dependencies = [ 500 + "typenum", 501 + "version_check", 502 + ] 503 + 504 + [[package]] 505 + name = "getrandom" 506 + version = "0.2.15" 507 + source = "registry+https://github.com/rust-lang/crates.io-index" 508 + checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 509 + dependencies = [ 510 + "cfg-if", 511 + "js-sys", 512 + "libc", 513 + "wasi", 514 + "wasm-bindgen", 515 + ] 516 + 517 + [[package]] 518 + name = "gimli" 519 + version = "0.31.1" 520 + source = "registry+https://github.com/rust-lang/crates.io-index" 521 + checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 522 + 523 + [[package]] 524 + name = "hashbrown" 525 + version = "0.15.1" 526 + source = "registry+https://github.com/rust-lang/crates.io-index" 527 + checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" 528 + 529 + [[package]] 530 + name = "heck" 531 + version = "0.5.0" 532 + source = "registry+https://github.com/rust-lang/crates.io-index" 533 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 534 + 535 + [[package]] 536 + name = "hermit-abi" 537 + version = "0.3.9" 538 + source = "registry+https://github.com/rust-lang/crates.io-index" 539 + checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 540 + 541 + [[package]] 542 + name = "http" 543 + version = "1.1.0" 544 + source = "registry+https://github.com/rust-lang/crates.io-index" 545 + checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 546 + dependencies = [ 547 + "bytes", 548 + "fnv", 549 + "itoa", 550 + ] 551 + 552 + [[package]] 553 + name = "httparse" 554 + version = "1.9.5" 555 + source = "registry+https://github.com/rust-lang/crates.io-index" 556 + checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" 557 + 558 + [[package]] 559 + name = "iana-time-zone" 560 + version = "0.1.61" 561 + source = "registry+https://github.com/rust-lang/crates.io-index" 562 + checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 563 + dependencies = [ 564 + "android_system_properties", 565 + "core-foundation-sys", 566 + "iana-time-zone-haiku", 567 + "js-sys", 568 + "wasm-bindgen", 569 + "windows-core", 570 + ] 571 + 572 + [[package]] 573 + name = "iana-time-zone-haiku" 574 + version = "0.1.2" 575 + source = "registry+https://github.com/rust-lang/crates.io-index" 576 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 577 + dependencies = [ 578 + "cc", 579 + ] 580 + 581 + [[package]] 582 + name = "icu_collections" 583 + version = "1.5.0" 584 + source = "registry+https://github.com/rust-lang/crates.io-index" 585 + checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 586 + dependencies = [ 587 + "displaydoc", 588 + "yoke", 589 + "zerofrom", 590 + "zerovec", 591 + ] 592 + 593 + [[package]] 594 + name = "icu_locid" 595 + version = "1.5.0" 596 + source = "registry+https://github.com/rust-lang/crates.io-index" 597 + checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 598 + dependencies = [ 599 + "displaydoc", 600 + "litemap", 601 + "tinystr", 602 + "writeable", 603 + "zerovec", 604 + ] 605 + 606 + [[package]] 607 + name = "icu_locid_transform" 608 + version = "1.5.0" 609 + source = "registry+https://github.com/rust-lang/crates.io-index" 610 + checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 611 + dependencies = [ 612 + "displaydoc", 613 + "icu_locid", 614 + "icu_locid_transform_data", 615 + "icu_provider", 616 + "tinystr", 617 + "zerovec", 618 + ] 619 + 620 + [[package]] 621 + name = "icu_locid_transform_data" 622 + version = "1.5.0" 623 + source = "registry+https://github.com/rust-lang/crates.io-index" 624 + checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 625 + 626 + [[package]] 627 + name = "icu_normalizer" 628 + version = "1.5.0" 629 + source = "registry+https://github.com/rust-lang/crates.io-index" 630 + checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 631 + dependencies = [ 632 + "displaydoc", 633 + "icu_collections", 634 + "icu_normalizer_data", 635 + "icu_properties", 636 + "icu_provider", 637 + "smallvec", 638 + "utf16_iter", 639 + "utf8_iter", 640 + "write16", 641 + "zerovec", 642 + ] 643 + 644 + [[package]] 645 + name = "icu_normalizer_data" 646 + version = "1.5.0" 647 + source = "registry+https://github.com/rust-lang/crates.io-index" 648 + checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 649 + 650 + [[package]] 651 + name = "icu_properties" 652 + version = "1.5.1" 653 + source = "registry+https://github.com/rust-lang/crates.io-index" 654 + checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 655 + dependencies = [ 656 + "displaydoc", 657 + "icu_collections", 658 + "icu_locid_transform", 659 + "icu_properties_data", 660 + "icu_provider", 661 + "tinystr", 662 + "zerovec", 663 + ] 664 + 665 + [[package]] 666 + name = "icu_properties_data" 667 + version = "1.5.0" 668 + source = "registry+https://github.com/rust-lang/crates.io-index" 669 + checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 670 + 671 + [[package]] 672 + name = "icu_provider" 673 + version = "1.5.0" 674 + source = "registry+https://github.com/rust-lang/crates.io-index" 675 + checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 676 + dependencies = [ 677 + "displaydoc", 678 + "icu_locid", 679 + "icu_provider_macros", 680 + "stable_deref_trait", 681 + "tinystr", 682 + "writeable", 683 + "yoke", 684 + "zerofrom", 685 + "zerovec", 686 + ] 687 + 688 + [[package]] 689 + name = "icu_provider_macros" 690 + version = "1.5.0" 691 + source = "registry+https://github.com/rust-lang/crates.io-index" 692 + checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 693 + dependencies = [ 694 + "proc-macro2", 695 + "quote", 696 + "syn 2.0.87", 697 + ] 698 + 699 + [[package]] 700 + name = "idna" 701 + version = "1.0.3" 702 + source = "registry+https://github.com/rust-lang/crates.io-index" 703 + checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 704 + dependencies = [ 705 + "idna_adapter", 706 + "smallvec", 707 + "utf8_iter", 708 + ] 709 + 710 + [[package]] 711 + name = "idna_adapter" 712 + version = "1.2.0" 713 + source = "registry+https://github.com/rust-lang/crates.io-index" 714 + checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 715 + dependencies = [ 716 + "icu_normalizer", 717 + "icu_properties", 718 + ] 719 + 720 + [[package]] 721 + name = "indexmap" 722 + version = "2.6.0" 723 + source = "registry+https://github.com/rust-lang/crates.io-index" 724 + checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" 725 + dependencies = [ 726 + "equivalent", 727 + "hashbrown", 728 + ] 729 + 730 + [[package]] 731 + name = "ipld-core" 732 + version = "0.4.1" 733 + source = "registry+https://github.com/rust-lang/crates.io-index" 734 + checksum = "b4ede82a79e134f179f4b29b5fdb1eb92bd1b38c4dfea394c539051150a21b9b" 735 + dependencies = [ 736 + "cid", 737 + "serde", 738 + "serde_bytes", 739 + ] 740 + 741 + [[package]] 742 + name = "is_terminal_polyfill" 743 + version = "1.70.1" 744 + source = "registry+https://github.com/rust-lang/crates.io-index" 745 + checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 746 + 747 + [[package]] 748 + name = "itoa" 749 + version = "1.0.11" 750 + source = "registry+https://github.com/rust-lang/crates.io-index" 751 + checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 752 + 753 + [[package]] 754 + name = "jetstream-oxide" 755 + version = "0.1.0" 756 + dependencies = [ 757 + "anyhow", 758 + "async-trait", 759 + "atrium-api", 760 + "chrono", 761 + "clap", 762 + "flume", 763 + "futures-util", 764 + "log", 765 + "serde", 766 + "serde_json", 767 + "thiserror 2.0.3", 768 + "tokio", 769 + "tokio-tungstenite", 770 + "url", 771 + "zstd", 772 + ] 773 + 774 + [[package]] 775 + name = "jobserver" 776 + version = "0.1.32" 777 + source = "registry+https://github.com/rust-lang/crates.io-index" 778 + checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 779 + dependencies = [ 780 + "libc", 781 + ] 782 + 783 + [[package]] 784 + name = "js-sys" 785 + version = "0.3.72" 786 + source = "registry+https://github.com/rust-lang/crates.io-index" 787 + checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" 788 + dependencies = [ 789 + "wasm-bindgen", 790 + ] 791 + 792 + [[package]] 793 + name = "langtag" 794 + version = "0.3.4" 795 + source = "registry+https://github.com/rust-lang/crates.io-index" 796 + checksum = "ed60c85f254d6ae8450cec15eedd921efbc4d1bdf6fcf6202b9a58b403f6f805" 797 + dependencies = [ 798 + "serde", 799 + ] 800 + 801 + [[package]] 802 + name = "libc" 803 + version = "0.2.162" 804 + source = "registry+https://github.com/rust-lang/crates.io-index" 805 + checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" 806 + 807 + [[package]] 808 + name = "linux-raw-sys" 809 + version = "0.4.14" 810 + source = "registry+https://github.com/rust-lang/crates.io-index" 811 + checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 812 + 813 + [[package]] 814 + name = "litemap" 815 + version = "0.7.3" 816 + source = "registry+https://github.com/rust-lang/crates.io-index" 817 + checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" 818 + 819 + [[package]] 820 + name = "lock_api" 821 + version = "0.4.12" 822 + source = "registry+https://github.com/rust-lang/crates.io-index" 823 + checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 824 + dependencies = [ 825 + "autocfg", 826 + "scopeguard", 827 + ] 828 + 829 + [[package]] 830 + name = "log" 831 + version = "0.4.22" 832 + source = "registry+https://github.com/rust-lang/crates.io-index" 833 + checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 834 + 835 + [[package]] 836 + name = "memchr" 837 + version = "2.7.4" 838 + source = "registry+https://github.com/rust-lang/crates.io-index" 839 + checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 840 + 841 + [[package]] 842 + name = "miniz_oxide" 843 + version = "0.8.0" 844 + source = "registry+https://github.com/rust-lang/crates.io-index" 845 + checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" 846 + dependencies = [ 847 + "adler2", 848 + ] 849 + 850 + [[package]] 851 + name = "mio" 852 + version = "1.0.2" 853 + source = "registry+https://github.com/rust-lang/crates.io-index" 854 + checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" 855 + dependencies = [ 856 + "hermit-abi", 857 + "libc", 858 + "wasi", 859 + "windows-sys 0.52.0", 860 + ] 861 + 862 + [[package]] 863 + name = "multibase" 864 + version = "0.9.1" 865 + source = "registry+https://github.com/rust-lang/crates.io-index" 866 + checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" 867 + dependencies = [ 868 + "base-x", 869 + "data-encoding", 870 + "data-encoding-macro", 871 + ] 872 + 873 + [[package]] 874 + name = "multihash" 875 + version = "0.19.2" 876 + source = "registry+https://github.com/rust-lang/crates.io-index" 877 + checksum = "cc41f430805af9d1cf4adae4ed2149c759b877b01d909a1f40256188d09345d2" 878 + dependencies = [ 879 + "core2", 880 + "serde", 881 + "unsigned-varint", 882 + ] 883 + 884 + [[package]] 885 + name = "nanorand" 886 + version = "0.7.0" 887 + source = "registry+https://github.com/rust-lang/crates.io-index" 888 + checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" 889 + dependencies = [ 890 + "getrandom", 891 + ] 892 + 893 + [[package]] 894 + name = "native-tls" 895 + version = "0.2.12" 896 + source = "registry+https://github.com/rust-lang/crates.io-index" 897 + checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" 898 + dependencies = [ 899 + "libc", 900 + "log", 901 + "openssl", 902 + "openssl-probe", 903 + "openssl-sys", 904 + "schannel", 905 + "security-framework", 906 + "security-framework-sys", 907 + "tempfile", 908 + ] 909 + 910 + [[package]] 911 + name = "num-traits" 912 + version = "0.2.19" 913 + source = "registry+https://github.com/rust-lang/crates.io-index" 914 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 915 + dependencies = [ 916 + "autocfg", 917 + ] 918 + 919 + [[package]] 920 + name = "object" 921 + version = "0.36.5" 922 + source = "registry+https://github.com/rust-lang/crates.io-index" 923 + checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" 924 + dependencies = [ 925 + "memchr", 926 + ] 927 + 928 + [[package]] 929 + name = "once_cell" 930 + version = "1.20.2" 931 + source = "registry+https://github.com/rust-lang/crates.io-index" 932 + checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 933 + 934 + [[package]] 935 + name = "openssl" 936 + version = "0.10.68" 937 + source = "registry+https://github.com/rust-lang/crates.io-index" 938 + checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" 939 + dependencies = [ 940 + "bitflags", 941 + "cfg-if", 942 + "foreign-types", 943 + "libc", 944 + "once_cell", 945 + "openssl-macros", 946 + "openssl-sys", 947 + ] 948 + 949 + [[package]] 950 + name = "openssl-macros" 951 + version = "0.1.1" 952 + source = "registry+https://github.com/rust-lang/crates.io-index" 953 + checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 954 + dependencies = [ 955 + "proc-macro2", 956 + "quote", 957 + "syn 2.0.87", 958 + ] 959 + 960 + [[package]] 961 + name = "openssl-probe" 962 + version = "0.1.5" 963 + source = "registry+https://github.com/rust-lang/crates.io-index" 964 + checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 965 + 966 + [[package]] 967 + name = "openssl-src" 968 + version = "300.4.0+3.4.0" 969 + source = "registry+https://github.com/rust-lang/crates.io-index" 970 + checksum = "a709e02f2b4aca747929cca5ed248880847c650233cf8b8cdc48f40aaf4898a6" 971 + dependencies = [ 972 + "cc", 973 + ] 974 + 975 + [[package]] 976 + name = "openssl-sys" 977 + version = "0.9.104" 978 + source = "registry+https://github.com/rust-lang/crates.io-index" 979 + checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" 980 + dependencies = [ 981 + "cc", 982 + "libc", 983 + "openssl-src", 984 + "pkg-config", 985 + "vcpkg", 986 + ] 987 + 988 + [[package]] 989 + name = "parking_lot" 990 + version = "0.12.3" 991 + source = "registry+https://github.com/rust-lang/crates.io-index" 992 + checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 993 + dependencies = [ 994 + "lock_api", 995 + "parking_lot_core", 996 + ] 997 + 998 + [[package]] 999 + name = "parking_lot_core" 1000 + version = "0.9.10" 1001 + source = "registry+https://github.com/rust-lang/crates.io-index" 1002 + checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1003 + dependencies = [ 1004 + "cfg-if", 1005 + "libc", 1006 + "redox_syscall", 1007 + "smallvec", 1008 + "windows-targets", 1009 + ] 1010 + 1011 + [[package]] 1012 + name = "percent-encoding" 1013 + version = "2.3.1" 1014 + source = "registry+https://github.com/rust-lang/crates.io-index" 1015 + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1016 + 1017 + [[package]] 1018 + name = "pin-project-lite" 1019 + version = "0.2.15" 1020 + source = "registry+https://github.com/rust-lang/crates.io-index" 1021 + checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" 1022 + 1023 + [[package]] 1024 + name = "pin-utils" 1025 + version = "0.1.0" 1026 + source = "registry+https://github.com/rust-lang/crates.io-index" 1027 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1028 + 1029 + [[package]] 1030 + name = "pkg-config" 1031 + version = "0.3.31" 1032 + source = "registry+https://github.com/rust-lang/crates.io-index" 1033 + checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 1034 + 1035 + [[package]] 1036 + name = "ppv-lite86" 1037 + version = "0.2.20" 1038 + source = "registry+https://github.com/rust-lang/crates.io-index" 1039 + checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1040 + dependencies = [ 1041 + "zerocopy", 1042 + ] 1043 + 1044 + [[package]] 1045 + name = "proc-macro2" 1046 + version = "1.0.89" 1047 + source = "registry+https://github.com/rust-lang/crates.io-index" 1048 + checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" 1049 + dependencies = [ 1050 + "unicode-ident", 1051 + ] 1052 + 1053 + [[package]] 1054 + name = "quote" 1055 + version = "1.0.37" 1056 + source = "registry+https://github.com/rust-lang/crates.io-index" 1057 + checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" 1058 + dependencies = [ 1059 + "proc-macro2", 1060 + ] 1061 + 1062 + [[package]] 1063 + name = "rand" 1064 + version = "0.8.5" 1065 + source = "registry+https://github.com/rust-lang/crates.io-index" 1066 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1067 + dependencies = [ 1068 + "libc", 1069 + "rand_chacha", 1070 + "rand_core", 1071 + ] 1072 + 1073 + [[package]] 1074 + name = "rand_chacha" 1075 + version = "0.3.1" 1076 + source = "registry+https://github.com/rust-lang/crates.io-index" 1077 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1078 + dependencies = [ 1079 + "ppv-lite86", 1080 + "rand_core", 1081 + ] 1082 + 1083 + [[package]] 1084 + name = "rand_core" 1085 + version = "0.6.4" 1086 + source = "registry+https://github.com/rust-lang/crates.io-index" 1087 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1088 + dependencies = [ 1089 + "getrandom", 1090 + ] 1091 + 1092 + [[package]] 1093 + name = "redox_syscall" 1094 + version = "0.5.7" 1095 + source = "registry+https://github.com/rust-lang/crates.io-index" 1096 + checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" 1097 + dependencies = [ 1098 + "bitflags", 1099 + ] 1100 + 1101 + [[package]] 1102 + name = "regex" 1103 + version = "1.11.1" 1104 + source = "registry+https://github.com/rust-lang/crates.io-index" 1105 + checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1106 + dependencies = [ 1107 + "aho-corasick", 1108 + "memchr", 1109 + "regex-automata", 1110 + "regex-syntax", 1111 + ] 1112 + 1113 + [[package]] 1114 + name = "regex-automata" 1115 + version = "0.4.9" 1116 + source = "registry+https://github.com/rust-lang/crates.io-index" 1117 + checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1118 + dependencies = [ 1119 + "aho-corasick", 1120 + "memchr", 1121 + "regex-syntax", 1122 + ] 1123 + 1124 + [[package]] 1125 + name = "regex-syntax" 1126 + version = "0.8.5" 1127 + source = "registry+https://github.com/rust-lang/crates.io-index" 1128 + checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1129 + 1130 + [[package]] 1131 + name = "rustc-demangle" 1132 + version = "0.1.24" 1133 + source = "registry+https://github.com/rust-lang/crates.io-index" 1134 + checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1135 + 1136 + [[package]] 1137 + name = "rustix" 1138 + version = "0.38.40" 1139 + source = "registry+https://github.com/rust-lang/crates.io-index" 1140 + checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" 1141 + dependencies = [ 1142 + "bitflags", 1143 + "errno", 1144 + "libc", 1145 + "linux-raw-sys", 1146 + "windows-sys 0.52.0", 1147 + ] 1148 + 1149 + [[package]] 1150 + name = "ryu" 1151 + version = "1.0.18" 1152 + source = "registry+https://github.com/rust-lang/crates.io-index" 1153 + checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1154 + 1155 + [[package]] 1156 + name = "schannel" 1157 + version = "0.1.26" 1158 + source = "registry+https://github.com/rust-lang/crates.io-index" 1159 + checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" 1160 + dependencies = [ 1161 + "windows-sys 0.59.0", 1162 + ] 1163 + 1164 + [[package]] 1165 + name = "scopeguard" 1166 + version = "1.2.0" 1167 + source = "registry+https://github.com/rust-lang/crates.io-index" 1168 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1169 + 1170 + [[package]] 1171 + name = "security-framework" 1172 + version = "2.11.1" 1173 + source = "registry+https://github.com/rust-lang/crates.io-index" 1174 + checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1175 + dependencies = [ 1176 + "bitflags", 1177 + "core-foundation", 1178 + "core-foundation-sys", 1179 + "libc", 1180 + "security-framework-sys", 1181 + ] 1182 + 1183 + [[package]] 1184 + name = "security-framework-sys" 1185 + version = "2.12.1" 1186 + source = "registry+https://github.com/rust-lang/crates.io-index" 1187 + checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" 1188 + dependencies = [ 1189 + "core-foundation-sys", 1190 + "libc", 1191 + ] 1192 + 1193 + [[package]] 1194 + name = "serde" 1195 + version = "1.0.215" 1196 + source = "registry+https://github.com/rust-lang/crates.io-index" 1197 + checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" 1198 + dependencies = [ 1199 + "serde_derive", 1200 + ] 1201 + 1202 + [[package]] 1203 + name = "serde_bytes" 1204 + version = "0.11.15" 1205 + source = "registry+https://github.com/rust-lang/crates.io-index" 1206 + checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" 1207 + dependencies = [ 1208 + "serde", 1209 + ] 1210 + 1211 + [[package]] 1212 + name = "serde_derive" 1213 + version = "1.0.215" 1214 + source = "registry+https://github.com/rust-lang/crates.io-index" 1215 + checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" 1216 + dependencies = [ 1217 + "proc-macro2", 1218 + "quote", 1219 + "syn 2.0.87", 1220 + ] 1221 + 1222 + [[package]] 1223 + name = "serde_html_form" 1224 + version = "0.2.6" 1225 + source = "registry+https://github.com/rust-lang/crates.io-index" 1226 + checksum = "8de514ef58196f1fc96dcaef80fe6170a1ce6215df9687a93fe8300e773fefc5" 1227 + dependencies = [ 1228 + "form_urlencoded", 1229 + "indexmap", 1230 + "itoa", 1231 + "ryu", 1232 + "serde", 1233 + ] 1234 + 1235 + [[package]] 1236 + name = "serde_json" 1237 + version = "1.0.132" 1238 + source = "registry+https://github.com/rust-lang/crates.io-index" 1239 + checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" 1240 + dependencies = [ 1241 + "itoa", 1242 + "memchr", 1243 + "ryu", 1244 + "serde", 1245 + ] 1246 + 1247 + [[package]] 1248 + name = "sha1" 1249 + version = "0.10.6" 1250 + source = "registry+https://github.com/rust-lang/crates.io-index" 1251 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1252 + dependencies = [ 1253 + "cfg-if", 1254 + "cpufeatures", 1255 + "digest", 1256 + ] 1257 + 1258 + [[package]] 1259 + name = "shlex" 1260 + version = "1.3.0" 1261 + source = "registry+https://github.com/rust-lang/crates.io-index" 1262 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1263 + 1264 + [[package]] 1265 + name = "signal-hook-registry" 1266 + version = "1.4.2" 1267 + source = "registry+https://github.com/rust-lang/crates.io-index" 1268 + checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1269 + dependencies = [ 1270 + "libc", 1271 + ] 1272 + 1273 + [[package]] 1274 + name = "slab" 1275 + version = "0.4.9" 1276 + source = "registry+https://github.com/rust-lang/crates.io-index" 1277 + checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1278 + dependencies = [ 1279 + "autocfg", 1280 + ] 1281 + 1282 + [[package]] 1283 + name = "smallvec" 1284 + version = "1.13.2" 1285 + source = "registry+https://github.com/rust-lang/crates.io-index" 1286 + checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1287 + 1288 + [[package]] 1289 + name = "socket2" 1290 + version = "0.5.7" 1291 + source = "registry+https://github.com/rust-lang/crates.io-index" 1292 + checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 1293 + dependencies = [ 1294 + "libc", 1295 + "windows-sys 0.52.0", 1296 + ] 1297 + 1298 + [[package]] 1299 + name = "spin" 1300 + version = "0.9.8" 1301 + source = "registry+https://github.com/rust-lang/crates.io-index" 1302 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1303 + dependencies = [ 1304 + "lock_api", 1305 + ] 1306 + 1307 + [[package]] 1308 + name = "stable_deref_trait" 1309 + version = "1.2.0" 1310 + source = "registry+https://github.com/rust-lang/crates.io-index" 1311 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1312 + 1313 + [[package]] 1314 + name = "strsim" 1315 + version = "0.11.1" 1316 + source = "registry+https://github.com/rust-lang/crates.io-index" 1317 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1318 + 1319 + [[package]] 1320 + name = "syn" 1321 + version = "1.0.109" 1322 + source = "registry+https://github.com/rust-lang/crates.io-index" 1323 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1324 + dependencies = [ 1325 + "proc-macro2", 1326 + "quote", 1327 + "unicode-ident", 1328 + ] 1329 + 1330 + [[package]] 1331 + name = "syn" 1332 + version = "2.0.87" 1333 + source = "registry+https://github.com/rust-lang/crates.io-index" 1334 + checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" 1335 + dependencies = [ 1336 + "proc-macro2", 1337 + "quote", 1338 + "unicode-ident", 1339 + ] 1340 + 1341 + [[package]] 1342 + name = "synstructure" 1343 + version = "0.13.1" 1344 + source = "registry+https://github.com/rust-lang/crates.io-index" 1345 + checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1346 + dependencies = [ 1347 + "proc-macro2", 1348 + "quote", 1349 + "syn 2.0.87", 1350 + ] 1351 + 1352 + [[package]] 1353 + name = "tempfile" 1354 + version = "3.14.0" 1355 + source = "registry+https://github.com/rust-lang/crates.io-index" 1356 + checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" 1357 + dependencies = [ 1358 + "cfg-if", 1359 + "fastrand", 1360 + "once_cell", 1361 + "rustix", 1362 + "windows-sys 0.59.0", 1363 + ] 1364 + 1365 + [[package]] 1366 + name = "thiserror" 1367 + version = "1.0.69" 1368 + source = "registry+https://github.com/rust-lang/crates.io-index" 1369 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1370 + dependencies = [ 1371 + "thiserror-impl 1.0.69", 1372 + ] 1373 + 1374 + [[package]] 1375 + name = "thiserror" 1376 + version = "2.0.3" 1377 + source = "registry+https://github.com/rust-lang/crates.io-index" 1378 + checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" 1379 + dependencies = [ 1380 + "thiserror-impl 2.0.3", 1381 + ] 1382 + 1383 + [[package]] 1384 + name = "thiserror-impl" 1385 + version = "1.0.69" 1386 + source = "registry+https://github.com/rust-lang/crates.io-index" 1387 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1388 + dependencies = [ 1389 + "proc-macro2", 1390 + "quote", 1391 + "syn 2.0.87", 1392 + ] 1393 + 1394 + [[package]] 1395 + name = "thiserror-impl" 1396 + version = "2.0.3" 1397 + source = "registry+https://github.com/rust-lang/crates.io-index" 1398 + checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" 1399 + dependencies = [ 1400 + "proc-macro2", 1401 + "quote", 1402 + "syn 2.0.87", 1403 + ] 1404 + 1405 + [[package]] 1406 + name = "tinystr" 1407 + version = "0.7.6" 1408 + source = "registry+https://github.com/rust-lang/crates.io-index" 1409 + checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1410 + dependencies = [ 1411 + "displaydoc", 1412 + "zerovec", 1413 + ] 1414 + 1415 + [[package]] 1416 + name = "tokio" 1417 + version = "1.41.1" 1418 + source = "registry+https://github.com/rust-lang/crates.io-index" 1419 + checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" 1420 + dependencies = [ 1421 + "backtrace", 1422 + "bytes", 1423 + "libc", 1424 + "mio", 1425 + "parking_lot", 1426 + "pin-project-lite", 1427 + "signal-hook-registry", 1428 + "socket2", 1429 + "tokio-macros", 1430 + "windows-sys 0.52.0", 1431 + ] 1432 + 1433 + [[package]] 1434 + name = "tokio-macros" 1435 + version = "2.4.0" 1436 + source = "registry+https://github.com/rust-lang/crates.io-index" 1437 + checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" 1438 + dependencies = [ 1439 + "proc-macro2", 1440 + "quote", 1441 + "syn 2.0.87", 1442 + ] 1443 + 1444 + [[package]] 1445 + name = "tokio-native-tls" 1446 + version = "0.3.1" 1447 + source = "registry+https://github.com/rust-lang/crates.io-index" 1448 + checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1449 + dependencies = [ 1450 + "native-tls", 1451 + "tokio", 1452 + ] 1453 + 1454 + [[package]] 1455 + name = "tokio-tungstenite" 1456 + version = "0.24.0" 1457 + source = "registry+https://github.com/rust-lang/crates.io-index" 1458 + checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" 1459 + dependencies = [ 1460 + "futures-util", 1461 + "log", 1462 + "native-tls", 1463 + "tokio", 1464 + "tokio-native-tls", 1465 + "tungstenite", 1466 + ] 1467 + 1468 + [[package]] 1469 + name = "trait-variant" 1470 + version = "0.1.2" 1471 + source = "registry+https://github.com/rust-lang/crates.io-index" 1472 + checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" 1473 + dependencies = [ 1474 + "proc-macro2", 1475 + "quote", 1476 + "syn 2.0.87", 1477 + ] 1478 + 1479 + [[package]] 1480 + name = "tungstenite" 1481 + version = "0.24.0" 1482 + source = "registry+https://github.com/rust-lang/crates.io-index" 1483 + checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" 1484 + dependencies = [ 1485 + "byteorder", 1486 + "bytes", 1487 + "data-encoding", 1488 + "http", 1489 + "httparse", 1490 + "log", 1491 + "native-tls", 1492 + "rand", 1493 + "sha1", 1494 + "thiserror 1.0.69", 1495 + "url", 1496 + "utf-8", 1497 + ] 1498 + 1499 + [[package]] 1500 + name = "typenum" 1501 + version = "1.17.0" 1502 + source = "registry+https://github.com/rust-lang/crates.io-index" 1503 + checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1504 + 1505 + [[package]] 1506 + name = "unicode-ident" 1507 + version = "1.0.13" 1508 + source = "registry+https://github.com/rust-lang/crates.io-index" 1509 + checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" 1510 + 1511 + [[package]] 1512 + name = "unsigned-varint" 1513 + version = "0.8.0" 1514 + source = "registry+https://github.com/rust-lang/crates.io-index" 1515 + checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" 1516 + 1517 + [[package]] 1518 + name = "url" 1519 + version = "2.5.3" 1520 + source = "registry+https://github.com/rust-lang/crates.io-index" 1521 + checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" 1522 + dependencies = [ 1523 + "form_urlencoded", 1524 + "idna", 1525 + "percent-encoding", 1526 + ] 1527 + 1528 + [[package]] 1529 + name = "utf-8" 1530 + version = "0.7.6" 1531 + source = "registry+https://github.com/rust-lang/crates.io-index" 1532 + checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 1533 + 1534 + [[package]] 1535 + name = "utf16_iter" 1536 + version = "1.0.5" 1537 + source = "registry+https://github.com/rust-lang/crates.io-index" 1538 + checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 1539 + 1540 + [[package]] 1541 + name = "utf8_iter" 1542 + version = "1.0.4" 1543 + source = "registry+https://github.com/rust-lang/crates.io-index" 1544 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1545 + 1546 + [[package]] 1547 + name = "utf8parse" 1548 + version = "0.2.2" 1549 + source = "registry+https://github.com/rust-lang/crates.io-index" 1550 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1551 + 1552 + [[package]] 1553 + name = "vcpkg" 1554 + version = "0.2.15" 1555 + source = "registry+https://github.com/rust-lang/crates.io-index" 1556 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1557 + 1558 + [[package]] 1559 + name = "version_check" 1560 + version = "0.9.5" 1561 + source = "registry+https://github.com/rust-lang/crates.io-index" 1562 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1563 + 1564 + [[package]] 1565 + name = "wasi" 1566 + version = "0.11.0+wasi-snapshot-preview1" 1567 + source = "registry+https://github.com/rust-lang/crates.io-index" 1568 + checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1569 + 1570 + [[package]] 1571 + name = "wasm-bindgen" 1572 + version = "0.2.95" 1573 + source = "registry+https://github.com/rust-lang/crates.io-index" 1574 + checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" 1575 + dependencies = [ 1576 + "cfg-if", 1577 + "once_cell", 1578 + "wasm-bindgen-macro", 1579 + ] 1580 + 1581 + [[package]] 1582 + name = "wasm-bindgen-backend" 1583 + version = "0.2.95" 1584 + source = "registry+https://github.com/rust-lang/crates.io-index" 1585 + checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" 1586 + dependencies = [ 1587 + "bumpalo", 1588 + "log", 1589 + "once_cell", 1590 + "proc-macro2", 1591 + "quote", 1592 + "syn 2.0.87", 1593 + "wasm-bindgen-shared", 1594 + ] 1595 + 1596 + [[package]] 1597 + name = "wasm-bindgen-macro" 1598 + version = "0.2.95" 1599 + source = "registry+https://github.com/rust-lang/crates.io-index" 1600 + checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" 1601 + dependencies = [ 1602 + "quote", 1603 + "wasm-bindgen-macro-support", 1604 + ] 1605 + 1606 + [[package]] 1607 + name = "wasm-bindgen-macro-support" 1608 + version = "0.2.95" 1609 + source = "registry+https://github.com/rust-lang/crates.io-index" 1610 + checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" 1611 + dependencies = [ 1612 + "proc-macro2", 1613 + "quote", 1614 + "syn 2.0.87", 1615 + "wasm-bindgen-backend", 1616 + "wasm-bindgen-shared", 1617 + ] 1618 + 1619 + [[package]] 1620 + name = "wasm-bindgen-shared" 1621 + version = "0.2.95" 1622 + source = "registry+https://github.com/rust-lang/crates.io-index" 1623 + checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" 1624 + 1625 + [[package]] 1626 + name = "windows-core" 1627 + version = "0.52.0" 1628 + source = "registry+https://github.com/rust-lang/crates.io-index" 1629 + checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 1630 + dependencies = [ 1631 + "windows-targets", 1632 + ] 1633 + 1634 + [[package]] 1635 + name = "windows-sys" 1636 + version = "0.52.0" 1637 + source = "registry+https://github.com/rust-lang/crates.io-index" 1638 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1639 + dependencies = [ 1640 + "windows-targets", 1641 + ] 1642 + 1643 + [[package]] 1644 + name = "windows-sys" 1645 + version = "0.59.0" 1646 + source = "registry+https://github.com/rust-lang/crates.io-index" 1647 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1648 + dependencies = [ 1649 + "windows-targets", 1650 + ] 1651 + 1652 + [[package]] 1653 + name = "windows-targets" 1654 + version = "0.52.6" 1655 + source = "registry+https://github.com/rust-lang/crates.io-index" 1656 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1657 + dependencies = [ 1658 + "windows_aarch64_gnullvm", 1659 + "windows_aarch64_msvc", 1660 + "windows_i686_gnu", 1661 + "windows_i686_gnullvm", 1662 + "windows_i686_msvc", 1663 + "windows_x86_64_gnu", 1664 + "windows_x86_64_gnullvm", 1665 + "windows_x86_64_msvc", 1666 + ] 1667 + 1668 + [[package]] 1669 + name = "windows_aarch64_gnullvm" 1670 + version = "0.52.6" 1671 + source = "registry+https://github.com/rust-lang/crates.io-index" 1672 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1673 + 1674 + [[package]] 1675 + name = "windows_aarch64_msvc" 1676 + version = "0.52.6" 1677 + source = "registry+https://github.com/rust-lang/crates.io-index" 1678 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1679 + 1680 + [[package]] 1681 + name = "windows_i686_gnu" 1682 + version = "0.52.6" 1683 + source = "registry+https://github.com/rust-lang/crates.io-index" 1684 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1685 + 1686 + [[package]] 1687 + name = "windows_i686_gnullvm" 1688 + version = "0.52.6" 1689 + source = "registry+https://github.com/rust-lang/crates.io-index" 1690 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1691 + 1692 + [[package]] 1693 + name = "windows_i686_msvc" 1694 + version = "0.52.6" 1695 + source = "registry+https://github.com/rust-lang/crates.io-index" 1696 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1697 + 1698 + [[package]] 1699 + name = "windows_x86_64_gnu" 1700 + version = "0.52.6" 1701 + source = "registry+https://github.com/rust-lang/crates.io-index" 1702 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1703 + 1704 + [[package]] 1705 + name = "windows_x86_64_gnullvm" 1706 + version = "0.52.6" 1707 + source = "registry+https://github.com/rust-lang/crates.io-index" 1708 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1709 + 1710 + [[package]] 1711 + name = "windows_x86_64_msvc" 1712 + version = "0.52.6" 1713 + source = "registry+https://github.com/rust-lang/crates.io-index" 1714 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1715 + 1716 + [[package]] 1717 + name = "write16" 1718 + version = "1.0.0" 1719 + source = "registry+https://github.com/rust-lang/crates.io-index" 1720 + checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 1721 + 1722 + [[package]] 1723 + name = "writeable" 1724 + version = "0.5.5" 1725 + source = "registry+https://github.com/rust-lang/crates.io-index" 1726 + checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 1727 + 1728 + [[package]] 1729 + name = "yoke" 1730 + version = "0.7.4" 1731 + source = "registry+https://github.com/rust-lang/crates.io-index" 1732 + checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" 1733 + dependencies = [ 1734 + "serde", 1735 + "stable_deref_trait", 1736 + "yoke-derive", 1737 + "zerofrom", 1738 + ] 1739 + 1740 + [[package]] 1741 + name = "yoke-derive" 1742 + version = "0.7.4" 1743 + source = "registry+https://github.com/rust-lang/crates.io-index" 1744 + checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" 1745 + dependencies = [ 1746 + "proc-macro2", 1747 + "quote", 1748 + "syn 2.0.87", 1749 + "synstructure", 1750 + ] 1751 + 1752 + [[package]] 1753 + name = "zerocopy" 1754 + version = "0.7.35" 1755 + source = "registry+https://github.com/rust-lang/crates.io-index" 1756 + checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 1757 + dependencies = [ 1758 + "byteorder", 1759 + "zerocopy-derive", 1760 + ] 1761 + 1762 + [[package]] 1763 + name = "zerocopy-derive" 1764 + version = "0.7.35" 1765 + source = "registry+https://github.com/rust-lang/crates.io-index" 1766 + checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 1767 + dependencies = [ 1768 + "proc-macro2", 1769 + "quote", 1770 + "syn 2.0.87", 1771 + ] 1772 + 1773 + [[package]] 1774 + name = "zerofrom" 1775 + version = "0.1.4" 1776 + source = "registry+https://github.com/rust-lang/crates.io-index" 1777 + checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" 1778 + dependencies = [ 1779 + "zerofrom-derive", 1780 + ] 1781 + 1782 + [[package]] 1783 + name = "zerofrom-derive" 1784 + version = "0.1.4" 1785 + source = "registry+https://github.com/rust-lang/crates.io-index" 1786 + checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" 1787 + dependencies = [ 1788 + "proc-macro2", 1789 + "quote", 1790 + "syn 2.0.87", 1791 + "synstructure", 1792 + ] 1793 + 1794 + [[package]] 1795 + name = "zerovec" 1796 + version = "0.10.4" 1797 + source = "registry+https://github.com/rust-lang/crates.io-index" 1798 + checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 1799 + dependencies = [ 1800 + "yoke", 1801 + "zerofrom", 1802 + "zerovec-derive", 1803 + ] 1804 + 1805 + [[package]] 1806 + name = "zerovec-derive" 1807 + version = "0.10.3" 1808 + source = "registry+https://github.com/rust-lang/crates.io-index" 1809 + checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 1810 + dependencies = [ 1811 + "proc-macro2", 1812 + "quote", 1813 + "syn 2.0.87", 1814 + ] 1815 + 1816 + [[package]] 1817 + name = "zstd" 1818 + version = "0.13.2" 1819 + source = "registry+https://github.com/rust-lang/crates.io-index" 1820 + checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" 1821 + dependencies = [ 1822 + "zstd-safe", 1823 + ] 1824 + 1825 + [[package]] 1826 + name = "zstd-safe" 1827 + version = "7.2.1" 1828 + source = "registry+https://github.com/rust-lang/crates.io-index" 1829 + checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" 1830 + dependencies = [ 1831 + "zstd-sys", 1832 + ] 1833 + 1834 + [[package]] 1835 + name = "zstd-sys" 1836 + version = "2.0.13+zstd.1.5.6" 1837 + source = "registry+https://github.com/rust-lang/crates.io-index" 1838 + checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" 1839 + dependencies = [ 1840 + "cc", 1841 + "pkg-config", 1842 + ]
+23
Cargo.toml
··· 1 + [package] 2 + name = "jetstream-oxide" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [dependencies] 7 + async-trait = "0.1.83" 8 + atrium-api = { version = "0.24.7", default-features = false, features = ["namespace-appbsky"] } 9 + tokio = { version = "1.41.1", features = ["full", "sync"] } 10 + tokio-tungstenite = { version = "0.24.0", features = ["connect", "native-tls-vendored", "url"] } 11 + futures-util = "0.3.31" 12 + url = "2.5.3" 13 + serde = { version = "1.0.215", features = ["derive"] } 14 + serde_json = "1.0.132" 15 + chrono = "0.4.38" 16 + zstd = "0.13.2" 17 + thiserror = "2.0.3" 18 + flume = "0.11.1" 19 + log = "0.4.22" 20 + 21 + [dev-dependencies] 22 + anyhow = "1.0.93" 23 + clap = { version = "4.5.20", features = ["derive"] }
+29
README.md
··· 1 + # jetstream-oxide 2 + 3 + A typed Rust library for easily interacting with and consuming the 4 + Bluesky [Jetstream](https://github.com/bluesky-social/jetstream) 5 + service. 6 + 7 + # Example 8 + 9 + A small example CLI utility to show how to use this crate can be found in the `examples` directory. To run it, use the 10 + following command: 11 + 12 + ```sh 13 + cargo run --example basic -- --nsid "app.bsky.feed.post" 14 + ``` 15 + 16 + This will display a real-time feed of every single post that is being made or deleted in the entire Bluesky network, 17 + right in your terminal! 18 + 19 + You can filter it down to just specific accounts like this: 20 + 21 + ```sh 22 + cargo run --example basic -- \ 23 + --nsid "app.bsky.feed.post" \ 24 + --did "did:plc:inze6wrmsm7pjl7yta3oig77" 25 + ``` 26 + 27 + This listens for posts that *I personally make*. You can substitute your own DID and make a few test posts yourself if 28 + you'd 29 + like of course!
+72
examples/basic.rs
··· 1 + //! A very basic example of how to listen for create/delete events on a specific DID and NSID. 2 + 3 + use atrium_api::{ 4 + record::KnownRecord::AppBskyFeedPost, 5 + types::string, 6 + }; 7 + use clap::Parser; 8 + use jetstream_oxide::{ 9 + events::{ 10 + commit::CommitEvent, 11 + JetstreamEvent::Commit, 12 + }, 13 + DefaultJetstreamEndpoints, 14 + JetstreamCompression, 15 + JetstreamConfig, 16 + JetstreamConnector, 17 + }; 18 + 19 + #[derive(Parser, Debug)] 20 + #[command(version, about, long_about = None)] 21 + struct Args { 22 + /// The DIDs to listen for events on, if not provided we will listen for all DIDs. 23 + #[arg(short, long)] 24 + did: Option<Vec<string::Did>>, 25 + /// The NSID for the collection to listen for (e.g. `app.bsky.feed.post`). 26 + #[arg(short, long)] 27 + nsid: string::Nsid, 28 + } 29 + 30 + #[tokio::main] 31 + async fn main() -> anyhow::Result<()> { 32 + let args = Args::parse(); 33 + 34 + let dids = args.did.unwrap_or_default(); 35 + let config = JetstreamConfig { 36 + endpoint: DefaultJetstreamEndpoints::USEastOne.into(), 37 + wanted_collections: vec![args.nsid.clone()], 38 + wanted_dids: dids.clone(), 39 + compression: JetstreamCompression::Zstd, 40 + cursor: None, 41 + }; 42 + 43 + let jetstream = JetstreamConnector::new(config)?; 44 + let (receiver, _) = jetstream.connect().await?; 45 + 46 + println!( 47 + "Listening for '{}' events on DIDs: {:?}", 48 + args.nsid.to_string(), 49 + dids, 50 + ); 51 + 52 + while let Ok(event) = receiver.recv_async().await { 53 + if let Commit(commit) = event { 54 + match commit { 55 + CommitEvent::Create { info: _, commit } => { 56 + if let AppBskyFeedPost(record) = commit.record { 57 + println!( 58 + "New post created! ({})\n\n'{}'", 59 + commit.info.rkey, record.text 60 + ); 61 + } 62 + } 63 + CommitEvent::Delete { info: _, commit } => { 64 + println!("A post has been deleted. ({})", commit.rkey); 65 + } 66 + _ => {} 67 + } 68 + } 69 + } 70 + 71 + Ok(()) 72 + }
+6
rustfmt.toml
··· 1 + group_imports = "StdExternalCrate" 2 + comment_width = 100 3 + format_code_in_doc_comments = true 4 + imports_granularity = "Crate" 5 + imports_layout = "Vertical" 6 + wrap_comments = true
+44
src/error.rs
··· 1 + ///! Various error types. 2 + use std::io; 3 + 4 + 5 + use thiserror::Error; 6 + 7 + /// Possible errors that can occur when a [JetstreamConfig](crate::JetstreamConfig) that is passed 8 + /// to a [JetstreamConnector](crate::JetstreamConnector) is invalid. 9 + #[derive(Error, Debug)] 10 + pub enum ConfigValidationError { 11 + #[error("too many wanted collections: {0} > 100")] 12 + TooManyWantedCollections(usize), 13 + #[error("too many wanted DIDs: {0} > 10,000")] 14 + TooManyDids(usize), 15 + } 16 + 17 + /// Possible errors that can occur in the process of connecting to a Jetstream instance over 18 + /// WebSockets. 19 + /// 20 + /// See [JetstreamConnector::connect](crate::JetstreamConnector::connect). 21 + #[derive(Error, Debug)] 22 + pub enum ConnectionError { 23 + #[error("invalid endpoint: {0}")] 24 + InvalidEndpoint(#[from] url::ParseError), 25 + #[error("failed to connect to Jetstream instance: {0}")] 26 + WebSocketFailure(#[from] tokio_tungstenite::tungstenite::Error), 27 + #[error("the Jetstream config is invalid (this really should not happen here): {0}")] 28 + InvalidConfig(#[from] ConfigValidationError), 29 + } 30 + 31 + /// Possible errors that can occur when receiving events from a Jetstream instance over WebSockets. 32 + /// 33 + /// See [websocket_task](crate::websocket_task). 34 + #[derive(Error, Debug)] 35 + pub enum JetstreamEventError { 36 + #[error("received websocket message that could not be deserialized as JSON: {0}")] 37 + ReceivedMalformedJSON(#[from] serde_json::Error), 38 + #[error("failed to load built-in zstd dictionary for decoding: {0}")] 39 + CompressionDictionaryError(io::Error), 40 + #[error("failed to decode zstd-compressed message: {0}")] 41 + CompressionDecoderError(io::Error), 42 + #[error("all receivers were dropped but the websocket connection failed to close cleanly")] 43 + WebSocketCloseFailure, 44 + }
+40
src/events/account.rs
··· 1 + use chrono::Utc; 2 + use serde::Deserialize; 3 + 4 + use crate::{ 5 + events::EventInfo, 6 + exports, 7 + }; 8 + 9 + /// An event representing a change to an account. 10 + #[derive(Deserialize, Debug)] 11 + pub struct AccountEvent { 12 + /// Basic metadata included with every event. 13 + #[serde(flatten)] 14 + pub info: EventInfo, 15 + /// Account specific data bundled with this event. 16 + pub account: AccountData, 17 + } 18 + 19 + /// Account specific data bundled with an account event. 20 + #[derive(Deserialize, Debug)] 21 + pub struct AccountData { 22 + /// Whether the account is currently active. 23 + pub active: bool, 24 + /// The DID of the account. 25 + pub did: exports::Did, 26 + pub seq: u64, 27 + pub time: chrono::DateTime<Utc>, 28 + /// If `active` is `false` this will be present to explain why the account is inactive. 29 + pub status: Option<AccountStatus>, 30 + } 31 + 32 + /// The possible reasons an account might be listed as inactive. 33 + #[derive(Deserialize, Debug)] 34 + #[serde(rename_all = "lowercase")] 35 + pub enum AccountStatus { 36 + Deactivated, 37 + Deleted, 38 + Suspended, 39 + TakenDown, 40 + }
+61
src/events/commit.rs
··· 1 + use atrium_api::record::KnownRecord; 2 + use serde::Deserialize; 3 + 4 + use crate::{ 5 + events::EventInfo, 6 + exports, 7 + }; 8 + 9 + /// An event representing a repo commit, which can be a `create`, `update`, or `delete` operation. 10 + #[derive(Deserialize, Debug)] 11 + #[serde(untagged, rename_all = "snake_case")] 12 + pub enum CommitEvent { 13 + Create { 14 + #[serde(flatten)] 15 + info: EventInfo, 16 + commit: CommitData, 17 + }, 18 + Update { 19 + #[serde(flatten)] 20 + info: EventInfo, 21 + commit: CommitData, 22 + }, 23 + Delete { 24 + #[serde(flatten)] 25 + info: EventInfo, 26 + commit: CommitInfo, 27 + }, 28 + } 29 + 30 + /// The type of commit operation that was performed. 31 + #[derive(Deserialize, Debug)] 32 + #[serde(rename_all = "snake_case")] 33 + pub enum CommitType { 34 + Create, 35 + Update, 36 + Delete, 37 + } 38 + 39 + /// Basic commit specific info bundled with every event, also the only data included with a `delete` 40 + /// operation. 41 + #[derive(Deserialize, Debug)] 42 + pub struct CommitInfo { 43 + /// The type of commit operation that was performed. 44 + pub operation: CommitType, 45 + pub rev: String, 46 + pub rkey: String, 47 + /// The NSID of the record type that this commit is associated with. 48 + pub collection: exports::Nsid, 49 + } 50 + 51 + /// Detailed data bundled with a commit event. This data is only included when the event is 52 + /// `create` or `update`. 53 + #[derive(Deserialize, Debug)] 54 + pub struct CommitData { 55 + #[serde(flatten)] 56 + pub info: CommitInfo, 57 + /// The CID of the record that was operated on. 58 + pub cid: exports::Cid, 59 + /// The record that was operated on. 60 + pub record: KnownRecord, 61 + }
+28
src/events/identity.rs
··· 1 + use chrono::Utc; 2 + use serde::Deserialize; 3 + 4 + use crate::{ 5 + events::EventInfo, 6 + exports, 7 + }; 8 + 9 + /// An event representing a change to an identity. 10 + #[derive(Deserialize, Debug)] 11 + pub struct IdentityEvent { 12 + /// Basic metadata included with every event. 13 + #[serde(flatten)] 14 + pub info: EventInfo, 15 + /// Identity specific data bundled with this event. 16 + pub identity: IdentityData, 17 + } 18 + 19 + /// Identity specific data bundled with an identity event. 20 + #[derive(Deserialize, Debug)] 21 + pub struct IdentityData { 22 + /// The DID of the identity. 23 + pub did: exports::Did, 24 + /// The handle associated with the identity. 25 + pub handle: Option<exports::Handle>, 26 + pub seq: u64, 27 + pub time: chrono::DateTime<Utc>, 28 + }
+31
src/events/mod.rs
··· 1 + pub mod account; 2 + pub mod commit; 3 + pub mod identity; 4 + 5 + use serde::Deserialize; 6 + 7 + use crate::exports; 8 + 9 + /// Basic data that is included with every event. 10 + #[derive(Deserialize, Debug)] 11 + pub struct EventInfo { 12 + pub did: exports::Did, 13 + pub time_us: u64, 14 + pub kind: EventKind, 15 + } 16 + 17 + #[derive(Deserialize, Debug)] 18 + #[serde(untagged)] 19 + pub enum JetstreamEvent { 20 + Commit(commit::CommitEvent), 21 + Identity(identity::IdentityEvent), 22 + Account(account::AccountEvent), 23 + } 24 + 25 + #[derive(Deserialize, Debug)] 26 + #[serde(rename_all = "snake_case")] 27 + pub enum EventKind { 28 + Commit, 29 + Identity, 30 + Account, 31 + }
+8
src/exports.rs
··· 1 + //! Useful exports for third-party crates used by this project. 2 + 3 + pub use atrium_api::types::string::{ 4 + Cid, 5 + Did, 6 + Handle, 7 + Nsid, 8 + };
+305
src/lib.rs
··· 1 + pub mod error; 2 + pub mod events; 3 + pub mod exports; 4 + 5 + use std::io::{ 6 + Cursor, 7 + Read, 8 + }; 9 + 10 + use chrono::Utc; 11 + use futures_util::stream::StreamExt; 12 + use tokio::{ 13 + net::TcpStream, 14 + task::JoinHandle, 15 + }; 16 + use tokio_tungstenite::{ 17 + connect_async, 18 + tungstenite::Message, 19 + MaybeTlsStream, 20 + WebSocketStream, 21 + }; 22 + use url::Url; 23 + use zstd::dict::DecoderDictionary; 24 + 25 + use crate::{ 26 + error::{ 27 + ConfigValidationError, 28 + ConnectionError, 29 + JetstreamEventError, 30 + }, 31 + events::JetstreamEvent, 32 + }; 33 + 34 + /// The Jetstream endpoints officially provided by Bluesky themselves. 35 + /// 36 + /// There are no guarantees that these endpoints will always be available, but you are free 37 + /// to run your own Jetstream instance in any case. 38 + pub enum DefaultJetstreamEndpoints { 39 + /// `jetstream1.us-east.bsky.network` 40 + USEastOne, 41 + /// `jetstream2.us-east.bsky.network` 42 + USEastTwo, 43 + /// `jetstream1.us-west.bsky.network` 44 + USWestOne, 45 + /// `jetstream2.us-west.bsky.network` 46 + USWestTwo, 47 + } 48 + 49 + impl From<DefaultJetstreamEndpoints> for String { 50 + fn from(endpoint: DefaultJetstreamEndpoints) -> Self { 51 + match endpoint { 52 + DefaultJetstreamEndpoints::USEastOne => { 53 + "wss://jetstream1.us-east.bsky.network/subscribe".to_owned() 54 + } 55 + DefaultJetstreamEndpoints::USEastTwo => { 56 + "wss://jetstream2.us-east.bsky.network/subscribe".to_owned() 57 + } 58 + DefaultJetstreamEndpoints::USWestOne => { 59 + "wss://jetstream1.us-west.bsky.network/subscribe".to_owned() 60 + } 61 + DefaultJetstreamEndpoints::USWestTwo => { 62 + "wss://jetstream2.us-west.bsky.network/subscribe".to_owned() 63 + } 64 + } 65 + } 66 + } 67 + 68 + /// The maximum number of wanted collections that can be requested on a single Jetstream connection. 69 + const MAX_WANTED_COLLECTIONS: usize = 100; 70 + /// The maximum number of wanted DIDs that can be requested on a single Jetstream connection. 71 + const MAX_WANTED_DIDS: usize = 10_000; 72 + 73 + /// The custom `zstd` dictionary used for decoding compressed Jetstream messages. 74 + /// 75 + /// Sourced from the [official Bluesky Jetstream repo.](https://github.com/bluesky-social/jetstream/tree/main/pkg/models) 76 + const JETSTREAM_ZSTD_DICTIONARY: &[u8] = include_bytes!("../zstd/dictionary"); 77 + 78 + /// A receiver channel for consuming Jetstream events. 79 + pub type JetstreamReceiver = flume::Receiver<JetstreamEvent>; 80 + 81 + /// An internal sender channel for sending Jetstream events to [JetstreamReceiver]'s. 82 + type JetstreamSender = flume::Sender<JetstreamEvent>; 83 + 84 + /// A wrapper connector type for working with a WebSocket connection to a Jetstream instance to 85 + /// receive and consume events. See [JetstreamConnector::connect] for more info. 86 + pub struct JetstreamConnector { 87 + /// The configuration for the Jetstream connection. 88 + config: JetstreamConfig, 89 + } 90 + 91 + pub enum JetstreamCompression { 92 + /// No compression, just raw plaintext JSON. 93 + None, 94 + /// Use the `zstd` compression algorithm, which can result in a ~56% smaller messages on 95 + /// average. See [here](https://github.com/bluesky-social/jetstream?tab=readme-ov-file#compression) for more info. 96 + Zstd, 97 + } 98 + 99 + impl From<JetstreamCompression> for bool { 100 + fn from(compression: JetstreamCompression) -> Self { 101 + match compression { 102 + JetstreamCompression::None => false, 103 + JetstreamCompression::Zstd => true, 104 + } 105 + } 106 + } 107 + 108 + pub struct JetstreamConfig { 109 + /// A Jetstream endpoint to connect to with a WebSocket Scheme i.e. 110 + /// `wss://jetstream1.us-east.bsky.network/subscribe`. 111 + pub endpoint: String, 112 + /// A list of collection [NSIDs](https://atproto.com/specs/nsid) to filter events for. 113 + /// 114 + /// An empty list will receive events for *all* collections. 115 + /// 116 + /// Regardless of desired collections, all subscribers receive 117 + /// [AccountEvent](events::account::AccountEvent) and 118 + /// [IdentityEvent](events::identity::Identity) events. 119 + pub wanted_collections: Vec<exports::Nsid>, 120 + /// A list of repo [DIDs](https://atproto.com/specs/did) to filter events for. 121 + /// 122 + /// An empty list will receive events for *all* repos, which is a lot of events! 123 + pub wanted_dids: Vec<exports::Did>, 124 + /// The compression algorithm to request and use for the WebSocket connection (if any). 125 + pub compression: JetstreamCompression, 126 + /// An optional timestamp to begin playback from. 127 + /// 128 + /// An absent cursor or a cursor from the future will result in live-tail operation. 129 + /// 130 + /// When reconnecting, use the time_us from your most recently processed event and maybe 131 + /// provide a negative buffer (i.e. subtract a few seconds) to ensure gapless playback. 132 + pub cursor: Option<chrono::DateTime<Utc>>, 133 + } 134 + 135 + impl Default for JetstreamConfig { 136 + fn default() -> Self { 137 + JetstreamConfig { 138 + endpoint: DefaultJetstreamEndpoints::USEastOne.into(), 139 + wanted_collections: Vec::new(), 140 + wanted_dids: Vec::new(), 141 + compression: JetstreamCompression::None, 142 + cursor: None, 143 + } 144 + } 145 + } 146 + 147 + impl JetstreamConfig { 148 + /// Constructs a new endpoint URL with the given [JetstreamConfig] applied. 149 + pub fn construct_endpoint(&self, endpoint: &String) -> Result<Url, url::ParseError> { 150 + let did_search_query = self 151 + .wanted_dids 152 + .iter() 153 + .map(|s| ("wantedDids", s.to_string())); 154 + 155 + let collection_search_query = self 156 + .wanted_collections 157 + .iter() 158 + .map(|s| ("wantedCollections", s.to_string())); 159 + 160 + let compression = ( 161 + "compress", 162 + match self.compression { 163 + JetstreamCompression::None => "false".to_owned(), 164 + JetstreamCompression::Zstd => "true".to_owned(), 165 + }, 166 + ); 167 + 168 + let cursor = self 169 + .cursor 170 + .map(|c| ("cursor", c.timestamp_micros().to_string())); 171 + 172 + let params = did_search_query 173 + .chain(collection_search_query) 174 + .chain(std::iter::once(compression)) 175 + .chain(cursor.into_iter()) 176 + .collect::<Vec<(&str, String)>>(); 177 + 178 + Url::parse_with_params(&endpoint, params) 179 + } 180 + 181 + /// Validates the configuration to make sure it is within the limits of the Jetstream API. 182 + /// 183 + /// # Constants 184 + /// The following constants are used to validate the configuration and should only be changed 185 + /// if the Jetstream API has itself changed. 186 + /// - [MAX_WANTED_COLLECTIONS] 187 + /// - [MAX_WANTED_DIDS] 188 + pub fn validate(&self) -> Result<(), ConfigValidationError> { 189 + let collections = self.wanted_collections.len(); 190 + let dids = self.wanted_dids.len(); 191 + 192 + if collections > MAX_WANTED_COLLECTIONS { 193 + return Err(ConfigValidationError::TooManyWantedCollections(collections)); 194 + } 195 + 196 + if dids > MAX_WANTED_DIDS { 197 + return Err(ConfigValidationError::TooManyDids(dids)); 198 + } 199 + 200 + Ok(()) 201 + } 202 + } 203 + 204 + impl JetstreamConnector { 205 + /// Create a Jetstream connector with a valid [JetstreamConfig]. 206 + /// 207 + /// After creation, you can call [connect] to connect to the provided Jetstream instance. 208 + pub fn new(config: JetstreamConfig) -> Result<Self, ConfigValidationError> { 209 + // We validate the configuration here so any issues are caught early. 210 + config.validate()?; 211 + Ok(JetstreamConnector { config }) 212 + } 213 + 214 + /// Connects to a Jetstream instance as defined in the [JetstreamConfig]. 215 + /// 216 + /// A [JetstreamReceiver] is returned which can be used to respond to events. When all instances 217 + /// of this receiver are dropped, the connection and task are automatically closed. 218 + pub async fn connect( 219 + &self, 220 + ) -> Result< 221 + ( 222 + JetstreamReceiver, 223 + JoinHandle<Result<(), JetstreamEventError>>, 224 + ), 225 + ConnectionError, 226 + > { 227 + // We validate the config again for good measure. Probably not necessary but it can't hurt. 228 + self.config 229 + .validate() 230 + .map_err(ConnectionError::InvalidConfig)?; 231 + 232 + // TODO: Run some benchmarks and look into using a bounded channel instead. 233 + let (send_channel, receive_channel) = flume::unbounded(); 234 + 235 + let configured_endpoint = self 236 + .config 237 + .construct_endpoint(&self.config.endpoint) 238 + .map_err(ConnectionError::InvalidEndpoint)?; 239 + 240 + let (ws_stream, _) = connect_async(&configured_endpoint) 241 + .await 242 + .map_err(ConnectionError::WebSocketFailure)?; 243 + 244 + let dict = DecoderDictionary::copy(JETSTREAM_ZSTD_DICTIONARY); 245 + 246 + // TODO: Internally creating and returning a tokio task might not be the best idea(?) 247 + let handle = tokio::task::spawn(websocket_task(dict, ws_stream, send_channel)); 248 + 249 + Ok((receive_channel, handle)) 250 + } 251 + } 252 + 253 + /// The main task that handles the WebSocket connection and sends [JetstreamEvent]'s to any 254 + /// receivers that are listening for them. 255 + async fn websocket_task( 256 + dictionary: DecoderDictionary<'_>, 257 + ws: WebSocketStream<MaybeTlsStream<TcpStream>>, 258 + send_channel: JetstreamSender, 259 + ) -> Result<(), JetstreamEventError> { 260 + // TODO: Use the write half to allow the user to change configuration settings on the fly. 261 + let (_, mut read) = ws.split(); 262 + loop { 263 + if let Some(Ok(message)) = read.next().await { 264 + match message { 265 + Message::Text(json) => { 266 + let event = serde_json::from_str::<JetstreamEvent>(&json) 267 + .map_err(JetstreamEventError::ReceivedMalformedJSON)?; 268 + 269 + if let Err(_) = send_channel.send(event) { 270 + // We can assume that all receivers have been dropped, so we can close the 271 + // connection and exit the task. 272 + log::info!( 273 + "All receivers for the Jetstream connection have been dropped, closing connection." 274 + ); 275 + return Ok(()); 276 + } 277 + } 278 + Message::Binary(zstd_json) => { 279 + let mut cursor = Cursor::new(zstd_json); 280 + let mut decoder = 281 + zstd::stream::Decoder::with_prepared_dictionary(&mut cursor, &dictionary) 282 + .map_err(JetstreamEventError::CompressionDictionaryError)?; 283 + 284 + let mut json = String::new(); 285 + decoder 286 + .read_to_string(&mut json) 287 + .map_err(JetstreamEventError::CompressionDecoderError)?; 288 + 289 + let event = serde_json::from_str::<JetstreamEvent>(&json) 290 + .map_err(JetstreamEventError::ReceivedMalformedJSON)?; 291 + 292 + if let Err(_) = send_channel.send(event) { 293 + // We can assume that all receivers have been dropped, so we can close the 294 + // connection and exit the task. 295 + log::info!( 296 + "All receivers for the Jetstream connection have been dropped, closing connection..." 297 + ); 298 + return Ok(()); 299 + } 300 + } 301 + _ => {} 302 + } 303 + } 304 + } 305 + }
zstd/dictionary

This is a binary file and will not be displayed.