diff --git a/.gitignore b/.gitignore index 1876539..a271ae9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ traces/ .env *.sh *.db +*regex.txt diff --git a/Cargo.lock b/Cargo.lock index e299a4c..1101438 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,24 +4,36 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -32,12 +44,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -49,9 +55,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -64,78 +70,112 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", - "once_cell", - "windows-sys 0.59.0", + "once_cell_polyfill", + "windows-sys 0.61.2", ] [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arrayref" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-compression" -version = "0.4.18" +version = "0.4.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +checksum = "98ec5f6c2f8bc326c994cb9e241cc257ddaba9afa8555a43cffbb5dd86efaa37" dependencies = [ - "flate2", + "compression-codecs", + "compression-core", "futures-core", - "memchr", "pin-project-lite", "tokio", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener", "event-listener-strategy", "pin-project-lite", ] +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "async-trait" -version = "0.1.86" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -146,14 +186,14 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atrium-api" -version = "0.25.2" +version = "0.25.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4eb9b4787aba546015c8ccda1d3924c157cee13d67848997fba74ac8144a07" +checksum = "ef9d5e9352fd27d99383ae1db2b6a6aa239e683a7e750e8d73a73996d82b1fd2" dependencies = [ "atrium-common", "atrium-xrpc", "chrono", - "http 1.2.0", + "http", "ipld-core", "langtag", "regex", @@ -167,9 +207,9 @@ dependencies = [ [[package]] name = "atrium-common" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba30d2f9e1a8b3db8fc97d0a5f91ee5a28f8acdddb771ad74c1b08eda357ca3d" +checksum = "9ed5610654043faa396a5a15afac0ac646d76aebe45aebd7cef4f8b96b0ab7f4" dependencies = [ "dashmap", "lru", @@ -180,13 +220,33 @@ dependencies = [ "web-time", ] +[[package]] +name = "atrium-repo" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300aff863d16ad3aa1655b8586ae24fc492b338f822a7c2852a2241533832b4d" +dependencies = [ + "async-stream", + "atrium-api", + "futures", + "ipld-core", + "serde", + "serde_bytes", + "serde_ipld_dagcbor", + "sha2", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "unsigned-varint 0.8.0", +] + [[package]] name = "atrium-xrpc" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a9e526cb2ed3e0a2ca78c3ce2a943d9041a68e067dadf42923b523771e07df" +checksum = "0216ad50ce34e9ff982e171c3659e65dedaa2ed5ac2994524debdc9a9647ffa8" dependencies = [ - "http 1.2.0", + "http", "serde", "serde_html_form", "serde_json", @@ -196,9 +256,9 @@ dependencies = [ [[package]] name = "atrium-xrpc-client" -version = "0.5.10" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd9946c18301eee62e8bd0ade5ac2750c9a0778fadf097ac60024b2a79485603" +checksum = "e099e5171f79faef52364ef0657a4cab086a71b384a779a29597a91b780de0d5" dependencies = [ "atrium-xrpc", "reqwest", @@ -206,15 +266,37 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88aab2464f1f25453baa7a07c84c5b7684e274054ba06817f382357f77a288" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "b45afffdee1e7c9126814751f88dddc747f41d91da16c9551a0f1e8a11e788a1" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -222,7 +304,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-link", ] [[package]] @@ -232,10 +314,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" [[package]] -name = "base64" -version = "0.21.7" +name = "base256emoji" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" +dependencies = [ + "const-str", + "match-lookup", +] [[package]] name = "base64" @@ -245,9 +331,44 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "blake2b_simd" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "blake2s_simd" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e90f7deecfac93095eb874a40febd69427776e24e1bd7f87f33ac62d6f0174df" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] [[package]] name = "block-buffer" @@ -260,9 +381,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "byteorder" @@ -272,59 +393,70 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "camino" -version = "1.1.9" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "cargo-manifest" -version = "0.17.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2ce2075c35e4b492b93e3d5dd1dd3670de553f15045595daef8164ed9a3751" +checksum = "a1d8af896b707212cd0e99c112a78c9497dd32994192a463ed2f7419d29bd8c6" dependencies = [ "serde", - "thiserror 1.0.69", - "toml", + "thiserror 2.0.17", + "toml 0.8.23", ] [[package]] name = "cargo-platform" -version = "0.1.9" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +checksum = "87a0c0e6148f11f01f32650a2ea02d532b2ad4e81d8bd41e6e565b5adc5e6082" dependencies = [ "serde", + "serde_core", ] [[package]] name = "cargo_metadata" -version = "0.18.1" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" dependencies = [ "camino", "cargo-platform", "semver", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.17", +] + +[[package]] +name = "cbor4ii" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544cf8c89359205f4f990d0e6f3828db42df85b5dac95d09157a250eb0749c4" +dependencies = [ + "serde", ] [[package]] name = "cc" -version = "1.2.12" +version = "1.2.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" +checksum = "9f50d563227a1c37cc0a263f64eca3334388c01c5e4c4861a9def205c614383c" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -332,23 +464,45 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-targets", + "windows-link", +] + +[[package]] +name = "chrono-tz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" +dependencies = [ + "chrono", + "phf", +] + +[[package]] +name = "cid" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd94671561e36e4e7de75f753f577edafb0e7c05d6e4547229fdf7938fbcd2c3" +dependencies = [ + "core2", + "multibase", + "multihash 0.18.1", + "serde", + "unsigned-varint 0.7.2", ] [[package]] @@ -359,17 +513,17 @@ checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" dependencies = [ "core2", "multibase", - "multihash", + "multihash 0.19.3", "serde", "serde_bytes", - "unsigned-varint", + "unsigned-varint 0.8.0", ] [[package]] name = "clap" -version = "4.5.28" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -377,9 +531,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.27" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -389,27 +543,53 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.28" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" + +[[package]] +name = "cmake" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "compression-codecs" +version = "0.4.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0f7ac3e5b97fdce45e8922fb05cae2c37f7bbd63d30dd94821dacfd8f3f2bf2" +dependencies = [ + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" [[package]] name = "concurrent-queue" @@ -422,9 +602,9 @@ dependencies = [ [[package]] name = "console" -version = "0.15.10" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", "libc", @@ -432,6 +612,18 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "const-str" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "core-foundation" version = "0.9.4" @@ -442,6 +634,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -468,19 +670,29 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ + "crossbeam-epoch", "crossbeam-utils", ] @@ -501,9 +713,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -525,15 +737,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.7.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "data-encoding-macro" -version = "0.1.16" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b16d9d0d88a5273d830dac8b78ceb217ffc9b1d5404e5597a3542515329405b" +checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -541,12 +753,12 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145d32e826a7748b69ee8fc62d3e6355ff7f1051df53141e7048162fc90481b" +checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn", + "syn 2.0.111", ] [[package]] @@ -567,7 +779,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -576,6 +788,18 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + [[package]] name = "encode_unicode" version = "1.0.0" @@ -593,9 +817,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" dependencies = [ "log", "regex", @@ -603,38 +827,38 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ "anstream", "anstyle", "env_filter", - "humantime", + "jiff", "log", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -651,6 +875,28 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -669,11 +915,17 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -699,9 +951,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foreign-types" @@ -720,13 +972,34 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -743,6 +1016,23 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + [[package]] name = "futures-macro" version = "0.3.31" @@ -751,7 +1041,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -772,28 +1062,18 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", + "futures-io", "futures-macro", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", ] -[[package]] -name = "generator" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" -dependencies = [ - "cfg-if", - "libc", - "log", - "rustversion", - "windows", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -806,66 +1086,47 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets", + "r-efi", + "wasip2", ] [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "h2" -version = "0.3.26" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.2.0", + "http", "indexmap", "slab", "tokio", @@ -875,46 +1136,56 @@ dependencies = [ [[package]] name = "hashbag" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98f494b2060b2a8f5e63379e1e487258e014cee1b1725a735816c0107a2e9d93" +checksum = "7040a10f52cba493ddb09926e15d10a9d8a28043708a405931fe4c6f19fac064" [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "hashlink" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.5", ] [[package]] name = "headers" -version = "0.3.9" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" dependencies = [ - "base64 0.21.7", + "base64", "bytes", "headers-core", - "http 0.2.12", + "http", "httpdate", "mime", "sha1", @@ -922,11 +1193,11 @@ dependencies = [ [[package]] name = "headers-core" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 0.2.12", + "http", ] [[package]] @@ -936,38 +1207,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "http" -version = "0.2.12" +name = "hex" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -975,27 +1229,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "futures-core", + "http", + "http-body", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1003,51 +1257,24 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "hyper" -version = "0.14.32" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.7", - "http 1.2.0", - "http-body 1.0.1", - "httparse", - "itoa", - "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1055,13 +1282,12 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", - "http 1.2.0", - "hyper 1.6.0", + "http", + "hyper", "hyper-util", "rustls", "rustls-pki-types", @@ -1078,7 +1304,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.6.0", + "hyper", "hyper-util", "native-tls", "tokio", @@ -1088,35 +1314,43 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ + "base64", "bytes", "futures-channel", + "futures-core", "futures-util", - "http 1.2.0", - "http-body 1.0.1", - "hyper 1.6.0", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", "socket2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core", ] [[package]] @@ -1130,21 +1364,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -1153,104 +1388,66 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ - "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", + "icu_locale_core", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1259,9 +1456,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -1269,34 +1466,21 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.15.2", -] - -[[package]] -name = "insta" -version = "1.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71c1b125e30d93896b365e156c33dadfffab45ee8400afcbba4752f59de08a86" -dependencies = [ - "console", - "linked-hash-map", - "once_cell", - "pin-project", - "similar", + "hashbrown 0.16.1", ] [[package]] name = "ipld-core" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ede82a79e134f179f4b29b5fdb1eb92bd1b38c4dfea394c539051150a21b9b" +checksum = "104718b1cc124d92a6d01ca9c9258a7df311405debb3408c445a36452f9bf8db" dependencies = [ - "cid", + "cid 0.11.1", "serde", "serde_bytes", ] @@ -1307,59 +1491,81 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "7ee5b5339afb4c41626dde77b7a611bd4f2c202b897852b4bcf5d03eddc61010" [[package]] -name = "jetstream-oxide" -version = "0.1.2" +name = "jiff" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a267b4f381f1db945e9eb6b9ff0f3070950cc01521fef6265556b6a683e41e13" +checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" dependencies = [ - "async-trait", - "atrium-api", - "chrono", - "flume", - "futures-util", + "jiff-static", "log", - "serde", - "serde_json", - "thiserror 2.0.11", - "tokio", - "tokio-tungstenite 0.24.0", - "tokio-util", - "url", - "zstd", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", ] +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + [[package]] name = "langtag" version = "0.3.4" @@ -1370,16 +1576,99 @@ dependencies = [ ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "libc" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] -name = "libc" -version = "0.2.169" +name = "libipld" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1ccd6b8ffb3afee7081fcaec00e1b099fd1c7ccf35ba5729d88538fcc3b4599" +dependencies = [ + "fnv", + "libipld-cbor", + "libipld-cbor-derive", + "libipld-core", + "libipld-json", + "libipld-macro", + "libipld-pb", + "log", + "multihash 0.18.1", + "thiserror 1.0.69", +] + +[[package]] +name = "libipld-cbor" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77d98c9d1747aa5eef1cf099cd648c3fd2d235249f5fed07522aaebc348e423b" +dependencies = [ + "byteorder", + "libipld-core", + "thiserror 1.0.69", +] + +[[package]] +name = "libipld-cbor-derive" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "7d5ba3a729b72973e456a1812b0afe2e176a376c1836cc1528e9fc98ae8cb838" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + +[[package]] +name = "libipld-core" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5acd707e8d8b092e967b2af978ed84709eaded82b75effe6cb6f6cc797ef8158" +dependencies = [ + "anyhow", + "cid 0.10.1", + "core2", + "multibase", + "multihash 0.18.1", + "thiserror 1.0.69", +] + +[[package]] +name = "libipld-json" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25856def940047b07b25c33d4e66d248597049ab0202085215dc4dca0487731c" +dependencies = [ + "libipld-core", + "multihash 0.18.1", + "serde", + "serde_json", +] + +[[package]] +name = "libipld-macro" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71171c54214f866ae6722f3027f81dff0931e600e5a61e6b1b6a49ca0b5ed4ae" +dependencies = [ + "libipld-core", +] + +[[package]] +name = "libipld-pb" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f2d0f866c4cd5dc9aa8068c429ba478d2882a3a4b70ab56f7e9a0eddf5d16f" +dependencies = [ + "bytes", + "libipld-core", + "quick-protobuf", + "thiserror 1.0.69", +] [[package]] name = "libsqlite3-sys" @@ -1392,52 +1681,32 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" - -[[package]] -name = "loom" -version = "0.7.2" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", -] +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lru" @@ -1445,23 +1714,25 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.5", ] [[package]] -name = "matchers" -version = "0.1.0" +name = "match-lookup" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" dependencies = [ - "regex-automata 0.1.10", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mime" @@ -1481,73 +1752,83 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] name = "moka" -version = "0.12.10" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" +checksum = "a3dec6bd31b08944e08b58fd99373893a6c17054d6f3ea5006cc894f4f4eee2a" dependencies = [ "async-lock", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", + "equivalent", "event-listener", "futures-util", - "loom", "parking_lot", "portable-atomic", - "rustc_version", "smallvec", "tagptr", - "thiserror 1.0.69", "uuid", ] [[package]] -name = "multer" -version = "2.1.0" +name = "multibase" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" +checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http 0.2.12", - "httparse", - "log", - "memchr", - "mime", - "spin", - "version_check", + "base-x", + "base256emoji", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multicodec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f287a558ce2cac6f63944876d2f76ae2254a17fbe174c82967e76e0aab3379ed" +dependencies = [ + "failure", + "serde", + "unsigned-varint 0.2.3", ] [[package]] -name = "multibase" -version = "0.9.1" +name = "multihash" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +checksum = "cfd8a792c1694c6da4f68db0a9d707c72bd260994da179e6030a5dcee00bb815" dependencies = [ - "base-x", - "data-encoding", - "data-encoding-macro", + "blake2b_simd", + "blake2s_simd", + "blake3", + "core2", + "digest", + "multihash-derive", + "sha2", + "sha3", + "unsigned-varint 0.7.2", ] [[package]] @@ -1558,7 +1839,21 @@ checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" dependencies = [ "core2", "serde", - "unsigned-varint", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "multihash-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +dependencies = [ + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", ] [[package]] @@ -1567,14 +1862,14 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] name = "native-tls" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -1582,21 +1877,11 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -1608,24 +1893,30 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.70" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ "bitflags", "cfg-if", @@ -1644,7 +1935,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -1653,34 +1944,18 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" -[[package]] -name = "openssl-src" -version = "300.4.1+3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" -dependencies = [ - "cc", -] - [[package]] name = "openssl-sys" -version = "0.9.105" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", - "openssl-src", "pkg-config", "vcpkg", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "parking" version = "2.2.1" @@ -1689,9 +1964,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1699,41 +1974,59 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-link", ] [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher", +] [[package]] name = "pin-project" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -1750,72 +2043,139 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f59e70c4aef1e55797c2e8fd94a4f2a973fc972cfde0e0b05f683667b0cd39dd" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror 1.0.69", + "toml 0.5.11", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "public-api" -version = "0.43.0" +version = "0.50.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31529be2a00213a5eeca25ed983569db17036d90de2abe40c55aceaa0915795b" +checksum = "6abe4c4c758f4c8c2eacaf9a787f8e7daca79600522c992af7df154b0d5bf9f1" dependencies = [ "hashbag", "rustdoc-types", "serde", "serde_json", - "thiserror 2.0.11", + "snapshot-testing", + "thiserror 2.0.17", +] + +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" -version = "0.8.5" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -1823,127 +2183,143 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.3.4", ] [[package]] -name = "redox_syscall" -version = "0.5.8" +name = "rayon" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ - "bitflags", + "either", + "rayon-core", ] [[package]] -name = "regex" -version = "1.11.1" +name = "rayon-core" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "crossbeam-deque", + "crossbeam-utils", ] [[package]] -name = "regex-automata" -version = "0.1.10" +name = "redox_syscall" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "regex-syntax 0.6.29", + "bitflags", ] [[package]] -name = "regex-automata" -version = "0.4.9" +name = "regex" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-automata", + "regex-syntax", ] [[package]] -name = "regex-syntax" -version = "0.6.29" +name = "regex-automata" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "3b4c14b2d9afca6a60277086b0cc6a6ae0b568f6f7916c943a8cdc79f8be240f" dependencies = [ - "async-compression", - "base64 0.22.1", + "base64", "bytes", "encoding_rs", "futures-core", - "futures-util", - "h2 0.4.7", - "http 1.2.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.6.0", + "hyper", "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-native-tls", - "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows-registry", ] [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] +[[package]] +name = "rs-car" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "732df95a8f40f7623f7d54eac1e11626d86fd970f7542738d64c30d0d7ff0068" +dependencies = [ + "blake2b_simd", + "cid 0.10.1", + "futures", + "hex", + "libipld", + "libipld-cbor", + "multibase", + "multicodec", + "multihash 0.18.1", + "sha2", +] + [[package]] name = "rusqlite" version = "0.33.0" @@ -1960,61 +2336,55 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustdoc-json" -version = "0.9.4" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cba50605762dcbc2e103a3a8b195c83b6978aca443c7dd6699ed2971c213e5" +checksum = "248f714c774453783144ae17f6203d727674a7cb69ba2ecf1df841c187403086" dependencies = [ "cargo-manifest", "cargo_metadata", "serde", - "thiserror 2.0.11", - "toml", + "thiserror 2.0.17", + "toml 0.8.23", "tracing", ] [[package]] name = "rustdoc-types" -version = "0.35.0" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf583db9958b3161d7980a56a8ee3c25e1a40708b81259be72584b7e0ea07c95" +checksum = "27bf787c529efe523ed9eb6dcdbaa5954d34329f08d5c243fce928441826ca90" dependencies = [ "serde", + "serde_derive", ] [[package]] name = "rustix" -version = "0.38.44" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.22" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ + "aws-lc-rs", + "log", "once_cell", "rustls-pki-types", "rustls-webpki", @@ -2023,26 +2393,33 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "rustls-native-certs" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ + "openssl-probe", "rustls-pki-types", + "schannel", + "security-framework 3.5.1", ] [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -2050,32 +2427,32 @@ dependencies = [ [[package]] name = "rustup-toolchain" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1146c7808061ba181ab8e2f0836e91b0cc2fd10a70e64dae5c55381ce6d6cf" +checksum = "2d5715001c3f29532641421aaddb1302cbcbfd7507ed5f3a5dd0ddb5b808a7e0" dependencies = [ - "thiserror 2.0.11", + "thiserror 2.0.17", ] [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "62049b2877bf12821e8f9ad256ee38fdc31db7387ec2d3b3f403024de2034aea" [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2097,7 +2474,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -2105,9 +2495,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -2115,72 +2505,97 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.25" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "serde_html_form" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2de91cf02bbc07cde38891769ccd5d4f073d22a40683aa4bc7a95781aaa2c4" +checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" dependencies = [ "form_urlencoded", "indexmap", "itoa", "ryu", + "serde_core", +] + +[[package]] +name = "serde_ipld_dagcbor" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46182f4f08349a02b45c998ba3215d3f9de826246ba02bb9dddfe9a2a2100778" +dependencies = [ + "cbor4ii", + "ipld-core", + "scopeguard", "serde", ] [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -2209,12 +2624,24 @@ dependencies = [ ] [[package]] -name = "sharded-slab" -version = "0.1.7" +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "lazy_static", + "digest", + "keccak", ] [[package]] @@ -2225,68 +2652,107 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + [[package]] name = "similar" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +[[package]] +name = "similar-asserts" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b441962c817e33508847a22bd82f03a30cff43642dc2fae8b050566121eb9a" +dependencies = [ + "console", + "similar", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "skyfeed" version = "0.6.0" dependencies = [ "anyhow", + "async-trait", "atrium-api", + "atrium-repo", "atrium-xrpc-client", "chrono", + "chrono-tz", "clap", "dotenv", "env_logger", - "insta", - "jetstream-oxide", + "flume", + "futures", + "ipld-core", "log", "public-api", + "rayon", "regex", "reqwest", + "rs-car", "rusqlite", "rustdoc-json", + "rustls", "rustup-toolchain", "serde", + "serde_ipld_dagcbor", "serde_json", "tokio", + "tokio-tungstenite", "warp", + "whatlang", ] [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "snapshot-testing" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "bebf2194b9611339d00b28260cf6bd640073c60179ce7dd1e47badef1eb606e7" +dependencies = [ + "console", + "similar-asserts", +] [[package]] name = "socket2" -version = "0.5.8" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -2300,9 +2766,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "strsim" @@ -2318,9 +2784,20 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.98" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -2338,13 +2815,25 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -2354,7 +2843,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -2376,16 +2865,15 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "tempfile" -version = "3.16.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if", "fastrand", - "getrandom 0.3.1", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2399,11 +2887,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.17", ] [[package]] @@ -2414,35 +2902,25 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", + "syn 2.0.111", ] [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -2450,11 +2928,10 @@ dependencies = [ [[package]] name = "tokio" -version = "1.43.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", "mio", @@ -2463,18 +2940,18 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -2489,9 +2966,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -2499,38 +2976,29 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite 0.21.0", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.24.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", - "native-tls", + "rustls", + "rustls-native-certs", + "rustls-pki-types", "tokio", - "tokio-native-tls", - "tungstenite 0.24.0", + "tokio-rustls", + "tungstenite", ] [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "pin-project-lite", "tokio", @@ -2538,9 +3006,18 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "indexmap", "serde", @@ -2551,26 +3028,33 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.23" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "tower" version = "0.5.2" @@ -2586,6 +3070,29 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "async-compression", + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "iri-string", + "pin-project-lite", + "tokio", + "tokio-util", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -2600,9 +3107,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -2612,52 +3119,22 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ - "matchers", - "nu-ansi-term", "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", ] [[package]] @@ -2668,7 +3145,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -2679,48 +3156,28 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 1.2.0", - "httparse", - "log", - "rand", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - -[[package]] -name = "tungstenite" -version = "0.24.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" dependencies = [ - "byteorder", "bytes", "data-encoding", - "http 1.2.0", + "http", "httparse", "log", - "native-tls", "rand", + "rustls", + "rustls-pki-types", "sha1", - "thiserror 1.0.69", - "url", + "thiserror 2.0.17", "utf-8", ] [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicase" @@ -2730,15 +3187,37 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.16" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unsigned-varint" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f0023a96687fe169081e8adce3f65e3874426b7886e9234d490af2dc077959" + +[[package]] +name = "unsigned-varint" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" [[package]] name = "unsigned-varint" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" +dependencies = [ + "futures-io", + "futures-util", +] [[package]] name = "untrusted" @@ -2748,13 +3227,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -2763,12 +3243,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2783,19 +3257,15 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.16.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.4", + "js-sys", + "wasm-bindgen", ] -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - [[package]] name = "vcpkg" version = "0.2.15" @@ -2819,20 +3289,21 @@ dependencies = [ [[package]] name = "warp" -version = "0.3.7" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4378d202ff965b011c64817db11d5829506d3404edeadb61f190d111da3f231c" +checksum = "51d06d9202adc1f15d709c4f4a2069be5428aa912cc025d6f268ac441ab066b0" dependencies = [ "bytes", - "futures-channel", "futures-util", "headers", - "http 0.2.12", - "hyper 0.14.32", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", "log", "mime", "mime_guess", - "multer", "percent-encoding", "pin-project", "scoped-tls", @@ -2840,7 +3311,6 @@ dependencies = [ "serde_json", "serde_urlencoded", "tokio", - "tokio-tungstenite 0.21.0", "tokio-util", "tower-service", "tracing", @@ -2848,50 +3318,37 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.13.3+wasi-0.2.2" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -2902,9 +3359,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2912,31 +3369,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn", - "wasm-bindgen-backend", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -2953,109 +3410,83 @@ dependencies = [ ] [[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" -dependencies = [ - "windows-core 0.58.0", - "windows-targets", -] - -[[package]] -name = "windows-core" -version = "0.52.0" +name = "whatlang" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "471d1c1645d361eb782a1650b1786a8fb58dd625e681a04c09f5ff7c8764a7b0" dependencies = [ - "windows-targets", + "hashbrown 0.14.5", + "once_cell", ] [[package]] name = "windows-core" -version = "0.58.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", + "windows-link", "windows-result", "windows-strings", - "windows-targets", ] [[package]] name = "windows-implement" -version = "0.58.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "windows-interface" -version = "0.58.0" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-registry" -version = "0.2.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ + "windows-link", "windows-result", "windows-strings", - "windows-targets", ] [[package]] name = "windows-result" -version = "0.2.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-targets", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-result", - "windows-targets", + "windows-link", ] [[package]] @@ -3064,7 +3495,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3073,7 +3504,25 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", ] [[package]] @@ -3082,14 +3531,31 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -3098,42 +3564,84 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -3141,42 +3649,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "winnow" -version = "0.7.1" +name = "windows_x86_64_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" -dependencies = [ - "memchr", -] +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] -name = "wit-bindgen-rt" -version = "0.33.0" +name = "winnow" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ - "bitflags", + "memchr", ] [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -3184,110 +3688,92 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 2.0.111", + "synstructure 0.13.2", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 2.0.111", + "synstructure 0.13.2", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] -name = "zerovec" -version = "0.10.4" +name = "zerotrie" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ + "displaydoc", "yoke", "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zstd" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" -dependencies = [ - "zstd-safe", ] [[package]] -name = "zstd-safe" -version = "7.2.1" +name = "zerovec" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ - "zstd-sys", + "yoke", + "zerofrom", + "zerovec-derive", ] [[package]] -name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +name = "zerovec-derive" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ - "cc", - "pkg-config", + "proc-macro2", + "quote", + "syn 2.0.111", ] diff --git a/Cargo.toml b/Cargo.toml index 5b36917..7b28846 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "skyfeed" version = "0.6.0" -edition = "2021" +edition = "2024" description = "A library for quickly building BlueSky feed generators." repository = "https://github.com/cyypherus/skyfeed" license = "MIT" @@ -11,8 +11,9 @@ authors = ["cyypherus"] [lib] [features] -test-api = ["insta", "public-api", "rustdoc-json", "rustup-toolchain"] -examples = ["rusqlite", "regex"] +default = ["examples"] +test-api = ["public-api", "rustdoc-json", "rustup-toolchain"] +examples = ["rusqlite", "regex", "whatlang", "chrono-tz", "rayon"] [[bin]] name = "my_did" @@ -37,28 +38,37 @@ path = "examples/sqlite/src/main.rs" required-features = ["examples"] [dependencies] -atrium-api = "=0.25.2" +atrium-api = "0.25.6" +atrium-repo = "0.1.6" dotenv = "0.15.0" env_logger = "0.11.5" -jetstream-oxide = "=0.1.2" log = "0.4.22" serde = "1.0.215" serde_json = "1.0.133" tokio = { version = "1.41.1", features = ["full"] } -warp = "0.3.7" - -anyhow = "1.0.81" +tokio-tungstenite = { version = "0.28.0", features = ["rustls-tls-native-roots"] } +futures = "0.3.31" +warp = { version = "0.4.2", features = ["server"] } clap = { version = "4.5.3", features = ["derive"] } +anyhow = "1.0.81" reqwest = "0.12.9" atrium-xrpc-client = "0.5.10" chrono = "0.4.39" +async-trait = "0.1.81" +ipld-core = "0.4.1" +rustls = "0.23.35" +serde_ipld_dagcbor = "0.6.0" +rs-car = "0.1" +flume = "0.11.1" # `examples` feature dependencies rusqlite = { version = "0.33.0", features = ["bundled"], optional = true } regex = { version = "1.11.1", optional = true } +whatlang = { version = "0.16.4", optional = true } +chrono-tz = { version = "0.10", optional = true } +rayon = { version = "1.11.0", optional = true } # `test-api` feature dependencies -insta = { version = "1.42.1", optional = true } -public-api = { version = "0.43.0", optional = true } +public-api = { version = "0.50.2", optional = true } rustdoc-json = { version = "0.9.4", optional = true } rustup-toolchain = { version = "0.1.9", optional = true } diff --git a/README.md b/README.md index e2f9eb0..0a9d941 100644 --- a/README.md +++ b/README.md @@ -61,12 +61,16 @@ See the [sqlite example](./examples/sqlite) ## Implement the `FeedHandler` Trait -Your feed handler is responsible for storing and managing firehose input. For the sake of simplicity, we'll just use Vec and HashMap to manage posts and likes. +Your feed handler is responsible for storing and managing firehose input. For the sake of simplicity, we'll just use a Vec to manage posts and likes. ```rust +use skyfeed::{Config, FeedHandler, FeedRequest, FeedResult, Post, Uri, start}; +use std::{collections::HashSet, sync::Arc}; +use tokio::sync::Mutex; + #[derive(Clone)] struct MyFeedHandler { - posts: Arc>>, + posts: Vec, } #[derive(Debug, Clone)] @@ -76,55 +80,44 @@ struct MyPost { } impl FeedHandler for MyFeedHandler { + async fn available_feeds(&mut self) -> Vec { + vec!["Cats".to_string()] + } + async fn insert_post(&mut self, post: Post) { if post.text.to_lowercase().contains(" cat ") { - info!("Storing {post:?}"); const MAX_POSTS: usize = 100; - let mut posts = self.posts.lock().await; - - posts.push(MyPost { + self.posts.push(MyPost { post, likes: HashSet::new(), }); - if posts.len() > MAX_POSTS { - posts.remove(0); + if self.posts.len() > MAX_POSTS { + self.posts.remove(0); } } } async fn delete_post(&mut self, uri: Uri) { self.posts - .lock() - .await .retain(|post_with_likes| post_with_likes.post.uri != uri); } - async fn like_post(&mut self, like_uri: Uri, liked_post_uri: Uri) { - if let Some(post_with_likes) = self - .posts - .lock() - .await - .iter_mut() - .find(|p| p.post.uri == liked_post_uri) + async fn insert_like(&mut self, like_uri: Uri, liked_post_uri: Uri) { + if let Some(post_with_likes) = self.posts.iter_mut().find(|p| p.post.uri == liked_post_uri) { post_with_likes.likes.insert(like_uri); } } async fn delete_like(&mut self, like_uri: Uri) { - let mut posts = self.posts.lock().await; - for post_with_likes in posts.iter_mut() { + for post_with_likes in self.posts.iter_mut() { post_with_likes.likes.remove(&like_uri); } } - async fn serve_feed(&self, request: Request) -> FeedResult { - info!("Serving {request:?}"); - - let posts = self.posts.lock().await; - + async fn serve_feed(&self, request: FeedRequest) -> FeedResult { // Parse the cursor from the request let start_index = if let Some(cursor) = &request.cursor { cursor.parse::().unwrap_or(0) @@ -135,7 +128,7 @@ impl FeedHandler for MyFeedHandler { let posts_per_page = 5; // Sort posts by likes - let mut sorted_posts: Vec<_> = posts.iter().collect(); + let mut sorted_posts: Vec<_> = self.posts.iter().collect(); sorted_posts.sort_by(|a, b| b.likes.len().cmp(&a.likes.len())); // Paginate posts @@ -147,7 +140,7 @@ impl FeedHandler for MyFeedHandler { .collect(); // Calculate the next cursor - let next_cursor = if start_index + posts_per_page < posts.len() { + let next_cursor = if start_index + posts_per_page < self.posts.len() { Some((start_index + posts_per_page).to_string()) } else { None @@ -162,38 +155,27 @@ impl FeedHandler for MyFeedHandler { } } } - -``` - -## Implement the `Feed` trait - -We'll need to use `Arc>` to enable concurrent shared access. - -```rust -struct MyFeed { - handler: MyFeedHandler, -} - -impl Feed for MyFeed { - fn handler(&mut self) -> MyFeedHandler { - self.handler.clone() - } -} ``` ## Start your feed! -Now we can create an instance of our `Feed` and start it on a local address. +Now we can create an instance of our feed handler and start the server using the `start()` function with a `Config`. ```rust #[tokio::main] async fn main() { - let mut feed = MyFeed { - handler: MyFeedHandler { - posts: Arc::new(Mutex::new(Vec::new())), - }, + let handler = MyFeedHandler { posts: Vec::new() }; + let config = Config { + publisher_did: "did:web:example.com".to_string(), + feed_generator_hostname: "example.com".to_string(), }; - feed.start("Cats", ([0, 0, 0, 0], 3030)).await + start( + config, + 5_000, + Arc::new(Mutex::new(handler)), + ([0, 0, 0, 0], 3030), + ) + .await } ``` @@ -205,3 +187,13 @@ To run these, clone this repo & run this command inside the crate directory `cargo run --bin publish` If you'd like to verify your feed server's endpoints _locally_ before you publish, you can also use the [verify](./src/bin/verify.rs) utility. + +### Contributing + +This repo uses `cargo-public-api` to snapshot test the public API. + +If your PR changes the public API, one of the checks will fail by default. + +If the changes to the public API were intentional you can update the snapshot by running: + +`UPDATE_SNAPSHOTS=yes cargo test --features test-api` diff --git a/examples/basic/Cargo.lock b/examples/basic/Cargo.lock new file mode 100644 index 0000000..ba41654 --- /dev/null +++ b/examples/basic/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "basic" +version = "0.1.0" diff --git a/examples/basic/src/main.rs b/examples/basic/src/main.rs index 1689fca..b5dbde2 100644 --- a/examples/basic/src/main.rs +++ b/examples/basic/src/main.rs @@ -1,31 +1,27 @@ use log::info; -use skyfeed::{Feed, FeedHandler, FeedResult, Post, Request, Uri}; +use skyfeed::{Config, FeedHandler, FeedRequest, FeedResult, Post, Uri, start}; use std::{collections::HashSet, sync::Arc}; use tokio::sync::Mutex; #[tokio::main] async fn main() { - let mut feed = MyFeed { - handler: MyFeedHandler { - posts: Arc::new(Mutex::new(Vec::new())), - }, + let handler = MyFeedHandler { posts: Vec::new() }; + let config = Config { + publisher_did: "did:web:example.com".to_string(), + feed_generator_hostname: "example.com".to_string(), }; - feed.start("Cats", ([0, 0, 0, 0], 3030)).await -} - -struct MyFeed { - handler: MyFeedHandler, -} - -impl Feed for MyFeed { - fn handler(&mut self) -> MyFeedHandler { - self.handler.clone() - } + start( + config, + 5_000, + Arc::new(Mutex::new(handler)), + ([0, 0, 0, 0], 3030), + ) + .await } #[derive(Clone)] struct MyFeedHandler { - posts: Arc>>, + posts: Vec, } #[derive(Debug, Clone)] @@ -35,55 +31,48 @@ struct MyPost { } impl FeedHandler for MyFeedHandler { + async fn available_feeds(&mut self) -> Vec { + vec!["Cats".to_string()] + } + async fn insert_post(&mut self, post: Post) { + println!("📝 POST: {}", post.text); if post.text.to_lowercase().contains(" cat ") { - info!("Storing {post:?}"); const MAX_POSTS: usize = 100; - let mut posts = self.posts.lock().await; - - posts.push(MyPost { + self.posts.push(MyPost { post, likes: HashSet::new(), }); - if posts.len() > MAX_POSTS { - posts.remove(0); + if self.posts.len() > MAX_POSTS { + self.posts.remove(0); } } } async fn delete_post(&mut self, uri: Uri) { + println!("🗑️ DELETE POST: {}", uri.0); self.posts - .lock() - .await .retain(|post_with_likes| post_with_likes.post.uri != uri); } - async fn like_post(&mut self, like_uri: Uri, liked_post_uri: Uri) { - if let Some(post_with_likes) = self - .posts - .lock() - .await - .iter_mut() - .find(|p| p.post.uri == liked_post_uri) + async fn insert_like(&mut self, like_uri: Uri, liked_post_uri: Uri) { + if let Some(post_with_likes) = self.posts.iter_mut().find(|p| p.post.uri == liked_post_uri) { post_with_likes.likes.insert(like_uri); } } async fn delete_like(&mut self, like_uri: Uri) { - let mut posts = self.posts.lock().await; - for post_with_likes in posts.iter_mut() { + for post_with_likes in self.posts.iter_mut() { post_with_likes.likes.remove(&like_uri); } } - async fn serve_feed(&self, request: Request) -> FeedResult { + async fn serve_feed(&self, request: FeedRequest) -> FeedResult { info!("Serving {request:?}"); - let posts = self.posts.lock().await; - // Parse the cursor from the request let start_index = if let Some(cursor) = &request.cursor { cursor.parse::().unwrap_or(0) @@ -94,7 +83,7 @@ impl FeedHandler for MyFeedHandler { let posts_per_page = 5; // Sort posts by likes - let mut sorted_posts: Vec<_> = posts.iter().collect(); + let mut sorted_posts: Vec<_> = self.posts.iter().collect(); sorted_posts.sort_by(|a, b| b.likes.len().cmp(&a.likes.len())); // Paginate posts @@ -106,7 +95,7 @@ impl FeedHandler for MyFeedHandler { .collect(); // Calculate the next cursor - let next_cursor = if start_index + posts_per_page < posts.len() { + let next_cursor = if start_index + posts_per_page < self.posts.len() { Some((start_index + posts_per_page).to_string()) } else { None diff --git a/examples/sqlite/Cargo.lock b/examples/sqlite/Cargo.lock index 42d743d..3446299 100644 --- a/examples/sqlite/Cargo.lock +++ b/examples/sqlite/Cargo.lock @@ -4,33 +4,45 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "allocator-api2" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android_system_properties" @@ -43,9 +55,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -58,67 +70,112 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", - "once_cell", - "windows-sys 0.59.0", + "once_cell_polyfill", + "windows-sys 0.61.2", ] [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-compression" -version = "0.4.18" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +checksum = "0e86f6d3dc9dc4352edeea6b8e499e13e3f5dc3b964d7ca5fd411415a3498473" dependencies = [ - "flate2", + "compression-codecs", + "compression-core", "futures-core", - "memchr", "pin-project-lite", "tokio", ] +[[package]] +name = "async-lock" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -129,13 +186,14 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atrium-api" -version = "0.24.10" +version = "0.25.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c5d74937642f6b21814e82d80f54d55ebd985b681bffbe27c8a76e726c3c4db" +checksum = "ef9d5e9352fd27d99383ae1db2b6a6aa239e683a7e750e8d73a73996d82b1fd2" dependencies = [ + "atrium-common", "atrium-xrpc", "chrono", - "http 1.2.0", + "http", "ipld-core", "langtag", "regex", @@ -147,13 +205,48 @@ dependencies = [ "trait-variant", ] +[[package]] +name = "atrium-common" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed5610654043faa396a5a15afac0ac646d76aebe45aebd7cef4f8b96b0ab7f4" +dependencies = [ + "dashmap", + "lru", + "moka", + "thiserror 1.0.69", + "tokio", + "trait-variant", + "web-time", +] + +[[package]] +name = "atrium-repo" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300aff863d16ad3aa1655b8586ae24fc492b338f822a7c2852a2241533832b4d" +dependencies = [ + "async-stream", + "atrium-api", + "futures", + "ipld-core", + "serde", + "serde_bytes", + "serde_ipld_dagcbor", + "sha2", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "unsigned-varint 0.8.0", +] + [[package]] name = "atrium-xrpc" -version = "0.12.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f223b98be2acdd7afe5b867744aee8258413ed09993099de0a036b247db0ec4c" +checksum = "0216ad50ce34e9ff982e171c3659e65dedaa2ed5ac2994524debdc9a9647ffa8" dependencies = [ - "http 1.2.0", + "http", "serde", "serde_html_form", "serde_json", @@ -163,9 +256,9 @@ dependencies = [ [[package]] name = "atrium-xrpc-client" -version = "0.5.10" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd9946c18301eee62e8bd0ade5ac2750c9a0778fadf097ac60024b2a79485603" +checksum = "e099e5171f79faef52364ef0657a4cab086a71b384a779a29597a91b780de0d5" dependencies = [ "atrium-xrpc", "reqwest", @@ -173,15 +266,37 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b5ce75405893cd713f9ab8e297d8e438f624dde7d706108285f7e17a25a180f" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "179c3777a8b5e70e90ea426114ffc565b2c1a9f82f6c4a0c5a34aa6ef5e781b6" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -189,7 +304,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-link", ] [[package]] @@ -199,10 +314,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" [[package]] -name = "base64" -version = "0.21.7" +name = "base256emoji" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" +dependencies = [ + "const-str", + "match-lookup", +] [[package]] name = "base64" @@ -211,22 +330,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "basic" -version = "0.1.0" +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "blake2b_simd" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" dependencies = [ - "chrono", - "log", - "regex", - "rusqlite", - "skyfeed", - "tokio", + "arrayref", + "arrayvec", + "constant_time_eq", ] [[package]] -name = "bitflags" -version = "2.8.0" +name = "blake2s_simd" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e90f7deecfac93095eb874a40febd69427776e24e1bd7f87f33ac62d6f0174df" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] [[package]] name = "block-buffer" @@ -239,9 +381,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byteorder" @@ -251,16 +393,26 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "cbor4ii" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "b544cf8c89359205f4f990d0e6f3828db42df85b5dac95d09157a250eb0749c4" +dependencies = [ + "serde", +] [[package]] name = "cc" -version = "1.2.10" +version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -268,23 +420,45 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-targets", + "windows-link", +] + +[[package]] +name = "chrono-tz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" +dependencies = [ + "chrono", + "phf", +] + +[[package]] +name = "cid" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd94671561e36e4e7de75f753f577edafb0e7c05d6e4547229fdf7938fbcd2c3" +dependencies = [ + "core2", + "multibase", + "multihash 0.18.1", + "serde", + "unsigned-varint 0.7.2", ] [[package]] @@ -295,17 +469,17 @@ checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" dependencies = [ "core2", "multibase", - "multihash", + "multihash 0.19.3", "serde", "serde_bytes", - "unsigned-varint", + "unsigned-varint 0.8.0", ] [[package]] name = "clap" -version = "4.5.27" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -313,9 +487,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.27" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -325,27 +499,74 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.24" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" + +[[package]] +name = "cmake" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "compression-codecs" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302266479cb963552d11bd042013a58ef1adc56768016c8b82b4199488f2d4ad" +dependencies = [ + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-str" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "core-foundation" @@ -357,6 +578,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -374,43 +605,91 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" -version = "2.7.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "data-encoding-macro" -version = "0.1.16" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b16d9d0d88a5273d830dac8b78ceb217ffc9b1d5404e5597a3542515329405b" +checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -418,12 +697,12 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145d32e826a7748b69ee8fc62d3e6355ff7f1051df53141e7048162fc90481b" +checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn", + "syn 2.0.111", ] [[package]] @@ -444,7 +723,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -453,6 +732,18 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -464,9 +755,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" dependencies = [ "log", "regex", @@ -474,31 +765,74 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ "anstream", "anstyle", "env_filter", - "humantime", + "jiff", "log", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", ] [[package]] @@ -519,11 +853,17 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "a2152dbcb980c05735e2a651d96011320a949eb31a0c8b38b72645ce97dec676" dependencies = [ "crc32fast", "miniz_oxide", @@ -549,9 +889,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foreign-types" @@ -570,22 +910,43 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] -name = "futures-channel" +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ + "futures-channel", "futures-core", + "futures-executor", + "futures-io", "futures-sink", -] + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] [[package]] name = "futures-core" @@ -593,6 +954,23 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + [[package]] name = "futures-macro" version = "0.3.31" @@ -601,7 +979,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -622,10 +1000,13 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", + "futures-io", "futures-macro", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -643,9 +1024,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", @@ -654,24 +1035,36 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "h2" -version = "0.3.26" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", - "http 0.2.12", + "http", "indexmap", "slab", "tokio", @@ -680,52 +1073,51 @@ dependencies = [ ] [[package]] -name = "h2" -version = "0.4.7" +name = "hashbrown" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.2.0", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", + "ahash", + "allocator-api2", ] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ + "allocator-api2", + "equivalent", "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "hashlink" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown", + "hashbrown 0.15.5", ] [[package]] name = "headers" -version = "0.3.9" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" dependencies = [ - "base64 0.21.7", + "base64", "bytes", "headers-core", - "http 0.2.12", + "http", "httpdate", "mime", "sha1", @@ -733,11 +1125,11 @@ dependencies = [ [[package]] name = "headers-core" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 0.2.12", + "http", ] [[package]] @@ -747,38 +1139,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "http" -version = "0.2.12" +name = "hex" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -786,27 +1161,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "futures-core", + "http", + "http-body", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -814,51 +1189,24 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "hyper" -version = "0.14.32" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.7", - "http 1.2.0", - "http-body 1.0.1", - "httparse", - "itoa", - "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -866,15 +1214,15 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", - "http 1.2.0", - "hyper 1.5.2", + "http", + "hyper", "hyper-util", "rustls", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls", @@ -889,7 +1237,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.2", + "hyper", "hyper-util", "native-tls", "tokio", @@ -899,33 +1247,41 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ + "base64", "bytes", "futures-channel", + "futures-core", "futures-util", - "http 1.2.0", - "http-body 1.0.1", - "hyper 1.5.2", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", "socket2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -941,21 +1297,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -964,104 +1321,66 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", + "icu_locale_core", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1070,9 +1389,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -1080,21 +1399,21 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.1", ] [[package]] name = "ipld-core" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ede82a79e134f179f4b29b5fdb1eb92bd1b38c4dfea394c539051150a21b9b" +checksum = "104718b1cc124d92a6d01ca9c9258a7df311405debb3408c445a36452f9bf8db" dependencies = [ - "cid", + "cid 0.11.1", "serde", "serde_bytes", ] @@ -1105,58 +1424,81 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] -name = "jetstream-oxide" -version = "0.1.0" -source = "git+https://github.com/cyypherus/jetstream-oxide?rev=0ced7f9eec58e368f4ef2d7991f68f1753b5fa39#0ced7f9eec58e368f4ef2d7991f68f1753b5fa39" +name = "jiff" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" dependencies = [ - "async-trait", - "atrium-api", - "chrono", - "flume", - "futures-util", + "jiff-static", "log", - "serde", - "serde_json", - "thiserror 2.0.11", - "tokio", - "tokio-tungstenite 0.24.0", - "tokio-util", - "url", - "zstd", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", ] +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + [[package]] name = "langtag" version = "0.3.4" @@ -1168,9 +1510,98 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.178" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "libipld" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1ccd6b8ffb3afee7081fcaec00e1b099fd1c7ccf35ba5729d88538fcc3b4599" +dependencies = [ + "fnv", + "libipld-cbor", + "libipld-cbor-derive", + "libipld-core", + "libipld-json", + "libipld-macro", + "libipld-pb", + "log", + "multihash 0.18.1", + "thiserror 1.0.69", +] + +[[package]] +name = "libipld-cbor" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77d98c9d1747aa5eef1cf099cd648c3fd2d235249f5fed07522aaebc348e423b" +dependencies = [ + "byteorder", + "libipld-core", + "thiserror 1.0.69", +] + +[[package]] +name = "libipld-cbor-derive" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5ba3a729b72973e456a1812b0afe2e176a376c1836cc1528e9fc98ae8cb838" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + +[[package]] +name = "libipld-core" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5acd707e8d8b092e967b2af978ed84709eaded82b75effe6cb6f6cc797ef8158" +dependencies = [ + "anyhow", + "cid 0.10.1", + "core2", + "multibase", + "multihash 0.18.1", + "thiserror 1.0.69", +] + +[[package]] +name = "libipld-json" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "25856def940047b07b25c33d4e66d248597049ab0202085215dc4dca0487731c" +dependencies = [ + "libipld-core", + "multihash 0.18.1", + "serde", + "serde_json", +] + +[[package]] +name = "libipld-macro" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71171c54214f866ae6722f3027f81dff0931e600e5a61e6b1b6a49ca0b5ed4ae" +dependencies = [ + "libipld-core", +] + +[[package]] +name = "libipld-pb" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f2d0f866c4cd5dc9aa8068c429ba478d2882a3a4b70ab56f7e9a0eddf5d16f" +dependencies = [ + "bytes", + "libipld-core", + "quick-protobuf", + "thiserror 1.0.69", +] [[package]] name = "libsqlite3-sys" @@ -1185,37 +1616,103 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.25" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "match-lookup" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "metrics" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5312e9ba3771cfa961b585728215e3d972c950a3eed9252aa093d6301277e8" +dependencies = [ + "ahash", + "portable-atomic", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "dd7399781913e5393588a8d8c6a2867bf85fb38eaf2502fdce465aad2dc6f034" +dependencies = [ + "base64", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "indexmap", + "ipnet", + "metrics", + "metrics-util", + "quanta", + "thiserror 1.0.69", + "tokio", + "tracing", +] + +[[package]] +name = "metrics-util" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8496cc523d1f94c1385dd8f0f0c2c480b2b8aeccb5b7e4485ad6365523ae376" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.15.5", + "metrics", + "quanta", + "rand", + "rand_xoshiro", + "sketches-ddsketch", +] [[package]] name = "mime" @@ -1235,51 +1732,84 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moka" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" +dependencies = [ + "async-lock", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "event-listener", + "futures-util", + "parking_lot", + "portable-atomic", + "rustc_version", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "multibase" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" dependencies = [ - "libc", - "wasi", - "windows-sys 0.52.0", + "base-x", + "base256emoji", + "data-encoding", + "data-encoding-macro", ] [[package]] -name = "multer" -version = "2.1.0" +name = "multicodec" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" +checksum = "f287a558ce2cac6f63944876d2f76ae2254a17fbe174c82967e76e0aab3379ed" dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http 0.2.12", - "httparse", - "log", - "memchr", - "mime", - "spin", - "version_check", + "failure", + "serde", + "unsigned-varint 0.2.3", ] [[package]] -name = "multibase" -version = "0.9.1" +name = "multihash" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +checksum = "cfd8a792c1694c6da4f68db0a9d707c72bd260994da179e6030a5dcee00bb815" dependencies = [ - "base-x", - "data-encoding", - "data-encoding-macro", + "blake2b_simd", + "blake2s_simd", + "blake3", + "core2", + "digest", + "multihash-derive", + "sha2", + "sha3", + "unsigned-varint 0.7.2", ] [[package]] @@ -1290,7 +1820,21 @@ checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" dependencies = [ "core2", "serde", - "unsigned-varint", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "multihash-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +dependencies = [ + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", ] [[package]] @@ -1299,14 +1843,14 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "getrandom", + "getrandom 0.2.16", ] [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -1314,7 +1858,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -1330,24 +1874,30 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ "bitflags", "cfg-if", @@ -1366,7 +1916,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -1375,33 +1925,29 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" -[[package]] -name = "openssl-src" -version = "300.4.1+3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" -dependencies = [ - "cc", -] - [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", - "openssl-src", "pkg-config", "vcpkg", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1409,41 +1955,59 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-link", ] [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher", +] [[package]] name = "pin-project" -version = "1.1.8" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.8" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -1460,53 +2024,140 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror 1.0.69", + "toml", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] +[[package]] +name = "quanta" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", +] + +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + [[package]] name = "quote" -version = "1.0.38" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" -version = "0.8.5" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -1514,27 +2165,65 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_xoshiro" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" +dependencies = [ + "rand_core", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ - "getrandom", + "crossbeam-deque", + "crossbeam-utils", ] [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -1544,9 +2233,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -1555,71 +2244,85 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "async-compression", - "base64 0.22.1", + "base64", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.7", - "http 1.2.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.5.2", + "hyper", "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-native-tls", "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows-registry", ] [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.16", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] +[[package]] +name = "rs-car" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "732df95a8f40f7623f7d54eac1e11626d86fd970f7542738d64c30d0d7ff0068" +dependencies = [ + "blake2b_simd", + "cid 0.10.1", + "futures", + "hex", + "libipld", + "libipld-cbor", + "multibase", + "multicodec", + "multihash 0.18.1", + "sha2", +] + [[package]] name = "rusqlite" version = "0.33.0" @@ -1636,29 +2339,40 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] [[package]] name = "rustix" -version = "0.38.44" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.21" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ + "aws-lc-rs", + "log", "once_cell", "rustls-pki-types", "rustls-webpki", @@ -1667,26 +2381,33 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "rustls-native-certs" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ + "openssl-probe", "rustls-pki-types", + "schannel", + "security-framework 3.5.1", ] [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -1694,23 +2415,23 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1732,7 +2453,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -1740,66 +2474,96 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "serde" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "serde_html_form" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2de91cf02bbc07cde38891769ccd5d4f073d22a40683aa4bc7a95781aaa2c4" +checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" dependencies = [ "form_urlencoded", "indexmap", "itoa", "ryu", + "serde_core", +] + +[[package]] +name = "serde_ipld_dagcbor" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46182f4f08349a02b45c998ba3215d3f9de826246ba02bb9dddfe9a2a2100778" +dependencies = [ + "cbor4ii", + "ipld-core", + "scopeguard", "serde", ] [[package]] name = "serde_json" -version = "1.0.137" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -1825,6 +2589,27 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1833,56 +2618,85 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "sketches-ddsketch" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" + [[package]] name = "skyfeed" -version = "0.4.0" +version = "0.6.0" +source = "git+https://github.com/cyypherus/skyfeed.git?rev=cc0a252f7aaf7f4e46f9252ba9b7c213f0191c93#cc0a252f7aaf7f4e46f9252ba9b7c213f0191c93" dependencies = [ "anyhow", + "async-trait", "atrium-api", + "atrium-repo", "atrium-xrpc-client", "chrono", + "chrono-tz", "clap", "dotenv", "env_logger", - "jetstream-oxide", + "flume", + "futures", + "ipld-core", "log", + "rayon", + "regex", "reqwest", + "rs-car", + "rusqlite", + "rustls", "serde", + "serde_ipld_dagcbor", "serde_json", "tokio", + "tokio-tungstenite", "warp", + "whatlang", ] [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.8" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -1894,11 +2708,29 @@ dependencies = [ "lock_api", ] +[[package]] +name = "sqlite-feed" +version = "0.1.0" +dependencies = [ + "chrono", + "chrono-tz", + "dotenv", + "log", + "metrics", + "metrics-exporter-prometheus", + "rayon", + "regex", + "rusqlite", + "skyfeed", + "tokio", + "whatlang", +] + [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "strsim" @@ -1910,13 +2742,24 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] [[package]] name = "syn" -version = "2.0.96" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -1934,13 +2777,25 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -1950,7 +2805,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -1964,18 +2819,23 @@ dependencies = [ "libc", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tempfile" -version = "3.15.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if", "fastrand", - "getrandom", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1989,11 +2849,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.17", ] [[package]] @@ -2004,25 +2864,25 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -2030,11 +2890,10 @@ dependencies = [ [[package]] name = "tokio" -version = "1.43.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", "mio", @@ -2043,18 +2902,18 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -2069,9 +2928,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -2079,43 +2938,43 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite 0.21.0", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.24.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", - "native-tls", + "rustls", + "rustls-native-certs", + "rustls-pki-types", "tokio", - "tokio-native-tls", - "tungstenite 0.24.0", + "tokio-rustls", + "tungstenite", ] [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "pin-project-lite", "tokio", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "tower" version = "0.5.2" @@ -2131,6 +2990,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -2145,9 +3022,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "log", "pin-project-lite", @@ -2156,9 +3033,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", ] @@ -2171,7 +3048,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] @@ -2182,48 +3059,28 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 1.2.0", - "httparse", - "log", - "rand", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - -[[package]] -name = "tungstenite" -version = "0.24.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" dependencies = [ - "byteorder", "bytes", "data-encoding", - "http 1.2.0", + "http", "httparse", "log", - "native-tls", "rand", + "rustls", + "rustls-pki-types", "sha1", - "thiserror 1.0.69", - "url", + "thiserror 2.0.17", "utf-8", ] [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicase" @@ -2233,15 +3090,37 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.15" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unsigned-varint" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f0023a96687fe169081e8adce3f65e3874426b7886e9234d490af2dc077959" + +[[package]] +name = "unsigned-varint" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" [[package]] name = "unsigned-varint" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" +dependencies = [ + "futures-io", + "futures-util", +] [[package]] name = "untrusted" @@ -2251,13 +3130,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -2266,12 +3146,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2284,6 +3158,17 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "vcpkg" version = "0.2.15" @@ -2307,20 +3192,21 @@ dependencies = [ [[package]] name = "warp" -version = "0.3.7" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4378d202ff965b011c64817db11d5829506d3404edeadb61f190d111da3f231c" +checksum = "51d06d9202adc1f15d709c4f4a2069be5428aa912cc025d6f268ac441ab066b0" dependencies = [ "bytes", - "futures-channel", "futures-util", "headers", - "http 0.2.12", - "hyper 0.14.32", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", "log", "mime", "mime_guess", - "multer", "percent-encoding", "pin-project", "scoped-tls", @@ -2328,7 +3214,6 @@ dependencies = [ "serde_json", "serde_urlencoded", "tokio", - "tokio-tungstenite 0.21.0", "tokio-util", "tower-service", "tracing", @@ -2336,41 +3221,37 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasm-bindgen" -version = "0.2.100" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" +name = "wasm-bindgen" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -2381,9 +3262,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2391,73 +3272,146 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn", - "wasm-bindgen-backend", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", ] +[[package]] +name = "whatlang" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471d1c1645d361eb782a1650b1786a8fb58dd625e681a04c09f5ff7c8764a7b0" +dependencies = [ + "hashbrown 0.14.5", + "once_cell", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-core" -version = "0.52.0" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ - "windows-targets", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-registry" -version = "0.2.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ + "windows-link", "windows-result", "windows-strings", - "windows-targets", ] [[package]] name = "windows-result" -version = "0.2.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-targets", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-result", - "windows-targets", + "windows-link", ] [[package]] @@ -2466,16 +3420,25 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-targets", + "windows-link", ] [[package]] @@ -2484,14 +3447,31 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -2500,42 +3480,84 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -2543,24 +3565,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "write16" -version = "1.0.0" +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -2568,110 +3595,92 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 2.0.111", + "synstructure 0.13.2", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.111", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 2.0.111", + "synstructure 0.13.2", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] -name = "zerovec" -version = "0.10.4" +name = "zerotrie" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ + "displaydoc", "yoke", "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zstd" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" -dependencies = [ - "zstd-safe", ] [[package]] -name = "zstd-safe" -version = "7.2.1" +name = "zerovec" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ - "zstd-sys", + "yoke", + "zerofrom", + "zerovec-derive", ] [[package]] -name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +name = "zerovec-derive" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ - "cc", - "pkg-config", + "proc-macro2", + "quote", + "syn 2.0.111", ] diff --git a/examples/sqlite/Cargo.toml b/examples/sqlite/Cargo.toml index 5915a87..c7df24c 100644 --- a/examples/sqlite/Cargo.toml +++ b/examples/sqlite/Cargo.toml @@ -1,12 +1,27 @@ [package] -name = "basic" +name = "sqlite-feed" version = "0.1.0" -edition = "2021" +edition = "2024" +publish = false +rust-version = "1.90.0" + +[features] +local = [] [dependencies] log = "0.4.25" -skyfeed = { path = "../.." } +skyfeed = { git = "https://github.com/cyypherus/skyfeed.git", rev = "cc0a252f7aaf7f4e46f9252ba9b7c213f0191c93" } +# skyfeed = { path = "../.." } tokio = { version = "1.43.0", features = ["full", "time"] } rusqlite = { version = "0.33.0", features = ["bundled"] } chrono = "0.4.39" +chrono-tz = "0.10" regex = "1.11.1" +whatlang = "0.16.4" +metrics = "0.24.1" +metrics-exporter-prometheus = "0.16.2" +dotenv = "0.15.0" +rayon = "1.10" + +[profile.release] +lto = true diff --git a/examples/sqlite/src/main.rs b/examples/sqlite/src/main.rs index 023dc6b..1c2213d 100644 --- a/examples/sqlite/src/main.rs +++ b/examples/sqlite/src/main.rs @@ -1,197 +1,415 @@ -use log::info; -use rusqlite::{params, Connection}; -use skyfeed::{Feed, FeedHandler, FeedResult, Post, Request, Uri}; -use std::{sync::Arc, time::Duration}; +use chrono_tz::America::Denver; +// use dotenv::dotenv; +use log::{error, info, trace}; +use rayon::prelude::*; +use regex::Regex; +use rusqlite::{Connection, params}; +use skyfeed::{Config, FeedHandler, FeedRequest, FeedResult, Post, Uri}; +use std::{env, sync::Arc, time::Duration}; use tokio::sync::Mutex; +const FR_FEED: &str = "fr"; +const MY_FEED: &str = "cyys-feed"; + +#[derive(Clone)] +struct PendingPost { + uri: String, + text: String, + timestamp: i64, + langs: Vec, + labels: Vec, +} + +#[derive(Clone)] +struct PendingLike { + post_uri: String, + like_uri: String, +} + #[tokio::main] async fn main() { - let db = Connection::open("feed.db").expect("Failed to open database"); + // dotenv().expect("No .env"); + // let db = Connection::open("feed.db").expect("Failed to open database"); + let db = Connection::open("/space/feed.db").expect("Failed to open database"); initialize_db(&db); - let db = Arc::new(Mutex::new(db)); + let my_feed_regex = env::var("MY_FEED_REGEX").expect("Missing feed regex"); + let fr_feed_regex = env::var("FR_FEED_REGEX").expect("Missing feed regex"); + let handler = Arc::new(Mutex::new(MyFeedHandler { + fr_regex: regex::RegexBuilder::new(fr_feed_regex.as_str()) + .case_insensitive(true) + .build() + .unwrap(), + my_regex: regex::RegexBuilder::new(my_feed_regex.as_str()) + .build() + .unwrap(), + db: Arc::new(Mutex::new(db)), + pending_posts: Vec::new(), + pending_likes: Vec::new(), + })); - let mut feed = MyFeed { - handler: MyFeedHandler { db: db.clone() }, - }; + let handler_flush = handler.clone(); + let mut flush_interval = tokio::time::interval(Duration::from_secs(10)); + let flush_task = tokio::spawn(async move { + loop { + flush_interval.tick().await; + let mut handler = handler_flush.lock().await; + handler.flush_posts().await; + handler.flush_likes().await; + } + }); - let mut cleanup_interval = tokio::time::interval(Duration::from_secs(10)); + let handler_cleanup = handler.clone(); + let mut cleanup_interval = tokio::time::interval(Duration::from_secs(30)); let cleanup_task = tokio::spawn(async move { loop { cleanup_interval.tick().await; - cleanup_posts(&db).await; + let mut handler = handler_cleanup.lock().await; + handler.cleanup_posts(FR_FEED, 5_000).await; + handler.cleanup_posts(MY_FEED, 60_000).await; } }); - tokio::join!(feed.start("Cats", ([0, 0, 0, 0], 3030)), cleanup_task) - .1 - .expect("Starting tasks failed"); -} + let publisher_did = env::var("PUBLISHER_DID").expect("PUBLISHER_DID env var not set"); + let feed_generator_hostname = + env::var("FEED_GENERATOR_HOSTNAME").expect("FEED_GENERATOR_HOSTNAME env var not set"); -struct MyFeed { - handler: MyFeedHandler, -} + let config = Config { + publisher_did, + feed_generator_hostname, + }; -impl Feed for MyFeed { - fn handler(&mut self) -> MyFeedHandler { - self.handler.clone() - } + tokio::join!( + skyfeed::start(config, 5_000, handler, ([0, 0, 0, 0], 3030)), + flush_task, + cleanup_task, + ) + .1 + .expect("Starting tasks failed"); } -#[derive(Clone)] struct MyFeedHandler { + fr_regex: Regex, + my_regex: Regex, db: Arc>, + pending_posts: Vec, + pending_likes: Vec, } -impl FeedHandler for MyFeedHandler { - async fn insert_post(&mut self, post: Post) { - let cat_regex = - regex::RegexBuilder::new("\\b(cats?|kitty|kitties|kittens?|feline|catsofbluesky)\\b") - .case_insensitive(true) - .build() - .unwrap(); - - let unwanted_regex = - regex::RegexBuilder::new("\\b(trump|kamala|harris|biden|democrats?|democratic|republicans?|politics|dems?|aoc|GOP|vance|musk|elon|walz|fascists?|furryart|smut|furries|dnc|RFK)\\b|(right wing|left wing)") - .case_insensitive(true) - .build() - .unwrap(); - - if cat_regex.is_match(post.text.as_str()) - && !unwanted_regex.is_match(post.text.as_str()) - && post.labels.is_empty() +impl MyFeedHandler { + async fn flush_posts(&mut self) { + if self.pending_posts.is_empty() { + return; + } + + let posts_to_filter: Vec<_> = self.pending_posts.drain(..).collect(); + let total = posts_to_filter.len(); + + let fr_regex = &self.fr_regex; + let my_regex = &self.my_regex; + + // Parallelize filtering with regex, it can be a bottleneck + let filtered: Vec<(String, String, i64, String)> = posts_to_filter + .into_par_iter() + .filter_map(|post| { + let detected_language = whatlang::detect_lang(&post.text); + + if post.langs.iter().any(|lang| lang.contains("fr")) + && detected_language == Some(whatlang::Lang::Fra) + && !fr_regex.is_match(&post.text) + && post.labels.is_empty() + { + Some((post.uri, post.text, post.timestamp, FR_FEED.to_string())) + } else if post.langs.iter().any(|lang| lang.contains("en")) + && detected_language == Some(whatlang::Lang::Eng) + && !my_regex.is_match(&post.text) + { + Some((post.uri, post.text, post.timestamp, MY_FEED.to_string())) + } else { + None + } + }) + .collect(); + + let count = filtered.len(); + let mut db = self.db.lock().await; + let tx = db.transaction().expect("Failed to start transaction"); + { - info!("Storing {post:?}"); - let db = self.db.lock().await; + let mut stmt = tx + .prepare( + "INSERT OR REPLACE INTO posts (uri, text, timestamp, feed) VALUES (?1, ?2, ?3, ?4)", + ) + .expect("Failed to prepare statement"); - db.execute( - "INSERT OR REPLACE INTO posts (uri, text, timestamp) VALUES (?1, ?2, ?3)", - params![post.uri.0, post.text, post.timestamp.timestamp()], - ) - .expect("Failed to insert post"); + for (uri, text, timestamp, feed) in filtered { + stmt.execute(params![uri, text, timestamp, feed]) + .expect("Failed to insert post"); + } } + + tx.commit().expect("Failed to commit transaction"); + trace!("Filtered {} posts, inserted {} to db", total, count); } - async fn delete_post(&mut self, uri: Uri) { - let db = self.db.lock().await; - db.execute("DELETE FROM posts WHERE uri = ?1", params![uri.0]) - .expect("Failed to delete post"); + async fn flush_likes(&mut self) { + if self.pending_likes.is_empty() { + return; + } + + let likes_to_insert: Vec<_> = self.pending_likes.drain(..).collect(); + let count = likes_to_insert.len(); + + let mut db = self.db.lock().await; + let tx = db.transaction().expect("Failed to start transaction"); + + { + let mut stmt = tx.prepare( + "INSERT OR REPLACE INTO likes (post_uri, like_uri) SELECT ?1, ?2 WHERE EXISTS (SELECT 1 FROM posts WHERE uri = ?1)" + ).expect("Failed to prepare statement"); + + for like in likes_to_insert { + stmt.execute(params![like.post_uri, like.like_uri]) + .expect("Failed to insert like"); + } + } + + tx.commit().expect("Failed to commit transaction"); + trace!("Successfully flushed {} likes", count); } - async fn like_post(&mut self, like_uri: Uri, liked_post_uri: Uri) { + async fn cleanup_posts(&mut self, feed: &str, post_limit: usize) { let db = self.db.lock().await; - db.execute( - "INSERT INTO likes (post_uri, like_uri) - SELECT ?1, ?2 - WHERE EXISTS (SELECT 1 FROM posts WHERE uri = ?1)", - params![liked_post_uri.0, like_uri.0], - ) - .expect("Failed to like post"); + let oldest_timestamp = db + .query_row( + "SELECT MIN(timestamp) FROM posts WHERE feed = ?1", + params![feed], + |row| row.get::<_, Option>(0), + ) + .expect("Failed to get oldest post timestamp"); + + let oldest_date = oldest_timestamp.and_then(|ts| { + chrono::DateTime::::from_timestamp(ts, 0).map(|dt| { + dt.with_timezone(&Denver) + .format("%b %d, %Y %l:%M %p") + .to_string() + }) + }); + + // Gate posts between 0.5-1 hours old: only keep the top 100 by likes in that range. + // This ensures older posts have proven engagement before being retained. + let now = chrono::Utc::now().timestamp(); + let half_hour_ago = now - 1800; + let one_hour_ago = now - 3600; + + let engagement_gated = db + .execute( + "DELETE FROM posts + WHERE feed = ?1 + AND timestamp >= ?3 + AND timestamp < ?2 + AND uri NOT IN ( + SELECT posts.uri + FROM posts + LEFT JOIN likes ON posts.uri = likes.post_uri + WHERE posts.feed = ?1 + AND posts.timestamp >= ?3 + AND posts.timestamp < ?2 + GROUP BY posts.uri + ORDER BY COUNT(likes.like_uri) DESC + LIMIT 100 + );", + params![feed, half_hour_ago, one_hour_ago], + ) + .expect("Failed to apply engagement gate"); + + let cleaned_posts = db + .execute( + "DELETE FROM posts + WHERE feed = ?1 + AND uri NOT IN ( + SELECT uri + FROM posts + WHERE feed = ?1 + ORDER BY timestamp DESC + LIMIT ?2 + );", + params![feed, post_limit], + ) + .expect("Failed to clean up old posts"); + + // Delete all posts older than 2 days (2 * 24 * 60 * 60 = 172800 seconds) + let two_days_ago = now - 172800; + let old_posts = db + .execute( + "DELETE FROM posts WHERE feed = ?1 AND timestamp < ?2", + params![feed, two_days_ago], + ) + .expect("Failed to delete old posts"); + + let remaining_posts = db + .query_row( + "SELECT COUNT(*) FROM posts WHERE feed = ?1", + params![feed], + |row| row.get::<_, usize>(0), + ) + .expect("Failed to count remaining posts"); + + info!( + "Cleaned up {cleaned_posts} posts on {feed} (engagement gated: {engagement_gated}, old posts: {old_posts}). Oldest post available: {}. {remaining_posts} posts remain.", + oldest_date.unwrap_or_else(|| "No posts".to_string()) + ); + } +} + +impl FeedHandler for MyFeedHandler { + async fn available_feeds(&mut self) -> Vec { + vec![FR_FEED.to_string(), MY_FEED.to_string()] + } + + async fn insert_post(&mut self, post: Post) { + self.pending_posts.push(PendingPost { + uri: post.uri.0.clone(), + text: post.text.clone(), + timestamp: post.timestamp.timestamp(), + langs: post.langs.clone(), + labels: post.labels.iter().map(|l| format!("{:?}", l)).collect(), + }); + } + + async fn delete_post(&mut self, uri: Uri) { + let db = Arc::clone(&self.db); + tokio::spawn(async move { + let unpost_sql = "DELETE FROM posts WHERE uri = ?1"; + db.lock() + .await + .execute(unpost_sql, params![uri.0]) + .expect("Failed to delete post"); + }); + } + + async fn insert_like(&mut self, like_uri: Uri, liked_post_uri: Uri) { + self.pending_likes.push(PendingLike { + post_uri: liked_post_uri.0.clone(), + like_uri: like_uri.0.clone(), + }); } async fn delete_like(&mut self, like_uri: Uri) { - let db = self.db.lock().await; - db.execute("DELETE FROM likes WHERE like_uri = ?1", params![like_uri.0]) - .expect("Failed to delete like"); + let db = Arc::clone(&self.db); + tokio::spawn(async move { + let unlike_sql = "DELETE FROM likes WHERE like_uri = ?1"; + db.lock() + .await + .execute(unlike_sql, params![like_uri.0]) + .expect("Failed to delete like"); + }); } - async fn serve_feed(&self, request: Request) -> FeedResult { + async fn serve_feed(&self, request: FeedRequest) -> FeedResult { info!("Serving {request:?}"); + let (hours_back, post_offset) = request + .cursor + .as_deref() + .and_then(|c| { + let parts: Vec<&str> = c.split(':').collect(); + if parts.len() == 2 { + Some(( + parts.first()?.parse::().ok()?, + parts.get(1)?.parse::().ok()?, + )) + } else { + None + } + }) + .unwrap_or((0, 0)); + + let request_limit: usize = request.limit.unwrap_or(100) as usize; + if request.feed != FR_FEED && request.feed != MY_FEED { + error!("Requested a nonexistent feed"); + return FeedResult { + cursor: None, + feed: Vec::new(), + }; + } + let db = self.db.lock().await; + // Paginates through top 100 posts every hour + // Posts that are <5 minutes old are excluded to give time for moderation + // Cursor is in the format "hour:offset" where hour is the number of hours back we will query, and offset is the number of posts from that hour that this client has already seen let mut stmt = db .prepare( " - WITH ranked_posts AS ( - SELECT - uri, - timestamp, - COUNT(like_uri) AS likes - FROM posts - LEFT JOIN likes ON posts.uri = likes.post_uri - GROUP BY posts.uri - HAVING COUNT(like_uri) > 0 - ), - sorted_posts AS ( - SELECT - uri, - timestamp, - likes, - PERCENT_RANK() OVER (ORDER BY likes DESC) AS rank - FROM ranked_posts - ) - SELECT uri, likes - FROM sorted_posts - WHERE rank <= 0.05 - ORDER BY timestamp DESC; - ", + WITH top_posts AS ( + SELECT + posts.uri, + posts.timestamp, + ROW_NUMBER() OVER (ORDER BY COUNT(likes.like_uri) DESC, posts.timestamp DESC) as rn, + COUNT(likes.like_uri) AS likes + FROM posts + LEFT JOIN likes ON posts.uri = likes.post_uri + WHERE posts.feed = ?2 + AND posts.timestamp >= (strftime('%s', 'now') - ((?1 + 1) * 3600)) + AND posts.timestamp < (strftime('%s', 'now') - (?1 * 3600)) + AND posts.timestamp < (strftime('%s', 'now') - 300) + GROUP BY posts.uri + LIMIT 100 + ) + SELECT uri + FROM top_posts + WHERE rn > ?3 + ORDER BY timestamp DESC + LIMIT ?4 + ", ) .expect("Failed to prepare statement"); let post_iter = stmt - .query_map([], |row| row.get::<_, String>(0)) + .query_map( + params![ + hours_back, + request.feed, + post_offset as i64, + request_limit as i64 + ], + |row| row.get::<_, String>(0), + ) .expect("Failed to query posts"); - let posts: Vec = post_iter.map(|x| x.unwrap()).map(Uri).collect(); + let posts: Vec = post_iter.filter_map(|x| x.ok()).map(Uri).collect(); - let start_index = request - .cursor - .as_deref() - .and_then(|c| c.parse::().ok()) - .unwrap_or(0); - let posts_per_page = 50; - - let page_posts: Vec<_> = posts - .iter() - .skip(start_index) - .take(posts_per_page) - .cloned() - .collect(); + info!("Returned {} posts for feed {}", posts.len(), request.feed); - let next_cursor = if start_index + posts_per_page < posts.len() { - Some((start_index + posts_per_page).to_string()) + let next_cursor = if !posts.is_empty() { + if posts.len() == request_limit { + let next_offset = post_offset + posts.len(); + if next_offset < 100 { + Some(format!("{}:{}", hours_back, next_offset)) + } else { + Some(format!("{}:0", hours_back + 1)) + } + } else { + Some(format!("{}:0", hours_back + 1)) + } } else { None }; FeedResult { cursor: next_cursor, - feed: page_posts, + feed: posts, } } } -async fn cleanup_posts(db: &Arc>) { - const MAX_POSTS: usize = 10_000; - - let cleaned_posts = db - .lock() - .await - .execute( - &format!( - " - DELETE FROM posts - WHERE uri NOT IN ( - SELECT uri - FROM posts - ORDER BY timestamp DESC - LIMIT {MAX_POSTS} - ); - " - ), - [], - ) - .expect("Failed to clean up old posts"); - - info!("Cleaned up {cleaned_posts} posts"); -} - fn initialize_db(db: &Connection) { db.execute( "CREATE TABLE IF NOT EXISTS posts ( uri TEXT PRIMARY KEY, text TEXT, - timestamp INTEGER + timestamp INTEGER, + feed TEXT )", [], ) diff --git a/src/bin/my_did.rs b/src/bin/my_did.rs index eadf7d9..f764f4b 100644 --- a/src/bin/my_did.rs +++ b/src/bin/my_did.rs @@ -1,6 +1,6 @@ use anyhow::Result; use atrium_api::{ - agent::atp_agent::{store::MemorySessionStore, AtpAgent}, + agent::atp_agent::{AtpAgent, store::MemorySessionStore}, types::string::Handle, }; use clap::Parser; diff --git a/src/bin/publish.rs b/src/bin/publish.rs index 9de7f3c..a3ed6d4 100644 --- a/src/bin/publish.rs +++ b/src/bin/publish.rs @@ -1,11 +1,11 @@ use atrium_api::com::atproto::repo::put_record::InputData; use atrium_api::types::string::RecordKey; use atrium_api::{ - agent::atp_agent::{store::MemorySessionStore, AtpAgent}, + agent::atp_agent::{AtpAgent, store::MemorySessionStore}, app::bsky::feed::generator::RecordData, types::{ - string::{Datetime, Did, Handle, Nsid}, TryIntoUnknown, + string::{Datetime, Did, Handle, Nsid}, }, }; use clap::Parser; diff --git a/src/bin/unpublish.rs b/src/bin/unpublish.rs index 43a1cbd..15211bd 100644 --- a/src/bin/unpublish.rs +++ b/src/bin/unpublish.rs @@ -1,6 +1,6 @@ use anyhow::Result; use atrium_api::{ - agent::atp_agent::{store::MemorySessionStore, AtpAgent}, + agent::atp_agent::{AtpAgent, store::MemorySessionStore}, types::string::{Handle, Nsid, RecordKey}, }; use clap::Parser; diff --git a/src/bin/verify.rs b/src/bin/verify.rs index 0b1bd22..afed869 100644 --- a/src/bin/verify.rs +++ b/src/bin/verify.rs @@ -57,29 +57,46 @@ async fn main() { ); // Extract at-uri and fetch the feed skeleton - let at_uri = describe["feeds"][0]["uri"] - .as_str() - .expect("at-uri not found"); + for feed in describe["feeds"].as_array().expect("Unexpected object") { + let at_uri = feed["uri"].as_str().expect("at-uri not found"); + let mut cursor: Option = None; - let skeleton_response = client - .get(format!( - "{}/xrpc/app.bsky.feed.getFeedSkeleton", - args.local_url - )) - .query(&[("feed", at_uri), ("limit", "20")]) - .send() - .await - .expect("Feed skeleton failed"); + for page in 0..2 { + let mut query = vec![("feed", at_uri.to_string()), ("limit", "20".to_string())]; + if let Some(ref c) = cursor { + query.push(("cursor", c.clone())); + } - let skeleton_body = skeleton_response - .text() - .await - .expect("Failed to read skeleton response text"); - let skeleton: Value = - serde_json::from_str(&skeleton_body).expect("Failed to parse skeleton JSON"); + let skeleton_response = client + .get(format!( + "{}/xrpc/app.bsky.feed.getFeedSkeleton", + args.local_url + )) + .query(&query) + .send() + .await + .expect("Feed skeleton failed"); - println!( - "Feed Skeleton Response:\n{}", - serde_json::to_string_pretty(&skeleton).expect("Failed to pretty print skeleton JSON") - ); + let skeleton_body = skeleton_response + .text() + .await + .expect("Failed to read skeleton response text"); + let skeleton: Value = + serde_json::from_str(&skeleton_body).expect("Failed to parse skeleton JSON"); + + println!( + "Feed Skeleton Response (Page {}):\n{}", + page + 1, + serde_json::to_string_pretty(&skeleton) + .expect("Failed to pretty print skeleton JSON") + ); + + // Extract cursor for next iteration + cursor = skeleton["cursor"].as_str().map(|s| s.to_string()); + + if cursor.is_none() { + break; + } + } + } } diff --git a/src/feed.rs b/src/feed.rs index 7901096..480934f 100644 --- a/src/feed.rs +++ b/src/feed.rs @@ -4,243 +4,148 @@ use atrium_api::app::bsky::feed::describe_feed_generator::{ use atrium_api::app::bsky::feed::get_feed_skeleton::OutputData as FeedSkeleton; use atrium_api::app::bsky::feed::get_feed_skeleton::Parameters as FeedSkeletonQuery; use atrium_api::app::bsky::feed::get_feed_skeleton::ParametersData as FeedSkeletonParameters; -use atrium_api::record::KnownRecord; use atrium_api::types::Object; -use chrono::DateTime; use env_logger::Env; -use jetstream_oxide::exports::Nsid; -use jetstream_oxide::{ - events::{ - commit::{CommitData, CommitEvent, CommitInfo, CommitType}, - JetstreamEvent::Commit, - }, - DefaultJetstreamEndpoints, JetstreamCompression, JetstreamConfig, JetstreamConnector, -}; -use log::{error, info}; -use std::fmt::Debug; +use log::{info, warn}; use std::net::SocketAddr; +use std::sync::Arc; +use tokio::sync::Mutex; use warp::Filter; -use crate::models::{Did, Embed, Label, Post, Request, Uri}; +use crate::config::Config; +use crate::firehose::{FirehoseConnector, FirehoseEvent}; +use crate::models::FeedRequest; use crate::utility_models::{DidDocument, Service}; -use crate::Cid; -use crate::{config::Config, feed_handler::FeedHandler}; +use crate::{FeedResult, Post, Uri}; -/// A `Feed` stores a `FeedHandler`, handles feed server endpoints & connects to the Firehose using the `start` methods. -pub trait Feed { - fn handler(&mut self) -> Handler; - /// Starts the feed generator server & connects to the firehose. - /// - /// This method loads the config from a local .env file using `dotenv`. See `Config` - /// - /// - name: The identifying name of your feed. This value is used in the feed URL & when identifying which feed to *unpublish*. This is a separate value from the display name. - /// - address: The address to bind the server to - /// - /// # Panics - /// - /// Panics if unable to bind to the provided address. - fn start( - &mut self, - name: impl AsRef, - address: impl Into + Debug + Clone + Send, - ) -> impl std::future::Future + Send { - self.start_with_config(name, Config::load_env_config(), address) - } - /// Starts the feed generator server & connects to the firehose. - /// - /// - name: The identifying name of your feed. This value is used in the feed URL & when identifying which feed to *unpublish*. This is a separate value from the display name. - /// - config: Configuration values, see `Config` - /// - address: The address to bind the server to - /// - /// # Panics - /// - /// Panics if unable to bind to the provided address. - fn start_with_config( +const FIREHOSE_ENDPOINT: &str = "bsky.network"; + +/// A feed handler is responsible for +/// - Storing and managing firehose input. +/// - Serving responses to feed requests with `serve_feed` +/// +/// One feed handler can implement any number of feeds. Feed IDs / names are specified by the `available_feeds` function, & are later referred to in the `FeedRequest::feed` field. +pub trait FeedHandler { + fn available_feeds(&mut self) -> impl Future> + Send; + fn insert_post(&mut self, post: Post) -> impl Future + Send; + fn delete_post(&mut self, uri: Uri) -> impl Future + Send; + fn insert_like( &mut self, - name: impl AsRef, - config: Config, - address: impl Into + Debug + Clone + Send, - ) -> impl std::future::Future + Send { - let mut handler = self.handler(); - let address = address.clone(); - let feed_name = name.as_ref().to_string(); - async move { - env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); + like_uri: Uri, + liked_post_uri: Uri, + ) -> impl std::future::Future + Send; + fn delete_like(&mut self, like_uri: Uri) -> impl Future + Send; + fn serve_feed(&self, request: FeedRequest) -> impl Future + Send; +} - let config = config; +/// Starts the feed generator server & connects to the firehose. +/// +/// - feed_handler: An object which handles firehose input & serve feeds. This object can implement multiple feeds. +/// - queue_limit: The maximum number of firehose updates to keep in memory at a time. If your handler does not process updates as quickly or more quickly than they are recieved updates will be stored in memory up to this limit, and then dropped if the queue is already at this limit. Currently, a reasonable limit is around 5000 updates. Around 500 firehose updates are received per second normally, but this can reach up to 3000 updates per second during replay after a reconnect. +/// - config: Configuration values, see `Config` +/// - address: The address to bind the server to +/// +/// # Panics +/// +/// Panics if unable to bind to the provided address. +pub async fn start( + config: Config, + queue_limit: usize, + feed_handler: Arc>, + address: impl Into + Send + 'static, +) { + env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); + let address: SocketAddr = address.into(); + let did_config = config.clone(); + let did_json = warp::path(".well-known") + .and(warp::path("did.json")) + .and(warp::get()) + .and_then(move || did_json(did_config.clone())); - let did_config = config.clone(); - let did_json = warp::path(".well-known") - .and(warp::path("did.json")) - .and(warp::get()) - .and_then(move || did_json(did_config.clone())); + let describe_feed_config = config.clone(); + let describe_feed_generator = warp::path("xrpc") + .and(warp::path("app.bsky.feed.describeFeedGenerator")) + .and(warp::get()) + .and_then({ + let feed_handler = feed_handler.clone(); + move || describe_feed_generator(describe_feed_config.clone(), feed_handler.clone()) + }); - let describe_feed_config = config.clone(); - let describe_feed_generator = warp::path("xrpc") - .and(warp::path("app.bsky.feed.describeFeedGenerator")) - .and(warp::get()) - .and_then(move || { - describe_feed_generator(describe_feed_config.clone(), feed_name.clone()) - }); + let get_feed_skeleton = warp::path("xrpc") + .and(warp::path("app.bsky.feed.getFeedSkeleton")) + .and(warp::get()) + .and(warp::query::()) + .and_then({ + let feed_handler = feed_handler.clone(); + move |query: FeedSkeletonParameters| { + get_feed_skeleton(query.into(), feed_handler.clone()) + } + }); - let get_feed_handler = handler.clone(); - let get_feed_skeleton = warp::path("xrpc") - .and(warp::path("app.bsky.feed.getFeedSkeleton")) - .and(warp::get()) - .and(warp::query::()) - .and_then(move |query: FeedSkeletonParameters| { - get_feed_skeleton::(query.into(), get_feed_handler.clone()) - }); + let api = did_json.or(describe_feed_generator).or(get_feed_skeleton); - let api = did_json.or(describe_feed_generator).or(get_feed_skeleton); + info!("Serving feed on {:?}", address); - info!("Serving feed on {}", format!("{:?}", address)); + let routes = api.with(warp::log::custom(|info| { + let method = info.method(); + let path = info.path(); + let status = info.status(); + let elapsed = info.elapsed().as_millis(); - let routes = api.with(warp::log::custom(|info| { - let method = info.method(); - let path = info.path(); - let status = info.status(); - let elapsed = info.elapsed().as_millis(); + if status.is_success() { + info!( + "Method: {}, Path: {}, Status: {}, Elapsed Time: {}ms", + method, path, status, elapsed + ); + } else { + log::error!( + "Method: {}, Path: {}, Status: {}, Elapsed Time: {}ms", + method, + path, + status, + elapsed, + ); + } + })); + let feed_server = warp::serve(routes); - if status.is_success() { - info!( - "Method: {}, Path: {}, Status: {}, Elapsed Time: {}ms", - method, path, status, elapsed - ); - } else { - log::error!( - "Method: {}, Path: {}, Status: {}, Elapsed Time: {}ms", - method, - path, - status, - elapsed, - ); - } - })); - let feed_server = warp::serve(routes); - let firehose_listener = tokio::spawn(async move { - let jetstream = JetstreamConnector::new(JetstreamConfig { - endpoint: DefaultJetstreamEndpoints::USEastOne.into(), - wanted_collections: vec![ - Nsid::new("app.bsky.feed.post".to_string()).unwrap(), - Nsid::new("app.bsky.feed.like".to_string()).unwrap(), - ], - compression: JetstreamCompression::Zstd, - ..Default::default() - }) - .unwrap(); - let receiver = jetstream.connect().await.unwrap(); - while let Ok(event) = receiver.recv_async().await { - if let Commit(commit) = event { - #[allow(clippy::collapsible_match)] - match commit { - CommitEvent::Create { - info, - commit: - CommitData { - info: - CommitInfo { - operation: CommitType::Create, - collection, - rkey, - .. - }, - cid, - record: KnownRecord::AppBskyFeedPost(record), - }, - } => { - #[allow(clippy::to_string_in_format_args)] - let uri = format!( - "at://{}/{}/{}", - info.did.to_string(), - collection.to_string(), - rkey - ); + let (tx, rx): (flume::Sender, _) = flume::unbounded(); - let Some(time) = - DateTime::from_timestamp_micros(info.time_us as i64) - else { - let time_us = info.time_us; - error!("Invalid post timestamp: {time_us}"); - continue; - }; - let post = Post { - author_did: Did(info.did.to_string()), - cid: Cid(serde_json::to_string(&cid).unwrap()), - uri: Uri(uri), - text: record.text.clone(), - labels: record - .labels - .as_ref() - .and_then(Label::from_atrium) - .unwrap_or_default(), - timestamp: time, - embed: record.embed.as_ref().and_then(Embed::from_atrium), - langs: record - .langs - .iter() - .filter_map(|lang| serde_json::to_string(&lang).ok()) - .collect(), - }; - handler.insert_post(post).await; - } - CommitEvent::Create { - info, - commit: - CommitData { - info: - CommitInfo { - operation: CommitType::Create, - collection, - rkey, - .. - }, - record: KnownRecord::AppBskyFeedLike(record), - .. - }, - } => { - #[allow(clippy::to_string_in_format_args)] - let uri = format!( - "at://{}/{}/{}", - info.did.to_string(), - collection.to_string(), - rkey - ); - handler - .like_post(Uri(uri), Uri(record.subject.uri.clone())) - .await; - } - CommitEvent::Delete { - info, - commit: - CommitInfo { - rkey, collection, .. - }, - } => { - #[allow(clippy::to_string_in_format_args)] - let uri = format!( - "at://{}/{}/{}", - info.did.to_string(), - collection.to_string(), - rkey - ); - if collection.to_string() == "app.bsky.feed.post" { - handler.delete_post(Uri(uri)).await; - } else if collection.to_string() == "app.bsky.feed.like" { - handler.delete_like(Uri(uri)).await; - } - } - _ => (), - } - } + let feed_handler = feed_handler.clone(); + let event_handler = tokio::spawn(async move { + while let Ok(event) = rx.recv_async().await { + let waiting_updates = rx.len(); + if waiting_updates > queue_limit { + warn!( + "{waiting_updates} updates are awaiting processing which is above the specified queue_limit. An update will be dropped to stay under the queue limit. Your feed handler may not be processing updates quickly enough." + ); + continue; + } + let mut feed_handler = feed_handler.lock().await; + match event { + FirehoseEvent::Post(post) => { + feed_handler.insert_post(*post).await; } - }); + FirehoseEvent::DeletePost(uri) => { + feed_handler.delete_post(uri).await; + } + FirehoseEvent::Like(like_uri, post_uri) => { + feed_handler.insert_like(like_uri, post_uri).await; + } + FirehoseEvent::DeleteLike(uri) => { + feed_handler.delete_like(uri).await; + } + } + } + }); - tokio::join!(feed_server.run(address), firehose_listener) - .1 - .expect("Couldn't await tasks"); + let firehose_listener = tokio::spawn(async move { + if let Err(e) = FirehoseConnector::run(FIREHOSE_ENDPOINT, tx).await { + log::error!("Firehose error: {}", e); } - } + }); + + let _ = tokio::join!(feed_server.run(address), firehose_listener, event_handler); } async fn did_json(config: Config) -> Result { @@ -257,7 +162,7 @@ async fn did_json(config: Config) -> Result { async fn describe_feed_generator( config: Config, - feed_name: String, + feed_handler: Arc>, ) -> Result { Ok(warp::reply::json(&FeedGeneratorDescription { did: atrium_api::types::string::Did::new(format!( @@ -265,25 +170,36 @@ async fn describe_feed_generator( config.feed_generator_hostname )) .unwrap(), - feeds: vec![Object::from(FeedData { - uri: format!( - "at://{}/app.bsky.feed.generator/{}", - config.publisher_did, feed_name - ), - })], + feeds: feed_handler + .lock() + .await + .available_feeds() + .await + .iter() + .map(|name| { + Object::from(FeedData { + uri: format!( + "at://{}/app.bsky.feed.generator/{}", + config.publisher_did, name + ), + }) + }) + .collect(), links: None, })) } -async fn get_feed_skeleton( +async fn get_feed_skeleton( query: FeedSkeletonQuery, - handler: Handler, + feed_handler: Arc>, ) -> Result { - let skeleton = handler - .serve_feed(Request { + let skeleton = feed_handler + .lock() + .await + .serve_feed(FeedRequest { cursor: query.cursor.clone(), - feed: query.feed.clone(), - limit: query.limit.map(u8::from), + limit: query.limit.map(|l| l.into()), + feed: query.feed.split("/").last().unwrap_or("").to_string(), }) .await; Ok::(warp::reply::json(&FeedSkeleton { @@ -299,5 +215,6 @@ async fn get_feed_skeleton( }) }) .collect(), + req_id: None, })) } diff --git a/src/feed_handler.rs b/src/feed_handler.rs deleted file mode 100644 index 98cb0c0..0000000 --- a/src/feed_handler.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::models::{FeedResult, Post, Request, Uri}; - -/// A feed handler is responsible for -/// - Storing and managing firehose input. -/// - Serving responses to feed requests with `serve_feed` -pub trait FeedHandler { - fn insert_post(&mut self, post: Post) -> impl std::future::Future + Send; - fn delete_post(&mut self, uri: Uri) -> impl std::future::Future + Send; - fn like_post( - &mut self, - like_uri: Uri, - liked_post_uri: Uri, - ) -> impl std::future::Future + Send; - fn delete_like(&mut self, like_uri: Uri) -> impl std::future::Future + Send; - fn serve_feed(&self, request: Request) -> impl std::future::Future + Send; -} diff --git a/src/firehose.rs b/src/firehose.rs new file mode 100644 index 0000000..0285306 --- /dev/null +++ b/src/firehose.rs @@ -0,0 +1,492 @@ +use crate::Cid; +use crate::firehose::frames::Frame; +use crate::models::{Did, Embed, Label, Post, Uri}; +use crate::update_counter::UpdatesCounter; +use atrium_api::app::bsky::feed::{self, Like}; +use atrium_api::com::atproto::sync::subscribe_repos::{Commit, NSID}; +use atrium_api::types::CidLink; +use atrium_api::types::Collection; +use chrono::DateTime; +use flume::RecvError; +use futures::StreamExt; +use std::convert::Infallible; +use std::sync::Arc; +use std::sync::atomic::{AtomicI64, Ordering}; +use std::time::{Duration, Instant}; +use tokio::net::TcpStream; +use tokio_tungstenite::tungstenite::Message; +use tokio_tungstenite::{MaybeTlsStream, WebSocketStream, connect_async}; + +mod frames { + use ipld_core::ipld::Ipld; + use std::io::Cursor; + + #[derive(Debug, Clone, PartialEq, Eq)] + pub enum FrameError { + InvalidFrameType, + DecodeError, + } + + impl std::fmt::Display for FrameError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + FrameError::InvalidFrameType => write!(f, "invalid frame type"), + FrameError::DecodeError => write!(f, "decode error"), + } + } + } + + impl std::error::Error for FrameError {} + + #[derive(Debug, Clone, PartialEq, Eq)] + enum FrameHeader { + Message(Option), + Error, + } + + impl TryFrom for FrameHeader { + type Error = FrameError; + + fn try_from(value: Ipld) -> Result>::Error> { + if let Ipld::Map(map) = value + && let Some(Ipld::Integer(i)) = map.get("op") + { + match i { + 1 => { + let t = if let Some(Ipld::String(s)) = map.get("t") { + Some(s.clone()) + } else { + None + }; + return Ok(FrameHeader::Message(t)); + } + -1 => return Ok(FrameHeader::Error), + _ => {} + } + } + Err(FrameError::InvalidFrameType) + } + } + + #[derive(Debug, Clone, PartialEq, Eq)] + pub enum Frame { + Message(Option, MessageFrame), + Error(ErrorFrame), + } + + #[derive(Debug, Clone, PartialEq, Eq)] + pub struct MessageFrame { + pub body: Vec, + } + + #[derive(Debug, Clone, PartialEq, Eq)] + pub struct ErrorFrame {} + + impl TryFrom<&[u8]> for Frame { + type Error = FrameError; + + fn try_from(value: &[u8]) -> Result>::Error> { + let mut cursor = Cursor::new(value); + let (left, right) = match serde_ipld_dagcbor::from_reader::(&mut cursor) { + Err(serde_ipld_dagcbor::DecodeError::TrailingData) => { + value.split_at(cursor.position() as usize) + } + _ => { + return Err(FrameError::InvalidFrameType); + } + }; + let header = FrameHeader::try_from( + serde_ipld_dagcbor::from_slice::(left) + .map_err(|_| FrameError::DecodeError)?, + )?; + if let FrameHeader::Message(t) = &header { + Ok(Frame::Message( + t.clone(), + MessageFrame { + body: right.to_vec(), + }, + )) + } else { + Ok(Frame::Error(ErrorFrame {})) + } + } + } + + #[cfg(test)] + mod tests { + use super::*; + + fn serialized_data(s: &str) -> Vec { + assert!(s.len().is_multiple_of(2)); + let b2u = |b: u8| match b { + b'0'..=b'9' => b - b'0', + b'a'..=b'f' => b - b'a' + 10, + _ => unreachable!(), + }; + s.as_bytes() + .chunks(2) + .map(|b| (b2u(b[0]) << 4) + b2u(b[1])) + .collect() + } + + #[test] + fn deserialize_message_frame_header() { + let data = serialized_data("a2626f700161746723636f6d6d6974"); + let ipld = + serde_ipld_dagcbor::from_slice::(&data).expect("failed to deserialize"); + let result = FrameHeader::try_from(ipld); + assert_eq!( + result.expect("failed to deserialize"), + FrameHeader::Message(Some(String::from("#commit"))) + ); + } + + #[test] + fn deserialize_error_frame_header() { + let data = serialized_data("a1626f7020"); + let ipld = + serde_ipld_dagcbor::from_slice::(&data).expect("failed to deserialize"); + let result = FrameHeader::try_from(ipld); + assert_eq!(result.expect("failed to deserialize"), FrameHeader::Error); + } + + #[test] + fn deserialize_invalid_frame_header() { + { + let data = serialized_data("a2626f700261746723636f6d6d6974"); + let ipld = + serde_ipld_dagcbor::from_slice::(&data).expect("failed to deserialize"); + let result = FrameHeader::try_from(ipld); + assert_eq!( + result.expect_err("must be failed"), + FrameError::InvalidFrameType + ); + } + { + let data = serialized_data("a1626f7021"); + let ipld = + serde_ipld_dagcbor::from_slice::(&data).expect("failed to deserialize"); + let result = FrameHeader::try_from(ipld); + assert_eq!( + result.expect_err("must be failed"), + FrameError::InvalidFrameType + ); + } + } + } +} + +#[derive(Debug)] +pub enum FirehoseError { + FrameError(frames::FrameError), + ErrorFrame, + WebSocket(tokio_tungstenite::tungstenite::Error), + CarStore(String), + SendError(String), + RecvError(RecvError), + JoinError(String), + StreamClosed, +} + +impl std::fmt::Display for FirehoseError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + FirehoseError::FrameError(e) => write!(f, "frame error: {}", e), + FirehoseError::ErrorFrame => write!(f, "error frame"), + FirehoseError::WebSocket(e) => write!(f, "websocket error: {}", e), + FirehoseError::CarStore(msg) => write!(f, "car store error: {}", msg), + FirehoseError::SendError(msg) => write!(f, "send error: {}", msg), + FirehoseError::RecvError(e) => write!(f, "receive error: {}", e), + FirehoseError::JoinError(msg) => write!(f, "join error: {}", msg), + FirehoseError::StreamClosed => write!(f, "stream closed"), + } + } +} + +impl std::error::Error for FirehoseError {} + +pub enum FirehoseEvent { + Post(Box), + DeletePost(Uri), + Like(Uri, Uri), + DeleteLike(Uri), +} + +pub struct FirehoseConnector; + +impl FirehoseConnector { + pub async fn run( + endpoint: &str, + tx: flume::Sender, + ) -> Result<(), FirehoseError> { + let cursor = Arc::new(AtomicI64::new(0)); + const MAX_ATTEMPTS: u32 = 10; + const MAX_BACKOFF_SECS: u64 = 30; + const RESET_THRESHOLD_SECS: u64 = MAX_BACKOFF_SECS * 10; + + let mut reconnect_attempts = 0u32; + let mut last_reconnect = Instant::now(); + + loop { + let cursor_value = cursor.load(Ordering::Relaxed); + let url = if cursor_value > 0 { + format!("wss://{endpoint}/xrpc/{NSID}?cursor={}", cursor_value) + } else { + format!("wss://{endpoint}/xrpc/{NSID}") + }; + + let _ = rustls::crypto::aws_lc_rs::default_provider().install_default(); + + match Self::connect_and_run(&url, tx.clone(), cursor.clone()).await { + Ok(()) => {} + Err(e) => { + // If the last reconnect happened longer than 10x our max backoff, we can consider it irrelevant to our current reconnect process + if last_reconnect.elapsed() > Duration::from_secs(RESET_THRESHOLD_SECS) { + reconnect_attempts = 0; + } + + reconnect_attempts += 1; + last_reconnect = Instant::now(); + log::warn!("Firehose connection failed: {}, retrying...", e); + + if reconnect_attempts >= MAX_ATTEMPTS { + log::error!( + "Max reconnection attempts ({}) reached, giving up", + MAX_ATTEMPTS + ); + return Err(e); + } + + // Exponential backoff with cap + let backoff_secs = + std::cmp::min(2_u64.pow(reconnect_attempts - 1), MAX_BACKOFF_SECS); + log::info!( + "Reconnecting to firehose (attempt {}), waiting {}s", + reconnect_attempts, + backoff_secs + ); + tokio::time::sleep(Duration::from_secs(backoff_secs)).await; + } + } + } + } + + async fn connect_and_run( + url: &str, + tx: flume::Sender, + cursor: Arc, + ) -> Result<(), FirehoseError> { + let (stream, _) = connect_async(url).await.map_err(FirehoseError::WebSocket)?; + let subscription = RepoSubscription { stream }; + + let (frame_tx, frame_rx) = flume::unbounded(); + + let receive_task = tokio::spawn(Self::receive_frames(subscription, frame_tx)); + let parse_task = tokio::spawn(Self::parse_frames(frame_rx, tx, cursor)); + + tokio::select! { + receive_result = receive_task => { + match receive_result + .map_err(|e| FirehoseError::JoinError(e.to_string()))?? { + // Infallible! Cool! + } + } + parse_result = parse_task => { + match parse_result + .map_err(|e| FirehoseError::JoinError(e.to_string()))?? { + // Also infallible! Also cool! + } + } + } + } + + async fn receive_frames( + mut subscription: RepoSubscription, + frame_tx: flume::Sender>, + ) -> Result { + loop { + if let Some(frame) = subscription.next().await? { + frame_tx + .send_async(Ok(frame)) + .await + .map_err(|e| FirehoseError::SendError(e.to_string()))?; + } + } + } + + async fn parse_frames( + frame_rx: flume::Receiver>, + tx: flume::Sender, + cursor: Arc, + ) -> Result { + let counter = UpdatesCounter::new(); + loop { + match frame_rx + .recv_async() + .await + .map_err(FirehoseError::RecvError)? + { + Ok(Frame::Message(Some(t), message)) => { + if t.as_str() == "#commit" { + match serde_ipld_dagcbor::from_reader::(std::io::Cursor::new( + message.body.as_slice(), + )) { + Ok(commit) => { + cursor.store(commit.seq, Ordering::Relaxed); + if let Err(e) = Self::handle_commit(&commit, &tx).await { + log::error!("Failed to handle commit: {}", e); + } + counter.increment_and_maybe_log().await; + } + Err(e) => { + log::error!("Failed to deserialize commit: {}", e); + } + } + } + } + Ok(Frame::Message(None, _msg)) => (), + Ok(Frame::Error(_)) => return Err(FirehoseError::ErrorFrame), + Err(e) => { + return Err(e); + } + } + } + } + + async fn handle_commit( + commit: &Commit, + tx: &flume::Sender, + ) -> Result<(), FirehoseError> { + let mut blocks = commit.blocks.as_slice(); + let (items, _) = rs_car::car_read_all(&mut blocks, true) + .await + .map_err(|e| FirehoseError::CarStore(e.to_string()))?; + + for op in &commit.ops { + let mut s = op.path.split('/'); + let collection = s.next().expect("op.path is empty"); + let rkey = s.next().expect("no record key"); + let action = op.action.as_str(); + + match (collection, action) { + (feed::Post::NSID, "create") => { + if let Some((_, item_data)) = items.iter().find(|(cid, _)| { + let converted_cid = match cid.to_string().parse() { + Ok(parsed) => CidLink(parsed), + Err(_) => return false, + }; + Some(converted_cid) == op.cid + }) { + match serde_ipld_dagcbor::from_reader(&mut item_data.clone().as_slice()) { + Ok(record) => { + let record: feed::post::Record = record; + let uri = format!( + "at://{}/{}/{}", + commit.repo.as_str(), + collection, + rkey + ); + + let timestamp = + DateTime::parse_from_rfc3339(record.created_at.as_str()) + .ok() + .map(|dt| dt.with_timezone(&chrono::Utc)) + .unwrap_or_else(chrono::Utc::now); + + let cid_str = match serde_json::to_string(&op.cid) { + Ok(s) => s, + Err(e) => { + log::error!("Failed to serialize CID for {}: {}", rkey, e); + continue; + } + }; + let post = Post { + author_did: Did(commit.repo.as_str().to_string()), + cid: Cid(cid_str), + uri: Uri(uri), + text: record.text.clone(), + labels: record + .labels + .as_ref() + .and_then(Label::from_atrium) + .unwrap_or_default(), + timestamp, + embed: record.embed.as_ref().and_then(Embed::from_atrium), + langs: record + .langs + .iter() + .filter_map(|lang| serde_json::to_string(&lang).ok()) + .collect(), + }; + let _ = tx.send_async(FirehoseEvent::Post(Box::new(post))).await; + } + Err(_) => { + log::error!("Failed to deserialize post record for {}", rkey); + } + } + } + } + (feed::Post::NSID, "delete") => { + let uri = format!("at://{}/{}/{}", commit.repo.as_str(), collection, rkey); + let _ = tx.send_async(FirehoseEvent::DeletePost(Uri(uri))).await; + } + (Like::NSID, "create") => { + if let Some((_, item_data)) = items.iter().find(|(cid, _)| { + let converted_cid = match cid.to_string().parse() { + Ok(parsed) => CidLink(parsed), + Err(_) => return false, + }; + Some(converted_cid) == op.cid + }) { + match serde_ipld_dagcbor::from_reader(&mut item_data.clone().as_slice()) { + Ok(record) => { + let record: feed::like::Record = record; + let uri = format!( + "at://{}/{}/{}", + commit.repo.as_str(), + collection, + rkey + ); + let _ = tx + .send_async(FirehoseEvent::Like( + Uri(uri), + Uri(record.subject.uri.clone()), + )) + .await; + } + Err(_) => { + log::error!("Failed to deserialize like record for {}", rkey); + } + } + } + } + (Like::NSID, "delete") => { + let uri = format!("at://{}/{}/{}", commit.repo.as_str(), collection, rkey); + let _ = tx.send_async(FirehoseEvent::DeleteLike(Uri(uri))).await; + } + _ => {} + } + } + Ok(()) + } +} + +struct RepoSubscription { + stream: WebSocketStream>, +} + +impl RepoSubscription { + async fn next(&mut self) -> Result, FirehoseError> { + match self.stream.next().await { + Some(Ok(Message::Binary(data))) => { + let slice: &[u8] = &data; + Ok(Some( + Frame::try_from(slice).map_err(FirehoseError::FrameError)?, + )) + } + Some(Ok(_)) => Ok(None), + None => Err(FirehoseError::StreamClosed), + Some(Err(e)) => Err(FirehoseError::WebSocket(e)), + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 9e4af7a..fffcf82 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,13 +1,16 @@ +#![allow(clippy::type_complexity)] + mod config; mod feed; -mod feed_handler; +mod firehose; mod models; mod public_api_test; +mod update_counter; mod utility_models; -pub use feed::Feed; -pub use feed_handler::FeedHandler; +pub use config::Config; +pub use feed::{FeedHandler, start}; pub use models::{ - Cid, Did, Embed, ExternalEmbed, FeedResult, ImageEmbed, Label, MediaEmbed, Post, QuoteEmbed, - Request, Uri, VideoEmbed, + Cid, Did, Embed, ExternalEmbed, FeedRequest, FeedResult, ImageEmbed, Label, MediaEmbed, Post, + QuoteEmbed, Uri, VideoEmbed, }; diff --git a/src/models.rs b/src/models.rs index 81ee1be..d7fbf09 100644 --- a/src/models.rs +++ b/src/models.rs @@ -9,7 +9,7 @@ use chrono::{DateTime, Utc}; use log::trace; #[derive(Debug, Clone)] -pub struct Request { +pub struct FeedRequest { pub cursor: Option, pub feed: String, pub limit: Option, diff --git a/src/public_api_test.rs b/src/public_api_test.rs index 38678d5..2dad7ff 100644 --- a/src/public_api_test.rs +++ b/src/public_api_test.rs @@ -1,20 +1,21 @@ #[cfg(feature = "test-api")] #[test] fn public_api() { - // Install a compatible nightly toolchain if it is missing + // Install a compatible nightly toolchain if it is missing. rustup_toolchain::install(public_api::MINIMUM_NIGHTLY_RUST_VERSION).unwrap(); - // Build rustdoc JSON + // Build rustdoc JSON. let rustdoc_json = rustdoc_json::Builder::default() .toolchain(public_api::MINIMUM_NIGHTLY_RUST_VERSION) .build() .unwrap(); - // Derive the public API from the rustdoc JSON + // Derive the public API from rustdoc JSON. let public_api = public_api::Builder::from_rustdoc_json(rustdoc_json) .build() .unwrap(); - // Assert that the public API looks correct - insta::assert_snapshot!(public_api); + // Assert that the public API matches the latest snapshot. + // Run with env var `UPDATE_SNAPSHOTS=yes` to update the snapshot. + public_api.assert_eq_or_update("./src/snapshots/skyfeed__public_api_test__public_api.snap"); } diff --git a/src/snapshots/skyfeed__public_api_test__public_api.snap b/src/snapshots/skyfeed__public_api_test__public_api.snap index 47c7607..2ebdffe 100644 --- a/src/snapshots/skyfeed__public_api_test__public_api.snap +++ b/src/snapshots/skyfeed__public_api_test__public_api.snap @@ -1,7 +1,3 @@ ---- -source: src/public_api_test.rs -expression: public_api ---- pub mod skyfeed pub enum skyfeed::Embed pub skyfeed::Embed::External(skyfeed::ExternalEmbed) @@ -42,7 +38,7 @@ pub fn skyfeed::Embed::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::Embed where T: ?core::marker::Sized pub fn skyfeed::Embed::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::Embed where T: core::clone::Clone -pub unsafe fn skyfeed::Embed::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::Embed::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::Embed pub fn skyfeed::Embed::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::Embed @@ -52,12 +48,12 @@ pub unsafe fn skyfeed::Embed::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::Embed::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::Embed::drop(ptr: usize) pub unsafe fn skyfeed::Embed::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::Embed +impl libipld_core::codec::References for skyfeed::Embed +pub fn skyfeed::Embed::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::Embed impl tracing::instrument::WithSubscriber for skyfeed::Embed impl typenum::type_operators::Same for skyfeed::Embed pub type skyfeed::Embed::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::Embed where T: 'static impl ppv_lite86::types::VZip for skyfeed::Embed where V: ppv_lite86::types::MultiLane pub fn skyfeed::Embed::vzip(self) -> V pub enum skyfeed::Label @@ -114,7 +110,7 @@ pub fn skyfeed::Label::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::Label where T: ?core::marker::Sized pub fn skyfeed::Label::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::Label where T: core::clone::Clone -pub unsafe fn skyfeed::Label::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::Label::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::Label pub fn skyfeed::Label::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::Label @@ -124,12 +120,12 @@ pub unsafe fn skyfeed::Label::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::Label::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::Label::drop(ptr: usize) pub unsafe fn skyfeed::Label::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::Label +impl libipld_core::codec::References for skyfeed::Label +pub fn skyfeed::Label::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::Label impl tracing::instrument::WithSubscriber for skyfeed::Label impl typenum::type_operators::Same for skyfeed::Label pub type skyfeed::Label::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::Label where T: 'static impl ppv_lite86::types::VZip for skyfeed::Label where V: ppv_lite86::types::MultiLane pub fn skyfeed::Label::vzip(self) -> V pub enum skyfeed::MediaEmbed @@ -169,7 +165,7 @@ pub fn skyfeed::MediaEmbed::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::MediaEmbed where T: ?core::marker::Sized pub fn skyfeed::MediaEmbed::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::MediaEmbed where T: core::clone::Clone -pub unsafe fn skyfeed::MediaEmbed::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::MediaEmbed::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::MediaEmbed pub fn skyfeed::MediaEmbed::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::MediaEmbed @@ -179,12 +175,12 @@ pub unsafe fn skyfeed::MediaEmbed::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::MediaEmbed::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::MediaEmbed::drop(ptr: usize) pub unsafe fn skyfeed::MediaEmbed::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::MediaEmbed +impl libipld_core::codec::References for skyfeed::MediaEmbed +pub fn skyfeed::MediaEmbed::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::MediaEmbed impl tracing::instrument::WithSubscriber for skyfeed::MediaEmbed impl typenum::type_operators::Same for skyfeed::MediaEmbed pub type skyfeed::MediaEmbed::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::MediaEmbed where T: 'static impl ppv_lite86::types::VZip for skyfeed::MediaEmbed where V: ppv_lite86::types::MultiLane pub fn skyfeed::MediaEmbed::vzip(self) -> V pub struct skyfeed::Cid(pub alloc::string::String) @@ -221,7 +217,7 @@ pub fn skyfeed::Cid::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::Cid where T: ?core::marker::Sized pub fn skyfeed::Cid::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::Cid where T: core::clone::Clone -pub unsafe fn skyfeed::Cid::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::Cid::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::Cid pub fn skyfeed::Cid::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::Cid @@ -231,14 +227,70 @@ pub unsafe fn skyfeed::Cid::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::Cid::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::Cid::drop(ptr: usize) pub unsafe fn skyfeed::Cid::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::Cid +impl libipld_core::codec::References for skyfeed::Cid +pub fn skyfeed::Cid::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::Cid impl tracing::instrument::WithSubscriber for skyfeed::Cid impl typenum::type_operators::Same for skyfeed::Cid pub type skyfeed::Cid::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::Cid where T: 'static impl ppv_lite86::types::VZip for skyfeed::Cid where V: ppv_lite86::types::MultiLane pub fn skyfeed::Cid::vzip(self) -> V +pub struct skyfeed::Config +pub skyfeed::Config::feed_generator_hostname: alloc::string::String +pub skyfeed::Config::publisher_did: alloc::string::String +impl skyfeed::Config +pub fn skyfeed::Config::load_env_config() -> Self +impl core::clone::Clone for skyfeed::Config +pub fn skyfeed::Config::clone(&self) -> skyfeed::Config +impl core::fmt::Debug for skyfeed::Config +pub fn skyfeed::Config::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::marker::Freeze for skyfeed::Config +impl core::marker::Send for skyfeed::Config +impl core::marker::Sync for skyfeed::Config +impl core::marker::Unpin for skyfeed::Config +impl core::panic::unwind_safe::RefUnwindSafe for skyfeed::Config +impl core::panic::unwind_safe::UnwindSafe for skyfeed::Config +impl atrium_common::types::throttled::Throttleable

for skyfeed::Config where P: core::default::Default +pub fn skyfeed::Config::throttled(self) -> atrium_common::types::throttled::Throttled +impl atrium_common::types::cached::Cacheable for skyfeed::Config +pub fn skyfeed::Config::cached(self, cache: C) -> atrium_common::types::cached::Cached +impl core::convert::Into for skyfeed::Config where U: core::convert::From +pub fn skyfeed::Config::into(self) -> U +impl core::convert::TryFrom for skyfeed::Config where U: core::convert::Into +pub type skyfeed::Config::Error = core::convert::Infallible +pub fn skyfeed::Config::try_from(value: U) -> core::result::Result>::Error> +impl core::convert::TryInto for skyfeed::Config where U: core::convert::TryFrom +pub type skyfeed::Config::Error = >::Error +pub fn skyfeed::Config::try_into(self) -> core::result::Result>::Error> +impl alloc::borrow::ToOwned for skyfeed::Config where T: core::clone::Clone +pub type skyfeed::Config::Owned = T +pub fn skyfeed::Config::clone_into(&self, target: &mut T) +pub fn skyfeed::Config::to_owned(&self) -> T +impl core::any::Any for skyfeed::Config where T: 'static + ?core::marker::Sized +pub fn skyfeed::Config::type_id(&self) -> core::any::TypeId +impl core::borrow::Borrow for skyfeed::Config where T: ?core::marker::Sized +pub fn skyfeed::Config::borrow(&self) -> &T +impl core::borrow::BorrowMut for skyfeed::Config where T: ?core::marker::Sized +pub fn skyfeed::Config::borrow_mut(&mut self) -> &mut T +impl core::clone::CloneToUninit for skyfeed::Config where T: core::clone::Clone +pub unsafe fn skyfeed::Config::clone_to_uninit(&self, dest: *mut u8) +impl core::convert::From for skyfeed::Config +pub fn skyfeed::Config::from(t: T) -> T +impl crossbeam_epoch::atomic::Pointable for skyfeed::Config +pub type skyfeed::Config::Init = T +pub const skyfeed::Config::ALIGN: usize +pub unsafe fn skyfeed::Config::deref<'a>(ptr: usize) -> &'a T +pub unsafe fn skyfeed::Config::deref_mut<'a>(ptr: usize) -> &'a mut T +pub unsafe fn skyfeed::Config::drop(ptr: usize) +pub unsafe fn skyfeed::Config::init(init: ::Init) -> usize +impl libipld_core::codec::References for skyfeed::Config +pub fn skyfeed::Config::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> +impl tracing::instrument::Instrument for skyfeed::Config +impl tracing::instrument::WithSubscriber for skyfeed::Config +impl typenum::type_operators::Same for skyfeed::Config +pub type skyfeed::Config::Output = T +impl ppv_lite86::types::VZip for skyfeed::Config where V: ppv_lite86::types::MultiLane +pub fn skyfeed::Config::vzip(self) -> V pub struct skyfeed::Did(pub alloc::string::String) impl core::clone::Clone for skyfeed::Did pub fn skyfeed::Did::clone(&self) -> skyfeed::Did @@ -273,7 +325,7 @@ pub fn skyfeed::Did::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::Did where T: ?core::marker::Sized pub fn skyfeed::Did::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::Did where T: core::clone::Clone -pub unsafe fn skyfeed::Did::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::Did::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::Did pub fn skyfeed::Did::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::Did @@ -283,12 +335,12 @@ pub unsafe fn skyfeed::Did::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::Did::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::Did::drop(ptr: usize) pub unsafe fn skyfeed::Did::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::Did +impl libipld_core::codec::References for skyfeed::Did +pub fn skyfeed::Did::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::Did impl tracing::instrument::WithSubscriber for skyfeed::Did impl typenum::type_operators::Same for skyfeed::Did pub type skyfeed::Did::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::Did where T: 'static impl ppv_lite86::types::VZip for skyfeed::Did where V: ppv_lite86::types::MultiLane pub fn skyfeed::Did::vzip(self) -> V pub struct skyfeed::ExternalEmbed @@ -329,7 +381,7 @@ pub fn skyfeed::ExternalEmbed::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::ExternalEmbed where T: ?core::marker::Sized pub fn skyfeed::ExternalEmbed::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::ExternalEmbed where T: core::clone::Clone -pub unsafe fn skyfeed::ExternalEmbed::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::ExternalEmbed::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::ExternalEmbed pub fn skyfeed::ExternalEmbed::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::ExternalEmbed @@ -339,14 +391,69 @@ pub unsafe fn skyfeed::ExternalEmbed::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::ExternalEmbed::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::ExternalEmbed::drop(ptr: usize) pub unsafe fn skyfeed::ExternalEmbed::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::ExternalEmbed +impl libipld_core::codec::References for skyfeed::ExternalEmbed +pub fn skyfeed::ExternalEmbed::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::ExternalEmbed impl tracing::instrument::WithSubscriber for skyfeed::ExternalEmbed impl typenum::type_operators::Same for skyfeed::ExternalEmbed pub type skyfeed::ExternalEmbed::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::ExternalEmbed where T: 'static impl ppv_lite86::types::VZip for skyfeed::ExternalEmbed where V: ppv_lite86::types::MultiLane pub fn skyfeed::ExternalEmbed::vzip(self) -> V +pub struct skyfeed::FeedRequest +pub skyfeed::FeedRequest::cursor: core::option::Option +pub skyfeed::FeedRequest::feed: alloc::string::String +pub skyfeed::FeedRequest::limit: core::option::Option +impl core::clone::Clone for skyfeed::FeedRequest +pub fn skyfeed::FeedRequest::clone(&self) -> skyfeed::FeedRequest +impl core::fmt::Debug for skyfeed::FeedRequest +pub fn skyfeed::FeedRequest::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::marker::Freeze for skyfeed::FeedRequest +impl core::marker::Send for skyfeed::FeedRequest +impl core::marker::Sync for skyfeed::FeedRequest +impl core::marker::Unpin for skyfeed::FeedRequest +impl core::panic::unwind_safe::RefUnwindSafe for skyfeed::FeedRequest +impl core::panic::unwind_safe::UnwindSafe for skyfeed::FeedRequest +impl atrium_common::types::throttled::Throttleable

for skyfeed::FeedRequest where P: core::default::Default +pub fn skyfeed::FeedRequest::throttled(self) -> atrium_common::types::throttled::Throttled +impl atrium_common::types::cached::Cacheable for skyfeed::FeedRequest +pub fn skyfeed::FeedRequest::cached(self, cache: C) -> atrium_common::types::cached::Cached +impl core::convert::Into for skyfeed::FeedRequest where U: core::convert::From +pub fn skyfeed::FeedRequest::into(self) -> U +impl core::convert::TryFrom for skyfeed::FeedRequest where U: core::convert::Into +pub type skyfeed::FeedRequest::Error = core::convert::Infallible +pub fn skyfeed::FeedRequest::try_from(value: U) -> core::result::Result>::Error> +impl core::convert::TryInto for skyfeed::FeedRequest where U: core::convert::TryFrom +pub type skyfeed::FeedRequest::Error = >::Error +pub fn skyfeed::FeedRequest::try_into(self) -> core::result::Result>::Error> +impl alloc::borrow::ToOwned for skyfeed::FeedRequest where T: core::clone::Clone +pub type skyfeed::FeedRequest::Owned = T +pub fn skyfeed::FeedRequest::clone_into(&self, target: &mut T) +pub fn skyfeed::FeedRequest::to_owned(&self) -> T +impl core::any::Any for skyfeed::FeedRequest where T: 'static + ?core::marker::Sized +pub fn skyfeed::FeedRequest::type_id(&self) -> core::any::TypeId +impl core::borrow::Borrow for skyfeed::FeedRequest where T: ?core::marker::Sized +pub fn skyfeed::FeedRequest::borrow(&self) -> &T +impl core::borrow::BorrowMut for skyfeed::FeedRequest where T: ?core::marker::Sized +pub fn skyfeed::FeedRequest::borrow_mut(&mut self) -> &mut T +impl core::clone::CloneToUninit for skyfeed::FeedRequest where T: core::clone::Clone +pub unsafe fn skyfeed::FeedRequest::clone_to_uninit(&self, dest: *mut u8) +impl core::convert::From for skyfeed::FeedRequest +pub fn skyfeed::FeedRequest::from(t: T) -> T +impl crossbeam_epoch::atomic::Pointable for skyfeed::FeedRequest +pub type skyfeed::FeedRequest::Init = T +pub const skyfeed::FeedRequest::ALIGN: usize +pub unsafe fn skyfeed::FeedRequest::deref<'a>(ptr: usize) -> &'a T +pub unsafe fn skyfeed::FeedRequest::deref_mut<'a>(ptr: usize) -> &'a mut T +pub unsafe fn skyfeed::FeedRequest::drop(ptr: usize) +pub unsafe fn skyfeed::FeedRequest::init(init: ::Init) -> usize +impl libipld_core::codec::References for skyfeed::FeedRequest +pub fn skyfeed::FeedRequest::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> +impl tracing::instrument::Instrument for skyfeed::FeedRequest +impl tracing::instrument::WithSubscriber for skyfeed::FeedRequest +impl typenum::type_operators::Same for skyfeed::FeedRequest +pub type skyfeed::FeedRequest::Output = T +impl ppv_lite86::types::VZip for skyfeed::FeedRequest where V: ppv_lite86::types::MultiLane +pub fn skyfeed::FeedRequest::vzip(self) -> V pub struct skyfeed::FeedResult pub skyfeed::FeedResult::cursor: core::option::Option pub skyfeed::FeedResult::feed: alloc::vec::Vec @@ -383,7 +490,7 @@ pub fn skyfeed::FeedResult::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::FeedResult where T: ?core::marker::Sized pub fn skyfeed::FeedResult::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::FeedResult where T: core::clone::Clone -pub unsafe fn skyfeed::FeedResult::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::FeedResult::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::FeedResult pub fn skyfeed::FeedResult::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::FeedResult @@ -393,12 +500,12 @@ pub unsafe fn skyfeed::FeedResult::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::FeedResult::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::FeedResult::drop(ptr: usize) pub unsafe fn skyfeed::FeedResult::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::FeedResult +impl libipld_core::codec::References for skyfeed::FeedResult +pub fn skyfeed::FeedResult::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::FeedResult impl tracing::instrument::WithSubscriber for skyfeed::FeedResult impl typenum::type_operators::Same for skyfeed::FeedResult pub type skyfeed::FeedResult::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::FeedResult where T: 'static impl ppv_lite86::types::VZip for skyfeed::FeedResult where V: ppv_lite86::types::MultiLane pub fn skyfeed::FeedResult::vzip(self) -> V pub struct skyfeed::ImageEmbed @@ -438,7 +545,7 @@ pub fn skyfeed::ImageEmbed::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::ImageEmbed where T: ?core::marker::Sized pub fn skyfeed::ImageEmbed::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::ImageEmbed where T: core::clone::Clone -pub unsafe fn skyfeed::ImageEmbed::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::ImageEmbed::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::ImageEmbed pub fn skyfeed::ImageEmbed::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::ImageEmbed @@ -448,12 +555,12 @@ pub unsafe fn skyfeed::ImageEmbed::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::ImageEmbed::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::ImageEmbed::drop(ptr: usize) pub unsafe fn skyfeed::ImageEmbed::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::ImageEmbed +impl libipld_core::codec::References for skyfeed::ImageEmbed +pub fn skyfeed::ImageEmbed::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::ImageEmbed impl tracing::instrument::WithSubscriber for skyfeed::ImageEmbed impl typenum::type_operators::Same for skyfeed::ImageEmbed pub type skyfeed::ImageEmbed::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::ImageEmbed where T: 'static impl ppv_lite86::types::VZip for skyfeed::ImageEmbed where V: ppv_lite86::types::MultiLane pub fn skyfeed::ImageEmbed::vzip(self) -> V pub struct skyfeed::Post @@ -498,7 +605,7 @@ pub fn skyfeed::Post::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::Post where T: ?core::marker::Sized pub fn skyfeed::Post::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::Post where T: core::clone::Clone -pub unsafe fn skyfeed::Post::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::Post::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::Post pub fn skyfeed::Post::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::Post @@ -508,12 +615,12 @@ pub unsafe fn skyfeed::Post::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::Post::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::Post::drop(ptr: usize) pub unsafe fn skyfeed::Post::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::Post +impl libipld_core::codec::References for skyfeed::Post +pub fn skyfeed::Post::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::Post impl tracing::instrument::WithSubscriber for skyfeed::Post impl typenum::type_operators::Same for skyfeed::Post pub type skyfeed::Post::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::Post where T: 'static impl ppv_lite86::types::VZip for skyfeed::Post where V: ppv_lite86::types::MultiLane pub fn skyfeed::Post::vzip(self) -> V pub struct skyfeed::QuoteEmbed @@ -552,7 +659,7 @@ pub fn skyfeed::QuoteEmbed::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::QuoteEmbed where T: ?core::marker::Sized pub fn skyfeed::QuoteEmbed::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::QuoteEmbed where T: core::clone::Clone -pub unsafe fn skyfeed::QuoteEmbed::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::QuoteEmbed::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::QuoteEmbed pub fn skyfeed::QuoteEmbed::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::QuoteEmbed @@ -562,69 +669,14 @@ pub unsafe fn skyfeed::QuoteEmbed::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::QuoteEmbed::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::QuoteEmbed::drop(ptr: usize) pub unsafe fn skyfeed::QuoteEmbed::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::QuoteEmbed +impl libipld_core::codec::References for skyfeed::QuoteEmbed +pub fn skyfeed::QuoteEmbed::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::QuoteEmbed impl tracing::instrument::WithSubscriber for skyfeed::QuoteEmbed impl typenum::type_operators::Same for skyfeed::QuoteEmbed pub type skyfeed::QuoteEmbed::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::QuoteEmbed where T: 'static impl ppv_lite86::types::VZip for skyfeed::QuoteEmbed where V: ppv_lite86::types::MultiLane pub fn skyfeed::QuoteEmbed::vzip(self) -> V -pub struct skyfeed::Request -pub skyfeed::Request::cursor: core::option::Option -pub skyfeed::Request::feed: alloc::string::String -pub skyfeed::Request::limit: core::option::Option -impl core::clone::Clone for skyfeed::Request -pub fn skyfeed::Request::clone(&self) -> skyfeed::Request -impl core::fmt::Debug for skyfeed::Request -pub fn skyfeed::Request::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result -impl core::marker::Freeze for skyfeed::Request -impl core::marker::Send for skyfeed::Request -impl core::marker::Sync for skyfeed::Request -impl core::marker::Unpin for skyfeed::Request -impl core::panic::unwind_safe::RefUnwindSafe for skyfeed::Request -impl core::panic::unwind_safe::UnwindSafe for skyfeed::Request -impl atrium_common::types::throttled::Throttleable

for skyfeed::Request where P: core::default::Default -pub fn skyfeed::Request::throttled(self) -> atrium_common::types::throttled::Throttled -impl atrium_common::types::cached::Cacheable for skyfeed::Request -pub fn skyfeed::Request::cached(self, cache: C) -> atrium_common::types::cached::Cached -impl core::convert::Into for skyfeed::Request where U: core::convert::From -pub fn skyfeed::Request::into(self) -> U -impl core::convert::TryFrom for skyfeed::Request where U: core::convert::Into -pub type skyfeed::Request::Error = core::convert::Infallible -pub fn skyfeed::Request::try_from(value: U) -> core::result::Result>::Error> -impl core::convert::TryInto for skyfeed::Request where U: core::convert::TryFrom -pub type skyfeed::Request::Error = >::Error -pub fn skyfeed::Request::try_into(self) -> core::result::Result>::Error> -impl alloc::borrow::ToOwned for skyfeed::Request where T: core::clone::Clone -pub type skyfeed::Request::Owned = T -pub fn skyfeed::Request::clone_into(&self, target: &mut T) -pub fn skyfeed::Request::to_owned(&self) -> T -impl core::any::Any for skyfeed::Request where T: 'static + ?core::marker::Sized -pub fn skyfeed::Request::type_id(&self) -> core::any::TypeId -impl core::borrow::Borrow for skyfeed::Request where T: ?core::marker::Sized -pub fn skyfeed::Request::borrow(&self) -> &T -impl core::borrow::BorrowMut for skyfeed::Request where T: ?core::marker::Sized -pub fn skyfeed::Request::borrow_mut(&mut self) -> &mut T -impl core::clone::CloneToUninit for skyfeed::Request where T: core::clone::Clone -pub unsafe fn skyfeed::Request::clone_to_uninit(&self, dst: *mut u8) -impl core::convert::From for skyfeed::Request -pub fn skyfeed::Request::from(t: T) -> T -impl crossbeam_epoch::atomic::Pointable for skyfeed::Request -pub type skyfeed::Request::Init = T -pub const skyfeed::Request::ALIGN: usize -pub unsafe fn skyfeed::Request::deref<'a>(ptr: usize) -> &'a T -pub unsafe fn skyfeed::Request::deref_mut<'a>(ptr: usize) -> &'a mut T -pub unsafe fn skyfeed::Request::drop(ptr: usize) -pub unsafe fn skyfeed::Request::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::Request -impl tracing::instrument::Instrument for skyfeed::Request -impl tracing::instrument::WithSubscriber for skyfeed::Request -impl typenum::type_operators::Same for skyfeed::Request -pub type skyfeed::Request::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::Request where T: 'static -impl ppv_lite86::types::VZip for skyfeed::Request where V: ppv_lite86::types::MultiLane -pub fn skyfeed::Request::vzip(self) -> V pub struct skyfeed::Uri(pub alloc::string::String) impl core::clone::Clone for skyfeed::Uri pub fn skyfeed::Uri::clone(&self) -> skyfeed::Uri @@ -671,7 +723,7 @@ pub fn skyfeed::Uri::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::Uri where T: ?core::marker::Sized pub fn skyfeed::Uri::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::Uri where T: core::clone::Clone -pub unsafe fn skyfeed::Uri::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::Uri::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::Uri pub fn skyfeed::Uri::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::Uri @@ -681,12 +733,12 @@ pub unsafe fn skyfeed::Uri::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::Uri::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::Uri::drop(ptr: usize) pub unsafe fn skyfeed::Uri::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::Uri +impl libipld_core::codec::References for skyfeed::Uri +pub fn skyfeed::Uri::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::Uri impl tracing::instrument::WithSubscriber for skyfeed::Uri impl typenum::type_operators::Same for skyfeed::Uri pub type skyfeed::Uri::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::Uri where T: 'static impl ppv_lite86::types::VZip for skyfeed::Uri where V: ppv_lite86::types::MultiLane pub fn skyfeed::Uri::vzip(self) -> V pub struct skyfeed::VideoEmbed @@ -725,7 +777,7 @@ pub fn skyfeed::VideoEmbed::borrow(&self) -> &T impl core::borrow::BorrowMut for skyfeed::VideoEmbed where T: ?core::marker::Sized pub fn skyfeed::VideoEmbed::borrow_mut(&mut self) -> &mut T impl core::clone::CloneToUninit for skyfeed::VideoEmbed where T: core::clone::Clone -pub unsafe fn skyfeed::VideoEmbed::clone_to_uninit(&self, dst: *mut u8) +pub unsafe fn skyfeed::VideoEmbed::clone_to_uninit(&self, dest: *mut u8) impl core::convert::From for skyfeed::VideoEmbed pub fn skyfeed::VideoEmbed::from(t: T) -> T impl crossbeam_epoch::atomic::Pointable for skyfeed::VideoEmbed @@ -735,21 +787,19 @@ pub unsafe fn skyfeed::VideoEmbed::deref<'a>(ptr: usize) -> &'a T pub unsafe fn skyfeed::VideoEmbed::deref_mut<'a>(ptr: usize) -> &'a mut T pub unsafe fn skyfeed::VideoEmbed::drop(ptr: usize) pub unsafe fn skyfeed::VideoEmbed::init(init: ::Init) -> usize -impl icu_provider::any::MaybeSendSync for skyfeed::VideoEmbed +impl libipld_core::codec::References for skyfeed::VideoEmbed +pub fn skyfeed::VideoEmbed::references(_c: libipld_core::raw::RawCodec, _r: &mut R, _set: &mut E) -> core::result::Result<(), anyhow::Error> where R: std::io::Read, E: core::iter::traits::collect::Extend> impl tracing::instrument::Instrument for skyfeed::VideoEmbed impl tracing::instrument::WithSubscriber for skyfeed::VideoEmbed impl typenum::type_operators::Same for skyfeed::VideoEmbed pub type skyfeed::VideoEmbed::Output = T -impl yoke::erased::ErasedDestructor for skyfeed::VideoEmbed where T: 'static impl ppv_lite86::types::VZip for skyfeed::VideoEmbed where V: ppv_lite86::types::MultiLane pub fn skyfeed::VideoEmbed::vzip(self) -> V -pub trait skyfeed::Feed -pub fn skyfeed::Feed::handler(&mut self) -> Handler -pub fn skyfeed::Feed::start(&mut self, name: impl core::convert::AsRef, address: impl core::convert::Into + core::fmt::Debug + core::clone::Clone + core::marker::Send) -> impl core::future::future::Future + core::marker::Send -pub fn skyfeed::Feed::start_with_config(&mut self, name: impl core::convert::AsRef, config: skyfeed::config::Config, address: impl core::convert::Into + core::fmt::Debug + core::clone::Clone + core::marker::Send) -> impl core::future::future::Future + core::marker::Send pub trait skyfeed::FeedHandler +pub fn skyfeed::FeedHandler::available_feeds(&mut self) -> impl core::future::future::Future> + core::marker::Send pub fn skyfeed::FeedHandler::delete_like(&mut self, like_uri: skyfeed::Uri) -> impl core::future::future::Future + core::marker::Send pub fn skyfeed::FeedHandler::delete_post(&mut self, uri: skyfeed::Uri) -> impl core::future::future::Future + core::marker::Send +pub fn skyfeed::FeedHandler::insert_like(&mut self, like_uri: skyfeed::Uri, liked_post_uri: skyfeed::Uri) -> impl core::future::future::Future + core::marker::Send pub fn skyfeed::FeedHandler::insert_post(&mut self, post: skyfeed::Post) -> impl core::future::future::Future + core::marker::Send -pub fn skyfeed::FeedHandler::like_post(&mut self, like_uri: skyfeed::Uri, liked_post_uri: skyfeed::Uri) -> impl core::future::future::Future + core::marker::Send -pub fn skyfeed::FeedHandler::serve_feed(&self, request: skyfeed::Request) -> impl core::future::future::Future + core::marker::Send +pub fn skyfeed::FeedHandler::serve_feed(&self, request: skyfeed::FeedRequest) -> impl core::future::future::Future + core::marker::Send +pub async fn skyfeed::start(config: skyfeed::Config, queue_limit: usize, feed_handler: alloc::sync::Arc>, address: impl core::convert::Into + core::marker::Send + 'static) diff --git a/src/update_counter.rs b/src/update_counter.rs new file mode 100644 index 0000000..788dd54 --- /dev/null +++ b/src/update_counter.rs @@ -0,0 +1,33 @@ +use std::{ + sync::{ + Arc, + atomic::{AtomicU64, Ordering}, + }, + time::{Duration, Instant}, +}; + +pub(crate) struct UpdatesCounter { + count: Arc, + last_log: Arc>, +} + +impl UpdatesCounter { + pub(crate) fn new() -> Self { + UpdatesCounter { + count: Arc::new(AtomicU64::new(0)), + last_log: Arc::new(tokio::sync::Mutex::new(Instant::now())), + } + } + + pub(crate) async fn increment_and_maybe_log(&self) { + self.count.fetch_add(1, Ordering::Relaxed); + let mut last_log = self.last_log.lock().await; + let elapsed = last_log.elapsed(); + if elapsed >= Duration::from_secs(1) { + let count = self.count.swap(0, Ordering::Relaxed); + let ups = count as f64 / elapsed.as_secs_f64(); + log::trace!("updates/sec: {:.2}", ups); + *last_log = Instant::now(); + } + } +}