diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 36fd91e..b858874 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,7 +34,7 @@ jobs: - name: Install system dependencies run: | sudo apt-get update - sudo apt-get install -y cmake libssl-dev pkg-config + sudo apt-get install -y cmake libcurl4-openssl-dev libsasl2-dev libssl-dev pkg-config - name: Install Rust toolchain uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable @@ -73,7 +73,7 @@ jobs: - name: Install system dependencies run: | sudo apt-get update - sudo apt-get install -y cmake libssl-dev pkg-config + sudo apt-get install -y cmake libcurl4-openssl-dev libsasl2-dev libssl-dev pkg-config - name: Install Rust toolchain uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable @@ -113,7 +113,7 @@ jobs: - name: Install system dependencies run: | sudo apt-get update - sudo apt-get install -y cmake libssl-dev pkg-config + sudo apt-get install -y cmake libcurl4-openssl-dev libsasl2-dev libssl-dev pkg-config - name: Install Rust toolchain uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable diff --git a/CHANGELOG.md b/CHANGELOG.md index e2a2dfc..3f420a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Upgraded the official Apache Iceberg Rust client from 0.7 to 0.10.0 and the Arrow/Parquet ecosystem from 54 to 58. +- Removed the temporary standalone REST `update_schema` fallback now that `Transaction::update_schema()` is available in `iceberg-rust` 0.10.0. +- Simplified `OfficialRestCommitter` by delegating all catalog operations to the official `RestCatalog` transaction APIs. + +### Fixed + +- Avoided manual OAuth2, route resolution, and multipart namespace encoding logic previously needed for the schema-update fallback. +- Aligned Parquet writer properties with the parquet 58 API (`set_max_row_group_row_count`). + +### Requirements + +- Raised the documented minimum supported Rust version to 1.94, matching `iceberg` 0.10.0 and the updated AWS SDK dependency graph. + ## [0.2.2] - 2026-07-13 ### Changed diff --git a/Cargo.lock b/Cargo.lock index 1fdc376..ecaf850 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,14 +9,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] -name = "ahash" -version = "0.7.8" +name = "aead" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ - "getrandom 0.2.16", - "once_cell", - "version_check", + "crypto-common 0.1.7", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", ] [[package]] @@ -51,9 +75,9 @@ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" dependencies = [ "alloc-no-stdlib", ] @@ -75,9 +99,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -90,15 +114,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -125,388 +149,265 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "apache-avro" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a033b4ced7c585199fb78ef50fca7fe2f444369ec48080c5fd072efa1a03cc7" +checksum = "36fa98bc79671c7981272d91a8753a928ff6a1cd8e4f20a44c45bd5d313840bf" dependencies = [ "bigdecimal", "bon", - "digest", + "crc32fast", + "digest 0.10.7", "log", "miniz_oxide", "num-bigint", "quad-rand", - "rand 0.9.2", + "rand 0.9.5", "regex-lite", "serde", "serde_bytes", "serde_json", + "snap", "strum", "strum_macros", - "thiserror 2.0.17", + "thiserror 2.0.19", "uuid", "zstd", ] [[package]] -name = "array-init" -version = "2.1.0" +name = "arc-swap" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] [[package]] -name = "arrayvec" -version = "0.7.6" +name = "array-init" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" [[package]] name = "arrow" -version = "54.3.1" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5ec52ba94edeed950e4a41f75d35376df196e8cb04437f7280a5aa49f20f796" +checksum = "378530e55cd479eda3c14eb345310799717e6f76d0c332041e8487022166b471" dependencies = [ - "arrow-arith 54.3.1", - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-cast 54.3.1", + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", "arrow-csv", - "arrow-data 54.3.1", - "arrow-ipc 54.3.1", + "arrow-data", + "arrow-ipc", "arrow-json", - "arrow-ord 54.3.1", + "arrow-ord", "arrow-row", - "arrow-schema 54.3.1", - "arrow-select 54.3.1", - "arrow-string 54.3.1", -] - -[[package]] -name = "arrow-arith" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc766fdacaf804cb10c7c70580254fcdb5d55cdfda2bc57b02baf5223a3af9e" -dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "chrono", - "num", + "arrow-schema", + "arrow-select", + "arrow-string", ] [[package]] name = "arrow-arith" -version = "55.2.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30feb679425110209ae35c3fbf82404a39a4c0436bb3ec36164d8bffed2a4ce4" +checksum = "a0ab212d2c1886e802f51c5212d78ebbcbb0bec980fff9dadc1eb8d45cd0b738" dependencies = [ - "arrow-array 55.2.0", - "arrow-buffer 55.2.0", - "arrow-data 55.2.0", - "arrow-schema 55.2.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "chrono", - "num", -] - -[[package]] -name = "arrow-array" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12fcdb3f1d03f69d3ec26ac67645a8fe3f878d77b5ebb0b15d64a116c212985" -dependencies = [ - "ahash 0.8.12", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "chrono", - "half", - "hashbrown 0.15.5", - "num", + "num-traits", ] [[package]] name = "arrow-array" -version = "55.2.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70732f04d285d49054a48b72c54f791bb3424abae92d27aafdf776c98af161c8" +checksum = "cfd33d3e92f207444098c75b42de99d329562be0cf686b307b097cc52b4e999e" dependencies = [ - "ahash 0.8.12", - "arrow-buffer 55.2.0", - "arrow-data 55.2.0", - "arrow-schema 55.2.0", + "ahash", + "arrow-buffer", + "arrow-data", + "arrow-schema", "chrono", "half", - "hashbrown 0.15.5", - "num", -] - -[[package]] -name = "arrow-buffer" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "263f4801ff1839ef53ebd06f99a56cecd1dbaf314ec893d93168e2e860e0291c" -dependencies = [ - "bytes", - "half", - "num", + "hashbrown 0.17.1", + "num-complex", + "num-integer", + "num-traits", ] [[package]] name = "arrow-buffer" -version = "55.2.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "169b1d5d6cb390dd92ce582b06b23815c7953e9dfaaea75556e89d890d19993d" +checksum = "0c6cd424c2693bcdbc150d843dc9d4d137dd2de4782ce6df491ad11a3a0416c0" dependencies = [ "bytes", "half", - "num", + "num-bigint", + "num-traits", ] [[package]] name = "arrow-cast" -version = "54.3.1" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede6175fbc039dfc946a61c1b6d42fd682fcecf5ab5d148fbe7667705798cac9" +checksum = "4c5aefb56a2c02e9e2b30746241058b85f8983f0fcff2ba0c6d09006e1cded7f" dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "arrow-select 54.3.1", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ord", + "arrow-schema", + "arrow-select", "atoi", - "base64 0.22.1", + "base64", "chrono", "comfy-table", "half", "lexical-core", - "num", - "ryu", -] - -[[package]] -name = "arrow-cast" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4f12eccc3e1c05a766cafb31f6a60a46c2f8efec9b74c6e0648766d30686af8" -dependencies = [ - "arrow-array 55.2.0", - "arrow-buffer 55.2.0", - "arrow-data 55.2.0", - "arrow-schema 55.2.0", - "arrow-select 55.2.0", - "atoi", - "base64 0.22.1", - "chrono", - "half", - "lexical-core", - "num", + "num-traits", "ryu", ] [[package]] name = "arrow-csv" -version = "54.3.1" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1644877d8bc9a0ef022d9153dc29375c2bda244c39aec05a91d0e87ccf77995f" +checksum = "e94e8cf7e517657a52b91ea1263acf38c4ca62a84655d72458a3359b12ab97de" dependencies = [ - "arrow-array 54.3.1", - "arrow-cast 54.3.1", - "arrow-schema 54.3.1", + "arrow-array", + "arrow-cast", + "arrow-schema", "chrono", "csv", "csv-core", - "lazy_static", "regex", ] [[package]] name = "arrow-data" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cfdd7d99b4ff618f167e548b2411e5dd2c98c0ddebedd7df433d34c20a4429" -dependencies = [ - "arrow-buffer 54.3.1", - "arrow-schema 54.3.1", - "half", - "num", -] - -[[package]] -name = "arrow-data" -version = "55.2.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de1ce212d803199684b658fc4ba55fb2d7e87b213de5af415308d2fee3619c2" +checksum = "3c88210023a2bfee1896af366309a3028fc3bcbd6515fa29a7990ee1baa08ee0" dependencies = [ - "arrow-buffer 55.2.0", - "arrow-schema 55.2.0", + "arrow-buffer", + "arrow-schema", "half", - "num", -] - -[[package]] -name = "arrow-ipc" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ff528658b521e33905334723b795ee56b393dbe9cf76c8b1f64b648c65a60c" -dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "flatbuffers 24.12.23", + "num-integer", + "num-traits", ] [[package]] name = "arrow-ipc" -version = "55.2.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9ea5967e8b2af39aff5d9de2197df16e305f47f404781d3230b2dc672da5d92" +checksum = "238438f0834483703d88896db6fe5a7138b2230debc31b34c0336c2996e3c64f" dependencies = [ - "arrow-array 55.2.0", - "arrow-buffer 55.2.0", - "arrow-data 55.2.0", - "arrow-schema 55.2.0", - "flatbuffers 25.12.19", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "flatbuffers", ] [[package]] name = "arrow-json" -version = "54.3.1" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee5b4ca98a7fb2efb9ab3309a5d1c88b5116997ff93f3147efdc1062a6158e9" +checksum = "205ca2119e6d679d5c133c6f30e68f027738d95ed948cf77677ea69c7800036b" dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-cast 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-ord", + "arrow-schema", + "arrow-select", "chrono", "half", - "indexmap 2.13.0", + "indexmap 2.14.0", + "itoa", "lexical-core", "memchr", - "num", - "serde", + "num-traits", + "ryu", + "serde_core", "serde_json", "simdutf8", ] [[package]] name = "arrow-ord" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a3334a743bd2a1479dbc635540617a3923b4b2f6870f37357339e6b5363c21" -dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "arrow-select 54.3.1", -] - -[[package]] -name = "arrow-ord" -version = "55.2.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6506e3a059e3be23023f587f79c82ef0bcf6d293587e3272d20f2d30b969b5a7" +checksum = "1bffd8fd2579286a5d63bac898159873e5094a79009940bcb42bbfce4f19f1d0" dependencies = [ - "arrow-array 55.2.0", - "arrow-buffer 55.2.0", - "arrow-data 55.2.0", - "arrow-schema 55.2.0", - "arrow-select 55.2.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", ] [[package]] name = "arrow-row" -version = "54.3.1" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d1d7a7291d2c5107e92140f75257a99343956871f3d3ab33a7b41532f79cb68" +checksum = "bab5994731204603c73ba69267616c50f80780774c6bb0476f1f830625115e0c" dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "half", ] [[package]] name = "arrow-schema" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cfaf5e440be44db5413b75b72c2a87c1f8f0627117d110264048f2969b99e9" - -[[package]] -name = "arrow-schema" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7686986a3bf2254c9fb130c623cdcb2f8e1f15763e7c71c310f0834da3d292" - -[[package]] -name = "arrow-select" -version = "54.3.1" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69efcd706420e52cd44f5c4358d279801993846d1c2a8e52111853d61d55a619" -dependencies = [ - "ahash 0.8.12", - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "num", -] +checksum = "f633dbfdf39c039ada1bf9e34c694816eb71fbb7dc78f613993b7245e078a1ed" [[package]] name = "arrow-select" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd2b45757d6a2373faa3352d02ff5b54b098f5e21dccebc45a21806bc34501e5" -dependencies = [ - "ahash 0.8.12", - "arrow-array 55.2.0", - "arrow-buffer 55.2.0", - "arrow-data 55.2.0", - "arrow-schema 55.2.0", - "num", -] - -[[package]] -name = "arrow-string" -version = "54.3.1" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21546b337ab304a32cfc0770f671db7411787586b45b78b4593ae78e64e2b03" +checksum = "8cd065c54172ac787cf3f2f8d4107e0d3fdc26edba76fdf4f4cc170258942222" dependencies = [ - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-data 54.3.1", - "arrow-schema 54.3.1", - "arrow-select 54.3.1", - "memchr", - "num", - "regex", - "regex-syntax", + "ahash", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "num-traits", ] [[package]] name = "arrow-string" -version = "55.2.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0377d532850babb4d927a06294314b316e23311503ed580ec6ce6a0158f49d40" +checksum = "29dd7cda3ab9692f43a2e4acc444d760cc17b12bb6d8232ddf64e9bab7c06b42" dependencies = [ - "arrow-array 55.2.0", - "arrow-buffer 55.2.0", - "arrow-data 55.2.0", - "arrow-schema 55.2.0", - "arrow-select 55.2.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", "memchr", - "num", + "num-traits", "regex", "regex-syntax", ] @@ -548,18 +449,18 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 3.0.2", ] [[package]] @@ -579,15 +480,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-config" -version = "1.8.12" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96571e6996817bf3d58f6b569e4b9fd2e9d2fcf9f7424eed07b2ce9bb87535e5" +checksum = "701418aa459dac33e50a0f8e818e5662a16bc018a6ac7423659b70f3799d67a8" dependencies = [ "aws-credential-types", "aws-runtime", @@ -599,13 +500,14 @@ dependencies = [ "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", "aws-types", "bytes", "fastrand", "hex", - "http 1.4.0", - "ring", + "http 1.4.2", + "sha1 0.10.7", "time", "tokio", "tracing", @@ -615,9 +517,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.11" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd362783681b15d136480ad555a099e82ecd8e2d10a841e14dfd0078d67fee3" +checksum = "e93964ffdaf57857f544be3666a5f57570bb699e934700f11b49708f61bb556e" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -627,9 +529,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.17.1" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" +checksum = "00bdb5da18dac48ca2cc7cd4a98e533e8635a58e2361d13a1a4ee3888e0d72f1" dependencies = [ "aws-lc-sys", "zeroize", @@ -637,9 +539,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" +checksum = "43103168cc76fe62678a375e722fc9cb3a0146159ac5828bc4f0dfd755c2224c" dependencies = [ "cc", "cmake", @@ -650,9 +552,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.17" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d81b5b2898f6798ad58f484856768bca817e3cd9de0974c24ae0f1113fe88f1b" +checksum = "a6b50a43f3ccdf331521c6d6c68b7cc9668b6e09d439ebda9569df5722324d76" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -663,9 +565,10 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", + "bytes-utils", "fastrand", - "http 0.2.12", - "http-body 0.4.6", + "http 1.4.2", + "http-body 1.1.0", "percent-encoding", "pin-project-lite", "tracing", @@ -674,98 +577,114 @@ dependencies = [ [[package]] name = "aws-sdk-glue" -version = "1.133.0" +version = "1.155.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e5b45757688d5c99ef0ab38d064fefcc46ee7923fb6d7b23b035323e300c7d" +checksum = "8dfa395a438a21d881421bc839fdd96aec53164fbac451f518f14a885e971630" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sso" -version = "1.91.0" +version = "1.104.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee6402a36f27b52fe67661c6732d684b2635152b676aa2babbfb5204f99115d" +checksum = "b53416d16c278234845392e38d93bd4481d2f09daa0f005a2277f0aa91f59c22" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.93.0" +version = "1.106.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45a7f750bbd170ee3677671ad782d90b894548f4e4ae168302c57ec9de5cb3e" +checksum = "cc9b706c3305ed0285d5b1b696c747aa34950f830fb03e3e6c76890f99b9f188" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.95.0" +version = "1.109.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55542378e419558e6b1f398ca70adb0b2088077e79ad9f14eb09441f2f7b2164" +checksum = "32d214cdfa5bbe17f117e76a7643fadf32a5234fb597322ef8b1fb4b2f17dbbd" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", "aws-smithy-xml", "aws-types", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "1.3.7" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e523e1c4e8e7e8ff219d732988e22bfeae8a1cafdbe6d9eca1546fa080be7c" +checksum = "723c2234ad7511ceef63eab016b7ba6ff7c55590fefb96fa8467af014a07309f" dependencies = [ "aws-credential-types", "aws-smithy-http", @@ -774,20 +693,20 @@ dependencies = [ "bytes", "form_urlencoded", "hex", - "hmac", + "hmac 0.13.0", "http 0.2.12", - "http 1.4.0", + "http 1.4.2", "percent-encoding", - "sha2", + "sha2 0.11.0", "time", "tracing", ] [[package]] name = "aws-smithy-async" -version = "1.2.7" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee19095c7c4dda59f1697d028ce704c24b2d33c6718790c7f1d5a3015b4107c" +checksum = "f02e407fb3b54891734224b9ffac8a71fdd35f542500fa1af95754a6b2beb316" dependencies = [ "futures-util", "pin-project-lite", @@ -796,9 +715,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.6" +version = "0.64.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826141069295752372f8203c17f28e30c464d22899a43a0c9fd9c458d469c88b" +checksum = "37843d9add67c3aff5856f409c6dc315d3cdff60f9c0cb5b670dab1e9920306d" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", @@ -806,9 +725,9 @@ dependencies = [ "bytes-utils", "futures-core", "futures-util", - "http 0.2.12", - "http 1.4.0", - "http-body 0.4.6", + "http 1.4.2", + "http-body 1.1.0", + "http-body-util", "percent-encoding", "pin-project-lite", "pin-utils", @@ -817,26 +736,26 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.5" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e62db736db19c488966c8d787f52e6270be565727236fd5579eaa301e7bc4a" +checksum = "635d23afda0a6ab48d666c4d447c4873e8d1e83518a2be2093122397e50b838e" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", "h2 0.3.27", - "h2 0.4.13", + "h2 0.4.15", "http 0.2.12", - "http 1.4.0", + "http 1.4.2", "http-body 0.4.6", "hyper 0.14.32", - "hyper 1.8.1", + "hyper 1.11.0", "hyper-rustls 0.24.2", - "hyper-rustls 0.27.7", + "hyper-rustls 0.27.9", "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.36", + "rustls 0.23.42", "rustls-native-certs", "rustls-pki-types", "tokio", @@ -847,50 +766,57 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.9" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fa1213db31ac95288d981476f78d05d9cbb0353d22cdf3472cc05bb02f6551" +checksum = "3dc65a121adb4b33729919fcfa14fa36fb33c1555a8f06bb0e2188dbfdc1d9ef" dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.1.5" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f616c3f2260612fe44cede278bafa18e73e6479c4e393e2c4518cf2a9a228a" +checksum = "8e86338c869539a581bf161247762a6e87f92c5c075060057b5ed6d06632ed0c" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" -version = "0.60.9" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae5d689cf437eae90460e944a58b5668530d433b4ff85789e69d2f2a556e057d" +checksum = "512346c7212ab7436df2d77a16d976a468ae44a418835511d2a69269810aaf62" dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", + "aws-smithy-xml", "urlencoding", ] [[package]] name = "aws-smithy-runtime" -version = "1.9.5" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a392db6c583ea4a912538afb86b7be7c5d8887d91604f50eb55c262ee1b4a5f5" +checksum = "bea94a9ff8464016338c851e24b472d7131c388c88898a502e781815b2ee6045" dependencies = [ "aws-smithy-async", "aws-smithy-http", "aws-smithy-http-client", "aws-smithy-observability", "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", "bytes", "fastrand", "http 0.2.12", - "http 1.4.0", + "http 1.4.2", "http-body 0.4.6", - "http-body 1.0.1", + "http-body 1.1.0", + "http-body-util", "pin-project-lite", "pin-utils", "tokio", @@ -899,35 +825,58 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.9.3" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0d43d899f9e508300e587bf582ba54c27a452dd0a9ea294690669138ae14a2" +checksum = "22ed1ebe6e0a95ea84570225f5a8208dec4b8f77e61a9b0d6f51773fcb4612f0" dependencies = [ "aws-smithy-async", + "aws-smithy-runtime-api-macros", "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.4.0", + "http 1.4.2", "pin-project-lite", "tokio", "tracing", "zeroize", ] +[[package]] +name = "aws-smithy-runtime-api-macros" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "221eaa237ddf1ca79b60d1372aad77e47f9c0ea5b3ce5099da8c61d027dc77b3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "aws-smithy-schema" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56e0a4e53127a632224e43633b0fe045fa9e1e3cfc68b9830f1115e103f910" +dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-types", + "http 1.4.2", +] + [[package]] name = "aws-smithy-types" -version = "1.3.5" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905cb13a9895626d49cf2ced759b062d913834c7482c38e49557eac4e6193f01" +checksum = "d6dc683efb34b9e755675b37fedbe0103141e5b6df7bdc9eb6967756a8c167d8" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", "http 0.2.12", - "http 1.4.0", + "http 1.4.2", "http-body 0.4.6", - "http-body 1.0.1", + "http-body 1.1.0", "http-body-util", "itoa", "num-integer", @@ -942,22 +891,26 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.13" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b2f670422ff42bf7065031e72b45bc52a3508bd089f743ea90731ca2b6ea57" +checksum = "ce84f71c72fee2cbbadde6e7d082f5fb466e3a84733855295fa7aafd1b31b7d8" dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-schema", + "aws-smithy-types", "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.11" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d980627d2dd7bfc32a3c025685a033eeab8d365cc840c631ef59d1b8f428164" +checksum = "eec1cd5469f328c782dc3e33d4153cf118a54e33cbb3356d60d16f89883e1f94" dependencies = [ "aws-credential-types", "aws-smithy-async", "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", "rustc_version", "tracing", @@ -973,10 +926,10 @@ dependencies = [ "axum-core", "bytes", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", - "hyper 1.8.1", + "hyper 1.11.0", "hyper-util", "itoa", "matchit", @@ -1006,8 +959,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", "mime", "pin-project-lite", @@ -1029,12 +982,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -1115,32 +1062,39 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" dependencies = [ "serde_core", ] [[package]] -name = "bitvec" -version = "1.0.1" +name = "block-buffer" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "funty", - "radium", - "tap", - "wyz", + "generic-array", ] [[package]] name = "block-buffer" -version = "0.10.4" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ - "generic-array", + "hybrid-array", +] + +[[package]] +name = "bnum" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f781dba93de3a5ef6dc5b17c9958b208f6f3f021623b360fb605ea51ce443f10" +dependencies = [ + "serde", + "serde-big-array", ] [[package]] @@ -1149,23 +1103,23 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97ccca1260af6a459d75994ad5acc1651bcabcbdbc41467cc9786519ab854c30" dependencies = [ - "base64 0.22.1", + "base64", "bollard-stubs", "bytes", "futures-core", "futures-util", "hex", "home", - "http 1.4.0", + "http 1.4.2", "http-body-util", - "hyper 1.8.1", + "hyper 1.11.0", "hyper-named-pipe", - "hyper-rustls 0.27.7", + "hyper-rustls 0.27.9", "hyper-util", "hyperlocal", "log", "pin-project-lite", - "rustls 0.23.36", + "rustls 0.23.42", "rustls-native-certs", "rustls-pemfile", "rustls-pki-types", @@ -1174,7 +1128,7 @@ dependencies = [ "serde_json", "serde_repr", "serde_urlencoded", - "thiserror 2.0.17", + "thiserror 2.0.19", "tokio", "tokio-util", "tower-service", @@ -1195,9 +1149,9 @@ dependencies = [ [[package]] name = "bon" -version = "3.8.1" +version = "3.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebeb9aaf9329dff6ceb65c689ca3db33dbf15f324909c60e4e5eef5701ce31b1" +checksum = "a602c73c7b0148ec6d12af6fd5cc7a46e2eacc8878271a999abac56eed12f561" dependencies = [ "bon-macros", "rustversion", @@ -1205,117 +1159,60 @@ dependencies = [ [[package]] name = "bon-macros" -version = "3.8.1" +version = "3.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e9d642a7e3a318e37c2c9427b5a6a48aa1ad55dcd986f3034ab2239045a645" +checksum = "6dee98b0db6a962de883bf5d20362dee4d7ca0d12fe39a7c6c73c844e1cd7c1f" dependencies = [ - "darling 0.21.3", + "darling 0.23.0", "ident_case", "prettyplease", "proc-macro2", "quote", "rustversion", - "syn 2.0.114", -] - -[[package]] -name = "borsh" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "brotli" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor 4.0.3", + "syn 2.0.119", ] [[package]] name = "brotli" -version = "8.0.2" +version = "8.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", - "brotli-decompressor 5.0.0", + "brotli-decompressor", ] [[package]] name = "brotli-decompressor" -version = "4.0.3" +version = "5.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", ] [[package]] -name = "brotli-decompressor" -version = "5.0.0" +name = "bs58" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", + "tinyvec", ] [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta 0.1.4", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" [[package]] name = "byteorder" @@ -1344,9 +1241,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.51" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" +checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" dependencies = [ "find-msvc-tools", "jobserver", @@ -1362,9 +1259,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "chacha20" @@ -1379,9 +1276,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -1391,11 +1288,21 @@ dependencies = [ "windows-link", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", +] + [[package]] name = "clap" -version = "4.5.54" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" dependencies = [ "clap_builder", "clap_derive", @@ -1403,9 +1310,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.54" +version = "4.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" dependencies = [ "anstream", "anstyle", @@ -1415,30 +1322,30 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.6.3" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "660c0520455b1013b9bcb0393d5f643d7e4454fb69c915b8d6d2aa0e9a45acc3" +checksum = "db8b397918185f0161ff3d6fcaa9e4bfc09b8367caf6e1d4a2848e5477ed027b" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 3.0.2", ] [[package]] name = "clap_lex" -version = "0.7.6" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "clap_mangen" @@ -1452,26 +1359,42 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] -name = "comfy-table" -version = "7.2.1" +name = "combine" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "unicode-segmentation", + "bytes", + "memchr", +] + +[[package]] +name = "comfy-table" +version = "7.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" +dependencies = [ + "unicode-segmentation", "unicode-width 0.2.2", ] @@ -1490,6 +1413,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "const-random" version = "0.1.18" @@ -1505,7 +1434,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "tiny-keccak", ] @@ -1579,9 +1508,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] @@ -1597,18 +1526,18 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -1623,9 +1552,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + [[package]] name = "csv" version = "1.4.0" @@ -1647,6 +1586,34 @@ dependencies = [ "memchr", ] +[[package]] +name = "ctor" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e30e509674ef0ec91e21a7735766db37d163d46151b6a361d8b83dd79116bd" +dependencies = [ + "link-section", + "linktime-proc-macro", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + [[package]] name = "darling" version = "0.20.11" @@ -1659,12 +1626,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -1678,21 +1645,20 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "darling_core" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ - "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -1703,25 +1669,25 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "darling_macro" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core 0.21.3", + "darling_core 0.23.0", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "dashmap" -version = "6.1.0" +version = "6.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" dependencies = [ "cfg-if", "crossbeam-utils", @@ -1731,13 +1697,44 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.19", +] + [[package]] name = "der" version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ - "const-oid", + "const-oid 0.9.6", "pem-rfc7468", "zeroize", ] @@ -1769,7 +1766,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -1779,7 +1776,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -1788,28 +1785,40 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", + "block-buffer 0.10.4", + "const-oid 0.9.6", + "crypto-common 0.1.7", "subtle", ] +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid 0.10.2", + "crypto-common 0.2.2", + "ctutils", +] + [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "dissimilar" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8975ffdaa0ef3661bfe02dbdcc06c9f829dfafe6a3c474de366a8d5e44276921" +checksum = "aeda16ab4059c5fd2a83f2b9c9e9c981327b18aa8e3b313f7e6563799d4f093e" [[package]] name = "dlv-list" @@ -1822,11 +1831,11 @@ dependencies = [ [[package]] name = "docker_credential" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d89dfcba45b4afad7450a99b39e751590463e45c04728cf555d36bb66940de8" +checksum = "29547a1dc60885a552306986316bc9701ba120c1a8db6769fa68691529ad373d" dependencies = [ - "base64 0.21.7", + "base64", "serde", "serde_json", ] @@ -1851,9 +1860,9 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" dependencies = [ "serde", ] @@ -1864,6 +1873,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "errno" version = "0.3.14" @@ -1916,51 +1936,51 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fastnum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020d1b59a944bc239d79903fbac2eda2365138b44890c27979562f6592059dcd" +dependencies = [ + "bnum", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "fastrand" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "faststr" -version = "0.2.32" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baec6a0289d7f1fe5665586ef7340af82e3037207bef60f5785e57569776f0c8" +checksum = "1ca7d44d22004409a61c393afb3369c8f7bb74abcae49fe249ee01dcc3002113" dependencies = [ "bytes", - "rkyv 0.8.17", + "rkyv", "serde", "simdutf8", ] [[package]] name = "filetime" -version = "0.2.26" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" dependencies = [ "cfg-if", "libc", - "libredox", - "windows-sys 0.60.2", ] [[package]] name = "find-msvc-tools" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" - -[[package]] -name = "flatbuffers" -version = "24.12.23" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1baf0dbf96932ec9a3038d57900329c015b0bfb7b63d904f3bc27e2b02a096" -dependencies = [ - "bitflags 1.3.2", - "rustc_version", -] +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "flatbuffers" @@ -1968,19 +1988,19 @@ version = "25.12.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35f6839d7b3b98adde531effaf34f0c2badc6f4735d26fe74709d8e513a96ef3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "rustc_version", ] [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", - "libz-rs-sys", "miniz_oxide", + "zlib-rs", ] [[package]] @@ -2021,17 +2041,11 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - [[package]] name = "futures" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" dependencies = [ "futures-channel", "futures-core", @@ -2044,9 +2058,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" dependencies = [ "futures-core", "futures-sink", @@ -2054,15 +2068,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" dependencies = [ "futures-core", "futures-task", @@ -2082,38 +2096,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ "futures-channel", "futures-core", @@ -2123,7 +2137,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -2139,9 +2152,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -2176,11 +2189,21 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "glob" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" [[package]] name = "gloo-timers" @@ -2206,7 +2229,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.13.0", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -2215,17 +2238,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.4.0", - "indexmap 2.13.0", + "http 1.4.2", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -2249,9 +2272,6 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] [[package]] name = "hashbrown" @@ -2270,12 +2290,6 @@ dependencies = [ "foldhash", ] -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - [[package]] name = "hashbrown" version = "0.17.1" @@ -2297,12 +2311,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hex" version = "0.4.3" @@ -2327,7 +2335,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac", + "hmac 0.12.1", ] [[package]] @@ -2336,7 +2344,16 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", +] + +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", ] [[package]] @@ -2361,9 +2378,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", "itoa", @@ -2382,24 +2399,24 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", - "http 1.4.0", + "http 1.4.2", ] [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "pin-project-lite", ] @@ -2417,9 +2434,18 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.3.0" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" + +[[package]] +name = "hybrid-array" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +dependencies = [ + "typenum", +] [[package]] name = "hyper" @@ -2447,22 +2473,21 @@ dependencies = [ [[package]] name = "hyper" -version = "1.8.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", - "h2 0.4.13", - "http 1.4.0", - "http-body 1.0.1", + "h2 0.4.15", + "http 1.4.2", + "http-body 1.1.0", "httparse", "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -2470,17 +2495,16 @@ dependencies = [ [[package]] name = "hyper-named-pipe" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" +checksum = "fab3637d6b04a8037af8a266fdf6cf92ea957e8c53981a2bf6136572531025bf" dependencies = [ "hex", - "hyper 1.8.1", + "hyper 1.11.0", "hyper-util", "pin-project-lite", "tokio", "tower-service", - "winapi", ] [[package]] @@ -2500,41 +2524,39 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http 1.4.0", - "hyper 1.8.1", + "http 1.4.2", + "hyper 1.11.0", "hyper-util", - "rustls 0.23.36", + "rustls 0.23.42", "rustls-native-certs", - "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.5", + "webpki-roots 1.0.9", ] [[package]] name = "hyper-util" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-channel", - "futures-core", "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "hyper 1.8.1", + "http 1.4.2", + "http-body 1.1.0", + "hyper 1.11.0", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.6.5", "tokio", "tower-service", "tracing", @@ -2548,7 +2570,7 @@ checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" dependencies = [ "hex", "http-body-util", - "hyper 1.8.1", + "hyper 1.11.0", "hyper-util", "pin-project-lite", "tokio", @@ -2557,9 +2579,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2581,45 +2603,44 @@ dependencies = [ [[package]] name = "iceberg" -version = "0.7.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "178acbee1a29dc8cef5623ad5b68208a5b9503874b2d15fcbbcedcc8683ef490" +checksum = "e4ed93c6be93e47ba2d8928b8cefe972932668940478f6be93eca6ade52c4e8a" dependencies = [ + "aes-gcm", "anyhow", "apache-avro", "array-init", - "arrow-arith 55.2.0", - "arrow-array 55.2.0", - "arrow-buffer 55.2.0", - "arrow-cast 55.2.0", - "arrow-ord 55.2.0", - "arrow-schema 55.2.0", - "arrow-select 55.2.0", - "arrow-string 55.2.0", + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-ord", + "arrow-schema", + "arrow-select", + "arrow-string", "as-any", "async-trait", "backon", - "base64 0.22.1", + "base64", "bimap", "bytes", "chrono", "derive_builder", "expect-test", + "fastnum", + "flate2", "fnv", "futures", - "itertools", + "itertools 0.13.0", "moka", "murmur3", - "num-bigint", "once_cell", - "opendal", "ordered-float 4.6.0", - "parquet 55.2.0", - "rand 0.8.5", - "reqsign", - "reqwest", + "parquet", + "rand 0.9.5", + "reqwest 0.12.28", "roaring", - "rust_decimal", "serde", "serde_bytes", "serde_derive", @@ -2627,43 +2648,65 @@ dependencies = [ "serde_repr", "serde_with", "strum", - "thrift", "tokio", + "tracing", "typed-builder", + "typetag", "url", "uuid", + "zeroize", "zstd", ] [[package]] name = "iceberg-catalog-rest" -version = "0.7.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7aa0cb3c2a3e41c1fae671b7c6bfc09360271634b1790cce70bb1b674e735ef" +checksum = "3e1b94fd46e309f0a728c32f9f7005a230937d4c8b039a85258074ec40c45614" dependencies = [ "async-trait", "chrono", - "http 1.4.0", + "http 1.4.2", "iceberg", - "itertools", - "reqwest", + "itertools 0.13.0", + "reqwest 0.12.28", "serde", "serde_derive", "serde_json", "tokio", - "tracing", "typed-builder", "uuid", ] +[[package]] +name = "iceberg-storage-opendal" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf3a44173031681bbb0775299bb487b0c3aa937cb55959325ea980757acb1e1" +dependencies = [ + "anyhow", + "async-trait", + "bytes", + "cfg-if", + "futures", + "iceberg", + "opendal", + "reqsign-aws-v4", + "reqsign-core", + "serde", + "typetag", + "url", +] + [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -2671,9 +2714,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -2684,9 +2727,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -2698,15 +2741,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -2718,15 +2761,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -2756,9 +2799,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -2777,16 +2820,25 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "serde", "serde_core", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "integer-encoding" version = "3.0.4" @@ -2804,20 +2856,19 @@ dependencies = [ ] [[package]] -name = "ipnet" -version = "2.11.0" +name = "inventory" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] [[package]] -name = "iri-string" -version = "0.7.10" +name = "ipnet" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" -dependencies = [ - "memchr", - "serde", -] +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "is_terminal_polyfill" @@ -2834,53 +2885,167 @@ 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.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] -name = "jobserver" -version = "0.1.34" +name = "jiff" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "e184d09547b80eb7e20d141ba2fb1fbac843ca53f4cf1b31210adc4c1adc6e16" dependencies = [ - "getrandom 0.3.4", - "libc", + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "js-sys", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "wasm-bindgen", + "windows-link", ] [[package]] -name = "js-sys" -version = "0.3.83" +name = "jiff-core" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" dependencies = [ - "once_cell", - "wasm-bindgen", + "defmt", ] [[package]] -name = "k2i-cli" -version = "0.2.2" +name = "jiff-static" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323da076b7a6faf914dc677cb05a4b907742ff7375c8322c9e7f5061e5e0e9de" dependencies = [ - "anyhow", - "axum", - "chrono", - "clap", - "clap_complete", - "clap_mangen", - "glob", - "k2i-core", - "k2i-rpc-server", - "prometheus", - "reqwest", - "serde", - "serde_json", - "tempfile", - "tokio", - "toml", - "tower", + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys", + "log", + "simd_cesu8", + "thiserror 2.0.19", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "k2i-cli" +version = "0.2.2" +dependencies = [ + "anyhow", + "axum", + "chrono", + "clap", + "clap_complete", + "clap_mangen", + "glob", + "k2i-core", + "k2i-rpc-server", + "prometheus", + "reqwest 0.12.28", + "serde", + "serde_json", + "tempfile", + "tokio", + "toml", + "tower", "tracing", "tracing-subscriber", ] @@ -2889,18 +3054,18 @@ dependencies = [ name = "k2i-core" version = "0.2.2" dependencies = [ - "ahash 0.8.12", + "ahash", "anyhow", "arrow", - "arrow-ipc 54.3.1", + "arrow-ipc", "arrow-json", - "arrow-select 54.3.1", + "arrow-select", "async-trait", "aws-config", "aws-credential-types", "aws-sdk-glue", "axum", - "base64 0.22.1", + "base64", "bytes", "chrono", "crc32fast", @@ -2911,10 +3076,11 @@ dependencies = [ "hive_metastore", "iceberg", "iceberg-catalog-rest", + "iceberg-storage-opendal", "k2i-rpc", "object_store", "parking_lot", - "parquet 54.3.1", + "parquet", "prometheus", "proptest", "prost", @@ -2922,14 +3088,14 @@ dependencies = [ "prost-types", "protox", "rdkafka", - "reqwest", + "reqwest 0.12.28", "serde", "serde_json", "sqlx", "tempfile", "testcontainers", "testcontainers-modules", - "thiserror 2.0.17", + "thiserror 2.0.19", "tokio", "tokio-test", "toml", @@ -2948,13 +3114,13 @@ version = "0.2.2" dependencies = [ "anyhow", "arrow", - "arrow-ipc 54.3.1", + "arrow-ipc", "bytes", "futures", "k2i-rpc", "prost", "rdkafka", - "reqwest", + "reqwest 0.12.28", "serde_json", "tokio", "tokio-util", @@ -2967,7 +3133,7 @@ dependencies = [ "bincode", "chrono", "serde", - "thiserror 2.0.17", + "thiserror 2.0.19", ] [[package]] @@ -3053,25 +3219,26 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.180" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.12" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "libc", - "redox_syscall 0.7.0", + "plain", + "redox_syscall 0.9.0", ] [[package]] @@ -3085,20 +3252,11 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "libz-rs-sys" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c10501e7805cee23da17c7790e59df2870c0d4043ec6d03f67d31e2b53e77415" -dependencies = [ - "zlib-rs", -] - [[package]] name = "libz-sys" -version = "1.1.23" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", "libc", @@ -3106,6 +3264,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "link-section" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc98458dfe90986c5e2f6ddcf68360c7e5c4252600153e06aa4ee8176c0f8d1" + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -3123,17 +3287,23 @@ dependencies = [ "tokio", ] +[[package]] +name = "linktime-proc-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7b0a3383c2a1002d11349c92c85a666a5fb679e96c79d782cf0dbe557fd6ee" + [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -3146,9 +3316,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "logos" @@ -3156,7 +3326,16 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff472f899b4ec2d99161c51f60ff7075eeb3097069a36050d8037a6325eb8154" dependencies = [ - "logos-derive", + "logos-derive 0.15.1", +] + +[[package]] +name = "logos" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2c55a318a87600ea870ff8c2012148b44bf18b74fad48d0f835c38c7d07c5f" +dependencies = [ + "logos-derive 0.16.1", ] [[package]] @@ -3172,7 +3351,21 @@ dependencies = [ "quote", "regex-syntax", "rustc_version", - "syn 2.0.114", + "syn 2.0.119", +] + +[[package]] +name = "logos-codegen" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58b3ffaa284e1350d017a57d04ada118c4583cf260c8fb01e0fe28a2e9cf8970" +dependencies = [ + "fnv", + "proc-macro2", + "quote", + "regex-automata", + "regex-syntax", + "syn 2.0.119", ] [[package]] @@ -3181,7 +3374,16 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "605d9697bcd5ef3a42d38efc51541aa3d6a4a25f7ab6d1ed0da5ac632a26b470" dependencies = [ - "logos-codegen", + "logos-codegen 0.15.1", +] + +[[package]] +name = "logos-derive" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d3a9855747c17eaf4383823f135220716ab49bea5fbea7dd42cc9a92f8aa31" +dependencies = [ + "logos-codegen 0.16.1", ] [[package]] @@ -3192,11 +3394,11 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "lz4_flex" -version = "0.11.6" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a" +checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" dependencies = [ - "twox-hash 2.1.2", + "twox-hash", ] [[package]] @@ -3221,14 +3423,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "md-5" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" +dependencies = [ + "cfg-if", + "digest 0.11.3", +] + +[[package]] +name = "mea" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2640d335e7273dacdcf51044026139b2e269c3bb0dfc3f8cb3496b85e3f6a42c" +dependencies = [ + "slab", ] [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memoffset" @@ -3245,7 +3466,7 @@ version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdc67a1d6ef0340a7f5152b9fd34ad7477b4d518920f7557267f1fc6e5a62641" dependencies = [ - "ahash 0.8.12", + "ahash", "faststr", "paste", "rustc-hash", @@ -3271,7 +3492,7 @@ checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -3292,9 +3513,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "wasi", @@ -3303,9 +3524,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3dec6bd31b08944e08b58fd99373893a6c17054d6f3ea5006cc894f4f4eee2a" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" dependencies = [ "async-lock", "crossbeam-channel", @@ -3341,7 +3562,7 @@ checksum = "b40e46c845ac234bcba19db7ab252bc2778cbadd516a466d2f12b1580852d136" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -3361,7 +3582,7 @@ checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -3382,7 +3603,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "cfg-if", "cfg_aliases", "libc", @@ -3398,25 +3619,11 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" dependencies = [ "num-integer", "num-traits", @@ -3434,7 +3641,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.7", "smallvec", "zeroize", ] @@ -3465,22 +3672,10 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" dependencies = [ - "num-bigint", "num-integer", "num-traits", ] @@ -3495,21 +3690,11 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ "num_enum_derive", "rustversion", @@ -3517,14 +3702,14 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -3534,20 +3719,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cfccb68961a56facde1163f9319e0d15743352344e7808a11795fb99698dcaf" dependencies = [ "async-trait", - "base64 0.22.1", + "base64", "bytes", "chrono", "futures", "httparse", "humantime", - "hyper 1.8.1", - "itertools", - "md-5", + "hyper 1.11.0", + "itertools 0.13.0", + "md-5 0.10.6", "parking_lot", "percent-encoding", "quick-xml 0.37.5", - "rand 0.8.5", - "reqwest", + "rand 0.8.7", + "reqwest 0.12.28", "ring", "rustls-pemfile", "serde", @@ -3561,9 +3746,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -3571,45 +3756,145 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "opendal" -version = "0.54.1" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c9c85ce253ff87225e7669979d877a20c98a06604ec9d6dd5f4473e08f1ae1" +dependencies = [ + "ctor", + "opendal-core", + "opendal-layer-concurrent-limit", + "opendal-layer-logging", + "opendal-layer-retry", + "opendal-layer-timeout", + "opendal-service-fs", + "opendal-service-s3", +] + +[[package]] +name = "opendal-core" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42afda58fa2cf50914402d132cc1caacff116a85d10c72ab2082bb7c50021754" +checksum = "c4f8607c90e2c963a91467f50fb49fbc7fb3d573f88cea219ca59ccd3740b309" dependencies = [ "anyhow", - "backon", - "base64 0.22.1", + "base64", "bytes", - "chrono", - "crc32c", "futures", - "getrandom 0.2.16", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", + "jiff", "log", - "md-5", + "md-5 0.11.0", + "mea", "percent-encoding", - "quick-xml 0.38.4", - "reqsign", - "reqwest", + "quick-xml 0.39.4", + "reqsign-core", + "reqwest 0.13.4", "serde", "serde_json", "tokio", + "url", "uuid", + "web-time", +] + +[[package]] +name = "opendal-layer-concurrent-limit" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6f81ba6960e3fae1882f253b114b21d7e444e1534f209c7737a79f6243eb6f" +dependencies = [ + "futures", + "http 1.4.2", + "mea", + "opendal-core", +] + +[[package]] +name = "opendal-layer-logging" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ada45c6d81d1aa4c9305d0c7d4bc317c59c85866a0908a2d75a7a978aa5ee2" +dependencies = [ + "log", + "opendal-core", +] + +[[package]] +name = "opendal-layer-retry" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2a25a718afb81fad81cb9a0580a1cb989221fa2317f888c6a37f8dad408eb7" +dependencies = [ + "backon", + "log", + "opendal-core", +] + +[[package]] +name = "opendal-layer-timeout" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91f731724c213af81e9d03517859c8fc47b4578e64ad61ae4f099f10fe36e3" +dependencies = [ + "opendal-core", + "tokio", +] + +[[package]] +name = "opendal-service-fs" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e89a665fef0e6bd249cf5ea47fc174b7ba892159bee4b9382528b1ca873a2c" +dependencies = [ + "bytes", + "log", + "opendal-core", + "serde", + "tokio", + "xattr", +] + +[[package]] +name = "opendal-service-s3" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "313d46c9f5ae70bca26b7c3e3fbb9b639292625f28af73aa016f47e788af9deb" +dependencies = [ + "base64", + "bytes", + "crc32c", + "http 1.4.2", + "log", + "md-5 0.11.0", + "opendal-core", + "quick-xml 0.39.4", + "reqsign-aws-v4", + "reqsign-core", + "reqsign-file-read-tokio", + "serde", + "url", ] [[package]] name = "openssl-probe" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.111" +version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" dependencies = [ "cc", "libc", @@ -3633,7 +3918,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.7", "serde", ] @@ -3684,71 +3969,37 @@ dependencies = [ [[package]] name = "parquet" -version = "54.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb15796ac6f56b429fd99e33ba133783ad75b27c36b4b5ce06f1f82cc97754e" -dependencies = [ - "ahash 0.8.12", - "arrow-array 54.3.1", - "arrow-buffer 54.3.1", - "arrow-cast 54.3.1", - "arrow-data 54.3.1", - "arrow-ipc 54.3.1", - "arrow-schema 54.3.1", - "arrow-select 54.3.1", - "base64 0.22.1", - "brotli 7.0.0", - "bytes", - "chrono", - "flate2", - "futures", - "half", - "hashbrown 0.15.5", - "lz4_flex", - "num", - "num-bigint", - "paste", - "seq-macro", - "simdutf8", - "snap", - "thrift", - "tokio", - "twox-hash 1.6.3", - "zstd", -] - -[[package]] -name = "parquet" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17da4150748086bd43352bc77372efa9b6e3dbd06a04831d2a98c041c225cfa" -dependencies = [ - "ahash 0.8.12", - "arrow-array 55.2.0", - "arrow-buffer 55.2.0", - "arrow-cast 55.2.0", - "arrow-data 55.2.0", - "arrow-ipc 55.2.0", - "arrow-schema 55.2.0", - "arrow-select 55.2.0", - "base64 0.22.1", - "brotli 8.0.2", +version = "58.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dafa7d01085b62a47dd0c1829550a0a36710ea9c4fe358a05a85477cec8a908" +dependencies = [ + "ahash", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ipc", + "arrow-schema", + "arrow-select", + "base64", + "brotli", "bytes", "chrono", "flate2", "futures", "half", - "hashbrown 0.15.5", + "hashbrown 0.17.1", "lz4_flex", - "num", "num-bigint", + "num-integer", + "num-traits", "paste", + "ring", "seq-macro", "simdutf8", "snap", "thrift", "tokio", - "twox-hash 2.1.2", + "twox-hash", "zstd", ] @@ -3774,7 +4025,7 @@ dependencies = [ "regex", "regex-syntax", "structmeta", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -3804,7 +4055,7 @@ version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "520e32b295867834617b8a352b6fd4837e578f328f4e48813db4904ebc0d70b2" dependencies = [ - "ahash 0.8.12", + "ahash", "anyhow", "async-recursion", "bytes", @@ -3822,29 +4073,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -3875,21 +4126,48 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] [[package]] name = "portable-atomic" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -3916,23 +4194,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", + "toml_edit 0.25.13+spec-1.1.0", ] [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -3949,20 +4227,20 @@ dependencies = [ "memchr", "parking_lot", "protobuf", - "thiserror 2.0.17", + "thiserror 2.0.19", ] [[package]] name = "proptest" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.10.0", + "bitflags 2.13.1", "num-traits", - "rand 0.9.2", + "rand 0.9.5", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", @@ -3973,9 +4251,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" dependencies = [ "bytes", "prost-derive", @@ -3983,25 +4261,25 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", - "itertools", + "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "prost-reflect" -version = "0.16.3" +version = "0.16.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89455ef41ed200cafc47c76c552ee7792370ac420497e551f16123a9135f76e" +checksum = "01b80ea363c31af2de2b92e3c07ed1156628f7838c4afb4df75ee78a37fedbd1" dependencies = [ - "base64 0.22.1", - "logos", + "base64", + "logos 0.16.1", "miette", "prost", "prost-types", @@ -4011,9 +4289,9 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" dependencies = [ "prost", ] @@ -4050,7 +4328,7 @@ dependencies = [ "prost-reflect", "prost-types", "protox-parse", - "thiserror 2.0.17", + "thiserror 2.0.19", ] [[package]] @@ -4059,19 +4337,10 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "072eee358134396a4643dff81cfff1c255c9fbd3fb296be14bdb6a26f9156366" dependencies = [ - "logos", + "logos 0.15.1", "miette", "prost-types", - "thiserror 2.0.17", -] - -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive 0.1.4", + "thiserror 2.0.19", ] [[package]] @@ -4080,18 +4349,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79" dependencies = [ - "ptr_meta_derive 0.3.1", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "ptr_meta_derive", ] [[package]] @@ -4102,7 +4360,7 @@ checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -4129,9 +4387,19 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.38.4" +version = "0.39.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" dependencies = [ "memchr", "serde", @@ -4139,9 +4407,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -4149,9 +4417,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.36", - "socket2 0.6.1", - "thiserror 2.0.17", + "rustls 0.23.42", + "socket2 0.6.5", + "thiserror 2.0.19", "tokio", "tracing", "web-time", @@ -4163,6 +4431,7 @@ version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ + "aws-lc-rs", "bytes", "getrandom 0.4.3", "lru-slab", @@ -4170,10 +4439,10 @@ dependencies = [ "rand_pcg", "ring", "rustc-hash", - "rustls 0.23.36", + "rustls 0.23.42", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror 2.0.19", "tinyvec", "tracing", "web-time", @@ -4181,23 +4450,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.6.5", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.43" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -4214,26 +4483,20 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - [[package]] name = "rancor" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee" +checksum = "daff8b7b3ccf5f7ba270b3e7a0a4d4c701c5797e38dec27c7e2c3dbb830fed1c" dependencies = [ - "ptr_meta 0.3.1", + "ptr_meta", ] [[package]] name = "rand" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -4243,12 +4506,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -4279,7 +4542,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -4288,15 +4551,15 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "serde", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] @@ -4322,7 +4585,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -4345,9 +4608,9 @@ dependencies = [ [[package]] name = "rdkafka-sys" -version = "4.9.0+2.10.0" +version = "4.10.0+2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230dca48bc354d718269f3e4353280e188b610f7af7e2fcf54b7a79d5802872" +checksum = "e234cf318915c1059d4921ef7f75616b5219b10b46e9f3a511a15eb4b56a3f77" dependencies = [ "cmake", "libc", @@ -4372,43 +4635,43 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", ] [[package]] name = "redox_syscall" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" +checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 3.0.2", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -4418,9 +4681,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", @@ -4429,57 +4692,74 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rend" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6" +checksum = "663ba70707f96e871406fe10d68128412e619b06d1d47cb91c3a4c6501176240" [[package]] -name = "reqsign" -version = "0.16.5" +name = "reqsign-aws-v4" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43451dbf3590a7590684c25fb8d12ecdcc90ed3ac123433e500447c7d77ed701" +checksum = "4e9e1168fab3883ec6afed1c2e20c25b2a09f366cdb662ac3e0878ae0332d63e" dependencies = [ "anyhow", - "async-trait", - "base64 0.22.1", - "chrono", + "bytes", "form_urlencoded", - "getrandom 0.2.16", "hex", - "hmac", - "home", - "http 1.4.0", + "http 1.4.2", "log", "percent-encoding", - "quick-xml 0.37.5", - "rand 0.8.5", - "reqwest", + "quick-xml 0.41.0", + "reqsign-core", "rust-ini", "serde", "serde_json", - "sha1", - "sha2", + "serde_urlencoded", + "sha1 0.11.0", +] + +[[package]] +name = "reqsign-core" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514a1e0b4aa288652a3fdbda4f0a610f379cdf5374e55a37c9edd03d57ed856b" +dependencies = [ + "anyhow", + "base64", + "bytes", + "form_urlencoded", + "futures", + "hex", + "hmac 0.13.0", + "http 1.4.2", + "jiff", + "log", + "percent-encoding", + "sha1 0.11.0", + "sha2 0.11.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "reqsign-file-read-tokio" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b472a8d1f2e5a4be8ce13bb7bdf4b59e9bee613ce124aca23959ddb42176b39" +dependencies = [ + "anyhow", + "reqsign-core", "tokio", ] @@ -4489,23 +4769,23 @@ version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-core", "futures-util", - "h2 0.4.13", - "http 1.4.0", - "http-body 1.0.1", + "h2 0.4.15", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.7", + "hyper 1.11.0", + "hyper-rustls 0.27.9", "hyper-util", "js-sys", "log", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.36", + "rustls 0.23.42", "rustls-native-certs", "rustls-pki-types", "serde", @@ -4521,41 +4801,61 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams", + "wasm-streams 0.4.2", "web-sys", - "webpki-roots 1.0.5", + "webpki-roots 1.0.9", ] [[package]] -name = "ring" -version = "0.17.14" +name = "reqwest" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", + "base64", + "bytes", + "futures-core", + "futures-util", + "http 1.4.2", + "http-body 1.1.0", + "http-body-util", + "hyper 1.11.0", + "hyper-rustls 0.27.9", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.42", + "rustls-pki-types", + "rustls-platform-verifier", + "sync_wrapper", + "tokio", + "tokio-rustls 0.26.4", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams 0.5.0", + "web-sys", ] [[package]] -name = "rkyv" -version = "0.7.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta 0.1.4", - "rend 0.4.2", - "rkyv_derive 0.7.46", - "seahash", - "tinyvec", - "uuid", +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", ] [[package]] @@ -4566,27 +4866,16 @@ checksum = "815cc8a37159a463064825246cadb07961e25cd9885908606f6d08a98d8f8874" dependencies = [ "bytes", "hashbrown 0.17.1", - "indexmap 2.13.0", + "indexmap 2.14.0", "munge", - "ptr_meta 0.3.1", + "ptr_meta", "rancor", - "rend 0.5.3", - "rkyv_derive 0.8.17", + "rend", + "rkyv_derive", "tinyvec", "uuid", ] -[[package]] -name = "rkyv_derive" -version = "0.7.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rkyv_derive" version = "0.8.17" @@ -4595,14 +4884,14 @@ checksum = "c0ed1a78a1b19d184b0daa629dd9a024573173ec7d485b287cb369fb3607cc1c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "roaring" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba9ce64a8f45d7fc86358410bb1a82e8c987504c0d4900e9141d69a9f26c885" +checksum = "1dedc5658c6ecb3bdb5ef5f3295bb9253f42dcf3fd1402c03f6b1f7659c3c4a9" dependencies = [ "bytemuck", "byteorder", @@ -4620,8 +4909,8 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ - "const-oid", - "digest", + "const-oid 0.9.6", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-traits", @@ -4644,29 +4933,13 @@ dependencies = [ "ordered-multimap", ] -[[package]] -name = "rust_decimal" -version = "1.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282" -dependencies = [ - "arrayvec", - "borsh", - "bytes", - "num-traits", - "rand 0.8.5", - "rkyv 0.7.46", - "serde", - "serde_json", -] - [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" dependencies = [ - "rand 0.8.5", + "rand 0.9.5", ] [[package]] @@ -4680,11 +4953,11 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys", @@ -4705,9 +4978,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.36" +version = "0.23.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" dependencies = [ "aws-lc-rs", "once_cell", @@ -4720,9 +4993,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -4741,14 +5014,41 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" dependencies = [ "web-time", "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.42", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.13", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -4773,9 +5073,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "rusty-fork" @@ -4791,9 +5091,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -4806,9 +5106,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -4827,9 +5127,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", @@ -4853,19 +5153,13 @@ dependencies = [ "untrusted", ] -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "security-framework" -version = "3.5.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "core-foundation", "core-foundation-sys", "libc", @@ -4874,9 +5168,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -4884,9 +5178,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "seq-macro" @@ -4896,14 +5190,23 @@ checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", ] +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + [[package]] name = "serde-value" version = "0.7.0" @@ -4926,29 +5229,29 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 3.0.2", ] [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -4970,13 +5273,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 3.0.2", ] [[package]] @@ -5002,17 +5305,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.16.1" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ - "base64 0.22.1", + "base64", + "bs58", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.13.0", + "indexmap 2.14.0", "schemars 0.9.0", - "schemars 1.2.0", + "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", @@ -5021,25 +5325,36 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.16.1" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ - "darling 0.21.3", + "darling 0.23.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", "cpufeatures 0.2.17", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha1" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -5050,7 +5365,18 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures 0.2.17", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -5064,9 +5390,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" @@ -5084,15 +5410,25 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_cesu8" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] [[package]] name = "simdutf8" @@ -5102,15 +5438,15 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" dependencies = [ "serde", ] @@ -5133,14 +5469,14 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "snap" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" +checksum = "199905e6153d6405f9728fe44daace35f8f837bbf830bb6e85fbd5828709a886" [[package]] name = "socket2" @@ -5154,19 +5490,19 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "sonic-number" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a74044c092f4f43ca7a6cfd62854cf9fb5ac8502b131347c990bf22bef1dfe" +checksum = "3775c3390edf958191f1ab1e8c5c188907feebd0f3ce1604cb621f72961dbf32" dependencies = [ "cfg-if", ] @@ -5188,23 +5524,23 @@ dependencies = [ "simdutf8", "sonic-number", "sonic-simd", - "thiserror 2.0.17", + "thiserror 2.0.19", ] [[package]] name = "sonic-simd" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5707edbfb34a40c9f2a55fa09a49101d9fec4e0cc171ce386086bd9616f34257" +checksum = "f99e664ecd2d85a68c87e3c7a3cfe691f647ea9e835de984aba4d54a41f817d4" dependencies = [ "cfg-if", ] [[package]] name = "spin" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" dependencies = [ "lock_api", ] @@ -5238,7 +5574,7 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "crc", "crossbeam-queue", @@ -5250,17 +5586,17 @@ dependencies = [ "futures-util", "hashbrown 0.15.5", "hashlink", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "memchr", "once_cell", "percent-encoding", - "rustls 0.23.36", + "rustls 0.23.42", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.19", "tokio", "tokio-stream", "tracing", @@ -5278,7 +5614,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -5296,11 +5632,11 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "sqlx-core", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.114", + "syn 2.0.119", "tokio", "url", ] @@ -5312,12 +5648,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", - "base64 0.22.1", - "bitflags 2.10.0", + "base64", + "bitflags 2.13.1", "byteorder", "bytes", "crc", - "digest", + "digest 0.10.7", "dotenvy", "either", "futures-channel", @@ -5327,21 +5663,21 @@ dependencies = [ "generic-array", "hex", "hkdf", - "hmac", + "hmac 0.12.1", "itoa", "log", - "md-5", + "md-5 0.10.6", "memchr", "once_cell", "percent-encoding", - "rand 0.8.5", + "rand 0.8.7", "rsa", - "sha1", - "sha2", + "sha1 0.10.7", + "sha2 0.10.9", "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.17", + "thiserror 2.0.19", "tracing", "whoami", ] @@ -5353,8 +5689,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", - "base64 0.22.1", - "bitflags 2.10.0", + "base64", + "bitflags 2.13.1", "byteorder", "crc", "dotenvy", @@ -5364,21 +5700,21 @@ dependencies = [ "futures-util", "hex", "hkdf", - "hmac", + "hmac 0.12.1", "home", "itoa", "log", - "md-5", + "md-5 0.10.6", "memchr", "once_cell", - "rand 0.8.5", + "rand 0.8.7", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.17", + "thiserror 2.0.19", "tracing", "whoami", ] @@ -5402,7 +5738,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.17", + "thiserror 2.0.19", "tracing", "url", ] @@ -5413,12 +5749,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "stringprep" version = "0.1.5" @@ -5445,7 +5775,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -5456,7 +5786,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -5477,7 +5807,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -5488,9 +5818,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -5499,9 +5829,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.114" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "a207d6d6a2b7fc470b80443726053f18a2481b7e1eee970597051596567987a3" dependencies = [ "proc-macro2", "quote", @@ -5525,7 +5855,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -5534,20 +5864,14 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "tempfile" -version = "3.24.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys 0.61.2", @@ -5574,7 +5898,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.19", "tokio", "tokio-stream", "tokio-tar", @@ -5602,11 +5926,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.19", ] [[package]] @@ -5617,38 +5941,29 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 3.0.2", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - [[package]] name = "thrift" version = "0.17.0" @@ -5657,16 +5972,14 @@ checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" dependencies = [ "byteorder", "integer-encoding 3.0.4", - "log", "ordered-float 2.10.1", - "threadpool", ] [[package]] name = "time" -version = "0.3.53" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" dependencies = [ "deranged", "num-conv", @@ -5684,9 +5997,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -5703,9 +6016,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -5713,9 +6026,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -5728,9 +6041,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.49.0" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -5738,7 +6051,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2 0.6.5", "tokio-macros", "tracing", "windows-sys 0.61.2", @@ -5746,13 +6059,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -5771,7 +6084,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.36", + "rustls 0.23.42", "tokio", ] @@ -5814,13 +6127,14 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-sink", + "libc", "pin-project-lite", "tokio", ] @@ -5848,9 +6162,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.5+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -5861,33 +6175,33 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "serde", "serde_spanned", "toml_datetime 0.6.11", "toml_write", - "winnow", + "winnow 0.7.15", ] [[package]] name = "toml_edit" -version = "0.23.10+spec-1.0.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ - "indexmap 2.13.0", - "toml_datetime 0.7.5+spec-1.1.0", + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow", + "winnow 1.0.4", ] [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow", + "winnow 1.0.4", ] [[package]] @@ -5898,9 +6212,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -5914,20 +6228,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "bytes", "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "iri-string", + "http 1.4.2", + "http-body 1.1.0", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -5962,7 +6276,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -5998,9 +6312,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -6025,19 +6339,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "twox-hash" -version = "1.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" -dependencies = [ - "cfg-if", - "static_assertions", -] - -[[package]] -name = "twox-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" +checksum = "8464ec13c3691491391d9fce00f6416c9a48e46972f72d7865688be2080192c9" [[package]] name = "typed-builder" @@ -6056,14 +6360,44 @@ checksum = "3c36781cc0e46a83726d9879608e4cf6c2505237e263a8eb8c24502989cfdb28" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "typetag" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c90e86058a30d42a1a928dfb4b49bb33c98c3a2b4909492e6b0881cd94798ec2" +dependencies = [ + "erased-serde", + "inventory", + "once_cell", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "f153acc4e99a5f2a5aefa09fb078be54e26271b2813f6041200b224c098d8328" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.2", +] [[package]] name = "unarray" @@ -6079,9 +6413,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" @@ -6100,9 +6434,9 @@ checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-width" @@ -6116,6 +6450,16 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common 0.1.7", + "subtle", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -6155,11 +6499,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.19.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "js-sys", "serde_core", "wasm-bindgen", @@ -6200,9 +6544,9 @@ dependencies = [ "nix", "once_cell", "pin-project", - "rand 0.9.2", + "rand 0.9.5", "socket2 0.5.10", - "thiserror 2.0.17", + "thiserror 2.0.19", "tokio", "tokio-stream", "tower", @@ -6215,7 +6559,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a41a936651c3b8206339898466fd4f39596cfedf789e5ee6a8d02a45feb45f" dependencies = [ - "ahash 0.8.12", + "ahash", "anyhow", "bytes", "chrono", @@ -6233,7 +6577,7 @@ dependencies = [ "rustc-hash", "scopeguard", "sonic-rs", - "thiserror 2.0.17", + "thiserror 2.0.19", "tokio", "tracing", "volo", @@ -6281,9 +6625,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen", ] @@ -6296,9 +6640,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -6309,22 +6653,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.56" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.106" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6332,22 +6673,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.106" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.106" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] @@ -6365,11 +6706,24 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" -version = "0.3.83" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -6385,20 +6739,29 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.5", + "webpki-roots 1.0.9", ] [[package]] name = "webpki-roots" -version = "1.0.5" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] @@ -6465,7 +6828,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -6476,7 +6839,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] @@ -6521,15 +6884,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -6563,30 +6917,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -6599,12 +6936,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -6617,12 +6948,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -6635,24 +6960,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -6665,12 +6978,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -6683,12 +6990,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -6701,12 +7002,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -6720,40 +7015,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" +name = "winnow" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] [[package]] name = "winnow" -version = "0.7.14" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - -[[package]] -name = "wyz" -version = "0.5.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "xattr" @@ -6773,9 +7062,9 @@ checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -6784,68 +7073,68 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -6854,9 +7143,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -6865,26 +7154,26 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.119", ] [[package]] name = "zlib-rs" -version = "0.5.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" +checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5" [[package]] name = "zmij" -version = "1.0.12" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc5a66a20078bf1251bde995aa2fdcc4b800c70b5d92dd2c62abc5c60f679f8" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zstd" @@ -6897,18 +7186,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index fece715..b18d0a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,11 @@ [workspace] resolver = "2" members = [ - "crates/k2i-core", - "crates/k2i-cli", - "crates/k2i-rpc", - "crates/k2i-rpc-server", - "crates/k2i-e2e-runner", + "crates/k2i-core", + "crates/k2i-cli", + "crates/k2i-rpc", + "crates/k2i-rpc-server", + "crates/k2i-e2e-runner", ] [workspace.package] @@ -15,25 +15,36 @@ license = "Apache-2.0" authors = ["OSO DevOps"] repository = "https://github.com/osodevops/k2i" homepage = "https://github.com/osodevops/k2i" -rust-version = "1.88" +rust-version = "1.94" [workspace.dependencies] # Kafka rdkafka = { version = "0.38", features = ["cmake-build", "ssl"] } # Arrow ecosystem -arrow = { version = "54", features = ["csv", "json", "prettyprint"] } -arrow-ipc = "54" -arrow-json = "54" -arrow-select = "54" -parquet = { version = "54", features = ["snap", "async"] } +arrow = { version = "58", features = ["csv", "json", "prettyprint"] } +arrow-ipc = "58" +arrow-json = "58" +arrow-select = "58" +parquet = { version = "58", features = ["snap", "async"] } # Iceberg (official Apache implementation) -iceberg = "0.7" -iceberg-catalog-rest = "0.7" +iceberg = "0.10" +iceberg-catalog-rest = "0.10" +iceberg-storage-opendal = { version = "0.10", features = [ + "opendal-fs", + "opendal-s3", +] } # SQL -sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio", "tls-rustls", "any", "sqlite", "postgres", "migrate"] } +sqlx = { version = "0.8", default-features = false, features = [ + "runtime-tokio", + "tls-rustls", + "any", + "sqlite", + "postgres", + "migrate", +] } # Object storage object_store = { version = "0.11", features = ["aws", "azure", "gcp", "http"] } @@ -89,7 +100,10 @@ tower = "0.5" chrono = { version = "0.4", features = ["serde"] } # HTTP client -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } +reqwest = { version = "0.12", default-features = false, features = [ + "json", + "rustls-tls", +] } # Utilities uuid = { version = "1", features = ["v4"] } @@ -102,7 +116,10 @@ glob = "0.3" # Testing testcontainers = "0.23" -testcontainers-modules = { version = "0.11", features = ["kafka", "localstack"] } +testcontainers-modules = { version = "0.11", features = [ + "kafka", + "localstack", +] } tempfile = "3" tokio-test = "0.4" proptest = "1.5" diff --git a/Dockerfile b/Dockerfile index e5bd4b6..55b19b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build stage -# Using rust:1-bookworm to get the latest stable Rust (1.85+ required for edition2024) +# Using rust:1-bookworm to get the latest stable Rust (1.94+ required by iceberg 0.10) FROM rust:1-bookworm AS builder WORKDIR /build diff --git a/README.md b/README.md index 0f7bfa9..2f04410 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ K2I_E2E_LOAD_MESSAGES=100000 scripts/e2e-docker-iceberg-load.sh ## What K2I Does | Capability | Current behavior | -|---|---| +| --- | --- | | Kafka ingest | Uses `rdkafka`, manual offset management, batching, retry, and backpressure | | Payload decoding | Raw bytes, JSON-compatible raw payloads, and Confluent-framed Protobuf | | Schema Registry | Resolves Protobuf descriptors, caches schemas in memory and on disk, supports subject strategies | @@ -119,7 +119,7 @@ Hot-path visibility is local and intended for co-located readers or sidecars. Co ## K2I vs Alternatives | Dimension | K2I | Kafka Connect Iceberg Sink | Flink Iceberg Sink | Spark Micro-Batch | Confluent TableFlow | Moonlink | -|---|---|---|---|---|---|---| +| --- | --- | --- | --- | --- | --- | --- | | Primary fit | Final-form Kafka events to Iceberg | Connector-based ingestion | Stream processing and transforms | Batch/micro-batch ETL | Managed Confluent pipeline | Postgres CDC to Iceberg | | Deployment | Single Rust binary/container | Kafka Connect cluster | Flink cluster | Spark runtime | Managed service | Service/extension stack | | Transformations | Intentionally minimal | SMT/basic connector config | Strong | Strong | Limited/managed | CDC-focused | @@ -169,7 +169,7 @@ cargo build --release Binary location: `target/release/k2i` -Source builds require Rust 1.75+, CMake, and OpenSSL development libraries. Kerberos/GSSAPI support is not enabled by default; if you need it, add the `gssapi` feature to `rdkafka` and install the matching SASL development libraries for your platform. +Source builds require Rust 1.94+, CMake, and OpenSSL development libraries. Kerberos/GSSAPI support is not enabled by default; if you need it, add the `gssapi` feature to `rdkafka` and install the matching SASL development libraries for your platform. ## Quick Start @@ -265,7 +265,7 @@ See [Production Readiness](docs/production-readiness.md) for the detailed review ## Documentation | Guide | Description | -|---|---| +| --- | --- | | [Kafka to Iceberg](docs/kafka-to-iceberg.md) | Main explanation of the K2I data path | | [Quickstart](docs/quickstart.md) | Local proof and first manual run | | [Configuration](docs/configuration.md) | Complete TOML reference | @@ -323,7 +323,7 @@ See the full [FAQ](docs/faq.md). ## Looking for Enterprise Apache Kafka Support? -[OSO](https://oso.sh) engineers are focused on deploying, operating, and maintaining Apache Kafka platforms. If you need SLA-backed support, security review, deployment help, or a broader data lakehouse strategy, contact **enquiries@oso.sh** or visit [oso.sh/contact](https://oso.sh/contact/). +[OSO](https://oso.sh) engineers are focused on deploying, operating, and maintaining Apache Kafka platforms. If you need SLA-backed support, security review, deployment help, or a broader data lakehouse strategy, contact **** or visit [oso.sh/contact](https://oso.sh/contact/). ## Contributing diff --git a/claude.md b/claude.md index 951a452..d007d2a 100644 --- a/claude.md +++ b/claude.md @@ -7,6 +7,7 @@ K2I is a production-grade streaming ingestion engine written in Rust that bridge ## Why We Built It The data engineering world forces a painful trade-off: + - **Real-time systems** (Flink, KSQL): millisecond latency but high cost and operational complexity - **Batch systems** (Spark, Airflow): low cost but minutes-to-hours of latency @@ -15,16 +16,20 @@ K2I delivers **sub-second data freshness at batch economics** through a single-p ## Core Concepts ### Hot/Cold Data Separation + - **Hot buffer**: In-memory Arrow RecordBatches with DashMap indexes for <1ms query lookups - **Cold storage**: Parquet files on object storage (S3/GCS/Azure) committed to Iceberg catalogs ### Single-Process Simplicity + No cluster coordination, no ZooKeeper, no JobManager. One binary, one config file, production-ready. This is a deliberate architectural choice — not a limitation. ### Transaction Log Durability + Append-only write-ahead log with CRC32 checksums ensures crash recovery without data loss. Offset ranges are tracked for idempotency, enabling exactly-once semantics without distributed transactions. ### Defensive Design + Backpressure propagation from buffer to Kafka consumer, circuit breakers for downstream failures, exponential backoff retry, and graceful degradation under load. ## Architecture @@ -77,13 +82,13 @@ config/ ## Tech Stack -- **Language**: Rust 1.85+ (edition 2021) +- **Language**: Rust 1.94+ (edition 2021) - **Async Runtime**: Tokio - **HTTP**: Axum - **Kafka**: rdkafka (librdkafka bindings, SASL/SSL) -- **Columnar**: Apache Arrow 54 -- **File Format**: Parquet 54 (Snappy/Zstd/LZ4) -- **Table Format**: Iceberg 0.7 +- **Columnar**: Apache Arrow 58 +- **File Format**: Parquet 58 (Snappy/Zstd/LZ4) +- **Table Format**: Iceberg 0.10 - **Object Storage**: object_store 0.11 - **Concurrency**: DashMap 6 - **Metrics**: Prometheus 0.13 @@ -103,7 +108,7 @@ config/ ## Crash Recovery Guarantees | Crash Point | Recovery Behavior | -|-------------|-------------------| +| ------------- | ------------------- | | Before FlushStart | Resume from last committed offset | | After FlushStart | Re-execute flush from buffer | | After ParquetWritten | File exists as orphan, cleanup later | diff --git a/crates/k2i-core/Cargo.toml b/crates/k2i-core/Cargo.toml index d251a1d..93f6818 100644 --- a/crates/k2i-core/Cargo.toml +++ b/crates/k2i-core/Cargo.toml @@ -22,6 +22,7 @@ parquet.workspace = true # Iceberg iceberg.workspace = true iceberg-catalog-rest.workspace = true +iceberg-storage-opendal.workspace = true # Object storage object_store.workspace = true diff --git a/crates/k2i-core/src/iceberg/official.rs b/crates/k2i-core/src/iceberg/official.rs index 92b4042..0bf0613 100644 --- a/crates/k2i-core/src/iceberg/official.rs +++ b/crates/k2i-core/src/iceberg/official.rs @@ -8,37 +8,28 @@ //! //! ## Adapter over the official REST catalog client //! -//! [`OfficialRestCommitter`] now also implements [`CatalogOperations`] by -//! delegating most methods to the underlying `iceberg_catalog_rest::RestCatalog`. -//! The one exception is `update_schema` — the official client's -//! `Transaction::update_schema()` is merged to `apache/iceberg-rust` `main` -//! but is not available in K2I's currently pinned `iceberg` release. -//! -//! Until K2I upgrades to an `iceberg` release containing that API, -//! `update_schema` is handled by a small, standalone REST codepath in this -//! file. It is explicitly temporary scaffolding tracked for removal by the -//! follow-up feature `003-iceberg-010-readiness-spike`. +//! [`OfficialRestCommitter`] implements [`CatalogOperations`] by delegating all +//! methods — including `update_schema` — to the underlying +//! `iceberg_catalog_rest::RestCatalog` and the official `Transaction` API from +//! `iceberg` 0.10.0+. use crate::config::{CatalogType, CredentialType, IcebergConfig}; use crate::iceberg::factory::{ CatalogHealth, CatalogOperations, DataFileInfo, SchemaFieldInfo, SnapshotCommit, SnapshotCommitResult, TableInfo, TableSchema, }; -use crate::iceberg::rest_api; use crate::{Error, IcebergError, Result}; use ::iceberg::{Catalog, CatalogBuilder}; use async_trait::async_trait; use iceberg_catalog_rest::{ RestCatalog, RestCatalogBuilder, REST_CATALOG_PROP_URI, REST_CATALOG_PROP_WAREHOUSE, }; -use parking_lot::{Mutex, RwLock}; -use reqwest::header::{HeaderMap, HeaderName, HeaderValue}; -use reqwest::Client as HttpClient; +use iceberg_storage_opendal::OpenDalResolvingStorageFactory; +use parking_lot::Mutex; use std::collections::{HashMap, VecDeque}; use std::path::{Path, PathBuf}; use std::sync::Arc; -use std::time::{Duration, Instant}; -use tokio::sync::{Mutex as AsyncMutex, OnceCell}; +use std::time::Instant; use tracing::{debug, info}; const RECENT_MANIFEST_LIST_LIMIT: usize = 64; @@ -52,47 +43,13 @@ pub struct OfficialCommitResult { pub manifest_list_path: String, } -/// OAuth2 token cached in memory for the standalone `update_schema` path. -#[derive(Debug, Clone)] -struct CachedOAuthToken { - token: String, - expires_at: Instant, -} - -/// Runtime route negotiated through the REST catalog `/v1/config` endpoint. -#[derive(Debug, Clone, PartialEq, Eq)] -struct ResolvedRestRoute { - base_uri: String, - prefix: Option, -} - /// REST-catalog backed official Iceberg committer. /// -/// Most [`CatalogOperations`] methods delegate to the underlying `RestCatalog`. -/// `update_schema` is handled by a standalone REST codepath (see module docs). +/// All [`CatalogOperations`] methods delegate to the underlying `RestCatalog` +/// through the official `iceberg-rust` transaction APIs. pub struct OfficialRestCommitter { catalog: RestCatalog, warehouse_path: String, - // ---- fields for the standalone update_schema path ---- - rest_uri: String, - warehouse_name: String, - http_client: HttpClient, - /// Cached runtime route, resolved exactly once from `/v1/config`. - /// - /// `tokio::sync::OnceCell::get_or_try_init` makes concurrent first callers - /// share one request. Failed resolutions are not cached, so a transient - /// failure does not poison later attempts. - route_cache: OnceCell, - credential_type: CredentialType, - bearer_token: Option, - oauth2_client_id: Option, - oauth2_client_secret: Option, - oauth2_scope: Option, - oauth2_token_endpoint: Option, - /// Cached OAuth2 access token for the standalone path. - oauth2_token: RwLock>, - /// Prevent concurrent requests from stampeding the OAuth2 token endpoint. - oauth2_refresh_lock: AsyncMutex<()>, /// Bounded commit metadata cache used to preserve the real manifest-list /// path through the catalog abstraction without changing its result type. recent_manifest_lists: Mutex>, @@ -106,16 +63,20 @@ impl OfficialRestCommitter { /// Build a committer from K2I Iceberg config. pub async fn new(config: &IcebergConfig) -> Result { - let rest_uri = config - .rest_uri - .as_ref() - .ok_or_else(|| Error::Config("official REST committer requires rest_uri".into()))?; - let wh = warehouse_uri(&config.warehouse_path)?; let mut props = HashMap::from([ - (REST_CATALOG_PROP_URI.to_string(), rest_uri.clone()), - (REST_CATALOG_PROP_WAREHOUSE.to_string(), wh.clone()), + ( + REST_CATALOG_PROP_URI.to_string(), + config + .rest_uri + .as_ref() + .ok_or_else(|| { + Error::Config("official REST committer requires rest_uri".into()) + })? + .clone(), + ), + (REST_CATALOG_PROP_WAREHOUSE.to_string(), wh), ]); apply_rest_auth_props(config, &mut props)?; @@ -126,34 +87,14 @@ impl OfficialRestCommitter { } let catalog = RestCatalogBuilder::default() + .with_storage_factory(Arc::new(OpenDalResolvingStorageFactory::new())) .load("k2i", props) .await .map_err(map_iceberg_error)?; - // Build an HTTP client for the standalone update_schema path. - let timeout_secs = config.rest.request_timeout_seconds.unwrap_or(30); - let http_client = HttpClient::builder() - .timeout(Duration::from_secs(timeout_secs)) - .pool_max_idle_per_host(config.catalog_manager.connection_pool_size) - .default_headers(custom_header_map(&config.rest.custom_headers)?) - .build() - .map_err(|e| Error::Config(format!("Failed to create HTTP client: {}", e)))?; - Ok(Self { catalog, warehouse_path: config.warehouse_path.clone(), - rest_uri: rest_uri.trim_end_matches('/').to_string(), - warehouse_name: wh, - http_client, - route_cache: OnceCell::new(), - credential_type: config.rest.credential_type.clone(), - bearer_token: config.rest.credential.clone(), - oauth2_client_id: config.rest.oauth2_client_id.clone(), - oauth2_client_secret: config.rest.oauth2_client_secret.clone(), - oauth2_scope: config.rest.oauth2_scope.clone(), - oauth2_token_endpoint: config.rest.oauth2_token_endpoint.clone(), - oauth2_token: RwLock::new(None), - oauth2_refresh_lock: AsyncMutex::new(()), recent_manifest_lists: Mutex::new(VecDeque::new()), }) } @@ -177,382 +118,6 @@ impl OfficialRestCommitter { .await } - // ---- Standalone update_schema helpers ---- - - /// Return the auth header value for standalone REST calls. - async fn get_auth_header(&self) -> Result> { - match self.credential_type { - CredentialType::None => Ok(None), - CredentialType::Bearer => { - Ok(self.bearer_token.as_ref().map(|t| format!("Bearer {}", t))) - } - CredentialType::OAuth2 => { - let cached_header = { - let token = self.oauth2_token.read(); - match token.as_ref() { - Some(cached) if Instant::now() < cached.expires_at => { - Some(format!("Bearer {}", cached.token)) - } - _ => None, - } - }; - if cached_header.is_some() { - return Ok(cached_header); - } - - // Re-check after acquiring the refresh lock: another caller - // may have refreshed the token while this task was waiting. - let _refresh_guard = self.oauth2_refresh_lock.lock().await; - let cached_header = { - let token = self.oauth2_token.read(); - match token.as_ref() { - Some(cached) if Instant::now() < cached.expires_at => { - Some(format!("Bearer {}", cached.token)) - } - _ => None, - } - }; - if cached_header.is_some() { - return Ok(cached_header); - } - - self.refresh_oauth2_token().await?; - let token = self.oauth2_token.read(); - Ok(token.as_ref().map(|t| format!("Bearer {}", t.token))) - } - } - } - - /// Refresh OAuth2 token via the token endpoint. - async fn refresh_oauth2_token(&self) -> Result<()> { - let client_id = self - .oauth2_client_id - .as_ref() - .ok_or_else(|| Error::Config("OAuth2 requires client_id for standalone path".into()))?; - let client_secret = self.oauth2_client_secret.as_ref().ok_or_else(|| { - Error::Config("OAuth2 requires client_secret for standalone path".into()) - })?; - - let url = oauth2_token_url(&self.rest_uri, self.oauth2_token_endpoint.as_deref()); - let response = self - .http_client - .post(&url) - .form(&[ - ("grant_type", "client_credentials"), - ("client_id", client_id), - ("client_secret", client_secret), - ("scope", self.oauth2_scope.as_deref().unwrap_or("catalog")), - ]) - .send() - .await - .map_err(|e| { - Error::Iceberg(IcebergError::CatalogConnection(format!( - "OAuth2 token request failed: {}", - e - ))) - })?; - - if !response.status().is_success() { - return Err(Error::Iceberg(IcebergError::CatalogConnection(format!( - "OAuth2 token request failed: {}", - response.status() - )))); - } - - let token_response: rest_api::OAuthTokenResponse = response - .json() - .await - .map_err(|e| Error::Iceberg(IcebergError::CatalogConnection(e.to_string())))?; - - let expires_in = token_response.expires_in.unwrap_or(3600); - let ttl_seconds = u64::try_from(expires_in).map_err(|_| { - Error::Iceberg(IcebergError::CatalogConnection(format!( - "OAuth2 token response contained a negative expires_in value: {}", - expires_in - ))) - })?; - let refresh_skew = (ttl_seconds / 10).clamp(1, 60); - let expires_at = - Instant::now() + Duration::from_secs(ttl_seconds.saturating_sub(refresh_skew)); - - *self.oauth2_token.write() = Some(CachedOAuthToken { - token: token_response.access_token, - expires_at, - }); - - debug!( - "OAuth2 token refreshed for standalone path, expires in {}s", - expires_in - ); - Ok(()) - } - - /// Resolve and cache the runtime REST route from `/v1/config`. - async fn do_resolve_route(&self) -> Result { - let route = self - .route_cache - .get_or_try_init(|| async { - let url = format!("{}/v1/config", self.rest_uri); - let mut req = self.http_client.get(&url); - - if !self.warehouse_name.is_empty() { - req = req.query(&[("warehouse", &self.warehouse_name)]); - } - - if let Some(auth) = self.get_auth_header().await? { - req = req.header("Authorization", auth); - } - - let response = req - .header("Accept", "application/json") - .send() - .await - .map_err(|e| { - Error::Iceberg(IcebergError::CatalogConnection(format!( - "Failed to fetch /v1/config: {}", - e - ))) - })?; - - if !response.status().is_success() { - let status = response.status(); - let body = response.text().await.unwrap_or_default(); - return Err(Error::Iceberg(IcebergError::CatalogConnection(format!( - "/v1/config returned {}: {}", - status, body - )))); - } - - let config: rest_api::CatalogConfig = response.json().await.map_err(|e| { - Error::Iceberg(IcebergError::CatalogConnection(format!( - "Failed to parse /v1/config response: {}", - e - ))) - })?; - - Ok(ResolvedRestRoute { - base_uri: extract_uri(&config) - .unwrap_or_else(|| self.rest_uri.clone()) - .trim_end_matches('/') - .to_string(), - prefix: extract_prefix(&config), - }) - }) - .await?; - - Ok(route.clone()) - } - - /// Build the request URL for the standalone update_schema call. - fn update_schema_url( - &self, - route: &ResolvedRestRoute, - namespace: &str, - table: &str, - ) -> Result { - build_update_schema_url(&route.base_uri, route.prefix.as_deref(), namespace, table) - } - - /// Standalone `update_schema` implementation. - /// - /// This is a temporary, narrowly-scoped hand-rolled REST codepath that - /// exists only because the official `iceberg-rust` client's - /// `Transaction::update_schema()` is not yet available on crates.io - /// (see module-level docs). - /// - /// TODO(iceberg-0.10): Delete this entire implementation once - /// `iceberg-rust` 0.10.0+ is published to crates.io with a stable - /// `Transaction::update_schema()` API. - /// - /// **Bug fixes vs. the deleted `RestCatalogClient`:** - /// - Prefix is resolved **exactly once** and cached (no per-call re-resolution). - /// - A transient error after the first successful resolution **never** - /// overwrites the cached prefix. - /// - If the *first* resolution attempt fails, the method returns an error - /// (no silent fallback to unprefixed paths). - async fn update_schema_standalone( - &self, - namespace: &str, - table: &str, - schema: &TableSchema, - expected_schema_id: Option, - ) -> Result { - // Resolve the runtime route once, including any catalog-provided URI - // override and multi-warehouse prefix. - let route = self.do_resolve_route().await?; - let url = self.update_schema_url(&route, namespace, table)?; - - let mut requirements = Vec::new(); - if let Some(current_schema_id) = expected_schema_id { - requirements - .push(rest_api::TableRequirement::AssertCurrentSchemaId { current_schema_id }); - } - - let last_column_id = schema.fields.iter().map(|field| field.id).max(); - let updates = vec![ - rest_api::TableUpdate::AddSchema { - schema: self.to_api_schema(schema), - last_column_id, - }, - rest_api::TableUpdate::SetCurrentSchema { - schema_id: schema.schema_id, - }, - ]; - - let request_body = rest_api::CommitTableRequest { - identifier: None, - requirements, - updates, - }; - - let mut req = self.http_client.post(&url).json(&request_body); - req = req.header("Content-Type", "application/json"); - req = req.header("Accept", "application/json"); - - if let Some(auth) = self.get_auth_header().await? { - req = req.header("Authorization", auth); - } - - let response = req.send().await.map_err(|e| { - Error::Iceberg(IcebergError::CatalogConnection(format!( - "update_schema request failed: {}", - e - ))) - })?; - - if !response.status().is_success() { - let status = response.status(); - let body = response.text().await.unwrap_or_default(); - - if status == reqwest::StatusCode::CONFLICT { - return Err(Error::Iceberg(IcebergError::SchemaEvolution(format!( - "schema update conflict for {}.{} while moving to schema ID {}", - namespace, table, schema.schema_id - )))); - } - - return Err(self.handle_error_response(status, &body)); - } - - let commit_response: rest_api::CommitTableResponse = - response.json().await.map_err(|e| { - Error::Iceberg(IcebergError::Other(format!( - "Failed to parse commit response: {}", - e - ))) - })?; - - let committed_schema = self.convert_current_schema(&commit_response.metadata)?; - - info!( - namespace = %namespace, - table = %table, - schema_id = schema.schema_id, - field_count = schema.fields.len(), - "Schema update committed via standalone REST path" - ); - - Ok(TableInfo { - namespace: namespace.to_string(), - name: table.to_string(), - location: commit_response.metadata.location, - current_snapshot_id: commit_response.metadata.current_snapshot_id, - schema: committed_schema, - properties: commit_response.metadata.properties, - }) - } - - /// Convert a K2I `TableSchema` to a `rest_api::Schema`. - fn to_api_schema(&self, schema: &TableSchema) -> rest_api::Schema { - rest_api::Schema { - schema_id: schema.schema_id, - r#type: "struct".to_string(), - fields: schema - .fields - .iter() - .map(|f| rest_api::SchemaField { - id: f.id, - name: f.name.clone(), - field_type: schema_type_to_api_value(&f.field_type), - required: f.required, - doc: f.doc.clone(), - }) - .collect(), - identifier_field_ids: vec![], - } - } - - /// Convert a `rest_api::TableMetadata` to a `TableSchema`. - fn convert_current_schema(&self, metadata: &rest_api::TableMetadata) -> Result { - let schema = metadata.current_schema().ok_or_else(|| { - Error::Iceberg(IcebergError::Other(format!( - "REST catalog table metadata at {} has no current schema", - metadata.location - ))) - })?; - Ok(self.convert_schema(schema)) - } - - /// Convert a `rest_api::Schema` to a `TableSchema`. - fn convert_schema(&self, schema: &rest_api::Schema) -> TableSchema { - TableSchema { - schema_id: schema.schema_id, - fields: schema - .fields - .iter() - .map(|f| { - let field_type = match &f.field_type { - serde_json::Value::String(s) => s.clone(), - other => other.to_string(), - }; - SchemaFieldInfo { - id: f.id, - name: f.name.clone(), - field_type, - required: f.required, - doc: f.doc.clone(), - } - }) - .collect(), - } - } - - /// Handle error response from REST API. - fn handle_error_response(&self, status: reqwest::StatusCode, body: &str) -> Error { - if let Ok(error_response) = serde_json::from_str::(body) { - match status { - reqwest::StatusCode::NOT_FOUND => { - if error_response.error_type.contains("NoSuchTable") { - Error::Iceberg(IcebergError::TableNotFound(error_response.message)) - } else if error_response.error_type.contains("NoSuchNamespace") { - Error::Iceberg(IcebergError::CatalogConnection(format!( - "Namespace not found: {}", - error_response.message - ))) - } else { - Error::Iceberg(IcebergError::Other(error_response.message)) - } - } - reqwest::StatusCode::CONFLICT => Error::Iceberg(IcebergError::CasConflict { - expected: -1, - actual: -1, - }), - reqwest::StatusCode::UNAUTHORIZED | reqwest::StatusCode::FORBIDDEN => { - Error::Iceberg(IcebergError::CatalogConnection(format!( - "Authentication failed: {}", - error_response.message - ))) - } - _ => Error::Iceberg(IcebergError::Other(format!( - "{}: {}", - status, error_response.message - ))), - } - } else { - Error::Iceberg(IcebergError::Other(format!("{}: {}", status, body))) - } - } - fn remember_manifest_list(&self, result: &OfficialCommitResult) { let mut recent = self.recent_manifest_lists.lock(); if let Some(index) = recent @@ -583,7 +148,7 @@ impl CatalogOperations for OfficialRestCommitter { Ok(CatalogHealth { is_healthy: true, response_time_ms: elapsed, - message: Some(format!("REST catalog at {} is healthy", self.rest_uri)), + message: Some("REST catalog is healthy".to_string()), catalog_type: CatalogType::Rest, }) } @@ -659,7 +224,7 @@ impl CatalogOperations for OfficialRestCommitter { .load_table(&ident) .await .map_err(map_iceberg_error)?; - table_info_from(namespace, table, &loaded) + Ok(table_info_from(namespace, table, &loaded)) } async fn create_table( @@ -680,7 +245,7 @@ impl CatalogOperations for OfficialRestCommitter { .await .map_err(map_iceberg_error)?; info!(namespace = %namespace, table = %table, "Created table"); - table_info_from(namespace, table, &created) + Ok(table_info_from(namespace, table, &created)) } async fn current_snapshot_id(&self, namespace: &str, table: &str) -> Result> { @@ -699,6 +264,18 @@ impl CatalogOperations for OfficialRestCommitter { table: &str, commit: SnapshotCommit, ) -> Result { + // NOTE: `commit.expected_snapshot_id` is intentionally not used here. + // Optimistic concurrency (CAS) is enforced by the official + // `Transaction` inside `commit_append_with_catalog`, which loads the + // current table metadata and attaches a `RefSnapshotIdMatch` + // requirement that the REST catalog validates at commit time. The + // caller-supplied `expected_snapshot_id` (derived from the metadata + // cache) would only duplicate that check. + // + // This path performs a `fast_append` and cannot remove files. Ingestion + // never requests removals, but maintenance compaction does — silently + // dropping them would leave compacted rows duplicated, so removals are + // rejected with a hard error. if !commit.files_to_remove.is_empty() { return Err(Error::Iceberg(IcebergError::SnapshotCommit(format!( "official REST catalog append commits do not support removing files; \ @@ -709,12 +286,11 @@ impl CatalogOperations for OfficialRestCommitter { let files_added = commit.files_to_add.len(); - let result = commit_append_with_catalog_at_snapshot( + let result = commit_append_with_catalog( &self.catalog, &self.warehouse_path, namespace, table, - commit.expected_snapshot_id, commit.files_to_add, commit.summary, ) @@ -737,15 +313,88 @@ impl CatalogOperations for OfficialRestCommitter { .map(|(_, path)| path.clone()) } + /// Additive-only schema evolution through the official `Transaction` API. + /// + /// `expected_schema_id` is intentionally unused: the transaction loads the + /// current table metadata and the REST catalog validates the commit + /// requirements derived from it, so a caller-side schema-id assertion + /// would only duplicate that check. Fields whose names already exist are + /// skipped — callers are expected to run `diff_table_schema` first, which + /// rejects type or requiredness changes as breaking. async fn update_schema( &self, namespace: &str, table: &str, schema: &TableSchema, - expected_schema_id: Option, + _expected_schema_id: Option, ) -> Result { - self.update_schema_standalone(namespace, table, schema, expected_schema_id) + use ::iceberg::transaction::{ApplyTransactionAction, Transaction}; + + let ident = table_ident(namespace, table)?; + let loaded = self + .catalog + .load_table(&ident) .await + .map_err(map_iceberg_error)?; + + let current_schema = loaded.metadata().current_schema(); + let current_names: std::collections::HashSet<_> = current_schema + .as_struct() + .fields() + .iter() + .map(|field| field.name.as_str()) + .collect(); + + let tx = Transaction::new(&loaded); + let mut update = tx.update_schema(); + let mut additions = 0; + + for field in &schema.fields { + if current_names.contains(field.name.as_str()) { + continue; + } + + let field_type = parse_iceberg_type(&field.field_type)?; + let add = if field.required { + return Err(Error::Iceberg(IcebergError::SchemaEvolution(format!( + "cannot add required column {} via additive schema evolution", + field.name + )))); + } else { + match &field.doc { + Some(doc) => ::iceberg::transaction::AddColumn::builder() + .name(field.name.clone()) + .field_type(field_type) + .required(false) + .doc(doc.clone()) + .build(), + None => ::iceberg::transaction::AddColumn::builder() + .name(field.name.clone()) + .field_type(field_type) + .required(false) + .build(), + } + }; + + update = update.add_column(add); + additions += 1; + } + + if additions == 0 { + return Ok(table_info_from(namespace, table, &loaded)); + } + + let tx = update.apply(tx).map_err(map_iceberg_error)?; + let committed = tx.commit(&self.catalog).await.map_err(map_iceberg_error)?; + + info!( + namespace = %namespace, + table = %table, + additions, + "Schema update committed via official REST transaction path" + ); + + Ok(table_info_from(namespace, table, &committed)) } fn catalog_type(&self) -> CatalogType { @@ -757,144 +406,139 @@ impl CatalogOperations for OfficialRestCommitter { } async fn close(&self) -> Result<()> { - *self.oauth2_token.write() = None; info!("Official REST committer closed"); Ok(()) } } -/// Extract the warehouse prefix from a catalog `/v1/config` response. -/// -/// Per the Iceberg REST spec, `overrides` take precedence over `defaults`. -/// Returns `None` for single-warehouse catalogs that omit `prefix`. -fn extract_prefix(config: &rest_api::CatalogConfig) -> Option { - config - .overrides - .get("prefix") - .or_else(|| config.defaults.get("prefix")) - .cloned() -} - -/// The official REST client treats only an `overrides.uri` value as a runtime -/// endpoint replacement; mirror that behavior in the temporary schema path. -fn extract_uri(config: &rest_api::CatalogConfig) -> Option { - config.overrides.get("uri").cloned() -} - -/// Build the REST URL for a table commit (used by the standalone -/// `update_schema` path). When the catalog negotiated a warehouse `prefix`, -/// it is inserted between `/v1/` and `namespaces/` so multi-warehouse -/// catalogs (Lakekeeper, Polaris, Unity, Gravitino) address the right tenant. -fn build_update_schema_url( - rest_uri: &str, - prefix: Option<&str>, - namespace: &str, - table: &str, -) -> Result { - let namespace = namespace_ident(namespace)?; - let namespace_path = namespace.to_url_string(); - let encoded_ns = urlencoding::encode(&namespace_path); - let encoded_table = urlencoding::encode(table); - let rest_uri = rest_uri.trim_end_matches('/'); - Ok(match prefix { - Some(p) => format!( - "{}/v1/{}/namespaces/{}/tables/{}", - rest_uri, p, encoded_ns, encoded_table - ), - None => format!( - "{}/v1/namespaces/{}/tables/{}", - rest_uri, encoded_ns, encoded_table - ), - }) -} - -/// Resolve the OAuth2 token endpoint exactly as the official REST client does: -/// an explicit endpoint is already complete, while the catalog URI uses the -/// Iceberg REST default path. -fn oauth2_token_url(rest_uri: &str, explicit_endpoint: Option<&str>) -> String { - explicit_endpoint - .map(str::to_string) - .unwrap_or_else(|| format!("{}/v1/oauth/tokens", rest_uri.trim_end_matches('/'))) -} - -fn custom_header_map(headers: &HashMap) -> Result { - let mut parsed = HeaderMap::new(); - for (name, value) in headers { - let name = HeaderName::from_bytes(name.as_bytes()) - .map_err(|e| Error::Config(format!("Invalid REST custom header name {name:?}: {e}")))?; - let value = HeaderValue::from_bytes(value.as_bytes()).map_err(|e| { - Error::Config(format!("Invalid value for REST custom header {name}: {e}")) - })?; - parsed.insert(name, value); - } - Ok(parsed) -} - -/// Convert a K2I `field_type` string to a `serde_json::Value` suitable for -/// the REST API schema representation. -fn schema_type_to_api_value(field_type: &str) -> serde_json::Value { - let trimmed = field_type.trim(); - if trimmed.starts_with('{') || trimmed.starts_with('[') { - serde_json::from_str(trimmed) - .unwrap_or_else(|_| serde_json::Value::String(field_type.to_string())) - } else { - serde_json::Value::String(field_type.to_string()) - } -} - /// Convert a dot-separated namespace string to an Iceberg `NamespaceIdent`. fn namespace_ident(namespace: &str) -> Result<::iceberg::NamespaceIdent> { let parts: Vec<&str> = namespace.split('.').filter(|p| !p.is_empty()).collect(); ::iceberg::NamespaceIdent::from_strs(parts).map_err(map_iceberg_error) } +/// Convert an Iceberg type to the JSON string format used by the protobuf decoder. +/// +/// Primitive types become plain strings (e.g. `"double"`), while nested types +/// produce full JSON objects so that round-tripping through `TableSchema` and +/// `parse_iceberg_type` preserves the exact representation. +fn iceberg_type_to_json_string(ty: &::iceberg::spec::Type) -> String { + use ::iceberg::spec::Type; + match ty { + Type::Primitive(p) => { + // Primitives use the same lowercase names as iceberg_type_value. + let s = match p { + ::iceberg::spec::PrimitiveType::Boolean => "boolean", + ::iceberg::spec::PrimitiveType::Int => "int", + ::iceberg::spec::PrimitiveType::Long => "long", + ::iceberg::spec::PrimitiveType::Float => "float", + ::iceberg::spec::PrimitiveType::Double => "double", + ::iceberg::spec::PrimitiveType::Date => "date", + ::iceberg::spec::PrimitiveType::Time => "time", + ::iceberg::spec::PrimitiveType::Timestamp => "timestamp", + ::iceberg::spec::PrimitiveType::Timestamptz => "timestamptz", + ::iceberg::spec::PrimitiveType::TimestampNs => "timestamp_ns", + ::iceberg::spec::PrimitiveType::TimestamptzNs => "timestamptz_ns", + ::iceberg::spec::PrimitiveType::String => "string", + ::iceberg::spec::PrimitiveType::Uuid => "uuid", + ::iceberg::spec::PrimitiveType::Fixed(len) => { + return format!("fixed[{}]", len); + } + ::iceberg::spec::PrimitiveType::Binary => "binary", + ::iceberg::spec::PrimitiveType::Decimal { precision, scale } => { + return format!("decimal({},{})", precision, scale); + } + }; + s.to_string() + } + Type::Struct(s) => { + let fields: Vec = s + .fields() + .iter() + .map(|f| { + serde_json::json!({ + "id": f.id, + "name": f.name, + "required": f.required, + "type": serde_json::from_str::( + &iceberg_type_to_json_string(&f.field_type) + ) + .unwrap_or_else(|_| serde_json::Value::String( + iceberg_type_to_json_string(&f.field_type) + )), + "doc": f.doc, + }) + }) + .collect(); + serde_json::json!({ + "type": "struct", + "fields": fields, + }) + .to_string() + } + Type::List(l) => { + let element = iceberg_type_to_json_string(&l.element_field.field_type); + let element_value = serde_json::from_str::(&element) + .unwrap_or(serde_json::Value::String(element)); + serde_json::json!({ + "type": "list", + "element-id": l.element_field.id, + "element": element_value, + "element-required": l.element_field.required, + }) + .to_string() + } + Type::Map(m) => { + let key = iceberg_type_to_json_string(&m.key_field.field_type); + let value = iceberg_type_to_json_string(&m.value_field.field_type); + let key_value = serde_json::from_str::(&key) + .unwrap_or(serde_json::Value::String(key)); + let value_value = serde_json::from_str::(&value) + .unwrap_or(serde_json::Value::String(value)); + serde_json::json!({ + "type": "map", + "key-id": m.key_field.id, + "key": key_value, + "value-id": m.value_field.id, + "value": value_value, + "value-required": m.value_field.required, + }) + .to_string() + } + } +} + /// Convert an official Iceberg `Schema` back into K2I's `TableSchema`. -fn iceberg_schema_to_table_schema(schema: &::iceberg::spec::Schema) -> Result { - Ok(TableSchema { +fn iceberg_schema_to_table_schema(schema: &::iceberg::spec::Schema) -> TableSchema { + TableSchema { schema_id: schema.schema_id(), fields: schema .as_struct() .fields() .iter() - .map(|field| { - let value = serde_json::to_value(&field.field_type).map_err(|e| { - Error::Iceberg(IcebergError::SchemaEvolution(format!( - "failed to serialize Iceberg type for field {}: {}", - field.name, e - ))) - })?; - let field_type = match value { - serde_json::Value::String(value) => value, - value => value.to_string(), - }; - Ok(SchemaFieldInfo { - id: field.id, - name: field.name.clone(), - field_type, - required: field.required, - doc: field.doc.clone(), - }) + .map(|field| SchemaFieldInfo { + id: field.id, + name: field.name.clone(), + field_type: iceberg_type_to_json_string(&field.field_type), + required: field.required, + doc: field.doc.clone(), }) - .collect::>>()?, - }) + .collect(), + } } /// Build a `TableInfo` from an official Iceberg `Table`. -fn table_info_from( - namespace: &str, - table: &str, - table_ref: &::iceberg::table::Table, -) -> Result { +fn table_info_from(namespace: &str, table: &str, table_ref: &::iceberg::table::Table) -> TableInfo { let metadata = table_ref.metadata(); - let schema = iceberg_schema_to_table_schema(metadata.current_schema())?; - Ok(TableInfo { + let schema = iceberg_schema_to_table_schema(metadata.current_schema()); + TableInfo { namespace: namespace.to_string(), name: table.to_string(), location: metadata.location().to_string(), current_snapshot_id: metadata.current_snapshot_id(), schema, properties: metadata.properties().clone(), - }) + } } /// Commit existing Parquet files with any official Iceberg catalog. @@ -904,30 +548,6 @@ pub async fn commit_append_with_catalog( namespace: &str, table: &str, files: Vec, - summary: HashMap, -) -> Result { - commit_append_with_catalog_at_snapshot( - catalog, - warehouse_path, - namespace, - table, - None, - files, - summary, - ) - .await -} - -/// Commit an append while enforcing the caller's expected snapshot before -/// constructing the official Iceberg transaction. The transaction adds a -/// second CAS boundary between the loaded metadata and the REST commit. -async fn commit_append_with_catalog_at_snapshot( - catalog: &dyn ::iceberg::Catalog, - warehouse_path: &str, - namespace: &str, - table: &str, - expected_snapshot_id: Option, - files: Vec, mut summary: HashMap, ) -> Result { use ::iceberg::transaction::{ApplyTransactionAction, Transaction}; @@ -952,15 +572,6 @@ async fn commit_append_with_catalog_at_snapshot( .load_table(&ident) .await .map_err(map_iceberg_error)?; - if let Some(expected) = expected_snapshot_id { - let actual = loaded.metadata().current_snapshot_id(); - if actual != Some(expected) { - return Err(Error::Iceberg(IcebergError::CasConflict { - expected, - actual: actual.unwrap_or(-1), - })); - } - } let spec_id = loaded.metadata().default_partition_spec_id(); let data_files = files .iter() @@ -1220,10 +831,6 @@ mod tests { use super::*; use ::iceberg::memory::{MemoryCatalogBuilder, MEMORY_CATALOG_WAREHOUSE}; use ::iceberg::{Catalog, CatalogBuilder, NamespaceIdent, TableCreation}; - use axum::http::HeaderMap as AxumHeaderMap; - use axum::routing::get; - use axum::{Json, Router}; - use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; fn simple_schema() -> TableSchema { TableSchema { @@ -1260,6 +867,44 @@ rest_uri = {rest_uri:?} .unwrap() } + #[tokio::test] + async fn rejects_removals_and_keeps_manifest_cache_bounded() { + let committer = OfficialRestCommitter::new(&rest_config("http://127.0.0.1:1")) + .await + .unwrap(); + + for snapshot_id in 0..=RECENT_MANIFEST_LIST_LIMIT as i64 { + committer.remember_manifest_list(&OfficialCommitResult { + snapshot_id, + manifest_list_path: format!("metadata/snap-{snapshot_id}.avro"), + }); + } + assert_eq!(committer.manifest_list_path_for_snapshot(0), None); + assert_eq!( + committer.manifest_list_path_for_snapshot(RECENT_MANIFEST_LIST_LIMIT as i64), + Some(format!("metadata/snap-{}.avro", RECENT_MANIFEST_LIST_LIMIT)) + ); + + let error = committer + .commit_snapshot( + "analytics", + "events", + SnapshotCommit { + expected_snapshot_id: None, + files_to_add: vec![], + files_to_remove: vec!["data/old.parquet".into()], + summary: HashMap::new(), + }, + ) + .await + .unwrap_err(); + assert!(matches!( + error, + Error::Iceberg(IcebergError::SnapshotCommit(message)) + if message.contains("refusing to ignore 1 requested removals") + )); + } + #[test] fn warehouse_uri_converts_local_path() { assert_eq!(warehouse_uri("/tmp/k2i-wh").unwrap(), "file:///tmp/k2i-wh"); @@ -1359,30 +1004,6 @@ rest_uri = {rest_uri:?} let round_tripped: ::iceberg::spec::Summary = serde_json::from_str(&json).expect("snapshot summary should round-trip as JSON"); assert_eq!(round_tripped.operation, ::iceberg::spec::Operation::Append); - - let stale_snapshot_id = result.snapshot_id.saturating_add(1); - let error = commit_append_with_catalog_at_snapshot( - &catalog, - temp.path().to_str().unwrap(), - "f1", - "derived_state", - Some(stale_snapshot_id), - vec![DataFileInfo { - file_path: "data/f1/derived_state/part-2.parquet".into(), - file_size_bytes: 64, - record_count: 1, - partition_values: HashMap::new(), - file_format: "parquet".into(), - }], - HashMap::new(), - ) - .await - .unwrap_err(); - assert!(matches!( - error, - Error::Iceberg(IcebergError::CasConflict { expected, actual }) - if expected == stale_snapshot_id && actual == result.snapshot_id - )); } #[test] @@ -1401,303 +1022,359 @@ rest_uri = {rest_uri:?} fn test_iceberg_schema_to_table_schema_roundtrip() { let original = simple_schema(); let official = table_schema_to_iceberg_schema(&original).unwrap(); - let back = iceberg_schema_to_table_schema(&official).unwrap(); + let back = iceberg_schema_to_table_schema(&official); assert_eq!(back.schema_id, original.schema_id); assert_eq!(back.fields.len(), original.fields.len()); assert_eq!(back.fields[0].name, original.fields[0].name); assert_eq!(back.fields[0].field_type, original.fields[0].field_type); } - #[test] - fn test_complex_iceberg_types_roundtrip_as_canonical_json() { - let original = TableSchema { - schema_id: 1, - fields: vec![ - SchemaFieldInfo { - id: 1, - name: "telemetry".into(), - field_type: serde_json::json!({ - "type": "struct", - "fields": [ - { - "id": 2, - "name": "speed", - "required": false, - "type": "double" - }, - { - "id": 3, - "name": "gear", - "required": false, - "type": "int" - } - ] - }) - .to_string(), - required: false, - doc: None, - }, - SchemaFieldInfo { - id: 4, - name: "samples".into(), - field_type: serde_json::json!({ - "type": "list", - "element-id": 5, - "element-required": false, - "element": "double" - }) - .to_string(), - required: false, - doc: None, - }, - SchemaFieldInfo { - id: 6, - name: "counters".into(), - field_type: serde_json::json!({ - "type": "map", - "key-id": 7, - "key": "string", - "value-id": 8, - "value-required": false, - "value": "int" - }) - .to_string(), - required: false, - doc: None, - }, - ], - }; + // ---- iceberg_type_to_json_string unit tests ---- - let official = table_schema_to_iceberg_schema(&original).unwrap(); - let round_tripped = iceberg_schema_to_table_schema(&official).unwrap(); - assert_eq!(round_tripped, original); - } + #[test] + fn iceberg_type_to_json_all_primitives() { + use ::iceberg::spec::{PrimitiveType, Type}; + + let cases = vec![ + (Type::Primitive(PrimitiveType::Boolean), "boolean"), + (Type::Primitive(PrimitiveType::Int), "int"), + (Type::Primitive(PrimitiveType::Long), "long"), + (Type::Primitive(PrimitiveType::Float), "float"), + (Type::Primitive(PrimitiveType::Double), "double"), + (Type::Primitive(PrimitiveType::Date), "date"), + (Type::Primitive(PrimitiveType::Time), "time"), + (Type::Primitive(PrimitiveType::Timestamp), "timestamp"), + (Type::Primitive(PrimitiveType::Timestamptz), "timestamptz"), + (Type::Primitive(PrimitiveType::TimestampNs), "timestamp_ns"), + ( + Type::Primitive(PrimitiveType::TimestamptzNs), + "timestamptz_ns", + ), + (Type::Primitive(PrimitiveType::String), "string"), + (Type::Primitive(PrimitiveType::Uuid), "uuid"), + (Type::Primitive(PrimitiveType::Binary), "binary"), + (Type::Primitive(PrimitiveType::Fixed(16)), "fixed[16]"), + ( + Type::Primitive(PrimitiveType::Decimal { + precision: 10, + scale: 2, + }), + "decimal(10,2)", + ), + ]; - fn catalog_config( - defaults: &[(&str, &str)], - overrides: &[(&str, &str)], - ) -> rest_api::CatalogConfig { - rest_api::CatalogConfig { - defaults: defaults - .iter() - .map(|(k, v)| (k.to_string(), v.to_string())) - .collect(), - overrides: overrides - .iter() - .map(|(k, v)| (k.to_string(), v.to_string())) - .collect(), + for (ty, expected) in cases { + assert_eq!( + iceberg_type_to_json_string(&ty), + expected, + "mismatch for {:?}", + ty + ); } } #[test] - fn test_extract_prefix_from_overrides() { - let config = catalog_config(&[], &[("prefix", "ws-a")]); - assert_eq!(extract_prefix(&config), Some("ws-a".to_string())); + fn iceberg_type_to_json_struct_produces_json_object() { + use ::iceberg::spec::{NestedField, PrimitiveType, StructType, Type}; + use std::sync::Arc; + + let struct_type = Type::Struct(StructType::new(vec![ + Arc::new(NestedField::required( + 1, + "speed", + Type::Primitive(PrimitiveType::Double), + )), + Arc::new(NestedField::optional( + 2, + "unit", + Type::Primitive(PrimitiveType::String), + )), + ])); + + let json_str = iceberg_type_to_json_string(&struct_type); + + // Must produce valid JSON, not the Display format "struct<...>" + let parsed: serde_json::Value = + serde_json::from_str(&json_str).expect("must be valid JSON"); + assert_eq!(parsed["type"], "struct"); + assert!(parsed["fields"].is_array()); + let fields = parsed["fields"].as_array().unwrap(); + assert_eq!(fields.len(), 2); + assert_eq!(fields[0]["name"], "speed"); + assert_eq!(fields[0]["type"], "double"); + assert_eq!(fields[1]["name"], "unit"); + assert_eq!(fields[1]["type"], "string"); } #[test] - fn test_extract_prefix_from_defaults() { - let config = catalog_config(&[("prefix", "ws-default")], &[]); - assert_eq!(extract_prefix(&config), Some("ws-default".to_string())); - } + fn iceberg_type_to_json_list_produces_json_object() { + use ::iceberg::spec::{ListType, NestedField, PrimitiveType, Type}; + use std::sync::Arc; - #[test] - fn test_extract_prefix_overrides_win_over_defaults() { - let config = catalog_config(&[("prefix", "ws-default")], &[("prefix", "ws-override")]); - assert_eq!(extract_prefix(&config), Some("ws-override".to_string())); - } + let list_type = Type::List(ListType::new(Arc::new(NestedField::list_element( + 1, + Type::Primitive(PrimitiveType::String), + false, + )))); - #[test] - fn test_extract_prefix_absent_is_none() { - let config = catalog_config(&[], &[]); - assert_eq!(extract_prefix(&config), None); + let json_str = iceberg_type_to_json_string(&list_type); + + let parsed: serde_json::Value = + serde_json::from_str(&json_str).expect("must be valid JSON"); + assert_eq!(parsed["type"], "list"); + assert_eq!(parsed["element"], "string"); + assert_eq!(parsed["element-required"], false); } #[test] - fn test_extract_uri_only_accepts_runtime_override() { - let default_only = catalog_config(&[("uri", "http://default")], &[]); - assert_eq!(extract_uri(&default_only), None); + fn iceberg_type_to_json_map_produces_json_object() { + use ::iceberg::spec::{MapType, PrimitiveType, Type}; + + let map_type = Type::Map(MapType::optional( + 1, + Type::Primitive(PrimitiveType::String), + 2, + Type::Primitive(PrimitiveType::Long), + )); - let overridden = catalog_config(&[], &[("uri", "http://override")]); - assert_eq!(extract_uri(&overridden), Some("http://override".into())); - } + let json_str = iceberg_type_to_json_string(&map_type); - #[test] - fn test_build_update_schema_url_with_prefix() { - let url = - build_update_schema_url("http://catalog:8181", Some("ws-a"), "analytics", "events") - .unwrap(); - assert_eq!( - url, - "http://catalog:8181/v1/ws-a/namespaces/analytics/tables/events" - ); + let parsed: serde_json::Value = + serde_json::from_str(&json_str).expect("must be valid JSON"); + assert_eq!(parsed["type"], "map"); + assert_eq!(parsed["key"], "string"); + assert_eq!(parsed["value"], "long"); + assert_eq!(parsed["value-required"], false); } #[test] - fn test_build_update_schema_url_without_prefix() { - let url = - build_update_schema_url("http://catalog:8181", None, "analytics", "events").unwrap(); - assert_eq!( - url, - "http://catalog:8181/v1/namespaces/analytics/tables/events" - ); + fn iceberg_type_to_json_nested_struct_in_list() { + use ::iceberg::spec::{ListType, NestedField, PrimitiveType, StructType, Type}; + use std::sync::Arc; + + let inner_struct = Type::Struct(StructType::new(vec![ + Arc::new(NestedField::required( + 10, + "x", + Type::Primitive(PrimitiveType::Double), + )), + Arc::new(NestedField::required( + 11, + "y", + Type::Primitive(PrimitiveType::Double), + )), + ])); + let list_of_structs = Type::List(ListType::new(Arc::new(NestedField::list_element( + 5, + inner_struct, + true, + )))); + + let json_str = iceberg_type_to_json_string(&list_of_structs); + let parsed: serde_json::Value = + serde_json::from_str(&json_str).expect("must be valid JSON"); + + assert_eq!(parsed["type"], "list"); + assert_eq!(parsed["element"]["type"], "struct"); + let element_fields = parsed["element"]["fields"] + .as_array() + .expect("struct fields must be an array"); + assert_eq!(element_fields.len(), 2); + assert_eq!(element_fields[0]["name"], "x"); + assert_eq!(element_fields[1]["name"], "y"); } #[test] - fn test_build_update_schema_url_encodes_namespace_and_table() { - // The prefix is inserted verbatim (already URL-safe as returned by the - // catalog); only the namespace and table components are encoded. - let url = build_update_schema_url("http://catalog:8181", Some("ws-a"), "my ns", "my table") - .unwrap(); - assert_eq!( - url, - "http://catalog:8181/v1/ws-a/namespaces/my%20ns/tables/my%20table" + fn iceberg_type_to_json_not_display_format() { + // Regression test: the old Display impl produced "struct" + // which parse_iceberg_type could not parse back. The new function must + // produce valid JSON for nested types. + use ::iceberg::spec::{NestedField, PrimitiveType, StructType, Type}; + use std::sync::Arc; + + let struct_type = Type::Struct(StructType::new(vec![Arc::new(NestedField::required( + 1, + "field1", + Type::Primitive(PrimitiveType::String), + ))])); + + let result = iceberg_type_to_json_string(&struct_type); + assert!( + result.starts_with('{'), + "nested types must produce JSON, not Display format" + ); + assert!( + !result.contains('<'), + "must not contain angle brackets from Display format" ); } #[test] - fn test_build_update_schema_url_uses_rest_namespace_separator() { - let url = build_update_schema_url( - "http://catalog:8181/", - Some("ws-a"), - "org.analytics", - "events", - ) - .unwrap(); - assert_eq!( - url, - "http://catalog:8181/v1/ws-a/namespaces/org%1Fanalytics/tables/events" - ); + fn iceberg_type_to_json_roundtrip_via_parse() { + // The output of iceberg_type_to_json_string must be parseable by + // parse_iceberg_type for all nested types. + use ::iceberg::spec::{ListType, MapType, NestedField, PrimitiveType, StructType, Type}; + use std::sync::Arc; + + let struct_type = Type::Struct(StructType::new(vec![ + Arc::new(NestedField::required( + 1, + "a", + Type::Primitive(PrimitiveType::Long), + )), + Arc::new(NestedField::optional( + 2, + "b", + Type::Primitive(PrimitiveType::String), + )), + ])); + let list_type = Type::List(ListType::new(Arc::new(NestedField::list_element( + 3, + Type::Primitive(PrimitiveType::Double), + false, + )))); + let map_type = Type::Map(MapType::optional( + 4, + Type::Primitive(PrimitiveType::String), + 5, + Type::Primitive(PrimitiveType::Long), + )); + + let fixed_type = Type::Primitive(PrimitiveType::Fixed(16)); + let decimal_type = Type::Primitive(PrimitiveType::Decimal { + precision: 10, + scale: 2, + }); + + for ty in [struct_type, list_type, map_type, fixed_type, decimal_type] { + let json_str = iceberg_type_to_json_string(&ty); + let parsed = parse_iceberg_type(&json_str) + .expect("iceberg_type_to_json_string output must be parseable"); + assert_eq!(parsed, ty, "round-trip failed for {:?}", ty); + } } #[test] - fn test_oauth2_token_url_respects_complete_override() { - assert_eq!( - oauth2_token_url("http://catalog:8181/", None), - "http://catalog:8181/v1/oauth/tokens" + fn iceberg_schema_to_table_schema_with_nested_types() { + // Build an iceberg Schema containing a struct field and a list field, + // then verify the conversion to TableSchema preserves the nested types + // in JSON format. + use ::iceberg::spec::{ListType, NestedField, PrimitiveType, Schema, StructType, Type}; + use std::sync::Arc; + + let struct_field = NestedField::optional( + 2, + "telemetry", + Type::Struct(StructType::new(vec![ + Arc::new(NestedField::required( + 10, + "speed", + Type::Primitive(PrimitiveType::Double), + )), + Arc::new(NestedField::optional( + 11, + "gear", + Type::Primitive(PrimitiveType::Int), + )), + ])), ); - assert_eq!( - oauth2_token_url( - "http://catalog:8181", - Some("https://identity.example.test/oauth/token") - ), - "https://identity.example.test/oauth/token" + let list_field = NestedField::optional( + 3, + "tags", + Type::List(ListType::new(Arc::new(NestedField::list_element( + 20, + Type::Primitive(PrimitiveType::String), + false, + )))), ); - } - #[test] - fn test_custom_header_map_rejects_invalid_names() { - let error = custom_header_map(&HashMap::from([( - "not a header".to_string(), - "value".to_string(), - )])) - .unwrap_err(); - assert!(matches!(error, Error::Config(_))); - } - - #[tokio::test] - async fn resolves_runtime_route_once_for_concurrent_callers() { - let calls = Arc::new(AtomicUsize::new(0)); - let saw_custom_header = Arc::new(AtomicBool::new(false)); - let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); - let address = listener.local_addr().unwrap(); - let runtime_uri = format!("http://{address}/runtime"); - - let app = Router::new().route( - "/v1/config", - get({ - let calls = calls.clone(); - let saw_custom_header = saw_custom_header.clone(); - let runtime_uri = runtime_uri.clone(); - move |headers: AxumHeaderMap| { - let calls = calls.clone(); - let saw_custom_header = saw_custom_header.clone(); - let runtime_uri = runtime_uri.clone(); - async move { - calls.fetch_add(1, Ordering::SeqCst); - if headers - .get("x-k2i-test") - .and_then(|value| value.to_str().ok()) - == Some("route") - { - saw_custom_header.store(true, Ordering::SeqCst); - } - tokio::time::sleep(Duration::from_millis(25)).await; - Json(serde_json::json!({ - "defaults": {}, - "overrides": { - "prefix": "warehouse-a", - "uri": runtime_uri, - } - })) - } - } - }), - ); - let server = tokio::spawn(async move { - axum::serve(listener, app).await.unwrap(); - }); + let iceberg_schema = Schema::builder() + .with_schema_id(5) + .with_fields(vec![ + Arc::new(NestedField::required( + 1, + "id", + Type::Primitive(PrimitiveType::Long), + )), + Arc::new(struct_field), + Arc::new(list_field), + ]) + .build() + .unwrap(); - let mut config = rest_config(&format!("http://{address}")); - config - .rest - .custom_headers - .insert("x-k2i-test".into(), "route".into()); - let committer = OfficialRestCommitter::new(&config).await.unwrap(); - - let (first, second, third) = tokio::join!( - committer.do_resolve_route(), - committer.do_resolve_route(), - committer.do_resolve_route() - ); - let expected = ResolvedRestRoute { - base_uri: runtime_uri, - prefix: Some("warehouse-a".into()), - }; - assert_eq!(first.unwrap(), expected); - assert_eq!(second.unwrap(), expected); - assert_eq!(third.unwrap(), expected); - assert_eq!(calls.load(Ordering::SeqCst), 1); - assert!(saw_custom_header.load(Ordering::SeqCst)); + let table_schema = iceberg_schema_to_table_schema(&iceberg_schema); - server.abort(); - } + assert_eq!(table_schema.schema_id, 5); + assert_eq!(table_schema.fields.len(), 3); - #[tokio::test] - async fn rejects_removals_and_keeps_manifest_cache_bounded() { - let committer = OfficialRestCommitter::new(&rest_config("http://127.0.0.1:1")) - .await - .unwrap(); + // Primitive field + assert_eq!(table_schema.fields[0].name, "id"); + assert_eq!(table_schema.fields[0].field_type, "long"); - for snapshot_id in 0..=RECENT_MANIFEST_LIST_LIMIT as i64 { - committer.remember_manifest_list(&OfficialCommitResult { - snapshot_id, - manifest_list_path: format!("metadata/snap-{snapshot_id}.avro"), - }); - } - assert_eq!(committer.manifest_list_path_for_snapshot(0), None); - assert_eq!( - committer.manifest_list_path_for_snapshot(RECENT_MANIFEST_LIST_LIMIT as i64), - Some(format!("metadata/snap-{}.avro", RECENT_MANIFEST_LIST_LIMIT)) + // Struct field must be JSON, not Display format + let telemetry = &table_schema.fields[1]; + assert_eq!(telemetry.name, "telemetry"); + assert!( + telemetry.field_type.starts_with('{'), + "struct field must be JSON" ); + let telemetry_json: serde_json::Value = + serde_json::from_str(&telemetry.field_type).unwrap(); + assert_eq!(telemetry_json["type"], "struct"); + let fields = telemetry_json["fields"].as_array().unwrap(); + assert_eq!(fields.len(), 2); + assert_eq!(fields[0]["name"], "speed"); + assert_eq!(fields[0]["type"], "double"); + assert_eq!(fields[1]["name"], "gear"); + assert_eq!(fields[1]["type"], "int"); + + // List field must be JSON + let tags = &table_schema.fields[2]; + assert_eq!(tags.name, "tags"); + assert!(tags.field_type.starts_with('{'), "list field must be JSON"); + let tags_json: serde_json::Value = serde_json::from_str(&tags.field_type).unwrap(); + assert_eq!(tags_json["type"], "list"); + assert_eq!(tags_json["element"], "string"); + } - let error = committer - .commit_snapshot( - "analytics", - "events", - SnapshotCommit { - expected_snapshot_id: None, - files_to_add: vec![], - files_to_remove: vec!["data/old.parquet".into()], - summary: HashMap::new(), - }, - ) - .await - .unwrap_err(); - assert!(matches!( - error, - Error::Iceberg(IcebergError::SnapshotCommit(message)) - if message.contains("refusing to ignore 1 requested removals") - )); + #[test] + fn schema_roundtrip_with_nested_types() { + // Full round-trip: TableSchema (with nested JSON types) -> iceberg Schema + // -> TableSchema. The nested type strings must survive the round-trip. + let schema_with_nested = TableSchema { +schema_id: 3, +fields: vec![ +SchemaFieldInfo { +id: 1, +name: "id".into(), +field_type: "long".into(), +required: true, +doc: None, +}, +SchemaFieldInfo { +id: 2, +name: "telemetry".into(), +field_type: r#"{"type":"struct","fields":[{"id":10,"name":"speed","required":false,"type":"double"},{"id":11,"name":"gear","required":false,"type":"int"}]}"#.into(), +required: false, +doc: None, +}, +], + }; + + let iceberg_schema = table_schema_to_iceberg_schema(&schema_with_nested).unwrap(); + let back = iceberg_schema_to_table_schema(&iceberg_schema); + + assert_eq!(back.schema_id, schema_with_nested.schema_id); + assert_eq!(back.fields.len(), 2); + assert_eq!(back.fields[0].field_type, "long"); + + // The nested struct JSON must round-trip + let telemetry: serde_json::Value = + serde_json::from_str(&back.fields[1].field_type).unwrap(); + assert_eq!(telemetry["type"], "struct"); + let fields = telemetry["fields"].as_array().unwrap(); + assert_eq!(fields.len(), 2); + assert_eq!(fields[0]["name"], "speed"); + assert_eq!(fields[0]["type"], "double"); } } diff --git a/crates/k2i-core/src/iceberg/writer.rs b/crates/k2i-core/src/iceberg/writer.rs index 8c204fc..fb019e5 100644 --- a/crates/k2i-core/src/iceberg/writer.rs +++ b/crates/k2i-core/src/iceberg/writer.rs @@ -503,7 +503,7 @@ impl IcebergWriter { let props = WriterProperties::builder() .set_compression(compression) - .set_max_row_group_size(128 * 1024) // 128K rows per row group + .set_max_row_group_row_count(Some(128 * 1024)) // 128K rows per row group .set_write_batch_size(1024) .build(); diff --git a/docs/deployment.md b/docs/deployment.md index 3b5037e..13d2e9d 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -20,7 +20,7 @@ Avoid deploying multiple active K2I writers to the same table until conflict, re ## Deployment Options | Option | Use Case | Complexity | -|--------|----------|------------| +| -------- | ---------- | ------------ | | Binary | Single server, VMs | Low | | Docker | Containers, local dev | Low | | Kubernetes | Production, scaling | Medium | @@ -77,7 +77,7 @@ after pushing, and confirms both platforms are present in the manifest list. ```dockerfile # Build stage -FROM rust:1.75-bookworm AS builder +FROM rust:1-bookworm AS builder WORKDIR /build @@ -676,7 +676,7 @@ AWS IAM policy for K2I: ### Memory Requirements | Workload | Buffer Size | Total Memory | -|----------|-------------|--------------| +| ---------- | ------------- | -------------- | | Light (< 1K msg/s) | 100 MB | 512 MB | | Medium (1-10K msg/s) | 500 MB | 2 GB | | Heavy (10-100K msg/s) | 2 GB | 4 GB | @@ -685,7 +685,7 @@ AWS IAM policy for K2I: ### CPU Requirements | Workload | CPU Cores | -|----------|-----------| +| ---------- | ----------- | | Light | 0.5 | | Medium | 1 | | Heavy | 2 | diff --git a/docs/quickstart.md b/docs/quickstart.md index 8f2c372..d409ff3 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -7,7 +7,7 @@ This quickstart gives you two paths: ## Prerequisites -- Rust 1.85+ for building from source. +- Rust 1.94+ for building from source. - Docker and Docker Compose for local E2E validation. - Access to Kafka and an Iceberg-compatible catalog for manual runs. diff --git a/scripts/security-audit.sh b/scripts/security-audit.sh index 28f8c32..2c4baa4 100755 --- a/scripts/security-audit.sh +++ b/scripts/security-audit.sh @@ -5,8 +5,8 @@ set -euo pipefail # unmaintained dependency, unsound dependency, or yanked crate. # # Runtime exceptions pinned by current upstream dependency ranges: -# - iceberg 0.7, object_store 0.11, and the AWS SDK pin the affected XML and -# legacy webpki versions. K2I parses responses only from explicitly +# - The current iceberg, object_store, and AWS SDK dependency graph pins the +# affected XML and legacy webpki versions. K2I parses responses only from explicitly # configured storage services, does not configure CRLs, and still verifies # TLS certificates (RUSTSEC-2026-0194, -0195, -0098, -0099, and -0104). # - SQLx's target-specific MySQL graph includes rsa, but K2I enables SQLite and