├── .github └── workflows │ └── ci.yaml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile ├── README.md ├── migrations ├── 20230608124200_create_history.sql ├── 20230608124201_create_users.sql ├── 20230608124202_create_sessions.sql ├── 20230623070418_records.sql ├── 20231202170508_create-store.sql ├── 20231203124112_create-store-idx.sql ├── 20240108124837_drop-some-defaults.sql ├── 20240614104159_idx-cache.sql └── 20240621110731_user-verified.sql └── src ├── lib.rs ├── main.rs └── wrappers.rs /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: Build and push container image 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - main 8 | tags: 9 | - 'v*' 10 | 11 | env: 12 | REGISTRY: ghcr.io 13 | IMAGE_NAME: ${{ github.repository }} 14 | 15 | jobs: 16 | build-and-push-image: 17 | runs-on: ubuntu-latest 18 | permissions: 19 | contents: read 20 | packages: write 21 | 22 | steps: 23 | - name: Checkout repository 24 | uses: actions/checkout@v3 25 | 26 | - name: Log in to the Container registry 27 | uses: docker/login-action@v2 28 | with: 29 | registry: ${{ env.REGISTRY }} 30 | username: ${{ github.repository_owner }} 31 | password: ${{ secrets.GITHUB_TOKEN }} 32 | 33 | - name: Extract metadata (tags, labels) for Docker 34 | id: meta 35 | uses: docker/metadata-action@v4 36 | with: 37 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 38 | 39 | - name: Build and push Docker image 40 | uses: docker/build-push-action@v4 41 | with: 42 | context: . 43 | push: true 44 | tags: ${{ steps.meta.outputs.tags }} 45 | labels: ${{ steps.meta.outputs.labels }} 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /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.11" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 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 = "arc-swap" 64 | version = "1.7.1" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" 67 | 68 | [[package]] 69 | name = "argon2" 70 | version = "0.5.3" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" 73 | dependencies = [ 74 | "base64ct", 75 | "blake2", 76 | "cpufeatures", 77 | "password-hash", 78 | ] 79 | 80 | [[package]] 81 | name = "async-trait" 82 | version = "0.1.86" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" 85 | dependencies = [ 86 | "proc-macro2", 87 | "quote", 88 | "syn", 89 | ] 90 | 91 | [[package]] 92 | name = "atoi" 93 | version = "2.0.0" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 96 | dependencies = [ 97 | "num-traits", 98 | ] 99 | 100 | [[package]] 101 | name = "atomic-waker" 102 | version = "1.1.2" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 105 | 106 | [[package]] 107 | name = "atuin-common" 108 | version = "18.4.0" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "fcfe5f9e4757d8b0f272505fbb132fb9c78b2c8640d340071925b1ed79be70d0" 111 | dependencies = [ 112 | "base64 0.22.1", 113 | "directories", 114 | "eyre", 115 | "getrandom 0.2.15", 116 | "lazy_static", 117 | "rand", 118 | "semver", 119 | "serde", 120 | "sqlx", 121 | "sysinfo", 122 | "thiserror 1.0.69", 123 | "time", 124 | "typed-builder", 125 | "uuid", 126 | ] 127 | 128 | [[package]] 129 | name = "atuin-server" 130 | version = "18.4.0" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "aa704403ca4ed3e63d65aa781a1520e1ee3f388b9bf19590a5443c5b3e39e096" 133 | dependencies = [ 134 | "argon2", 135 | "async-trait", 136 | "atuin-common", 137 | "atuin-server-database", 138 | "axum", 139 | "axum-server", 140 | "base64 0.22.1", 141 | "config", 142 | "eyre", 143 | "fs-err", 144 | "metrics", 145 | "metrics-exporter-prometheus", 146 | "postmark", 147 | "rand", 148 | "reqwest 0.11.27", 149 | "rustls 0.23.22", 150 | "rustls-pemfile 2.2.0", 151 | "semver", 152 | "serde", 153 | "serde_json", 154 | "time", 155 | "tokio", 156 | "tower 0.4.13", 157 | "tower-http", 158 | "tracing", 159 | "uuid", 160 | ] 161 | 162 | [[package]] 163 | name = "atuin-server-database" 164 | version = "18.4.0" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "1ffae28958296454793e3ca5235441eef89423dbe58fd08ceaf14a346abce121" 167 | dependencies = [ 168 | "async-trait", 169 | "atuin-common", 170 | "eyre", 171 | "serde", 172 | "time", 173 | "tracing", 174 | "uuid", 175 | ] 176 | 177 | [[package]] 178 | name = "atuin-server-sqlite-unofficial" 179 | version = "18.4.0" 180 | dependencies = [ 181 | "async-trait", 182 | "atuin-common", 183 | "atuin-server", 184 | "atuin-server-database", 185 | "futures-util", 186 | "serde", 187 | "sqlx", 188 | "time", 189 | "tokio", 190 | "tracing", 191 | "tracing-subscriber", 192 | "tracing-tree", 193 | ] 194 | 195 | [[package]] 196 | name = "autocfg" 197 | version = "1.4.0" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 200 | 201 | [[package]] 202 | name = "axum" 203 | version = "0.7.9" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" 206 | dependencies = [ 207 | "async-trait", 208 | "axum-core", 209 | "bytes", 210 | "futures-util", 211 | "http 1.2.0", 212 | "http-body 1.0.1", 213 | "http-body-util", 214 | "hyper 1.6.0", 215 | "hyper-util", 216 | "itoa", 217 | "matchit", 218 | "memchr", 219 | "mime", 220 | "percent-encoding", 221 | "pin-project-lite", 222 | "rustversion", 223 | "serde", 224 | "serde_json", 225 | "serde_path_to_error", 226 | "serde_urlencoded", 227 | "sync_wrapper 1.0.2", 228 | "tokio", 229 | "tower 0.5.2", 230 | "tower-layer", 231 | "tower-service", 232 | "tracing", 233 | ] 234 | 235 | [[package]] 236 | name = "axum-core" 237 | version = "0.4.5" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" 240 | dependencies = [ 241 | "async-trait", 242 | "bytes", 243 | "futures-util", 244 | "http 1.2.0", 245 | "http-body 1.0.1", 246 | "http-body-util", 247 | "mime", 248 | "pin-project-lite", 249 | "rustversion", 250 | "sync_wrapper 1.0.2", 251 | "tower-layer", 252 | "tower-service", 253 | "tracing", 254 | ] 255 | 256 | [[package]] 257 | name = "axum-server" 258 | version = "0.7.1" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "56bac90848f6a9393ac03c63c640925c4b7c8ca21654de40d53f55964667c7d8" 261 | dependencies = [ 262 | "arc-swap", 263 | "bytes", 264 | "futures-util", 265 | "http 1.2.0", 266 | "http-body 1.0.1", 267 | "http-body-util", 268 | "hyper 1.6.0", 269 | "hyper-util", 270 | "pin-project-lite", 271 | "rustls 0.23.22", 272 | "rustls-pemfile 2.2.0", 273 | "rustls-pki-types", 274 | "tokio", 275 | "tokio-rustls 0.26.1", 276 | "tower 0.4.13", 277 | "tower-service", 278 | ] 279 | 280 | [[package]] 281 | name = "backtrace" 282 | version = "0.3.74" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 285 | dependencies = [ 286 | "addr2line", 287 | "cfg-if", 288 | "libc", 289 | "miniz_oxide", 290 | "object", 291 | "rustc-demangle", 292 | "windows-targets 0.52.6", 293 | ] 294 | 295 | [[package]] 296 | name = "base64" 297 | version = "0.21.7" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 300 | 301 | [[package]] 302 | name = "base64" 303 | version = "0.22.1" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 306 | 307 | [[package]] 308 | name = "base64ct" 309 | version = "1.6.0" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 312 | 313 | [[package]] 314 | name = "bitflags" 315 | version = "1.3.2" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 318 | 319 | [[package]] 320 | name = "bitflags" 321 | version = "2.8.0" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 324 | dependencies = [ 325 | "serde", 326 | ] 327 | 328 | [[package]] 329 | name = "blake2" 330 | version = "0.10.6" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" 333 | dependencies = [ 334 | "digest", 335 | ] 336 | 337 | [[package]] 338 | name = "block-buffer" 339 | version = "0.10.4" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 342 | dependencies = [ 343 | "generic-array", 344 | ] 345 | 346 | [[package]] 347 | name = "bumpalo" 348 | version = "3.17.0" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 351 | 352 | [[package]] 353 | name = "byteorder" 354 | version = "1.5.0" 355 | source = "registry+https://github.com/rust-lang/crates.io-index" 356 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 357 | 358 | [[package]] 359 | name = "bytes" 360 | version = "1.9.0" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" 363 | 364 | [[package]] 365 | name = "cc" 366 | version = "1.2.11" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "e4730490333d58093109dc02c23174c3f4d490998c3fed3cc8e82d57afedb9cf" 369 | dependencies = [ 370 | "shlex", 371 | ] 372 | 373 | [[package]] 374 | name = "cfg-if" 375 | version = "1.0.0" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 378 | 379 | [[package]] 380 | name = "cfg_aliases" 381 | version = "0.2.1" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 384 | 385 | [[package]] 386 | name = "chrono" 387 | version = "0.4.39" 388 | source = "registry+https://github.com/rust-lang/crates.io-index" 389 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 390 | dependencies = [ 391 | "android-tzdata", 392 | "iana-time-zone", 393 | "num-traits", 394 | "windows-targets 0.52.6", 395 | ] 396 | 397 | [[package]] 398 | name = "concurrent-queue" 399 | version = "2.5.0" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 402 | dependencies = [ 403 | "crossbeam-utils", 404 | ] 405 | 406 | [[package]] 407 | name = "config" 408 | version = "0.13.4" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" 411 | dependencies = [ 412 | "async-trait", 413 | "lazy_static", 414 | "nom", 415 | "pathdiff", 416 | "serde", 417 | "toml", 418 | ] 419 | 420 | [[package]] 421 | name = "const-oid" 422 | version = "0.9.6" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 425 | 426 | [[package]] 427 | name = "core-foundation" 428 | version = "0.9.4" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 431 | dependencies = [ 432 | "core-foundation-sys", 433 | "libc", 434 | ] 435 | 436 | [[package]] 437 | name = "core-foundation-sys" 438 | version = "0.8.7" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 441 | 442 | [[package]] 443 | name = "cpufeatures" 444 | version = "0.2.17" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 447 | dependencies = [ 448 | "libc", 449 | ] 450 | 451 | [[package]] 452 | name = "crc" 453 | version = "3.2.1" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" 456 | dependencies = [ 457 | "crc-catalog", 458 | ] 459 | 460 | [[package]] 461 | name = "crc-catalog" 462 | version = "2.4.0" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 465 | 466 | [[package]] 467 | name = "crossbeam-deque" 468 | version = "0.8.6" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 471 | dependencies = [ 472 | "crossbeam-epoch", 473 | "crossbeam-utils", 474 | ] 475 | 476 | [[package]] 477 | name = "crossbeam-epoch" 478 | version = "0.9.18" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 481 | dependencies = [ 482 | "crossbeam-utils", 483 | ] 484 | 485 | [[package]] 486 | name = "crossbeam-queue" 487 | version = "0.3.12" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 490 | dependencies = [ 491 | "crossbeam-utils", 492 | ] 493 | 494 | [[package]] 495 | name = "crossbeam-utils" 496 | version = "0.8.21" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 499 | 500 | [[package]] 501 | name = "crypto-common" 502 | version = "0.1.6" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 505 | dependencies = [ 506 | "generic-array", 507 | "typenum", 508 | ] 509 | 510 | [[package]] 511 | name = "der" 512 | version = "0.7.9" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" 515 | dependencies = [ 516 | "const-oid", 517 | "pem-rfc7468", 518 | "zeroize", 519 | ] 520 | 521 | [[package]] 522 | name = "deranged" 523 | version = "0.3.11" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 526 | dependencies = [ 527 | "powerfmt", 528 | "serde", 529 | ] 530 | 531 | [[package]] 532 | name = "digest" 533 | version = "0.10.7" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 536 | dependencies = [ 537 | "block-buffer", 538 | "const-oid", 539 | "crypto-common", 540 | "subtle", 541 | ] 542 | 543 | [[package]] 544 | name = "directories" 545 | version = "5.0.1" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" 548 | dependencies = [ 549 | "dirs-sys", 550 | ] 551 | 552 | [[package]] 553 | name = "dirs-sys" 554 | version = "0.4.1" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 557 | dependencies = [ 558 | "libc", 559 | "option-ext", 560 | "redox_users", 561 | "windows-sys 0.48.0", 562 | ] 563 | 564 | [[package]] 565 | name = "displaydoc" 566 | version = "0.2.5" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 569 | dependencies = [ 570 | "proc-macro2", 571 | "quote", 572 | "syn", 573 | ] 574 | 575 | [[package]] 576 | name = "dotenvy" 577 | version = "0.15.7" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 580 | 581 | [[package]] 582 | name = "either" 583 | version = "1.13.0" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 586 | dependencies = [ 587 | "serde", 588 | ] 589 | 590 | [[package]] 591 | name = "encoding_rs" 592 | version = "0.8.35" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 595 | dependencies = [ 596 | "cfg-if", 597 | ] 598 | 599 | [[package]] 600 | name = "equivalent" 601 | version = "1.0.1" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 604 | 605 | [[package]] 606 | name = "errno" 607 | version = "0.3.10" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 610 | dependencies = [ 611 | "libc", 612 | "windows-sys 0.59.0", 613 | ] 614 | 615 | [[package]] 616 | name = "etcetera" 617 | version = "0.8.0" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 620 | dependencies = [ 621 | "cfg-if", 622 | "home", 623 | "windows-sys 0.48.0", 624 | ] 625 | 626 | [[package]] 627 | name = "event-listener" 628 | version = "5.4.0" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 631 | dependencies = [ 632 | "concurrent-queue", 633 | "parking", 634 | "pin-project-lite", 635 | ] 636 | 637 | [[package]] 638 | name = "eyre" 639 | version = "0.6.12" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" 642 | dependencies = [ 643 | "indenter", 644 | "once_cell", 645 | ] 646 | 647 | [[package]] 648 | name = "fastrand" 649 | version = "2.3.0" 650 | source = "registry+https://github.com/rust-lang/crates.io-index" 651 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 652 | 653 | [[package]] 654 | name = "flume" 655 | version = "0.11.1" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 658 | dependencies = [ 659 | "futures-core", 660 | "futures-sink", 661 | "spin", 662 | ] 663 | 664 | [[package]] 665 | name = "fnv" 666 | version = "1.0.7" 667 | source = "registry+https://github.com/rust-lang/crates.io-index" 668 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 669 | 670 | [[package]] 671 | name = "foldhash" 672 | version = "0.1.4" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" 675 | 676 | [[package]] 677 | name = "form_urlencoded" 678 | version = "1.2.1" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 681 | dependencies = [ 682 | "percent-encoding", 683 | ] 684 | 685 | [[package]] 686 | name = "fs-err" 687 | version = "2.11.0" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" 690 | dependencies = [ 691 | "autocfg", 692 | ] 693 | 694 | [[package]] 695 | name = "futures-channel" 696 | version = "0.3.31" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 699 | dependencies = [ 700 | "futures-core", 701 | "futures-sink", 702 | ] 703 | 704 | [[package]] 705 | name = "futures-core" 706 | version = "0.3.31" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 709 | 710 | [[package]] 711 | name = "futures-executor" 712 | version = "0.3.31" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 715 | dependencies = [ 716 | "futures-core", 717 | "futures-task", 718 | "futures-util", 719 | ] 720 | 721 | [[package]] 722 | name = "futures-intrusive" 723 | version = "0.5.0" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 726 | dependencies = [ 727 | "futures-core", 728 | "lock_api", 729 | "parking_lot", 730 | ] 731 | 732 | [[package]] 733 | name = "futures-io" 734 | version = "0.3.31" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 737 | 738 | [[package]] 739 | name = "futures-macro" 740 | version = "0.3.31" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 743 | dependencies = [ 744 | "proc-macro2", 745 | "quote", 746 | "syn", 747 | ] 748 | 749 | [[package]] 750 | name = "futures-sink" 751 | version = "0.3.31" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 754 | 755 | [[package]] 756 | name = "futures-task" 757 | version = "0.3.31" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 760 | 761 | [[package]] 762 | name = "futures-util" 763 | version = "0.3.31" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 766 | dependencies = [ 767 | "futures-core", 768 | "futures-io", 769 | "futures-macro", 770 | "futures-sink", 771 | "futures-task", 772 | "memchr", 773 | "pin-project-lite", 774 | "pin-utils", 775 | "slab", 776 | ] 777 | 778 | [[package]] 779 | name = "generic-array" 780 | version = "0.14.7" 781 | source = "registry+https://github.com/rust-lang/crates.io-index" 782 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 783 | dependencies = [ 784 | "typenum", 785 | "version_check", 786 | ] 787 | 788 | [[package]] 789 | name = "getrandom" 790 | version = "0.2.15" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 793 | dependencies = [ 794 | "cfg-if", 795 | "js-sys", 796 | "libc", 797 | "wasi 0.11.0+wasi-snapshot-preview1", 798 | "wasm-bindgen", 799 | ] 800 | 801 | [[package]] 802 | name = "getrandom" 803 | version = "0.3.1" 804 | source = "registry+https://github.com/rust-lang/crates.io-index" 805 | checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" 806 | dependencies = [ 807 | "cfg-if", 808 | "libc", 809 | "wasi 0.13.3+wasi-0.2.2", 810 | "windows-targets 0.52.6", 811 | ] 812 | 813 | [[package]] 814 | name = "gimli" 815 | version = "0.31.1" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 818 | 819 | [[package]] 820 | name = "h2" 821 | version = "0.3.26" 822 | source = "registry+https://github.com/rust-lang/crates.io-index" 823 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 824 | dependencies = [ 825 | "bytes", 826 | "fnv", 827 | "futures-core", 828 | "futures-sink", 829 | "futures-util", 830 | "http 0.2.12", 831 | "indexmap 2.7.1", 832 | "slab", 833 | "tokio", 834 | "tokio-util", 835 | "tracing", 836 | ] 837 | 838 | [[package]] 839 | name = "h2" 840 | version = "0.4.7" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" 843 | dependencies = [ 844 | "atomic-waker", 845 | "bytes", 846 | "fnv", 847 | "futures-core", 848 | "futures-sink", 849 | "http 1.2.0", 850 | "indexmap 2.7.1", 851 | "slab", 852 | "tokio", 853 | "tokio-util", 854 | "tracing", 855 | ] 856 | 857 | [[package]] 858 | name = "hashbrown" 859 | version = "0.12.3" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 862 | 863 | [[package]] 864 | name = "hashbrown" 865 | version = "0.13.1" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" 868 | dependencies = [ 869 | "ahash", 870 | ] 871 | 872 | [[package]] 873 | name = "hashbrown" 874 | version = "0.15.2" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 877 | dependencies = [ 878 | "allocator-api2", 879 | "equivalent", 880 | "foldhash", 881 | ] 882 | 883 | [[package]] 884 | name = "hashlink" 885 | version = "0.10.0" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 888 | dependencies = [ 889 | "hashbrown 0.15.2", 890 | ] 891 | 892 | [[package]] 893 | name = "heck" 894 | version = "0.5.0" 895 | source = "registry+https://github.com/rust-lang/crates.io-index" 896 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 897 | 898 | [[package]] 899 | name = "hermit-abi" 900 | version = "0.3.9" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 903 | 904 | [[package]] 905 | name = "hex" 906 | version = "0.4.3" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 909 | 910 | [[package]] 911 | name = "hkdf" 912 | version = "0.12.4" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 915 | dependencies = [ 916 | "hmac", 917 | ] 918 | 919 | [[package]] 920 | name = "hmac" 921 | version = "0.12.1" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 924 | dependencies = [ 925 | "digest", 926 | ] 927 | 928 | [[package]] 929 | name = "home" 930 | version = "0.5.11" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 933 | dependencies = [ 934 | "windows-sys 0.59.0", 935 | ] 936 | 937 | [[package]] 938 | name = "http" 939 | version = "0.2.12" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 942 | dependencies = [ 943 | "bytes", 944 | "fnv", 945 | "itoa", 946 | ] 947 | 948 | [[package]] 949 | name = "http" 950 | version = "1.2.0" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" 953 | dependencies = [ 954 | "bytes", 955 | "fnv", 956 | "itoa", 957 | ] 958 | 959 | [[package]] 960 | name = "http-body" 961 | version = "0.4.6" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 964 | dependencies = [ 965 | "bytes", 966 | "http 0.2.12", 967 | "pin-project-lite", 968 | ] 969 | 970 | [[package]] 971 | name = "http-body" 972 | version = "1.0.1" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 975 | dependencies = [ 976 | "bytes", 977 | "http 1.2.0", 978 | ] 979 | 980 | [[package]] 981 | name = "http-body-util" 982 | version = "0.1.2" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 985 | dependencies = [ 986 | "bytes", 987 | "futures-util", 988 | "http 1.2.0", 989 | "http-body 1.0.1", 990 | "pin-project-lite", 991 | ] 992 | 993 | [[package]] 994 | name = "httparse" 995 | version = "1.10.0" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" 998 | 999 | [[package]] 1000 | name = "httpdate" 1001 | version = "1.0.3" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1004 | 1005 | [[package]] 1006 | name = "hyper" 1007 | version = "0.14.32" 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" 1009 | checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" 1010 | dependencies = [ 1011 | "bytes", 1012 | "futures-channel", 1013 | "futures-core", 1014 | "futures-util", 1015 | "h2 0.3.26", 1016 | "http 0.2.12", 1017 | "http-body 0.4.6", 1018 | "httparse", 1019 | "httpdate", 1020 | "itoa", 1021 | "pin-project-lite", 1022 | "socket2", 1023 | "tokio", 1024 | "tower-service", 1025 | "tracing", 1026 | "want", 1027 | ] 1028 | 1029 | [[package]] 1030 | name = "hyper" 1031 | version = "1.6.0" 1032 | source = "registry+https://github.com/rust-lang/crates.io-index" 1033 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1034 | dependencies = [ 1035 | "bytes", 1036 | "futures-channel", 1037 | "futures-util", 1038 | "h2 0.4.7", 1039 | "http 1.2.0", 1040 | "http-body 1.0.1", 1041 | "httparse", 1042 | "httpdate", 1043 | "itoa", 1044 | "pin-project-lite", 1045 | "smallvec", 1046 | "tokio", 1047 | "want", 1048 | ] 1049 | 1050 | [[package]] 1051 | name = "hyper-rustls" 1052 | version = "0.24.2" 1053 | source = "registry+https://github.com/rust-lang/crates.io-index" 1054 | checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" 1055 | dependencies = [ 1056 | "futures-util", 1057 | "http 0.2.12", 1058 | "hyper 0.14.32", 1059 | "rustls 0.21.12", 1060 | "tokio", 1061 | "tokio-rustls 0.24.1", 1062 | ] 1063 | 1064 | [[package]] 1065 | name = "hyper-rustls" 1066 | version = "0.27.5" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" 1069 | dependencies = [ 1070 | "futures-util", 1071 | "http 1.2.0", 1072 | "hyper 1.6.0", 1073 | "hyper-util", 1074 | "rustls 0.23.22", 1075 | "rustls-pki-types", 1076 | "tokio", 1077 | "tokio-rustls 0.26.1", 1078 | "tower-service", 1079 | "webpki-roots", 1080 | ] 1081 | 1082 | [[package]] 1083 | name = "hyper-util" 1084 | version = "0.1.10" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" 1087 | dependencies = [ 1088 | "bytes", 1089 | "futures-channel", 1090 | "futures-util", 1091 | "http 1.2.0", 1092 | "http-body 1.0.1", 1093 | "hyper 1.6.0", 1094 | "pin-project-lite", 1095 | "socket2", 1096 | "tokio", 1097 | "tower-service", 1098 | "tracing", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "iana-time-zone" 1103 | version = "0.1.61" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 1106 | dependencies = [ 1107 | "android_system_properties", 1108 | "core-foundation-sys", 1109 | "iana-time-zone-haiku", 1110 | "js-sys", 1111 | "wasm-bindgen", 1112 | "windows-core", 1113 | ] 1114 | 1115 | [[package]] 1116 | name = "iana-time-zone-haiku" 1117 | version = "0.1.2" 1118 | source = "registry+https://github.com/rust-lang/crates.io-index" 1119 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1120 | dependencies = [ 1121 | "cc", 1122 | ] 1123 | 1124 | [[package]] 1125 | name = "icu_collections" 1126 | version = "1.5.0" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 1129 | dependencies = [ 1130 | "displaydoc", 1131 | "yoke", 1132 | "zerofrom", 1133 | "zerovec", 1134 | ] 1135 | 1136 | [[package]] 1137 | name = "icu_locid" 1138 | version = "1.5.0" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 1141 | dependencies = [ 1142 | "displaydoc", 1143 | "litemap", 1144 | "tinystr", 1145 | "writeable", 1146 | "zerovec", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "icu_locid_transform" 1151 | version = "1.5.0" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 1154 | dependencies = [ 1155 | "displaydoc", 1156 | "icu_locid", 1157 | "icu_locid_transform_data", 1158 | "icu_provider", 1159 | "tinystr", 1160 | "zerovec", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "icu_locid_transform_data" 1165 | version = "1.5.0" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 1168 | 1169 | [[package]] 1170 | name = "icu_normalizer" 1171 | version = "1.5.0" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 1174 | dependencies = [ 1175 | "displaydoc", 1176 | "icu_collections", 1177 | "icu_normalizer_data", 1178 | "icu_properties", 1179 | "icu_provider", 1180 | "smallvec", 1181 | "utf16_iter", 1182 | "utf8_iter", 1183 | "write16", 1184 | "zerovec", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "icu_normalizer_data" 1189 | version = "1.5.0" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 1192 | 1193 | [[package]] 1194 | name = "icu_properties" 1195 | version = "1.5.1" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 1198 | dependencies = [ 1199 | "displaydoc", 1200 | "icu_collections", 1201 | "icu_locid_transform", 1202 | "icu_properties_data", 1203 | "icu_provider", 1204 | "tinystr", 1205 | "zerovec", 1206 | ] 1207 | 1208 | [[package]] 1209 | name = "icu_properties_data" 1210 | version = "1.5.0" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 1213 | 1214 | [[package]] 1215 | name = "icu_provider" 1216 | version = "1.5.0" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 1219 | dependencies = [ 1220 | "displaydoc", 1221 | "icu_locid", 1222 | "icu_provider_macros", 1223 | "stable_deref_trait", 1224 | "tinystr", 1225 | "writeable", 1226 | "yoke", 1227 | "zerofrom", 1228 | "zerovec", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "icu_provider_macros" 1233 | version = "1.5.0" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 1236 | dependencies = [ 1237 | "proc-macro2", 1238 | "quote", 1239 | "syn", 1240 | ] 1241 | 1242 | [[package]] 1243 | name = "idna" 1244 | version = "1.0.3" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1247 | dependencies = [ 1248 | "idna_adapter", 1249 | "smallvec", 1250 | "utf8_iter", 1251 | ] 1252 | 1253 | [[package]] 1254 | name = "idna_adapter" 1255 | version = "1.2.0" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 1258 | dependencies = [ 1259 | "icu_normalizer", 1260 | "icu_properties", 1261 | ] 1262 | 1263 | [[package]] 1264 | name = "indenter" 1265 | version = "0.3.3" 1266 | source = "registry+https://github.com/rust-lang/crates.io-index" 1267 | checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" 1268 | 1269 | [[package]] 1270 | name = "indexmap" 1271 | version = "1.9.3" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1274 | dependencies = [ 1275 | "autocfg", 1276 | "hashbrown 0.12.3", 1277 | ] 1278 | 1279 | [[package]] 1280 | name = "indexmap" 1281 | version = "2.7.1" 1282 | source = "registry+https://github.com/rust-lang/crates.io-index" 1283 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 1284 | dependencies = [ 1285 | "equivalent", 1286 | "hashbrown 0.15.2", 1287 | ] 1288 | 1289 | [[package]] 1290 | name = "ipnet" 1291 | version = "2.11.0" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1294 | 1295 | [[package]] 1296 | name = "itoa" 1297 | version = "1.0.14" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 1300 | 1301 | [[package]] 1302 | name = "js-sys" 1303 | version = "0.3.77" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1306 | dependencies = [ 1307 | "once_cell", 1308 | "wasm-bindgen", 1309 | ] 1310 | 1311 | [[package]] 1312 | name = "lazy_static" 1313 | version = "1.5.0" 1314 | source = "registry+https://github.com/rust-lang/crates.io-index" 1315 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1316 | dependencies = [ 1317 | "spin", 1318 | ] 1319 | 1320 | [[package]] 1321 | name = "libc" 1322 | version = "0.2.169" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 1325 | 1326 | [[package]] 1327 | name = "libm" 1328 | version = "0.2.11" 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" 1330 | checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" 1331 | 1332 | [[package]] 1333 | name = "libredox" 1334 | version = "0.1.3" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 1337 | dependencies = [ 1338 | "bitflags 2.8.0", 1339 | "libc", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "libsqlite3-sys" 1344 | version = "0.30.1" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 1347 | dependencies = [ 1348 | "cc", 1349 | "pkg-config", 1350 | "vcpkg", 1351 | ] 1352 | 1353 | [[package]] 1354 | name = "linux-raw-sys" 1355 | version = "0.4.15" 1356 | source = "registry+https://github.com/rust-lang/crates.io-index" 1357 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 1358 | 1359 | [[package]] 1360 | name = "litemap" 1361 | version = "0.7.4" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 1364 | 1365 | [[package]] 1366 | name = "lock_api" 1367 | version = "0.4.12" 1368 | source = "registry+https://github.com/rust-lang/crates.io-index" 1369 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1370 | dependencies = [ 1371 | "autocfg", 1372 | "scopeguard", 1373 | ] 1374 | 1375 | [[package]] 1376 | name = "log" 1377 | version = "0.4.25" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 1380 | 1381 | [[package]] 1382 | name = "mach2" 1383 | version = "0.4.2" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" 1386 | dependencies = [ 1387 | "libc", 1388 | ] 1389 | 1390 | [[package]] 1391 | name = "matchers" 1392 | version = "0.1.0" 1393 | source = "registry+https://github.com/rust-lang/crates.io-index" 1394 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1395 | dependencies = [ 1396 | "regex-automata 0.1.10", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "matchit" 1401 | version = "0.7.3" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 1404 | 1405 | [[package]] 1406 | name = "md-5" 1407 | version = "0.10.6" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1410 | dependencies = [ 1411 | "cfg-if", 1412 | "digest", 1413 | ] 1414 | 1415 | [[package]] 1416 | name = "memchr" 1417 | version = "2.7.4" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1420 | 1421 | [[package]] 1422 | name = "metrics" 1423 | version = "0.21.1" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" 1426 | dependencies = [ 1427 | "ahash", 1428 | "metrics-macros", 1429 | "portable-atomic", 1430 | ] 1431 | 1432 | [[package]] 1433 | name = "metrics-exporter-prometheus" 1434 | version = "0.12.2" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "1d4fa7ce7c4862db464a37b0b31d89bca874562f034bd7993895572783d02950" 1437 | dependencies = [ 1438 | "base64 0.21.7", 1439 | "hyper 0.14.32", 1440 | "indexmap 1.9.3", 1441 | "ipnet", 1442 | "metrics", 1443 | "metrics-util", 1444 | "quanta", 1445 | "thiserror 1.0.69", 1446 | "tokio", 1447 | "tracing", 1448 | ] 1449 | 1450 | [[package]] 1451 | name = "metrics-macros" 1452 | version = "0.7.1" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" 1455 | dependencies = [ 1456 | "proc-macro2", 1457 | "quote", 1458 | "syn", 1459 | ] 1460 | 1461 | [[package]] 1462 | name = "metrics-util" 1463 | version = "0.15.1" 1464 | source = "registry+https://github.com/rust-lang/crates.io-index" 1465 | checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" 1466 | dependencies = [ 1467 | "crossbeam-epoch", 1468 | "crossbeam-utils", 1469 | "hashbrown 0.13.1", 1470 | "metrics", 1471 | "num_cpus", 1472 | "quanta", 1473 | "sketches-ddsketch", 1474 | ] 1475 | 1476 | [[package]] 1477 | name = "mime" 1478 | version = "0.3.17" 1479 | source = "registry+https://github.com/rust-lang/crates.io-index" 1480 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1481 | 1482 | [[package]] 1483 | name = "minimal-lexical" 1484 | version = "0.2.1" 1485 | source = "registry+https://github.com/rust-lang/crates.io-index" 1486 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1487 | 1488 | [[package]] 1489 | name = "miniz_oxide" 1490 | version = "0.8.3" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" 1493 | dependencies = [ 1494 | "adler2", 1495 | ] 1496 | 1497 | [[package]] 1498 | name = "mio" 1499 | version = "1.0.3" 1500 | source = "registry+https://github.com/rust-lang/crates.io-index" 1501 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1502 | dependencies = [ 1503 | "libc", 1504 | "wasi 0.11.0+wasi-snapshot-preview1", 1505 | "windows-sys 0.52.0", 1506 | ] 1507 | 1508 | [[package]] 1509 | name = "nom" 1510 | version = "7.1.3" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1513 | dependencies = [ 1514 | "memchr", 1515 | "minimal-lexical", 1516 | ] 1517 | 1518 | [[package]] 1519 | name = "ntapi" 1520 | version = "0.4.1" 1521 | source = "registry+https://github.com/rust-lang/crates.io-index" 1522 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 1523 | dependencies = [ 1524 | "winapi", 1525 | ] 1526 | 1527 | [[package]] 1528 | name = "nu-ansi-term" 1529 | version = "0.50.1" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" 1532 | dependencies = [ 1533 | "windows-sys 0.52.0", 1534 | ] 1535 | 1536 | [[package]] 1537 | name = "num-bigint-dig" 1538 | version = "0.8.4" 1539 | source = "registry+https://github.com/rust-lang/crates.io-index" 1540 | checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1541 | dependencies = [ 1542 | "byteorder", 1543 | "lazy_static", 1544 | "libm", 1545 | "num-integer", 1546 | "num-iter", 1547 | "num-traits", 1548 | "rand", 1549 | "smallvec", 1550 | "zeroize", 1551 | ] 1552 | 1553 | [[package]] 1554 | name = "num-conv" 1555 | version = "0.1.0" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1558 | 1559 | [[package]] 1560 | name = "num-integer" 1561 | version = "0.1.46" 1562 | source = "registry+https://github.com/rust-lang/crates.io-index" 1563 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1564 | dependencies = [ 1565 | "num-traits", 1566 | ] 1567 | 1568 | [[package]] 1569 | name = "num-iter" 1570 | version = "0.1.45" 1571 | source = "registry+https://github.com/rust-lang/crates.io-index" 1572 | checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1573 | dependencies = [ 1574 | "autocfg", 1575 | "num-integer", 1576 | "num-traits", 1577 | ] 1578 | 1579 | [[package]] 1580 | name = "num-traits" 1581 | version = "0.2.19" 1582 | source = "registry+https://github.com/rust-lang/crates.io-index" 1583 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1584 | dependencies = [ 1585 | "autocfg", 1586 | "libm", 1587 | ] 1588 | 1589 | [[package]] 1590 | name = "num_cpus" 1591 | version = "1.16.0" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 1594 | dependencies = [ 1595 | "hermit-abi", 1596 | "libc", 1597 | ] 1598 | 1599 | [[package]] 1600 | name = "num_threads" 1601 | version = "0.1.7" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 1604 | dependencies = [ 1605 | "libc", 1606 | ] 1607 | 1608 | [[package]] 1609 | name = "object" 1610 | version = "0.36.7" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1613 | dependencies = [ 1614 | "memchr", 1615 | ] 1616 | 1617 | [[package]] 1618 | name = "once_cell" 1619 | version = "1.20.2" 1620 | source = "registry+https://github.com/rust-lang/crates.io-index" 1621 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 1622 | 1623 | [[package]] 1624 | name = "openssl-probe" 1625 | version = "0.1.6" 1626 | source = "registry+https://github.com/rust-lang/crates.io-index" 1627 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1628 | 1629 | [[package]] 1630 | name = "option-ext" 1631 | version = "0.2.0" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1634 | 1635 | [[package]] 1636 | name = "parking" 1637 | version = "2.2.1" 1638 | source = "registry+https://github.com/rust-lang/crates.io-index" 1639 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 1640 | 1641 | [[package]] 1642 | name = "parking_lot" 1643 | version = "0.12.3" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1646 | dependencies = [ 1647 | "lock_api", 1648 | "parking_lot_core", 1649 | ] 1650 | 1651 | [[package]] 1652 | name = "parking_lot_core" 1653 | version = "0.9.10" 1654 | source = "registry+https://github.com/rust-lang/crates.io-index" 1655 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1656 | dependencies = [ 1657 | "cfg-if", 1658 | "libc", 1659 | "redox_syscall", 1660 | "smallvec", 1661 | "windows-targets 0.52.6", 1662 | ] 1663 | 1664 | [[package]] 1665 | name = "password-hash" 1666 | version = "0.5.0" 1667 | source = "registry+https://github.com/rust-lang/crates.io-index" 1668 | checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" 1669 | dependencies = [ 1670 | "base64ct", 1671 | "rand_core", 1672 | "subtle", 1673 | ] 1674 | 1675 | [[package]] 1676 | name = "pathdiff" 1677 | version = "0.2.3" 1678 | source = "registry+https://github.com/rust-lang/crates.io-index" 1679 | checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" 1680 | 1681 | [[package]] 1682 | name = "pem-rfc7468" 1683 | version = "0.7.0" 1684 | source = "registry+https://github.com/rust-lang/crates.io-index" 1685 | checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1686 | dependencies = [ 1687 | "base64ct", 1688 | ] 1689 | 1690 | [[package]] 1691 | name = "percent-encoding" 1692 | version = "2.3.1" 1693 | source = "registry+https://github.com/rust-lang/crates.io-index" 1694 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1695 | 1696 | [[package]] 1697 | name = "pin-project" 1698 | version = "1.1.8" 1699 | source = "registry+https://github.com/rust-lang/crates.io-index" 1700 | checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" 1701 | dependencies = [ 1702 | "pin-project-internal", 1703 | ] 1704 | 1705 | [[package]] 1706 | name = "pin-project-internal" 1707 | version = "1.1.8" 1708 | source = "registry+https://github.com/rust-lang/crates.io-index" 1709 | checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" 1710 | dependencies = [ 1711 | "proc-macro2", 1712 | "quote", 1713 | "syn", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "pin-project-lite" 1718 | version = "0.2.16" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1721 | 1722 | [[package]] 1723 | name = "pin-utils" 1724 | version = "0.1.0" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1727 | 1728 | [[package]] 1729 | name = "pkcs1" 1730 | version = "0.7.5" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1733 | dependencies = [ 1734 | "der", 1735 | "pkcs8", 1736 | "spki", 1737 | ] 1738 | 1739 | [[package]] 1740 | name = "pkcs8" 1741 | version = "0.10.2" 1742 | source = "registry+https://github.com/rust-lang/crates.io-index" 1743 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1744 | dependencies = [ 1745 | "der", 1746 | "spki", 1747 | ] 1748 | 1749 | [[package]] 1750 | name = "pkg-config" 1751 | version = "0.3.31" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 1754 | 1755 | [[package]] 1756 | name = "portable-atomic" 1757 | version = "1.10.0" 1758 | source = "registry+https://github.com/rust-lang/crates.io-index" 1759 | checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" 1760 | 1761 | [[package]] 1762 | name = "postmark" 1763 | version = "0.10.2" 1764 | source = "registry+https://github.com/rust-lang/crates.io-index" 1765 | checksum = "a8c1982389836857cc378c3f46992bb6712464aa30567831ba0985495b0f6d83" 1766 | dependencies = [ 1767 | "async-trait", 1768 | "bytes", 1769 | "http 1.2.0", 1770 | "reqwest 0.12.12", 1771 | "serde", 1772 | "serde_json", 1773 | "thiserror 1.0.69", 1774 | "typed-builder", 1775 | "url", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "powerfmt" 1780 | version = "0.2.0" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1783 | 1784 | [[package]] 1785 | name = "ppv-lite86" 1786 | version = "0.2.20" 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" 1788 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1789 | dependencies = [ 1790 | "zerocopy", 1791 | ] 1792 | 1793 | [[package]] 1794 | name = "proc-macro2" 1795 | version = "1.0.93" 1796 | source = "registry+https://github.com/rust-lang/crates.io-index" 1797 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1798 | dependencies = [ 1799 | "unicode-ident", 1800 | ] 1801 | 1802 | [[package]] 1803 | name = "quanta" 1804 | version = "0.11.1" 1805 | source = "registry+https://github.com/rust-lang/crates.io-index" 1806 | checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" 1807 | dependencies = [ 1808 | "crossbeam-utils", 1809 | "libc", 1810 | "mach2", 1811 | "once_cell", 1812 | "raw-cpuid", 1813 | "wasi 0.11.0+wasi-snapshot-preview1", 1814 | "web-sys", 1815 | "winapi", 1816 | ] 1817 | 1818 | [[package]] 1819 | name = "quinn" 1820 | version = "0.11.6" 1821 | source = "registry+https://github.com/rust-lang/crates.io-index" 1822 | checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" 1823 | dependencies = [ 1824 | "bytes", 1825 | "pin-project-lite", 1826 | "quinn-proto", 1827 | "quinn-udp", 1828 | "rustc-hash", 1829 | "rustls 0.23.22", 1830 | "socket2", 1831 | "thiserror 2.0.11", 1832 | "tokio", 1833 | "tracing", 1834 | ] 1835 | 1836 | [[package]] 1837 | name = "quinn-proto" 1838 | version = "0.11.9" 1839 | source = "registry+https://github.com/rust-lang/crates.io-index" 1840 | checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" 1841 | dependencies = [ 1842 | "bytes", 1843 | "getrandom 0.2.15", 1844 | "rand", 1845 | "ring", 1846 | "rustc-hash", 1847 | "rustls 0.23.22", 1848 | "rustls-pki-types", 1849 | "slab", 1850 | "thiserror 2.0.11", 1851 | "tinyvec", 1852 | "tracing", 1853 | "web-time", 1854 | ] 1855 | 1856 | [[package]] 1857 | name = "quinn-udp" 1858 | version = "0.5.9" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" 1861 | dependencies = [ 1862 | "cfg_aliases", 1863 | "libc", 1864 | "once_cell", 1865 | "socket2", 1866 | "tracing", 1867 | "windows-sys 0.59.0", 1868 | ] 1869 | 1870 | [[package]] 1871 | name = "quote" 1872 | version = "1.0.38" 1873 | source = "registry+https://github.com/rust-lang/crates.io-index" 1874 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1875 | dependencies = [ 1876 | "proc-macro2", 1877 | ] 1878 | 1879 | [[package]] 1880 | name = "rand" 1881 | version = "0.8.5" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1884 | dependencies = [ 1885 | "libc", 1886 | "rand_chacha", 1887 | "rand_core", 1888 | ] 1889 | 1890 | [[package]] 1891 | name = "rand_chacha" 1892 | version = "0.3.1" 1893 | source = "registry+https://github.com/rust-lang/crates.io-index" 1894 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1895 | dependencies = [ 1896 | "ppv-lite86", 1897 | "rand_core", 1898 | ] 1899 | 1900 | [[package]] 1901 | name = "rand_core" 1902 | version = "0.6.4" 1903 | source = "registry+https://github.com/rust-lang/crates.io-index" 1904 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1905 | dependencies = [ 1906 | "getrandom 0.2.15", 1907 | ] 1908 | 1909 | [[package]] 1910 | name = "raw-cpuid" 1911 | version = "10.7.0" 1912 | source = "registry+https://github.com/rust-lang/crates.io-index" 1913 | checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" 1914 | dependencies = [ 1915 | "bitflags 1.3.2", 1916 | ] 1917 | 1918 | [[package]] 1919 | name = "rayon" 1920 | version = "1.10.0" 1921 | source = "registry+https://github.com/rust-lang/crates.io-index" 1922 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1923 | dependencies = [ 1924 | "either", 1925 | "rayon-core", 1926 | ] 1927 | 1928 | [[package]] 1929 | name = "rayon-core" 1930 | version = "1.12.1" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1933 | dependencies = [ 1934 | "crossbeam-deque", 1935 | "crossbeam-utils", 1936 | ] 1937 | 1938 | [[package]] 1939 | name = "redox_syscall" 1940 | version = "0.5.8" 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" 1942 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 1943 | dependencies = [ 1944 | "bitflags 2.8.0", 1945 | ] 1946 | 1947 | [[package]] 1948 | name = "redox_users" 1949 | version = "0.4.6" 1950 | source = "registry+https://github.com/rust-lang/crates.io-index" 1951 | checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 1952 | dependencies = [ 1953 | "getrandom 0.2.15", 1954 | "libredox", 1955 | "thiserror 1.0.69", 1956 | ] 1957 | 1958 | [[package]] 1959 | name = "regex" 1960 | version = "1.11.1" 1961 | source = "registry+https://github.com/rust-lang/crates.io-index" 1962 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1963 | dependencies = [ 1964 | "aho-corasick", 1965 | "memchr", 1966 | "regex-automata 0.4.9", 1967 | "regex-syntax 0.8.5", 1968 | ] 1969 | 1970 | [[package]] 1971 | name = "regex-automata" 1972 | version = "0.1.10" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1975 | dependencies = [ 1976 | "regex-syntax 0.6.29", 1977 | ] 1978 | 1979 | [[package]] 1980 | name = "regex-automata" 1981 | version = "0.4.9" 1982 | source = "registry+https://github.com/rust-lang/crates.io-index" 1983 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1984 | dependencies = [ 1985 | "aho-corasick", 1986 | "memchr", 1987 | "regex-syntax 0.8.5", 1988 | ] 1989 | 1990 | [[package]] 1991 | name = "regex-syntax" 1992 | version = "0.6.29" 1993 | source = "registry+https://github.com/rust-lang/crates.io-index" 1994 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1995 | 1996 | [[package]] 1997 | name = "regex-syntax" 1998 | version = "0.8.5" 1999 | source = "registry+https://github.com/rust-lang/crates.io-index" 2000 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 2001 | 2002 | [[package]] 2003 | name = "reqwest" 2004 | version = "0.11.27" 2005 | source = "registry+https://github.com/rust-lang/crates.io-index" 2006 | checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" 2007 | dependencies = [ 2008 | "base64 0.21.7", 2009 | "bytes", 2010 | "encoding_rs", 2011 | "futures-core", 2012 | "futures-util", 2013 | "h2 0.3.26", 2014 | "http 0.2.12", 2015 | "http-body 0.4.6", 2016 | "hyper 0.14.32", 2017 | "hyper-rustls 0.24.2", 2018 | "ipnet", 2019 | "js-sys", 2020 | "log", 2021 | "mime", 2022 | "once_cell", 2023 | "percent-encoding", 2024 | "pin-project-lite", 2025 | "rustls 0.21.12", 2026 | "rustls-native-certs", 2027 | "rustls-pemfile 1.0.4", 2028 | "serde", 2029 | "serde_json", 2030 | "serde_urlencoded", 2031 | "sync_wrapper 0.1.2", 2032 | "system-configuration", 2033 | "tokio", 2034 | "tokio-rustls 0.24.1", 2035 | "tower-service", 2036 | "url", 2037 | "wasm-bindgen", 2038 | "wasm-bindgen-futures", 2039 | "web-sys", 2040 | "winreg", 2041 | ] 2042 | 2043 | [[package]] 2044 | name = "reqwest" 2045 | version = "0.12.12" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" 2048 | dependencies = [ 2049 | "base64 0.22.1", 2050 | "bytes", 2051 | "futures-core", 2052 | "futures-util", 2053 | "http 1.2.0", 2054 | "http-body 1.0.1", 2055 | "http-body-util", 2056 | "hyper 1.6.0", 2057 | "hyper-rustls 0.27.5", 2058 | "hyper-util", 2059 | "ipnet", 2060 | "js-sys", 2061 | "log", 2062 | "mime", 2063 | "once_cell", 2064 | "percent-encoding", 2065 | "pin-project-lite", 2066 | "quinn", 2067 | "rustls 0.23.22", 2068 | "rustls-pemfile 2.2.0", 2069 | "rustls-pki-types", 2070 | "serde", 2071 | "serde_json", 2072 | "serde_urlencoded", 2073 | "sync_wrapper 1.0.2", 2074 | "tokio", 2075 | "tokio-rustls 0.26.1", 2076 | "tower 0.5.2", 2077 | "tower-service", 2078 | "url", 2079 | "wasm-bindgen", 2080 | "wasm-bindgen-futures", 2081 | "web-sys", 2082 | "webpki-roots", 2083 | "windows-registry", 2084 | ] 2085 | 2086 | [[package]] 2087 | name = "ring" 2088 | version = "0.17.8" 2089 | source = "registry+https://github.com/rust-lang/crates.io-index" 2090 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 2091 | dependencies = [ 2092 | "cc", 2093 | "cfg-if", 2094 | "getrandom 0.2.15", 2095 | "libc", 2096 | "spin", 2097 | "untrusted", 2098 | "windows-sys 0.52.0", 2099 | ] 2100 | 2101 | [[package]] 2102 | name = "rsa" 2103 | version = "0.9.7" 2104 | source = "registry+https://github.com/rust-lang/crates.io-index" 2105 | checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" 2106 | dependencies = [ 2107 | "const-oid", 2108 | "digest", 2109 | "num-bigint-dig", 2110 | "num-integer", 2111 | "num-traits", 2112 | "pkcs1", 2113 | "pkcs8", 2114 | "rand_core", 2115 | "signature", 2116 | "spki", 2117 | "subtle", 2118 | "zeroize", 2119 | ] 2120 | 2121 | [[package]] 2122 | name = "rustc-demangle" 2123 | version = "0.1.24" 2124 | source = "registry+https://github.com/rust-lang/crates.io-index" 2125 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 2126 | 2127 | [[package]] 2128 | name = "rustc-hash" 2129 | version = "2.1.0" 2130 | source = "registry+https://github.com/rust-lang/crates.io-index" 2131 | checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" 2132 | 2133 | [[package]] 2134 | name = "rustix" 2135 | version = "0.38.44" 2136 | source = "registry+https://github.com/rust-lang/crates.io-index" 2137 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 2138 | dependencies = [ 2139 | "bitflags 2.8.0", 2140 | "errno", 2141 | "libc", 2142 | "linux-raw-sys", 2143 | "windows-sys 0.59.0", 2144 | ] 2145 | 2146 | [[package]] 2147 | name = "rustls" 2148 | version = "0.21.12" 2149 | source = "registry+https://github.com/rust-lang/crates.io-index" 2150 | checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" 2151 | dependencies = [ 2152 | "log", 2153 | "ring", 2154 | "rustls-webpki 0.101.7", 2155 | "sct", 2156 | ] 2157 | 2158 | [[package]] 2159 | name = "rustls" 2160 | version = "0.23.22" 2161 | source = "registry+https://github.com/rust-lang/crates.io-index" 2162 | checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" 2163 | dependencies = [ 2164 | "once_cell", 2165 | "ring", 2166 | "rustls-pki-types", 2167 | "rustls-webpki 0.102.8", 2168 | "subtle", 2169 | "zeroize", 2170 | ] 2171 | 2172 | [[package]] 2173 | name = "rustls-native-certs" 2174 | version = "0.6.3" 2175 | source = "registry+https://github.com/rust-lang/crates.io-index" 2176 | checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" 2177 | dependencies = [ 2178 | "openssl-probe", 2179 | "rustls-pemfile 1.0.4", 2180 | "schannel", 2181 | "security-framework", 2182 | ] 2183 | 2184 | [[package]] 2185 | name = "rustls-pemfile" 2186 | version = "1.0.4" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 2189 | dependencies = [ 2190 | "base64 0.21.7", 2191 | ] 2192 | 2193 | [[package]] 2194 | name = "rustls-pemfile" 2195 | version = "2.2.0" 2196 | source = "registry+https://github.com/rust-lang/crates.io-index" 2197 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 2198 | dependencies = [ 2199 | "rustls-pki-types", 2200 | ] 2201 | 2202 | [[package]] 2203 | name = "rustls-pki-types" 2204 | version = "1.11.0" 2205 | source = "registry+https://github.com/rust-lang/crates.io-index" 2206 | checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 2207 | dependencies = [ 2208 | "web-time", 2209 | ] 2210 | 2211 | [[package]] 2212 | name = "rustls-webpki" 2213 | version = "0.101.7" 2214 | source = "registry+https://github.com/rust-lang/crates.io-index" 2215 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 2216 | dependencies = [ 2217 | "ring", 2218 | "untrusted", 2219 | ] 2220 | 2221 | [[package]] 2222 | name = "rustls-webpki" 2223 | version = "0.102.8" 2224 | source = "registry+https://github.com/rust-lang/crates.io-index" 2225 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 2226 | dependencies = [ 2227 | "ring", 2228 | "rustls-pki-types", 2229 | "untrusted", 2230 | ] 2231 | 2232 | [[package]] 2233 | name = "rustversion" 2234 | version = "1.0.19" 2235 | source = "registry+https://github.com/rust-lang/crates.io-index" 2236 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 2237 | 2238 | [[package]] 2239 | name = "ryu" 2240 | version = "1.0.19" 2241 | source = "registry+https://github.com/rust-lang/crates.io-index" 2242 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 2243 | 2244 | [[package]] 2245 | name = "schannel" 2246 | version = "0.1.27" 2247 | source = "registry+https://github.com/rust-lang/crates.io-index" 2248 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 2249 | dependencies = [ 2250 | "windows-sys 0.59.0", 2251 | ] 2252 | 2253 | [[package]] 2254 | name = "scopeguard" 2255 | version = "1.2.0" 2256 | source = "registry+https://github.com/rust-lang/crates.io-index" 2257 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2258 | 2259 | [[package]] 2260 | name = "sct" 2261 | version = "0.7.1" 2262 | source = "registry+https://github.com/rust-lang/crates.io-index" 2263 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 2264 | dependencies = [ 2265 | "ring", 2266 | "untrusted", 2267 | ] 2268 | 2269 | [[package]] 2270 | name = "security-framework" 2271 | version = "2.11.1" 2272 | source = "registry+https://github.com/rust-lang/crates.io-index" 2273 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 2274 | dependencies = [ 2275 | "bitflags 2.8.0", 2276 | "core-foundation", 2277 | "core-foundation-sys", 2278 | "libc", 2279 | "security-framework-sys", 2280 | ] 2281 | 2282 | [[package]] 2283 | name = "security-framework-sys" 2284 | version = "2.14.0" 2285 | source = "registry+https://github.com/rust-lang/crates.io-index" 2286 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 2287 | dependencies = [ 2288 | "core-foundation-sys", 2289 | "libc", 2290 | ] 2291 | 2292 | [[package]] 2293 | name = "semver" 2294 | version = "1.0.25" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 2297 | 2298 | [[package]] 2299 | name = "serde" 2300 | version = "1.0.217" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 2303 | dependencies = [ 2304 | "serde_derive", 2305 | ] 2306 | 2307 | [[package]] 2308 | name = "serde_derive" 2309 | version = "1.0.217" 2310 | source = "registry+https://github.com/rust-lang/crates.io-index" 2311 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 2312 | dependencies = [ 2313 | "proc-macro2", 2314 | "quote", 2315 | "syn", 2316 | ] 2317 | 2318 | [[package]] 2319 | name = "serde_json" 2320 | version = "1.0.138" 2321 | source = "registry+https://github.com/rust-lang/crates.io-index" 2322 | checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" 2323 | dependencies = [ 2324 | "itoa", 2325 | "memchr", 2326 | "ryu", 2327 | "serde", 2328 | ] 2329 | 2330 | [[package]] 2331 | name = "serde_path_to_error" 2332 | version = "0.1.16" 2333 | source = "registry+https://github.com/rust-lang/crates.io-index" 2334 | checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" 2335 | dependencies = [ 2336 | "itoa", 2337 | "serde", 2338 | ] 2339 | 2340 | [[package]] 2341 | name = "serde_urlencoded" 2342 | version = "0.7.1" 2343 | source = "registry+https://github.com/rust-lang/crates.io-index" 2344 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2345 | dependencies = [ 2346 | "form_urlencoded", 2347 | "itoa", 2348 | "ryu", 2349 | "serde", 2350 | ] 2351 | 2352 | [[package]] 2353 | name = "sha1" 2354 | version = "0.10.6" 2355 | source = "registry+https://github.com/rust-lang/crates.io-index" 2356 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 2357 | dependencies = [ 2358 | "cfg-if", 2359 | "cpufeatures", 2360 | "digest", 2361 | ] 2362 | 2363 | [[package]] 2364 | name = "sha2" 2365 | version = "0.10.8" 2366 | source = "registry+https://github.com/rust-lang/crates.io-index" 2367 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 2368 | dependencies = [ 2369 | "cfg-if", 2370 | "cpufeatures", 2371 | "digest", 2372 | ] 2373 | 2374 | [[package]] 2375 | name = "sharded-slab" 2376 | version = "0.1.7" 2377 | source = "registry+https://github.com/rust-lang/crates.io-index" 2378 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 2379 | dependencies = [ 2380 | "lazy_static", 2381 | ] 2382 | 2383 | [[package]] 2384 | name = "shlex" 2385 | version = "1.3.0" 2386 | source = "registry+https://github.com/rust-lang/crates.io-index" 2387 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2388 | 2389 | [[package]] 2390 | name = "signal-hook-registry" 2391 | version = "1.4.2" 2392 | source = "registry+https://github.com/rust-lang/crates.io-index" 2393 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 2394 | dependencies = [ 2395 | "libc", 2396 | ] 2397 | 2398 | [[package]] 2399 | name = "signature" 2400 | version = "2.2.0" 2401 | source = "registry+https://github.com/rust-lang/crates.io-index" 2402 | checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 2403 | dependencies = [ 2404 | "digest", 2405 | "rand_core", 2406 | ] 2407 | 2408 | [[package]] 2409 | name = "sketches-ddsketch" 2410 | version = "0.2.2" 2411 | source = "registry+https://github.com/rust-lang/crates.io-index" 2412 | checksum = "85636c14b73d81f541e525f585c0a2109e6744e1565b5c1668e31c70c10ed65c" 2413 | 2414 | [[package]] 2415 | name = "slab" 2416 | version = "0.4.9" 2417 | source = "registry+https://github.com/rust-lang/crates.io-index" 2418 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2419 | dependencies = [ 2420 | "autocfg", 2421 | ] 2422 | 2423 | [[package]] 2424 | name = "smallvec" 2425 | version = "1.13.2" 2426 | source = "registry+https://github.com/rust-lang/crates.io-index" 2427 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 2428 | dependencies = [ 2429 | "serde", 2430 | ] 2431 | 2432 | [[package]] 2433 | name = "socket2" 2434 | version = "0.5.8" 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" 2436 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 2437 | dependencies = [ 2438 | "libc", 2439 | "windows-sys 0.52.0", 2440 | ] 2441 | 2442 | [[package]] 2443 | name = "spin" 2444 | version = "0.9.8" 2445 | source = "registry+https://github.com/rust-lang/crates.io-index" 2446 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 2447 | dependencies = [ 2448 | "lock_api", 2449 | ] 2450 | 2451 | [[package]] 2452 | name = "spki" 2453 | version = "0.7.3" 2454 | source = "registry+https://github.com/rust-lang/crates.io-index" 2455 | checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 2456 | dependencies = [ 2457 | "base64ct", 2458 | "der", 2459 | ] 2460 | 2461 | [[package]] 2462 | name = "sqlx" 2463 | version = "0.8.3" 2464 | source = "registry+https://github.com/rust-lang/crates.io-index" 2465 | checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" 2466 | dependencies = [ 2467 | "sqlx-core", 2468 | "sqlx-macros", 2469 | "sqlx-mysql", 2470 | "sqlx-postgres", 2471 | "sqlx-sqlite", 2472 | ] 2473 | 2474 | [[package]] 2475 | name = "sqlx-core" 2476 | version = "0.8.3" 2477 | source = "registry+https://github.com/rust-lang/crates.io-index" 2478 | checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" 2479 | dependencies = [ 2480 | "bytes", 2481 | "chrono", 2482 | "crc", 2483 | "crossbeam-queue", 2484 | "either", 2485 | "event-listener", 2486 | "futures-core", 2487 | "futures-intrusive", 2488 | "futures-io", 2489 | "futures-util", 2490 | "hashbrown 0.15.2", 2491 | "hashlink", 2492 | "indexmap 2.7.1", 2493 | "log", 2494 | "memchr", 2495 | "once_cell", 2496 | "percent-encoding", 2497 | "rustls 0.23.22", 2498 | "rustls-pemfile 2.2.0", 2499 | "serde", 2500 | "serde_json", 2501 | "sha2", 2502 | "smallvec", 2503 | "thiserror 2.0.11", 2504 | "time", 2505 | "tokio", 2506 | "tokio-stream", 2507 | "tracing", 2508 | "url", 2509 | "uuid", 2510 | "webpki-roots", 2511 | ] 2512 | 2513 | [[package]] 2514 | name = "sqlx-macros" 2515 | version = "0.8.3" 2516 | source = "registry+https://github.com/rust-lang/crates.io-index" 2517 | checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" 2518 | dependencies = [ 2519 | "proc-macro2", 2520 | "quote", 2521 | "sqlx-core", 2522 | "sqlx-macros-core", 2523 | "syn", 2524 | ] 2525 | 2526 | [[package]] 2527 | name = "sqlx-macros-core" 2528 | version = "0.8.3" 2529 | source = "registry+https://github.com/rust-lang/crates.io-index" 2530 | checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" 2531 | dependencies = [ 2532 | "dotenvy", 2533 | "either", 2534 | "heck", 2535 | "hex", 2536 | "once_cell", 2537 | "proc-macro2", 2538 | "quote", 2539 | "serde", 2540 | "serde_json", 2541 | "sha2", 2542 | "sqlx-core", 2543 | "sqlx-mysql", 2544 | "sqlx-postgres", 2545 | "sqlx-sqlite", 2546 | "syn", 2547 | "tempfile", 2548 | "tokio", 2549 | "url", 2550 | ] 2551 | 2552 | [[package]] 2553 | name = "sqlx-mysql" 2554 | version = "0.8.3" 2555 | source = "registry+https://github.com/rust-lang/crates.io-index" 2556 | checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" 2557 | dependencies = [ 2558 | "atoi", 2559 | "base64 0.22.1", 2560 | "bitflags 2.8.0", 2561 | "byteorder", 2562 | "bytes", 2563 | "chrono", 2564 | "crc", 2565 | "digest", 2566 | "dotenvy", 2567 | "either", 2568 | "futures-channel", 2569 | "futures-core", 2570 | "futures-io", 2571 | "futures-util", 2572 | "generic-array", 2573 | "hex", 2574 | "hkdf", 2575 | "hmac", 2576 | "itoa", 2577 | "log", 2578 | "md-5", 2579 | "memchr", 2580 | "once_cell", 2581 | "percent-encoding", 2582 | "rand", 2583 | "rsa", 2584 | "serde", 2585 | "sha1", 2586 | "sha2", 2587 | "smallvec", 2588 | "sqlx-core", 2589 | "stringprep", 2590 | "thiserror 2.0.11", 2591 | "time", 2592 | "tracing", 2593 | "uuid", 2594 | "whoami", 2595 | ] 2596 | 2597 | [[package]] 2598 | name = "sqlx-postgres" 2599 | version = "0.8.3" 2600 | source = "registry+https://github.com/rust-lang/crates.io-index" 2601 | checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" 2602 | dependencies = [ 2603 | "atoi", 2604 | "base64 0.22.1", 2605 | "bitflags 2.8.0", 2606 | "byteorder", 2607 | "chrono", 2608 | "crc", 2609 | "dotenvy", 2610 | "etcetera", 2611 | "futures-channel", 2612 | "futures-core", 2613 | "futures-util", 2614 | "hex", 2615 | "hkdf", 2616 | "hmac", 2617 | "home", 2618 | "itoa", 2619 | "log", 2620 | "md-5", 2621 | "memchr", 2622 | "once_cell", 2623 | "rand", 2624 | "serde", 2625 | "serde_json", 2626 | "sha2", 2627 | "smallvec", 2628 | "sqlx-core", 2629 | "stringprep", 2630 | "thiserror 2.0.11", 2631 | "time", 2632 | "tracing", 2633 | "uuid", 2634 | "whoami", 2635 | ] 2636 | 2637 | [[package]] 2638 | name = "sqlx-sqlite" 2639 | version = "0.8.3" 2640 | source = "registry+https://github.com/rust-lang/crates.io-index" 2641 | checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" 2642 | dependencies = [ 2643 | "atoi", 2644 | "chrono", 2645 | "flume", 2646 | "futures-channel", 2647 | "futures-core", 2648 | "futures-executor", 2649 | "futures-intrusive", 2650 | "futures-util", 2651 | "libsqlite3-sys", 2652 | "log", 2653 | "percent-encoding", 2654 | "serde", 2655 | "serde_urlencoded", 2656 | "sqlx-core", 2657 | "time", 2658 | "tracing", 2659 | "url", 2660 | "uuid", 2661 | ] 2662 | 2663 | [[package]] 2664 | name = "stable_deref_trait" 2665 | version = "1.2.0" 2666 | source = "registry+https://github.com/rust-lang/crates.io-index" 2667 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2668 | 2669 | [[package]] 2670 | name = "stringprep" 2671 | version = "0.1.5" 2672 | source = "registry+https://github.com/rust-lang/crates.io-index" 2673 | checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 2674 | dependencies = [ 2675 | "unicode-bidi", 2676 | "unicode-normalization", 2677 | "unicode-properties", 2678 | ] 2679 | 2680 | [[package]] 2681 | name = "subtle" 2682 | version = "2.6.1" 2683 | source = "registry+https://github.com/rust-lang/crates.io-index" 2684 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2685 | 2686 | [[package]] 2687 | name = "syn" 2688 | version = "2.0.98" 2689 | source = "registry+https://github.com/rust-lang/crates.io-index" 2690 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 2691 | dependencies = [ 2692 | "proc-macro2", 2693 | "quote", 2694 | "unicode-ident", 2695 | ] 2696 | 2697 | [[package]] 2698 | name = "sync_wrapper" 2699 | version = "0.1.2" 2700 | source = "registry+https://github.com/rust-lang/crates.io-index" 2701 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 2702 | 2703 | [[package]] 2704 | name = "sync_wrapper" 2705 | version = "1.0.2" 2706 | source = "registry+https://github.com/rust-lang/crates.io-index" 2707 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 2708 | dependencies = [ 2709 | "futures-core", 2710 | ] 2711 | 2712 | [[package]] 2713 | name = "synstructure" 2714 | version = "0.13.1" 2715 | source = "registry+https://github.com/rust-lang/crates.io-index" 2716 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 2717 | dependencies = [ 2718 | "proc-macro2", 2719 | "quote", 2720 | "syn", 2721 | ] 2722 | 2723 | [[package]] 2724 | name = "sysinfo" 2725 | version = "0.30.13" 2726 | source = "registry+https://github.com/rust-lang/crates.io-index" 2727 | checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" 2728 | dependencies = [ 2729 | "cfg-if", 2730 | "core-foundation-sys", 2731 | "libc", 2732 | "ntapi", 2733 | "once_cell", 2734 | "rayon", 2735 | "windows", 2736 | ] 2737 | 2738 | [[package]] 2739 | name = "system-configuration" 2740 | version = "0.5.1" 2741 | source = "registry+https://github.com/rust-lang/crates.io-index" 2742 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 2743 | dependencies = [ 2744 | "bitflags 1.3.2", 2745 | "core-foundation", 2746 | "system-configuration-sys", 2747 | ] 2748 | 2749 | [[package]] 2750 | name = "system-configuration-sys" 2751 | version = "0.5.0" 2752 | source = "registry+https://github.com/rust-lang/crates.io-index" 2753 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 2754 | dependencies = [ 2755 | "core-foundation-sys", 2756 | "libc", 2757 | ] 2758 | 2759 | [[package]] 2760 | name = "tempfile" 2761 | version = "3.16.0" 2762 | source = "registry+https://github.com/rust-lang/crates.io-index" 2763 | checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" 2764 | dependencies = [ 2765 | "cfg-if", 2766 | "fastrand", 2767 | "getrandom 0.3.1", 2768 | "once_cell", 2769 | "rustix", 2770 | "windows-sys 0.59.0", 2771 | ] 2772 | 2773 | [[package]] 2774 | name = "thiserror" 2775 | version = "1.0.69" 2776 | source = "registry+https://github.com/rust-lang/crates.io-index" 2777 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2778 | dependencies = [ 2779 | "thiserror-impl 1.0.69", 2780 | ] 2781 | 2782 | [[package]] 2783 | name = "thiserror" 2784 | version = "2.0.11" 2785 | source = "registry+https://github.com/rust-lang/crates.io-index" 2786 | checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" 2787 | dependencies = [ 2788 | "thiserror-impl 2.0.11", 2789 | ] 2790 | 2791 | [[package]] 2792 | name = "thiserror-impl" 2793 | version = "1.0.69" 2794 | source = "registry+https://github.com/rust-lang/crates.io-index" 2795 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2796 | dependencies = [ 2797 | "proc-macro2", 2798 | "quote", 2799 | "syn", 2800 | ] 2801 | 2802 | [[package]] 2803 | name = "thiserror-impl" 2804 | version = "2.0.11" 2805 | source = "registry+https://github.com/rust-lang/crates.io-index" 2806 | checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" 2807 | dependencies = [ 2808 | "proc-macro2", 2809 | "quote", 2810 | "syn", 2811 | ] 2812 | 2813 | [[package]] 2814 | name = "thread_local" 2815 | version = "1.1.8" 2816 | source = "registry+https://github.com/rust-lang/crates.io-index" 2817 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2818 | dependencies = [ 2819 | "cfg-if", 2820 | "once_cell", 2821 | ] 2822 | 2823 | [[package]] 2824 | name = "time" 2825 | version = "0.3.37" 2826 | source = "registry+https://github.com/rust-lang/crates.io-index" 2827 | checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" 2828 | dependencies = [ 2829 | "deranged", 2830 | "itoa", 2831 | "libc", 2832 | "num-conv", 2833 | "num_threads", 2834 | "powerfmt", 2835 | "serde", 2836 | "time-core", 2837 | "time-macros", 2838 | ] 2839 | 2840 | [[package]] 2841 | name = "time-core" 2842 | version = "0.1.2" 2843 | source = "registry+https://github.com/rust-lang/crates.io-index" 2844 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 2845 | 2846 | [[package]] 2847 | name = "time-macros" 2848 | version = "0.2.19" 2849 | source = "registry+https://github.com/rust-lang/crates.io-index" 2850 | checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" 2851 | dependencies = [ 2852 | "num-conv", 2853 | "time-core", 2854 | ] 2855 | 2856 | [[package]] 2857 | name = "tinystr" 2858 | version = "0.7.6" 2859 | source = "registry+https://github.com/rust-lang/crates.io-index" 2860 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 2861 | dependencies = [ 2862 | "displaydoc", 2863 | "zerovec", 2864 | ] 2865 | 2866 | [[package]] 2867 | name = "tinyvec" 2868 | version = "1.8.1" 2869 | source = "registry+https://github.com/rust-lang/crates.io-index" 2870 | checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" 2871 | dependencies = [ 2872 | "tinyvec_macros", 2873 | ] 2874 | 2875 | [[package]] 2876 | name = "tinyvec_macros" 2877 | version = "0.1.1" 2878 | source = "registry+https://github.com/rust-lang/crates.io-index" 2879 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2880 | 2881 | [[package]] 2882 | name = "tokio" 2883 | version = "1.43.0" 2884 | source = "registry+https://github.com/rust-lang/crates.io-index" 2885 | checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" 2886 | dependencies = [ 2887 | "backtrace", 2888 | "bytes", 2889 | "libc", 2890 | "mio", 2891 | "parking_lot", 2892 | "pin-project-lite", 2893 | "signal-hook-registry", 2894 | "socket2", 2895 | "tokio-macros", 2896 | "windows-sys 0.52.0", 2897 | ] 2898 | 2899 | [[package]] 2900 | name = "tokio-macros" 2901 | version = "2.5.0" 2902 | source = "registry+https://github.com/rust-lang/crates.io-index" 2903 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2904 | dependencies = [ 2905 | "proc-macro2", 2906 | "quote", 2907 | "syn", 2908 | ] 2909 | 2910 | [[package]] 2911 | name = "tokio-rustls" 2912 | version = "0.24.1" 2913 | source = "registry+https://github.com/rust-lang/crates.io-index" 2914 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 2915 | dependencies = [ 2916 | "rustls 0.21.12", 2917 | "tokio", 2918 | ] 2919 | 2920 | [[package]] 2921 | name = "tokio-rustls" 2922 | version = "0.26.1" 2923 | source = "registry+https://github.com/rust-lang/crates.io-index" 2924 | checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" 2925 | dependencies = [ 2926 | "rustls 0.23.22", 2927 | "tokio", 2928 | ] 2929 | 2930 | [[package]] 2931 | name = "tokio-stream" 2932 | version = "0.1.17" 2933 | source = "registry+https://github.com/rust-lang/crates.io-index" 2934 | checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 2935 | dependencies = [ 2936 | "futures-core", 2937 | "pin-project-lite", 2938 | "tokio", 2939 | ] 2940 | 2941 | [[package]] 2942 | name = "tokio-util" 2943 | version = "0.7.13" 2944 | source = "registry+https://github.com/rust-lang/crates.io-index" 2945 | checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" 2946 | dependencies = [ 2947 | "bytes", 2948 | "futures-core", 2949 | "futures-sink", 2950 | "pin-project-lite", 2951 | "tokio", 2952 | ] 2953 | 2954 | [[package]] 2955 | name = "toml" 2956 | version = "0.5.11" 2957 | source = "registry+https://github.com/rust-lang/crates.io-index" 2958 | checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" 2959 | dependencies = [ 2960 | "serde", 2961 | ] 2962 | 2963 | [[package]] 2964 | name = "tower" 2965 | version = "0.4.13" 2966 | source = "registry+https://github.com/rust-lang/crates.io-index" 2967 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 2968 | dependencies = [ 2969 | "futures-core", 2970 | "futures-util", 2971 | "pin-project", 2972 | "pin-project-lite", 2973 | "tower-layer", 2974 | "tower-service", 2975 | "tracing", 2976 | ] 2977 | 2978 | [[package]] 2979 | name = "tower" 2980 | version = "0.5.2" 2981 | source = "registry+https://github.com/rust-lang/crates.io-index" 2982 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 2983 | dependencies = [ 2984 | "futures-core", 2985 | "futures-util", 2986 | "pin-project-lite", 2987 | "sync_wrapper 1.0.2", 2988 | "tokio", 2989 | "tower-layer", 2990 | "tower-service", 2991 | "tracing", 2992 | ] 2993 | 2994 | [[package]] 2995 | name = "tower-http" 2996 | version = "0.5.2" 2997 | source = "registry+https://github.com/rust-lang/crates.io-index" 2998 | checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" 2999 | dependencies = [ 3000 | "bitflags 2.8.0", 3001 | "bytes", 3002 | "http 1.2.0", 3003 | "http-body 1.0.1", 3004 | "http-body-util", 3005 | "pin-project-lite", 3006 | "tower-layer", 3007 | "tower-service", 3008 | "tracing", 3009 | ] 3010 | 3011 | [[package]] 3012 | name = "tower-layer" 3013 | version = "0.3.3" 3014 | source = "registry+https://github.com/rust-lang/crates.io-index" 3015 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 3016 | 3017 | [[package]] 3018 | name = "tower-service" 3019 | version = "0.3.3" 3020 | source = "registry+https://github.com/rust-lang/crates.io-index" 3021 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 3022 | 3023 | [[package]] 3024 | name = "tracing" 3025 | version = "0.1.41" 3026 | source = "registry+https://github.com/rust-lang/crates.io-index" 3027 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 3028 | dependencies = [ 3029 | "log", 3030 | "pin-project-lite", 3031 | "tracing-attributes", 3032 | "tracing-core", 3033 | ] 3034 | 3035 | [[package]] 3036 | name = "tracing-attributes" 3037 | version = "0.1.28" 3038 | source = "registry+https://github.com/rust-lang/crates.io-index" 3039 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 3040 | dependencies = [ 3041 | "proc-macro2", 3042 | "quote", 3043 | "syn", 3044 | ] 3045 | 3046 | [[package]] 3047 | name = "tracing-core" 3048 | version = "0.1.33" 3049 | source = "registry+https://github.com/rust-lang/crates.io-index" 3050 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 3051 | dependencies = [ 3052 | "once_cell", 3053 | "valuable", 3054 | ] 3055 | 3056 | [[package]] 3057 | name = "tracing-log" 3058 | version = "0.2.0" 3059 | source = "registry+https://github.com/rust-lang/crates.io-index" 3060 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 3061 | dependencies = [ 3062 | "log", 3063 | "once_cell", 3064 | "tracing-core", 3065 | ] 3066 | 3067 | [[package]] 3068 | name = "tracing-subscriber" 3069 | version = "0.3.19" 3070 | source = "registry+https://github.com/rust-lang/crates.io-index" 3071 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 3072 | dependencies = [ 3073 | "matchers", 3074 | "once_cell", 3075 | "regex", 3076 | "sharded-slab", 3077 | "thread_local", 3078 | "tracing", 3079 | "tracing-core", 3080 | ] 3081 | 3082 | [[package]] 3083 | name = "tracing-tree" 3084 | version = "0.4.0" 3085 | source = "registry+https://github.com/rust-lang/crates.io-index" 3086 | checksum = "f459ca79f1b0d5f71c54ddfde6debfc59c8b6eeb46808ae492077f739dc7b49c" 3087 | dependencies = [ 3088 | "nu-ansi-term", 3089 | "tracing-core", 3090 | "tracing-log", 3091 | "tracing-subscriber", 3092 | ] 3093 | 3094 | [[package]] 3095 | name = "try-lock" 3096 | version = "0.2.5" 3097 | source = "registry+https://github.com/rust-lang/crates.io-index" 3098 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 3099 | 3100 | [[package]] 3101 | name = "typed-builder" 3102 | version = "0.18.2" 3103 | source = "registry+https://github.com/rust-lang/crates.io-index" 3104 | checksum = "77739c880e00693faef3d65ea3aad725f196da38b22fdc7ea6ded6e1ce4d3add" 3105 | dependencies = [ 3106 | "typed-builder-macro", 3107 | ] 3108 | 3109 | [[package]] 3110 | name = "typed-builder-macro" 3111 | version = "0.18.2" 3112 | source = "registry+https://github.com/rust-lang/crates.io-index" 3113 | checksum = "1f718dfaf347dcb5b983bfc87608144b0bad87970aebcbea5ce44d2a30c08e63" 3114 | dependencies = [ 3115 | "proc-macro2", 3116 | "quote", 3117 | "syn", 3118 | ] 3119 | 3120 | [[package]] 3121 | name = "typenum" 3122 | version = "1.17.0" 3123 | source = "registry+https://github.com/rust-lang/crates.io-index" 3124 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 3125 | 3126 | [[package]] 3127 | name = "unicode-bidi" 3128 | version = "0.3.18" 3129 | source = "registry+https://github.com/rust-lang/crates.io-index" 3130 | checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 3131 | 3132 | [[package]] 3133 | name = "unicode-ident" 3134 | version = "1.0.16" 3135 | source = "registry+https://github.com/rust-lang/crates.io-index" 3136 | checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" 3137 | 3138 | [[package]] 3139 | name = "unicode-normalization" 3140 | version = "0.1.24" 3141 | source = "registry+https://github.com/rust-lang/crates.io-index" 3142 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 3143 | dependencies = [ 3144 | "tinyvec", 3145 | ] 3146 | 3147 | [[package]] 3148 | name = "unicode-properties" 3149 | version = "0.1.3" 3150 | source = "registry+https://github.com/rust-lang/crates.io-index" 3151 | checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 3152 | 3153 | [[package]] 3154 | name = "untrusted" 3155 | version = "0.9.0" 3156 | source = "registry+https://github.com/rust-lang/crates.io-index" 3157 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 3158 | 3159 | [[package]] 3160 | name = "url" 3161 | version = "2.5.4" 3162 | source = "registry+https://github.com/rust-lang/crates.io-index" 3163 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 3164 | dependencies = [ 3165 | "form_urlencoded", 3166 | "idna", 3167 | "percent-encoding", 3168 | ] 3169 | 3170 | [[package]] 3171 | name = "utf16_iter" 3172 | version = "1.0.5" 3173 | source = "registry+https://github.com/rust-lang/crates.io-index" 3174 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 3175 | 3176 | [[package]] 3177 | name = "utf8_iter" 3178 | version = "1.0.4" 3179 | source = "registry+https://github.com/rust-lang/crates.io-index" 3180 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 3181 | 3182 | [[package]] 3183 | name = "uuid" 3184 | version = "1.12.1" 3185 | source = "registry+https://github.com/rust-lang/crates.io-index" 3186 | checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" 3187 | dependencies = [ 3188 | "getrandom 0.2.15", 3189 | "serde", 3190 | ] 3191 | 3192 | [[package]] 3193 | name = "valuable" 3194 | version = "0.1.1" 3195 | source = "registry+https://github.com/rust-lang/crates.io-index" 3196 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 3197 | 3198 | [[package]] 3199 | name = "vcpkg" 3200 | version = "0.2.15" 3201 | source = "registry+https://github.com/rust-lang/crates.io-index" 3202 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3203 | 3204 | [[package]] 3205 | name = "version_check" 3206 | version = "0.9.5" 3207 | source = "registry+https://github.com/rust-lang/crates.io-index" 3208 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 3209 | 3210 | [[package]] 3211 | name = "want" 3212 | version = "0.3.1" 3213 | source = "registry+https://github.com/rust-lang/crates.io-index" 3214 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 3215 | dependencies = [ 3216 | "try-lock", 3217 | ] 3218 | 3219 | [[package]] 3220 | name = "wasi" 3221 | version = "0.11.0+wasi-snapshot-preview1" 3222 | source = "registry+https://github.com/rust-lang/crates.io-index" 3223 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3224 | 3225 | [[package]] 3226 | name = "wasi" 3227 | version = "0.13.3+wasi-0.2.2" 3228 | source = "registry+https://github.com/rust-lang/crates.io-index" 3229 | checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" 3230 | dependencies = [ 3231 | "wit-bindgen-rt", 3232 | ] 3233 | 3234 | [[package]] 3235 | name = "wasite" 3236 | version = "0.1.0" 3237 | source = "registry+https://github.com/rust-lang/crates.io-index" 3238 | checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 3239 | 3240 | [[package]] 3241 | name = "wasm-bindgen" 3242 | version = "0.2.100" 3243 | source = "registry+https://github.com/rust-lang/crates.io-index" 3244 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 3245 | dependencies = [ 3246 | "cfg-if", 3247 | "once_cell", 3248 | "rustversion", 3249 | "wasm-bindgen-macro", 3250 | ] 3251 | 3252 | [[package]] 3253 | name = "wasm-bindgen-backend" 3254 | version = "0.2.100" 3255 | source = "registry+https://github.com/rust-lang/crates.io-index" 3256 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 3257 | dependencies = [ 3258 | "bumpalo", 3259 | "log", 3260 | "proc-macro2", 3261 | "quote", 3262 | "syn", 3263 | "wasm-bindgen-shared", 3264 | ] 3265 | 3266 | [[package]] 3267 | name = "wasm-bindgen-futures" 3268 | version = "0.4.50" 3269 | source = "registry+https://github.com/rust-lang/crates.io-index" 3270 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 3271 | dependencies = [ 3272 | "cfg-if", 3273 | "js-sys", 3274 | "once_cell", 3275 | "wasm-bindgen", 3276 | "web-sys", 3277 | ] 3278 | 3279 | [[package]] 3280 | name = "wasm-bindgen-macro" 3281 | version = "0.2.100" 3282 | source = "registry+https://github.com/rust-lang/crates.io-index" 3283 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 3284 | dependencies = [ 3285 | "quote", 3286 | "wasm-bindgen-macro-support", 3287 | ] 3288 | 3289 | [[package]] 3290 | name = "wasm-bindgen-macro-support" 3291 | version = "0.2.100" 3292 | source = "registry+https://github.com/rust-lang/crates.io-index" 3293 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 3294 | dependencies = [ 3295 | "proc-macro2", 3296 | "quote", 3297 | "syn", 3298 | "wasm-bindgen-backend", 3299 | "wasm-bindgen-shared", 3300 | ] 3301 | 3302 | [[package]] 3303 | name = "wasm-bindgen-shared" 3304 | version = "0.2.100" 3305 | source = "registry+https://github.com/rust-lang/crates.io-index" 3306 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 3307 | dependencies = [ 3308 | "unicode-ident", 3309 | ] 3310 | 3311 | [[package]] 3312 | name = "web-sys" 3313 | version = "0.3.77" 3314 | source = "registry+https://github.com/rust-lang/crates.io-index" 3315 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 3316 | dependencies = [ 3317 | "js-sys", 3318 | "wasm-bindgen", 3319 | ] 3320 | 3321 | [[package]] 3322 | name = "web-time" 3323 | version = "1.1.0" 3324 | source = "registry+https://github.com/rust-lang/crates.io-index" 3325 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 3326 | dependencies = [ 3327 | "js-sys", 3328 | "wasm-bindgen", 3329 | ] 3330 | 3331 | [[package]] 3332 | name = "webpki-roots" 3333 | version = "0.26.8" 3334 | source = "registry+https://github.com/rust-lang/crates.io-index" 3335 | checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" 3336 | dependencies = [ 3337 | "rustls-pki-types", 3338 | ] 3339 | 3340 | [[package]] 3341 | name = "whoami" 3342 | version = "1.5.2" 3343 | source = "registry+https://github.com/rust-lang/crates.io-index" 3344 | checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" 3345 | dependencies = [ 3346 | "redox_syscall", 3347 | "wasite", 3348 | ] 3349 | 3350 | [[package]] 3351 | name = "winapi" 3352 | version = "0.3.9" 3353 | source = "registry+https://github.com/rust-lang/crates.io-index" 3354 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3355 | dependencies = [ 3356 | "winapi-i686-pc-windows-gnu", 3357 | "winapi-x86_64-pc-windows-gnu", 3358 | ] 3359 | 3360 | [[package]] 3361 | name = "winapi-i686-pc-windows-gnu" 3362 | version = "0.4.0" 3363 | source = "registry+https://github.com/rust-lang/crates.io-index" 3364 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3365 | 3366 | [[package]] 3367 | name = "winapi-x86_64-pc-windows-gnu" 3368 | version = "0.4.0" 3369 | source = "registry+https://github.com/rust-lang/crates.io-index" 3370 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3371 | 3372 | [[package]] 3373 | name = "windows" 3374 | version = "0.52.0" 3375 | source = "registry+https://github.com/rust-lang/crates.io-index" 3376 | checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" 3377 | dependencies = [ 3378 | "windows-core", 3379 | "windows-targets 0.52.6", 3380 | ] 3381 | 3382 | [[package]] 3383 | name = "windows-core" 3384 | version = "0.52.0" 3385 | source = "registry+https://github.com/rust-lang/crates.io-index" 3386 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 3387 | dependencies = [ 3388 | "windows-targets 0.52.6", 3389 | ] 3390 | 3391 | [[package]] 3392 | name = "windows-registry" 3393 | version = "0.2.0" 3394 | source = "registry+https://github.com/rust-lang/crates.io-index" 3395 | checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" 3396 | dependencies = [ 3397 | "windows-result", 3398 | "windows-strings", 3399 | "windows-targets 0.52.6", 3400 | ] 3401 | 3402 | [[package]] 3403 | name = "windows-result" 3404 | version = "0.2.0" 3405 | source = "registry+https://github.com/rust-lang/crates.io-index" 3406 | checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 3407 | dependencies = [ 3408 | "windows-targets 0.52.6", 3409 | ] 3410 | 3411 | [[package]] 3412 | name = "windows-strings" 3413 | version = "0.1.0" 3414 | source = "registry+https://github.com/rust-lang/crates.io-index" 3415 | checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 3416 | dependencies = [ 3417 | "windows-result", 3418 | "windows-targets 0.52.6", 3419 | ] 3420 | 3421 | [[package]] 3422 | name = "windows-sys" 3423 | version = "0.48.0" 3424 | source = "registry+https://github.com/rust-lang/crates.io-index" 3425 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3426 | dependencies = [ 3427 | "windows-targets 0.48.5", 3428 | ] 3429 | 3430 | [[package]] 3431 | name = "windows-sys" 3432 | version = "0.52.0" 3433 | source = "registry+https://github.com/rust-lang/crates.io-index" 3434 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3435 | dependencies = [ 3436 | "windows-targets 0.52.6", 3437 | ] 3438 | 3439 | [[package]] 3440 | name = "windows-sys" 3441 | version = "0.59.0" 3442 | source = "registry+https://github.com/rust-lang/crates.io-index" 3443 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 3444 | dependencies = [ 3445 | "windows-targets 0.52.6", 3446 | ] 3447 | 3448 | [[package]] 3449 | name = "windows-targets" 3450 | version = "0.48.5" 3451 | source = "registry+https://github.com/rust-lang/crates.io-index" 3452 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3453 | dependencies = [ 3454 | "windows_aarch64_gnullvm 0.48.5", 3455 | "windows_aarch64_msvc 0.48.5", 3456 | "windows_i686_gnu 0.48.5", 3457 | "windows_i686_msvc 0.48.5", 3458 | "windows_x86_64_gnu 0.48.5", 3459 | "windows_x86_64_gnullvm 0.48.5", 3460 | "windows_x86_64_msvc 0.48.5", 3461 | ] 3462 | 3463 | [[package]] 3464 | name = "windows-targets" 3465 | version = "0.52.6" 3466 | source = "registry+https://github.com/rust-lang/crates.io-index" 3467 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3468 | dependencies = [ 3469 | "windows_aarch64_gnullvm 0.52.6", 3470 | "windows_aarch64_msvc 0.52.6", 3471 | "windows_i686_gnu 0.52.6", 3472 | "windows_i686_gnullvm", 3473 | "windows_i686_msvc 0.52.6", 3474 | "windows_x86_64_gnu 0.52.6", 3475 | "windows_x86_64_gnullvm 0.52.6", 3476 | "windows_x86_64_msvc 0.52.6", 3477 | ] 3478 | 3479 | [[package]] 3480 | name = "windows_aarch64_gnullvm" 3481 | version = "0.48.5" 3482 | source = "registry+https://github.com/rust-lang/crates.io-index" 3483 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3484 | 3485 | [[package]] 3486 | name = "windows_aarch64_gnullvm" 3487 | version = "0.52.6" 3488 | source = "registry+https://github.com/rust-lang/crates.io-index" 3489 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3490 | 3491 | [[package]] 3492 | name = "windows_aarch64_msvc" 3493 | version = "0.48.5" 3494 | source = "registry+https://github.com/rust-lang/crates.io-index" 3495 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3496 | 3497 | [[package]] 3498 | name = "windows_aarch64_msvc" 3499 | version = "0.52.6" 3500 | source = "registry+https://github.com/rust-lang/crates.io-index" 3501 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3502 | 3503 | [[package]] 3504 | name = "windows_i686_gnu" 3505 | version = "0.48.5" 3506 | source = "registry+https://github.com/rust-lang/crates.io-index" 3507 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3508 | 3509 | [[package]] 3510 | name = "windows_i686_gnu" 3511 | version = "0.52.6" 3512 | source = "registry+https://github.com/rust-lang/crates.io-index" 3513 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3514 | 3515 | [[package]] 3516 | name = "windows_i686_gnullvm" 3517 | version = "0.52.6" 3518 | source = "registry+https://github.com/rust-lang/crates.io-index" 3519 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3520 | 3521 | [[package]] 3522 | name = "windows_i686_msvc" 3523 | version = "0.48.5" 3524 | source = "registry+https://github.com/rust-lang/crates.io-index" 3525 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3526 | 3527 | [[package]] 3528 | name = "windows_i686_msvc" 3529 | version = "0.52.6" 3530 | source = "registry+https://github.com/rust-lang/crates.io-index" 3531 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3532 | 3533 | [[package]] 3534 | name = "windows_x86_64_gnu" 3535 | version = "0.48.5" 3536 | source = "registry+https://github.com/rust-lang/crates.io-index" 3537 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3538 | 3539 | [[package]] 3540 | name = "windows_x86_64_gnu" 3541 | version = "0.52.6" 3542 | source = "registry+https://github.com/rust-lang/crates.io-index" 3543 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3544 | 3545 | [[package]] 3546 | name = "windows_x86_64_gnullvm" 3547 | version = "0.48.5" 3548 | source = "registry+https://github.com/rust-lang/crates.io-index" 3549 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3550 | 3551 | [[package]] 3552 | name = "windows_x86_64_gnullvm" 3553 | version = "0.52.6" 3554 | source = "registry+https://github.com/rust-lang/crates.io-index" 3555 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3556 | 3557 | [[package]] 3558 | name = "windows_x86_64_msvc" 3559 | version = "0.48.5" 3560 | source = "registry+https://github.com/rust-lang/crates.io-index" 3561 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3562 | 3563 | [[package]] 3564 | name = "windows_x86_64_msvc" 3565 | version = "0.52.6" 3566 | source = "registry+https://github.com/rust-lang/crates.io-index" 3567 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3568 | 3569 | [[package]] 3570 | name = "winreg" 3571 | version = "0.50.0" 3572 | source = "registry+https://github.com/rust-lang/crates.io-index" 3573 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 3574 | dependencies = [ 3575 | "cfg-if", 3576 | "windows-sys 0.48.0", 3577 | ] 3578 | 3579 | [[package]] 3580 | name = "wit-bindgen-rt" 3581 | version = "0.33.0" 3582 | source = "registry+https://github.com/rust-lang/crates.io-index" 3583 | checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" 3584 | dependencies = [ 3585 | "bitflags 2.8.0", 3586 | ] 3587 | 3588 | [[package]] 3589 | name = "write16" 3590 | version = "1.0.0" 3591 | source = "registry+https://github.com/rust-lang/crates.io-index" 3592 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 3593 | 3594 | [[package]] 3595 | name = "writeable" 3596 | version = "0.5.5" 3597 | source = "registry+https://github.com/rust-lang/crates.io-index" 3598 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 3599 | 3600 | [[package]] 3601 | name = "yoke" 3602 | version = "0.7.5" 3603 | source = "registry+https://github.com/rust-lang/crates.io-index" 3604 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 3605 | dependencies = [ 3606 | "serde", 3607 | "stable_deref_trait", 3608 | "yoke-derive", 3609 | "zerofrom", 3610 | ] 3611 | 3612 | [[package]] 3613 | name = "yoke-derive" 3614 | version = "0.7.5" 3615 | source = "registry+https://github.com/rust-lang/crates.io-index" 3616 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 3617 | dependencies = [ 3618 | "proc-macro2", 3619 | "quote", 3620 | "syn", 3621 | "synstructure", 3622 | ] 3623 | 3624 | [[package]] 3625 | name = "zerocopy" 3626 | version = "0.7.35" 3627 | source = "registry+https://github.com/rust-lang/crates.io-index" 3628 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 3629 | dependencies = [ 3630 | "byteorder", 3631 | "zerocopy-derive", 3632 | ] 3633 | 3634 | [[package]] 3635 | name = "zerocopy-derive" 3636 | version = "0.7.35" 3637 | source = "registry+https://github.com/rust-lang/crates.io-index" 3638 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 3639 | dependencies = [ 3640 | "proc-macro2", 3641 | "quote", 3642 | "syn", 3643 | ] 3644 | 3645 | [[package]] 3646 | name = "zerofrom" 3647 | version = "0.1.5" 3648 | source = "registry+https://github.com/rust-lang/crates.io-index" 3649 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 3650 | dependencies = [ 3651 | "zerofrom-derive", 3652 | ] 3653 | 3654 | [[package]] 3655 | name = "zerofrom-derive" 3656 | version = "0.1.5" 3657 | source = "registry+https://github.com/rust-lang/crates.io-index" 3658 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 3659 | dependencies = [ 3660 | "proc-macro2", 3661 | "quote", 3662 | "syn", 3663 | "synstructure", 3664 | ] 3665 | 3666 | [[package]] 3667 | name = "zeroize" 3668 | version = "1.8.1" 3669 | source = "registry+https://github.com/rust-lang/crates.io-index" 3670 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 3671 | 3672 | [[package]] 3673 | name = "zerovec" 3674 | version = "0.10.4" 3675 | source = "registry+https://github.com/rust-lang/crates.io-index" 3676 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 3677 | dependencies = [ 3678 | "yoke", 3679 | "zerofrom", 3680 | "zerovec-derive", 3681 | ] 3682 | 3683 | [[package]] 3684 | name = "zerovec-derive" 3685 | version = "0.10.3" 3686 | source = "registry+https://github.com/rust-lang/crates.io-index" 3687 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 3688 | dependencies = [ 3689 | "proc-macro2", 3690 | "quote", 3691 | "syn", 3692 | ] 3693 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "atuin-server-sqlite-unofficial" 3 | version = "18.4.0" 4 | edition = "2021" 5 | description = "unofficial server sqlite database library for atuin" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | atuin-common = { version = "=18.4.0" } 11 | atuin-server = { version = "=18.4.0" } 12 | atuin-server-database = { version = "=18.4.0" } 13 | 14 | tracing = "0.1" 15 | time = { version = "0.3.37", features = ["serde-human-readable", "macros", "local-offset"] } 16 | serde = { version = "1", features = ["derive"] } 17 | async-trait = "0.1" 18 | futures-util = "0.3" 19 | tokio = { version = "1", features = ["full"] } 20 | tracing-tree = "0.4" 21 | 22 | [dependencies.sqlx] 23 | version = "0.8" 24 | features = ["runtime-tokio-rustls", "chrono", "sqlite"] 25 | 26 | [dependencies.tracing-subscriber] 27 | version = "0.3" 28 | default-features = false 29 | features = ["registry", "env-filter"] 30 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM lukemathwalker/cargo-chef:latest-rust-1.84.1-slim-bookworm AS chef 2 | WORKDIR /app 3 | 4 | FROM chef AS planner 5 | COPY . . 6 | RUN cargo chef prepare --recipe-path recipe.json 7 | 8 | FROM chef AS builder 9 | 10 | # Ensure working C compile setup (not installed by default in arm64 images) 11 | RUN apt update && apt install build-essential -y 12 | 13 | COPY --from=planner /app/recipe.json recipe.json 14 | RUN cargo chef cook --release --recipe-path recipe.json 15 | 16 | COPY . . 17 | RUN cargo build --release --bin atuin-server-sqlite-unofficial 18 | 19 | FROM debian:bookworm-20250113-slim AS runtime 20 | 21 | RUN useradd -c 'atuin user' atuin && mkdir /config && chown atuin:atuin /config 22 | # Install ca-certificates for webhooks to work 23 | RUN apt update && apt install ca-certificates sqlite3 -y && rm -rf /var/lib/apt/lists/* 24 | WORKDIR /app 25 | 26 | USER atuin 27 | 28 | ENV TZ=Etc/UTC 29 | ENV RUST_LOG=atuin::api=info 30 | ENV ATUIN_CONFIG_DIR=/config 31 | 32 | COPY --from=builder /app/target/release/atuin-server-sqlite-unofficial /usr/local/bin 33 | ENTRYPOINT ["/usr/local/bin/atuin-server-sqlite-unofficial"] 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # atuin sqlite 2 | 3 | atuin server but uses sqlite backend. 4 | 5 | ## Support ⚠️ 6 | 7 | While I am a maintainer of `atuin`, This is not an officially supported project and it mostly exists because people kept asking for it and 8 | it wasn't too hard to put here. 9 | 10 | ## Usage 11 | 12 | ```sh 13 | cargo install --release --git https://github.com/conradludgate/atuin-server-sqlite 14 | export ATUIN_DB_URI=sqlite://path/to/sqlite/file.db 15 | atuin-server-sqlite-unofficial 16 | ``` 17 | 18 | See the atuin self hosting docs for more info on settings. 19 | -------------------------------------------------------------------------------- /migrations/20230608124200_create_history.sql: -------------------------------------------------------------------------------- 1 | create table history ( 2 | id integer primary key autoincrement, 3 | client_id text not null unique, 4 | user_id integer not null, 5 | hostname text not null, 6 | timestamp text not null, 7 | data text not null, 8 | created_at text not null default current_timestamp, 9 | deleted_at text 10 | ); 11 | 12 | create unique index history_deleted_index on history(client_id, user_id, deleted_at); 13 | -------------------------------------------------------------------------------- /migrations/20230608124201_create_users.sql: -------------------------------------------------------------------------------- 1 | create table users ( 2 | id integer primary key autoincrement, 3 | username text not null unique, 4 | email text not null unique, 5 | password text not null unique, 6 | created_at text not null default (datetime('now','localtime')) 7 | ); 8 | 9 | create unique index email_unique_idx on users (lower(email)); 10 | create unique index username_unique_idx on users (lower(username)); 11 | -------------------------------------------------------------------------------- /migrations/20230608124202_create_sessions.sql: -------------------------------------------------------------------------------- 1 | create table sessions ( 2 | id integer primary key autoincrement, 3 | user_id integer, 4 | token text unique not null 5 | ); 6 | -------------------------------------------------------------------------------- /migrations/20230623070418_records.sql: -------------------------------------------------------------------------------- 1 | -- Add migration script here 2 | create table records ( 3 | id text primary key, -- remember to use uuidv7 for happy indices <3 4 | client_id text not null, -- I am too uncomfortable with the idea of a client-generated primary key 5 | host text not null, -- a unique identifier for the host 6 | parent text default null, -- the ID of the parent record, bearing in mind this is a linked list 7 | timestamp integer not null, -- not a timestamp type, as those do not have nanosecond precision 8 | version text not null, 9 | tag text not null, -- what is this? history, kv, whatever. Remember clients get a log per tag per host 10 | data text not null, -- store the actual history data, encrypted. I don't wanna know! 11 | cek text not null, 12 | 13 | user_id int not null, -- allow multiple users 14 | created_at text not null default current_timestamp 15 | ); 16 | -------------------------------------------------------------------------------- /migrations/20231202170508_create-store.sql: -------------------------------------------------------------------------------- 1 | -- Add migration script here 2 | create table store ( 3 | id text primary key, -- remember to use uuidv7 for happy indices <3 4 | client_id text not null, -- I am too uncomfortable with the idea of a client-generated primary key, even though it's fine mathematically 5 | host text not null, -- a unique identifier for the host 6 | idx bigint not null, -- the index of the record in this store, identified by (host, tag) 7 | timestamp bigint not null, -- not a timestamp type, as those do not have nanosecond precision 8 | version text not null, 9 | tag text not null, -- what is this? history, kv, whatever. Remember clients get a log per tag per host 10 | data text not null, -- store the actual history data, encrypted. I don't wanna know! 11 | cek text not null, 12 | 13 | user_id bigint not null, -- allow multiple users 14 | created_at timestamp not null default current_timestamp 15 | ); 16 | -------------------------------------------------------------------------------- /migrations/20231203124112_create-store-idx.sql: -------------------------------------------------------------------------------- 1 | -- Add migration script here 2 | create unique index record_uniq ON store(user_id, host, tag, idx); 3 | -------------------------------------------------------------------------------- /migrations/20240108124837_drop-some-defaults.sql: -------------------------------------------------------------------------------- 1 | -- deleting default values from columns is not supported in sqlite. 2 | 3 | -- alter table history alter column user_id drop default; 4 | -- alter table sessions alter column user_id drop default; 5 | -- alter table total_history_count_user alter column user_id drop default; 6 | -------------------------------------------------------------------------------- /migrations/20240614104159_idx-cache.sql: -------------------------------------------------------------------------------- 1 | create table store_idx_cache( 2 | id bigserial primary key, 3 | user_id bigint, 4 | 5 | host uuid, 6 | tag text, 7 | idx bigint 8 | ); 9 | -------------------------------------------------------------------------------- /migrations/20240621110731_user-verified.sql: -------------------------------------------------------------------------------- 1 | alter table users add verified_at timestamp with time zone default null; 2 | 3 | create table user_verification_token( 4 | id bigserial primary key, 5 | user_id bigint unique references users(id), 6 | token text, 7 | valid_until timestamp with time zone 8 | ); 9 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use async_trait::async_trait; 2 | use atuin_common::{ 3 | record::{EncryptedData, HostId, Record, RecordIdx, RecordStatus}, 4 | utils::crypto_random_string, 5 | }; 6 | use atuin_server_database::{ 7 | models::{History, NewHistory, NewSession, NewUser, Session, User}, 8 | Database, DbError, DbResult, 9 | }; 10 | use futures_util::TryStreamExt; 11 | use serde::{Deserialize, Serialize}; 12 | use sqlx::{ 13 | sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions}, 14 | types::Uuid, 15 | Row, 16 | }; 17 | use std::{ops::Range, str::FromStr}; 18 | use time::{OffsetDateTime, PrimitiveDateTime, UtcOffset}; 19 | use tracing::instrument; 20 | use wrappers::{DbHistory, DbRecord, DbSession, DbUser}; 21 | 22 | mod wrappers; 23 | 24 | #[derive(Clone)] 25 | pub struct Sqlite { 26 | pool: sqlx::Pool, 27 | } 28 | 29 | #[derive(Clone, Debug, Deserialize, Serialize)] 30 | pub struct SqliteSettings { 31 | pub db_uri: String, 32 | } 33 | 34 | fn fix_error(error: sqlx::Error) -> DbError { 35 | match error { 36 | sqlx::Error::RowNotFound => DbError::NotFound, 37 | error => DbError::Other(error.into()), 38 | } 39 | } 40 | 41 | #[async_trait] 42 | impl Database for Sqlite { 43 | type Settings = SqliteSettings; 44 | 45 | async fn new(settings: &SqliteSettings) -> DbResult { 46 | let opts = SqliteConnectOptions::from_str(&settings.db_uri) 47 | .map_err(fix_error)? 48 | .journal_mode(SqliteJournalMode::Wal) 49 | .create_if_missing(true); 50 | 51 | let pool = SqlitePoolOptions::new() 52 | .connect_with(opts) 53 | .await 54 | .map_err(fix_error)?; 55 | 56 | sqlx::migrate!("./migrations") 57 | .run(&pool) 58 | .await 59 | .map_err(|error| DbError::Other(error.into()))?; 60 | 61 | Ok(Self { pool }) 62 | } 63 | 64 | #[instrument(skip_all)] 65 | async fn get_session(&self, token: &str) -> DbResult { 66 | sqlx::query_as("select id, user_id, token from sessions where token = $1") 67 | .bind(token) 68 | .fetch_one(&self.pool) 69 | .await 70 | .map_err(fix_error) 71 | .map(|DbSession(session)| session) 72 | } 73 | 74 | #[instrument(skip_all)] 75 | async fn get_user(&self, username: &str) -> DbResult { 76 | sqlx::query_as("select id, username, email, password from users where username = $1") 77 | .bind(username) 78 | .fetch_one(&self.pool) 79 | .await 80 | .map_err(fix_error) 81 | .map(|DbUser(user)| user) 82 | } 83 | 84 | #[instrument(skip_all)] 85 | async fn user_verified(&self, id: i64) -> DbResult { 86 | let res: (bool,) = 87 | sqlx::query_as("select verified_at is not null from users where id = $1") 88 | .bind(id) 89 | .fetch_one(&self.pool) 90 | .await 91 | .map_err(fix_error)?; 92 | 93 | Ok(res.0) 94 | } 95 | 96 | #[instrument(skip_all)] 97 | async fn verify_user(&self, id: i64) -> DbResult<()> { 98 | sqlx::query( 99 | "update users set verified_at = (current_timestamp at time zone 'utc') where id=$1", 100 | ) 101 | .bind(id) 102 | .execute(&self.pool) 103 | .await 104 | .map_err(fix_error)?; 105 | 106 | Ok(()) 107 | } 108 | 109 | /// Return a valid verification token for the user 110 | /// If the user does not have any token, create one, insert it, and return 111 | /// If the user has a token, but it's invalid, delete it, create a new one, return 112 | /// If the user already has a valid token, return it 113 | #[instrument(skip_all)] 114 | async fn user_verification_token(&self, id: i64) -> DbResult { 115 | const TOKEN_VALID_MINUTES: i64 = 15; 116 | 117 | // First we check if there is a verification token 118 | let token: Option<(String, sqlx::types::time::OffsetDateTime)> = sqlx::query_as( 119 | "select token, valid_until from user_verification_token where user_id = $1", 120 | ) 121 | .bind(id) 122 | .fetch_optional(&self.pool) 123 | .await 124 | .map_err(fix_error)?; 125 | 126 | let token = if let Some((token, valid_until)) = token { 127 | // We have a token, AND it's still valid 128 | if valid_until > time::OffsetDateTime::now_utc() { 129 | token 130 | } else { 131 | // token has expired. generate a new one, return it 132 | let token = crypto_random_string::<24>(); 133 | 134 | sqlx::query("update user_verification_token set token = $2, valid_until = $3 where user_id=$1") 135 | .bind(id) 136 | .bind(&token) 137 | .bind(time::OffsetDateTime::now_utc() + time::Duration::minutes(TOKEN_VALID_MINUTES)) 138 | .execute(&self.pool) 139 | .await 140 | .map_err(fix_error)?; 141 | 142 | token 143 | } 144 | } else { 145 | // No token in the database! Generate one, insert it 146 | let token = crypto_random_string::<24>(); 147 | 148 | sqlx::query("insert into user_verification_token (user_id, token, valid_until) values ($1, $2, $3)") 149 | .bind(id) 150 | .bind(&token) 151 | .bind(time::OffsetDateTime::now_utc() + time::Duration::minutes(TOKEN_VALID_MINUTES)) 152 | .execute(&self.pool) 153 | .await 154 | .map_err(fix_error)?; 155 | 156 | token 157 | }; 158 | 159 | Ok(token) 160 | } 161 | 162 | #[instrument(skip_all)] 163 | async fn get_session_user(&self, token: &str) -> DbResult { 164 | sqlx::query_as( 165 | "select users.id, users.username, users.email, users.password from users 166 | inner join sessions 167 | on users.id = sessions.user_id 168 | and sessions.token = $1", 169 | ) 170 | .bind(token) 171 | .fetch_one(&self.pool) 172 | .await 173 | .map_err(fix_error) 174 | .map(|DbUser(user)| user) 175 | } 176 | 177 | #[instrument(skip_all)] 178 | async fn count_history(&self, user: &User) -> DbResult { 179 | // The cache is new, and the user might not yet have a cache value. 180 | // They will have one as soon as they post up some new history, but handle that 181 | // edge case. 182 | 183 | let res: (i64,) = sqlx::query_as( 184 | "select count(1) from history 185 | where user_id = $1", 186 | ) 187 | .bind(user.id) 188 | .fetch_one(&self.pool) 189 | .await 190 | .map_err(fix_error)?; 191 | 192 | Ok(res.0) 193 | } 194 | 195 | #[instrument(skip_all)] 196 | async fn total_history(&self) -> DbResult { 197 | // The cache is new, and the user might not yet have a cache value. 198 | // They will have one as soon as they post up some new history, but handle that 199 | // edge case. 200 | 201 | let res: (i64,) = sqlx::query_as("select sum(total) from total_history_count_user") 202 | .fetch_optional(&self.pool) 203 | .await 204 | .map_err(fix_error)? 205 | .unwrap_or((0,)); 206 | 207 | Ok(res.0) 208 | } 209 | 210 | #[instrument(skip_all)] 211 | async fn count_history_cached(&self, user: &User) -> DbResult { 212 | let res: (i32,) = sqlx::query_as( 213 | "select total from total_history_count_user 214 | where user_id = $1", 215 | ) 216 | .bind(user.id) 217 | .fetch_one(&self.pool) 218 | .await 219 | .map_err(fix_error)?; 220 | 221 | Ok(res.0 as i64) 222 | } 223 | 224 | async fn delete_store(&self, user: &User) -> DbResult<()> { 225 | sqlx::query( 226 | "delete from store 227 | where user_id = $1", 228 | ) 229 | .bind(user.id) 230 | .execute(&self.pool) 231 | .await 232 | .map_err(fix_error)?; 233 | 234 | Ok(()) 235 | } 236 | 237 | async fn delete_history(&self, user: &User, id: String) -> DbResult<()> { 238 | sqlx::query( 239 | "update history 240 | set deleted_at = $3 241 | where user_id = $1 242 | and client_id = $2 243 | and deleted_at is null", // don't just keep setting it 244 | ) 245 | .bind(user.id) 246 | .bind(id) 247 | .bind(time::OffsetDateTime::now_utc()) 248 | .fetch_all(&self.pool) 249 | .await 250 | .map_err(fix_error)?; 251 | 252 | Ok(()) 253 | } 254 | 255 | #[instrument(skip_all)] 256 | async fn deleted_history(&self, user: &User) -> DbResult> { 257 | // The cache is new, and the user might not yet have a cache value. 258 | // They will have one as soon as they post up some new history, but handle that 259 | // edge case. 260 | 261 | let res = sqlx::query( 262 | "select client_id from history 263 | where user_id = $1 264 | and deleted_at is not null", 265 | ) 266 | .bind(user.id) 267 | .fetch_all(&self.pool) 268 | .await 269 | .map_err(fix_error)?; 270 | 271 | let res = res.iter().map(|row| row.get("client_id")).collect(); 272 | 273 | Ok(res) 274 | } 275 | 276 | #[instrument(skip_all)] 277 | async fn count_history_range( 278 | &self, 279 | user: &User, 280 | range: Range, 281 | ) -> DbResult { 282 | let res: (i64,) = sqlx::query_as( 283 | "select count(1) from history 284 | where user_id = $1 285 | and timestamp >= $2::date 286 | and timestamp < $3::date", 287 | ) 288 | .bind(user.id) 289 | .bind(into_utc(range.start)) 290 | .bind(into_utc(range.end)) 291 | .fetch_one(&self.pool) 292 | .await 293 | .map_err(fix_error)?; 294 | 295 | Ok(res.0) 296 | } 297 | 298 | #[instrument(skip_all)] 299 | async fn list_history( 300 | &self, 301 | user: &User, 302 | created_after: time::OffsetDateTime, 303 | since: time::OffsetDateTime, 304 | host: &str, 305 | page_size: i64, 306 | ) -> DbResult> { 307 | let res = sqlx::query_as( 308 | "select id, client_id, user_id, hostname, timestamp, data, created_at from history 309 | where user_id = $1 310 | and hostname != $2 311 | and created_at >= $3 312 | and timestamp >= $4 313 | order by timestamp asc 314 | limit $5", 315 | ) 316 | .bind(user.id) 317 | .bind(host) 318 | .bind(into_utc(created_after)) 319 | .bind(into_utc(since)) 320 | .bind(page_size) 321 | .fetch(&self.pool) 322 | .map_ok(|DbHistory(h)| h) 323 | .try_collect() 324 | .await 325 | .map_err(fix_error)?; 326 | 327 | Ok(res) 328 | } 329 | 330 | #[instrument(skip_all)] 331 | async fn add_history(&self, history: &[NewHistory]) -> DbResult<()> { 332 | let mut tx = self.pool.begin().await.map_err(fix_error)?; 333 | 334 | for i in history { 335 | let client_id: &str = &i.client_id; 336 | let hostname: &str = &i.hostname; 337 | let data: &str = &i.data; 338 | 339 | sqlx::query( 340 | "insert into history 341 | (client_id, user_id, hostname, timestamp, data) 342 | values ($1, $2, $3, $4, $5) 343 | on conflict do nothing 344 | ", 345 | ) 346 | .bind(client_id) 347 | .bind(i.user_id) 348 | .bind(hostname) 349 | .bind(i.timestamp) 350 | .bind(data) 351 | .execute(&mut *tx) 352 | .await 353 | .map_err(fix_error)?; 354 | } 355 | 356 | tx.commit().await.map_err(fix_error)?; 357 | 358 | Ok(()) 359 | } 360 | 361 | #[instrument(skip_all)] 362 | async fn delete_user(&self, u: &User) -> DbResult<()> { 363 | sqlx::query("delete from sessions where user_id = $1") 364 | .bind(u.id) 365 | .execute(&self.pool) 366 | .await 367 | .map_err(fix_error)?; 368 | 369 | sqlx::query("delete from users where id = $1") 370 | .bind(u.id) 371 | .execute(&self.pool) 372 | .await 373 | .map_err(fix_error)?; 374 | 375 | sqlx::query("delete from history where user_id = $1") 376 | .bind(u.id) 377 | .execute(&self.pool) 378 | .await 379 | .map_err(fix_error)?; 380 | 381 | sqlx::query("delete from total_history_count_user where user_id = $1") 382 | .bind(u.id) 383 | .execute(&self.pool) 384 | .await 385 | .map_err(fix_error)?; 386 | 387 | Ok(()) 388 | } 389 | 390 | #[instrument(skip_all)] 391 | async fn update_user_password(&self, user: &User) -> DbResult<()> { 392 | sqlx::query( 393 | "update users 394 | set password = $1 395 | where id = $2", 396 | ) 397 | .bind(&user.password) 398 | .bind(user.id) 399 | .execute(&self.pool) 400 | .await 401 | .map_err(fix_error)?; 402 | 403 | Ok(()) 404 | } 405 | 406 | #[instrument(skip_all)] 407 | async fn add_user(&self, user: &NewUser) -> DbResult { 408 | let email: &str = &user.email; 409 | let username: &str = &user.username; 410 | let password: &str = &user.password; 411 | 412 | let res: (i64,) = sqlx::query_as( 413 | "insert into users 414 | (username, email, password) 415 | values($1, $2, $3) 416 | returning id", 417 | ) 418 | .bind(username) 419 | .bind(email) 420 | .bind(password) 421 | .fetch_one(&self.pool) 422 | .await 423 | .map_err(fix_error)?; 424 | 425 | Ok(res.0) 426 | } 427 | 428 | #[instrument(skip_all)] 429 | async fn add_session(&self, session: &NewSession) -> DbResult<()> { 430 | let token: &str = &session.token; 431 | 432 | sqlx::query( 433 | "insert into sessions 434 | (user_id, token) 435 | values($1, $2)", 436 | ) 437 | .bind(session.user_id) 438 | .bind(token) 439 | .execute(&self.pool) 440 | .await 441 | .map_err(fix_error)?; 442 | 443 | Ok(()) 444 | } 445 | 446 | #[instrument(skip_all)] 447 | async fn get_user_session(&self, u: &User) -> DbResult { 448 | sqlx::query_as("select id, user_id, token from sessions where user_id = $1") 449 | .bind(u.id) 450 | .fetch_one(&self.pool) 451 | .await 452 | .map_err(fix_error) 453 | .map(|DbSession(session)| session) 454 | } 455 | 456 | #[instrument(skip_all)] 457 | async fn oldest_history(&self, user: &User) -> DbResult { 458 | sqlx::query_as( 459 | "select id, client_id, user_id, hostname, timestamp, data, created_at from history 460 | where user_id = $1 461 | order by timestamp asc 462 | limit 1", 463 | ) 464 | .bind(user.id) 465 | .fetch_one(&self.pool) 466 | .await 467 | .map_err(fix_error) 468 | .map(|DbHistory(h)| h) 469 | } 470 | 471 | #[instrument(skip_all)] 472 | async fn add_records(&self, user: &User, records: &[Record]) -> DbResult<()> { 473 | let mut tx = self.pool.begin().await.map_err(fix_error)?; 474 | 475 | for i in records { 476 | let id = atuin_common::utils::uuid_v7(); 477 | 478 | sqlx::query( 479 | "insert into store 480 | (id, client_id, host, idx, timestamp, version, tag, data, cek, user_id) 481 | values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) 482 | on conflict do nothing 483 | ", 484 | ) 485 | .bind(id) 486 | .bind(i.id) 487 | .bind(i.host.id) 488 | .bind(i.idx as i64) 489 | .bind(i.timestamp as i64) // throwing away some data, but i64 is still big in terms of time 490 | .bind(&i.version) 491 | .bind(&i.tag) 492 | .bind(&i.data.data) 493 | .bind(&i.data.content_encryption_key) 494 | .bind(user.id) 495 | .execute(&mut *tx) 496 | .await 497 | .map_err(fix_error)?; 498 | } 499 | 500 | tx.commit().await.map_err(fix_error)?; 501 | 502 | Ok(()) 503 | } 504 | 505 | #[instrument(skip_all)] 506 | async fn next_records( 507 | &self, 508 | user: &User, 509 | host: HostId, 510 | tag: String, 511 | start: Option, 512 | count: u64, 513 | ) -> DbResult>> { 514 | tracing::debug!("{:?} - {:?} - {:?}", host, tag, start); 515 | let start = start.unwrap_or(0); 516 | 517 | let records: Result, DbError> = sqlx::query_as( 518 | "select client_id, host, idx, timestamp, version, tag, data, cek from store 519 | where user_id = $1 520 | and tag = $2 521 | and host = $3 522 | and idx >= $4 523 | order by idx asc 524 | limit $5", 525 | ) 526 | .bind(user.id) 527 | .bind(tag.clone()) 528 | .bind(host) 529 | .bind(start as i64) 530 | .bind(count as i64) 531 | .fetch_all(&self.pool) 532 | .await 533 | .map_err(fix_error); 534 | 535 | let ret = match records { 536 | Ok(records) => { 537 | let records: Vec> = records 538 | .into_iter() 539 | .map(|f| { 540 | let record: Record = f.into(); 541 | record 542 | }) 543 | .collect(); 544 | 545 | records 546 | } 547 | Err(DbError::NotFound) => { 548 | tracing::debug!("no records found in store: {:?}/{}", host, tag); 549 | return Ok(vec![]); 550 | } 551 | Err(e) => return Err(e), 552 | }; 553 | 554 | Ok(ret) 555 | } 556 | 557 | async fn status(&self, user: &User) -> DbResult { 558 | const STATUS_SQL: &str = 559 | "select host, tag, max(idx) from store where user_id = $1 group by host, tag"; 560 | 561 | let res: Vec<(Uuid, String, i64)> = sqlx::query_as(STATUS_SQL) 562 | .bind(user.id) 563 | .fetch_all(&self.pool) 564 | .await 565 | .map_err(fix_error)?; 566 | 567 | let mut status = RecordStatus::new(); 568 | 569 | for i in res { 570 | status.set_raw(HostId(i.0), i.1, i.2 as u64); 571 | } 572 | 573 | Ok(status) 574 | } 575 | } 576 | 577 | fn into_utc(x: OffsetDateTime) -> PrimitiveDateTime { 578 | let x = x.to_offset(UtcOffset::UTC); 579 | PrimitiveDateTime::new(x.date(), x.time()) 580 | } 581 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use atuin_server_sqlite_unofficial::Sqlite; 2 | use tokio::net::lookup_host; 3 | use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter}; 4 | 5 | #[tokio::main] 6 | async fn main() { 7 | let formatting_layer = tracing_tree::HierarchicalLayer::default() 8 | .with_writer(tracing_subscriber::fmt::TestWriter::new()) 9 | .with_indent_lines(true) 10 | .with_ansi(true) 11 | .with_targets(true) 12 | .with_indent_amount(2); 13 | 14 | tracing_subscriber::registry() 15 | .with(formatting_layer) 16 | .with(EnvFilter::from_default_env()) 17 | .init(); 18 | 19 | let settings = atuin_server::Settings::new().unwrap(); 20 | let addr = lookup_host((&*settings.host, settings.port)) 21 | .await 22 | .expect("listen addr should be valid") 23 | .next() 24 | .expect("listen addr should be valid"); 25 | 26 | atuin_server::launch::(settings, addr) 27 | .await 28 | .unwrap(); 29 | } 30 | -------------------------------------------------------------------------------- /src/wrappers.rs: -------------------------------------------------------------------------------- 1 | use ::sqlx::{FromRow, Result}; 2 | use atuin_common::record::{EncryptedData, Host, Record}; 3 | use atuin_server_database::models::{History, Session, User}; 4 | use sqlx::{sqlite::SqliteRow, Row}; 5 | 6 | pub struct DbUser(pub User); 7 | pub struct DbSession(pub Session); 8 | pub struct DbHistory(pub History); 9 | pub struct DbRecord(pub Record); 10 | 11 | impl<'a> FromRow<'a, SqliteRow> for DbUser { 12 | fn from_row(row: &'a SqliteRow) -> Result { 13 | Ok(Self(User { 14 | id: row.try_get("id")?, 15 | username: row.try_get("username")?, 16 | email: row.try_get("email")?, 17 | password: row.try_get("password")?, 18 | verified: row.try_get("verified_at")?, 19 | })) 20 | } 21 | } 22 | 23 | impl<'a> ::sqlx::FromRow<'a, SqliteRow> for DbSession { 24 | fn from_row(row: &'a SqliteRow) -> ::sqlx::Result { 25 | Ok(Self(Session { 26 | id: row.try_get("id")?, 27 | user_id: row.try_get("user_id")?, 28 | token: row.try_get("token")?, 29 | })) 30 | } 31 | } 32 | 33 | impl<'a> ::sqlx::FromRow<'a, SqliteRow> for DbHistory { 34 | fn from_row(row: &'a SqliteRow) -> ::sqlx::Result { 35 | Ok(Self(History { 36 | id: row.try_get("id")?, 37 | client_id: row.try_get("client_id")?, 38 | user_id: row.try_get("user_id")?, 39 | hostname: row.try_get("hostname")?, 40 | timestamp: row.try_get("timestamp")?, 41 | data: row.try_get("data")?, 42 | created_at: row.try_get("created_at")?, 43 | })) 44 | } 45 | } 46 | 47 | impl<'a> ::sqlx::FromRow<'a, SqliteRow> for DbRecord { 48 | fn from_row(row: &'a SqliteRow) -> ::sqlx::Result { 49 | let idx: i64 = row.try_get("idx")?; 50 | let timestamp: i64 = row.try_get("timestamp")?; 51 | 52 | let data = EncryptedData { 53 | data: row.try_get("data")?, 54 | content_encryption_key: row.try_get("cek")?, 55 | }; 56 | 57 | Ok(Self(Record { 58 | id: row.try_get("client_id")?, 59 | host: Host::new(row.try_get("host")?), 60 | idx: idx as u64, 61 | timestamp: timestamp as u64, 62 | version: row.try_get("version")?, 63 | tag: row.try_get("tag")?, 64 | data, 65 | })) 66 | } 67 | } 68 | 69 | impl From for Record { 70 | fn from(other: DbRecord) -> Record { 71 | Record { ..other.0 } 72 | } 73 | } 74 | --------------------------------------------------------------------------------