diff --git a/.github/workflows/stats.yml b/.github/workflows/stats.yml index cc4c2427a..7e820f861 100644 --- a/.github/workflows/stats.yml +++ b/.github/workflows/stats.yml @@ -37,6 +37,7 @@ jobs: --health-interval 10s --health-timeout 5s --health-retries 5 + --name postgres ports: - 5432:5432 steps: @@ -48,26 +49,50 @@ jobs: with: working-directory: stats - - name: Unit tests - run: RUST_BACKTRACE=1 RUST_LOG=info cargo test --locked --workspace --all-features --lib --bins -- --nocapture - if: success() || failure() + # temporary fix for failing tests + - name: Set postgres max_connections + run: | + psql -h localhost -p 5432 -c "ALTER SYSTEM SET max_connections = 500;" -d postgres + env: + PGPASSWORD: admin + PGUSER: postgres - - name: Doc tests - run: cargo test --locked --workspace --all-features --doc - if: success() || failure() + - name: Restart postgres + # Restart Postgres so that new system parameters to be applied + uses: docker://docker + with: + args: docker restart postgres + + - name: Build + id: build + run: RUST_BACKTRACE=1 cargo test --no-run --locked --workspace --all-features - name: ENVs in documentation run: cargo run --bin env-docs-generation env: VALIDATE_ONLY: true + - name: DB tests temp + run: RUST_BACKTRACE=1 RUST_LOG=warn cargo test --locked --package stats-server -- --nocapture --ignored --test-threads=1 + if: steps.build.outcome == 'success' + env: + DATABASE_URL: postgres://postgres:admin@localhost:5432/ + + - name: Unit tests + run: RUST_BACKTRACE=1 RUST_LOG=info cargo test --locked --workspace --all-features --lib --bins -- --nocapture + if: steps.build.outcome == 'success' + + - name: Doc tests + run: cargo test --locked --workspace --all-features --doc + if: steps.build.outcome == 'success' + - name: Integration tests run: RUST_BACKTRACE=1 RUST_LOG=info cargo test --locked --workspace --test '*' -- --nocapture - if: success() || failure() + if: steps.build.outcome == 'success' - name: DB tests - run: RUST_BACKTRACE=1 cargo test --locked --workspace -- --nocapture --ignored - if: success() || failure() + run: RUST_BACKTRACE=1 RUST_LOG=warn cargo test --locked --workspace -- --nocapture --ignored + if: steps.build.outcome == 'success' env: DATABASE_URL: postgres://postgres:admin@localhost:5432/ diff --git a/stats/Cargo.lock b/stats/Cargo.lock index 6504e2064..9c41dc61c 100644 --- a/stats/Cargo.lock +++ b/stats/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.8.0", "bytes", "futures-core", "futures-sink", @@ -21,9 +21,9 @@ dependencies = [ [[package]] name = "actix-cors" -version = "0.6.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0346d8c1f762b41b458ed3145eea914966bb9ad20b9be0d6d463b20d45586370" +checksum = "f9e772b3bcafe335042b5db010ab7c09013dad6eac4915c91d8d50902769f331" dependencies = [ "actix-utils", "actix-web", @@ -44,7 +44,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "bitflags 2.5.0", + "bitflags 2.8.0", "bytes", "derive_more", "futures-core", @@ -59,9 +59,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.7.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb9843d84c775696c37d9a418bbb01b932629d01870722c0f13eb3f95e2536d" +checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" dependencies = [ "actix-codec", "actix-rt", @@ -69,7 +69,7 @@ dependencies = [ "actix-utils", "ahash 0.8.11", "base64 0.22.1", - "bitflags 2.5.0", + "bitflags 2.8.0", "brotli", "bytes", "bytestring", @@ -103,46 +103,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "actix-prost" version = "0.1.0" -source = "git+https://github.com/blockscout/actix-prost#9cc47aa1cb7b63ce1cb814912b71188579647241" +source = "git+https://github.com/blockscout/actix-prost?rev=82c79b6#82c79b6117f4b01b6b8320365176691c03318c9e" dependencies = [ "actix-http", "actix-web", - "http 0.2.12", - "prost 0.11.9", + "http 1.2.0", + "prost", "serde", "serde_json", - "serde_with 2.3.3", + "serde_with", "tonic", ] [[package]] name = "actix-prost-build" version = "0.1.0" -source = "git+https://github.com/blockscout/actix-prost#9cc47aa1cb7b63ce1cb814912b71188579647241" +source = "git+https://github.com/blockscout/actix-prost?rev=82c79b6#82c79b6117f4b01b6b8320365176691c03318c9e" dependencies = [ - "prettyplease 0.2.20", + "prettyplease", "proc-macro2", "prost-build", "prost-reflect", "quote", "serde", "serde_yaml", - "syn 2.0.79", - "thiserror", + "syn 2.0.98", + "thiserror 2.0.11", ] [[package]] name = "actix-prost-macros" version = "0.1.0" -source = "git+https://github.com/blockscout/actix-prost#9cc47aa1cb7b63ce1cb814912b71188579647241" +source = "git+https://github.com/blockscout/actix-prost?rev=82c79b6#82c79b6117f4b01b6b8320365176691c03318c9e" dependencies = [ - "proc-macro2", "quote", "syn 1.0.109", ] @@ -164,9 +163,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" dependencies = [ "futures-core", "tokio", @@ -174,9 +173,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" +checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894" dependencies = [ "actix-rt", "actix-service", @@ -184,7 +183,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2 0.5.7", + "socket2", "tokio", "tracing", ] @@ -212,9 +211,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.6.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cf67dadb19d7c95e5a299e2dda24193b89d5d4f33a3b9800888ede9e19aa32" +checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" dependencies = [ "actix-codec", "actix-http", @@ -234,6 +233,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", + "impl-more", "itoa", "language-tags", "log", @@ -246,21 +246,21 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.5.7", + "socket2", "time", "url", ] [[package]] name = "actix-web-codegen" -version = "4.2.2" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -277,18 +277,18 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" @@ -296,7 +296,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", ] @@ -308,7 +308,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -346,9 +346,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -367,9 +367,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -382,43 +382,44 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "once_cell", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "anymap2" @@ -426,11 +427,17 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "assert-json-diff" @@ -477,14 +484,14 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.1.0", - "futures-lite 2.3.0", + "fastrand", + "futures-lite", "slab", ] @@ -496,60 +503,31 @@ checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ "async-channel 2.3.1", "async-executor", - "async-io 2.3.3", - "async-lock 3.4.0", + "async-io", + "async-lock", "blocking", - "futures-lite 2.3.0", + "futures-lite", "once_cell", "tokio", ] [[package]] name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock 2.8.0", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite 1.13.0", - "log", - "parking", - "polling 2.8.0", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", -] - -[[package]] -name = "async-io" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ - "async-lock 3.4.0", + "async-lock", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.3.0", + "futures-lite", "parking", - "polling 3.7.1", - "rustix 0.38.34", + "polling", + "rustix", "slab", "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", + "windows-sys 0.59.0", ] [[package]] @@ -558,27 +536,27 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "event-listener-strategy", "pin-project-lite", ] [[package]] name = "async-std" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" dependencies = [ "async-attributes", "async-channel 1.9.0", "async-global-executor", - "async-io 1.13.0", - "async-lock 2.8.0", + "async-io", + "async-lock", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite 1.13.0", + "futures-lite", "gloo-timers", "kv-log-macro", "log", @@ -592,9 +570,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -603,13 +581,13 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -620,13 +598,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -646,24 +624,23 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.6.20" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", - "bitflags 1.3.2", "bytes", "futures-util", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.29", + "http 1.2.0", + "http-body", + "http-body-util", "itoa", "matchit", "memchr", @@ -672,42 +649,45 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper 0.1.2", - "tower", + "sync_wrapper", + "tower 0.5.2", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.3.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", "futures-util", - "http 0.2.12", - "http-body 0.4.6", + "http 1.2.0", + "http-body", + "http-body-util", "mime", + "pin-project-lite", "rustversion", + "sync_wrapper", "tower-layer", "tower-service", ] [[package]] name = "backtrace" -version = "0.3.72" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -753,9 +733,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" dependencies = [ "serde", ] @@ -790,22 +770,22 @@ dependencies = [ "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite", "piper", ] [[package]] name = "blockscout-client" version = "0.1.1" -source = "git+https://github.com/blockscout/blockscout-rs/?rev=506b821#506b8219d6cb8be69e1ed373759b66e8d566c89d" +source = "git+https://github.com/blockscout/blockscout-rs/?rev=d02877c#d02877c4ef3d88a7cf29a33e3a1e9a48cb087303" dependencies = [ "derive-new", - "reqwest 0.12.5", + "reqwest", "reqwest-middleware", "reqwest-retry", "serde", "serde_json_path_to_error", - "serde_with 3.9.0", + "serde_with", "url", "uuid", ] @@ -852,9 +832,8 @@ source = "git+https://github.com/blockscout/blockscout-rs?rev=980634e#980634e7ad [[package]] name = "blockscout-service-launcher" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e45f89da573b06db372454bdabe7fd3efb96ce12a1d27fffe042ef032177be" +version = "0.17.0" +source = "git+https://github.com/blockscout/blockscout-rs/?rev=3908e8bf#3908e8bfb86a66a26240d001e172f1ba7970cb87" dependencies = [ "actix-cors", "actix-web", @@ -869,12 +848,12 @@ dependencies = [ "opentelemetry", "opentelemetry-jaeger", "prometheus", - "reqwest 0.11.27", + "reqwest", "sea-orm", "sea-orm-migration", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "tokio", "tonic", "tracing", @@ -899,9 +878,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.1" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" dependencies = [ "borsh-derive", "cfg_aliases", @@ -909,16 +888,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.1" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.79", - "syn_derive", + "syn 2.0.98", ] [[package]] @@ -934,9 +912,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.1" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -944,9 +922,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytecheck" @@ -978,28 +956,28 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "bytestring" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" dependencies = [ "bytes", ] [[package]] name = "cc" -version = "1.0.98" +version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" +checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" dependencies = [ "jobserver", "libc", - "once_cell", + "shlex", ] [[package]] @@ -1025,14 +1003,14 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] name = "clap" -version = "4.5.4" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184" dependencies = [ "clap_builder", "clap_derive", @@ -1040,9 +1018,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9" dependencies = [ "anstream", "anstyle", @@ -1052,27 +1030,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" @@ -1104,22 +1082,21 @@ dependencies = [ [[package]] name = "config" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" +checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" dependencies = [ "async-trait", "convert_case 0.6.0", "json5", - "lazy_static", "nom", "pathdiff", "ron 0.8.1", - "rust-ini 0.19.0", + "rust-ini 0.20.0", "serde", "serde_json", - "toml 0.8.15", - "yaml-rust", + "toml 0.8.20", + "yaml-rust2", ] [[package]] @@ -1143,7 +1120,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom", + "getrandom 0.2.15", "once_cell", "tiny-keccak", ] @@ -1186,15 +1163,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -1236,33 +1213,33 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" @@ -1276,9 +1253,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -1286,27 +1263,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -1369,20 +1346,20 @@ checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.98", ] [[package]] @@ -1403,6 +1380,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "dlv-list" version = "0.3.0" @@ -1418,12 +1406,6 @@ dependencies = [ "const-random", ] -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - [[package]] name = "dotenvy" version = "0.15.7" @@ -1439,23 +1421,23 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "either" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" dependencies = [ "serde", ] [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1484,7 +1466,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -1493,7 +1475,7 @@ version = "0.1.1" source = "git+https://github.com/blockscout/blockscout-rs?rev=20b179a#20b179a444f1c6c26ad3d17aa97908ca16aeaf72" dependencies = [ "anyhow", - "config 0.14.0", + "config 0.14.1", "itertools 0.13.0", "json_dotpath", "regex", @@ -1517,12 +1499,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1544,9 +1526,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -1555,28 +1537,19 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "pin-project-lite", ] [[package]] name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fixed-hash" @@ -1589,15 +1562,15 @@ dependencies = [ [[package]] name = "fixedbitset" -version = "0.4.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1605,13 +1578,13 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", - "spin 0.9.8", + "spin", ] [[package]] @@ -1652,9 +1625,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1667,9 +1640,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1677,15 +1650,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1705,32 +1678,17 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-lite" -version = "1.13.0" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ - "fastrand 2.1.0", + "fastrand", "futures-core", "futures-io", "parking", @@ -1739,26 +1697,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -1768,9 +1726,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1803,27 +1761,39 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "gloo-timers" -version = "0.2.6" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" dependencies = [ "futures-channel", "futures-core", @@ -1843,7 +1813,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -1852,17 +1822,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.1.0", - "indexmap 2.6.0", + "http 1.2.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -1878,12 +1848,6 @@ dependencies = [ "ahash 0.7.8", ] -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" - [[package]] name = "hashbrown" version = "0.14.5" @@ -1896,9 +1860,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "hashlink" @@ -1930,6 +1894,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -1962,11 +1932,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1982,26 +1952,15 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -2009,7 +1968,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -2020,8 +1979,8 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http 1.2.0", + "http-body", "pin-project-lite", ] @@ -2033,9 +1992,9 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -2045,40 +2004,16 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.7", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.4.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.5", - "http 1.1.0", - "http-body 1.0.1", + "h2 0.4.7", + "http 1.2.0", + "http-body", "httparse", "httpdate", "itoa", @@ -2090,15 +2025,15 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.4.1", + "http 1.2.0", + "hyper", "hyper-util", - "rustls 0.23.12", + "rustls 0.23.23", "rustls-pki-types", "tokio", "tokio-rustls", @@ -2107,27 +2042,15 @@ dependencies = [ [[package]] name = "hyper-timeout" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 0.14.29", + "hyper", + "hyper-util", "pin-project-lite", "tokio", - "tokio-io-timeout", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.29", - "native-tls", - "tokio", - "tokio-native-tls", + "tower-service", ] [[package]] @@ -2138,7 +2061,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2148,29 +2071,28 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", + "http 1.2.0", + "http-body", + "hyper", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2190,113 +2112,219 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" +name = "icu_collections" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "indexmap" -version = "1.9.3" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "indexmap" -version = "2.6.0" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ - "equivalent", - "hashbrown 0.15.0", - "serde", + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", ] [[package]] -name = "inherent" -version = "1.0.11" +name = "icu_locid_transform_data" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" [[package]] -name = "instant" -version = "0.1.13" +name = "icu_normalizer" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", ] [[package]] -name = "integer-encoding" -version = "3.0.4" +name = "icu_normalizer_data" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" [[package]] -name = "io-lifetimes" -version = "1.0.11" +name = "icu_properties" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", ] [[package]] -name = "ipnet" -version = "2.9.0" +name = "icu_properties_data" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" [[package]] -name = "is_terminal_polyfill" -version = "1.70.0" +name = "icu_provider" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] [[package]] -name = "itertools" -version = "0.10.5" +name = "icu_provider_macros" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ - "either", + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] -name = "itertools" -version = "0.11.0" +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "either", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "inherent" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", ] +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.12.1" @@ -2315,27 +2343,37 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2359,14 +2397,14 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "keccak-hash" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b286e6b663fb926e1eeb68528e69cb70ed46c6d65871a21b2215ae8154c6d3c" +checksum = "3e1b8590eb6148af2ea2d75f38e7d29f5ca970d5a4df456b3ef19b8b415d0264" dependencies = [ "primitive-types", "tiny-keccak", @@ -2374,9 +2412,9 @@ dependencies = [ [[package]] name = "kstring" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3066350882a1cd6d950d055997f379ac37fd39f81cd4d8ed186032eb3c5747" +checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1" dependencies = [ "serde", "static_assertions", @@ -2399,24 +2437,24 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] name = "libc" -version = "0.2.155" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libsqlite3-sys" @@ -2437,23 +2475,16 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "liquid" -version = "0.26.5" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f5ba7d22d7602b7fa4ef3c3925792855a0a8a6875c7e16a2f8d64d28612538b" +checksum = "2a494c3f9dad3cb7ed16f1c51812cbe4b29493d6c2e5cd1e2b87477263d9534d" dependencies = [ - "doc-comment", "liquid-core", "liquid-derive", "liquid-lib", @@ -2462,15 +2493,14 @@ dependencies = [ [[package]] name = "liquid-core" -version = "0.26.5" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acda56a5593a85c3fd144bde333cc360eff4ea7957f7ec28c986ba9fdff09866" +checksum = "fc623edee8a618b4543e8e8505584f4847a4e51b805db1af6d9af0a3395d0d57" dependencies = [ "anymap2", - "itertools 0.12.1", + "itertools 0.14.0", "kstring", "liquid-derive", - "num-traits", "pest", "pest_derive", "regex", @@ -2480,13 +2510,13 @@ dependencies = [ [[package]] name = "liquid-derive" -version = "0.26.5" +version = "0.26.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915f6d0a2963a27cd5205c1902f32ddfe3bc035816afd268cf88c0fc0f8d287e" +checksum = "de66c928222984aea59fcaed8ba627f388aaac3c1f57dcb05cc25495ef8faefe" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -2503,24 +2533,29 @@ dependencies = [ "regex", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "liquid-lib" -version = "0.26.5" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79f528d42ec31a58c8684a31e66cebb3c5ec74ae9126b8c7ceced7701db69196" +checksum = "9befeedd61f5995bc128c571db65300aeb50d62e4f0542c88282dbcb5f72372a" dependencies = [ - "itertools 0.12.1", + "itertools 0.14.0", "liquid-core", - "once_cell", "percent-encoding", "regex", "time", "unicode-segmentation", ] +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "local-channel" version = "0.1.5" @@ -2550,9 +2585,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" dependencies = [ "value-bag", ] @@ -2584,9 +2619,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "migration" @@ -2620,30 +2655,30 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" +checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "log", - "wasi", - "windows-sys 0.48.0", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", ] [[package]] name = "multimap" -version = "0.8.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" [[package]] name = "mutually_exclusive_features" @@ -2653,9 +2688,9 @@ checksum = "6d02c0b00610773bb7fc61d85e13d86c7858cbdf00e1a120bfc41bc055dbaa0e" [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" dependencies = [ "libc", "log", @@ -2690,9 +2725,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", @@ -2757,32 +2792,32 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] [[package]] name = "object" -version = "0.35.0" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.8.0", "cfg-if", "foreign-types", "libc", @@ -2799,20 +2834,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" dependencies = [ "cc", "libc", @@ -2842,7 +2877,7 @@ dependencies = [ "once_cell", "opentelemetry", "opentelemetry-semantic-conventions", - "thiserror", + "thiserror 1.0.69", "thrift", "tokio", ] @@ -2868,7 +2903,7 @@ dependencies = [ "indexmap 1.9.3", "once_cell", "pin-project-lite", - "thiserror", + "thiserror 1.0.69", "urlencoding", ] @@ -2889,7 +2924,7 @@ dependencies = [ "opentelemetry_api", "percent-encoding", "rand", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -2924,12 +2959,12 @@ dependencies = [ [[package]] name = "ordered-multimap" -version = "0.6.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ed8acf08e98e744e5384c8bc63ceb0364e68a6854187221c18df61c4797690e" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" dependencies = [ "dlv-list 0.5.2", - "hashbrown 0.13.2", + "hashbrown 0.14.5", ] [[package]] @@ -2953,7 +2988,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -2964,9 +2999,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -3011,9 +3046,9 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.1", + "redox_syscall 0.5.8", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -3024,9 +3059,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pem-rfc7468" @@ -3045,20 +3080,20 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.10" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror", + "thiserror 2.0.11", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.10" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" dependencies = [ "pest", "pest_generator", @@ -3066,22 +3101,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.10" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "pest_meta" -version = "2.7.10" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a240022f37c361ec1878d646fc5b7d7c4d28d5946e1a80ad5a7a4f4ca0bdcd" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" dependencies = [ "once_cell", "pest", @@ -3090,39 +3125,39 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.5" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.1", ] [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -3132,12 +3167,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.1.0", + "fastrand", "futures-io", ] @@ -3164,76 +3199,60 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "polling" -version = "2.8.0" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "polling" -version = "3.7.1" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6a007746f34ed64099e88783b0ae369eaa3da6392868ba262e2af9b8fbaea1" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.34", + "rustix", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "portrait" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef45976c13e2ca4bbf64fb52680c41ab0100484bb22038f1bb282f2d7ca4b841" +checksum = "711ef6bb85f0fad1184d61c2184312470edf0306262d673d63482c78f3966db2" dependencies = [ "portrait-codegen", ] [[package]] name = "portrait-codegen" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe79b0b5142c1f347958fae033fee42a50c35ed502a1dc8e13901f88cbdc001" +checksum = "32072899b9c10c19ad95d5c2cd81f52453ec5cae04060e2915f0e1fa9e802379" dependencies = [ "heck 0.4.1", - "itertools 0.11.0", + "itertools 0.12.1", "portrait-framework", "proc-macro2", "quote", "rand", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "portrait-framework" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c7d0ce33f82397dcd87769f5df2636e0c40397c073b7ae71c8a5bb93f966ef" +checksum = "4e01ac54616daade091f32af8051cbf3d6b69113f6bc2d635e29424ca4e57379" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", "rand", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -3244,15 +3263,18 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "pretty_assertions" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", @@ -3260,29 +3282,19 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" -dependencies = [ - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "prettyplease" -version = "0.2.20" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "primitive-types" -version = "0.12.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +checksum = "d15600a7d856470b7d278b3fe0e311fe28c2526348549f8ef2ff7db3299c87f5" dependencies = [ "fixed-hash", "uint", @@ -3321,11 +3333,33 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -3342,104 +3376,70 @@ dependencies = [ "memchr", "parking_lot 0.12.3", "protobuf", - "thiserror", -] - -[[package]] -name = "prost" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" -dependencies = [ - "bytes", - "prost-derive 0.11.9", + "thiserror 1.0.69", ] [[package]] name = "prost" -version = "0.12.6" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", - "prost-derive 0.12.6", + "prost-derive", ] [[package]] name = "prost-build" -version = "0.11.9" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ - "bytes", - "heck 0.4.1", - "itertools 0.10.5", - "lazy_static", + "heck 0.5.0", + "itertools 0.14.0", "log", "multimap", + "once_cell", "petgraph", - "prettyplease 0.1.25", - "prost 0.11.9", - "prost-types 0.11.9", + "prettyplease", + "prost", + "prost-types", "regex", - "syn 1.0.109", + "syn 2.0.98", "tempfile", - "which", -] - -[[package]] -name = "prost-derive" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" -dependencies = [ - "anyhow", - "itertools 0.10.5", - "proc-macro2", - "quote", - "syn 1.0.109", ] [[package]] name = "prost-derive" -version = "0.12.6" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "prost-reflect" -version = "0.12.0" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057237efdb71cf4b3f9396302a3d6599a92fa94063ba537b66130980ea9909f3" +checksum = "a7b318f733603136dcc61aa9e77c928d67f87d2436c34ec052ba3f1b5ca219de" dependencies = [ "once_cell", - "prost 0.12.6", - "prost-types 0.12.6", -] - -[[package]] -name = "prost-types" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" -dependencies = [ - "prost 0.11.9", + "prost", + "prost-types", ] [[package]] name = "prost-types" -version = "0.12.6" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" dependencies = [ - "prost 0.12.6", + "prost", ] [[package]] @@ -3470,9 +3470,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -3510,7 +3510,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] @@ -3524,31 +3524,22 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.8.0", ] [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -3563,9 +3554,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -3574,9 +3565,9 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" [[package]] name = "regex-syntax" @@ -3607,100 +3598,61 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.29", - "hyper-tls 0.5.0", + "h2 0.4.7", + "http 1.2.0", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", "ipnet", "js-sys", "log", "mime", + "mime_guess", "native-tls", "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 1.0.4", + "rustls-pemfile 2.2.0", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 0.1.2", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", + "tower 0.5.2", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.50.0", + "windows-registry", ] [[package]] -name = "reqwest" -version = "0.12.5" +name = "reqwest-middleware" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.4.5", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.4.1", - "hyper-rustls", - "hyper-tls 0.6.0", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 2.1.3", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg 0.52.0", -] - -[[package]] -name = "reqwest-middleware" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" +checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" dependencies = [ "anyhow", "async-trait", - "http 1.1.0", - "reqwest 0.12.5", + "http 1.2.0", + "reqwest", "serde", - "thiserror", + "thiserror 1.0.69", "tower-service", ] @@ -3714,11 +3666,11 @@ dependencies = [ "async-trait", "chrono", "futures", - "getrandom", - "http 1.1.0", - "hyper 1.4.1", + "getrandom 0.2.15", + "http 1.2.0", + "hyper", "parking_lot 0.11.2", - "reqwest 0.12.5", + "reqwest", "reqwest-middleware", "retry-policies", "tokio", @@ -3739,24 +3691,23 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", - "spin 0.9.8", "untrusted", "windows-sys 0.52.0", ] [[package]] name = "rkyv" -version = "0.7.44" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" dependencies = [ "bitvec", "bytecheck", @@ -3772,9 +3723,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.44" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" dependencies = [ "proc-macro2", "quote", @@ -3799,16 +3750,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", - "bitflags 2.5.0", + "bitflags 2.8.0", "serde", "serde_derive", ] [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" dependencies = [ "const-oid", "digest", @@ -3850,7 +3801,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.79", + "syn 2.0.98", "unicode-ident", ] @@ -3866,19 +3817,19 @@ dependencies = [ [[package]] name = "rust-ini" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e2a3bcec1f113553ef1c88aae6c020a369d03d55b58de9869a0908930385091" +checksum = "3e0698206bcb8882bf2a9ecb4c1e7785db57ff052297085a6efd4fe42302068a" dependencies = [ "cfg-if", - "ordered-multimap 0.6.0", + "ordered-multimap 0.7.3", ] [[package]] name = "rust_decimal" -version = "1.35.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" dependencies = [ "arrayvec", "borsh", @@ -3892,9 +3843,9 @@ dependencies = [ [[package]] name = "rust_decimal_macros" -version = "1.34.2" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e418701588729bef95e7a655f2b483ad64bb97c46e8e79fde83efd92aaab6d82" +checksum = "da991f231869f34268415a49724c6578e740ad697ba0999199d6f22b3949332c" dependencies = [ "quote", "rust_decimal", @@ -3917,29 +3868,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.34" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.8.0", "errno", "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", + "linux-raw-sys", + "windows-sys 0.59.0", ] [[package]] @@ -3955,13 +3892,13 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "once_cell", "rustls-pki-types", - "rustls-webpki 0.102.6", + "rustls-webpki 0.102.8", "subtle", "zeroize", ] @@ -3977,19 +3914,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" @@ -4003,9 +3939,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.6" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -4014,23 +3950,23 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4051,15 +3987,15 @@ dependencies = [ [[package]] name = "sea-bae" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd3534a9978d0aa7edd2808dc1f8f31c4d0ecd31ddf71d997b3c98e9f3c9114" +checksum = "f694a6ab48f14bc063cfadff30ab551d3c7e46d8f81836c51989d548f44a2a25" dependencies = [ "heck 0.4.1", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -4083,7 +4019,7 @@ dependencies = [ "serde_json", "sqlx", "strum", - "thiserror", + "thiserror 1.0.69", "time", "tracing", "url", @@ -4117,7 +4053,7 @@ dependencies = [ "proc-macro2", "quote", "sea-bae", - "syn 2.0.79", + "syn 2.0.98", "unicode-ident", ] @@ -4174,15 +4110,16 @@ dependencies = [ [[package]] name = "sea-query-derive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a82fcb49253abcb45cdcb2adf92956060ec0928635eb21b4f7a6d8f25ab0bc" +checksum = "9834af2c4bd8c5162f00c89f1701fb6886119a88062cf76fe842ea9e232b9839" dependencies = [ + "darling", "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.79", - "thiserror", + "syn 2.0.98", + "thiserror 1.0.69", ] [[package]] @@ -4205,7 +4142,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -4216,11 +4153,11 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.8.0", "core-foundation", "core-foundation-sys", "libc", @@ -4229,9 +4166,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -4239,37 +4176,38 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -4297,9 +4235,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -4318,60 +4256,32 @@ dependencies = [ [[package]] name = "serde_with" -version = "2.3.3" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" -dependencies = [ - "base64 0.13.1", - "chrono", - "hex", - "indexmap 1.9.3", - "serde", - "serde_json", - "serde_with_macros 2.3.3", - "time", -] - -[[package]] -name = "serde_with" -version = "3.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.1", "serde", "serde_derive", "serde_json", - "serde_with_macros 3.9.0", + "serde_with_macros", "time", ] [[package]] name = "serde_with_macros" -version = "2.3.3" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.79", -] - -[[package]] -name = "serde_with_macros" -version = "3.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -4380,7 +4290,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.1", "itoa", "ryu", "serde", @@ -4418,6 +4328,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -4439,9 +4355,9 @@ dependencies = [ [[package]] name = "simdutf8" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "slab" @@ -4460,30 +4376,14 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -4505,11 +4405,10 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" dependencies = [ - "itertools 0.12.1", "nom", "unicode_categories", ] @@ -4550,7 +4449,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.6.0", + "indexmap 2.7.1", "log", "memchr", "once_cell", @@ -4564,7 +4463,7 @@ dependencies = [ "sha2", "smallvec", "sqlformat", - "thiserror", + "thiserror 1.0.69", "time", "tokio", "tokio-stream", @@ -4622,7 +4521,7 @@ dependencies = [ "atoi", "base64 0.21.7", "bigdecimal", - "bitflags 2.5.0", + "bitflags 2.8.0", "byteorder", "bytes", "chrono", @@ -4653,7 +4552,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 1.0.69", "time", "tracing", "uuid", @@ -4669,7 +4568,7 @@ dependencies = [ "atoi", "base64 0.21.7", "bigdecimal", - "bitflags 2.5.0", + "bitflags 2.8.0", "byteorder", "chrono", "crc", @@ -4697,7 +4596,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 1.0.69", "time", "tracing", "uuid", @@ -4730,6 +4629,12 @@ dependencies = [ "uuid", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -4761,7 +4666,7 @@ dependencies = [ "rust_decimal_macros", "sea-orm", "stats-proto", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-subscriber", @@ -4780,11 +4685,11 @@ dependencies = [ "actix-prost-macros", "actix-web", "async-trait", - "prost 0.11.9", + "prost", "prost-build", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "tonic", "tonic-build", ] @@ -4809,15 +4714,15 @@ dependencies = [ "liquid-json", "paste", "pretty_assertions", - "reqwest 0.12.5", + "reqwest", "rstest", "sea-orm", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "stats", "stats-proto", - "thiserror", + "thiserror 1.0.69", "tokio", "tonic", "tracing", @@ -4851,9 +4756,9 @@ checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -4868,9 +4773,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -4878,45 +4783,41 @@ dependencies = [ ] [[package]] -name = "syn_derive" -version = "0.1.8" +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.79", + "futures-core", ] [[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.8.0", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -4930,34 +4831,56 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", - "fastrand 2.1.0", - "rustix 0.38.34", - "windows-sys 0.52.0", + "fastrand", + "getrandom 0.3.1", + "once_cell", + "rustix", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -4994,9 +4917,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -5015,9 +4938,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -5032,11 +4955,21 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -5049,42 +4982,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.7", + "socket2", "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -5099,20 +5021,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.12", - "rustls-pki-types", + "rustls 0.23.23", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -5121,9 +5042,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -5143,9 +5064,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.15" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", @@ -5164,11 +5085,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", @@ -5177,47 +5098,46 @@ dependencies = [ [[package]] name = "tonic" -version = "0.8.3" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", "axum", - "base64 0.13.1", + "base64 0.22.1", "bytes", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.29", + "h2 0.4.7", + "http 1.2.0", + "http-body", + "http-body-util", + "hyper", "hyper-timeout", + "hyper-util", "percent-encoding", "pin-project", - "prost 0.11.9", - "prost-derive 0.11.9", + "prost", + "socket2", "tokio", "tokio-stream", - "tokio-util", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", - "tracing-futures", ] [[package]] name = "tonic-build" -version = "0.8.4" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4" +checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" dependencies = [ - "prettyplease 0.1.25", + "prettyplease", "proc-macro2", "prost-build", + "prost-types", "quote", - "syn 1.0.109", + "syn 2.0.98", ] [[package]] @@ -5240,23 +5160,38 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -5266,35 +5201,25 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", ] -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - [[package]] name = "tracing-log" version = "0.1.4" @@ -5333,9 +5258,9 @@ dependencies = [ [[package]] name = "tracing-serde" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" dependencies = [ "serde", "tracing-core", @@ -5343,9 +5268,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -5370,7 +5295,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", ] [[package]] @@ -5396,15 +5321,15 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" -version = "0.9.5" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" dependencies = [ "byteorder", "crunchy", @@ -5414,45 +5339,42 @@ dependencies = [ [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode_categories" @@ -5474,9 +5396,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -5490,19 +5412,31 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.8.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" dependencies = [ - "getrandom", + "getrandom 0.3.1", "serde", ] @@ -5514,15 +5448,15 @@ checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-bag" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" [[package]] name = "vcpkg" @@ -5532,15 +5466,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "waker-fn" -version = "1.2.0" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "want" @@ -5557,6 +5485,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasite" version = "0.1.0" @@ -5565,46 +5502,48 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5612,22 +5551,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-timer" @@ -5646,9 +5588,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -5660,25 +5602,13 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.34", -] - [[package]] name = "whoami" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.4.1", + "redox_syscall 0.5.8", "wasite", ] @@ -5710,7 +5640,37 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -5728,7 +5688,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -5748,18 +5717,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -5770,9 +5739,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -5782,9 +5751,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -5794,15 +5763,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -5812,9 +5781,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -5824,9 +5793,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -5836,9 +5805,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -5848,39 +5817,19 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wiremock" version = "0.6.2" @@ -5892,9 +5841,9 @@ dependencies = [ "base64 0.22.1", "deadpool", "futures", - "http 1.1.0", + "http 1.2.0", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "log", "once_cell", @@ -5905,6 +5854,27 @@ dependencies = [ "url", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -5923,30 +5893,87 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yaml-rust2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8902160c4e6f2fb145dbe9d6760a75e3c9522d8bf796ed7047c85919ac7115f8" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "synstructure", +] [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.98", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "synstructure", ] [[package]] @@ -5955,29 +5982,51 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "zstd" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.1.0" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.10+zstd.1.5.6" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config", diff --git a/stats/Cargo.toml b/stats/Cargo.toml index 95e71cd70..9d5a775b2 100644 --- a/stats/Cargo.toml +++ b/stats/Cargo.toml @@ -10,8 +10,8 @@ members = [ ] [workspace.dependencies] -blockscout-client = { git = "https://github.com/blockscout/blockscout-rs/", rev = "506b821" } -blockscout-service-launcher = { version = "0.16.1" } +blockscout-client = { git = "https://github.com/blockscout/blockscout-rs/", rev = "d02877c" } +blockscout-service-launcher = { git = "https://github.com/blockscout/blockscout-rs/", rev = "3908e8bf" } rstest = "0.23.0" trait-variant = "0.1.2" wiremock = "0.6.2" diff --git a/stats/README.md b/stats/README.md index 6deb7ed30..0757ef9ca 100644 --- a/stats/README.md +++ b/stats/README.md @@ -85,6 +85,7 @@ Some variables are hidden in a disclosure widget below the table. | `STATS__CONDITIONAL_START__BLOCKS_RATIO__THRESHOLD` | | Value for `blocks_ratio` threshold | `0.98` | | `STATS__CONDITIONAL_START__INTERNAL_TRANSACTIONS_RATIO__ENABLED` | | Enable `internal_transactions_ratio` threshold | `true` | | `STATS__CONDITIONAL_START__INTERNAL_TRANSACTIONS_RATIO__THRESHOLD` | | Value for `internal_transactions_ratio` threshold | `0.98` | +| `STATS__CONDITIONAL_START__USER_OPS_PAST_INDEXING_FINISHED__ENABLED` | | Enable checking user ops indexing status | `true` | | `STATS__IGNORE_BLOCKSCOUT_API_ABSENCE` | | Disable requirement for blockscout api url setting. Turns off corresponding features if the api setting is not set | `false` | | `STATS__DISABLE_INTERNAL_TRANSACTIONS` | | Disable functionality that utilizes internal transactions. In particular, disable internal transactions ratio check for starting the service and related charts (`newContracts`, `lastNewContracts`, and `contractsGrowth`). It has a higher priority than config files and respective envs. | `false` | | `STATS__ENABLE_ALL_ARBITRUM` | | Enable Arbitrum-specific charts. Variable for convenience only, the same can be done manually in configs. | `false` | diff --git a/stats/justfile b/stats/justfile index ee650cf93..7b62d6c6e 100644 --- a/stats/justfile +++ b/stats/justfile @@ -7,6 +7,8 @@ db-user := env_var_or_default('DB_USER', "postgres") db-password := env_var_or_default('DB_PASSWORD', "admin") db-name := env_var_or_default('DB_NAME', "stats") export DATABASE_URL := "postgres://" + db-user + ":" + db-password + "@" + db-host + ":" + db-port + "/" + db-name +export RUST_LOG := env_var_or_default('RUST_LOG', "error") +export RUST_BACKTRACE := env_var_or_default('RUST_BACKTRACE', "1") docker-name := env_var_or_default('DOCKER_NAME', "stats-postgres") test-db-port := env_var_or_default('TEST_DB_PORT', "9433") diff --git a/stats/stats-proto/Cargo.toml b/stats/stats-proto/Cargo.toml index 2fa11509d..07c7670d0 100644 --- a/stats/stats-proto/Cargo.toml +++ b/stats/stats-proto/Cargo.toml @@ -4,19 +4,19 @@ version = "0.1.0" edition = "2021" [dependencies] -actix-prost = { git = "https://github.com/blockscout/actix-prost" } -actix-prost-macros = { git = "https://github.com/blockscout/actix-prost" } +actix-prost = { git = "https://github.com/blockscout/actix-prost", rev = "82c79b6" } +actix-prost-macros = { git = "https://github.com/blockscout/actix-prost", rev = "82c79b6" } actix-web = "4" -prost = "0.11" -tonic = "0.8" -serde = { version = "1", features = ["derive"] } -serde_with = { version = "3", features = ["hex", "base64"] } +prost = "0.13" +tonic = "0.12" +serde = { version = "1", features = [ "derive" ] } +serde_with = { version = "3", features = [ "hex", "base64" ] } async-trait = "0.1" [dev-dependencies] serde_json = "1.0" [build-dependencies] -actix-prost-build = { git = "https://github.com/blockscout/actix-prost" } -tonic-build = "0.8" -prost-build = "0.11" +actix-prost-build = { git = "https://github.com/blockscout/actix-prost", rev = "82c79b6" } +tonic-build = "0.12" +prost-build = "0.13" diff --git a/stats/stats-proto/proto/api_config_http.yaml b/stats/stats-proto/proto/api_config_http.yaml index fb96d895f..0b26eb2f6 100644 --- a/stats/stats-proto/proto/api_config_http.yaml +++ b/stats/stats-proto/proto/api_config_http.yaml @@ -15,6 +15,8 @@ http: get: /api/v1/pages/transactions - selector: blockscout.stats.v1.StatsService.GetContractsPageStats get: /api/v1/pages/contracts + - selector: blockscout.stats.v1.StatsService.GetUpdateStatus + get: /api/v1/update-status - selector: blockscout.stats.v1.StatsService.BatchUpdateCharts post: /api/v1/charts/batch-update body: "*" diff --git a/stats/stats-proto/proto/stats.proto b/stats/stats-proto/proto/stats.proto index 0693c48cd..31b8cfa6b 100644 --- a/stats/stats-proto/proto/stats.proto +++ b/stats/stats-proto/proto/stats.proto @@ -41,6 +41,7 @@ service StatsService { rpc GetMainPageStats(GetMainPageStatsRequest) returns (MainPageStats); rpc GetTransactionsPageStats(GetTransactionsPageStatsRequest) returns (TransactionsPageStats); rpc GetContractsPageStats(GetContractsPageStatsRequest) returns (ContractsPageStats); + rpc GetUpdateStatus(GetUpdateStatusRequest) returns (UpdateStatus); rpc BatchUpdateCharts(BatchUpdateChartsRequest) returns (BatchUpdateChartsResult) { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { security: { @@ -148,6 +149,34 @@ message ContractsPageStats { optional Counter new_verified_contracts_24h = 4; } +message GetUpdateStatusRequest {} + +enum ChartSubsetUpdateStatus { + // No actions were taken yet for some charts + PENDING = 0; + // Some charts are waiting for starting condition + WAITING_FOR_STARTING_CONDITION = 1; + // Some charts are still running initial update + RUNNING_INITIAL_UPDATE = 2; + // Initial updates were completed for all charts + COMPLETED_INITIAL_UPDATE = 3; +} + +// Each field represents status of charts with corresponding dependency +// as well as all charts with weaker requirements +message UpdateStatus { + // Status of all enabled charts + ChartSubsetUpdateStatus all_status = 1; + // Status of all enabled charts that are independent from any indexing + ChartSubsetUpdateStatus independent_status = 2; + // Status of all enabled charts that depend on indexing blocks + ChartSubsetUpdateStatus blocks_dependent_status = 3; + // Status of all enabled charts that depend on indexing internal transactions and blocks + ChartSubsetUpdateStatus internal_transactions_dependent_status = 4; + // Status of all enabled charts that depend on indexing user operations and internal transactions + ChartSubsetUpdateStatus user_ops_dependent_status = 5; +} + message BatchUpdateChartsRequest { repeated string chart_names = 1; // Default is today diff --git a/stats/stats-proto/swagger/stats.swagger.yaml b/stats/stats-proto/swagger/stats.swagger.yaml index cd005c9a9..64b22f4ef 100644 --- a/stats/stats-proto/swagger/stats.swagger.yaml +++ b/stats/stats-proto/swagger/stats.swagger.yaml @@ -148,6 +148,20 @@ paths: $ref: '#/definitions/rpcStatus' tags: - StatsService + /api/v1/update-status: + get: + operationId: StatsService_GetUpdateStatus + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1UpdateStatus' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/rpcStatus' + tags: + - StatsService /health: get: summary: |- @@ -236,6 +250,19 @@ definitions: items: type: object $ref: '#/definitions/v1BatchUpdateChartRejection' + v1ChartSubsetUpdateStatus: + type: string + enum: + - PENDING + - WAITING_FOR_STARTING_CONDITION + - RUNNING_INITIAL_UPDATE + - COMPLETED_INITIAL_UPDATE + default: PENDING + title: |- + - PENDING: No actions were taken yet for some charts + - WAITING_FOR_STARTING_CONDITION: Some charts are waiting for starting condition + - RUNNING_INITIAL_UPDATE: Some charts are still running initial update + - COMPLETED_INITIAL_UPDATE: Initial updates were completed for all charts v1ContractsPageStats: type: object properties: @@ -373,6 +400,27 @@ definitions: $ref: '#/definitions/v1Counter' operational_transactions_24h: $ref: '#/definitions/v1Counter' + v1UpdateStatus: + type: object + properties: + all_status: + $ref: '#/definitions/v1ChartSubsetUpdateStatus' + title: Status of all enabled charts + independent_status: + $ref: '#/definitions/v1ChartSubsetUpdateStatus' + title: Status of all enabled charts that are independent from any indexing + blocks_dependent_status: + $ref: '#/definitions/v1ChartSubsetUpdateStatus' + title: Status of all enabled charts that depend on indexing blocks + internal_transactions_dependent_status: + $ref: '#/definitions/v1ChartSubsetUpdateStatus' + title: Status of all enabled charts that depend on indexing internal transactions and blocks + user_ops_dependent_status: + $ref: '#/definitions/v1ChartSubsetUpdateStatus' + title: Status of all enabled charts that depend on indexing user operations and internal transactions + title: |- + Each field represents status of charts with corresponding dependency + as well as all charts with weaker requirements securityDefinitions: ApiKeyAuth: type: apiKey diff --git a/stats/stats-server/Cargo.toml b/stats/stats-server/Cargo.toml index 0815eabbf..b12a1cab2 100644 --- a/stats/stats-server/Cargo.toml +++ b/stats/stats-server/Cargo.toml @@ -9,7 +9,7 @@ stats-proto = { path = "../stats-proto" } async-trait = "0.1" actix-web = "4" reqwest = "0.12" -tonic = "0.8" +tonic = "0.12" serde = { version = "1", features = [ "derive" ] } serde_with = { version = "3", features = [ "hex", "base64" ] } bytes = "1.2" diff --git a/stats/stats-server/src/blockscout_waiter.rs b/stats/stats-server/src/blockscout_waiter.rs index d3831ccc6..511b5433f 100644 --- a/stats/stats-server/src/blockscout_waiter.rs +++ b/stats/stats-server/src/blockscout_waiter.rs @@ -4,7 +4,9 @@ use crate::settings::{Settings, StartConditionSettings, ToggleableThreshold}; use anyhow::Context; use blockscout_service_launcher::launcher::ConfigSettings; -use stats::IndexingStatus; +use stats::indexing_status::{ + BlockscoutIndexingStatus, IndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus, +}; use tokio::{sync::watch, time::sleep}; const RETRIES: u64 = 10; @@ -24,10 +26,10 @@ pub struct IndexingStatusAggregator { } impl IndexingStatusAggregator { - fn internal_status_from_api_status( + fn blockscout_internal_status_from_api_status( api_status: blockscout_client::models::IndexingStatus, wait_config: &StartConditionSettings, - ) -> anyhow::Result { + ) -> anyhow::Result { let blocks_passed = is_threshold_passed( &wait_config.blocks_ratio, api_status.indexed_blocks_ratio.clone(), @@ -42,55 +44,145 @@ impl IndexingStatusAggregator { ) .context("checking indexed internal transactions ratio")?; if internal_transactions_passed { - IndexingStatus::InternalTransactionsIndexed + BlockscoutIndexingStatus::InternalTransactionsIndexed } else { - IndexingStatus::BlocksIndexed + BlockscoutIndexingStatus::BlocksIndexed } } else { - IndexingStatus::NoneIndexed + BlockscoutIndexingStatus::NoneIndexed }; Ok(status) } - pub async fn run(&self) -> Result<(), anyhow::Error> { - let mut consecutive_errors = 0; - loop { - match blockscout_client::apis::main_page_api::get_indexing_status(&self.api_config) - .await - { - Ok(result) => { - consecutive_errors = 0; - match Self::internal_status_from_api_status(result, &self.wait_config) { - Ok(status) => { - let modified = self.sender.send_if_modified(|val| { - if val != &status { - *val = status.clone(); - true - } else { - false - } - }); - if modified { - tracing::info!("Observed new indexing status: {:?}", status); + fn user_ops_internal_status_from_api_status( + api_status: blockscout_client::models::V1IndexerStatus, + wait_config: &StartConditionSettings, + ) -> UserOpsIndexingStatus { + if !wait_config.user_ops_past_indexing_finished.enabled { + return UserOpsIndexingStatus::PastOperationsIndexed; + } + let finished_past_indexing = api_status.finished_past_indexing.unwrap_or_else(|| { + tracing::info!("Treating `finished_past_indexing=null` as false.",); + false + }); + if finished_past_indexing { + tracing::info!("User ops are fully indexed"); + UserOpsIndexingStatus::PastOperationsIndexed + } else { + tracing::info!("User ops are not fully indexed"); + UserOpsIndexingStatus::IndexingPastOperations + } + } + + async fn check_blockscout_status( + &self, + consecutive_errors: &mut u64, + ) -> Result<(), anyhow::Error> { + match blockscout_client::apis::main_page_api::get_indexing_status(&self.api_config).await { + Ok(result) => { + *consecutive_errors = 0; + match Self::blockscout_internal_status_from_api_status(result, &self.wait_config) { + Ok(status) => { + let modified = self.sender.send_if_modified(|val| { + if val.blockscout != status { + val.blockscout = status; + true } else { - tracing::info!("Indexing status is unchanged"); + false } + }); + if modified { + tracing::info!("Observed new indexing status: {:?}", status); + } else { + tracing::info!("Indexing status is unchanged"); } - Err(e) => tracing::error!("{}", e), } + Err(e) => tracing::error!("{}", e), } - Err(e) => { - if consecutive_errors >= RETRIES { - return Err(e).context("Requesting indexing status"); + } + Err(e) => { + if *consecutive_errors >= RETRIES { + return Err(e).context("Requesting blockscout indexing status"); + } + tracing::warn!( + "Error ({consecutive_errors}/{RETRIES}) requesting blockscout indexing status: {e:?}" + ); + *consecutive_errors += 1; + } + } + Ok(()) + } + + async fn check_user_ops_status(&self) { + match blockscout_client::apis::proxy_api::get_account_abstraction_status(&self.api_config) + .await + { + Ok(status) => { + let status = + Self::user_ops_internal_status_from_api_status(status, &self.wait_config); + let modified = self.sender.send_if_modified(|val| { + if val.user_ops != status { + val.user_ops = status; + true + } else { + false } + }); + if modified { + tracing::info!("Observed new indexing status: {:?}", status); + } else { + tracing::info!("Indexing status is unchanged"); + } + } + Err(e) => { + match &e { + blockscout_client::Error::ResponseError(bad_request) + if bad_request.status == reqwest::StatusCode::BAD_REQUEST => + { + tracing::warn!( + error =? e, + "Got response with HTTP 400. This likely means that blockscout version \ + is <7.0.0.", + ); + } + _ => { + tracing::error!( + error =? e, + "Failed to get user ops indexing status", + ); + } + } + // don't need to change if disabled, because it's handled + // in `init` + if self.wait_config.user_ops_past_indexing_finished.enabled { tracing::warn!( - "Error ({consecutive_errors}/{RETRIES}) requesting indexing status: {e:?}" + "User ops related charts are turned off to avoid \ + incorrect data. Set `STATS__CONDITIONAL_START__USER_OPS_PAST_INDEXING_FINISHED__ENABLED=false` \ + to ignore this check and update the charts." ); - consecutive_errors += 1; } } + } + } + + pub async fn run(&self) -> Result<(), anyhow::Error> { + if !self.wait_config.blockscout_checks_enabled() + && !self.wait_config.user_ops_checks_enabled() + { + tracing::info!("All indexing status checks are disabled, stopping status checks"); + return Ok(()); + } + let mut consecutive_errors = 0; + loop { + if self.wait_config.blockscout_checks_enabled() { + self.check_blockscout_status(&mut consecutive_errors) + .await?; + } + if self.wait_config.user_ops_checks_enabled() { + self.check_user_ops_status().await; + } let wait_time = if let IndexingStatus::MAX = *self.sender.borrow() { - self.wait_config.check_period_secs * 100 + self.wait_config.check_period_secs.saturating_mul(100) } else { self.wait_config.check_period_secs }; @@ -115,16 +207,7 @@ impl IndexingStatusListener { minimal_status: IndexingStatus, ) -> Result<(), watch::error::RecvError> { self.receiver - .wait_for(|value| match minimal_status { - IndexingStatus::NoneIndexed => true, - IndexingStatus::BlocksIndexed => matches!( - value, - IndexingStatus::BlocksIndexed | IndexingStatus::InternalTransactionsIndexed - ), - IndexingStatus::InternalTransactionsIndexed => { - matches!(value, IndexingStatus::InternalTransactionsIndexed) - } - }) + .wait_for(|value| value.is_requirement_satisfied(&minimal_status)) .await?; Ok(()) } @@ -169,7 +252,25 @@ pub fn init( api_config: blockscout_client::Configuration, wait_config: StartConditionSettings, ) -> (IndexingStatusAggregator, IndexingStatusListener) { - let (sender, receiver) = watch::channel(IndexingStatus::LEAST_RESTRICTIVE); + // enable immediately if the checks are disabled + let blockscout_init_value = match ( + wait_config.blocks_ratio.enabled, + wait_config.internal_transactions_ratio.enabled, + ) { + (true, _) => BlockscoutIndexingStatus::NoneIndexed, + (false, true) => BlockscoutIndexingStatus::BlocksIndexed, + (false, false) => BlockscoutIndexingStatus::InternalTransactionsIndexed, + }; + let user_ops_init_value = if wait_config.user_ops_past_indexing_finished.enabled { + UserOpsIndexingStatus::IndexingPastOperations + } else { + UserOpsIndexingStatus::PastOperationsIndexed + }; + + let (sender, receiver) = watch::channel(IndexingStatus { + blockscout: blockscout_init_value, + user_ops: user_ops_init_value, + }); ( IndexingStatusAggregator { api_config, @@ -206,43 +307,41 @@ mod tests { use std::str::FromStr; use rstest::*; + use stats::tests::mock_blockscout::{mock_blockscout_api, user_ops_status_response_json}; use std::time::Duration; use tokio::{select, task::JoinSet, time::error::Elapsed}; use url::Url; - use wiremock::{ - matchers::{method, path}, - Mock, MockServer, ResponseTemplate, - }; + use wiremock::ResponseTemplate; - use super::*; + use crate::settings::ToggleableCheck; - async fn mock_indexing_status(response: ResponseTemplate) -> MockServer { - let mock_server = MockServer::start().await; - Mock::given(method("GET")) - .and(path("/api/v2/main-page/indexing-status")) - .respond_with(response) - .mount(&mock_server) - .await; - mock_server - } + use super::*; async fn test_aggregator( wait_config: StartConditionSettings, expected_status: IndexingStatus, timeout: Option, - response: ResponseTemplate, + response_blockscout: ResponseTemplate, + response_user_ops: Option, ) -> Result, Elapsed> { - let server = mock_indexing_status(response).await; + let timeout = timeout.unwrap_or(Duration::from_millis(2000)); + let server = mock_blockscout_api(response_blockscout, response_user_ops).await; let api_config = blockscout_client::Configuration::new(Url::from_str(&server.uri()).unwrap()); let (aggregator, mut listener) = init(api_config, wait_config); + let aggregator_future = async { + aggregator.run().await?; + sleep(timeout).await; + Ok::<(), anyhow::Error>(()) + }; let wait_for_listener_timeout = tokio::time::timeout( - timeout.unwrap_or(Duration::from_millis(200)), + timeout, listener.wait_until_status_at_least(expected_status), ); + select! { - res = aggregator.run() => { - panic!("aggregator terminated: {:?}", res) + res = aggregator_future => { + panic!("aggregator terminated with error: {res:?}") } listener = wait_for_listener_timeout => { listener.map(|a| a.map_err(|e| e.into())) @@ -254,11 +353,15 @@ mod tests { fn wait_config( #[default(0.9)] blocks: f64, #[default(0.9)] internal_transactions: f64, + #[default(true)] user_ops_check_enabled: bool, #[default(0)] check_period_secs: u32, ) -> StartConditionSettings { StartConditionSettings { blocks_ratio: ToggleableThreshold::enabled(blocks), internal_transactions_ratio: ToggleableThreshold::enabled(internal_transactions), + user_ops_past_indexing_finished: ToggleableCheck { + enabled: user_ops_check_enabled, + }, check_period_secs, } } @@ -268,7 +371,10 @@ mod tests { async fn waiter_works_with_200_response(wait_config: StartConditionSettings) { test_aggregator( wait_config.clone(), - IndexingStatus::InternalTransactionsIndexed, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + }, None, ResponseTemplate::new(200).set_body_string( r#"{ @@ -278,6 +384,7 @@ mod tests { "indexed_internal_transactions_ratio": "1" }"#, ), + Some(ResponseTemplate::new(200).set_body_string(user_ops_status_response_json(true))), ) .await .expect("must not timeout") @@ -285,7 +392,10 @@ mod tests { test_aggregator( wait_config.clone(), - IndexingStatus::InternalTransactionsIndexed, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + }, None, ResponseTemplate::new(200).set_body_string( r#"{ @@ -295,13 +405,17 @@ mod tests { "indexed_internal_transactions_ratio": "0.80" }"#, ), + None, ) .await .expect_err("must time out"); test_aggregator( wait_config.clone(), - IndexingStatus::InternalTransactionsIndexed, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + }, None, ResponseTemplate::new(200).set_body_string( r#"{ @@ -311,13 +425,17 @@ mod tests { "indexed_internal_transactions_ratio": "1.00" }"#, ), + None, ) .await .expect_err("must time out"); test_aggregator( wait_config.clone(), - IndexingStatus::InternalTransactionsIndexed, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + }, None, ResponseTemplate::new(200).set_body_string( r#"{ @@ -327,13 +445,37 @@ mod tests { "indexed_internal_transactions_ratio": "0.80" }"#, ), + None, + ) + .await + .expect_err("must time out"); + + test_aggregator( + wait_config.clone(), + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + }, + None, + ResponseTemplate::new(200).set_body_string( + r#"{ + "finished_indexing": true, + "finished_indexing_blocks": true, + "indexed_blocks_ratio": "1.00", + "indexed_internal_transactions_ratio": "1.00" + }"#, + ), + Some(ResponseTemplate::new(200).set_body_string(user_ops_status_response_json(false))), ) .await .expect_err("must time out"); test_aggregator( wait_config, - IndexingStatus::BlocksIndexed, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + }, None, ResponseTemplate::new(200).set_body_string( r#"{ @@ -343,6 +485,7 @@ mod tests { "indexed_internal_transactions_ratio": "0.80" }"#, ), + Some(ResponseTemplate::new(200).set_body_string(user_ops_status_response_json(true))), ) .await .expect("must not timeout") @@ -354,7 +497,10 @@ mod tests { async fn waiter_works_with_slow_response(wait_config: StartConditionSettings) { test_aggregator( wait_config, - IndexingStatus::InternalTransactionsIndexed, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + }, Some(Duration::from_millis(500)), ResponseTemplate::new(200) .set_body_string( @@ -365,7 +511,12 @@ mod tests { "indexed_internal_transactions_ratio": "1.0" }"#, ) - .set_delay(Duration::from_millis(100)), + .set_delay(Duration::from_millis(50)), + Some( + ResponseTemplate::new(200) + .set_body_string(user_ops_status_response_json(true)) + .set_delay(Duration::from_millis(50)), + ), ) .await .expect("must not timeout") @@ -377,7 +528,10 @@ mod tests { async fn waiter_works_with_infinite_timeout(wait_config: StartConditionSettings) { test_aggregator( wait_config.clone(), - IndexingStatus::InternalTransactionsIndexed, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + }, None, ResponseTemplate::new(200) .set_body_string( @@ -389,13 +543,41 @@ mod tests { }"#, ) .set_delay(Duration::MAX), + Some(ResponseTemplate::new(200).set_body_string(user_ops_status_response_json(true))), + ) + .await + .expect_err("must time out"); + + test_aggregator( + wait_config.clone(), + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + }, + None, + ResponseTemplate::new(200).set_body_string( + r#"{ + "finished_indexing": false, + "finished_indexing_blocks": false, + "indexed_blocks_ratio": "0.80", + "indexed_internal_transactions_ratio": "0.80" + }"#, + ), + Some( + ResponseTemplate::new(200) + .set_body_string(user_ops_status_response_json(true)) + .set_delay(Duration::MAX), + ), ) .await .expect_err("must time out"); test_aggregator( wait_config, - IndexingStatus::NoneIndexed, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + }, None, ResponseTemplate::new(200) .set_body_string( @@ -407,6 +589,11 @@ mod tests { }"#, ) .set_delay(Duration::MAX), + Some( + ResponseTemplate::new(200) + .set_body_string(user_ops_status_response_json(true)) + .set_delay(Duration::MAX), + ), ) .await .expect("must not timeout") @@ -418,8 +605,11 @@ mod tests { async fn waiter_works_with_null_ratios(wait_config: StartConditionSettings) { test_aggregator( wait_config, - IndexingStatus::BlocksIndexed, - Some(Duration::from_millis(300)), + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + }, + Some(Duration::from_millis(500)), ResponseTemplate::new(200).set_body_string( r#"{ "finished_indexing": false, @@ -428,6 +618,7 @@ mod tests { "indexed_internal_transactions_ratio": null }"#, ), + None, ) .await .expect_err("must time out and not fall with error"); @@ -436,25 +627,70 @@ mod tests { #[rstest] #[tokio::test] async fn waiter_retries_with_error_codes( - #[with(0.9, 0.9, 1)] wait_config: StartConditionSettings, + #[with(0.9, 0.9, true, 1)] wait_config: StartConditionSettings, ) { let timeout = Some(Duration::from_millis(1500)); - let s = IndexingStatus::BlocksIndexed; + let s = IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + }; let r = |code: u16| ResponseTemplate::new(code); let mut error_servers = JoinSet::from_iter([ - test_aggregator(wait_config.clone(), s.clone(), timeout, r(429)), - test_aggregator(wait_config.clone(), s.clone(), timeout, r(500)), - test_aggregator(wait_config.clone(), s.clone(), timeout, r(503)), - test_aggregator(wait_config.clone(), s.clone(), timeout, r(504)), - test_aggregator(wait_config.clone(), s.clone(), timeout, r(400)), - test_aggregator(wait_config.clone(), s.clone(), timeout, r(403)), - test_aggregator(wait_config.clone(), s.clone(), timeout, r(404)), - test_aggregator(wait_config.clone(), s.clone(), timeout, r(405)), + test_aggregator(wait_config.clone(), s.clone(), timeout, r(429), None), + test_aggregator(wait_config.clone(), s.clone(), timeout, r(500), None), + test_aggregator(wait_config.clone(), s.clone(), timeout, r(503), None), + test_aggregator(wait_config.clone(), s.clone(), timeout, r(504), None), + test_aggregator(wait_config.clone(), s.clone(), timeout, r(400), None), + test_aggregator(wait_config.clone(), s.clone(), timeout, r(403), None), + test_aggregator(wait_config.clone(), s.clone(), timeout, r(404), None), + test_aggregator(wait_config.clone(), s.clone(), timeout, r(405), None), ]); - #[allow(for_loops_over_fallibles)] - for server in error_servers.join_next().await { + while let Some(server) = error_servers.join_next().await { let test_result = server.unwrap(); test_result.expect_err("must time out"); } } + + #[tokio::test] + async fn waiter_ignores_errors_when_checks_are_disabled() { + let timeout = Some(Duration::from_millis(2000)); + let s = IndexingStatus::MOST_RESTRICTIVE; + let r = |code: u16| ResponseTemplate::new(code); + let ok_b = ResponseTemplate::new(200).set_body_string( + r#"{ + "finished_indexing": true, + "finished_indexing_blocks": true, + "indexed_blocks_ratio": "1.00", + "indexed_internal_transactions_ratio": "1.00" + }"#, + ); + let ok_u = ResponseTemplate::new(200).set_body_string(user_ops_status_response_json(true)); + let config_b_off = StartConditionSettings { + blocks_ratio: ToggleableThreshold::disabled(), + internal_transactions_ratio: ToggleableThreshold::disabled(), + user_ops_past_indexing_finished: ToggleableCheck { enabled: true }, + check_period_secs: 1, + }; + let config_u_off = StartConditionSettings { + blocks_ratio: ToggleableThreshold::default(), + internal_transactions_ratio: ToggleableThreshold::default(), + user_ops_past_indexing_finished: ToggleableCheck { enabled: false }, + check_period_secs: 1, + }; + let mut tests = JoinSet::from_iter( + [ + (&config_b_off, &s, timeout, &r(400), Some(&ok_u)), + (&config_b_off, &s, timeout, &r(404), Some(&ok_u)), + (&config_u_off, &s, timeout, &ok_b, Some(&r(400))), + (&config_u_off, &s, timeout, &ok_b, Some(&r(404))), + ] + .map(|(a, b, c, d, e)| test_aggregator(a.clone(), b.clone(), c, d.clone(), e.cloned())), + ); + while let Some(server) = tests.join_next().await { + let test_result = server.unwrap(); + test_result + .expect("must not timeout") + .expect("must not error"); + } + } } diff --git a/stats/stats-server/src/lib.rs b/stats/stats-server/src/lib.rs index 6e4a7c67b..7d5447885 100644 --- a/stats/stats-server/src/lib.rs +++ b/stats/stats-server/src/lib.rs @@ -8,6 +8,7 @@ mod serializers; mod server; mod settings; mod update_service; +mod update_tracker; pub use config::env as config_env; pub use read_service::ReadService; @@ -15,3 +16,4 @@ pub use runtime_setup::RuntimeSetup; pub use server::stats; pub use settings::Settings; pub use update_service::UpdateService; +pub use update_tracker::InitialUpdateTracker; diff --git a/stats/stats-server/src/read_service.rs b/stats/stats-server/src/read_service.rs index f3796282c..21edbe802 100644 --- a/stats/stats-server/src/read_service.rs +++ b/stats/stats-server/src/read_service.rs @@ -279,12 +279,20 @@ impl ReadService { query_time: DateTime, ) -> Option { let query_handle = get_counter_query_handle(&name, chart_entry)?; - let counter = self + match self .query_counter_with_handle(name, chart_entry.settings.clone(), query_handle, query_time) .await - .inspect_err(|e| tracing::error!("Failed to query counter: {:?}", e)) - .ok()?; - Some(counter) + { + Ok(counter_data) => Some(counter_data), + Err(ChartError::NoCounterData(k)) => { + tracing::warn!("No data for counter: {:?}", k); + None + } + Err(e) => { + tracing::error!("Failed to query counter: {:?}", e); + None + } + } } async fn query_counter( @@ -533,6 +541,15 @@ impl StatsService for ReadService { })) } + async fn get_update_status( + &self, + _request: Request, + ) -> Result, Status> { + Ok(Response::new( + self.update_service.get_initial_update_status().await, + )) + } + async fn batch_update_charts( &self, request: Request, diff --git a/stats/stats-server/src/runtime_setup.rs b/stats/stats-server/src/runtime_setup.rs index 43ae812d5..0ec749e6d 100644 --- a/stats/stats-server/src/runtime_setup.rs +++ b/stats/stats-server/src/runtime_setup.rs @@ -555,6 +555,13 @@ impl RuntimeSetup { members } + pub fn enabled_chart_keys(&self) -> Vec { + self.charts_info + .values() + .flat_map(|entry| entry.get_keys()) + .collect() + } + /// Recursive indexing status requirements for all group members. /// /// 'Recursive' means that their dependencies' requirements are also @@ -576,4 +583,16 @@ impl RuntimeSetup { }) .collect() } + + /// Recursive indexing status requirements for all enabled group members. + /// See [`Self::all_members_indexing_status_requirements`] for details. + pub fn all_enabled_members_indexing_status_requirements( + &self, + ) -> BTreeMap { + let enabled_charts: HashSet<_> = self.enabled_chart_keys().into_iter().collect(); + Self::all_members_indexing_status_requirements() + .into_iter() + .filter(|(chart, _req)| enabled_charts.contains(chart)) + .collect() + } } diff --git a/stats/stats-server/src/server.rs b/stats/stats-server/src/server.rs index dd9ab8ce0..08571f977 100644 --- a/stats/stats-server/src/server.rs +++ b/stats/stats-server/src/server.rs @@ -61,6 +61,10 @@ fn grpc_router( .add_service(StatsServiceServer::from_arc(stats)) } +async fn sleep_indefinitely() { + tokio::time::sleep(Duration::from_secs(u64::MAX)).await; +} + pub async fn stats(mut settings: Settings) -> Result<(), anyhow::Error> { blockscout_service_launcher::tracing::init_logs( SERVICE_NAME, @@ -119,7 +123,15 @@ pub async fn stats(mut settings: Settings) -> Result<(), anyhow::Error> { let (status_waiter, status_listener) = blockscout_api_config .map(|c| blockscout_waiter::init(c, settings.conditional_start.clone())) .unzip(); - let status_waiter_handle = status_waiter.map(|w| tokio::spawn(async move { w.run().await })); + let status_waiter_handle = status_waiter.map(|w| { + tokio::spawn(async move { + w.run().await?; + // we don't want to finish on success because of the way + // the tasks are handled here + sleep_indefinitely().await; + Ok(()) + }) + }); let update_service = Arc::new( UpdateService::new( diff --git a/stats/stats-server/src/settings.rs b/stats/stats-server/src/settings.rs index b3fd11c64..cc3160ea2 100644 --- a/stats/stats-server/src/settings.rs +++ b/stats/stats-server/src/settings.rs @@ -9,8 +9,9 @@ use serde::{Deserialize, Serialize}; use serde_with::{serde_as, DisplayFromStr}; use stats::{ counters::{NewOperationalTxns24h, TotalOperationalTxns, YesterdayOperationalTxns}, + indexing_status::BlockscoutIndexingStatus, lines::{NewOperationalTxns, NewOperationalTxnsWindow, OperationalTxnsGrowth}, - ChartProperties, IndexingStatus, + ChartProperties, }; use std::{ collections::{BTreeSet, HashMap}, @@ -121,7 +122,9 @@ pub fn handle_disable_internal_transactions( let charts_dependant_on_internal_transactions = RuntimeSetup::all_members_indexing_status_requirements() .into_iter() - .filter(|(_k, req)| req == &IndexingStatus::InternalTransactionsIndexed) + .filter(|(_k, req)| { + req.blockscout == BlockscoutIndexingStatus::InternalTransactionsIndexed + }) .map(|(k, _req)| k.into_name()); let to_disable: BTreeSet<_> = charts_dependant_on_internal_transactions.collect(); @@ -205,6 +208,7 @@ impl Default for LimitsSettings { pub struct StartConditionSettings { pub blocks_ratio: ToggleableThreshold, pub internal_transactions_ratio: ToggleableThreshold, + pub user_ops_past_indexing_finished: ToggleableCheck, pub check_period_secs: u32, } @@ -214,11 +218,21 @@ impl Default for StartConditionSettings { // in some networks it's always almost 1 blocks_ratio: ToggleableThreshold::default(), internal_transactions_ratio: ToggleableThreshold::default(), + user_ops_past_indexing_finished: ToggleableCheck::default(), check_period_secs: 5, } } } +impl StartConditionSettings { + pub fn blockscout_checks_enabled(&self) -> bool { + self.blocks_ratio.enabled || self.internal_transactions_ratio.enabled + } + pub fn user_ops_checks_enabled(&self) -> bool { + self.user_ops_past_indexing_finished.enabled + } +} + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(default, deny_unknown_fields)] pub struct ToggleableThreshold { @@ -258,6 +272,18 @@ impl Default for ToggleableThreshold { } } +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(default, deny_unknown_fields)] +pub struct ToggleableCheck { + pub enabled: bool, +} + +impl Default for ToggleableCheck { + fn default() -> Self { + Self { enabled: true } + } +} + #[cfg(test)] mod tests { use crate::config_env::test_utils::check_envs_parsed_to; diff --git a/stats/stats-server/src/update_service.rs b/stats/stats-server/src/update_service.rs index 5922e430f..ec522081f 100644 --- a/stats/stats-server/src/update_service.rs +++ b/stats/stats-server/src/update_service.rs @@ -10,22 +10,21 @@ use tokio::sync::{mpsc, Mutex, Semaphore}; use crate::{ blockscout_waiter::IndexingStatusListener, runtime_setup::{RuntimeSetup, UpdateGroupEntry}, + InitialUpdateTracker, }; use stats::{ data_source::types::{BlockscoutMigrations, UpdateParameters}, ChartKey, }; -use std::{ - collections::HashSet, - sync::{atomic::AtomicU64, Arc}, -}; +use std::{collections::HashSet, sync::Arc}; pub struct UpdateService { db: Arc, blockscout_db: Arc, charts: Arc, status_listener: Option, + init_update_tracker: InitialUpdateTracker, // currently only accessed in one place, but `Mutex`es // are needed due to `Arc` everywhere to provide // interior mutability @@ -58,11 +57,13 @@ impl UpdateService { status_listener: Option, ) -> Result { let on_demand = mpsc::channel(128); + let init_update_tracker = Self::initialize_update_tracker(&charts); Ok(Self { db, blockscout_db, charts, status_listener, + init_update_tracker, on_demand_sender: Mutex::new(on_demand.0), on_demand_receiver: Mutex::new(on_demand.1), }) @@ -81,7 +82,6 @@ impl UpdateService { let initial_update_semaphore: Arc = Arc::new(Semaphore::new(concurrent_initial_tasks)); let groups = self.charts.update_groups.values(); - let init_update_tracker = InitialUpdateTracker::new(groups.len() as u64); let mut group_update_jobs: FuturesUnordered<_> = groups .map(|group| { let this = self.clone(); @@ -89,8 +89,12 @@ impl UpdateService { let schedule = group_update_schedule(&group_entry, &default_schedule).clone(); let status_listener = self.status_listener.clone(); let initial_update_semaphore = initial_update_semaphore.clone(); - let init_update_tracker = &init_update_tracker; + let init_update_tracker = &self.init_update_tracker; async move { + // also includes wait for mutex in `run_initial_update` + init_update_tracker + .mark_waiting_for_starting_condition(&group_entry.enabled_members) + .await; Self::wait_for_start_condition(&group_entry, status_listener).await; this.clone() .run_initial_update( @@ -119,6 +123,11 @@ impl UpdateService { panic!("{}", msg); } + fn initialize_update_tracker(charts: &RuntimeSetup) -> InitialUpdateTracker { + let all_charts_requirements = charts.all_enabled_members_indexing_status_requirements(); + InitialUpdateTracker::new(&all_charts_requirements) + } + async fn wait_for_start_condition( group_entry: &UpdateGroupEntry, status_listener: Option, @@ -152,16 +161,23 @@ impl UpdateService { .acquire() .await .expect("failed to acquire permit"); + init_update_tracker + .mark_started_initial_update(&group_entry.enabled_members) + .await; if let Some(force_full) = force_update_on_start { - self.update(group_entry.clone(), force_full, None).await + self.clone() + .update(group_entry.clone(), force_full, None) + .await }; } tracing::info!( update_group = group_entry.group.name(), "initial update for group is done" ); - init_update_tracker.mark_updated(); - init_update_tracker.report(); + init_update_tracker + .mark_initial_update_done(&group_entry.enabled_members) + .await; + init_update_tracker.report().await; } async fn run_on_demand_executor(self: &Arc, default_schedule: &Schedule) { @@ -432,6 +448,32 @@ impl UpdateService { }) } + pub async fn get_initial_update_status(&self) -> proto_v1::UpdateStatus { + proto_v1::UpdateStatus { + all_status: self.init_update_tracker.get_all_status().await.into(), + independent_status: self + .init_update_tracker + .get_independent_status() + .await + .into(), + blocks_dependent_status: self + .init_update_tracker + .get_blocks_dependent_status() + .await + .into(), + internal_transactions_dependent_status: self + .init_update_tracker + .get_internal_transactions_dependent_status() + .await + .into(), + user_ops_dependent_status: self + .init_update_tracker + .get_user_ops_dependent_status() + .await + .into(), + } + } + /// (accepted_chart_keys, accepted_chart_names, rejected_chart_names) fn split_update_request_input( self: &Arc, @@ -502,32 +544,3 @@ pub struct Rejection { pub name: String, pub reason: String, } - -/// Reports progress of inital updates to logs -struct InitialUpdateTracker { - updated_groups: AtomicU64, - total_groups: u64, -} - -impl InitialUpdateTracker { - pub fn new(total_groups: u64) -> Self { - Self { - updated_groups: AtomicU64::new(0), - total_groups, - } - } - - pub fn mark_updated(&self) { - self.updated_groups - .fetch_add(1, std::sync::atomic::Ordering::Relaxed); - } - - pub fn report(&self) { - tracing::info!( - "{}/{} of initial updates are finished", - self.updated_groups - .load(std::sync::atomic::Ordering::Relaxed), - self.total_groups - ); - } -} diff --git a/stats/stats-server/src/update_tracker.rs b/stats/stats-server/src/update_tracker.rs new file mode 100644 index 000000000..a21e414f4 --- /dev/null +++ b/stats/stats-server/src/update_tracker.rs @@ -0,0 +1,333 @@ +use std::{ + collections::{BTreeMap, HashSet}, + sync::Arc, +}; + +use stats::{ + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, + ChartKey, IndexingStatus, +}; +use stats_proto::blockscout::stats::v1 as proto_v1; +use tokio::sync::Mutex; + +/// Tracks and reports progress of inital updates +pub struct InitialUpdateTracker { + inner: Arc>, +} + +impl InitialUpdateTracker { + /// Need charts with their status requirements + pub fn new(charts: &BTreeMap) -> Self { + Self { + inner: Arc::new(Mutex::new(InitialUpdateTrackerInner::new(charts))), + } + } + + /// will skip tracking in a subset if not a part of the subset + async fn mark_all_trackers(&self, charts: &HashSet, status: UpdateStatusChange) { + let mut inner = self.inner.lock().await; + inner.mark_all_trackers(charts, status) + } + + pub async fn mark_waiting_for_starting_condition(&self, charts: &HashSet) { + self.mark_all_trackers(charts, UpdateStatusChange::WaitingForStartingCondition) + .await + } + + pub async fn mark_started_initial_update(&self, charts: &HashSet) { + self.mark_all_trackers(charts, UpdateStatusChange::RunningInitialUpdate) + .await + } + + pub async fn mark_initial_update_done(&self, charts: &HashSet) { + self.mark_all_trackers(charts, UpdateStatusChange::CompletedInitialUpdate) + .await + } + + pub async fn get_independent_status(&self) -> proto_v1::ChartSubsetUpdateStatus { + self.inner.lock().await.independent.get_status() + } + + pub async fn get_blocks_dependent_status(&self) -> proto_v1::ChartSubsetUpdateStatus { + self.inner.lock().await.blocks_dependent.get_status() + } + + pub async fn get_internal_transactions_dependent_status( + &self, + ) -> proto_v1::ChartSubsetUpdateStatus { + self.inner + .lock() + .await + .internal_transactions_dependent + .get_status() + } + + pub async fn get_user_ops_dependent_status(&self) -> proto_v1::ChartSubsetUpdateStatus { + self.inner.lock().await.user_ops_dependent.get_status() + } + + pub async fn get_all_status(&self) -> proto_v1::ChartSubsetUpdateStatus { + self.inner.lock().await.get_all_status() + } + + /// Log progress + pub async fn report(&self) { + self.inner.lock().await.report(); + } +} + +struct InitialUpdateTrackerInner { + // each subset consists of a comprehensive set of enabled charts + // that have the corresponding (or less strict) indexing status + // requirement. + // so, `internal_transactions_dependent` charts will include all + // `blocks_dependent` charts, because internal txn dependency + // implies blocks dependency. + independent: UpdateChartSubsetTracker, + blocks_dependent: UpdateChartSubsetTracker, + internal_transactions_dependent: UpdateChartSubsetTracker, + user_ops_dependent: UpdateChartSubsetTracker, +} + +impl InitialUpdateTrackerInner { + /// Need charts with their status requirements + pub fn new(charts: &BTreeMap) -> Self { + let charts_satisfying_status = + |charts: &BTreeMap, status: &IndexingStatus| -> HashSet<_> { + charts + .iter() + .filter(|(_, req)| status.is_requirement_satisfied(req)) + .map(|(key, _)| key) + .cloned() + .collect() + }; + + let nothing_indexed_status = IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::IndexingPastOperations, + }; + let only_blocks_indexed_status = IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::IndexingPastOperations, + }; + let internal_indexed_status = IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::IndexingPastOperations, + }; + let user_ops_indexed_status = IndexingStatus { + // We want to include all user ops dependant charts + // therefore we set blockscout to be as indexed as possible + blockscout: BlockscoutIndexingStatus::MAX, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + }; + + let independent = charts_satisfying_status(charts, ¬hing_indexed_status); + let blocks_dependent = charts_satisfying_status(charts, &only_blocks_indexed_status); + let internal_transactions_dependent = + charts_satisfying_status(charts, &internal_indexed_status); + let user_ops_dependent = charts_satisfying_status(charts, &user_ops_indexed_status); + Self::verify_tracking_all_charts( + charts, + &[ + &independent, + &blocks_dependent, + &internal_transactions_dependent, + &user_ops_dependent, + ], + ); + InitialUpdateTrackerInner { + independent: UpdateChartSubsetTracker::new(independent), + blocks_dependent: UpdateChartSubsetTracker::new(blocks_dependent), + internal_transactions_dependent: UpdateChartSubsetTracker::new( + internal_transactions_dependent, + ), + user_ops_dependent: UpdateChartSubsetTracker::new(user_ops_dependent), + } + } + + fn verify_tracking_all_charts( + charts: &BTreeMap, + tracking: &[&HashSet], + ) { + let all_tracked = tracking + .iter() + .fold(HashSet::<&ChartKey>::new(), |mut all, next| { + all.extend(next.iter()); + all + }); + let charts = charts.keys().collect::>(); + let not_tracked: Vec<_> = charts.difference(&all_tracked).collect(); + if !not_tracked.is_empty() { + tracing::warn!( + "Some charts are not tracked for initial update ({not_tracked:?}). \ + The values returned in update status endpoint might be incorrect (overly optimistic). \ + This is a bug in service implementation. " + ) + } + } + + fn mark_all_trackers(&mut self, charts: &HashSet, status: UpdateStatusChange) { + for chart in charts { + self.independent.track_status_change(chart, status.clone()); + self.blocks_dependent + .track_status_change(chart, status.clone()); + self.internal_transactions_dependent + .track_status_change(chart, status.clone()); + self.user_ops_dependent + .track_status_change(chart, status.clone()); + } + } + + fn joint_counts_by_status(&self) -> Vec<(String, usize)> { + let mut counts = [0usize; 4]; + for subset in [ + &self.independent, + &self.blocks_dependent, + &self.internal_transactions_dependent, + &self.user_ops_dependent, + ] { + let next_counts = subset.counts(); + for (c, n) in counts.iter_mut().zip(next_counts) { + *c += n; + } + } + vec![ + ("pending".to_string(), counts[0]), + ("waiting_for_starting_condition".to_string(), counts[1]), + ("running_initial_update".to_string(), counts[2]), + ("completed_initial_update".to_string(), counts[3]), + ] + } + + fn get_all_status(&self) -> proto_v1::ChartSubsetUpdateStatus { + combine_statuses(&[ + self.independent.get_status(), + self.blocks_dependent.get_status(), + self.internal_transactions_dependent.get_status(), + self.user_ops_dependent.get_status(), + ]) + } + + fn report(&self) { + let all_count_by_status = self.joint_counts_by_status(); + let mut log_string = String::new(); + for (status, count) in all_count_by_status { + log_string.push_str(&format!("{status} charts - {count}; ")); + } + let independent_status = self.independent.get_status(); + let blocks_dependent_status = self.blocks_dependent.get_status(); + let internal_transactions_dependent_status = + self.internal_transactions_dependent.get_status(); + let user_ops_dependent_status = self.user_ops_dependent.get_status(); + let all_status = self.get_all_status(); + tracing::info!( + independent_status =? independent_status, + blocks_dependent_status =? blocks_dependent_status, + internal_transactions_dependent_status =? internal_transactions_dependent_status, + user_ops_dependent_status =? user_ops_dependent_status, + all_status =? all_status, + "update status report: {log_string}" + ); + } +} + +fn status_to_int(status: &proto_v1::ChartSubsetUpdateStatus) -> u32 { + match status { + proto_v1::ChartSubsetUpdateStatus::Pending => 0, + proto_v1::ChartSubsetUpdateStatus::WaitingForStartingCondition => 1, + proto_v1::ChartSubsetUpdateStatus::RunningInitialUpdate => 2, + proto_v1::ChartSubsetUpdateStatus::CompletedInitialUpdate => 3, + } +} + +fn combine_statuses<'a>( + statuses: impl IntoIterator, +) -> proto_v1::ChartSubsetUpdateStatus { + let status = statuses + .into_iter() + .min_by(|a, b| status_to_int(a).cmp(&status_to_int(b))) + .cloned(); + status.unwrap_or(proto_v1::ChartSubsetUpdateStatus::CompletedInitialUpdate) +} + +/// Track update status of some arbitrary chart set +struct UpdateChartSubsetTracker { + // the charts travel from the topmost to the bottom field as + // they get processed + /// charts for which no actions were taken yet + pending: HashSet, + waiting_for_starting_condition: HashSet, + running_initial_update: HashSet, + completed_initial_update: HashSet, +} + +#[derive(Debug, Clone)] +enum UpdateStatusChange { + WaitingForStartingCondition, + RunningInitialUpdate, + CompletedInitialUpdate, +} + +impl UpdateChartSubsetTracker { + pub fn new(charts: HashSet) -> Self { + Self { + pending: charts, + waiting_for_starting_condition: HashSet::new(), + running_initial_update: HashSet::new(), + completed_initial_update: HashSet::new(), + } + } + + pub fn track_status_change(&mut self, chart: &ChartKey, change: UpdateStatusChange) { + let key_from_previous_status = match change { + UpdateStatusChange::WaitingForStartingCondition => self.pending.take(chart), + UpdateStatusChange::RunningInitialUpdate => self + .waiting_for_starting_condition + .take(chart) + .or_else(|| self.pending.take(chart)), + UpdateStatusChange::CompletedInitialUpdate => self + .running_initial_update + .take(chart) + .or_else(|| self.waiting_for_starting_condition.take(chart)) + .or_else(|| self.pending.take(chart)), + }; + if let Some(key) = key_from_previous_status { + match change { + UpdateStatusChange::WaitingForStartingCondition => { + self.waiting_for_starting_condition.insert(key); + } + UpdateStatusChange::RunningInitialUpdate => { + self.running_initial_update.insert(key); + } + UpdateStatusChange::CompletedInitialUpdate => { + self.completed_initial_update.insert(key); + } + } + } + } + + pub fn get_status(&self) -> proto_v1::ChartSubsetUpdateStatus { + match ( + self.pending.is_empty(), + self.waiting_for_starting_condition.is_empty(), + self.running_initial_update.is_empty(), + self.completed_initial_update.is_empty(), + ) { + (true, true, true, true) | (true, true, true, false) => { + proto_v1::ChartSubsetUpdateStatus::CompletedInitialUpdate + } + (true, true, false, _) => proto_v1::ChartSubsetUpdateStatus::RunningInitialUpdate, + (true, false, _, _) => proto_v1::ChartSubsetUpdateStatus::WaitingForStartingCondition, + (false, _, _, _) => proto_v1::ChartSubsetUpdateStatus::Pending, + } + } + + pub fn counts(&self) -> [usize; 4] { + [ + self.pending.len(), + self.waiting_for_starting_condition.len(), + self.running_initial_update.len(), + self.completed_initial_update.len(), + ] + } +} diff --git a/stats/stats-server/tests/config/test.toml b/stats/stats-server/tests/config/test.toml deleted file mode 100644 index 845d2466f..000000000 --- a/stats/stats-server/tests/config/test.toml +++ /dev/null @@ -1,8 +0,0 @@ -[metrics] -enabled = false - -[jaeger] -enabled = false - -[tracing] -enabled = false diff --git a/stats/stats-server/tests/common.rs b/stats/stats-server/tests/it/common.rs similarity index 64% rename from stats/stats-server/tests/common.rs rename to stats/stats-server/tests/it/common.rs index 6e3bf94fb..1745e26b7 100644 --- a/stats/stats-server/tests/common.rs +++ b/stats/stats-server/tests/it/common.rs @@ -1,7 +1,9 @@ -use std::{collections::HashMap, path::PathBuf, str::FromStr}; +use std::{collections::HashMap, future::Future, path::PathBuf, str::FromStr, time::Duration}; use blockscout_service_launcher::{ - launcher::ConfigSettings, test_database::TestDbGuard, test_server::get_test_server_settings, + launcher::ConfigSettings, + test_database::TestDbGuard, + test_server::{get_test_server_settings, send_get_request}, }; use reqwest::{RequestBuilder, Response}; use stats_proto::blockscout::stats::v1 as proto_v1; @@ -9,7 +11,10 @@ use stats_server::{ auth::{ApiKey, API_KEY_NAME}, Settings, }; -use tokio::task::JoinSet; +use tokio::{ + task::JoinSet, + time::{error::Elapsed, sleep}, +}; use url::Url; use wiremock::MockServer; @@ -24,13 +29,76 @@ pub async fn send_arbitrary_request(request: RequestBuilder) -> Response { .unwrap_or_else(|_| panic!("Failed to send request")); if !response.status().is_success() { - let status = response.status(); - let message = response.text().await.expect("Read body as text"); - panic!("Invalid status code (success expected). Status: {status}. Message: {message}") + panic!("{}", response_panic_message(response).await); } response } +pub(crate) async fn response_panic_message(response: Response) -> String { + let status = response.status(); + let message = response.text().await.expect("Read body as text"); + format!("Invalid status code (success expected). Status: {status}. Message: {message}") +} + +pub enum ChartSubset { + Independent, + #[allow(unused)] + BlocksDependent, + InternalTransactionsDependent, + #[allow(unused)] + UserOpsDependent, + AllCharts, +} + +/// for `init_server` +pub async fn healthcheck_successful(response: Response) -> bool { + let healthcheck_status = response + .json::() + .await + .unwrap() + .status(); + healthcheck_status == proto_v1::health_check_response::ServingStatus::Serving +} + +pub async fn wait_for_subset_to_update(base: &Url, subset: ChartSubset) { + wait_until(Duration::from_secs(300), || async { + let statuses: proto_v1::UpdateStatus = + send_get_request(base, "/api/v1/update-status").await; + let matching_status = match subset { + ChartSubset::Independent => statuses.independent_status(), + ChartSubset::BlocksDependent => statuses.blocks_dependent_status(), + ChartSubset::InternalTransactionsDependent => { + statuses.internal_transactions_dependent_status() + } + ChartSubset::UserOpsDependent => statuses.user_ops_dependent_status(), + ChartSubset::AllCharts => statuses.all_status(), + }; + if matching_status == proto_v1::ChartSubsetUpdateStatus::CompletedInitialUpdate { + return true; + } + false + }) + .await + .expect("Did not reach required indexing status in time"); +} + +pub async fn wait_until(timeout: Duration, condition_fut: F) -> Result<(), Elapsed> +where + F: Fn() -> Fut, + Fut: Future, +{ + let wait_job = async { + loop { + let future = condition_fut(); + if future.await { + return; + } + sleep(Duration::from_millis(250)).await; + } + }; + tokio::time::timeout(timeout, wait_job).await +} + pub async fn enabled_resolutions( line_charts: stats_proto::blockscout::stats::v1::LineCharts, ) -> HashMap> { @@ -57,6 +125,10 @@ pub fn get_test_stats_settings( settings.blockscout_db_url = blockscout_db.db_url(); settings.blockscout_api_url = Some(url::Url::from_str(&blockscout_api.uri()).unwrap()); settings.enable_all_arbitrum = true; + settings.metrics.enabled = false; + settings.jaeger.enabled = false; + // initialized separately to prevent errors (with `try_init`) + settings.tracing.enabled = false; (settings, base) } diff --git a/stats/stats-server/tests/it/mock_blockscout_reindex.rs b/stats/stats-server/tests/it/mock_blockscout_reindex.rs index 36a5432f3..aeb0c88bf 100644 --- a/stats/stats-server/tests/it/mock_blockscout_reindex.rs +++ b/stats/stats-server/tests/it/mock_blockscout_reindex.rs @@ -12,18 +12,20 @@ use stats_server::{auth::ApiKey, stats}; use tokio::time::sleep; use url::Url; -use crate::common::{get_test_stats_settings, request_reupdate_from, setup_single_key}; +use crate::common::{ + get_test_stats_settings, healthcheck_successful, request_reupdate_from, setup_single_key, +}; /// Uses reindexing, so needs to be independent #[tokio::test] #[ignore = "needs database"] -async fn tests_reupdate_works() { - let test_name = "tests_reupdate_works"; +async fn test_reupdate_works() { + let test_name = "test_reupdate_works"; + let _ = tracing_subscriber::fmt::try_init(); let (stats_db, blockscout_db) = init_db_all(test_name).await; let max_date = NaiveDate::from_str("2023-03-01").unwrap(); fill_mock_blockscout_data(&blockscout_db, max_date).await; let blockscout_api = default_mock_blockscout_api().await; - std::env::set_var("STATS__CONFIG", "./tests/config/test.toml"); let (mut settings, base) = get_test_stats_settings(&stats_db, &blockscout_db, &blockscout_api); // obviously don't use this anywhere except tests let api_key = ApiKey::from_str_infallible("123"); @@ -31,7 +33,13 @@ async fn tests_reupdate_works() { // settings.tracing.enabled = true; let wait_multiplier = if settings.tracing.enabled { 3 } else { 1 }; - init_server(|| stats(settings), &base).await; + init_server( + || stats(settings), + &base, + Some(Duration::from_secs(60)), + Some(healthcheck_successful), + ) + .await; // Sleep until server will start and calculate all values sleep(Duration::from_secs(8 * wait_multiplier)).await; diff --git a/stats/stats-server/tests/it/mock_blockscout_simple/common_tests.rs b/stats/stats-server/tests/it/mock_blockscout_simple/common_tests.rs index 883aa31f2..839132342 100644 --- a/stats/stats-server/tests/it/mock_blockscout_simple/common_tests.rs +++ b/stats/stats-server/tests/it/mock_blockscout_simple/common_tests.rs @@ -10,9 +10,12 @@ use stats_proto::blockscout::stats::v1::{ }; use url::Url; -use crate::{array_of_variables_with_names, common::enabled_resolutions}; +use crate::{ + array_of_variables_with_names, + common::{enabled_resolutions, sorted_vec}, +}; -pub async fn test_lines_ok(base: Url) { +pub async fn test_lines_ok(base: Url, blockscout_indexed: bool, user_ops_indexed: bool) { let line_charts: stats_proto::blockscout::stats::v1::LineCharts = send_get_request(&base, "/api/v1/lines").await; @@ -34,43 +37,52 @@ pub async fn test_lines_ok(base: Url) { let mut enabled_resolutions = enabled_resolutions(line_charts).await; - for line_name in [ - // disabled charts are commented out - "accountsGrowth", - "activeAccounts", - // "activeRecurringAccounts60Days", - // "activeRecurringAccounts90Days", - // "activeRecurringAccounts120Days", - "averageBlockSize", - "averageBlockRewards", - "newAccounts", - "averageGasLimit", - "averageGasPrice", - "averageTxnFee", - "gasUsedGrowth", - // "nativeCoinHoldersGrowth", - // "nativeCoinSupply", - // "newNativeCoinHolders", - "newBlocks", - "newNativeCoinTransfers", - "newTxns", - "txnsFee", - "txnsGrowth", - "newOperationalTxns", - "operationalTxnsGrowth", - "txnsSuccessRate", - "newUserOps", - "userOpsGrowth", - "newAccountAbstractionWallets", - "accountAbstractionWalletsGrowth", - "activeAccountAbstractionWallets", - "activeBundlers", - "activePaymasters", - "newVerifiedContracts", - "newContracts", - "verifiedContractsGrowth", - "contractsGrowth", - ] { + let mut expected_lines = vec![]; + if blockscout_indexed { + expected_lines.extend([ + // disabled charts are commented out + "accountsGrowth", + "activeAccounts", + // "activeRecurringAccounts60Days", + // "activeRecurringAccounts90Days", + // "activeRecurringAccounts120Days", + "averageBlockSize", + "averageBlockRewards", + "newAccounts", + "averageGasLimit", + "averageGasPrice", + "averageTxnFee", + "gasUsedGrowth", + // "nativeCoinHoldersGrowth", + // "nativeCoinSupply", + // "newNativeCoinHolders", + "newBlocks", + "newNativeCoinTransfers", + "newTxns", + "txnsFee", + "txnsGrowth", + "newOperationalTxns", + "operationalTxnsGrowth", + "txnsSuccessRate", + "newVerifiedContracts", + "newContracts", + "verifiedContractsGrowth", + "contractsGrowth", + ]); + } + if user_ops_indexed { + expected_lines.extend([ + "newUserOps", + "userOpsGrowth", + "newAccountAbstractionWallets", + "accountAbstractionWalletsGrowth", + "activeAccountAbstractionWallets", + "activeBundlers", + "activePaymasters", + ]); + } + + for line_name in expected_lines { let line_resolutions = enabled_resolutions .remove(line_name) .unwrap_or_else(|| panic!("must return chart info for {}", &line_name)); @@ -112,14 +124,32 @@ pub async fn test_lines_ok(base: Url) { let _chart: serde_json::Value = send_get_request(&base, &format!("/api/v1/lines/{line_name}")).await; } - assert!( - enabled_resolutions.is_empty(), - "some charts were not tested ({:?})", - enabled_resolutions - ); + + // check that remaining are empty + for (line_chart_id, resolutions) in enabled_resolutions { + for resolution in resolutions { + let chart: serde_json::Value = send_get_request( + &base, + &format!("/api/v1/lines/{line_chart_id}?resolution={resolution}"), + ) + .await; + let chart_data = chart + .as_object() + .expect("response has to be json object") + .get("chart") + .expect("response doesn't have 'chart' field") + .as_array() + .expect("'chart' field has to be json array"); + + assert!( + chart_data.is_empty(), + "chart '{line_chart_id}' '{resolution}' is not empty (it should not be enabled)" + ); + } + } } -pub async fn test_counters_ok(base: Url) { +pub async fn test_counters_ok(base: Url, blockscout_indexed: bool, user_ops_indexed: bool) { let counters: Counters = send_get_request(&base, "/api/v1/counters").await; for counter in counters.counters.iter() { assert!(!counter.description.is_empty()); @@ -127,39 +157,59 @@ pub async fn test_counters_ok(base: Url) { } // Also check the order set in layout let counter_names: Vec<_> = counters.counters.iter().map(|c| c.id.as_str()).collect(); - let expected_counter_names: Vec<_> = [ + + // always present counters are + // - from main/tx/contracts pages + // (that are also available as regular counters) + // - with fallback query logic + // (they are returned even without calling an update) + // (they all coincide with the previous case) + // - that are valid w/o fully indexed blockscout + let mut expected_counter_names: Vec<_> = vec![ + // main page "averageBlockTime", - "completedTxns", - "lastNewContracts", - "lastNewVerifiedContracts", - "totalAccounts", "totalAddresses", "totalBlocks", - "totalContracts", - // "totalNativeCoinHolders", // disabled - "totalNativeCoinTransfers", - "totalTokens", "totalTxns", "totalOperationalTxns", - "totalUserOps", - "totalAccountAbstractionWallets", - "totalVerifiedContracts", - "newTxns24h", - "newOperationalTxns24h", + // transactions "pendingTxns30m", "txnsFee24h", "averageTxnFee24h", - // on a different page; they are checked by other endpoint tests and - // `check_all_enabled_charts_have_endpoints`. + "newTxns24h", + "newOperationalTxns24h", + // contracts + "totalContracts", + "totalVerifiedContracts", + // valid w/o + "totalTokens", + ]; - // "newContracts24h", - // "newVerifiedContracts24h", - // "yesterdayTxns", - ] - .into_iter() - .collect(); + if blockscout_indexed { + expected_counter_names.extend([ + "completedTxns", + "lastNewContracts", + "lastNewVerifiedContracts", + "totalAccounts", + // "totalNativeCoinHolders", // disabled + "totalNativeCoinTransfers", + // on a different page; they are checked by other endpoint tests and + // `check_all_enabled_charts_have_endpoints`. - assert_eq!(counter_names, expected_counter_names); + // "newContracts24h", + // "newVerifiedContracts24h", + // "yesterdayTxns", + ]); + } + + if user_ops_indexed { + expected_counter_names.extend(["totalUserOps", "totalAccountAbstractionWallets"]); + } + + assert_eq!( + sorted_vec(counter_names), + sorted_vec(expected_counter_names) + ); } pub async fn test_main_page_ok(base: Url, expect_arbitrum: bool) { @@ -190,7 +240,8 @@ pub async fn test_main_page_ok(base: Url, expect_arbitrum: bool) { ])); } for (name, counter) in counters { - let counter = counter.unwrap_or_else(|| panic!("page counter {} must be available", name)); + let counter = + counter.unwrap_or_else(|| panic!("main page counter {} must be available", name)); assert!(!counter.description.is_empty()); assert!(!counter.title.is_empty()); } @@ -232,8 +283,8 @@ pub async fn test_transactions_page_ok(base: Url, expect_arbitrum: bool) { ])); } for (name, counter) in counters { - #[allow(clippy::expect_fun_call)] - let counter = counter.expect(&format!("page counter {} must be available", name)); + let counter = counter + .unwrap_or_else(|| panic!("transactions page counter {} must be available", name)); assert!(!counter.description.is_empty()); assert!(!counter.title.is_empty()); } @@ -253,8 +304,8 @@ pub async fn test_contracts_page_ok(base: Url) { new_verified_contracts_24h, ]); for (name, counter) in counters { - #[allow(clippy::expect_fun_call)] - let counter = counter.expect(&format!("page counter {} must be available", name)); + let counter = + counter.unwrap_or_else(|| panic!("contracts page counter {} must be available", name)); assert!(!counter.description.is_empty()); assert!(!counter.title.is_empty()); } diff --git a/stats/stats-server/tests/it/mock_blockscout_simple/mod.rs b/stats/stats-server/tests/it/mock_blockscout_simple/mod.rs index b32b9a230..a6660b39f 100644 --- a/stats/stats-server/tests/it/mock_blockscout_simple/mod.rs +++ b/stats/stats-server/tests/it/mock_blockscout_simple/mod.rs @@ -1,34 +1,31 @@ -//! Tests for fully initialized blockscout without reindexing +//! Tests for fully initialized blockscout without reindexing. +//! +//! The tests also must not change the state of blockscout db. use std::str::FromStr; +use blockscout_service_launcher::test_database::TestDbGuard; use chrono::NaiveDate; -use futures::FutureExt; use stats::tests::{init_db::init_db_blockscout, mock_blockscout::fill_mock_blockscout_data}; -use tokio::task::JoinSet; - -use crate::common::run_consolidated_tests; +use tokio::sync::OnceCell; mod common_tests; mod stats_full; mod stats_no_arbitrum; mod stats_not_indexed; +mod stats_not_updated; -/// Tests that do not change the state of blockscout db -#[tokio::test] -#[ignore = "needs database"] -async fn tests_with_mock_blockscout() { - let test_name = "tests_with_mock_blockscout"; - let blockscout_db = init_db_blockscout(test_name).await; - fill_mock_blockscout_data(&blockscout_db, NaiveDate::from_str("2023-03-01").unwrap()).await; +static MOCK_BLOCKSCOUT: OnceCell = OnceCell::const_new(); - let tests: JoinSet<_> = [ - stats_full::run_fully_initialized_stats_tests(blockscout_db.clone()).boxed(), - stats_no_arbitrum::run_chart_pages_tests_with_disabled_arbitrum(blockscout_db.clone()) - .boxed(), - stats_not_indexed::run_tests_with_charts_uninitialized(blockscout_db.clone()).boxed(), - ] - .into_iter() - .collect(); - run_consolidated_tests(tests, test_name).await; +/// All tests using this must not change the state of blockscout db. +async fn get_mock_blockscout() -> &'static TestDbGuard { + MOCK_BLOCKSCOUT + .get_or_init(|| async { + let test_name = "tests_with_mock_blockscout"; + let blockscout_db = init_db_blockscout(test_name).await; + fill_mock_blockscout_data(&blockscout_db, NaiveDate::from_str("2023-03-01").unwrap()) + .await; + blockscout_db + }) + .await } diff --git a/stats/stats-server/tests/it/mock_blockscout_simple/stats_full.rs b/stats/stats-server/tests/it/mock_blockscout_simple/stats_full.rs index 951bebd5c..af4349954 100644 --- a/stats/stats-server/tests/it/mock_blockscout_simple/stats_full.rs +++ b/stats/stats-server/tests/it/mock_blockscout_simple/stats_full.rs @@ -4,33 +4,47 @@ use std::time::Duration; -use blockscout_service_launcher::{test_database::TestDbGuard, test_server::init_server}; +use blockscout_service_launcher::test_server::init_server; use futures::FutureExt; use stats::tests::{init_db::init_db, mock_blockscout::default_mock_blockscout_api}; use stats_server::stats; -use tokio::{task::JoinSet, time::sleep}; +use tokio::task::JoinSet; use super::common_tests::{ test_contracts_page_ok, test_counters_ok, test_lines_ok, test_main_page_ok, test_transactions_page_ok, }; -use crate::common::{get_test_stats_settings, run_consolidated_tests}; +use crate::{ + common::{ + get_test_stats_settings, healthcheck_successful, run_consolidated_tests, + wait_for_subset_to_update, ChartSubset, + }, + it::mock_blockscout_simple::get_mock_blockscout, +}; -pub async fn run_fully_initialized_stats_tests(blockscout_db: TestDbGuard) { +#[tokio::test] +#[ignore = "needs database"] +pub async fn run_fully_initialized_stats_tests() { let test_name = "run_fully_initialized_stats_tests"; + let _ = tracing_subscriber::fmt::try_init(); let stats_db = init_db(test_name).await; + let blockscout_db = get_mock_blockscout().await; let blockscout_api = default_mock_blockscout_api().await; - std::env::set_var("STATS__CONFIG", "./tests/config/test.toml"); - let (settings, base) = get_test_stats_settings(&stats_db, &blockscout_db, &blockscout_api); + let (settings, base) = get_test_stats_settings(&stats_db, blockscout_db, &blockscout_api); - init_server(|| stats(settings), &base).await; + init_server( + || stats(settings), + &base, + Some(Duration::from_secs(60)), + Some(healthcheck_successful), + ) + .await; - // Sleep until server will start and calculate all values - sleep(Duration::from_secs(8)).await; + wait_for_subset_to_update(&base, ChartSubset::AllCharts).await; let tests: JoinSet<_> = [ - test_lines_ok(base.clone()).boxed(), - test_counters_ok(base.clone()).boxed(), + test_lines_ok(base.clone(), true, true).boxed(), + test_counters_ok(base.clone(), true, true).boxed(), test_main_page_ok(base.clone(), true).boxed(), test_transactions_page_ok(base.clone(), true).boxed(), test_contracts_page_ok(base).boxed(), diff --git a/stats/stats-server/tests/it/mock_blockscout_simple/stats_no_arbitrum.rs b/stats/stats-server/tests/it/mock_blockscout_simple/stats_no_arbitrum.rs index df35c90fa..5e3e060a2 100644 --- a/stats/stats-server/tests/it/mock_blockscout_simple/stats_no_arbitrum.rs +++ b/stats/stats-server/tests/it/mock_blockscout_simple/stats_no_arbitrum.rs @@ -4,28 +4,42 @@ use std::time::Duration; -use blockscout_service_launcher::{test_database::TestDbGuard, test_server::init_server}; +use blockscout_service_launcher::test_server::init_server; use futures::FutureExt; use stats::tests::{init_db::init_db, mock_blockscout::default_mock_blockscout_api}; use stats_server::stats; -use tokio::{task::JoinSet, time::sleep}; +use tokio::task::JoinSet; -use crate::common::{get_test_stats_settings, run_consolidated_tests}; +use crate::{ + common::{ + get_test_stats_settings, healthcheck_successful, run_consolidated_tests, + wait_for_subset_to_update, ChartSubset, + }, + it::mock_blockscout_simple::get_mock_blockscout, +}; use super::common_tests::{test_main_page_ok, test_transactions_page_ok}; -pub async fn run_chart_pages_tests_with_disabled_arbitrum(blockscout_db: TestDbGuard) { +#[tokio::test] +#[ignore = "needs database"] +pub async fn run_chart_pages_tests_with_disabled_arbitrum() { let test_name = "run_chart_pages_tests_with_disabled_arbitrum"; + let _ = tracing_subscriber::fmt::try_init(); let stats_db = init_db(test_name).await; + let blockscout_db = get_mock_blockscout().await; let blockscout_api = default_mock_blockscout_api().await; - std::env::set_var("STATS__CONFIG", "./tests/config/test.toml"); - let (mut settings, base) = get_test_stats_settings(&stats_db, &blockscout_db, &blockscout_api); + let (mut settings, base) = get_test_stats_settings(&stats_db, blockscout_db, &blockscout_api); settings.enable_all_arbitrum = false; - init_server(|| stats(settings), &base).await; + init_server( + || stats(settings), + &base, + Some(Duration::from_secs(60)), + Some(healthcheck_successful), + ) + .await; - // Sleep until server will start and calculate all values - sleep(Duration::from_secs(8)).await; + wait_for_subset_to_update(&base, ChartSubset::AllCharts).await; let tests: JoinSet<_> = [ test_main_page_ok(base.clone(), false).boxed(), diff --git a/stats/stats-server/tests/it/mock_blockscout_simple/stats_not_indexed.rs b/stats/stats-server/tests/it/mock_blockscout_simple/stats_not_indexed.rs index a966e4fc7..62838c6fa 100644 --- a/stats/stats-server/tests/it/mock_blockscout_simple/stats_not_indexed.rs +++ b/stats/stats-server/tests/it/mock_blockscout_simple/stats_not_indexed.rs @@ -5,61 +5,76 @@ use std::time::Duration; -use blockscout_service_launcher::{ - test_database::TestDbGuard, - test_server::{init_server, send_get_request}, -}; +use blockscout_service_launcher::test_server::init_server; use futures::FutureExt; -use itertools::Itertools; use pretty_assertions::assert_eq; -use stats::tests::{init_db::init_db, mock_blockscout::mock_blockscout_api}; -use stats_proto::blockscout::stats::{ - v1 as proto_v1, - v1::{health_check_response::ServingStatus, Counters, HealthCheckResponse}, +use stats::tests::{ + init_db::init_db, + mock_blockscout::{mock_blockscout_api, user_ops_status_response_json}, }; +use stats_proto::blockscout::stats::v1 as proto_v1; use stats_server::{ auth::{ApiKey, API_KEY_NAME}, stats, }; -use tokio::{task::JoinSet, time::sleep}; +use tokio::task::JoinSet; use url::Url; use wiremock::ResponseTemplate; -use super::common_tests::{test_contracts_page_ok, test_main_page_ok, test_transactions_page_ok}; -use crate::common::{ - enabled_resolutions, get_test_stats_settings, run_consolidated_tests, send_arbitrary_request, - setup_single_key, sorted_vec, +use super::common_tests::{ + test_contracts_page_ok, test_counters_ok, test_lines_ok, test_main_page_ok, + test_transactions_page_ok, +}; +use crate::{ + common::{ + get_test_stats_settings, healthcheck_successful, run_consolidated_tests, + send_arbitrary_request, setup_single_key, wait_for_subset_to_update, ChartSubset, + }, + it::mock_blockscout_simple::get_mock_blockscout, }; -pub async fn run_tests_with_charts_uninitialized(blockscout_db: TestDbGuard) { - let test_name = "run_tests_with_charts_uninitialized"; +#[tokio::test] +#[ignore = "needs database"] +pub async fn run_tests_with_nothing_indexed() { + let test_name = "run_tests_with_nothing_indexed"; + let _ = tracing_subscriber::fmt::try_init(); let stats_db = init_db(test_name).await; - let blockscout_api = mock_blockscout_api(ResponseTemplate::new(200).set_body_string( - r#"{ - "finished_indexing": false, - "finished_indexing_blocks": false, - "indexed_blocks_ratio": "0.00", - "indexed_internal_transactions_ratio": null - }"#, - )) + let blockscout_db = get_mock_blockscout().await; + let blockscout_api = mock_blockscout_api( + ResponseTemplate::new(200).set_body_string( + r#"{ + "finished_indexing": false, + "finished_indexing_blocks": false, + "indexed_blocks_ratio": "0.10", + "indexed_internal_transactions_ratio": null + }"#, + ), + // will error getting user ops status + None, + ) .await; - std::env::set_var("STATS__CONFIG", "./tests/config/test.toml"); - let (mut settings, base) = get_test_stats_settings(&stats_db, &blockscout_db, &blockscout_api); + let (mut settings, base) = get_test_stats_settings(&stats_db, blockscout_db, &blockscout_api); // obviously don't use this anywhere except tests let api_key = ApiKey::from_str_infallible("123"); setup_single_key(&mut settings, api_key.clone()); - init_server(|| stats(settings), &base).await; + init_server( + || stats(settings), + &base, + Some(Duration::from_secs(60)), + Some(healthcheck_successful), + ) + .await; - // Sleep until server will start and calculate all values - sleep(Duration::from_secs(8)).await; + wait_for_subset_to_update(&base, ChartSubset::Independent).await; // these pages must be available right away to display users let tests: JoinSet<_> = [ test_main_page_ok(base.clone(), true).boxed(), test_transactions_page_ok(base.clone(), true).boxed(), test_contracts_page_ok(base.clone()).boxed(), - test_lines_counters_not_indexed_ok(base.clone()).boxed(), + test_lines_ok(base.clone(), false, false).boxed(), + test_counters_ok(base.clone(), false, false).boxed(), test_swagger_ok(base.clone()).boxed(), test_reupdate_without_correct_key_is_rejected(base).boxed(), ] @@ -68,76 +83,44 @@ pub async fn run_tests_with_charts_uninitialized(blockscout_db: TestDbGuard) { run_consolidated_tests(tests, test_name).await; } -pub async fn test_lines_counters_not_indexed_ok(base: Url) { - // healthcheck is verified in `init_server`, but we double-check it just in case - let request = - reqwest::Client::new().request(reqwest::Method::GET, base.join("/health").unwrap()); - let response = send_arbitrary_request(request).await; - - assert_eq!( - response.json::().await.unwrap(), - HealthCheckResponse { - status: ServingStatus::Serving as i32 - } - ); +#[tokio::test] +#[ignore = "needs database"] +pub async fn run_tests_with_user_ops_not_indexed() { + let test_name = "run_tests_with_user_ops_not_indexed"; + let _ = tracing_subscriber::fmt::try_init(); + let stats_db = init_db(test_name).await; + let blockscout_db = get_mock_blockscout().await; + let blockscout_api = mock_blockscout_api( + ResponseTemplate::new(200).set_body_string( + r#"{ + "finished_indexing": true, + "finished_indexing_blocks": true, + "indexed_blocks_ratio": "1.00", + "indexed_internal_transactions_ratio": "1.00" + }"#, + ), + Some(ResponseTemplate::new(200).set_body_string(user_ops_status_response_json(false))), + ) + .await; + let (settings, base) = get_test_stats_settings(&stats_db, blockscout_db, &blockscout_api); - // all charts on stats page require indexed blockscout - - let enabled_resolutions = - enabled_resolutions(send_get_request(&base, "/api/v1/lines").await).await; - for (line_chart_id, resolutions) in enabled_resolutions { - for resolution in resolutions { - let chart: serde_json::Value = send_get_request( - &base, - &format!("/api/v1/lines/{line_chart_id}?resolution={resolution}"), - ) - .await; - let chart_data = chart - .as_object() - .expect("response has to be json object") - .get("chart") - .expect("response doesn't have 'chart' field") - .as_array() - .expect("'chart' field has to be json array"); - - assert!( - chart_data.is_empty(), - "chart '{line_chart_id}' '{resolution}' is not empty" - ); - } - } - - let counters: Counters = send_get_request(&base, "/api/v1/counters").await; - - // returns only counters - // - from main/tx/contracts pages - // (that are also available as regular counters) - // - with fallback query logic - // (they are returned even without calling an update) - // (they all coincide with the previous case) - // - that are valid w/o fully indexed blockscout - assert_eq!( - sorted_vec(counters.counters.into_iter().map(|c| c.id).collect_vec()), - sorted_vec(vec![ - // main page - "averageBlockTime", - "totalAddresses", - "totalBlocks", - "totalTxns", - "totalOperationalTxns", - // transactions - "pendingTxns30m", - "txnsFee24h", - "averageTxnFee24h", - "newTxns24h", - "newOperationalTxns24h", - // contracts - "totalContracts", - "totalVerifiedContracts", - // valid w/o - "totalTokens", - ]) + init_server( + move || stats(settings), + &base, + Some(Duration::from_secs(60)), + Some(healthcheck_successful), ) + .await; + + wait_for_subset_to_update(&base, ChartSubset::InternalTransactionsDependent).await; + + let tests: JoinSet<_> = [ + test_lines_ok(base.clone(), true, false).boxed(), + test_counters_ok(base.clone(), true, false).boxed(), + ] + .into_iter() + .collect(); + run_consolidated_tests(tests, test_name).await; } pub async fn test_swagger_ok(base: Url) { diff --git a/stats/stats-server/tests/it/mock_blockscout_simple/stats_not_updated.rs b/stats/stats-server/tests/it/mock_blockscout_simple/stats_not_updated.rs index 411df9af8..dc9ee5705 100644 --- a/stats/stats-server/tests/it/mock_blockscout_simple/stats_not_updated.rs +++ b/stats/stats-server/tests/it/mock_blockscout_simple/stats_not_updated.rs @@ -3,28 +3,61 @@ //! - stats server is fully enabled but not updated (yet) //! (e.g. the update is slow and in progress) -use crate::common::get_test_stats_settings; +use std::time::Duration; -pub async fn run_tests_with_charts_not_updated(blockscout_db: TestDbGuard) { +use blockscout_service_launcher::test_server::{init_server, send_get_request}; +use stats::tests::{ + init_db::init_db, + mock_blockscout::{mock_blockscout_api, user_ops_status_response_json}, +}; +use stats_proto::blockscout::stats::v1::{ + health_check_response::ServingStatus, Counters, HealthCheckResponse, +}; +use stats_server::stats; +use tokio::time::sleep; +use url::Url; +use wiremock::ResponseTemplate; + +use crate::{ + common::{ + enabled_resolutions, get_test_stats_settings, healthcheck_successful, + send_arbitrary_request, + }, + it::mock_blockscout_simple::get_mock_blockscout, +}; + +#[tokio::test] +#[ignore = "needs database"] +pub async fn run_tests_with_charts_not_updated() { let test_name = "run_tests_with_charts_not_updated"; + let _ = tracing_subscriber::fmt::try_init(); let stats_db = init_db(test_name).await; - let blockscout_api = mock_blockscout_api(ResponseTemplate::new(200).set_body_string( - r#"{ - "finished_indexing": false, - "finished_indexing_blocks": false, - "indexed_blocks_ratio": "0.00", - "indexed_internal_transactions_ratio": null - }"#, - )) + let blockscout_db = get_mock_blockscout().await; + let blockscout_api = mock_blockscout_api( + ResponseTemplate::new(200).set_body_string( + r#"{ + "finished_indexing": false, + "finished_indexing_blocks": false, + "indexed_blocks_ratio": "0.00", + "indexed_internal_transactions_ratio": "0.00" + }"#, + ), + Some(ResponseTemplate::new(200).set_body_string(user_ops_status_response_json(false))), + ) .await; - std::env::set_var("STATS__CONFIG", "./tests/config/test.toml"); - let (mut settings, base) = get_test_stats_settings(&stats_db, &blockscout_db, &blockscout_api); + let (mut settings, base) = get_test_stats_settings(&stats_db, blockscout_db, &blockscout_api); // will not update at all settings.force_update_on_start = None; - init_server(|| stats(settings), &base).await; + init_server( + || stats(settings), + &base, + Some(Duration::from_secs(60)), + Some(healthcheck_successful), + ) + .await; // No update so no need to wait too long - sleep(Duration::from_secs(1)).await; + sleep(Duration::from_secs(3)).await; test_lines_counters_not_updated_ok(base).await } @@ -70,9 +103,13 @@ pub async fn test_lines_counters_not_updated_ok(base: Url) { } let counters: Counters = send_get_request(&base, "/api/v1/counters").await; - // returns only counters with fallback query logic - assert_eq!( - counters.counters.into_iter().map(|c| c.id).collect_vec(), - vec!["totalAddresses", "totalBlocks", "totalTxns",] - ) + // returns counters with fallback query logic + for counter in ["totalAddresses", "totalBlocks", "totalTxns"] { + assert!( + counters.counters.iter().any(|kek| kek.id == counter), + "counter {} not found in returned counters ({:?})", + counter, + counters.counters + ); + } } diff --git a/stats/stats-server/tests/it/mod.rs b/stats/stats-server/tests/it/mod.rs index 5ae42c7c0..b4792c2e2 100644 --- a/stats/stats-server/tests/it/mod.rs +++ b/stats/stats-server/tests/it/mod.rs @@ -2,5 +2,6 @@ //! to reuse slowly-initialized parts, such as blockscout database //! or stats service +pub mod common; mod mock_blockscout_reindex; mod mock_blockscout_simple; diff --git a/stats/stats-server/tests/main.rs b/stats/stats-server/tests/main.rs index 0046df32c..f824ad0f0 100644 --- a/stats/stats-server/tests/main.rs +++ b/stats/stats-server/tests/main.rs @@ -1,2 +1,2 @@ -mod common; mod it; +pub use it::common; diff --git a/stats/stats/src/charts/chart.rs b/stats/stats/src/charts/chart.rs index 854488981..2ce292e8d 100644 --- a/stats/stats/src/charts/chart.rs +++ b/stats/stats/src/charts/chart.rs @@ -14,6 +14,7 @@ use thiserror::Error; use super::{ db_interaction::read::ApproxUnsignedDiff, + indexing_status::{BlockscoutIndexingStatus, IndexingStatus, UserOpsIndexingStatus}, query_dispatch::{ChartTypeSpecifics, QuerySerialized, QuerySerializedDyn}, }; @@ -25,6 +26,8 @@ pub enum ChartError { StatsDB(DbErr), #[error("chart {0} not found")] ChartNotFound(ChartKey), + #[error("no data for counter {0} is present. it might be because it's yet to update")] + NoCounterData(ChartKey), #[error("exceeded limit on requested data points (~{limit}); choose smaller time interval.")] IntervalTooLarge { limit: u32 }, #[error("internal error: {0}")] @@ -101,7 +104,7 @@ impl From for String { impl Display for ResolutionKind { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - (*self).to_string().fmt(f) + String::from(*self).fmt(f) } } @@ -155,40 +158,11 @@ impl Display for ChartKey { } } -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] -pub enum IndexingStatus { - NoneIndexed, - BlocksIndexed, - /// Implies that blocks are also indexed - InternalTransactionsIndexed, -} - -impl IndexingStatus { - // constants for status itself - - /// Indexing status at the start of blockscout - pub const MIN: IndexingStatus = IndexingStatus::NoneIndexed; - /// Finished indexing everything - pub const MAX: IndexingStatus = IndexingStatus::InternalTransactionsIndexed; - - // constants corresponding to status requirement - - /// The most relaxed requirement - pub const LEAST_RESTRICTIVE: IndexingStatus = Self::MIN; - /// The hardest to achieve requirement - pub const MOST_RESTRICTIVE: IndexingStatus = Self::MAX; - - pub fn most_restrictive_from( - requrements: impl Iterator, - ) -> IndexingStatus { - requrements.max().unwrap_or(Self::LEAST_RESTRICTIVE) - } -} - #[portrait::make(import( crate::charts::chart::{ - MissingDatePolicy, IndexingStatus, ResolutionKind, ChartKey + MissingDatePolicy, ResolutionKind, ChartKey }, + crate::charts::indexing_status::IndexingStatus, entity::sea_orm_active_enums::ChartType, ))] pub trait ChartProperties: Sync + Named { @@ -218,8 +192,12 @@ pub trait ChartProperties: Sync + Named { /// is propagated to its dependants with /// [`DataSource::indexing_status_requirement_recursive`](crate::data_source::DataSource::indexing_status_requirement_recursive). fn indexing_status_requirement() -> IndexingStatus { - // most of the charts need indexed blocks - IndexingStatus::BlocksIndexed + IndexingStatus { + // most of the charts need indexed blocks + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + // most of the charts don't depend on user ops + user_ops: UserOpsIndexingStatus::IndexingPastOperations, + } } /// Number of last values that are considered approximate. @@ -347,50 +325,3 @@ impl ChartPropertiesObject { } } } - -#[cfg(test)] -mod tests { - use crate::IndexingStatus; - - #[test] - fn indexing_status_requirements_are_combined_correctly() { - assert_eq!( - IndexingStatus::most_restrictive_from( - vec![ - IndexingStatus::BlocksIndexed, - IndexingStatus::InternalTransactionsIndexed, - IndexingStatus::BlocksIndexed - ] - .into_iter() - ), - IndexingStatus::InternalTransactionsIndexed - ); - - assert_eq!( - IndexingStatus::most_restrictive_from( - vec![ - IndexingStatus::NoneIndexed, - IndexingStatus::InternalTransactionsIndexed, - ] - .into_iter() - ), - IndexingStatus::InternalTransactionsIndexed - ); - - assert_eq!( - IndexingStatus::most_restrictive_from( - vec![ - IndexingStatus::InternalTransactionsIndexed, - IndexingStatus::InternalTransactionsIndexed, - ] - .into_iter() - ), - IndexingStatus::InternalTransactionsIndexed - ); - - assert_eq!( - IndexingStatus::most_restrictive_from(vec![].into_iter()), - IndexingStatus::NoneIndexed - ); - } -} diff --git a/stats/stats/src/charts/counters/average_block_time.rs b/stats/stats/src/charts/counters/average_block_time.rs index 0efda6798..a0da2fa6b 100644 --- a/stats/stats/src/charts/counters/average_block_time.rs +++ b/stats/stats/src/charts/counters/average_block_time.rs @@ -9,6 +9,7 @@ use crate::{ }, UpdateContext, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, range::UniversalRange, types::TimespanValue, utils::NANOS_PER_SEC, @@ -133,7 +134,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/new_contracts_24h.rs b/stats/stats/src/charts/counters/new_contracts_24h.rs index 06f3edf85..921724ef5 100644 --- a/stats/stats/src/charts/counters/new_contracts_24h.rs +++ b/stats/stats/src/charts/counters/new_contracts_24h.rs @@ -8,6 +8,7 @@ use crate::{ }, types::BlockscoutMigrations, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; @@ -57,7 +58,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/new_operational_txns_24h.rs b/stats/stats/src/charts/counters/new_operational_txns_24h.rs index 3004f7851..1717277f2 100644 --- a/stats/stats/src/charts/counters/new_operational_txns_24h.rs +++ b/stats/stats/src/charts/counters/new_operational_txns_24h.rs @@ -9,6 +9,7 @@ use crate::{ }, types::{BlockscoutMigrations, WrappedValue}, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, utils::sql_with_range_filter_opt, ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; @@ -70,7 +71,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/new_verified_contracts_24h.rs b/stats/stats/src/charts/counters/new_verified_contracts_24h.rs index 1b69d4605..79ee4379b 100644 --- a/stats/stats/src/charts/counters/new_verified_contracts_24h.rs +++ b/stats/stats/src/charts/counters/new_verified_contracts_24h.rs @@ -8,6 +8,7 @@ use crate::{ }, types::BlockscoutMigrations, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; @@ -56,7 +57,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/pending_txns.rs b/stats/stats/src/charts/counters/pending_txns.rs index 8b5b6e4de..109423c57 100644 --- a/stats/stats/src/charts/counters/pending_txns.rs +++ b/stats/stats/src/charts/counters/pending_txns.rs @@ -6,6 +6,7 @@ use crate::{ }, UpdateContext, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, range::UniversalRange, types::TimespanValue, ChartError, ChartProperties, IndexingStatus, MissingDatePolicy, Named, @@ -84,7 +85,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/total_aa_wallets.rs b/stats/stats/src/charts/counters/total_aa_wallets.rs index 7dc5a637f..fe247bb9d 100644 --- a/stats/stats/src/charts/counters/total_aa_wallets.rs +++ b/stats/stats/src/charts/counters/total_aa_wallets.rs @@ -3,8 +3,9 @@ use crate::{ data_manipulation::{last_point::LastPoint, map::StripExt}, local_db::DirectPointLocalDbChartSource, }, + indexing_status::{BlockscoutIndexingStatus, UserOpsIndexingStatus}, lines::AccountAbstractionWalletsGrowth, - ChartProperties, MissingDatePolicy, Named, + ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; use chrono::NaiveDate; @@ -27,6 +28,12 @@ impl ChartProperties for Properties { fn missing_date_policy() -> MissingDatePolicy { MissingDatePolicy::FillPrevious } + fn indexing_status_requirement() -> IndexingStatus { + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + } + } } pub type TotalAccountAbstractionWallets = diff --git a/stats/stats/src/charts/counters/total_addresses.rs b/stats/stats/src/charts/counters/total_addresses.rs index 5f87dadd2..fc79f901d 100644 --- a/stats/stats/src/charts/counters/total_addresses.rs +++ b/stats/stats/src/charts/counters/total_addresses.rs @@ -7,6 +7,7 @@ use crate::{ }, types::BlockscoutMigrations, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, types::timespans::DateValue, ChartError, ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; @@ -59,7 +60,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/total_blocks.rs b/stats/stats/src/charts/counters/total_blocks.rs index edb59b783..9025fc2f8 100644 --- a/stats/stats/src/charts/counters/total_blocks.rs +++ b/stats/stats/src/charts/counters/total_blocks.rs @@ -8,6 +8,7 @@ use crate::{ }, types::UpdateContext, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, range::UniversalRange, types::timespans::DateValue, ChartError, ChartProperties, IndexingStatus, MissingDatePolicy, Named, @@ -72,7 +73,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/total_contracts.rs b/stats/stats/src/charts/counters/total_contracts.rs index 30d26ca4e..1cb0432cd 100644 --- a/stats/stats/src/charts/counters/total_contracts.rs +++ b/stats/stats/src/charts/counters/total_contracts.rs @@ -6,6 +6,7 @@ use crate::{ }, UpdateContext, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, range::UniversalRange, types::timespans::DateValue, ChartError, ChartProperties, IndexingStatus, MissingDatePolicy, Named, @@ -61,7 +62,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/total_operational_txns.rs b/stats/stats/src/charts/counters/total_operational_txns.rs index fdc8ab9df..48ae27b06 100644 --- a/stats/stats/src/charts/counters/total_operational_txns.rs +++ b/stats/stats/src/charts/counters/total_operational_txns.rs @@ -5,6 +5,7 @@ use crate::{ data_manipulation::map::{Map, MapFunction}, local_db::DirectPointLocalDbChartSource, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, types::TimespanValue, ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; @@ -36,7 +37,10 @@ impl ChartProperties for Properties { } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/total_tokens.rs b/stats/stats/src/charts/counters/total_tokens.rs index 12af21304..c785bf204 100644 --- a/stats/stats/src/charts/counters/total_tokens.rs +++ b/stats/stats/src/charts/counters/total_tokens.rs @@ -6,6 +6,7 @@ use crate::{ }, types::BlockscoutMigrations, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; @@ -55,7 +56,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/total_txns.rs b/stats/stats/src/charts/counters/total_txns.rs index 1caad930f..27434bbdd 100644 --- a/stats/stats/src/charts/counters/total_txns.rs +++ b/stats/stats/src/charts/counters/total_txns.rs @@ -8,6 +8,7 @@ use crate::{ }, UpdateContext, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, range::UniversalRange, types::timespans::DateValue, ChartError, ChartProperties, IndexingStatus, MissingDatePolicy, Named, @@ -75,7 +76,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/total_user_ops.rs b/stats/stats/src/charts/counters/total_user_ops.rs index 94ea6c6dd..8e87e7a21 100644 --- a/stats/stats/src/charts/counters/total_user_ops.rs +++ b/stats/stats/src/charts/counters/total_user_ops.rs @@ -3,8 +3,9 @@ use crate::{ data_manipulation::{last_point::LastPoint, map::StripExt}, local_db::DirectPointLocalDbChartSource, }, + indexing_status::{BlockscoutIndexingStatus, UserOpsIndexingStatus}, lines::UserOpsGrowth, - ChartProperties, MissingDatePolicy, Named, + ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; use chrono::NaiveDate; @@ -27,6 +28,12 @@ impl ChartProperties for Properties { fn missing_date_policy() -> MissingDatePolicy { MissingDatePolicy::FillPrevious } + fn indexing_status_requirement() -> IndexingStatus { + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + } + } } pub type TotalUserOps = diff --git a/stats/stats/src/charts/counters/total_verified_contracts.rs b/stats/stats/src/charts/counters/total_verified_contracts.rs index 92d2eacf5..cf6c20f33 100644 --- a/stats/stats/src/charts/counters/total_verified_contracts.rs +++ b/stats/stats/src/charts/counters/total_verified_contracts.rs @@ -7,6 +7,7 @@ use crate::{ }, types::BlockscoutMigrations, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; @@ -54,7 +55,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/txns_stats_24h/average_txn_fee_24h.rs b/stats/stats/src/charts/counters/txns_stats_24h/average_txn_fee_24h.rs index acf4daf38..b59e77eea 100644 --- a/stats/stats/src/charts/counters/txns_stats_24h/average_txn_fee_24h.rs +++ b/stats/stats/src/charts/counters/txns_stats_24h/average_txn_fee_24h.rs @@ -4,6 +4,7 @@ use crate::{ local_db::DirectPointLocalDbChartSource, }, gettable_const, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, types::TimespanValue, ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; @@ -47,7 +48,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillZero } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/txns_stats_24h/new_txns_24h.rs b/stats/stats/src/charts/counters/txns_stats_24h/new_txns_24h.rs index 117c0bc8e..fc3aa8414 100644 --- a/stats/stats/src/charts/counters/txns_stats_24h/new_txns_24h.rs +++ b/stats/stats/src/charts/counters/txns_stats_24h/new_txns_24h.rs @@ -3,6 +3,7 @@ use crate::{ data_manipulation::map::{Map, MapFunction, MapParseTo}, local_db::DirectPointLocalDbChartSource, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, types::TimespanValue, ChartError, ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; @@ -45,7 +46,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/txns_stats_24h/txns_fee_24h.rs b/stats/stats/src/charts/counters/txns_stats_24h/txns_fee_24h.rs index 24ded2f6e..874201bed 100644 --- a/stats/stats/src/charts/counters/txns_stats_24h/txns_fee_24h.rs +++ b/stats/stats/src/charts/counters/txns_stats_24h/txns_fee_24h.rs @@ -4,6 +4,7 @@ use crate::{ local_db::DirectPointLocalDbChartSource, }, gettable_const, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, types::TimespanValue, ChartError, ChartProperties, IndexingStatus, MissingDatePolicy, Named, }; @@ -47,7 +48,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/yesterday_operational_txns.rs b/stats/stats/src/charts/counters/yesterday_operational_txns.rs index 2013cdf6e..bba1d190b 100644 --- a/stats/stats/src/charts/counters/yesterday_operational_txns.rs +++ b/stats/stats/src/charts/counters/yesterday_operational_txns.rs @@ -7,6 +7,7 @@ use crate::{ }, UpdateContext, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, lines::NewBlocksStatement, range::UniversalRange, types::TimespanValue, @@ -61,7 +62,10 @@ impl ChartProperties for Properties { } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/counters/yesterday_txns.rs b/stats/stats/src/charts/counters/yesterday_txns.rs index 7f33cdf4d..edf9d23c2 100644 --- a/stats/stats/src/charts/counters/yesterday_txns.rs +++ b/stats/stats/src/charts/counters/yesterday_txns.rs @@ -7,6 +7,7 @@ use crate::{ }, UpdateContext, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, lines::NewTxnsStatement, range::UniversalRange, types::TimespanValue, @@ -76,7 +77,10 @@ impl ChartProperties for Properties { MissingDatePolicy::FillPrevious } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/indexing_status.rs b/stats/stats/src/charts/indexing_status.rs new file mode 100644 index 000000000..c5a4585fb --- /dev/null +++ b/stats/stats/src/charts/indexing_status.rs @@ -0,0 +1,207 @@ +pub trait IndexingStatusTrait { + // constants for status itself + + /// Indexing status at the start of blockscout & user ops + const MIN: Self; + /// Finished indexing everything + const MAX: Self; + + // constants corresponding to status requirement + + /// The most relaxed requirement + const LEAST_RESTRICTIVE: Self; + /// The hardest to achieve requirement + const MOST_RESTRICTIVE: Self; + + fn is_requirement_satisfied(&self, requirement: &Self) -> bool; + + fn most_restrictive_from(requirements: impl Iterator + Clone) -> Self; +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct IndexingStatus { + pub blockscout: BlockscoutIndexingStatus, + pub user_ops: UserOpsIndexingStatus, +} + +impl IndexingStatusTrait for IndexingStatus { + const MIN: Self = Self { + blockscout: BlockscoutIndexingStatus::MIN, + user_ops: UserOpsIndexingStatus::MIN, + }; + const MAX: Self = Self { + blockscout: BlockscoutIndexingStatus::MAX, + user_ops: UserOpsIndexingStatus::MAX, + }; + const LEAST_RESTRICTIVE: Self = Self { + blockscout: BlockscoutIndexingStatus::LEAST_RESTRICTIVE, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + }; + const MOST_RESTRICTIVE: Self = Self { + blockscout: BlockscoutIndexingStatus::MOST_RESTRICTIVE, + user_ops: UserOpsIndexingStatus::MOST_RESTRICTIVE, + }; + + fn is_requirement_satisfied(&self, requirement: &Self) -> bool { + let blockscout_satisfied = self + .blockscout + .is_requirement_satisfied(&requirement.blockscout); + let user_ops_satisfied = self + .user_ops + .is_requirement_satisfied(&requirement.user_ops); + blockscout_satisfied && user_ops_satisfied + } + + fn most_restrictive_from(requirements: impl Iterator + Clone) -> Self { + let blockscout_requirements = requirements.clone().map(|r| r.blockscout); + let user_ops_requirements = requirements.map(|r| r.user_ops); + let blockscout_most_restrictive = + BlockscoutIndexingStatus::most_restrictive_from(blockscout_requirements); + let user_ops_most_restrictive = + UserOpsIndexingStatus::most_restrictive_from(user_ops_requirements); + Self { + blockscout: blockscout_most_restrictive, + user_ops: user_ops_most_restrictive, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum BlockscoutIndexingStatus { + NoneIndexed, + BlocksIndexed, + /// Implies that blocks are also indexed + InternalTransactionsIndexed, +} + +impl IndexingStatusTrait for BlockscoutIndexingStatus { + const MIN: Self = Self::NoneIndexed; + const MAX: Self = Self::InternalTransactionsIndexed; + + const LEAST_RESTRICTIVE: Self = Self::MIN; + const MOST_RESTRICTIVE: Self = Self::MAX; + + fn is_requirement_satisfied(&self, requirement: &BlockscoutIndexingStatus) -> bool { + self >= requirement + } + + fn most_restrictive_from(requirements: impl Iterator + Clone) -> Self { + requirements.max().unwrap_or(Self::LEAST_RESTRICTIVE) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum UserOpsIndexingStatus { + //todo: rename to be more acruate + IndexingPastOperations, + PastOperationsIndexed, +} + +impl IndexingStatusTrait for UserOpsIndexingStatus { + const MIN: Self = Self::IndexingPastOperations; + const MAX: Self = Self::PastOperationsIndexed; + + const LEAST_RESTRICTIVE: Self = Self::MIN; + const MOST_RESTRICTIVE: Self = Self::MAX; + + fn is_requirement_satisfied(&self, requirement: &UserOpsIndexingStatus) -> bool { + self >= requirement + } + + fn most_restrictive_from(requirements: impl Iterator + Clone) -> Self { + requirements.max().unwrap_or(Self::LEAST_RESTRICTIVE) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn indexing_status_requirements_are_combined_correctly() { + assert_eq!( + IndexingStatus::most_restrictive_from( + vec![ + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::IndexingPastOperations + }, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::IndexingPastOperations + } + ] + .into_iter() + ), + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::IndexingPastOperations + }, + ); + + assert_eq!( + IndexingStatus::most_restrictive_from( + vec![ + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::IndexingPastOperations + }, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed + } + ] + .into_iter() + ), + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed + }, + ); + + assert_eq!( + IndexingStatus::most_restrictive_from( + vec![ + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed + }, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::IndexingPastOperations + } + ] + .into_iter() + ), + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed + }, + ); + + assert_eq!( + IndexingStatus::most_restrictive_from( + vec![ + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed + }, + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed + } + ] + .into_iter() + ), + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed + }, + ); + + assert_eq!( + IndexingStatus::most_restrictive_from(vec![].into_iter()), + IndexingStatus::LEAST_RESTRICTIVE + ); + } +} diff --git a/stats/stats/src/charts/lines/contracts/new_contracts.rs b/stats/stats/src/charts/lines/contracts/new_contracts.rs index 603adf55c..5264eeb08 100644 --- a/stats/stats/src/charts/lines/contracts/new_contracts.rs +++ b/stats/stats/src/charts/lines/contracts/new_contracts.rs @@ -19,6 +19,7 @@ use crate::{ types::BlockscoutMigrations, }, define_and_impl_resolution_properties, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, types::timespans::{Month, Week, Year}, utils::{produce_filter_and_values, sql_with_range_filter_opt}, ChartProperties, IndexingStatus, Named, @@ -136,7 +137,10 @@ impl ChartProperties for Properties { ChartType::Line } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::InternalTransactionsIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::InternalTransactionsIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/lines/transactions/new_operational_txns_window.rs b/stats/stats/src/charts/lines/transactions/new_operational_txns_window.rs index b8a92e3dc..c319c66bd 100644 --- a/stats/stats/src/charts/lines/transactions/new_operational_txns_window.rs +++ b/stats/stats/src/charts/lines/transactions/new_operational_txns_window.rs @@ -19,6 +19,7 @@ use crate::{ types::BlockscoutMigrations, UpdateContext, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, lines::{NewBlocksStatement, NewTxnsWindowInt, NEW_TXNS_WINDOW_RANGE}, range::UniversalRange, types::{Timespan, TimespanDuration, TimespanValue}, @@ -88,7 +89,10 @@ impl ChartProperties for Properties { } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/lines/transactions/new_txns_window.rs b/stats/stats/src/charts/lines/transactions/new_txns_window.rs index bc66bc569..27746c0e3 100644 --- a/stats/stats/src/charts/lines/transactions/new_txns_window.rs +++ b/stats/stats/src/charts/lines/transactions/new_txns_window.rs @@ -20,6 +20,7 @@ use crate::{ types::BlockscoutMigrations, UpdateContext, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatusTrait, UserOpsIndexingStatus}, lines::NewTxnsStatement, range::UniversalRange, types::{Timespan, TimespanDuration, TimespanValue}, @@ -83,7 +84,10 @@ impl ChartProperties for Properties { ChartType::Line } fn indexing_status_requirement() -> IndexingStatus { - IndexingStatus::NoneIndexed + IndexingStatus { + blockscout: BlockscoutIndexingStatus::NoneIndexed, + user_ops: UserOpsIndexingStatus::LEAST_RESTRICTIVE, + } } } diff --git a/stats/stats/src/charts/lines/user_ops/aa_wallets_growth.rs b/stats/stats/src/charts/lines/user_ops/aa_wallets_growth.rs index e55fa0df6..40746290d 100644 --- a/stats/stats/src/charts/lines/user_ops/aa_wallets_growth.rs +++ b/stats/stats/src/charts/lines/user_ops/aa_wallets_growth.rs @@ -8,6 +8,7 @@ use crate::{ }, }, define_and_impl_resolution_properties, + indexing_status::{BlockscoutIndexingStatus, IndexingStatus, UserOpsIndexingStatus}, types::timespans::{Month, Week, Year}, MissingDatePolicy, Named, }; @@ -34,6 +35,12 @@ impl ChartProperties for Properties { fn missing_date_policy() -> MissingDatePolicy { MissingDatePolicy::FillPrevious } + fn indexing_status_requirement() -> IndexingStatus { + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + } + } } define_and_impl_resolution_properties!( diff --git a/stats/stats/src/charts/lines/user_ops/active_aa_wallets.rs b/stats/stats/src/charts/lines/user_ops/active_aa_wallets.rs index df084e721..0a1bd4376 100644 --- a/stats/stats/src/charts/lines/user_ops/active_aa_wallets.rs +++ b/stats/stats/src/charts/lines/user_ops/active_aa_wallets.rs @@ -13,6 +13,7 @@ use crate::{ }, types::BlockscoutMigrations, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatus, UserOpsIndexingStatus}, ChartProperties, Named, }; @@ -58,6 +59,12 @@ impl ChartProperties for Properties { fn chart_type() -> ChartType { ChartType::Line } + fn indexing_status_requirement() -> IndexingStatus { + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + } + } } pub type ActiveAccountAbstractionWallets = diff --git a/stats/stats/src/charts/lines/user_ops/active_bundlers.rs b/stats/stats/src/charts/lines/user_ops/active_bundlers.rs index af825e456..c49fee951 100644 --- a/stats/stats/src/charts/lines/user_ops/active_bundlers.rs +++ b/stats/stats/src/charts/lines/user_ops/active_bundlers.rs @@ -13,6 +13,7 @@ use crate::{ }, types::BlockscoutMigrations, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatus, UserOpsIndexingStatus}, ChartProperties, Named, }; @@ -53,6 +54,12 @@ impl ChartProperties for Properties { fn chart_type() -> ChartType { ChartType::Line } + fn indexing_status_requirement() -> IndexingStatus { + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + } + } } pub type ActiveBundlers = diff --git a/stats/stats/src/charts/lines/user_ops/active_paymasters.rs b/stats/stats/src/charts/lines/user_ops/active_paymasters.rs index 976ae241f..b1a7564a8 100644 --- a/stats/stats/src/charts/lines/user_ops/active_paymasters.rs +++ b/stats/stats/src/charts/lines/user_ops/active_paymasters.rs @@ -13,6 +13,7 @@ use crate::{ }, types::BlockscoutMigrations, }, + indexing_status::{BlockscoutIndexingStatus, IndexingStatus, UserOpsIndexingStatus}, ChartProperties, Named, }; @@ -53,6 +54,12 @@ impl ChartProperties for Properties { fn chart_type() -> ChartType { ChartType::Line } + fn indexing_status_requirement() -> IndexingStatus { + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + } + } } pub type ActivePaymasters = diff --git a/stats/stats/src/charts/lines/user_ops/new_aa_wallets.rs b/stats/stats/src/charts/lines/user_ops/new_aa_wallets.rs index 6c0f2ca62..f858807be 100644 --- a/stats/stats/src/charts/lines/user_ops/new_aa_wallets.rs +++ b/stats/stats/src/charts/lines/user_ops/new_aa_wallets.rs @@ -22,6 +22,7 @@ use crate::{ UpdateContext, }, define_and_impl_resolution_properties, + indexing_status::{BlockscoutIndexingStatus, IndexingStatus, UserOpsIndexingStatus}, missing_date::trim_out_of_range_sorted, range::{data_source_query_range_to_db_statement_range, UniversalRange}, types::timespans::{Month, Week, Year}, @@ -122,6 +123,12 @@ impl ChartProperties for Properties { fn chart_type() -> ChartType { ChartType::Line } + fn indexing_status_requirement() -> IndexingStatus { + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + } + } } define_and_impl_resolution_properties!( diff --git a/stats/stats/src/charts/lines/user_ops/new_user_ops.rs b/stats/stats/src/charts/lines/user_ops/new_user_ops.rs index 9420ff9e5..dcd74a094 100644 --- a/stats/stats/src/charts/lines/user_ops/new_user_ops.rs +++ b/stats/stats/src/charts/lines/user_ops/new_user_ops.rs @@ -19,6 +19,7 @@ use crate::{ types::BlockscoutMigrations, }, define_and_impl_resolution_properties, + indexing_status::{BlockscoutIndexingStatus, IndexingStatus, UserOpsIndexingStatus}, types::timespans::{Month, Week, Year}, ChartProperties, Named, }; @@ -88,6 +89,12 @@ impl ChartProperties for Properties { fn chart_type() -> ChartType { ChartType::Line } + fn indexing_status_requirement() -> IndexingStatus { + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + } + } } define_and_impl_resolution_properties!( diff --git a/stats/stats/src/charts/lines/user_ops/user_ops_growth.rs b/stats/stats/src/charts/lines/user_ops/user_ops_growth.rs index c652e6d74..d80cbe96b 100644 --- a/stats/stats/src/charts/lines/user_ops/user_ops_growth.rs +++ b/stats/stats/src/charts/lines/user_ops/user_ops_growth.rs @@ -8,8 +8,9 @@ use crate::{ }, }, define_and_impl_resolution_properties, + indexing_status::{BlockscoutIndexingStatus, UserOpsIndexingStatus}, types::timespans::{Month, Week, Year}, - MissingDatePolicy, Named, + IndexingStatus, MissingDatePolicy, Named, }; use chrono::NaiveDate; @@ -34,6 +35,12 @@ impl ChartProperties for Properties { fn missing_date_policy() -> MissingDatePolicy { MissingDatePolicy::FillPrevious } + fn indexing_status_requirement() -> IndexingStatus { + IndexingStatus { + blockscout: BlockscoutIndexingStatus::BlocksIndexed, + user_ops: UserOpsIndexingStatus::PastOperationsIndexed, + } + } } define_and_impl_resolution_properties!( diff --git a/stats/stats/src/charts/mod.rs b/stats/stats/src/charts/mod.rs index f243d1179..c37863c47 100644 --- a/stats/stats/src/charts/mod.rs +++ b/stats/stats/src/charts/mod.rs @@ -1,10 +1,11 @@ mod chart; pub mod counters; pub mod db_interaction; +pub mod indexing_status; pub mod lines; pub mod query_dispatch; pub mod types; pub use chart::{ chart_properties_portrait, ChartError, ChartKey, ChartObject, ChartProperties, - ChartPropertiesObject, IndexingStatus, MissingDatePolicy, Named, ResolutionKind, + ChartPropertiesObject, MissingDatePolicy, Named, ResolutionKind, }; diff --git a/stats/stats/src/data_source/kinds/local_db/parameters/query.rs b/stats/stats/src/data_source/kinds/local_db/parameters/query.rs index 44269570a..fefa23629 100644 --- a/stats/stats/src/data_source/kinds/local_db/parameters/query.rs +++ b/stats/stats/src/data_source/kinds/local_db/parameters/query.rs @@ -81,10 +81,7 @@ impl QueryBehaviour for DefaultQueryLast { C::missing_date_policy(), ) .await? - .ok_or(ChartError::Internal(format!( - "no data for counter '{}' was found", - C::name() - )))?; + .ok_or(ChartError::NoCounterData(C::key()))?; Ok(value) } } diff --git a/stats/stats/src/data_source/source.rs b/stats/stats/src/data_source/source.rs index 6d42052a1..fa9efbf1e 100644 --- a/stats/stats/src/data_source/source.rs +++ b/stats/stats/src/data_source/source.rs @@ -7,7 +7,11 @@ use sea_orm::{DatabaseConnection, DbErr}; use tracing::instrument; use tynm::type_name; -use crate::{range::UniversalRange, ChartError, IndexingStatus}; +use crate::{ + indexing_status::{IndexingStatus, IndexingStatusTrait}, + range::UniversalRange, + ChartError, +}; use super::types::UpdateContext; diff --git a/stats/stats/src/lib.rs b/stats/stats/src/lib.rs index 7d4d0fe79..d994f3233 100644 --- a/stats/stats/src/lib.rs +++ b/stats/stats/src/lib.rs @@ -21,6 +21,8 @@ pub use charts::{ db_interaction::read::{ ApproxUnsignedDiff, QueryAllBlockTimestampRange, ReadError, RequestedPointsLimit, }, + indexing_status, + indexing_status::IndexingStatus, lines, query_dispatch, types, ChartError, ChartKey, ChartObject, ChartProperties, - ChartPropertiesObject, IndexingStatus, MissingDatePolicy, Named, ResolutionKind, + ChartPropertiesObject, MissingDatePolicy, Named, ResolutionKind, }; diff --git a/stats/stats/src/tests/mock_blockscout.rs b/stats/stats/src/tests/mock_blockscout.rs index c3f4d84c0..aee3d771b 100644 --- a/stats/stats/src/tests/mock_blockscout.rs +++ b/stats/stats/src/tests/mock_blockscout.rs @@ -18,27 +18,61 @@ use wiremock::{ }; pub async fn default_mock_blockscout_api() -> MockServer { - mock_blockscout_api(ResponseTemplate::new(200).set_body_string( - r#"{ + mock_blockscout_api( + ResponseTemplate::new(200).set_body_string( + r#"{ "finished_indexing": true, "finished_indexing_blocks": true, "indexed_blocks_ratio": "1.00", "indexed_internal_transactions_ratio": "1.00" }"#, - )) + ), + Some(ResponseTemplate::new(200).set_body_string(user_ops_status_response_json(true))), + ) .await } -pub async fn mock_blockscout_api(indexing_status_response: ResponseTemplate) -> MockServer { +pub async fn mock_blockscout_api( + blockscout_indexing_status_response: ResponseTemplate, + user_ops_indexing_status_response: Option, +) -> MockServer { let mock_server = MockServer::start().await; Mock::given(method("GET")) .and(path("/api/v2/main-page/indexing-status")) - .respond_with(indexing_status_response) + .respond_with(blockscout_indexing_status_response) .mount(&mock_server) .await; + + if let Some(response) = user_ops_indexing_status_response { + Mock::given(method("GET")) + .and(path("/api/v2/proxy/account-abstraction/status")) + .respond_with(response) + .mount(&mock_server) + .await; + } mock_server } +pub fn user_ops_status_response_json(past_finished: bool) -> String { + format!( + r#"{{ + "finished_past_indexing": {past_finished}, + "v06": {{ + "enabled": true, + "live": false, + "past_db_logs_indexing_finished": false, + "past_rpc_logs_indexing_finished": false + }}, + "v07": {{ + "enabled": true, + "live": false, + "past_db_logs_indexing_finished": false, + "past_rpc_logs_indexing_finished": false + }} + }}"# + ) +} + pub async fn fill_mock_blockscout_data(blockscout: &DatabaseConnection, max_date: NaiveDate) { addresses::Entity::insert_many([ addresses::ActiveModel { diff --git a/stats/stats/src/update_group.rs b/stats/stats/src/update_group.rs index bbf67bd4e..317bb3558 100644 --- a/stats/stats/src/update_group.rs +++ b/stats/stats/src/update_group.rs @@ -44,7 +44,8 @@ use tokio::sync::{Mutex, MutexGuard}; use crate::{ charts::{chart_properties_portrait::imports::ChartKey, ChartObject}, data_source::UpdateParameters, - ChartError, IndexingStatus, + indexing_status::IndexingStatus, + ChartError, }; #[derive(Error, Debug, PartialEq)] @@ -290,8 +291,10 @@ macro_rules! construct_update_group { fn dependency_indexing_status_requirement( &self, enabled_charts: &::std::collections::HashSet<$crate::ChartKey>, - ) -> $crate::IndexingStatus { - $crate::IndexingStatus::most_restrictive_from( + ) -> $crate::indexing_status::IndexingStatus { + use $crate::indexing_status::IndexingStatusTrait; + + $crate::indexing_status::IndexingStatus::most_restrictive_from( [ $( (