diff --git a/Cargo.lock b/Cargo.lock index d91d517..c2aa5df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,11 +39,11 @@ dependencies = [ [[package]] name = "actix-codec" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "bytes", "futures-core", "futures-sink", @@ -56,18 +56,18 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.4.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92ef85799cba03f76e4f7c10f533e66d87c9a7e7055f3391f09000ad8351bc9" +checksum = "d223b13fd481fc0d1f83bb12659ae774d9e3601814c68a0bc539731698cca743" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-tls", "actix-utils", - "ahash 0.8.6", - "base64 0.21.5", - "bitflags 2.4.1", + "ahash 0.8.7", + "base64", + "bitflags 2.4.2", "brotli", "bytes", "bytestring", @@ -100,14 +100,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "actix-router" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" +checksum = "d22475596539443685426b6bdadb926ad0ecaefdfc5fb05e5e3441f15463c511" dependencies = [ "bytestring", "http", @@ -139,7 +139,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2 0.5.5", + "socket2", "tokio", "tracing", ] @@ -157,9 +157,9 @@ dependencies = [ [[package]] name = "actix-tls" -version = "3.1.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72616e7fbec0aa99c6f3164677fa48ff5a60036d0799c98cab894a44f3e0efc3" +checksum = "d4cce60a2f2b477bc72e5cde0af1812a6e82d8fd85b5570a5dcf2a5bf2c5be5f" dependencies = [ "actix-rt", "actix-service", @@ -167,13 +167,11 @@ dependencies = [ "futures-core", "impl-more", "pin-project-lite", - "rustls", - "rustls-webpki", + "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.25.0", "tokio-util", "tracing", - "webpki-roots", ] [[package]] @@ -188,9 +186,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.4.0" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4a5b5e29603ca8c94a77c65cf874718ceb60292c5a5c3e5f4ace041af462b9" +checksum = "43a6556ddebb638c2358714d853257ed226ece6023ef9364f23f0c70737ea984" dependencies = [ "actix-codec", "actix-http", @@ -200,7 +198,7 @@ dependencies = [ "actix-service", "actix-tls", "actix-utils", - "ahash 0.8.6", + "ahash 0.8.7", "bytes", "bytestring", "cfg-if", @@ -219,7 +217,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.5.5", + "socket2", "time", "url", ] @@ -265,9 +263,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "getrandom", @@ -330,9 +328,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -344,59 +342,59 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "2faccea4cc4ab4a667ce676a30e8ec13922a692c99bb8f5b11f1502c72e04220" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "ap-relay" -version = "0.3.104" +version = "0.3.108" dependencies = [ "activitystreams", "activitystreams-ext", - "actix-rt", "actix-web", "actix-webfinger", "ammonia", - "anyhow", + "async-cpupool", "background-jobs", - "base64 0.21.5", + "base64", "bcrypt", "clap", + "color-eyre", "config", "console-subscriber", "dashmap", @@ -412,18 +410,20 @@ dependencies = [ "minify-html", "opentelemetry", "opentelemetry-otlp", + "opentelemetry_sdk", "pin-project-lite", "quanta", "rand", "reqwest", "reqwest-middleware", "reqwest-tracing", - "ring 0.16.20", + "ring", "rsa", "rsa-magic-public-key", "ructe", - "rustls", - "rustls-pemfile", + "rustls 0.22.2", + "rustls-channel-resolver", + "rustls-pemfile 2.0.0", "serde", "serde_json", "sled", @@ -432,12 +432,11 @@ dependencies = [ "thiserror", "time", "tokio", - "toml 0.7.8", + "toml", "tracing", "tracing-actix-web", "tracing-error", - "tracing-futures", - "tracing-log 0.1.4", + "tracing-log", "tracing-opentelemetry", "tracing-subscriber", "uuid", @@ -463,16 +462,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" [[package]] -name = "async-trait" -version = "0.1.74" +name = "async-cpupool" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "6e8033cee1f97627591df5401e0f20496c1940dc935f3de8ddc642bf9cf836c9" +dependencies = [ + "flume", + "metrics", + "tracing", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] +[[package]] +name = "async-trait" +version = "0.1.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + [[package]] name = "autocfg" version = "1.1.0" @@ -526,42 +564,21 @@ dependencies = [ [[package]] name = "background-jobs" -version = "0.15.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0788884be043a6ea4812f533b53f47180f1fb68a45d6a1e7c9f55369f187bd9" +checksum = "50954581739942ccbf39f7723a250dd3044c32de2e2c7e5f8cf53cb35200136b" dependencies = [ - "background-jobs-actix", "background-jobs-core", -] - -[[package]] -name = "background-jobs-actix" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6918aac07d254c283e83e74d94d2a4137eb8eb2bb35749553b2aeedefc13243d" -dependencies = [ - "actix-rt", - "anyhow", - "async-trait", - "background-jobs-core", - "metrics", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "tracing-futures", - "uuid", + "background-jobs-metrics", + "background-jobs-tokio", ] [[package]] name = "background-jobs-core" -version = "0.15.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19188ccc4964d2d7ac0349ec05290b079c49a6218dc9a70516c9084790efc039" +checksum = "dc0f2054eb1262a98306ef87d115c368aa1d38ecdf1cc5af08021e13eb0e55a8" dependencies = [ - "actix-rt", - "anyhow", "async-trait", "event-listener", "metrics", @@ -570,7 +587,36 @@ dependencies = [ "thiserror", "time", "tracing", - "tracing-futures", + "uuid", +] + +[[package]] +name = "background-jobs-metrics" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617da80f3fe8fe9b042d07cab58cf92ba3098b2112c4c499a27f333ebab401d2" +dependencies = [ + "async-trait", + "background-jobs-core", + "metrics", + "metrics-util", + "tracing", + "uuid", +] + +[[package]] +name = "background-jobs-tokio" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35759bf19b8b461e8d079f60565bf2ff8a76de36cdbe44d14de34cf4ae15c065" +dependencies = [ + "async-trait", + "background-jobs-core", + "metrics", + "serde", + "serde_json", + "tokio", + "tracing", "uuid", ] @@ -591,15 +637,18 @@ dependencies = [ [[package]] name = "base64" -version = "0.13.1" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] -name = "base64" -version = "0.21.5" +name = "base64-simd" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] [[package]] name = "base64ct" @@ -613,7 +662,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d1c9c15093eb224f0baa400f38fcd713fc1391a6f1c389d886beef146d60a3" dependencies = [ - "base64 0.21.5", + "base64", "blowfish", "getrandom", "subtle", @@ -628,9 +677,21 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] [[package]] name = "block-buffer" @@ -678,6 +739,28 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytecount" version = "0.6.7" @@ -722,9 +805,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" dependencies = [ "num-traits", ] @@ -741,9 +824,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.8" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" dependencies = [ "clap_builder", "clap_derive", @@ -751,9 +834,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.8" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" dependencies = [ "anstream", "anstyle", @@ -770,7 +853,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -779,6 +862,33 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +[[package]] +name = "color-eyre" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + [[package]] name = "colorchoice" version = "1.0.0" @@ -786,46 +896,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] -name = "config" -version = "0.13.3" +name = "concurrent-queue" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d379af7f68bfc21714c6c7dea883544201741d2ce8274bb12fa54f89507f52a7" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "config" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" dependencies = [ - "async-trait", - "json5", "lazy_static", "nom", "pathdiff", - "ron", - "rust-ini", "serde", "serde_json", - "toml 0.5.11", + "toml", "yaml-rust", ] [[package]] name = "console-api" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2895653b4d9f1538a83970077cb01dfc77a4810524e51a110944688e916b18e" +checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787" dependencies = [ - "prost", + "futures-core", + "prost 0.12.3", "prost-types", - "tonic", + "tonic 0.10.2", "tracing-core", ] [[package]] name = "console-subscriber" -version = "0.1.10" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4cf42660ac07fcebed809cfe561dd8730bcd35b075215e6479c516bcd0d11cb" +checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e" dependencies = [ "console-api", "crossbeam-channel", "crossbeam-utils", - "futures", + "futures-task", "hdrhistogram", "humantime", "prost-types", @@ -834,7 +950,7 @@ dependencies = [ "thread_local", "tokio", "tokio-stream", - "tonic", + "tonic 0.10.2", "tracing", "tracing-core", "tracing-subscriber", @@ -842,9 +958,29 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] name = "convert_case" @@ -854,9 +990,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -864,15 +1000,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -888,35 +1024,37 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crypto-common" @@ -929,14 +1067,35 @@ dependencies = [ ] [[package]] -name = "css-minify" -version = "0.3.1" +name = "cssparser" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874c6e2d19f8d4a285083b11a3241bfbe01ac3ed85f26e1e6b34888d960552bd" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" dependencies = [ - "derive_more", - "indexmap 1.9.3", - "nom", + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.2", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.48", ] [[package]] @@ -981,12 +1140,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "lock_api", "once_cell", "parking_lot_core 0.9.9", ] +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + [[package]] name = "der" version = "0.7.8" @@ -1000,9 +1174,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", "serde", @@ -1032,12 +1206,6 @@ dependencies = [ "crypto-common", ] -[[package]] -name = "dlv-list" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" - [[package]] name = "dotenv" version = "0.15.0" @@ -1053,6 +1221,21 @@ dependencies = [ "futures", ] +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +dependencies = [ + "dtoa", +] + [[package]] name = "either" version = "1.9.0" @@ -1092,9 +1275,24 @@ dependencies = [ [[package]] name = "event-listener" -version = "2.5.3" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] [[package]] name = "fastrand" @@ -1132,9 +1330,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1149,6 +1347,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futf" version = "0.1.5" @@ -1161,9 +1365,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1176,9 +1380,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1186,15 +1390,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1203,38 +1407,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1269,9 +1473,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -1282,15 +1486,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.22" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -1298,7 +1508,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap 2.2.2", "slab", "tokio", "tokio-util", @@ -1320,16 +1530,17 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", + "bumpalo", ] [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", "allocator-api2", ] @@ -1339,7 +1550,7 @@ version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ - "base64 0.21.5", + "base64", "byteorder", "flate2", "nom", @@ -1354,9 +1565,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "html5ever" @@ -1385,9 +1596,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -1405,17 +1616,17 @@ dependencies = [ [[package]] name = "http-signature-normalization-actix" -version = "0.10.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d7de237db731e75fbfa0ebeeb70e366f5f9cdcf45af4a41eca8516b80162ca" +checksum = "e0fb2730dc2a3a91b3386b6f7bd2b0414a707f33f5617cf7e1cba8562b1ea557" dependencies = [ "actix-http", "actix-rt", "actix-web", - "base64 0.13.1", + "base64", "futures-core", "http-signature-normalization", - "ring 0.16.20", + "ring", "streem", "thiserror", "tokio", @@ -1426,17 +1637,17 @@ dependencies = [ [[package]] name = "http-signature-normalization-reqwest" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cfb84663420ec12c4422820bfdf5e8e5e57467892587f43ac432e73ebce880" +checksum = "86048ef6b1d59bcb2cdde0100bb16b1a29ce78ab6dd4a90706ba0791a2831b5a" dependencies = [ "async-trait", - "base64 0.13.1", + "base64", "http-signature-normalization", "httpdate", "reqwest", "reqwest-middleware", - "ring 0.16.20", + "ring", "thiserror", ] @@ -1460,9 +1671,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -1475,7 +1686,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2", "tokio", "tower-service", "tracing", @@ -1491,9 +1702,9 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls", + "rustls 0.21.10", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", ] [[package]] @@ -1516,9 +1727,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1530,6 +1741,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.9.3" @@ -1542,12 +1759,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", ] [[package]] @@ -1612,29 +1829,27 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.9" +name = "itertools" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "js-sys" -version = "0.3.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "wasm-bindgen", + "either", ] [[package]] -name = "json5" -version = "0.4.1" +name = "itoa" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "js-sys" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" dependencies = [ - "pest", - "pest_derive", - "serde", + "wasm-bindgen", ] [[package]] @@ -1654,9 +1869,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.150" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -1664,6 +1879,30 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771a62dedf5ec563bbfea9760f6c6a6bc546e67355eba0cd7d00c0dc34b11d90" +dependencies = [ + "ahash 0.7.7", + "bitflags 2.4.2", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "itertools 0.10.5", + "lazy_static", + "parcel_selectors", + "parcel_sourcemap", + "paste", + "pathdiff", + "rayon", + "serde", + "smallvec", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -1705,11 +1944,11 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "lru" -version = "0.11.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a83fb7698b3643a0e34f9ae6f2e8f0178c0fd42f8b59d493aa271ff3a5bf21" +checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" dependencies = [ - "hashbrown 0.14.2", + "hashbrown 0.14.3", ] [[package]] @@ -1718,15 +1957,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" -[[package]] -name = "mach2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" -dependencies = [ - "libc", -] - [[package]] name = "maplit" version = "1.0.2" @@ -1740,7 +1970,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" dependencies = [ "log", - "phf", + "phf 0.10.1", "phf_codegen", "string_cache", "string_cache_codegen", @@ -1756,6 +1986,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "matchit" version = "0.7.3" @@ -1770,37 +2006,27 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "metrics" -version = "0.21.1" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +checksum = "77b9e10a211c839210fd7f99954bda26e5f8e26ec686ad68da6a32df7c80e782" dependencies = [ - "ahash 0.8.6", - "metrics-macros", + "ahash 0.8.7", "portable-atomic", ] [[package]] name = "metrics-exporter-prometheus" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a4964177ddfdab1e3a2b37aec7cf320e14169abb0ed73999f558136409178d5" +checksum = "83a4c4718a371ddfb7806378f23617876eea8b82e5ff1324516bcd283249d9ea" dependencies = [ - "base64 0.21.5", + "base64", "hyper", "indexmap 1.9.3", "ipnet", @@ -1811,22 +2037,11 @@ dependencies = [ "tokio", ] -[[package]] -name = "metrics-macros" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - [[package]] name = "metrics-util" -version = "0.15.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" +checksum = "2670b8badcc285d486261e2e9f1615b506baff91427b61bd336a472b65bbf5ed" dependencies = [ "aho-corasick 1.1.2", "crossbeam-epoch", @@ -1859,23 +2074,40 @@ dependencies = [ [[package]] name = "minify-html" -version = "0.11.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4d9147754a49e80557df835eb59e743eab1bf75410a134f55dc4b9dbb692ad" +checksum = "1cd4517942a8e7425c990b14977f86a63e4996eed7b15cfcca1540126ac5ff25" dependencies = [ "aho-corasick 0.7.20", - "css-minify", "lazy_static", + "lightningcss", "memchr", + "minify-html-common", "minify-js", + "once_cell", "rustc-hash", ] [[package]] -name = "minify-js" -version = "0.4.3" +name = "minify-html-common" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c300f90ba1138b5c5daf5d9441dc9bdc67b808aac22cf638362a2647bc213be4" +checksum = "697a6b40dffdc5de10c0cbd709dc2bc2039cea9dab8aaa636eb9a49d6b411780" +dependencies = [ + "aho-corasick 0.7.20", + "itertools 0.12.1", + "lazy_static", + "memchr", + "rustc-hash", + "serde", + "serde_json", +] + +[[package]] +name = "minify-js" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22d6c512a82abddbbc13b70609cb2beff01be2c7afff534d6e5e1c85e438fc8b" dependencies = [ "lazy_static", "parse-js", @@ -1889,23 +2121,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "log", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1993,6 +2225,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" version = "0.1.45" @@ -2048,78 +2286,28 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opentelemetry" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54" +checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" dependencies = [ - "opentelemetry_api", - "opentelemetry_sdk", -] - -[[package]] -name = "opentelemetry-otlp" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275" -dependencies = [ - "async-trait", "futures-core", - "http", - "opentelemetry-proto", - "opentelemetry-semantic-conventions", - "opentelemetry_api", - "opentelemetry_sdk", - "prost", - "thiserror", - "tokio", - "tonic", -] - -[[package]] -name = "opentelemetry-proto" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e3f814aa9f8c905d0ee4bde026afd3b2577a97c10e1699912e3e44f0c4cbeb" -dependencies = [ - "opentelemetry_api", - "opentelemetry_sdk", - "prost", - "tonic", -] - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73c9f9340ad135068800e7f1b24e9e09ed9e7143f5bf8518ded3d3ec69789269" -dependencies = [ - "opentelemetry", -] - -[[package]] -name = "opentelemetry_api" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b" -dependencies = [ - "futures-channel", - "futures-util", - "indexmap 1.9.3", + "futures-sink", + "indexmap 2.2.2", "js-sys", "once_cell", "pin-project-lite", @@ -2128,23 +2316,62 @@ dependencies = [ ] [[package]] -name = "opentelemetry_sdk" -version = "0.20.0" +name = "opentelemetry-otlp" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026" +checksum = "f24cda83b20ed2433c68241f918d0f6fdec8b1d43b7a9590ab4420c5095ca930" +dependencies = [ + "async-trait", + "futures-core", + "http", + "opentelemetry", + "opentelemetry-proto", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", + "prost 0.11.9", + "thiserror", + "tokio", + "tonic 0.9.2", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2e155ce5cc812ea3d1dffbd1539aed653de4bf4882d60e6e04dcf0901d674e1" +dependencies = [ + "opentelemetry", + "opentelemetry_sdk", + "prost 0.11.9", + "tonic 0.9.2", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5774f1ef1f982ef2a447f6ee04ec383981a3ab99c8e77a1a7b30182e65bbc84" +dependencies = [ + "opentelemetry", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f16aec8a98a457a52664d69e0091bac3a0abd18ead9b641cb00202ba4e0efe4" dependencies = [ "async-trait", "crossbeam-channel", "futures-channel", "futures-executor", "futures-util", + "glob", "once_cell", - "opentelemetry_api", + "opentelemetry", "ordered-float", "percent-encoding", "rand", - "regex", - "serde_json", "thiserror", "tokio", "tokio-stream", @@ -2152,22 +2379,18 @@ dependencies = [ [[package]] name = "ordered-float" -version = "3.9.2" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" dependencies = [ "num-traits", ] [[package]] -name = "ordered-multimap" -version = "0.4.3" +name = "outref" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" -dependencies = [ - "dlv-list", - "hashbrown 0.12.3", -] +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" [[package]] name = "overload" @@ -2175,6 +2398,48 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + +[[package]] +name = "parcel_selectors" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d74befe2d076330d9a58bf9ca2da424568724ab278adf15fb5718253133887" +dependencies = [ + "bitflags 2.4.2", + "cssparser", + "fxhash", + "log", + "phf 0.10.1", + "phf_codegen", + "precomputed-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" +dependencies = [ + "base64-simd", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", +] + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" version = "0.11.2" @@ -2220,16 +2485,18 @@ dependencies = [ "libc", "redox_syscall 0.4.1", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] name = "parse-js" -version = "0.10.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30534759e6ad87aa144c396544747e1c25b1020bd133356fd758c8facec764e5" +checksum = "9ec3b11d443640ec35165ee8f6f0559f1c6f41878d70330fe9187012b5935f02" dependencies = [ "aho-corasick 0.7.20", + "bumpalo", + "hashbrown 0.13.1", "lazy_static", "memchr", ] @@ -2257,54 +2524,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pest" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "pest_meta" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" -dependencies = [ - "once_cell", - "pest", - "sha2", -] +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "phf" @@ -2312,7 +2534,17 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ - "phf_shared", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", ] [[package]] @@ -2321,8 +2553,8 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.10.0", + "phf_shared 0.10.0", ] [[package]] @@ -2331,10 +2563,33 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" dependencies = [ - "phf_shared", + "phf_shared 0.10.0", "rand", ] +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "phf_shared" version = "0.10.0" @@ -2345,23 +2600,32 @@ dependencies = [ ] [[package]] -name = "pin-project" -version = "1.1.3" +name = "phf_shared" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -2399,9 +2663,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bccab0e7fd7cc19f820a1c8c91720af652d0c88dc9664dd72aef2614f04af3b" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "powerfmt" @@ -2447,9 +2711,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -2461,7 +2725,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive 0.12.3", ] [[package]] @@ -2478,23 +2752,55 @@ dependencies = [ ] [[package]] -name = "prost-types" -version = "0.11.9" +name = "prost-derive" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ - "prost", + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost 0.12.3", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "quanta" -version = "0.11.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" +checksum = "9ca0b7bac0b97248c40bb77288fc52029cf1459c0461ea1b05ee32ccf011de2c" dependencies = [ "crossbeam-utils", "libc", - "mach2", "once_cell", "raw-cpuid", "wasi", @@ -2504,13 +2810,19 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "radix_trie" version = "0.2.1" @@ -2553,11 +2865,31 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "10.7.0" +version = "11.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", +] + +[[package]] +name = "rayon" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", ] [[package]] @@ -2589,13 +2921,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick 1.1.2", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "regex-syntax 0.8.2", ] @@ -2610,9 +2942,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick 1.1.2", "memchr", @@ -2632,12 +2964,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] -name = "reqwest" -version = "0.11.22" +name = "rend" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" dependencies = [ - "base64 0.21.5", + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.11.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +dependencies = [ + "base64", "bytes", "encoding_rs", "futures-core", @@ -2655,14 +2996,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls", - "rustls-pemfile", + "rustls 0.21.10", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tokio-util", "tower-service", "url", @@ -2691,9 +3033,9 @@ dependencies = [ [[package]] name = "reqwest-tracing" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b1e66540e0cac90acadaf7109bf99c90d95abcc94b4c096bfa16a2d7aa7a71" +checksum = "5a0152176687dd5cfe7f507ac1cb1a491c679cfe483afd133a7db7aaea818bb3" dependencies = [ "anyhow", "async-trait", @@ -2707,49 +3049,52 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.20" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", "getrandom", "libc", "spin 0.9.8", - "untrusted 0.9.0", - "windows-sys", + "untrusted", + "windows-sys 0.48.0", ] [[package]] -name = "ron" -version = "0.7.1" +name = "rkyv" +version = "0.7.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" dependencies = [ - "base64 0.13.1", - "bitflags 1.3.2", - "serde", + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "rsa" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3211b01eea83d80687da9eef70e39d65144a3894866a5153a2723e425a157f" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" dependencies = [ "const-oid", "digest", @@ -2771,7 +3116,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88ca6a6947c6fe6454c93c3bb65b92f9680e6f9e906e75e30631110f2227344c" dependencies = [ - "base64 0.21.5", + "base64", "num-bigint-dig", "rsa", "thiserror", @@ -2779,9 +3124,9 @@ dependencies = [ [[package]] name = "rsass" -version = "0.28.6" +version = "0.28.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c952ecc29562e37ad8921caa8f6f6a8bc40614f78ac2e2e29f5ea7c00ce47d5" +checksum = "cdf903247e7165156378cd1a7deda977b8e8567683ed97ad7330376dbf92f473" dependencies = [ "arc-swap", "fastrand", @@ -2800,7 +3145,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b0a930679d54e46fa4e66be3d9a333026da04d2b659e42aab4dfd1586452815" dependencies = [ - "base64 0.21.5", + "base64", "bytecount", "itertools 0.11.0", "md5", @@ -2809,16 +3154,6 @@ dependencies = [ "rsass", ] -[[package]] -name = "rust-ini" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" -dependencies = [ - "cfg-if", - "ordered-multimap", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -2842,33 +3177,84 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.9" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", - "ring 0.17.5", - "rustls-webpki", + "ring", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.2", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-channel-resolver" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbd1941204442f051576a9a7ea8e8db074ad7fd43db1eb3378c3633f9f9e166" +dependencies = [ + "nanorand", + "rustls 0.22.2", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64", ] +[[package]] +name = "rustls-pemfile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +dependencies = [ + "base64", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" + [[package]] name = "rustls-webpki" version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] @@ -2879,9 +3265,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "scopeguard" @@ -2895,41 +3281,47 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] -name = "semver" -version = "1.0.20" +name = "seahash" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "semver" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -2938,9 +3330,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] @@ -2980,17 +3372,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sharded-slab" version = "0.1.7" @@ -3019,6 +3400,21 @@ dependencies = [ "rand_core", ] +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "siphasher" version = "0.3.11" @@ -3027,9 +3423,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "sketches-ddsketch" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" +checksum = "85636c14b73d81f541e525f585c0a2109e6744e1565b5c1668e31c70c10ed65c" [[package]] name = "slab" @@ -3058,19 +3454,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" @@ -3079,7 +3465,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3099,9 +3485,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", @@ -3109,9 +3495,9 @@ dependencies = [ [[package]] name = "streem" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "641396a5ae90767cb12d21832444ab760841ee887717d802b2c456c4f8199114" +checksum = "6c8b0c8184b0fe05b37dd75d66205195cd57563c6c87cb92134a025a34a6ab34" dependencies = [ "futures-core", "pin-project-lite", @@ -3126,7 +3512,7 @@ dependencies = [ "new_debug_unreachable", "once_cell", "parking_lot 0.12.1", - "phf_shared", + "phf_shared 0.10.0", "precomputed-hash", "serde", ] @@ -3137,8 +3523,8 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.10.0", + "phf_shared 0.10.0", "proc-macro2", "quote", ] @@ -3168,9 +3554,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -3216,6 +3602,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "task-local-extensions" version = "0.1.4" @@ -3307,22 +3699,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -3337,12 +3729,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -3357,10 +3750,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -3381,21 +3775,22 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", "libc", "mio", + "num_cpus", "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2", "tokio-macros", "tracing", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3416,7 +3811,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -3425,7 +3820,18 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.10", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.2", + "rustls-pki-types", "tokio", ] @@ -3456,18 +3862,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.11" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +checksum = "c6a4b9e8023eb94392d3dca65d717c53abc5dad49c07cb65bb8fcd87115fa325" dependencies = [ "serde", "serde_spanned", @@ -3486,11 +3883,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.2", "serde", "serde_spanned", "toml_datetime", @@ -3505,7 +3902,7 @@ checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ "async-trait", "axum", - "base64 0.21.5", + "base64", "bytes", "futures-core", "futures-util", @@ -3516,7 +3913,34 @@ dependencies = [ "hyper-timeout", "percent-encoding", "pin-project", - "prost", + "prost 0.11.9", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.12.3", "tokio", "tokio-stream", "tower", @@ -3590,7 +4014,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -3623,17 +4047,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tracing-log" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - [[package]] name = "tracing-log" version = "0.2.0" @@ -3647,18 +4060,20 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75327c6b667828ddc28f5e3f169036cb793c3f588d83bf0f262a7f062ffed3c8" +checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596" dependencies = [ + "js-sys", "once_cell", "opentelemetry", "opentelemetry_sdk", "smallvec", "tracing", "tracing-core", - "tracing-log 0.1.4", + "tracing-log", "tracing-subscriber", + "web-time", ] [[package]] @@ -3676,14 +4091,14 @@ dependencies = [ "thread_local", "tracing", "tracing-core", - "tracing-log 0.2.0", + "tracing-log", ] [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" @@ -3691,12 +4106,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - [[package]] name = "unicase" version = "2.7.0" @@ -3708,9 +4117,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -3727,12 +4136,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -3741,9 +4144,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -3771,10 +4174,11 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ + "atomic", "getrandom", "serde", ] @@ -3791,6 +4195,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + [[package]] name = "want" version = "0.3.1" @@ -3808,9 +4218,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3818,24 +4228,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" dependencies = [ "cfg-if", "js-sys", @@ -3845,9 +4255,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3855,28 +4265,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", @@ -3887,9 +4297,19 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" dependencies = [ "js-sys", "wasm-bindgen", @@ -3897,9 +4317,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "winapi" @@ -3929,7 +4349,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -3938,13 +4367,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -3953,36 +4397,72 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -3990,10 +4470,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] -name = "winnow" -version = "0.5.19" +name = "windows_x86_64_msvc" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winnow" +version = "0.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7cad8365489051ae9f054164e459304af2e7e9bb407c958076c8bf4aef52da5" dependencies = [ "memchr", ] @@ -4005,7 +4491,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", ] [[package]] @@ -4019,22 +4514,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.26" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.26" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 603b5ce..b1a7018 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.104" +version = "0.3.108" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" -repository = "https://git.asonix.dog/asonix/ap-relay" +repository = "https://git.asonix.dog/asonix/relay" keywords = ["activitypub", "relay"] edition = "2021" build = "src/build.rs" @@ -15,51 +15,55 @@ name = "relay" path = "src/main.rs" [features] -console = ["console-subscriber"] +console = ["dep:console-subscriber"] default = [] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -anyhow = "1.0" -actix-rt = "2.7.0" -actix-web = { version = "4.4.0", default-features = false, features = ["compress-brotli", "compress-gzip", "rustls-0_21"] } +actix-web = { version = "4.4.0", default-features = false, features = ["compress-brotli", "compress-gzip", "rustls-0_22"] } actix-webfinger = { version = "0.5.0", default-features = false } activitystreams = "0.7.0-alpha.25" activitystreams-ext = "0.1.0-alpha.3" ammonia = "3.1.0" +async-cpupool = "0.2.0" bcrypt = "0.15" base64 = "0.21" clap = { version = "4.0.0", features = ["derive"] } -config = "0.13.0" -console-subscriber = { version = "0.1", optional = true } +color-eyre = "0.6.2" +config = { version = "0.14.0", default-features = false, features = ["toml", "json", "yaml"] } +console-subscriber = { version = "0.2", optional = true } dashmap = "5.1.0" dotenv = "0.15.0" flume = "0.11.0" -lru = "0.11.0" -metrics = "0.21.0" -metrics-exporter-prometheus = { version = "0.12.0", default-features = false, features = [ +lru = "0.12.0" +metrics = "0.22.0" +metrics-exporter-prometheus = { version = "0.13.0", default-features = false, features = [ "http-listener", ] } -metrics-util = "0.15.0" +metrics-util = "0.16.0" mime = "0.3.16" -minify-html = "0.11.0" -opentelemetry = { version = "0.20", features = ["rt-tokio"] } -opentelemetry-otlp = "0.13" +minify-html = "0.15.0" +opentelemetry = "0.21" +opentelemetry_sdk = { version = "0.21", features = ["rt-tokio"] } +opentelemetry-otlp = "0.14" pin-project-lite = "0.2.9" -quanta = "0.11.0" +# pinned to metrics-util +quanta = "0.12.0" rand = "0.8" reqwest = { version = "0.11", default-features = false, features = ["rustls-tls", "stream"]} reqwest-middleware = "0.2" reqwest-tracing = "0.4.5" -ring = "0.16.20" +ring = "0.17.5" rsa = { version = "0.9" } rsa-magic-public-key = "0.8.0" -rustls = "0.21.0" -rustls-pemfile = "1.0.1" +rustls = "0.22.0" +rustls-channel-resolver = "0.2.0" +rustls-pemfile = "2" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" sled = "0.34.7" +streem = "0.2.0" teloxide = { version = "0.12.0", default-features = false, features = [ "ctrlc_handler", "macros", @@ -69,41 +73,39 @@ thiserror = "1.0" time = { version = "0.3.17", features = ["serde"] } tracing = "0.1" tracing-error = "0.2" -tracing-futures = "0.2" -tracing-log = "0.1" -tracing-opentelemetry = "0.21" +tracing-log = "0.2" +tracing-opentelemetry = "0.22" tracing-subscriber = { version = "0.3", features = [ "ansi", "env-filter", "fmt", ] } -tokio = { version = "1", features = ["macros", "sync"] } +tokio = { version = "1", features = ["full", "tracing"] } uuid = { version = "1", features = ["v4", "serde"] } -streem = "0.1.0" [dependencies.background-jobs] -version = "0.15.0" +version = "0.18.0" default-features = false -features = ["background-jobs-actix", "error-logging"] +features = ["error-logging", "metrics", "tokio"] [dependencies.http-signature-normalization-actix] -version = "0.10.1" +version = "0.11.0" default-features = false features = ["server", "ring"] [dependencies.http-signature-normalization-reqwest] -version = "0.10.0" +version = "0.11.0" default-features = false features = ["middleware", "ring"] [dependencies.tracing-actix-web] -version = "0.7.6" +version = "0.7.9" [build-dependencies] -anyhow = "1.0" +color-eyre = "0.6.2" dotenv = "0.15.0" ructe = { version = "0.17.0", features = ["sass", "mime03"] } -toml = "0.7.0" +toml = "0.8.0" [profile.dev.package.rsa] opt-level = 3 diff --git a/flake.lock b/flake.lock index 2a20bfa..e987670 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1692799911, - "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", "owner": "numtide", "repo": "flake-utils", - "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1693003285, - "narHash": "sha256-5nm4yrEHKupjn62MibENtfqlP6pWcRTuSKrMiH9bLkc=", + "lastModified": 1705133751, + "narHash": "sha256-rCIsyE80jgiOU78gCWN3A0wE0tR2GI5nH6MlS+HaaSQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5690c4271f2998c304a45c91a0aeb8fb69feaea7", + "rev": "9b19f5e77dd906cb52dade0b7bd280339d2a1f3d", "type": "github" }, "original": { diff --git a/relay.nix b/relay.nix index 487fa65..4af63f2 100644 --- a/relay.nix +++ b/relay.nix @@ -1,17 +1,14 @@ { lib , nixosTests -, protobuf , rustPlatform }: rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.104"; + version = "0.3.108"; src = ./.; cargoLock.lockFile = ./Cargo.lock; - PROTOC = "${protobuf}/bin/protoc"; - PROTOC_INCLUDE = "${protobuf}/include"; RUSTFLAGS = "--cfg tokio_unstable"; nativeBuildInputs = [ ]; diff --git a/src/build.rs b/src/build.rs index f21d5bb..31062d2 100644 --- a/src/build.rs +++ b/src/build.rs @@ -21,7 +21,7 @@ fn git_info() { } } -fn version_info() -> Result<(), anyhow::Error> { +fn version_info() -> color_eyre::Result<()> { let cargo_toml = Path::new(&std::env::var("CARGO_MANIFEST_DIR")?).join("Cargo.toml"); let mut file = File::open(cargo_toml)?; @@ -42,7 +42,7 @@ fn version_info() -> Result<(), anyhow::Error> { Ok(()) } -fn main() -> Result<(), anyhow::Error> { +fn main() -> color_eyre::Result<()> { dotenv::dotenv().ok(); git_info(); diff --git a/src/collector.rs b/src/collector.rs index b5674c7..6e79bcb 100644 --- a/src/collector.rs +++ b/src/collector.rs @@ -1,4 +1,4 @@ -use metrics::{Key, Recorder, SetRecorderError}; +use metrics::{Key, Metadata, Recorder, SetRecorderError}; use metrics_util::{ registry::{AtomicStorage, GenerationalStorage, Recency, Registry}, MetricKindMask, Summary, @@ -289,7 +289,7 @@ impl Inner { } let mut d = self.distributions.write().unwrap(); - let outer_entry = d.entry(name.clone()).or_insert_with(BTreeMap::new); + let outer_entry = d.entry(name.clone()).or_default(); let entry = outer_entry .entry(labels) @@ -360,8 +360,8 @@ impl MemoryCollector { d.entry(key.as_str().to_owned()).or_insert(description); } - pub(crate) fn install(&self) -> Result<(), SetRecorderError> { - metrics::set_boxed_recorder(Box::new(self.clone())) + pub(crate) fn install(&self) -> Result<(), SetRecorderError> { + metrics::set_global_recorder(self.clone()) } } @@ -393,19 +393,19 @@ impl Recorder for MemoryCollector { self.add_description_if_missing(&key, description) } - fn register_counter(&self, key: &Key) -> metrics::Counter { + fn register_counter(&self, key: &Key, _: &Metadata<'_>) -> metrics::Counter { self.inner .registry .get_or_create_counter(key, |c| c.clone().into()) } - fn register_gauge(&self, key: &Key) -> metrics::Gauge { + fn register_gauge(&self, key: &Key, _: &Metadata<'_>) -> metrics::Gauge { self.inner .registry .get_or_create_gauge(key, |c| c.clone().into()) } - fn register_histogram(&self, key: &Key) -> metrics::Histogram { + fn register_histogram(&self, key: &Key, _: &Metadata<'_>) -> metrics::Histogram { self.inner .registry .get_or_create_histogram(key, |c| c.clone().into()) diff --git a/src/config.rs b/src/config.rs index 35520fd..bba4fd6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -12,9 +12,8 @@ use activitystreams::{ }; use config::Environment; use http_signature_normalization_actix::{digest::ring::Sha256, prelude::VerifyDigest}; -use rustls::{Certificate, PrivateKey}; +use rustls::sign::CertifiedKey; use std::{ - io::BufReader, net::{IpAddr, SocketAddr}, path::PathBuf, }; @@ -312,43 +311,34 @@ impl Config { Some((config.addr, config.port).into()) } - pub(crate) fn open_keys(&self) -> Result, PrivateKey)>, Error> { + pub(crate) async fn open_keys(&self) -> Result, Error> { let tls = if let Some(tls) = &self.tls { tls } else { - tracing::warn!("No TLS config present"); + tracing::info!("No TLS config present"); return Ok(None); }; - let mut certs_reader = BufReader::new(std::fs::File::open(&tls.cert)?); - let certs = rustls_pemfile::certs(&mut certs_reader)?; + let certs_bytes = tokio::fs::read(&tls.cert).await?; + let certs = + rustls_pemfile::certs(&mut certs_bytes.as_slice()).collect::, _>>()?; if certs.is_empty() { tracing::warn!("No certs read from certificate file"); return Ok(None); } - let mut key_reader = BufReader::new(std::fs::File::open(&tls.key)?); - let key = rustls_pemfile::read_one(&mut key_reader)?; - - let certs = certs.into_iter().map(Certificate).collect(); - - let key = if let Some(key) = key { - match key { - rustls_pemfile::Item::RSAKey(der) => PrivateKey(der), - rustls_pemfile::Item::PKCS8Key(der) => PrivateKey(der), - rustls_pemfile::Item::ECKey(der) => PrivateKey(der), - _ => { - tracing::warn!("Unknown key format: {:?}", key); - return Ok(None); - } - } + let key_bytes = tokio::fs::read(&tls.key).await?; + let key = if let Some(key) = rustls_pemfile::private_key(&mut key_bytes.as_slice())? { + key } else { tracing::warn!("Failed to read private key"); return Ok(None); }; - Ok(Some((certs, key))) + let key = rustls::crypto::ring::sign::any_supported_type(&key)?; + + Ok(Some(CertifiedKey::new(certs, key))) } pub(crate) fn footer_blurb(&self) -> Option> { diff --git a/src/db.rs b/src/db.rs index edf00c1..ba3b7fb 100644 --- a/src/db.rs +++ b/src/db.rs @@ -750,6 +750,11 @@ mod tests { { let db = Db::build_inner(true, sled::Config::new().temporary(true).open().unwrap()).unwrap(); - actix_rt::System::new().block_on((f)(db)); + + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on((f)(db)); } } diff --git a/src/error.rs b/src/error.rs index e1461db..05d5d1e 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,57 +1,85 @@ use activitystreams::checked::CheckError; -use actix_rt::task::JoinError; use actix_web::{ error::{BlockingError, ResponseError}, http::StatusCode, HttpResponse, }; +use background_jobs::BoxError; +use color_eyre::eyre::Error as Report; use http_signature_normalization_reqwest::SignError; -use std::{convert::Infallible, fmt::Debug, io}; -use tracing_error::SpanTrace; +use std::{convert::Infallible, io, sync::Arc}; +use tokio::task::JoinError; + +#[derive(Clone)] +struct ArcKind { + kind: Arc, +} + +impl std::fmt::Debug for ArcKind { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.kind.fmt(f) + } +} + +impl std::fmt::Display for ArcKind { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.kind.fmt(f) + } +} + +impl std::error::Error for ArcKind { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + self.kind.source() + } +} pub(crate) struct Error { - context: String, - kind: ErrorKind, + kind: ArcKind, + display: Box, + debug: Box, } impl Error { + fn kind(&self) -> &ErrorKind { + &self.kind.kind + } + pub(crate) fn is_breaker(&self) -> bool { - matches!(self.kind, ErrorKind::Breaker) + matches!(self.kind(), ErrorKind::Breaker) } pub(crate) fn is_not_found(&self) -> bool { - matches!(self.kind, ErrorKind::Status(_, StatusCode::NOT_FOUND)) + matches!(self.kind(), ErrorKind::Status(_, StatusCode::NOT_FOUND)) } pub(crate) fn is_bad_request(&self) -> bool { - matches!(self.kind, ErrorKind::Status(_, StatusCode::BAD_REQUEST)) + matches!(self.kind(), ErrorKind::Status(_, StatusCode::BAD_REQUEST)) } pub(crate) fn is_gone(&self) -> bool { - matches!(self.kind, ErrorKind::Status(_, StatusCode::GONE)) + matches!(self.kind(), ErrorKind::Status(_, StatusCode::GONE)) } pub(crate) fn is_malformed_json(&self) -> bool { - matches!(self.kind, ErrorKind::Json(_)) + matches!(self.kind(), ErrorKind::Json(_)) } } impl std::fmt::Debug for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!(f, "{:?}", self.kind) + f.write_str(&self.debug) } } impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!(f, "{}", self.kind)?; - std::fmt::Display::fmt(&self.context, f) + f.write_str(&self.display) } } impl std::error::Error for Error { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - self.kind.source() + self.kind().source() } } @@ -60,25 +88,36 @@ where ErrorKind: From, { fn from(error: T) -> Self { + let kind = ArcKind { + kind: Arc::new(ErrorKind::from(error)), + }; + let report = Report::new(kind.clone()); + let display = format!("{report}"); + let debug = format!("{report:?}"); + Error { - context: SpanTrace::capture().to_string(), - kind: error.into(), + kind, + display: Box::from(display), + debug: Box::from(debug), } } } #[derive(Debug, thiserror::Error)] pub(crate) enum ErrorKind { - #[error("Error queueing job, {0}")] - Queue(anyhow::Error), + #[error("Error in extractor")] + Extractor(#[from] crate::extractors::ErrorKind), - #[error("Error in configuration, {0}")] + #[error("Error queueing job")] + Queue(#[from] BoxError), + + #[error("Error in configuration")] Config(#[from] config::ConfigError), - #[error("Couldn't parse key, {0}")] + #[error("Couldn't parse key")] Pkcs8(#[from] rsa::pkcs8::Error), - #[error("Couldn't encode public key, {0}")] + #[error("Couldn't encode public key")] Spki(#[from] rsa::pkcs8::spki::Error), #[error("Couldn't sign request")] @@ -87,33 +126,36 @@ pub(crate) enum ErrorKind { #[error("Couldn't make request")] Reqwest(#[from] reqwest::Error), - #[error("Couldn't build client")] + #[error("Couldn't make request")] ReqwestMiddleware(#[from] reqwest_middleware::Error), - #[error("Couldn't parse IRI, {0}")] + #[error("Couldn't parse IRI")] ParseIri(#[from] activitystreams::iri_string::validate::Error), - #[error("Couldn't normalize IRI, {0}")] + #[error("Couldn't normalize IRI")] NormalizeIri(#[from] std::collections::TryReserveError), - #[error("Couldn't perform IO, {0}")] + #[error("Couldn't perform IO")] Io(#[from] io::Error), #[error("Couldn't sign string, {0}")] Rsa(rsa::errors::Error), - #[error("Couldn't use db, {0}")] + #[error("Couldn't use db")] Sled(#[from] sled::Error), - #[error("Couldn't do the json thing, {0}")] + #[error("Couldn't do the json thing")] Json(#[from] serde_json::Error), - #[error("Couldn't sign request, {0}")] + #[error("Couldn't sign request")] Sign(#[from] SignError), #[error("Couldn't sign digest")] Signature(#[from] rsa::signature::Error), + #[error("Couldn't prepare TLS private key")] + PrepareKey(#[from] rustls::Error), + #[error("Couldn't verify signature")] VerifySignature, @@ -144,10 +186,10 @@ pub(crate) enum ErrorKind { #[error("Wrong ActivityPub kind, {0}")] Kind(String), - #[error("Too many CPUs, {0}")] + #[error("Too many CPUs")] CpuCount(#[from] std::num::TryFromIntError), - #[error("{0}")] + #[error("Host mismatch")] HostMismatch(#[from] CheckError), #[error("Couldn't flush buffer")] @@ -201,7 +243,7 @@ pub(crate) enum ErrorKind { impl ResponseError for Error { fn status_code(&self) -> StatusCode { - match self.kind { + match self.kind() { ErrorKind::NotAllowed(_) | ErrorKind::WrongActor(_) | ErrorKind::BadActor(_, _) => { StatusCode::FORBIDDEN } @@ -221,7 +263,7 @@ impl ResponseError for Error { .insert_header(("Content-Type", "application/activity+json")) .body( serde_json::to_string(&serde_json::json!({ - "error": self.kind.to_string(), + "error": self.kind().to_string(), })) .unwrap_or_else(|_| "{}".to_string()), ) diff --git a/src/extractors.rs b/src/extractors.rs index 385ce9a..d179906 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -1,19 +1,15 @@ use actix_web::{ dev::Payload, error::ParseError, - http::{ - header::{from_one_raw_str, Header, HeaderName, HeaderValue, TryIntoHeaderValue}, - StatusCode, - }, + http::header::{from_one_raw_str, Header, HeaderName, HeaderValue, TryIntoHeaderValue}, web::Data, - FromRequest, HttpMessage, HttpRequest, HttpResponse, ResponseError, + FromRequest, HttpMessage, HttpRequest, }; use bcrypt::{BcryptError, DEFAULT_COST}; use http_signature_normalization_actix::{prelude::InvalidHeaderValue, Canceled, Spawn}; use std::{convert::Infallible, str::FromStr, time::Instant}; -use tracing_error::SpanTrace; -use crate::{db::Db, future::LocalBoxFuture, spawner::Spawner}; +use crate::{db::Db, error::Error, future::LocalBoxFuture, spawner::Spawner}; #[derive(Clone)] pub(crate) struct AdminConfig { @@ -28,7 +24,7 @@ impl AdminConfig { } fn verify(&self, token: XApiToken) -> Result { - bcrypt::verify(&token.0, &self.hashed_api_token).map_err(Error::bcrypt_verify) + bcrypt::verify(token.0, &self.hashed_api_token).map_err(Error::bcrypt_verify) } } @@ -83,74 +79,42 @@ impl Admin { } } -#[derive(Debug, thiserror::Error)] -#[error("Failed authentication")] -pub(crate) struct Error { - context: String, - #[source] - kind: ErrorKind, -} - impl Error { fn invalid() -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::Invalid, - } + Error::from(ErrorKind::Invalid) } fn missing_config() -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::MissingConfig, - } + Error::from(ErrorKind::MissingConfig) } fn missing_db() -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::MissingDb, - } + Error::from(ErrorKind::MissingDb) } fn missing_spawner() -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::MissingSpawner, - } + Error::from(ErrorKind::MissingSpawner) } fn bcrypt_verify(e: BcryptError) -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::BCryptVerify(e), - } + Error::from(ErrorKind::BCryptVerify(e)) } fn bcrypt_hash(e: BcryptError) -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::BCryptHash(e), - } + Error::from(ErrorKind::BCryptHash(e)) } fn parse_header(e: ParseError) -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::ParseHeader(e), - } + Error::from(ErrorKind::ParseHeader(e)) } fn canceled(_: Canceled) -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::Canceled, - } + Error::from(ErrorKind::Canceled) } } #[derive(Debug, thiserror::Error)] -enum ErrorKind { +pub(crate) enum ErrorKind { #[error("Invalid API Token")] Invalid, @@ -176,20 +140,6 @@ enum ErrorKind { ParseHeader(#[source] ParseError), } -impl ResponseError for Error { - fn status_code(&self) -> StatusCode { - match self.kind { - ErrorKind::Invalid | ErrorKind::ParseHeader(_) => StatusCode::BAD_REQUEST, - _ => StatusCode::INTERNAL_SERVER_ERROR, - } - } - - fn error_response(&self) -> HttpResponse { - HttpResponse::build(self.status_code()) - .json(serde_json::json!({ "msg": self.kind.to_string() })) - } -} - impl FromRequest for Admin { type Error = Error; type Future = LocalBoxFuture<'static, Result>; @@ -200,10 +150,8 @@ impl FromRequest for Admin { Box::pin(async move { let (db, c, s, t) = res?; Self::verify(c, s, t).await?; - metrics::histogram!( - "relay.admin.verify", - now.elapsed().as_micros() as f64 / 1_000_000_f64 - ); + metrics::histogram!("relay.admin.verify") + .record(now.elapsed().as_micros() as f64 / 1_000_000_f64); Ok(Admin { db }) }) } diff --git a/src/future.rs b/src/future.rs index 905a931..4fb7763 100644 --- a/src/future.rs +++ b/src/future.rs @@ -1,3 +1,4 @@ use std::{future::Future, pin::Pin}; pub(crate) type LocalBoxFuture<'a, T> = Pin + 'a>>; +pub(crate) type BoxFuture<'a, T> = Pin + Send + 'a>>; diff --git a/src/jobs.rs b/src/jobs.rs index 6298938..7c19efe 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -19,8 +19,10 @@ use crate::{ jobs::{process_listeners::Listeners, record_last_online::RecordLastOnline}, }; use background_jobs::{ - memory_storage::{ActixTimer, Storage}, - Job, QueueHandle, WorkerConfig, + memory_storage::{Storage, TokioTimer}, + metrics::MetricsStorage, + tokio::{QueueHandle, WorkerConfig}, + Job, }; use std::time::Duration; @@ -43,18 +45,21 @@ pub(crate) fn create_workers( actors: ActorCache, media: MediaCache, config: Config, -) -> JobServer { +) -> std::io::Result { let deliver_concurrency = config.deliver_concurrency(); - let queue_handle = WorkerConfig::new(Storage::new(ActixTimer), move |queue_handle| { - JobState::new( - state.clone(), - actors.clone(), - JobServer::new(queue_handle), - media.clone(), - config.clone(), - ) - }) + let queue_handle = WorkerConfig::new( + MetricsStorage::wrap(Storage::new(TokioTimer)), + move |queue_handle| { + JobState::new( + state.clone(), + actors.clone(), + JobServer::new(queue_handle), + media.clone(), + config.clone(), + ) + }, + ) .register::() .register::() .register::() @@ -70,12 +75,12 @@ pub(crate) fn create_workers( .set_worker_count("maintenance", 2) .set_worker_count("apub", 2) .set_worker_count("deliver", deliver_concurrency) - .start(); + .start()?; - queue_handle.every(Duration::from_secs(60 * 5), Listeners); - queue_handle.every(Duration::from_secs(60 * 10), RecordLastOnline); + queue_handle.every(Duration::from_secs(60 * 5), Listeners)?; + queue_handle.every(Duration::from_secs(60 * 10), RecordLastOnline)?; - JobServer::new(queue_handle) + Ok(JobServer::new(queue_handle)) } #[derive(Clone, Debug)] diff --git a/src/jobs/apub/announce.rs b/src/jobs/apub/announce.rs index 480f8db..73bc508 100644 --- a/src/jobs/apub/announce.rs +++ b/src/jobs/apub/announce.rs @@ -2,14 +2,14 @@ use crate::{ config::{Config, UrlKind}, db::Actor, error::Error, + future::BoxFuture, jobs::{ apub::{get_inboxes, prepare_activity}, DeliverMany, JobState, }, }; use activitystreams::{activity::Announce as AsAnnounce, iri_string::types::IriString}; -use background_jobs::ActixJob; -use std::{future::Future, pin::Pin}; +use background_jobs::Job; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct Announce { @@ -62,14 +62,15 @@ fn generate_announce( ) } -impl ActixJob for Announce { +impl Job for Announce { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::apub::Announce"; const QUEUE: &'static str = "apub"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/apub/follow.rs b/src/jobs/apub/follow.rs index 10cae22..2b38bfb 100644 --- a/src/jobs/apub/follow.rs +++ b/src/jobs/apub/follow.rs @@ -3,6 +3,7 @@ use crate::{ config::{Config, UrlKind}, db::Actor, error::{Error, ErrorKind}, + future::BoxFuture, jobs::{apub::prepare_activity, Deliver, JobState, QueryInstance, QueryNodeinfo}, }; use activitystreams::{ @@ -10,8 +11,7 @@ use activitystreams::{ iri_string::types::IriString, prelude::*, }; -use background_jobs::ActixJob; -use std::{future::Future, pin::Pin}; +use background_jobs::Job; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct Follow { @@ -111,14 +111,15 @@ fn generate_accept_follow( ) } -impl ActixJob for Follow { +impl Job for Follow { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::apub::Follow"; const QUEUE: &'static str = "apub"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/apub/forward.rs b/src/jobs/apub/forward.rs index f5e191b..0640ba2 100644 --- a/src/jobs/apub/forward.rs +++ b/src/jobs/apub/forward.rs @@ -2,11 +2,11 @@ use crate::{ apub::AcceptedActivities, db::Actor, error::{Error, ErrorKind}, + future::BoxFuture, jobs::{apub::get_inboxes, DeliverMany, JobState}, }; use activitystreams::prelude::*; -use background_jobs::ActixJob; -use std::{future::Future, pin::Pin}; +use background_jobs::Job; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct Forward { @@ -47,14 +47,15 @@ impl Forward { } } -impl ActixJob for Forward { +impl Job for Forward { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::apub::Forward"; const QUEUE: &'static str = "apub"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/apub/reject.rs b/src/jobs/apub/reject.rs index 2384426..d1d23db 100644 --- a/src/jobs/apub/reject.rs +++ b/src/jobs/apub/reject.rs @@ -2,10 +2,10 @@ use crate::{ config::UrlKind, db::Actor, error::Error, + future::BoxFuture, jobs::{apub::generate_undo_follow, Deliver, JobState}, }; -use background_jobs::ActixJob; -use std::{future::Future, pin::Pin}; +use background_jobs::Job; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct Reject(pub(crate) Actor); @@ -33,14 +33,15 @@ impl Reject { } } -impl ActixJob for Reject { +impl Job for Reject { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::apub::Reject"; const QUEUE: &'static str = "apub"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/apub/undo.rs b/src/jobs/apub/undo.rs index b55d4ae..31c8797 100644 --- a/src/jobs/apub/undo.rs +++ b/src/jobs/apub/undo.rs @@ -3,11 +3,11 @@ use crate::{ config::UrlKind, db::Actor, error::Error, + future::BoxFuture, jobs::{apub::generate_undo_follow, Deliver, JobState}, }; use activitystreams::prelude::BaseExt; -use background_jobs::ActixJob; -use std::{future::Future, pin::Pin}; +use background_jobs::Job; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct Undo { @@ -48,14 +48,15 @@ impl Undo { } } -impl ActixJob for Undo { +impl Job for Undo { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::apub::Undo"; const QUEUE: &'static str = "apub"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/contact.rs b/src/jobs/contact.rs index c3c3765..5213ca6 100644 --- a/src/jobs/contact.rs +++ b/src/jobs/contact.rs @@ -1,12 +1,12 @@ use crate::{ apub::AcceptedActors, error::{Error, ErrorKind}, + future::BoxFuture, jobs::JobState, requests::BreakerStrategy, }; use activitystreams::{iri_string::types::IriString, object::Image, prelude::*}; -use background_jobs::ActixJob; -use std::{future::Future, pin::Pin}; +use background_jobs::Job; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct QueryContact { @@ -85,15 +85,16 @@ fn to_contact(contact: AcceptedActors) -> Option<(String, String, IriString, Iri Some((username, display_name, url, avatar)) } -impl ActixJob for QueryContact { +impl Job for QueryContact { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::QueryContact"; const QUEUE: &'static str = "maintenance"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/deliver.rs b/src/jobs/deliver.rs index 0f936e4..89c84d4 100644 --- a/src/jobs/deliver.rs +++ b/src/jobs/deliver.rs @@ -1,11 +1,11 @@ use crate::{ error::Error, + future::BoxFuture, jobs::{debug_object, JobState}, requests::BreakerStrategy, }; use activitystreams::iri_string::types::IriString; -use background_jobs::{ActixJob, Backoff}; -use std::{future::Future, pin::Pin}; +use background_jobs::{Backoff, Job}; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct Deliver { @@ -35,7 +35,7 @@ impl Deliver { } #[tracing::instrument(name = "Deliver", skip(state))] - async fn permform(self, state: JobState) -> Result<(), Error> { + async fn perform(self, state: JobState) -> Result<(), Error> { if let Err(e) = state .state .requests @@ -56,15 +56,16 @@ impl Deliver { } } -impl ActixJob for Deliver { +impl Job for Deliver { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::Deliver"; const QUEUE: &'static str = "deliver"; const BACKOFF: Backoff = Backoff::Exponential(8); fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.permform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/deliver_many.rs b/src/jobs/deliver_many.rs index f932a12..8e063fe 100644 --- a/src/jobs/deliver_many.rs +++ b/src/jobs/deliver_many.rs @@ -1,10 +1,10 @@ use crate::{ error::Error, - future::LocalBoxFuture, + future::BoxFuture, jobs::{debug_object, Deliver, JobState}, }; use activitystreams::iri_string::types::IriString; -use background_jobs::ActixJob; +use background_jobs::Job; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct DeliverMany { @@ -45,14 +45,15 @@ impl DeliverMany { } } -impl ActixJob for DeliverMany { +impl Job for DeliverMany { type State = JobState; - type Future = LocalBoxFuture<'static, Result<(), anyhow::Error>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::DeliverMany"; const QUEUE: &'static str = "deliver"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/instance.rs b/src/jobs/instance.rs index a0f3da1..a892fbb 100644 --- a/src/jobs/instance.rs +++ b/src/jobs/instance.rs @@ -1,12 +1,12 @@ use crate::{ config::UrlKind, error::{Error, ErrorKind}, + future::BoxFuture, jobs::{Boolish, JobState}, requests::BreakerStrategy, }; use activitystreams::{iri, iri_string::types::IriString}; -use background_jobs::ActixJob; -use std::{future::Future, pin::Pin}; +use background_jobs::Job; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct QueryInstance { @@ -165,15 +165,16 @@ impl QueryInstance { } } -impl ActixJob for QueryInstance { +impl Job for QueryInstance { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::QueryInstance"; const QUEUE: &'static str = "maintenance"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/nodeinfo.rs b/src/jobs/nodeinfo.rs index f9d78a3..ce6a326 100644 --- a/src/jobs/nodeinfo.rs +++ b/src/jobs/nodeinfo.rs @@ -1,18 +1,18 @@ use crate::{ error::{Error, ErrorKind}, + future::BoxFuture, jobs::{Boolish, JobState, QueryContact}, requests::BreakerStrategy, }; use activitystreams::{iri, iri_string::types::IriString, primitives::OneOrMany}; -use background_jobs::ActixJob; -use std::{fmt::Debug, future::Future, pin::Pin}; +use background_jobs::Job; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct QueryNodeinfo { actor_id: IriString, } -impl Debug for QueryNodeinfo { +impl std::fmt::Debug for QueryNodeinfo { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("QueryNodeinfo") .field("actor_id", &self.actor_id.to_string()) @@ -92,7 +92,7 @@ impl QueryNodeinfo { .metadata .and_then(|meta| meta.into_iter().next().and_then(|meta| meta.staff_accounts)) { - if let Some(contact_id) = accounts.get(0) { + if let Some(contact_id) = accounts.first() { state .job_server .queue(QueryContact::new(self.actor_id, contact_id.clone())) @@ -104,15 +104,16 @@ impl QueryNodeinfo { } } -impl ActixJob for QueryNodeinfo { +impl Job for QueryNodeinfo { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::QueryNodeinfo"; const QUEUE: &'static str = "maintenance"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/process_listeners.rs b/src/jobs/process_listeners.rs index 1cad2e4..00f61a1 100644 --- a/src/jobs/process_listeners.rs +++ b/src/jobs/process_listeners.rs @@ -1,9 +1,9 @@ use crate::{ error::Error, + future::BoxFuture, jobs::{instance::QueryInstance, nodeinfo::QueryNodeinfo, JobState}, }; -use background_jobs::ActixJob; -use std::{future::Future, pin::Pin}; +use background_jobs::Job; #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] pub(crate) struct Listeners; @@ -23,14 +23,15 @@ impl Listeners { } } -impl ActixJob for Listeners { +impl Job for Listeners { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::Listeners"; const QUEUE: &'static str = "maintenance"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/record_last_online.rs b/src/jobs/record_last_online.rs index 3c81b31..afaac74 100644 --- a/src/jobs/record_last_online.rs +++ b/src/jobs/record_last_online.rs @@ -1,6 +1,5 @@ -use crate::{error::Error, jobs::JobState}; -use background_jobs::{ActixJob, Backoff}; -use std::{future::Future, pin::Pin}; +use crate::{error::Error, future::BoxFuture, jobs::JobState}; +use background_jobs::{Backoff, Job}; #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] pub(crate) struct RecordLastOnline; @@ -14,15 +13,16 @@ impl RecordLastOnline { } } -impl ActixJob for RecordLastOnline { +impl Job for RecordLastOnline { type State = JobState; - type Future = Pin>>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::RecordLastOnline"; const QUEUE: &'static str = "maintenance"; const BACKOFF: Backoff = Backoff::Linear(1); fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/main.rs b/src/main.rs index 0373afb..3bd94ad 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,6 @@ use std::time::Duration; use activitystreams::iri_string::types::IriString; -use actix_rt::task::JoinHandle; use actix_web::{middleware::Compress, web, App, HttpServer}; use collector::MemoryCollector; #[cfg(feature = "console")] @@ -13,14 +12,16 @@ use error::Error; use http_signature_normalization_actix::middleware::VerifySignature; use metrics_exporter_prometheus::PrometheusBuilder; use metrics_util::layers::FanoutBuilder; -use opentelemetry::{sdk::Resource, KeyValue}; +use opentelemetry::KeyValue; use opentelemetry_otlp::WithExportConfig; +use opentelemetry_sdk::Resource; use reqwest_middleware::ClientWithMiddleware; use rustls::ServerConfig; +use tokio::task::JoinHandle; use tracing_actix_web::TracingLogger; use tracing_error::ErrorLayer; use tracing_log::LogTracer; -use tracing_subscriber::{filter::Targets, fmt::format::FmtSpan, layer::SubscriberExt, Layer}; +use tracing_subscriber::{filter::Targets, layer::SubscriberExt, Layer}; mod admin; mod apub; @@ -55,16 +56,15 @@ use self::{ fn init_subscriber( software_name: &'static str, opentelemetry_url: Option<&IriString>, -) -> Result<(), anyhow::Error> { +) -> color_eyre::Result<()> { LogTracer::init()?; + color_eyre::install()?; let targets: Targets = std::env::var("RUST_LOG") - .unwrap_or_else(|_| "warn,actix_web=debug,actix_server=debug,tracing_actix_web=info".into()) + .unwrap_or_else(|_| "info".into()) .parse()?; - let format_layer = tracing_subscriber::fmt::layer() - .with_span_events(FmtSpan::NEW | FmtSpan::CLOSE) - .with_filter(targets.clone()); + let format_layer = tracing_subscriber::fmt::layer().with_filter(targets.clone()); #[cfg(feature = "console")] let console_layer = ConsoleLayer::builder() @@ -81,18 +81,19 @@ fn init_subscriber( let subscriber = subscriber.with(console_layer); if let Some(url) = opentelemetry_url { - let tracer = - opentelemetry_otlp::new_pipeline() - .tracing() - .with_trace_config(opentelemetry::sdk::trace::config().with_resource( - Resource::new(vec![KeyValue::new("service.name", software_name)]), - )) - .with_exporter( - opentelemetry_otlp::new_exporter() - .tonic() - .with_endpoint(url.as_str()), - ) - .install_batch(opentelemetry::runtime::Tokio)?; + let tracer = opentelemetry_otlp::new_pipeline() + .tracing() + .with_trace_config( + opentelemetry_sdk::trace::config().with_resource(Resource::new(vec![ + KeyValue::new("service.name", software_name), + ])), + ) + .with_exporter( + opentelemetry_otlp::new_exporter() + .tonic() + .with_endpoint(url.as_str()), + ) + .install_batch(opentelemetry_sdk::runtime::Tokio)?; let otel_layer = tracing_opentelemetry::layer() .with_tracer(tracer) @@ -139,8 +140,8 @@ fn build_client( Ok(client_with_middleware) } -#[actix_rt::main] -async fn main() -> Result<(), anyhow::Error> { +#[tokio::main] +async fn main() -> color_eyre::Result<()> { dotenv::dotenv().ok(); let config = Config::build()?; @@ -150,7 +151,8 @@ async fn main() -> Result<(), anyhow::Error> { let args = Args::new(); if args.any() { - return client_main(config, args).await?; + client_main(config, args).await??; + return Ok(()); } let collector = MemoryCollector::new(); @@ -160,35 +162,35 @@ async fn main() -> Result<(), anyhow::Error> { .with_http_listener(bind_addr) .build()?; - actix_rt::spawn(exporter); + tokio::spawn(exporter); let recorder = FanoutBuilder::default() .add_recorder(recorder) .add_recorder(collector.clone()) .build(); - metrics::set_boxed_recorder(Box::new(recorder))?; + metrics::set_global_recorder(recorder).map_err(|e| color_eyre::eyre::eyre!("{e}"))?; } else { collector.install()?; } - tracing::warn!("Opening DB"); + tracing::info!("Opening DB"); let db = Db::build(&config)?; - tracing::warn!("Building caches"); + tracing::info!("Building caches"); let actors = ActorCache::new(db.clone()); let media = MediaCache::new(db.clone()); - server_main(db, actors, media, collector, config).await??; + server_main(db, actors, media, collector, config).await?; - tracing::warn!("Application exit"); + tracing::info!("Application exit"); Ok(()) } -fn client_main(config: Config, args: Args) -> JoinHandle> { - actix_rt::spawn(do_client_main(config, args)) +fn client_main(config: Config, args: Args) -> JoinHandle> { + tokio::spawn(do_client_main(config, args)) } -async fn do_client_main(config: Config, args: Args) -> Result<(), anyhow::Error> { +async fn do_client_main(config: Config, args: Args) -> color_eyre::Result<()> { let client = build_client( &config.user_agent(), config.client_timeout(), @@ -271,32 +273,22 @@ async fn do_client_main(config: Config, args: Args) -> Result<(), anyhow::Error> Ok(()) } -fn server_main( - db: Db, - actors: ActorCache, - media: MediaCache, - collector: MemoryCollector, - config: Config, -) -> JoinHandle> { - actix_rt::spawn(do_server_main(db, actors, media, collector, config)) -} - const VERIFY_RATIO: usize = 7; -async fn do_server_main( +async fn server_main( db: Db, actors: ActorCache, media: MediaCache, collector: MemoryCollector, config: Config, -) -> Result<(), anyhow::Error> { +) -> color_eyre::Result<()> { let client = build_client( &config.user_agent(), config.client_timeout(), config.proxy_config(), )?; - tracing::warn!("Creating state"); + tracing::info!("Creating state"); let (signature_threads, verify_threads) = match config.signature_threads() { 0 | 1 => (1, 1), @@ -309,23 +301,30 @@ async fn do_server_main( } }; - let verify_spawner = Spawner::build("verify-cpu", verify_threads)?; - let sign_spawner = Spawner::build("sign-cpu", signature_threads)?; + let verify_spawner = Spawner::build("verify-cpu", verify_threads.try_into()?)?; + let sign_spawner = Spawner::build("sign-cpu", signature_threads.try_into()?)?; let key_id = config.generate_url(UrlKind::MainKey).to_string(); - let state = State::build(db.clone(), key_id, sign_spawner, client).await?; + let state = State::build(db.clone(), key_id, sign_spawner.clone(), client).await?; if let Some((token, admin_handle)) = config.telegram_info() { - tracing::warn!("Creating telegram handler"); + tracing::info!("Creating telegram handler"); telegram::start(admin_handle.to_owned(), db.clone(), token); } - let keys = config.open_keys()?; + let cert_resolver = config + .open_keys() + .await? + .map(rustls_channel_resolver::channel::<32>); let bind_address = config.bind_address(); + let sign_spawner2 = sign_spawner.clone(); + let verify_spawner2 = verify_spawner.clone(); + let config2 = config.clone(); let server = HttpServer::new(move || { let job_server = - create_workers(state.clone(), actors.clone(), media.clone(), config.clone()); + create_workers(state.clone(), actors.clone(), media.clone(), config.clone()) + .expect("Failed to create job server"); let app = App::new() .app_data(web::Data::new(db.clone())) @@ -391,24 +390,42 @@ async fn do_server_main( ) }); - if let Some((certs, key)) = keys { - tracing::warn!("Binding to {}:{} with TLS", bind_address.0, bind_address.1); + if let Some((cert_tx, cert_rx)) = cert_resolver { + let handle = tokio::spawn(async move { + let mut interval = tokio::time::interval(Duration::from_secs(30)); + interval.tick().await; + + loop { + interval.tick().await; + + match config2.open_keys().await { + Ok(Some(key)) => cert_tx.update(key), + Ok(None) => tracing::warn!("Missing TLS keys"), + Err(e) => tracing::error!("Failed to read TLS keys {e}"), + } + } + }); + + tracing::info!("Binding to {}:{} with TLS", bind_address.0, bind_address.1); let server_config = ServerConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions()? .with_no_client_auth() - .with_single_cert(certs, key)?; + .with_cert_resolver(cert_rx); server - .bind_rustls_021(bind_address, server_config)? + .bind_rustls_0_22(bind_address, server_config)? .run() .await?; + + handle.abort(); + let _ = handle.await; } else { - tracing::warn!("Binding to {}:{}", bind_address.0, bind_address.1); + tracing::info!("Binding to {}:{}", bind_address.0, bind_address.1); server.bind(bind_address)?.run().await?; } - tracing::warn!("Server closed"); + sign_spawner2.close().await; + verify_spawner2.close().await; + + tracing::info!("Server closed"); Ok(()) } diff --git a/src/middleware/timings.rs b/src/middleware/timings.rs index a311a75..4394a48 100644 --- a/src/middleware/timings.rs +++ b/src/middleware/timings.rs @@ -40,7 +40,7 @@ impl Drop for LogOnDrop { fn drop(&mut self) { if self.arm { let duration = self.begin.elapsed(); - metrics::histogram!("relay.request.complete", duration, "path" => self.path.clone(), "method" => self.method.clone()); + metrics::histogram!("relay.request.complete", "path" => self.path.clone(), "method" => self.method.clone()).record(duration); } } } diff --git a/src/requests.rs b/src/requests.rs index 08c1002..60cc9af 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -432,7 +432,7 @@ struct Signer { impl Signer { fn sign(&self, signing_string: &str) -> Result { - let mut signature = vec![0; self.private_key.public_modulus_len()]; + let mut signature = vec![0; self.private_key.public().modulus_len()]; self.private_key .sign( diff --git a/src/routes/index.rs b/src/routes/index.rs index 7c94759..0448208 100644 --- a/src/routes/index.rs +++ b/src/routes/index.rs @@ -14,10 +14,11 @@ const MINIFY_CONFIG: minify_html::Cfg = minify_html::Cfg { keep_html_and_head_opening_tags: false, keep_spaces_between_attributes: true, keep_comments: false, + keep_input_type_text_attr: true, + keep_ssi_comments: false, + preserve_brace_template_syntax: false, + preserve_chevron_percent_template_syntax: false, minify_css: true, - minify_css_level_1: true, - minify_css_level_2: false, - minify_css_level_3: false, minify_js: true, remove_bangs: true, remove_processing_instructions: true, diff --git a/src/spawner.rs b/src/spawner.rs index 3b611d7..8065022 100644 --- a/src/spawner.rs +++ b/src/spawner.rs @@ -1,107 +1,30 @@ +use async_cpupool::CpuPool; use http_signature_normalization_actix::{Canceled, Spawn}; -use std::{ - panic::AssertUnwindSafe, - sync::Arc, - thread::JoinHandle, - time::{Duration, Instant}, -}; +use std::time::Duration; -fn spawner_thread( - receiver: flume::Receiver>, - name: &'static str, - id: usize, -) { - let guard = MetricsGuard::guard(name, id); - - while let Ok(f) = receiver.recv() { - let start = Instant::now(); - metrics::increment_counter!(format!("relay.{name}.operation.start"), "id" => id.to_string()); - let res = std::panic::catch_unwind(AssertUnwindSafe(f)); - metrics::increment_counter!(format!("relay.{name}.operation.end"), "complete" => res.is_ok().to_string(), "id" => id.to_string()); - metrics::histogram!(format!("relay.{name}.operation.duration"), start.elapsed().as_secs_f64(), "complete" => res.is_ok().to_string(), "id" => id.to_string()); - - if let Err(e) = res { - tracing::warn!("{name} fn panicked: {e:?}"); - } - } - - guard.disarm(); -} - -#[derive(Clone, Debug)] +#[derive(Clone)] pub(crate) struct Spawner { - name: &'static str, - sender: Option>>, - threads: Option>>>, -} - -struct MetricsGuard { - name: &'static str, - id: usize, - start: Instant, - armed: bool, -} - -impl MetricsGuard { - fn guard(name: &'static str, id: usize) -> Self { - metrics::increment_counter!(format!("relay.{name}.launched"), "id" => id.to_string()); - - Self { - name, - id, - start: Instant::now(), - armed: true, - } - } - - fn disarm(mut self) { - self.armed = false; - } -} - -impl Drop for MetricsGuard { - fn drop(&mut self) { - metrics::increment_counter!(format!("relay.{}.closed", self.name), "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); - metrics::histogram!(format!("relay.{}.duration", self.name), self.start.elapsed().as_secs_f64(), "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); - tracing::warn!("Stopping {} - {}", self.name, self.id); - } + pool: CpuPool, } impl Spawner { - pub(crate) fn build(name: &'static str, threads: usize) -> std::io::Result { - let (sender, receiver) = flume::bounded(8); + pub(crate) fn build(name: &'static str, threads: u16) -> color_eyre::Result { + let pool = CpuPool::configure() + .name(name) + .max_threads(threads) + .build()?; - tracing::warn!("Launching {threads} {name}s"); + Ok(Spawner { pool }) + } - let threads = (0..threads) - .map(|i| { - let receiver = receiver.clone(); - std::thread::Builder::new() - .name(format!("{name}-{i}")) - .spawn(move || { - spawner_thread(receiver, name, i); - }) - }) - .collect::, _>>()?; - - Ok(Spawner { - name, - sender: Some(sender), - threads: Some(Arc::new(threads)), - }) + pub(crate) async fn close(self) { + self.pool.close().await; } } -impl Drop for Spawner { - fn drop(&mut self) { - self.sender.take(); - - if let Some(threads) = self.threads.take().and_then(Arc::into_inner) { - tracing::warn!("Joining {}s", self.name); - for thread in threads { - let _ = thread.join(); - } - } +impl std::fmt::Debug for Spawner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Spawner").finish() } } @@ -111,9 +34,9 @@ where { let id = uuid::Uuid::new_v4(); - metrics::increment_counter!("relay.spawner.wait-timer.start"); + metrics::counter!("relay.spawner.wait-timer.start").increment(1); - let mut interval = actix_rt::time::interval(Duration::from_secs(5)); + let mut interval = tokio::time::interval(Duration::from_secs(5)); // pass the first tick (instant) interval.tick().await; @@ -124,12 +47,12 @@ where loop { tokio::select! { out = &mut fut => { - metrics::increment_counter!("relay.spawner.wait-timer.end"); + metrics::counter!("relay.spawner.wait-timer.end").increment(1); return out; } _ = interval.tick() => { counter += 1; - metrics::increment_counter!("relay.spawner.wait-timer.pending"); + metrics::counter!("relay.spawner.wait-timer.pending").increment(1); tracing::warn!("Blocking operation {id} is taking a long time, {} seconds", counter * 5); } } @@ -144,22 +67,9 @@ impl Spawn for Spawner { Func: FnOnce() -> Out + Send + 'static, Out: Send + 'static, { - let sender = self.sender.as_ref().expect("Sender exists").clone(); + let pool = self.pool.clone(); - Box::pin(async move { - let (tx, rx) = flume::bounded(1); - - let _ = sender - .send_async(Box::new(move || { - if tx.try_send((func)()).is_err() { - tracing::warn!("Requestor hung up"); - metrics::increment_counter!("relay.spawner.disconnected"); - } - })) - .await; - - timer(rx.recv_async()).await.map_err(|_| Canceled) - }) + Box::pin(async move { timer(pool.spawn(func)).await.map_err(|_| Canceled) }) } } @@ -171,21 +81,10 @@ impl http_signature_normalization_reqwest::Spawn for Spawner { Func: FnOnce() -> Out + Send + 'static, Out: Send + 'static, { - let sender = self.sender.as_ref().expect("Sender exists").clone(); + let pool = self.pool.clone(); Box::pin(async move { - let (tx, rx) = flume::bounded(1); - - let _ = sender - .send_async(Box::new(move || { - if tx.try_send((func)()).is_err() { - tracing::warn!("Requestor hung up"); - metrics::increment_counter!("relay.spawner.disconnected"); - } - })) - .await; - - timer(rx.recv_async()) + timer(pool.spawn(func)) .await .map_err(|_| http_signature_normalization_reqwest::Canceled) }) diff --git a/src/telegram.rs b/src/telegram.rs index f3cce43..9a80edc 100644 --- a/src/telegram.rs +++ b/src/telegram.rs @@ -46,7 +46,7 @@ pub(crate) fn start(admin_handle: String, db: Db, token: &str) { let bot = Bot::new(token); let admin_handle = Arc::new(admin_handle); - actix_rt::spawn(async move { + tokio::spawn(async move { let command_handler = teloxide::filter_command::().endpoint( move |bot: Bot, msg: Message, cmd: Command| { let admin_handle = admin_handle.clone();