diff --git a/Cargo.lock b/Cargo.lock index 6c6da7cb6..f9e970723 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -108,7 +108,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -119,7 +119,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -184,9 +184,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "arrow" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d441fdda254b65f3e9025910eb2c2066b6295d9c8ed409522b8d2ace1ff8574c" +checksum = "378530e55cd479eda3c14eb345310799717e6f76d0c332041e8487022166b471" dependencies = [ "arrow-arith", "arrow-array", @@ -206,9 +206,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced5406f8b720cc0bc3aa9cf5758f93e8593cda5490677aa194e4b4b383f9a59" +checksum = "a0ab212d2c1886e802f51c5212d78ebbcbb0bec980fff9dadc1eb8d45cd0b738" dependencies = [ "arrow-array", "arrow-buffer", @@ -220,9 +220,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772bd34cacdda8baec9418d80d23d0fb4d50ef0735685bd45158b83dfeb6e62d" +checksum = "cfd33d3e92f207444098c75b42de99d329562be0cf686b307b097cc52b4e999e" dependencies = [ "ahash", "arrow-buffer", @@ -231,7 +231,7 @@ dependencies = [ "chrono", "chrono-tz 0.10.4", "half", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "num-complex", "num-integer", "num-traits", @@ -239,9 +239,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "898f4cf1e9598fdb77f356fdf2134feedfd0ee8d5a4e0a5f573e7d0aec16baa4" +checksum = "0c6cd424c2693bcdbc150d843dc9d4d137dd2de4782ce6df491ad11a3a0416c0" dependencies = [ "bytes", "half", @@ -251,9 +251,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0127816c96533d20fc938729f48c52d3e48f99717e7a0b5ade77d742510736d" +checksum = "4c5aefb56a2c02e9e2b30746241058b85f8983f0fcff2ba0c6d09006e1cded7f" dependencies = [ "arrow-array", "arrow-buffer", @@ -273,9 +273,9 @@ dependencies = [ [[package]] name = "arrow-csv" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca025bd0f38eeecb57c2153c0123b960494138e6a957bbda10da2b25415209fe" +checksum = "e94e8cf7e517657a52b91ea1263acf38c4ca62a84655d72458a3359b12ab97de" dependencies = [ "arrow-array", "arrow-cast", @@ -288,9 +288,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d10beeab2b1c3bb0b53a00f7c944a178b622173a5c7bcabc3cb45d90238df4" +checksum = "3c88210023a2bfee1896af366309a3028fc3bcbd6515fa29a7990ee1baa08ee0" dependencies = [ "arrow-buffer", "arrow-schema", @@ -301,9 +301,9 @@ dependencies = [ [[package]] name = "arrow-ipc" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609a441080e338147a84e8e6904b6da482cefb957c5cdc0f3398872f69a315d0" +checksum = "238438f0834483703d88896db6fe5a7138b2230debc31b34c0336c2996e3c64f" dependencies = [ "arrow-array", "arrow-buffer", @@ -317,18 +317,19 @@ dependencies = [ [[package]] name = "arrow-json" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ead0914e4861a531be48fe05858265cf854a4880b9ed12618b1d08cba9bebc8" +checksum = "205ca2119e6d679d5c133c6f30e68f027738d95ed948cf77677ea69c7800036b" dependencies = [ "arrow-array", "arrow-buffer", "arrow-cast", - "arrow-data", + "arrow-ord", "arrow-schema", + "arrow-select", "chrono", "half", - "indexmap 2.13.0", + "indexmap 2.14.0", "itoa", "lexical-core", "memchr", @@ -341,9 +342,9 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763a7ba279b20b52dad300e68cfc37c17efa65e68623169076855b3a9e941ca5" +checksum = "1bffd8fd2579286a5d63bac898159873e5094a79009940bcb42bbfce4f19f1d0" dependencies = [ "arrow-array", "arrow-buffer", @@ -354,9 +355,9 @@ dependencies = [ [[package]] name = "arrow-pyarrow" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63351dc11981a316c828a6032a5021345bba882f68bc4a36c36825a50725089" +checksum = "d29abdf672a81c1aeb57fd2661457f9918964d49aed0e9f18932535f2a9e49ce" dependencies = [ "arrow-array", "arrow-data", @@ -366,9 +367,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14fe367802f16d7668163ff647830258e6e0aeea9a4d79aaedf273af3bdcd3e" +checksum = "bab5994731204603c73ba69267616c50f80780774c6bb0476f1f830625115e0c" dependencies = [ "arrow-array", "arrow-buffer", @@ -379,20 +380,20 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c30a1365d7a7dc50cc847e54154e6af49e4c4b0fddc9f607b687f29212082743" +checksum = "f633dbfdf39c039ada1bf9e34c694816eb71fbb7dc78f613993b7245e078a1ed" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "serde_core", "serde_json", ] [[package]] name = "arrow-select" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78694888660a9e8ac949853db393af2a8b8fc82c19ce333132dfa2e72cc1a7fe" +checksum = "8cd065c54172ac787cf3f2f8d4107e0d3fdc26edba76fdf4f4cc170258942222" dependencies = [ "ahash", "arrow-array", @@ -404,9 +405,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "58.1.0" +version = "58.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e04a01f8bb73ce54437514c5fd3ee2aa3e8abe4c777ee5cc55853b1652f79e" +checksum = "29dd7cda3ab9692f43a2e4acc444d760cc17b12bb6d8232ddf64e9bab7c06b42" dependencies = [ "arrow-array", "arrow-buffer", @@ -433,9 +434,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" dependencies = [ "compression-codecs", "compression-core", @@ -475,7 +476,7 @@ dependencies = [ "bytes", "derive_builder", "futures", - "rand 0.8.5", + "rand 0.8.6", "reqwest 0.12.28", "reqwest-eventsource", "secrecy", @@ -548,9 +549,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.8" +version = "1.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37cf2b6af2a95a20e266782b4f76f1a5e12bf412a9db2de9c1e9123b9d8c0ad8" +checksum = "50f156acdd2cf55f5aa53ee416c4ac851cf1222694506c0b1f78c85695e9ca9d" dependencies = [ "aws-credential-types", "aws-runtime", @@ -558,7 +559,7 @@ dependencies = [ "aws-sdk-ssooidc", "aws-sdk-sts", "aws-smithy-async", - "aws-smithy-http 0.62.6", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -568,7 +569,7 @@ dependencies = [ "fastrand", "hex", "http 1.4.0", - "ring", + "sha1 0.10.6", "time", "tokio", "tracing", @@ -578,9 +579,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.12" +version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e26bbf46abc608f2dc61fd6cb3b7b0665497cc259a21520151ed98f8b37d2c79" +checksum = "8f20799b373a1be121fe3005fba0c2090af9411573878f224df44b42727fcaf7" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -613,15 +614,15 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.7.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f92058d22a46adf53ec57a6a96f34447daf02bff52e8fb956c66bcd5c6ac12" +checksum = "5dcd93c82209ac7413532388067dce79be5a8780c1786e5fae3df22e4dee2864" dependencies = [ "aws-credential-types", "aws-sigv4", "aws-smithy-async", "aws-smithy-eventstream", - "aws-smithy-http 0.63.4", + "aws-smithy-http", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -641,17 +642,18 @@ dependencies = [ [[package]] name = "aws-sdk-bedrockruntime" -version = "1.113.0" +version = "1.130.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d2b8f081b9e8ff455b8dd7387b6b02263c3dac73172d188d2b523ff1e775e9" +checksum = "3e2f7bca252e3c5c8f0ed12c5501bf8b0fbadb937cd9fdd71a0ebd9d7526540f" dependencies = [ "aws-credential-types", "aws-runtime", "aws-sigv4", "aws-smithy-async", "aws-smithy-eventstream", - "aws-smithy-http 0.62.6", + "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -659,22 +661,24 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "hyper 0.14.32", + "http 1.4.0", + "http-body-util", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-dynamodb" -version = "1.96.0" +version = "1.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2e1f3871da847c7ff682ddd2c2b802fa10a562db34eaf16dd863fc2d3f72ad6" +checksum = "fc418346e3cb248c7d59e642acbcb06488b7c7cd2ba6ebc79e8003f618c60099" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.62.6", + "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -682,21 +686,23 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", + "http 1.4.0", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-kms" -version = "1.91.0" +version = "1.106.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30662f9c5a2be685ee921f92d5ad88d5bc6ac971e8c0e49c5907bd52b2b069df" +checksum = "2336350f96efcf9c2552b7fdb4dd07a0c1fef11f22b28fb020a9e33e7925cf9d" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.62.6", + "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -704,15 +710,16 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", + "http 1.4.0", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-s3" -version = "1.109.0" +version = "1.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6d81b75f8ff78882e70c5909804b44553d56136899fb4015a0a68ecc870e0e" +checksum = "5575840a3a6b11f6011463ebe359320dfe5b67babb5e9b06fed6ddf809a9ab40" dependencies = [ "aws-credential-types", "aws-runtime", @@ -720,8 +727,9 @@ dependencies = [ "aws-smithy-async", "aws-smithy-checksums", "aws-smithy-eventstream", - "aws-smithy-http 0.62.6", + "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -730,29 +738,30 @@ dependencies = [ "bytes", "fastrand", "hex", - "hmac", + "hmac 0.13.0", "http 0.2.12", "http 1.4.0", - "http-body 0.4.6", + "http-body 1.0.1", "lru", "percent-encoding", "regex-lite", - "sha2", + "sha2 0.11.0", "tracing", "url", ] [[package]] name = "aws-sdk-sso" -version = "1.87.0" +version = "1.98.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4af747ffcb5aa8da8be8f0679ef6940f1afdb8c2e10c36738c9ebeb8d17b95e" +checksum = "d69c77aafa20460c68b6b3213c84f6423b6e76dbf89accd3e1789a686ffd9489" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.62.6", + "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -760,21 +769,23 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", + "http 1.4.0", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.89.0" +version = "1.100.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695dc67bb861ccb8426c9129b91c30e266a0e3d85650cafdf62fcca14c8fd338" +checksum = "1c7e7b09346d5ca22a2a08267555843a6a0127fb20d8964cb6ecfb8fdb190225" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.62.6", + "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -782,21 +793,23 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", + "http 1.4.0", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.89.0" +version = "1.103.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928e87698cd916cf1efd5268148347269e6d2911028742c0061ff6261e639e3c" +checksum = "c2249b81a2e73a8027c41c378463a81ec39b8510f184f2caab87de912af0f49b" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.62.6", + "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -805,32 +818,33 @@ dependencies = [ "aws-types", "fastrand", "http 0.2.12", + "http 1.4.0", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "1.4.0" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f6ae9b71597dc5fd115d52849d7a5556ad9265885ad3492ea8d73b93bbc46e" +checksum = "68dc0b907359b120170613b5c09ccc61304eac3998ff6274b97d93ee6490115a" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", - "aws-smithy-http 0.63.4", + "aws-smithy-http", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "crypto-bigint 0.5.5", "form_urlencoded", "hex", - "hmac", + "hmac 0.13.0", "http 0.2.12", "http 1.4.0", "p256", "percent-encoding", "ring", - "sha2", + "sha2 0.11.0", "subtle", "time", "tracing", @@ -839,9 +853,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.12" +version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cba48474f1d6807384d06fec085b909f5807e16653c5af5c45dfe89539f0b70" +checksum = "2ffcaf626bdda484571968400c326a244598634dc75fd451325a54ad1a59acfc" dependencies = [ "futures-util", "pin-project-lite", @@ -850,29 +864,30 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.13" +version = "0.64.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23374b9170cbbcc6f5df8dc5ebb9b6c5c28a3c8f599f0e8b8b10eb6f4a5c6e74" +checksum = "10efbbcec1e044b81600e2fc562a391951d291152d95b482d5b7e7132299d762" dependencies = [ - "aws-smithy-http 0.62.6", + "aws-smithy-http", "aws-smithy-types", "bytes", "crc-fast", "hex", - "http 0.2.12", - "http-body 0.4.6", - "md-5", + "http 1.4.0", + "http-body 1.0.1", + "http-body-util", + "md-5 0.11.0", "pin-project-lite", - "sha1", - "sha2", + "sha1 0.11.0", + "sha2 0.11.0", "tracing", ] [[package]] name = "aws-smithy-eventstream" -version = "0.60.19" +version = "0.60.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c0b3e587fbaa5d7f7e870544508af8ce82ea47cd30376e69e1e37c4ac746f79" +checksum = "faf09d74e5e32f76b8762da505a3cd59303e367a664ca67295387baa8c1d7548" dependencies = [ "aws-smithy-types", "bytes", @@ -881,32 +896,11 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.6" +version = "0.63.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826141069295752372f8203c17f28e30c464d22899a43a0c9fd9c458d469c88b" +checksum = "ba1ab2dc1c2c3749ead27180d333c42f11be8b0e934058fb4b2258ee8dbe5231" dependencies = [ "aws-smithy-eventstream", - "aws-smithy-runtime-api", - "aws-smithy-types", - "bytes", - "bytes-utils", - "futures-core", - "futures-util", - "http 0.2.12", - "http 1.4.0", - "http-body 0.4.6", - "percent-encoding", - "pin-project-lite", - "pin-utils", - "tracing", -] - -[[package]] -name = "aws-smithy-http" -version = "0.63.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af4a8a5fe3e4ac7ee871237c340bbce13e982d37543b65700f4419e039f5d78e" -dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", "bytes", @@ -924,26 +918,26 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.10" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0709f0083aa19b704132684bc26d3c868e06bd428ccc4373b0b55c3e8748a58b" +checksum = "6a2f165a7feee6f263028b899d0a181987f4fa7179a6411a32a439fba7c5f769" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", "h2 0.3.27", - "h2 0.4.13", + "h2 0.4.14", "http 0.2.12", "http 1.4.0", "http-body 0.4.6", "hyper 0.14.32", - "hyper 1.8.1", + "hyper 1.9.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.37", + "rustls 0.23.40", "rustls-native-certs", "rustls-pki-types", "tokio", @@ -954,27 +948,27 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.9" +version = "0.62.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fa1213db31ac95288d981476f78d05d9cbb0353d22cdf3472cc05bb02f6551" +checksum = "9648b0bb82a2eedd844052c6ad2a1a822d1f8e3adee5fbf668366717e428856a" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d3f39d5bb871aaf461d59144557f16d5927a5248a983a40654d9cf3b9ba183b" +checksum = "a06c2315d173edbf1920da8ba3a7189695827002e4c0fc961973ab1c54abca9c" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" -version = "0.60.8" +version = "0.60.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" +checksum = "1a56d79744fb3edb5d722ef79d86081e121d3b9422cb209eb03aea6aa4f21ebd" dependencies = [ "aws-smithy-types", "urlencoding", @@ -982,12 +976,12 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.10.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd3dfc18c1ce097cf81fced7192731e63809829c6cbf933c1ec47452d08e1aa" +checksum = "0504b1ab12debb5959e5165ee5fe97dd387e7aa7ea6a477bfd7635dfe769a4f5" dependencies = [ "aws-smithy-async", - "aws-smithy-http 0.63.4", + "aws-smithy-http", "aws-smithy-http-client", "aws-smithy-observability", "aws-smithy-runtime-api", @@ -1007,11 +1001,12 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.11.4" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c55e0837e9b8526f49e0b9bfa9ee18ddee70e853f5bc09c5d11ebceddcb0fec" +checksum = "b71a13df6ada0aafbf21a73bdfcdf9324cfa9df77d96b8446045be3cde61b42e" dependencies = [ "aws-smithy-async", + "aws-smithy-runtime-api-macros", "aws-smithy-types", "bytes", "http 0.2.12", @@ -1023,10 +1018,21 @@ dependencies = [ ] [[package]] -name = "aws-smithy-types" -version = "1.4.4" +name = "aws-smithy-runtime-api-macros" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576b0d6991c9c32bc14fc340582ef148311f924d41815f641a308b5d11e8e7cd" +checksum = "8d7396fd9500589e62e460e987ecb671bad374934e55ec3b5f498cc7a8a8a7b7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "aws-smithy-types" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d73dbfbaa8e4bc57b9045137680b958d274823509a360abfd8e1d514d40c95c" dependencies = [ "base64-simd", "bytes", @@ -1050,18 +1056,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.11" +version = "0.60.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c34127e8c624bc2999f3b657e749c1393bedc9cd97b92a804db8ced4d2e163" +checksum = "0ce02add1aa3677d022f8adf81dcbe3046a95f17a1b1e8979c145cd21d3d22b3" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.12" +version = "1.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c50f3cdf47caa8d01f2be4a6663ea02418e892f9bbfd82c7b9a3a37eaccdd3a" +checksum = "2f4bbcaa9304ea40902d3d5f42a0428d1bd895a2b0f6999436fb279ffddc58ac" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -1084,7 +1090,7 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.9.0", "hyper-util", "itoa", "matchit", @@ -1136,7 +1142,7 @@ dependencies = [ "getrandom 0.2.17", "instant", "pin-project-lite", - "rand 0.8.5", + "rand 0.8.6", "tokio", ] @@ -1247,9 +1253,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "bitpacking" @@ -1278,21 +1284,21 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] name = "blake3" -version = "1.8.3" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if 1.0.4", "constant_time_eq", - "cpufeatures 0.2.17", + "cpufeatures 0.3.0", ] [[package]] @@ -1304,6 +1310,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +dependencies = [ + "hybrid-array", +] + [[package]] name = "block-padding" version = "0.3.3" @@ -1355,6 +1370,15 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + [[package]] name = "bstr" version = "1.12.1" @@ -1483,9 +1507,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.57" +version = "1.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" dependencies = [ "find-msvc-tools", "jobserver", @@ -1583,7 +1607,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common", + "crypto-common 0.1.7", "inout", ] @@ -1629,13 +1653,19 @@ checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" + [[package]] name = "colorchoice" version = "1.0.5" @@ -1648,7 +1678,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -1674,9 +1704,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" dependencies = [ "compression-core", "flate2", @@ -1685,9 +1715,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.31" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" [[package]] name = "concurrent-queue" @@ -1717,6 +1747,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" @@ -1831,9 +1867,9 @@ dependencies = [ [[package]] name = "crc-catalog" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc-fast" @@ -1842,7 +1878,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fd92aca2c6001b1bf5ba0ff84ee74ec8501b52bbef0cac80bf25a6c1d87a83d" dependencies = [ "crc", - "digest", + "digest 0.10.7", "rustversion", "spin 0.10.0", ] @@ -1924,7 +1960,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "crossterm_winapi", "document-features", "parking_lot", @@ -1979,6 +2015,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +dependencies = [ + "hybrid-array", +] + [[package]] name = "csv" version = "1.4.0" @@ -2010,12 +2055,27 @@ dependencies = [ "dtor", ] +[[package]] +name = "ctor" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "400a21f1014a968ec518c7ccdf9b4a4ed0cac8c56ccb6d604f8b91f00110501e" + [[package]] name = "ctor-proc-macro" version = "0.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" +[[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" @@ -2208,7 +2268,7 @@ dependencies = [ "chrono", "half", "hashbrown 0.16.1", - "indexmap 2.13.0", + "indexmap 2.14.0", "itertools 0.14.0", "libc", "log", @@ -2374,7 +2434,7 @@ dependencies = [ "datafusion-functions-aggregate-common", "datafusion-functions-window-common", "datafusion-physical-expr-common", - "indexmap 2.13.0", + "indexmap 2.14.0", "itertools 0.14.0", "paste", "serde_json", @@ -2389,7 +2449,7 @@ checksum = "7d7c3adf3db8bf61e92eb90cb659c8e8b734593a8f7c8e12a843c7ddba24b87e" dependencies = [ "arrow", "datafusion-common", - "indexmap 2.13.0", + "indexmap 2.14.0", "itertools 0.14.0", "paste", ] @@ -2416,12 +2476,12 @@ dependencies = [ "hex", "itertools 0.14.0", "log", - "md-5", + "md-5 0.10.6", "memchr", "num-traits", "rand 0.9.4", "regex", - "sha2", + "sha2 0.10.9", "unicode-segmentation", "uuid", ] @@ -2553,7 +2613,7 @@ dependencies = [ "datafusion-expr", "datafusion-expr-common", "datafusion-physical-expr", - "indexmap 2.13.0", + "indexmap 2.14.0", "itertools 0.14.0", "log", "regex", @@ -2575,7 +2635,7 @@ dependencies = [ "datafusion-physical-expr-common", "half", "hashbrown 0.16.1", - "indexmap 2.13.0", + "indexmap 2.14.0", "itertools 0.14.0", "parking_lot", "paste", @@ -2610,7 +2670,7 @@ dependencies = [ "datafusion-common", "datafusion-expr-common", "hashbrown 0.16.1", - "indexmap 2.13.0", + "indexmap 2.14.0", "itertools 0.14.0", "parking_lot", ] @@ -2656,7 +2716,7 @@ dependencies = [ "futures", "half", "hashbrown 0.16.1", - "indexmap 2.13.0", + "indexmap 2.14.0", "itertools 0.14.0", "log", "num-traits", @@ -2708,7 +2768,7 @@ dependencies = [ "datafusion-common", "datafusion-expr", "datafusion-functions-nested", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "regex", "sqlparser 0.61.0", @@ -2740,7 +2800,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" dependencies = [ - "const-oid", + "const-oid 0.9.6", "zeroize", ] @@ -2750,7 +2810,7 @@ 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", ] @@ -2802,12 +2862,24 @@ 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.0", + "const-oid 0.10.2", + "crypto-common 0.2.1", + "ctutils", +] + [[package]] name = "dirs" version = "6.0.0" @@ -2826,7 +2898,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2928,7 +3000,7 @@ dependencies = [ "base16ct", "crypto-bigint 0.4.9", "der 0.6.1", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -3087,7 +3159,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3101,9 +3173,9 @@ dependencies = [ [[package]] name = "ethnum" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" +checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" [[package]] name = "event-listener" @@ -3168,9 +3240,9 @@ checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "ff" @@ -3184,13 +3256,12 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.27" +version = "0.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +checksum = "2d5b2eef6fafbf69f877e55509ce5b11a760690ac9700a2921be067aa6afaef6" dependencies = [ "cfg-if 1.0.4", "libc", - "libredox", ] [[package]] @@ -3211,7 +3282,7 @@ version = "25.12.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35f6839d7b3b98adde531effaf34f0c2badc6f4735d26fe74709d8e513a96ef3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "rustc_version", ] @@ -3651,7 +3722,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.13.0", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -3660,9 +3731,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" dependencies = [ "atomic-waker", "bytes", @@ -3670,7 +3741,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.4.0", - "indexmap 2.13.0", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -3715,8 +3786,6 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "allocator-api2", - "equivalent", "foldhash 0.1.5", ] @@ -3733,6 +3802,12 @@ dependencies = [ "serde_core", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "heapify" version = "0.2.0" @@ -3814,7 +3889,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]] @@ -3899,6 +3983,15 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +[[package]] +name = "hybrid-array" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" version = "0.14.32" @@ -3925,22 +4018,21 @@ dependencies = [ [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", - "h2 0.4.13", + "h2 0.4.14", "http 1.4.0", "http-body 1.0.1", "httparse", "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -3963,20 +4055,19 @@ 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", + "hyper 1.9.0", "hyper-util", - "rustls 0.23.37", + "rustls 0.23.40", "rustls-native-certs", - "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.6", + "webpki-roots 1.0.7", ] [[package]] @@ -3991,12 +4082,12 @@ dependencies = [ "futures-util", "http 1.4.0", "http-body 1.0.1", - "hyper 1.8.1", + "hyper 1.9.0", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.3", "system-configuration", "tokio", "tower-service", @@ -4039,12 +4130,13 @@ dependencies = [ [[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", @@ -4052,9 +4144,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", @@ -4065,9 +4157,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", @@ -4079,15 +4171,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", @@ -4099,15 +4191,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", @@ -4143,9 +4235,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", @@ -4164,12 +4256,12 @@ 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", ] @@ -4208,11 +4300,11 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd7bddefd0a8833b88a4b68f90dae22c7450d11b354198baee3874fd811b344" +checksum = "4d09b98f7eace8982db770e4408e7470b028ce513ac28fecdc6bf4c30fe92b62" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if 1.0.4", "libc", ] @@ -4224,13 +4316,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] -name = "iri-string" -version = "0.7.11" +name = "is-docker" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" dependencies = [ - "memchr", - "serde", + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", ] [[package]] @@ -4311,9 +4412,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -4323,14 +4424,14 @@ dependencies = [ "portable-atomic-util", "serde_core", "wasm-bindgen", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" dependencies = [ "proc-macro2", "quote", @@ -4413,19 +4514,21 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ + "cfg-if 1.0.4", + "futures-util", "once_cell", "wasm-bindgen", ] [[package]] name = "jsonb" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a901f06163d352fbe41c3c2ff5e08b75330a003cc941e988fb501022f5421e6" +checksum = "eb98fb29636087c40ad0d1274d9a30c0c1e83e03ae93f6e7e89247b37fcc6953" dependencies = [ "byteorder", "ethnum", @@ -4436,16 +4539,16 @@ dependencies = [ "num-traits", "ordered-float", "rand 0.9.4", - "ryu", "serde", "serde_json", + "zmij", ] [[package]] name = "jsonwebtoken" -version = "10.3.0" +version = "10.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" +checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" dependencies = [ "aws-lc-rs", "base64 0.22.1", @@ -4456,6 +4559,7 @@ dependencies = [ "serde_json", "signature 2.2.0", "simple_asn1", + "zeroize", ] [[package]] @@ -4902,7 +5006,7 @@ dependencies = [ "bytes", "chrono", "futures", - "hmac", + "hmac 0.12.1", "lance", "lance-core", "lance-index", @@ -4917,7 +5021,7 @@ dependencies = [ "reqwest 0.12.28", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "snafu 0.9.0", "tokio", "tower", @@ -5025,6 +5129,7 @@ dependencies = [ "aws-sdk-kms", "aws-sdk-s3", "aws-smithy-runtime", + "base64 0.22.1", "bytes", "candle-core", "candle-nn", @@ -5063,6 +5168,7 @@ dependencies = [ "moka", "num-traits", "object_store", + "open", "pin-project", "polars", "polars-arrow", @@ -5075,12 +5181,14 @@ dependencies = [ "serde", "serde_json", "serde_with", + "sha2 0.10.9", "snafu 0.8.9", "tempfile", "test-log", "tokenizers", "tokio", "url", + "urlencoding", "uuid", "walkdir", ] @@ -5207,9 +5315,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.183" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libloading" @@ -5229,14 +5337,11 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.11.0", "libc", - "plain", - "redox_syscall 0.7.4", ] [[package]] @@ -5371,9 +5476,9 @@ 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 = "litrs" @@ -5411,11 +5516,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.5" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.1", ] [[package]] @@ -5445,9 +5550,9 @@ dependencies = [ [[package]] name = "lz4_flex" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db9a0d582c2874f68138a16ce1867e0ffde6c0bb0a0df85e1f36d04146db488a" +checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" dependencies = [ "twox-hash", ] @@ -5514,7 +5619,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if 1.0.4", - "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 1.0.4", + "digest 0.11.3", ] [[package]] @@ -5591,9 +5706,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi 0.11.1+wasi-snapshot-preview1", @@ -5684,12 +5799,12 @@ dependencies = [ [[package]] name = "napi" -version = "3.8.3" +version = "3.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6944d0bf100571cd6e1a98a316cdca262deb6fccf8d93f5ae1502ca3fc88bd3" +checksum = "8e55037284865448ecf329baa86a4d05401f647ebde99f5747b640d32c2c5226" dependencies = [ - "bitflags 2.11.0", - "ctor", + "bitflags 2.11.1", + "ctor 0.11.1", "futures", "napi-build", "napi-sys", @@ -5706,12 +5821,12 @@ checksum = "d376940fd5b723c6893cd1ee3f33abbfd86acb1cd1ec079f3ab04a2a3bc4d3b1" [[package]] name = "napi-derive" -version = "3.5.2" +version = "3.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c914b5e420182bfb73504e0607592cdb8e2e21437d450883077669fb72a114d" +checksum = "a4ba740fe4c9524d86fd90798fd8ccdb23402b3eef7e7c30897a8a369b529fcf" dependencies = [ "convert_case", - "ctor", + "ctor 0.11.1", "napi-derive-backend", "proc-macro2", "quote", @@ -5720,9 +5835,9 @@ dependencies = [ [[package]] name = "napi-derive-backend" -version = "5.0.2" +version = "5.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0864cf6a82e2cfb69067374b64c9253d7e910e5b34db833ed7495dda56ccb18" +checksum = "0d5af30503edf933ce7377cf6d4c877a62b0f1107ea05585f1b5e430e88d5baf" dependencies = [ "convert_case", "proc-macro2", @@ -5804,7 +5919,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5828,7 +5943,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "zeroize", ] @@ -5901,7 +6016,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -5950,12 +6065,12 @@ dependencies = [ "http-body-util", "httparse", "humantime", - "hyper 1.8.1", + "hyper 1.9.0", "itertools 0.14.0", - "md-5", + "md-5 0.10.6", "parking_lot", "percent-encoding", - "quick-xml 0.39.3", + "quick-xml 0.39.4", "rand 0.10.1", "reqwest 0.12.28", "ring", @@ -6009,11 +6124,11 @@ checksum = "269bca4c2591a28585d6bf10d9ed0332b7d76900a1b02bec41bdc3a2cdcda107" [[package]] name = "onig" -version = "6.5.1" +version = "6.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" +checksum = "0cc3cbf698f9438986c11a880c90a6d04b9de27575afd28bbf45b154b6c709e2" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "libc", "once_cell", "onig_sys", @@ -6021,21 +6136,32 @@ dependencies = [ [[package]] name = "onig_sys" -version = "69.9.1" +version = "69.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f86c6eef3d6df15f23bcfb6af487cbd2fed4e5581d58d5bf1f5f8b7f6727dc" +checksum = "1e68317604e77e53b85896388e1a803c1d21b74c899ec9e5e1112db90735edd7" dependencies = [ "cc", "pkg-config", ] +[[package]] +name = "open" +version = "5.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fbaa89d2ddc8473c78a3adf69eea8cffa28c483b8e02a971ef31527cd0fc92c" +dependencies = [ + "is-wsl", + "libc", + "pathdiff", +] + [[package]] name = "opendal" version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b31d3d8e99a85d83b73ec26647f5607b80578ed9375810b6e44ffa3590a236" dependencies = [ - "ctor", + "ctor 0.6.3", "opendal-core", "opendal-layer-concurrent-limit", "opendal-layer-logging", @@ -6063,7 +6189,7 @@ dependencies = [ "http-body 1.0.1", "jiff", "log", - "md-5", + "md-5 0.10.6", "mea", "percent-encoding", "quick-xml 0.38.4", @@ -6137,7 +6263,7 @@ dependencies = [ "reqsign-core", "reqsign-file-read-tokio", "serde", - "sha2", + "sha2 0.10.9", "uuid", ] @@ -6236,7 +6362,7 @@ dependencies = [ "crc32c", "http 1.4.0", "log", - "md-5", + "md-5 0.10.6", "opendal-core", "quick-xml 0.38.4", "reqsign-aws-v4", @@ -6260,9 +6386,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" -version = "5.1.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" dependencies = [ "num-traits", ] @@ -6300,7 +6426,7 @@ checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" dependencies = [ "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -6327,7 +6453,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if 1.0.4", "libc", - "redox_syscall 0.5.18", + "redox_syscall", "smallvec", "windows-link", ] @@ -6365,14 +6491,20 @@ dependencies = [ "stfu8", ] +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "pbkdf2" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest", - "hmac", + "digest 0.10.7", + "hmac 0.12.1", ] [[package]] @@ -6414,7 +6546,7 @@ checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", "hashbrown 0.15.5", - "indexmap 2.13.0", + "indexmap 2.14.0", "serde", ] @@ -6473,7 +6605,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared 0.11.3", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -6515,18 +6647,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "cbf0d9e68100b3a7989b4901972f265cd542e560a3a8a724e1e20322f4d06ce9" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "a990e22f43e84855daf260dded30524ef4a9021cc7541c26540500a50b624389" dependencies = [ "proc-macro2", "quote", @@ -6567,7 +6699,7 @@ dependencies = [ "der 0.7.10", "pbkdf2", "scrypt", - "sha2", + "sha2 0.10.9", "spki 0.7.3", ] @@ -6595,15 +6727,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "planus" @@ -6702,14 +6828,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "465f70d3e96b6d0b1a43c358ba451286b8c8bd56696feff020d65702aa33e35c" dependencies = [ "ahash", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "chrono", "chrono-tz 0.8.6", "comfy-table", "either", "hashbrown 0.14.5", - "indexmap 2.13.0", + "indexmap 2.14.0", "num-traits", "once_cell", "polars-arrow", @@ -6717,7 +6843,7 @@ dependencies = [ "polars-error", "polars-row", "polars-utils", - "rand 0.8.5", + "rand 0.8.6", "rand_distr 0.4.3", "rayon", "regex", @@ -6776,7 +6902,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2632b1af668e2058d5f8f916d8fbde3cac63d03ae29a705f598e41dcfeb7f" dependencies = [ "ahash", - "bitflags 2.11.0", + "bitflags 2.11.1", "glob", "once_cell", "polars-arrow", @@ -6807,7 +6933,7 @@ dependencies = [ "either", "hashbrown 0.14.5", "hex", - "indexmap 2.13.0", + "indexmap 2.14.0", "memchr", "num-traits", "polars-arrow", @@ -6916,7 +7042,7 @@ dependencies = [ "polars-error", "polars-lazy", "polars-plan", - "rand 0.8.5", + "rand 0.8.6", "serde", "serde_json", "sqlparser 0.39.0", @@ -6951,7 +7077,7 @@ dependencies = [ "ahash", "bytemuck", "hashbrown 0.14.5", - "indexmap 2.13.0", + "indexmap 2.14.0", "num-traits", "once_cell", "polars-error", @@ -6971,18 +7097,18 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +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", ] @@ -7046,8 +7172,8 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ - "heck 0.4.1", - "itertools 0.11.0", + "heck 0.5.0", + "itertools 0.14.0", "log", "multimap", "petgraph", @@ -7066,7 +7192,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.117", @@ -7083,9 +7209,9 @@ dependencies = [ [[package]] name = "psm" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8" +checksum = "645dbe486e346d9b5de3ef16ede18c26e6c70ad97418f4874b8b1889d6e761ea" dependencies = [ "ar_archive_writer", "cc", @@ -7210,9 +7336,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.39.3" +version = "0.39.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721da970c312655cde9b4ffe0547f20a8494866a4af5ff51f18b7c633d0c870b" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" dependencies = [ "memchr", "serde", @@ -7230,8 +7356,8 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.37", - "socket2 0.5.10", + "rustls 0.23.40", + "socket2 0.6.3", "thiserror 2.0.18", "tokio", "tracing", @@ -7251,7 +7377,7 @@ dependencies = [ "rand 0.9.4", "ring", "rustc-hash", - "rustls 0.23.37", + "rustls 0.23.40", "rustls-pki-types", "slab", "thiserror 2.0.18", @@ -7269,7 +7395,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.3", "tracing", "windows-sys 0.60.2", ] @@ -7303,9 +7429,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -7384,7 +7510,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -7416,7 +7542,7 @@ dependencies = [ "brotli 3.5.0", "once_cell", "paste", - "rand 0.8.5", + "rand 0.8.6", "unicase", ] @@ -7445,7 +7571,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -7456,9 +7582,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -7526,16 +7652,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "redox_syscall" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" -dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -7639,13 +7756,13 @@ dependencies = [ "http 1.4.0", "log", "percent-encoding", - "quick-xml 0.39.3", + "quick-xml 0.39.4", "reqsign-core", "rust-ini", "serde", "serde_json", "serde_urlencoded", - "sha1", + "sha1 0.10.6", ] [[package]] @@ -7667,7 +7784,7 @@ dependencies = [ "rsa", "serde", "serde_json", - "sha1", + "sha1 0.10.6", ] [[package]] @@ -7682,13 +7799,13 @@ dependencies = [ "form_urlencoded", "futures", "hex", - "hmac", + "hmac 0.12.1", "http 1.4.0", "jiff", "log", "percent-encoding", - "sha1", - "sha2", + "sha1 0.10.6", + "sha2 0.10.9", "windows-sys 0.61.2", ] @@ -7719,7 +7836,7 @@ dependencies = [ "rsa", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "tokio", ] @@ -7734,12 +7851,12 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.4.13", + "h2 0.4.14", "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.7", + "hyper 1.9.0", + "hyper-rustls 0.27.9", "hyper-util", "js-sys", "log", @@ -7748,7 +7865,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.37", + "rustls 0.23.40", "rustls-native-certs", "rustls-pki-types", "serde", @@ -7759,14 +7876,14 @@ dependencies = [ "tokio-rustls 0.26.4", "tokio-util", "tower", - "tower-http 0.6.8", + "tower-http 0.6.10", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams 0.4.2", "web-sys", - "webpki-roots 1.0.6", + "webpki-roots 1.0.7", ] [[package]] @@ -7782,15 +7899,15 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.7", + "hyper 1.9.0", + "hyper-rustls 0.27.9", "hyper-util", "js-sys", "log", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.37", + "rustls 0.23.40", "rustls-pki-types", "rustls-platform-verifier", "serde", @@ -7800,7 +7917,7 @@ dependencies = [ "tokio-rustls 0.26.4", "tokio-util", "tower", - "tower-http 0.6.8", + "tower-http 0.6.10", "tower-service", "url", "wasm-bindgen", @@ -7846,7 +7963,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ "crypto-bigint 0.4.9", - "hmac", + "hmac 0.12.1", "zeroize", ] @@ -7880,15 +7997,15 @@ 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", "pkcs1", "pkcs8 0.10.2", "rand_core 0.6.4", - "sha2", + "sha2 0.10.9", "signature 2.2.0", "spki 0.7.3", "subtle", @@ -7947,9 +8064,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -7966,11 +8083,11 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -7987,9 +8104,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "aws-lc-rs", "log", @@ -8015,9 +8132,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "web-time", "zeroize", @@ -8034,14 +8151,14 @@ dependencies = [ "jni", "log", "once_cell", - "rustls 0.23.37", + "rustls 0.23.40", "rustls-native-certs", "rustls-platform-verifier-android", "rustls-webpki 0.103.13", "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -8172,7 +8289,7 @@ checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" dependencies = [ "pbkdf2", "salsa20", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -8215,7 +8332,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -8234,9 +8351,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" @@ -8332,15 +8449,16 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.18.0" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +checksum = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2" dependencies = [ "base64 0.22.1", + "bs58", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.13.0", + "indexmap 2.14.0", "schemars 0.9.0", "schemars 1.2.1", "serde_core", @@ -8351,9 +8469,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.18.0" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +checksum = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac" dependencies = [ "darling 0.23.0", "proc-macro2", @@ -8367,7 +8485,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "itoa", "ryu", "serde", @@ -8382,7 +8500,18 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if 1.0.4", "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 1.0.4", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -8393,10 +8522,21 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if 1.0.4", "cpufeatures 0.2.17", - "digest", + "digest 0.10.7", "sha2-asm", ] +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + [[package]] name = "sha2-asm" version = "0.6.4" @@ -8448,7 +8588,7 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -8458,15 +8598,15 @@ 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.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "simd_cesu8" @@ -8498,9 +8638,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" @@ -8549,7 +8689,7 @@ version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1c97747dbf44bb1ca44a561ece23508e99cb592e862f22222dcf42f51d1e451" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "syn 2.0.117", @@ -8561,7 +8701,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54254b8531cafa275c5e096f62d48c81435d1015405a91198ddb11e967301d40" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "syn 2.0.117", @@ -8584,7 +8724,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -8680,15 +8820,15 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stacker" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013" +checksum = "640c8cdd92b6b12f5bcb1803ca3bbf5ab96e5e6b6b96b9ab77dabe9e880b3190" dependencies = [ "cc", "cfg-if 1.0.4", "libc", "psm", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -8862,7 +9002,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "byteorder", "enum-as-inner", "libc", @@ -8904,7 +9044,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -8964,14 +9104,14 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "test-log" -version = "0.2.19" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d53ac171c92a39e4769491c4b4dde7022c60042254b5fc044ae409d34a24d4" +checksum = "2f46bf474f0a4afebf92f076d54fd5e63423d9438b8c278a3d2ccb0f47f7cdb3" dependencies = [ "env_logger", "test-log-macros", @@ -8979,16 +9119,26 @@ dependencies = [ ] [[package]] -name = "test-log-macros" -version = "0.2.19" +name = "test-log-core" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be35209fd0781c5401458ab66e4f98accf63553e8fae7425503e92fdd319783b" +checksum = "37d4d41320b48bc4a211a9021678fcc0c99569b594ea31c93735b8e517102b4c" dependencies = [ "proc-macro2", "quote", "syn 2.0.117", ] +[[package]] +name = "test-log-macros" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9beb9249a81e430dffd42400a49019bcf548444f1968ff23080a625de0d4d320" +dependencies = [ + "syn 2.0.117", + "test-log-core", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -9089,9 +9239,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", @@ -9130,7 +9280,7 @@ dependencies = [ "monostate", "onig", "paste", - "rand 0.8.5", + "rand 0.8.6", "rayon", "rayon-cond", "regex", @@ -9146,9 +9296,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.50.0" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -9163,9 +9313,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -9199,7 +9349,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.37", + "rustls 0.23.40", "tokio", ] @@ -9230,20 +9380,20 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.1.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.25.8+spec-1.1.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "toml_datetime", "toml_parser", "winnow", @@ -9251,9 +9401,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.1.0+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ "winnow", ] @@ -9280,7 +9430,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytes", "http 1.4.0", "http-body 1.0.1", @@ -9293,25 +9443,25 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "68d6fdd9f81c2819c9a8b0e0cd91660e7746a8e6ea2ba7c6b2b057985f6bcb51" dependencies = [ "async-compression", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytes", "futures-core", "futures-util", "http 1.4.0", "http-body 1.0.1", "http-body-util", - "iri-string", "pin-project-lite", "tokio", "tokio-util", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -9437,9 +9587,9 @@ checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "typewit" @@ -9550,7 +9700,7 @@ dependencies = [ "flate2", "log", "once_cell", - "rustls 0.23.37", + "rustls 0.23.40", "rustls-pki-types", "serde", "serde_json", @@ -9597,9 +9747,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -9667,11 +9817,11 @@ dependencies = [ [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -9680,7 +9830,7 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] @@ -9694,9 +9844,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if 1.0.4", "once_cell", @@ -9707,23 +9857,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.64" +version = "0.4.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" dependencies = [ - "cfg-if 1.0.4", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9731,9 +9877,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -9744,9 +9890,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] @@ -9768,7 +9914,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", - "indexmap 2.13.0", + "indexmap 2.14.0", "wasm-encoder", "wasmparser", ] @@ -9805,17 +9951,17 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "hashbrown 0.15.5", - "indexmap 2.13.0", + "indexmap 2.14.0", "semver", ] [[package]] name = "web-sys" -version = "0.3.91" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" dependencies = [ "js-sys", "wasm-bindgen", @@ -9846,23 +9992,23 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.6", + "webpki-roots 1.0.7", ] [[package]] name = "webpki-roots" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" dependencies = [ "rustls-pki-types", ] [[package]] name = "whoami" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a5b12f9df4f978d2cfdb1bd3bac52433f44393342d7ee9c25f5a1c14c0f45d" +checksum = "998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d" dependencies = [ "libc", "libredox", @@ -9893,7 +10039,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -10209,9 +10355,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" dependencies = [ "memchr", ] @@ -10225,6 +10371,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -10244,7 +10396,7 @@ checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap 2.13.0", + "indexmap 2.14.0", "prettyplease", "syn 2.0.117", "wasm-metadata", @@ -10274,8 +10426,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", - "indexmap 2.13.0", + "bitflags 2.11.1", + "indexmap 2.14.0", "log", "serde", "serde_derive", @@ -10294,7 +10446,7 @@ checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "semver", "serde", @@ -10306,9 +10458,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "wyz" @@ -10343,7 +10495,7 @@ dependencies = [ "crc32fast", "futures", "http 1.4.0", - "hyper 1.8.1", + "hyper 1.9.0", "lazy_static", "more-asserts", "rand 0.10.1", @@ -10423,7 +10575,7 @@ dependencies = [ "rand 0.10.1", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "tempfile", "thiserror 2.0.18", "tokio", @@ -10449,7 +10601,7 @@ dependencies = [ "chrono", "colored", "const-str", - "ctor", + "ctor 0.6.3", "dirs", "futures", "git-version", @@ -10496,9 +10648,9 @@ checksum = "aed111bd9e48a802518765906cbdadf0b45afb72b9c81ab049a3b86252adffdd" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -10507,9 +10659,9 @@ 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", @@ -10519,18 +10671,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.47" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.47" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -10539,18 +10691,18 @@ dependencies = [ [[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", @@ -10563,12 +10715,26 @@ name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[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", @@ -10577,9 +10743,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", @@ -10588,9 +10754,9 @@ 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", @@ -10604,7 +10770,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c42e33efc22a0650c311c2ef19115ce232583abbe80850bc8b66509ebef02de0" dependencies = [ "crc32fast", - "indexmap 2.13.0", + "indexmap 2.14.0", "memchr", "typed-path", ] diff --git a/docs/src/js/classes/BooleanQuery.md b/docs/src/js/classes/BooleanQuery.md index 7925f4732..56a4d9a7f 100644 --- a/docs/src/js/classes/BooleanQuery.md +++ b/docs/src/js/classes/BooleanQuery.md @@ -25,8 +25,7 @@ new BooleanQuery(queries): BooleanQuery Creates an instance of BooleanQuery. #### Parameters - -* **queries**: [[`Occur`](../enumerations/Occur.md), [`FullTextQuery`](../interfaces/FullTextQuery.md)][] + * **queries**: [[`Occur`](../enumerations/Occur.md), [`FullTextQuery`](../interfaces/FullTextQuery.md)][] An array of (Occur, FullTextQuery objects) to combine. Occur specifies whether the query must match, or should match. diff --git a/docs/src/js/classes/BoostQuery.md b/docs/src/js/classes/BoostQuery.md index b69c6c5ac..51c28cf78 100644 --- a/docs/src/js/classes/BoostQuery.md +++ b/docs/src/js/classes/BoostQuery.md @@ -31,18 +31,14 @@ but penalizes those that match the negative query. the penalty is controlled by the `negativeBoost` parameter. #### Parameters - -* **positive**: [`FullTextQuery`](../interfaces/FullTextQuery.md) + * **positive**: [`FullTextQuery`](../interfaces/FullTextQuery.md) The positive query that boosts the relevance score. - -* **negative**: [`FullTextQuery`](../interfaces/FullTextQuery.md) + * **negative**: [`FullTextQuery`](../interfaces/FullTextQuery.md) The negative query that reduces the relevance score. - -* **options?** + * **options?** Optional parameters for the boost query. - `negativeBoost`: The boost factor for the negative query (default is 0.0). - -* **options.negativeBoost?**: `number` + * **options.negativeBoost?**: `number` #### Returns diff --git a/docs/src/js/classes/Connection.md b/docs/src/js/classes/Connection.md index a594e94aa..17377def3 100644 --- a/docs/src/js/classes/Connection.md +++ b/docs/src/js/classes/Connection.md @@ -42,26 +42,19 @@ both the source and cloned tables to evolve independently while initially sharing the same data, deletion, and index files. #### Parameters - -* **targetTableName**: `string` + * **targetTableName**: `string` The name of the target table to create. - -* **sourceUri**: `string` + * **sourceUri**: `string` The URI of the source table to clone from. - -* **options?** + * **options?** Clone options. - -* **options.isShallow?**: `boolean` + * **options.isShallow?**: `boolean` Whether to perform a shallow clone (defaults to true). - -* **options.sourceTag?**: `string` + * **options.sourceTag?**: `string` The tag of the source table to clone. - -* **options.sourceVersion?**: `number` + * **options.sourceVersion?**: `number` The version of the source table to clone. - -* **options.targetNamespacePath?**: `string`[] + * **options.targetNamespacePath?**: `string`[] The namespace path for the target table (defaults to root namespace). #### Returns @@ -102,14 +95,11 @@ abstract createEmptyTable( Creates a new empty Table ##### Parameters - -* **name**: `string` + * **name**: `string` The name of the table. - -* **schema**: [`SchemaLike`](../type-aliases/SchemaLike.md) + * **schema**: [`SchemaLike`](../type-aliases/SchemaLike.md) The schema of the table - -* **options?**: `Partial`<[`CreateTableOptions`](../interfaces/CreateTableOptions.md)> + * **options?**: `Partial`<[`CreateTableOptions`](../interfaces/CreateTableOptions.md)> Additional options (backwards compatibility) ##### Returns @@ -129,17 +119,13 @@ abstract createEmptyTable( Creates a new empty Table ##### Parameters - -* **name**: `string` + * **name**: `string` The name of the table. - -* **schema**: [`SchemaLike`](../type-aliases/SchemaLike.md) + * **schema**: [`SchemaLike`](../type-aliases/SchemaLike.md) The schema of the table - -* **namespacePath?**: `string`[] + * **namespacePath?**: `string`[] The namespace path to create the table in (defaults to root namespace) - -* **options?**: `Partial`<[`CreateTableOptions`](../interfaces/CreateTableOptions.md)> + * **options?**: `Partial`<[`CreateTableOptions`](../interfaces/CreateTableOptions.md)> Additional options ##### Returns @@ -159,11 +145,9 @@ abstract createTable(options, namespacePath?): Promise Creates a new Table and initialize it with new data. ##### Parameters - -* **options**: `object` & `Partial`<[`CreateTableOptions`](../interfaces/CreateTableOptions.md)> + * **options**: `object` & `Partial`<[`CreateTableOptions`](../interfaces/CreateTableOptions.md)> The options object. - -* **namespacePath?**: `string`[] + * **namespacePath?**: `string`[] The namespace path to create the table in (defaults to root namespace) ##### Returns @@ -182,15 +166,12 @@ abstract createTable( Creates a new Table and initialize it with new data. ##### Parameters - -* **name**: `string` + * **name**: `string` The name of the table. - -* **data**: [`TableLike`](../type-aliases/TableLike.md) \| `Record`<`string`, `unknown`>[] + * **data**: [`TableLike`](../type-aliases/TableLike.md) \| `Record`<`string`, `unknown`>[] Non-empty Array of Records to be inserted into the table - -* **options?**: `Partial`<[`CreateTableOptions`](../interfaces/CreateTableOptions.md)> + * **options?**: `Partial`<[`CreateTableOptions`](../interfaces/CreateTableOptions.md)> Additional options (backwards compatibility) ##### Returns @@ -210,18 +191,14 @@ abstract createTable( Creates a new Table and initialize it with new data. ##### Parameters - -* **name**: `string` + * **name**: `string` The name of the table. - -* **data**: [`TableLike`](../type-aliases/TableLike.md) \| `Record`<`string`, `unknown`>[] + * **data**: [`TableLike`](../type-aliases/TableLike.md) \| `Record`<`string`, `unknown`>[] Non-empty Array of Records to be inserted into the table - -* **namespacePath?**: `string`[] + * **namespacePath?**: `string`[] The namespace path to create the table in (defaults to root namespace) - -* **options?**: `Partial`<[`CreateTableOptions`](../interfaces/CreateTableOptions.md)> + * **options?**: `Partial`<[`CreateTableOptions`](../interfaces/CreateTableOptions.md)> Additional options ##### Returns @@ -253,8 +230,7 @@ abstract dropAllTables(namespacePath?): Promise Drop all tables in the database. #### Parameters - -* **namespacePath?**: `string`[] + * **namespacePath?**: `string`[] The namespace path to drop tables from (defaults to root namespace). #### Returns @@ -272,11 +248,9 @@ abstract dropTable(name, namespacePath?): Promise Drop an existing table. #### Parameters - -* **name**: `string` + * **name**: `string` The name of the table to drop. - -* **namespacePath?**: `string`[] + * **namespacePath?**: `string`[] The namespace path of the table (defaults to root namespace). #### Returns @@ -311,14 +285,11 @@ abstract openTable( Open a table in the database. #### Parameters - -* **name**: `string` + * **name**: `string` The name of the table - -* **namespacePath?**: `string`[] + * **namespacePath?**: `string`[] The namespace path of the table (defaults to root namespace) - -* **options?**: `Partial`<[`OpenTableOptions`](../interfaces/OpenTableOptions.md)> + * **options?**: `Partial`<[`OpenTableOptions`](../interfaces/OpenTableOptions.md)> Additional options #### Returns @@ -340,8 +311,7 @@ List all the table names in this database. Tables will be returned in lexicographical order. ##### Parameters - -* **options?**: `Partial`<[`TableNamesOptions`](../interfaces/TableNamesOptions.md)> + * **options?**: `Partial`<[`TableNamesOptions`](../interfaces/TableNamesOptions.md)> options to control the paging / start point (backwards compatibility) @@ -360,11 +330,9 @@ List all the table names in this database. Tables will be returned in lexicographical order. ##### Parameters - -* **namespacePath?**: `string`[] + * **namespacePath?**: `string`[] The namespace path to list tables from (defaults to root namespace) - -* **options?**: `Partial`<[`TableNamesOptions`](../interfaces/TableNamesOptions.md)> + * **options?**: `Partial`<[`TableNamesOptions`](../interfaces/TableNamesOptions.md)> options to control the paging / start point diff --git a/docs/src/js/classes/Index.md b/docs/src/js/classes/Index.md index 372a1ac42..2b8f15920 100644 --- a/docs/src/js/classes/Index.md +++ b/docs/src/js/classes/Index.md @@ -73,8 +73,7 @@ The results of a full text search are ordered by relevance measured by BM25. You can combine filters with full text search. #### Parameters - -* **options?**: `Partial`<[`FtsOptions`](../interfaces/FtsOptions.md)> + * **options?**: `Partial`<[`FtsOptions`](../interfaces/FtsOptions.md)> #### Returns @@ -95,8 +94,7 @@ It is a variant of the HNSW algorithm that uses product quantization to compress the vectors. #### Parameters - -* **options?**: `Partial`<[`HnswPqOptions`](../interfaces/HnswPqOptions.md)> + * **options?**: `Partial`<[`HnswPqOptions`](../interfaces/HnswPqOptions.md)> #### Returns @@ -117,8 +115,7 @@ It is a variant of the HNSW algorithm that uses scalar quantization to compress the vectors. #### Parameters - -* **options?**: `Partial`<[`HnswSqOptions`](../interfaces/HnswSqOptions.md)> + * **options?**: `Partial`<[`HnswSqOptions`](../interfaces/HnswSqOptions.md)> #### Returns @@ -148,8 +145,7 @@ Note that training an IVF FLAT index on a large dataset is a slow operation and currently is also a memory intensive operation. #### Parameters - -* **options?**: `Partial`<[`IvfFlatOptions`](../interfaces/IvfFlatOptions.md)> + * **options?**: `Partial`<[`IvfFlatOptions`](../interfaces/IvfFlatOptions.md)> #### Returns @@ -185,8 +181,7 @@ Note that training an IVF PQ index on a large dataset is a slow operation and currently is also a memory intensive operation. #### Parameters - -* **options?**: `Partial`<[`IvfPqOptions`](../interfaces/IvfPqOptions.md)> + * **options?**: `Partial`<[`IvfPqOptions`](../interfaces/IvfPqOptions.md)> #### Returns @@ -216,8 +211,7 @@ Note that training an IVF RQ index on a large dataset is a slow operation and currently is also a memory intensive operation. #### Parameters - -* **options?**: `Partial`<[`IvfRqOptions`](../interfaces/IvfRqOptions.md)> + * **options?**: `Partial`<[`IvfRqOptions`](../interfaces/IvfRqOptions.md)> #### Returns diff --git a/docs/src/js/classes/MakeArrowTableOptions.md b/docs/src/js/classes/MakeArrowTableOptions.md index fedfc624d..9fa19536e 100644 --- a/docs/src/js/classes/MakeArrowTableOptions.md +++ b/docs/src/js/classes/MakeArrowTableOptions.md @@ -17,8 +17,7 @@ new MakeArrowTableOptions(values?): MakeArrowTableOptions ``` #### Parameters - -* **values?**: `Partial`<[`MakeArrowTableOptions`](MakeArrowTableOptions.md)> + * **values?**: `Partial`<[`MakeArrowTableOptions`](MakeArrowTableOptions.md)> #### Returns diff --git a/docs/src/js/classes/MatchQuery.md b/docs/src/js/classes/MatchQuery.md index 61fd434a5..09e4cd655 100644 --- a/docs/src/js/classes/MatchQuery.md +++ b/docs/src/js/classes/MatchQuery.md @@ -28,30 +28,22 @@ new MatchQuery( Creates an instance of MatchQuery. #### Parameters - -* **query**: `string` + * **query**: `string` The text query to search for. - -* **column**: `string` + * **column**: `string` The name of the column to search within. - -* **options?** + * **options?** Optional parameters for the match query. - `boost`: The boost factor for the query (default is 1.0). - `fuzziness`: The fuzziness level for the query (default is 0). - `maxExpansions`: The maximum number of terms to consider for fuzzy matching (default is 50). - `operator`: The logical operator to use for combining terms in the query (default is "OR"). - `prefixLength`: The number of beginning characters being unchanged for fuzzy matching. - -* **options.boost?**: `number` - -* **options.fuzziness?**: `number` - -* **options.maxExpansions?**: `number` - -* **options.operator?**: [`Operator`](../enumerations/Operator.md) - -* **options.prefixLength?**: `number` + * **options.boost?**: `number` + * **options.fuzziness?**: `number` + * **options.maxExpansions?**: `number` + * **options.operator?**: [`Operator`](../enumerations/Operator.md) + * **options.prefixLength?**: `number` #### Returns diff --git a/docs/src/js/classes/MergeInsertBuilder.md b/docs/src/js/classes/MergeInsertBuilder.md index ae601c9e2..4c40eaeae 100644 --- a/docs/src/js/classes/MergeInsertBuilder.md +++ b/docs/src/js/classes/MergeInsertBuilder.md @@ -19,10 +19,8 @@ new MergeInsertBuilder(native, schema): MergeInsertBuilder Construct a MergeInsertBuilder. __Internal use only.__ #### Parameters - -* **native**: `NativeMergeInsertBuilder` - -* **schema**: `Schema`<`any`> \| `Promise`<`Schema`<`any`>> + * **native**: `NativeMergeInsertBuilder` + * **schema**: `Schema`<`any`> \| `Promise`<`Schema`<`any`>> #### Returns @@ -39,10 +37,8 @@ execute(data, execOptions?): Promise Executes the merge insert operation #### Parameters - -* **data**: [`Data`](../type-aliases/Data.md) - -* **execOptions?**: `Partial`<[`WriteExecutionOptions`](../interfaces/WriteExecutionOptions.md)> + * **data**: [`Data`](../type-aliases/Data.md) + * **execOptions?**: `Partial`<[`WriteExecutionOptions`](../interfaces/WriteExecutionOptions.md)> #### Returns @@ -66,8 +62,7 @@ table scan even if an index exists. This can be useful for benchmarking or when the query optimizer chooses a suboptimal path. #### Parameters - -* **useIndex**: `boolean` + * **useIndex**: `boolean` Whether to use indices for the merge operation. Defaults to `true`. #### Returns @@ -104,10 +99,8 @@ table (new data). For example, "target.last_update < source.last_update" #### Parameters - -* **options?** - -* **options.where?**: `string` + * **options?** + * **options.where?**: `string` #### Returns @@ -126,10 +119,8 @@ deleted. An optional condition can be provided to limit what data is deleted. #### Parameters - -* **options?** - -* **options.where?**: `string` + * **options?** + * **options.where?**: `string` An optional condition to limit what data is deleted #### Returns diff --git a/docs/src/js/classes/MultiMatchQuery.md b/docs/src/js/classes/MultiMatchQuery.md index f6c620363..914fa626e 100644 --- a/docs/src/js/classes/MultiMatchQuery.md +++ b/docs/src/js/classes/MultiMatchQuery.md @@ -28,21 +28,16 @@ new MultiMatchQuery( Creates an instance of MultiMatchQuery. #### Parameters - -* **query**: `string` + * **query**: `string` The text query to search for across multiple columns. - -* **columns**: `string`[] + * **columns**: `string`[] An array of column names to search within. - -* **options?** + * **options?** Optional parameters for the multi-match query. - `boosts`: An array of boost factors for each column (default is 1.0 for all). - `operator`: The logical operator to use for combining terms in the query (default is "OR"). - -* **options.boosts?**: `number`[] - -* **options.operator?**: [`Operator`](../enumerations/Operator.md) + * **options.boosts?**: `number`[] + * **options.operator?**: [`Operator`](../enumerations/Operator.md) #### Returns diff --git a/docs/src/js/classes/NativeJsHeaderProvider.md b/docs/src/js/classes/NativeJsHeaderProvider.md index 9c35f937a..9fa3ab863 100644 --- a/docs/src/js/classes/NativeJsHeaderProvider.md +++ b/docs/src/js/classes/NativeJsHeaderProvider.md @@ -21,8 +21,7 @@ new NativeJsHeaderProvider(getHeadersCallback): NativeJsHeaderProvider Create a new JsHeaderProvider from a JavaScript callback #### Parameters - -* **getHeadersCallback** + * **getHeadersCallback** #### Returns diff --git a/docs/src/js/classes/OAuthHeaderProvider.md b/docs/src/js/classes/OAuthHeaderProvider.md index 3ede0d686..d5cfb5729 100644 --- a/docs/src/js/classes/OAuthHeaderProvider.md +++ b/docs/src/js/classes/OAuthHeaderProvider.md @@ -51,11 +51,9 @@ new OAuthHeaderProvider(tokenFetcher, refreshBufferSeconds): OAuthHeaderProvider Initialize the OAuth provider. #### Parameters - -* **tokenFetcher** + * **tokenFetcher** Function to fetch new tokens. Should return object with 'accessToken' and optionally 'expiresIn'. - -* **refreshBufferSeconds**: `number` = `300` + * **refreshBufferSeconds**: `number` = `300` Seconds before expiry to refresh token. Default 300 (5 minutes). #### Returns diff --git a/docs/src/js/classes/PermutationBuilder.md b/docs/src/js/classes/PermutationBuilder.md index 6988bf428..f72fb6754 100644 --- a/docs/src/js/classes/PermutationBuilder.md +++ b/docs/src/js/classes/PermutationBuilder.md @@ -46,8 +46,7 @@ filter(filter): PermutationBuilder Configure filtering for the permutation. #### Parameters - -* **filter**: `string` + * **filter**: `string` SQL filter expression #### Returns @@ -73,11 +72,9 @@ persist(connection, tableName): PermutationBuilder Configure the permutation to be persisted. #### Parameters - -* **connection**: [`Connection`](Connection.md) + * **connection**: [`Connection`](Connection.md) The connection to persist the permutation to - -* **tableName**: `string` + * **tableName**: `string` The name of the table to create #### Returns @@ -103,8 +100,7 @@ shuffle(options): PermutationBuilder Configure shuffling for the permutation. #### Parameters - -* **options**: [`ShuffleOptions`](../interfaces/ShuffleOptions.md) + * **options**: [`ShuffleOptions`](../interfaces/ShuffleOptions.md) Configuration for shuffling #### Returns @@ -134,8 +130,7 @@ splitCalculated(options): PermutationBuilder Configure calculated splits for the permutation. #### Parameters - -* **options**: [`SplitCalculatedOptions`](../interfaces/SplitCalculatedOptions.md) + * **options**: [`SplitCalculatedOptions`](../interfaces/SplitCalculatedOptions.md) Configuration for calculated splitting #### Returns @@ -161,8 +156,7 @@ splitHash(options): PermutationBuilder Configure hash-based splits for the permutation. #### Parameters - -* **options**: [`SplitHashOptions`](../interfaces/SplitHashOptions.md) + * **options**: [`SplitHashOptions`](../interfaces/SplitHashOptions.md) Configuration for hash-based splitting #### Returns @@ -192,8 +186,7 @@ splitRandom(options): PermutationBuilder Configure random splits for the permutation. #### Parameters - -* **options**: [`SplitRandomOptions`](../interfaces/SplitRandomOptions.md) + * **options**: [`SplitRandomOptions`](../interfaces/SplitRandomOptions.md) Configuration for random splitting #### Returns @@ -226,8 +219,7 @@ splitSequential(options): PermutationBuilder Configure sequential splits for the permutation. #### Parameters - -* **options**: [`SplitSequentialOptions`](../interfaces/SplitSequentialOptions.md) + * **options**: [`SplitSequentialOptions`](../interfaces/SplitSequentialOptions.md) Configuration for sequential splitting #### Returns diff --git a/docs/src/js/classes/PhraseQuery.md b/docs/src/js/classes/PhraseQuery.md index 48214a5d9..1824ae71e 100644 --- a/docs/src/js/classes/PhraseQuery.md +++ b/docs/src/js/classes/PhraseQuery.md @@ -28,18 +28,14 @@ new PhraseQuery( Creates an instance of `PhraseQuery`. #### Parameters - -* **query**: `string` + * **query**: `string` The phrase to search for in the specified column. - -* **column**: `string` + * **column**: `string` The name of the column to search within. - -* **options?** + * **options?** Optional parameters for the phrase query. - `slop`: The maximum number of intervening unmatched positions allowed between words in the phrase (default is 0). - -* **options.slop?**: `number` + * **options.slop?**: `number` #### Returns diff --git a/docs/src/js/classes/Query.md b/docs/src/js/classes/Query.md index b69069069..8e62ec330 100644 --- a/docs/src/js/classes/Query.md +++ b/docs/src/js/classes/Query.md @@ -86,8 +86,7 @@ protected execute(options?): AsyncGenerator, void, unknown> Execute the query and return the results as an #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns @@ -120,8 +119,7 @@ explainPlan(verbose): Promise Generates an explanation of the query execution plan. #### Parameters - -* **verbose**: `boolean` = `false` + * **verbose**: `boolean` = `false` If true, provides a more detailed explanation. Defaults to false. #### Returns @@ -177,8 +175,7 @@ filter(predicate): this A filter statement to be applied to this query. #### Parameters - -* **predicate**: `string` + * **predicate**: `string` #### Returns @@ -205,10 +202,8 @@ fullTextSearch(query, options?): this ``` #### Parameters - -* **query**: `string` \| [`FullTextQuery`](../interfaces/FullTextQuery.md) - -* **options?**: `Partial`<[`FullTextSearchOptions`](../interfaces/FullTextSearchOptions.md)> + * **query**: `string` \| [`FullTextQuery`](../interfaces/FullTextQuery.md) + * **options?**: `Partial`<[`FullTextSearchOptions`](../interfaces/FullTextSearchOptions.md)> #### Returns @@ -232,8 +227,7 @@ By default, a plain search has no limit. If this method is not called then every valid row from the table will be returned. #### Parameters - -* **limit**: `number` + * **limit**: `number` #### Returns @@ -268,8 +262,7 @@ fixed size list of floats) then the column does not need to be specified. If there is more than one vector column you must use #### Parameters - -* **vector**: [`IntoVector`](../type-aliases/IntoVector.md) + * **vector**: [`IntoVector`](../type-aliases/IntoVector.md) #### Returns @@ -308,10 +301,8 @@ nearestToText(query, columns?): Query ``` #### Parameters - -* **query**: `string` \| [`FullTextQuery`](../interfaces/FullTextQuery.md) - -* **columns?**: `string`[] + * **query**: `string` \| [`FullTextQuery`](../interfaces/FullTextQuery.md) + * **columns?**: `string`[] #### Returns @@ -330,8 +321,7 @@ Set the number of rows to skip before returning results. This is useful for pagination. #### Parameters - -* **offset**: `number` + * **offset**: `number` #### Returns @@ -393,8 +383,7 @@ For example, an SQL query might state `SELECT a + b AS combined, c`. The equiva input to this method would be: #### Parameters - -* **columns**: `string` \| `string`[] \| `Record`<`string`, `string`> \| `Map`<`string`, `string`> + * **columns**: `string` \| `string`[] \| `Record`<`string`, `string`> \| `Map`<`string`, `string`> #### Returns @@ -428,8 +417,7 @@ toArray(options?): Promise Collect the results as an array of objects. #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns @@ -450,8 +438,7 @@ toArrow(options?): Promise> Collect the results as an Arrow #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns @@ -478,8 +465,7 @@ A filter statement to be applied to this query. The filter should be supplied as an SQL query string. For example: #### Parameters - -* **predicate**: `string` + * **predicate**: `string` #### Returns diff --git a/docs/src/js/classes/QueryBase.md b/docs/src/js/classes/QueryBase.md index 1dd81ff98..504cae782 100644 --- a/docs/src/js/classes/QueryBase.md +++ b/docs/src/js/classes/QueryBase.md @@ -87,8 +87,7 @@ protected execute(options?): AsyncGenerator, void, unknown> Execute the query and return the results as an #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns @@ -117,8 +116,7 @@ explainPlan(verbose): Promise Generates an explanation of the query execution plan. #### Parameters - -* **verbose**: `boolean` = `false` + * **verbose**: `boolean` = `false` If true, provides a more detailed explanation. Defaults to false. #### Returns @@ -186,8 +184,7 @@ For example, an SQL query might state `SELECT a + b AS combined, c`. The equiva input to this method would be: #### Parameters - -* **columns**: `string` \| `string`[] \| `Record`<`string`, `string`> \| `Map`<`string`, `string`> + * **columns**: `string` \| `string`[] \| `Record`<`string`, `string`> \| `Map`<`string`, `string`> #### Returns @@ -217,8 +214,7 @@ toArray(options?): Promise Collect the results as an array of objects. #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns @@ -235,8 +231,7 @@ toArrow(options?): Promise> Collect the results as an Arrow #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns diff --git a/docs/src/js/classes/Session.md b/docs/src/js/classes/Session.md index bd449c912..a9712a003 100644 --- a/docs/src/js/classes/Session.md +++ b/docs/src/js/classes/Session.md @@ -33,10 +33,8 @@ Create a new session with custom cache sizes. Defaults to 1GB if not specified. #### Parameters - -* **indexCacheSizeBytes?**: `null` \| `bigint` - -* **metadataCacheSizeBytes?**: `null` \| `bigint` + * **indexCacheSizeBytes?**: `null` \| `bigint` + * **metadataCacheSizeBytes?**: `null` \| `bigint` #### Returns diff --git a/docs/src/js/classes/StaticHeaderProvider.md b/docs/src/js/classes/StaticHeaderProvider.md index f15ad9e5f..dc15e4a64 100644 --- a/docs/src/js/classes/StaticHeaderProvider.md +++ b/docs/src/js/classes/StaticHeaderProvider.md @@ -37,8 +37,7 @@ new StaticHeaderProvider(headers): StaticHeaderProvider Initialize with static headers. #### Parameters - -* **headers**: `Record`<`string`, `string`> + * **headers**: `Record`<`string`, `string`> Headers to return for every request. #### Returns diff --git a/docs/src/js/classes/Table.md b/docs/src/js/classes/Table.md index b2f72012f..734733011 100644 --- a/docs/src/js/classes/Table.md +++ b/docs/src/js/classes/Table.md @@ -46,11 +46,9 @@ abstract add(data, options?): Promise Insert records into this Table. #### Parameters - -* **data**: [`Data`](../type-aliases/Data.md) + * **data**: [`Data`](../type-aliases/Data.md) Records to be inserted into the Table - -* **options?**: `Partial`<[`AddDataOptions`](../interfaces/AddDataOptions.md)> + * **options?**: `Partial`<[`AddDataOptions`](../interfaces/AddDataOptions.md)> #### Returns @@ -70,8 +68,7 @@ abstract addColumns(newColumnTransforms): Promise Add new columns with defined values. #### Parameters - -* **newColumnTransforms**: `Field`<`any`> \| `Field`<`any`>[] \| `Schema`<`any`> \| [`AddColumnsSql`](../interfaces/AddColumnsSql.md)[] + * **newColumnTransforms**: `Field`<`any`> \| `Field`<`any`>[] \| `Schema`<`any`> \| [`AddColumnsSql`](../interfaces/AddColumnsSql.md)[] Either: - An array of objects with column names and SQL expressions to calculate values - A single Arrow Field defining one column with its data type (column will be initialized with null values) @@ -96,8 +93,7 @@ abstract alterColumns(columnAlterations): Promise Alter the name or nullability of columns. #### Parameters - -* **columnAlterations**: [`ColumnAlteration`](../interfaces/ColumnAlteration.md)[] + * **columnAlterations**: [`ColumnAlteration`](../interfaces/ColumnAlteration.md)[] One or more alterations to apply to columns. @@ -126,8 +122,7 @@ Calling this method will set the table into time-travel mode. If you wish to return to standard mode, call `checkoutLatest`. #### Parameters - -* **version**: `string` \| `number` + * **version**: `string` \| `number` The version to checkout, could be version number or tag #### Returns @@ -196,8 +191,7 @@ abstract countRows(filter?): Promise Count the total number of rows in the dataset. #### Parameters - -* **filter?**: `string` + * **filter?**: `string` #### Returns @@ -222,10 +216,8 @@ We currently don't support custom named indexes. The index name will always be `${column}_idx`. #### Parameters - -* **column**: `string` - -* **options?**: `Partial`<[`IndexOptions`](../interfaces/IndexOptions.md)> + * **column**: `string` + * **options?**: `Partial`<[`IndexOptions`](../interfaces/IndexOptions.md)> #### Returns @@ -268,8 +260,7 @@ abstract delete(predicate): Promise Delete the rows that satisfy the predicate. #### Parameters - -* **predicate**: `string` + * **predicate**: `string` #### Returns @@ -308,8 +299,7 @@ call ``compact_files`` to rewrite the data without the removed columns and then call ``cleanup_files`` to remove the old files. #### Parameters - -* **columnNames**: `string`[] + * **columnNames**: `string`[] The names of the columns to drop. These can be nested column references (e.g. "a.b.c") or top-level column names (e.g. "a"). @@ -332,8 +322,7 @@ abstract dropIndex(name): Promise Drop an index from the table. #### Parameters - -* **name**: `string` + * **name**: `string` The name of the index. This does not delete the index from disk, it just removes it from the table. To delete the index, run [Table#optimize](Table.md#optimize) after dropping the index. @@ -354,8 +343,7 @@ abstract indexStats(name): Promise List all the stats of a specified index #### Parameters - -* **name**: `string` + * **name**: `string` The name of the index. #### Returns @@ -460,8 +448,7 @@ abstract mergeInsert(on): MergeInsertBuilder ``` #### Parameters - -* **on**: `string` \| `string`[] + * **on**: `string` \| `string`[] #### Returns @@ -492,8 +479,7 @@ Modeled after ``VACUUM`` in PostgreSQL. modification operations. #### Parameters - -* **options?**: `Partial`<[`OptimizeOptions`](../interfaces/OptimizeOptions.md)> + * **options?**: `Partial`<[`OptimizeOptions`](../interfaces/OptimizeOptions.md)> #### Returns @@ -510,8 +496,7 @@ abstract prewarmIndex(name): Promise Prewarm an index in the table. #### Parameters - -* **name**: `string` + * **name**: `string` The name of the index. This will load the index into memory. This may reduce the cold-start time for future queries. If the index does not fit in the cache then this call may be @@ -643,14 +628,11 @@ Create a search query to find the nearest neighbors of the given query #### Parameters - -* **query**: `string` \| [`IntoVector`](../type-aliases/IntoVector.md) \| [`MultiVector`](../type-aliases/MultiVector.md) \| [`FullTextQuery`](../interfaces/FullTextQuery.md) + * **query**: `string` \| [`IntoVector`](../type-aliases/IntoVector.md) \| [`MultiVector`](../type-aliases/MultiVector.md) \| [`FullTextQuery`](../interfaces/FullTextQuery.md) the query, a vector or string - -* **queryType?**: `string` + * **queryType?**: `string` the type of the query, "vector", "fts", or "auto" - -* **ftsColumns?**: `string` \| `string`[] + * **ftsColumns?**: `string` \| `string`[] the columns to search in for full text search for now, only one column can be searched at a time. when "auto" is used, if the query is a string and an embedding function is defined, it will be treated as a vector query @@ -715,8 +697,7 @@ abstract takeOffsets(offsets): TakeQuery Create a query that returns a subset of the rows in the table. #### Parameters - -* **offsets**: `number`[] + * **offsets**: `number`[] The offsets of the rows to return. #### Returns @@ -736,8 +717,7 @@ abstract takeRowIds(rowIds): TakeQuery Create a query that returns a subset of the rows in the table. #### Parameters - -* **rowIds**: readonly (`number` \| `bigint`)[] + * **rowIds**: readonly (`number` \| `bigint`)[] The row ids of the rows to return. Row ids returned by `withRowId()` are `bigint`, so `bigint[]` is supported. For convenience / backwards compatibility, `number[]` is also accepted (for @@ -776,8 +756,7 @@ abstract update(opts): Promise Update existing records in the Table ##### Parameters - -* **opts**: `object` & `Partial`<[`UpdateOptions`](../interfaces/UpdateOptions.md)> + * **opts**: `object` & `Partial`<[`UpdateOptions`](../interfaces/UpdateOptions.md)> ##### Returns @@ -801,8 +780,7 @@ abstract update(opts): Promise Update existing records in the Table ##### Parameters - -* **opts**: `object` & `Partial`<[`UpdateOptions`](../interfaces/UpdateOptions.md)> + * **opts**: `object` & `Partial`<[`UpdateOptions`](../interfaces/UpdateOptions.md)> ##### Returns @@ -839,12 +817,10 @@ better performance with a single [`merge_insert`] call instead of repeatedly calilng this method. ##### Parameters - -* **updates**: `Record`<`string`, `string`> \| `Map`<`string`, `string`> + * **updates**: `Record`<`string`, `string`> \| `Map`<`string`, `string`> the columns to update - -* **options?**: `Partial`<[`UpdateOptions`](../interfaces/UpdateOptions.md)> + * **options?**: `Partial`<[`UpdateOptions`](../interfaces/UpdateOptions.md)> additional options to control the update behavior @@ -875,8 +851,7 @@ is the same thing as calling `nearestTo` on the builder returned by `query`. #### Parameters - -* **vector**: [`IntoVector`](../type-aliases/IntoVector.md) \| [`MultiVector`](../type-aliases/MultiVector.md) + * **vector**: [`IntoVector`](../type-aliases/IntoVector.md) \| [`MultiVector`](../type-aliases/MultiVector.md) #### Returns @@ -911,11 +886,9 @@ abstract waitForIndex(indexNames, timeoutSeconds): Promise Waits for asynchronous indexing to complete on the table. #### Parameters - -* **indexNames**: `string`[] + * **indexNames**: `string`[] The name of the indices to wait for - -* **timeoutSeconds**: `number` + * **timeoutSeconds**: `number` The number of seconds to wait before timing out This will raise an error if the indices are not created and fully indexed within the timeout. diff --git a/docs/src/js/classes/Tags.md b/docs/src/js/classes/Tags.md index 341673b37..bc78d9cf4 100644 --- a/docs/src/js/classes/Tags.md +++ b/docs/src/js/classes/Tags.md @@ -27,10 +27,8 @@ create(tag, version): Promise ``` #### Parameters - -* **tag**: `string` - -* **version**: `number` + * **tag**: `string` + * **version**: `number` #### Returns @@ -45,8 +43,7 @@ delete(tag): Promise ``` #### Parameters - -* **tag**: `string` + * **tag**: `string` #### Returns @@ -61,8 +58,7 @@ getVersion(tag): Promise ``` #### Parameters - -* **tag**: `string` + * **tag**: `string` #### Returns @@ -89,10 +85,8 @@ update(tag, version): Promise ``` #### Parameters - -* **tag**: `string` - -* **version**: `number` + * **tag**: `string` + * **version**: `number` #### Returns diff --git a/docs/src/js/classes/TakeQuery.md b/docs/src/js/classes/TakeQuery.md index 1329b99dc..90a55fa00 100644 --- a/docs/src/js/classes/TakeQuery.md +++ b/docs/src/js/classes/TakeQuery.md @@ -82,8 +82,7 @@ protected execute(options?): AsyncGenerator, void, unknown> Execute the query and return the results as an #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns @@ -116,8 +115,7 @@ explainPlan(verbose): Promise Generates an explanation of the query execution plan. #### Parameters - -* **verbose**: `boolean` = `false` + * **verbose**: `boolean` = `false` If true, provides a more detailed explanation. Defaults to false. #### Returns @@ -193,8 +191,7 @@ For example, an SQL query might state `SELECT a + b AS combined, c`. The equiva input to this method would be: #### Parameters - -* **columns**: `string` \| `string`[] \| `Record`<`string`, `string`> \| `Map`<`string`, `string`> + * **columns**: `string` \| `string`[] \| `Record`<`string`, `string`> \| `Map`<`string`, `string`> #### Returns @@ -228,8 +225,7 @@ toArray(options?): Promise Collect the results as an array of objects. #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns @@ -250,8 +246,7 @@ toArrow(options?): Promise> Collect the results as an Arrow #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns diff --git a/docs/src/js/classes/VectorColumnOptions.md b/docs/src/js/classes/VectorColumnOptions.md index 32165ea00..781e5c159 100644 --- a/docs/src/js/classes/VectorColumnOptions.md +++ b/docs/src/js/classes/VectorColumnOptions.md @@ -15,8 +15,7 @@ new VectorColumnOptions(values?): VectorColumnOptions ``` #### Parameters - -* **values?**: `Partial`<[`VectorColumnOptions`](VectorColumnOptions.md)> + * **values?**: `Partial`<[`VectorColumnOptions`](VectorColumnOptions.md)> #### Returns diff --git a/docs/src/js/classes/VectorQuery.md b/docs/src/js/classes/VectorQuery.md index 646c65cb6..6038a3fad 100644 --- a/docs/src/js/classes/VectorQuery.md +++ b/docs/src/js/classes/VectorQuery.md @@ -39,8 +39,7 @@ addQueryVector(vector): VectorQuery ``` #### Parameters - -* **vector**: [`IntoVector`](../type-aliases/IntoVector.md) + * **vector**: [`IntoVector`](../type-aliases/IntoVector.md) #### Returns @@ -127,8 +126,7 @@ This controls which column is compared to the query vector supplied in the call to #### Parameters - -* **column**: `string` + * **column**: `string` #### Returns @@ -150,10 +148,8 @@ distanceRange(lowerBound?, upperBound?): VectorQuery ``` #### Parameters - -* **lowerBound?**: `number` - -* **upperBound?**: `number` + * **lowerBound?**: `number` + * **upperBound?**: `number` #### Returns @@ -174,8 +170,7 @@ to some kind of distance metric. This parameter controls which distance metric use. See #### Parameters - -* **distanceType**: `"l2"` \| `"cosine"` \| `"dot"` + * **distanceType**: `"l2"` \| `"cosine"` \| `"dot"` #### Returns @@ -209,8 +204,7 @@ Increasing this value will increase the recall of your query but will also increase the latency of your query. The default value is 1.5*limit. #### Parameters - -* **ef**: `number` + * **ef**: `number` #### Returns @@ -227,8 +221,7 @@ protected execute(options?): AsyncGenerator, void, unknown> Execute the query and return the results as an #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns @@ -261,8 +254,7 @@ explainPlan(verbose): Promise Generates an explanation of the query execution plan. #### Parameters - -* **verbose**: `boolean` = `false` + * **verbose**: `boolean` = `false` If true, provides a more detailed explanation. Defaults to false. #### Returns @@ -318,8 +310,7 @@ filter(predicate): this A filter statement to be applied to this query. #### Parameters - -* **predicate**: `string` + * **predicate**: `string` #### Returns @@ -346,10 +337,8 @@ fullTextSearch(query, options?): this ``` #### Parameters - -* **query**: `string` \| [`FullTextQuery`](../interfaces/FullTextQuery.md) - -* **options?**: `Partial`<[`FullTextSearchOptions`](../interfaces/FullTextSearchOptions.md)> + * **query**: `string` \| [`FullTextQuery`](../interfaces/FullTextQuery.md) + * **options?**: `Partial`<[`FullTextSearchOptions`](../interfaces/FullTextSearchOptions.md)> #### Returns @@ -373,8 +362,7 @@ By default, a plain search has no limit. If this method is not called then every valid row from the table will be returned. #### Parameters - -* **limit**: `number` + * **limit**: `number` #### Returns @@ -401,8 +389,7 @@ a narrow filter to allow these queries to spend more time searching and avoid potential false negatives. #### Parameters - -* **maximumNprobes**: `number` + * **maximumNprobes**: `number` #### Returns @@ -424,8 +411,7 @@ filter. See `nprobes` for more details. Higher values will increase recall but will also increase latency. #### Parameters - -* **minimumNprobes**: `number` + * **minimumNprobes**: `number` #### Returns @@ -465,8 +451,7 @@ you can use `minimumNprobes` and `maximumNprobes`. This method sets both the minimum and maximum to the same value. #### Parameters - -* **nprobes**: `number` + * **nprobes**: `number` #### Returns @@ -485,8 +470,7 @@ Set the number of rows to skip before returning results. This is useful for pagination. #### Parameters - -* **offset**: `number` + * **offset**: `number` #### Returns @@ -590,8 +574,7 @@ and the quantized result vectors. This can be considerably different than the t distance between the query vector and the actual uncompressed vector. #### Parameters - -* **refineFactor**: `number` + * **refineFactor**: `number` #### Returns @@ -606,8 +589,7 @@ rerank(reranker): VectorQuery ``` #### Parameters - -* **reranker**: [`Reranker`](../namespaces/rerankers/interfaces/Reranker.md) + * **reranker**: [`Reranker`](../namespaces/rerankers/interfaces/Reranker.md) #### Returns @@ -642,8 +624,7 @@ For example, an SQL query might state `SELECT a + b AS combined, c`. The equiva input to this method would be: #### Parameters - -* **columns**: `string` \| `string`[] \| `Record`<`string`, `string`> \| `Map`<`string`, `string`> + * **columns**: `string` \| `string`[] \| `Record`<`string`, `string`> \| `Map`<`string`, `string`> #### Returns @@ -677,8 +658,7 @@ toArray(options?): Promise Collect the results as an array of objects. #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns @@ -699,8 +679,7 @@ toArrow(options?): Promise> Collect the results as an Arrow #### Parameters - -* **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> + * **options?**: `Partial`<[`QueryExecutionOptions`](../interfaces/QueryExecutionOptions.md)> #### Returns @@ -727,8 +706,7 @@ A filter statement to be applied to this query. The filter should be supplied as an SQL query string. For example: #### Parameters - -* **predicate**: `string` + * **predicate**: `string` #### Returns diff --git a/docs/src/js/enumerations/OAuthFlowType.md b/docs/src/js/enumerations/OAuthFlowType.md new file mode 100644 index 000000000..34aede280 --- /dev/null +++ b/docs/src/js/enumerations/OAuthFlowType.md @@ -0,0 +1,59 @@ +[**@lancedb/lancedb**](../README.md) • **Docs** + +*** + +[@lancedb/lancedb](../globals.md) / OAuthFlowType + +# Enumeration: OAuthFlowType + +OAuth authentication flow types. + +## Enumeration Members + +### AuthorizationCodePKCE + +```ts +AuthorizationCodePKCE: "authorization_code_pkce"; +``` + +Authorization Code with PKCE (interactive browser-based auth). + +*** + +### AzureManagedIdentity + +```ts +AzureManagedIdentity: "azure_managed_identity"; +``` + +Azure Managed Identity via IMDS. + +*** + +### ClientCredentials + +```ts +ClientCredentials: "client_credentials"; +``` + +Client Credentials grant (service-to-service / M2M). + +*** + +### DeviceCode + +```ts +DeviceCode: "device_code"; +``` + +Device Code grant (CLI / headless environments). + +*** + +### WorkloadIdentity + +```ts +WorkloadIdentity: "workload_identity"; +``` + +Workload Identity Federation (K8s, GitHub Actions). diff --git a/docs/src/js/functions/RecordBatchIterator.md b/docs/src/js/functions/RecordBatchIterator.md index 1ab5a8eff..aa5c0ac09 100644 --- a/docs/src/js/functions/RecordBatchIterator.md +++ b/docs/src/js/functions/RecordBatchIterator.md @@ -11,8 +11,7 @@ function RecordBatchIterator(promisedInner): AsyncGenerator, vo ``` ## Parameters - -* **promisedInner**: `Promise`<`RecordBatchIterator`> + * **promisedInner**: `Promise`<`RecordBatchIterator`> ## Returns diff --git a/docs/src/js/functions/connect.md b/docs/src/js/functions/connect.md index 009b7d785..15bb7bf9c 100644 --- a/docs/src/js/functions/connect.md +++ b/docs/src/js/functions/connect.md @@ -25,17 +25,13 @@ Accepted formats: - `db://host:port` - remote database (LanceDB cloud) ### Parameters - -* **uri**: `string` + * **uri**: `string` The uri of the database. If the database uri starts with `db://` then it connects to a remote database. - -* **options?**: `Partial`<[`ConnectionOptions`](../interfaces/ConnectionOptions.md)> + * **options?**: `Partial`<[`ConnectionOptions`](../interfaces/ConnectionOptions.md)> The options to use when connecting to the database - -* **session?**: [`Session`](../classes/Session.md) - -* **headerProvider?**: [`HeaderProvider`](../classes/HeaderProvider.md) \| () => `Record`<`string`, `string`> \| () => `Promise`<`Record`<`string`, `string`>> + * **session?**: [`Session`](../classes/Session.md) + * **headerProvider?**: [`HeaderProvider`](../classes/HeaderProvider.md) \| () => `Record`<`string`, `string`> \| () => `Promise`<`Record`<`string`, `string`>> ### Returns @@ -85,8 +81,7 @@ Accepted formats: - `db://host:port` - remote database (LanceDB cloud) ### Parameters - -* **options**: `Partial`<[`ConnectionOptions`](../interfaces/ConnectionOptions.md)> & `object` + * **options**: `Partial`<[`ConnectionOptions`](../interfaces/ConnectionOptions.md)> & `object` The options to use when connecting to the database ### Returns diff --git a/docs/src/js/functions/makeArrowTable.md b/docs/src/js/functions/makeArrowTable.md index 949f1ceff..4cb7423cc 100644 --- a/docs/src/js/functions/makeArrowTable.md +++ b/docs/src/js/functions/makeArrowTable.md @@ -46,12 +46,9 @@ rules are as follows: - Array => List ## Parameters - -* **data**: `Record`<`string`, `unknown`>[] - -* **options?**: `Partial`<[`MakeArrowTableOptions`](../classes/MakeArrowTableOptions.md)> - -* **metadata?**: `Map`<`string`, `string`> + * **data**: `Record`<`string`, `unknown`>[] + * **options?**: `Partial`<[`MakeArrowTableOptions`](../classes/MakeArrowTableOptions.md)> + * **metadata?**: `Map`<`string`, `string`> ## Returns diff --git a/docs/src/js/functions/packBits.md b/docs/src/js/functions/packBits.md index 63e9e0aa2..846d99e07 100644 --- a/docs/src/js/functions/packBits.md +++ b/docs/src/js/functions/packBits.md @@ -11,8 +11,7 @@ function packBits(data): number[] ``` ## Parameters - -* **data**: `number`[] + * **data**: `number`[] ## Returns diff --git a/docs/src/js/functions/permutationBuilder.md b/docs/src/js/functions/permutationBuilder.md index b7592d410..252cc2eaa 100644 --- a/docs/src/js/functions/permutationBuilder.md +++ b/docs/src/js/functions/permutationBuilder.md @@ -13,8 +13,7 @@ function permutationBuilder(table): PermutationBuilder Create a permutation builder for the given table. ## Parameters - -* **table**: [`Table`](../classes/Table.md) + * **table**: [`Table`](../classes/Table.md) The source table to create a permutation from ## Returns diff --git a/docs/src/js/globals.md b/docs/src/js/globals.md index 988f35dc6..fc87fe381 100644 --- a/docs/src/js/globals.md +++ b/docs/src/js/globals.md @@ -12,6 +12,7 @@ ## Enumerations - [FullTextQueryType](enumerations/FullTextQueryType.md) +- [OAuthFlowType](enumerations/OAuthFlowType.md) - [Occur](enumerations/Occur.md) - [Operator](enumerations/Operator.md) @@ -70,6 +71,8 @@ - [IvfPqOptions](interfaces/IvfPqOptions.md) - [IvfRqOptions](interfaces/IvfRqOptions.md) - [MergeResult](interfaces/MergeResult.md) +- [NativeOAuthConfig](interfaces/NativeOAuthConfig.md) +- [OAuthConfig](interfaces/OAuthConfig.md) - [OpenTableOptions](interfaces/OpenTableOptions.md) - [OptimizeOptions](interfaces/OptimizeOptions.md) - [OptimizeStats](interfaces/OptimizeStats.md) diff --git a/docs/src/js/interfaces/ConnectionOptions.md b/docs/src/js/interfaces/ConnectionOptions.md index 1ad0e127a..77cd2f812 100644 --- a/docs/src/js/interfaces/ConnectionOptions.md +++ b/docs/src/js/interfaces/ConnectionOptions.md @@ -64,6 +64,18 @@ client used by manifest-enabled native connections. *** +### oauthConfig? + +```ts +optional oauthConfig: NativeOAuthConfig; +``` + +(For LanceDB cloud only): OAuth configuration for IdP-based +authentication (e.g., Azure Entra ID). When set, token acquisition +and refresh are handled entirely in Rust. + +*** + ### readConsistencyInterval? ```ts diff --git a/docs/src/js/interfaces/NativeOAuthConfig.md b/docs/src/js/interfaces/NativeOAuthConfig.md new file mode 100644 index 000000000..bcffda960 --- /dev/null +++ b/docs/src/js/interfaces/NativeOAuthConfig.md @@ -0,0 +1,112 @@ +[**@lancedb/lancedb**](../README.md) • **Docs** + +*** + +[@lancedb/lancedb](../globals.md) / NativeOAuthConfig + +# Interface: NativeOAuthConfig + +OAuth configuration for LanceDB authentication. +All token acquisition and refresh is handled in the Rust layer. + +## Properties + +### callbackPort? + +```ts +optional callbackPort: number; +``` + +Port for local callback server (authorization_code_pkce, default: 8400). + +*** + +### clientId + +```ts +clientId: string; +``` + +Application / Client ID. + +*** + +### clientSecret? + +```ts +optional clientSecret: string; +``` + +Client secret (required for client_credentials). + +*** + +### flow? + +```ts +optional flow: string; +``` + +Authentication flow: "client_credentials", "authorization_code_pkce", +"device_code", "azure_managed_identity", "workload_identity" + +*** + +### issuerUrl + +```ts +issuerUrl: string; +``` + +OIDC issuer URL or OAuth authority URL. +For Azure: `https://login.microsoftonline.com/{tenant_id}/v2.0` + +*** + +### managedIdentityClientId? + +```ts +optional managedIdentityClientId: string; +``` + +Client ID for user-assigned managed identity (azure_managed_identity). + +*** + +### redirectUri? + +```ts +optional redirectUri: string; +``` + +Redirect URI (authorization_code_pkce flow). + +*** + +### refreshBufferSecs? + +```ts +optional refreshBufferSecs: number; +``` + +Seconds before expiry to trigger proactive refresh (default: 300). + +*** + +### scopes + +```ts +scopes: string[]; +``` + +OAuth scopes to request. For Azure: `["api://{app_id}/.default"]` + +*** + +### tokenFile? + +```ts +optional tokenFile: string; +``` + +Path to federated token file (workload_identity). diff --git a/docs/src/js/interfaces/OAuthConfig.md b/docs/src/js/interfaces/OAuthConfig.md new file mode 100644 index 000000000..5c76dd31c --- /dev/null +++ b/docs/src/js/interfaces/OAuthConfig.md @@ -0,0 +1,134 @@ +[**@lancedb/lancedb**](../README.md) • **Docs** + +*** + +[@lancedb/lancedb](../globals.md) / OAuthConfig + +# Interface: OAuthConfig + +OAuth configuration for LanceDB authentication. + +All token acquisition and refresh is handled in the Rust layer. +This config is passed through to Rust via napi-rs. + +## Examples + +```typescript +const config: OAuthConfig = { + issuerUrl: "https://login.microsoftonline.com/{tenant}/v2.0", + clientId: "app-id", + clientSecret: "secret", + scopes: ["api://lancedb-api/.default"], +}; +``` + +```typescript +const config: OAuthConfig = { + issuerUrl: "https://login.microsoftonline.com/{tenant}/v2.0", + clientId: "app-id", + scopes: ["api://lancedb-api/.default"], + flow: OAuthFlowType.AzureManagedIdentity, +}; +``` + +## Properties + +### callbackPort? + +```ts +optional callbackPort: number; +``` + +Port for local callback server (AuthorizationCodePKCE, default: 8400). + +*** + +### clientId + +```ts +clientId: string; +``` + +Application / Client ID. + +*** + +### clientSecret? + +```ts +optional clientSecret: string; +``` + +Client secret (required for ClientCredentials). + +*** + +### flow? + +```ts +optional flow: OAuthFlowType; +``` + +Authentication flow (default: ClientCredentials). + +*** + +### issuerUrl + +```ts +issuerUrl: string; +``` + +OIDC issuer URL or OAuth authority URL. +For Azure: `https://login.microsoftonline.com/{tenant_id}/v2.0` + +*** + +### managedIdentityClientId? + +```ts +optional managedIdentityClientId: string; +``` + +Client ID for user-assigned managed identity (AzureManagedIdentity). + +*** + +### redirectUri? + +```ts +optional redirectUri: string; +``` + +Redirect URI (AuthorizationCodePKCE flow). + +*** + +### refreshBufferSecs? + +```ts +optional refreshBufferSecs: number; +``` + +Seconds before expiry to trigger proactive refresh (default: 300). + +*** + +### scopes + +```ts +scopes: string[]; +``` + +OAuth scopes to request. +For Azure: `["api://{app_id}/.default"]` + +*** + +### tokenFile? + +```ts +optional tokenFile: string; +``` + +Path to federated token file (WorkloadIdentity). diff --git a/docs/src/js/namespaces/embedding/classes/EmbeddingFunction.md b/docs/src/js/namespaces/embedding/classes/EmbeddingFunction.md index 574a0d71f..4c5ca0bc6 100644 --- a/docs/src/js/namespaces/embedding/classes/EmbeddingFunction.md +++ b/docs/src/js/namespaces/embedding/classes/EmbeddingFunction.md @@ -58,8 +58,7 @@ computeQueryEmbeddings(data): Promise Apply variables to the config. #### Parameters - -* **config**: `Partial`<`M`> + * **config**: `Partial`<`M`> #### Returns @@ -173,8 +170,7 @@ sourceField(optionsOrDatatype): [DataType, Map, Map ``` #### Parameters - -* **conf**: [`EmbeddingFunctionConfig`](../interfaces/EmbeddingFunctionConfig.md) + * **conf**: [`EmbeddingFunctionConfig`](../interfaces/EmbeddingFunctionConfig.md) #### Returns @@ -54,8 +53,7 @@ Fetch an embedding function by name • **T** *extends* [`EmbeddingFunction`](EmbeddingFunction.md)<`unknown`, [`FunctionOptions`](../interfaces/FunctionOptions.md)> #### Parameters - -* **name**: `string` + * **name**: `string` The name of the function #### Returns @@ -71,8 +69,7 @@ getTableMetadata(functions): Map ``` #### Parameters - -* **functions**: [`EmbeddingFunctionConfig`](../interfaces/EmbeddingFunctionConfig.md)[] + * **functions**: [`EmbeddingFunctionConfig`](../interfaces/EmbeddingFunctionConfig.md)[] #### Returns @@ -89,8 +86,7 @@ getVar(name): undefined | string Get a variable. #### Parameters - -* **name**: `string` + * **name**: `string` #### Returns @@ -129,18 +125,15 @@ Register an embedding function • **T** *extends* [`EmbeddingFunctionConstructor`](../interfaces/EmbeddingFunctionConstructor.md)<[`EmbeddingFunction`](EmbeddingFunction.md)<`any`, [`FunctionOptions`](../interfaces/FunctionOptions.md)>> = [`EmbeddingFunctionConstructor`](../interfaces/EmbeddingFunctionConstructor.md)<[`EmbeddingFunction`](EmbeddingFunction.md)<`any`, [`FunctionOptions`](../interfaces/FunctionOptions.md)>> #### Parameters - -* **this**: [`EmbeddingFunctionRegistry`](EmbeddingFunctionRegistry.md) - -* **alias?**: `string` + * **this**: [`EmbeddingFunctionRegistry`](EmbeddingFunctionRegistry.md) + * **alias?**: `string` #### Returns `Function` ##### Parameters - -* **ctor**: `T` + * **ctor**: `T` ##### Returns @@ -161,8 +154,7 @@ reset(this): void reset the registry to the initial state #### Parameters - -* **this**: [`EmbeddingFunctionRegistry`](EmbeddingFunctionRegistry.md) + * **this**: [`EmbeddingFunctionRegistry`](EmbeddingFunctionRegistry.md) #### Returns @@ -187,10 +179,8 @@ whether to use a GPU for inference. The name must not contain colons. The default value can contain colons. #### Parameters - -* **name**: `string` - -* **value**: `string` + * **name**: `string` + * **value**: `string` #### Returns diff --git a/docs/src/js/namespaces/embedding/classes/TextEmbeddingFunction.md b/docs/src/js/namespaces/embedding/classes/TextEmbeddingFunction.md index 444c4c3f0..20a9f25a6 100644 --- a/docs/src/js/namespaces/embedding/classes/TextEmbeddingFunction.md +++ b/docs/src/js/namespaces/embedding/classes/TextEmbeddingFunction.md @@ -43,8 +43,7 @@ computeQueryEmbeddings(data): Promise Apply variables to the config. #### Parameters - -* **config**: `Partial`<`M`> + * **config**: `Partial`<`M`> #### Returns @@ -245,8 +240,7 @@ vectorField(optionsOrDatatype?): [DataType, Map any ``` ## Parameters - -* **name?**: `string` + * **name?**: `string` ## Returns `Function` ### Parameters - -* **ctor**: [`EmbeddingFunctionConstructor`](../interfaces/EmbeddingFunctionConstructor.md)<[`EmbeddingFunction`](../classes/EmbeddingFunction.md)<`any`, [`FunctionOptions`](../interfaces/FunctionOptions.md)>> + * **ctor**: [`EmbeddingFunctionConstructor`](../interfaces/EmbeddingFunctionConstructor.md)<[`EmbeddingFunction`](../classes/EmbeddingFunction.md)<`any`, [`FunctionOptions`](../interfaces/FunctionOptions.md)>> ### Returns diff --git a/docs/src/js/namespaces/embedding/interfaces/EmbeddingFunctionConstructor.md b/docs/src/js/namespaces/embedding/interfaces/EmbeddingFunctionConstructor.md index bdab1eab1..ac37df1b9 100644 --- a/docs/src/js/namespaces/embedding/interfaces/EmbeddingFunctionConstructor.md +++ b/docs/src/js/namespaces/embedding/interfaces/EmbeddingFunctionConstructor.md @@ -19,8 +19,7 @@ new EmbeddingFunctionConstructor(modelOptions?): T ``` #### Parameters - -* **modelOptions?**: `T`\[`"TOptions"`\] + * **modelOptions?**: `T`\[`"TOptions"`\] #### Returns diff --git a/docs/src/js/namespaces/embedding/interfaces/EmbeddingFunctionCreate.md b/docs/src/js/namespaces/embedding/interfaces/EmbeddingFunctionCreate.md index 3c751e26b..f157461fe 100644 --- a/docs/src/js/namespaces/embedding/interfaces/EmbeddingFunctionCreate.md +++ b/docs/src/js/namespaces/embedding/interfaces/EmbeddingFunctionCreate.md @@ -19,8 +19,7 @@ create(options?): CreateReturnType ``` #### Parameters - -* **options?**: `T`\[`"TOptions"`\] + * **options?**: `T`\[`"TOptions"`\] #### Returns diff --git a/docs/src/js/namespaces/rerankers/classes/RRFReranker.md b/docs/src/js/namespaces/rerankers/classes/RRFReranker.md index d054b7f0b..84e8359cb 100644 --- a/docs/src/js/namespaces/rerankers/classes/RRFReranker.md +++ b/docs/src/js/namespaces/rerankers/classes/RRFReranker.md @@ -20,12 +20,9 @@ rerankHybrid( ``` #### Parameters - -* **query**: `string` - -* **vecResults**: `RecordBatch`<`any`> - -* **ftsResults**: `RecordBatch`<`any`> + * **query**: `string` + * **vecResults**: `RecordBatch`<`any`> + * **ftsResults**: `RecordBatch`<`any`> #### Returns @@ -40,8 +37,7 @@ static create(k): Promise ``` #### Parameters - -* **k**: `number` = `60` + * **k**: `number` = `60` #### Returns diff --git a/docs/src/js/namespaces/rerankers/interfaces/Reranker.md b/docs/src/js/namespaces/rerankers/interfaces/Reranker.md index 1d0566730..a3b4f724f 100644 --- a/docs/src/js/namespaces/rerankers/interfaces/Reranker.md +++ b/docs/src/js/namespaces/rerankers/interfaces/Reranker.md @@ -18,12 +18,9 @@ rerankHybrid( ``` #### Parameters - -* **query**: `string` - -* **vecResults**: `RecordBatch`<`any`> - -* **ftsResults**: `RecordBatch`<`any`> + * **query**: `string` + * **vecResults**: `RecordBatch`<`any`> + * **ftsResults**: `RecordBatch`<`any`> #### Returns diff --git a/nodejs/lancedb/index.ts b/nodejs/lancedb/index.ts index 648af58ef..6c3a7d3bb 100644 --- a/nodejs/lancedb/index.ts +++ b/nodejs/lancedb/index.ts @@ -48,6 +48,7 @@ export { SplitHashOptions, SplitSequentialOptions, ShuffleOptions, + OAuthConfig as NativeOAuthConfig, } from "./native.js"; export { @@ -113,6 +114,8 @@ export { TokenResponse, } from "./header"; +export { OAuthConfig, OAuthFlowType } from "./oauth"; + export { MergeInsertBuilder, WriteExecutionOptions } from "./merge"; export * as embedding from "./embedding"; diff --git a/nodejs/lancedb/oauth.ts b/nodejs/lancedb/oauth.ts new file mode 100644 index 000000000..ac0cffd76 --- /dev/null +++ b/nodejs/lancedb/oauth.ts @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright The LanceDB Authors + +/** + * OAuth authentication flow types. + */ +export enum OAuthFlowType { + /** Client Credentials grant (service-to-service / M2M). */ + ClientCredentials = "client_credentials", + /** Authorization Code with PKCE (interactive browser-based auth). */ + AuthorizationCodePKCE = "authorization_code_pkce", + /** Device Code grant (CLI / headless environments). */ + DeviceCode = "device_code", + /** Azure Managed Identity via IMDS. */ + AzureManagedIdentity = "azure_managed_identity", + /** Workload Identity Federation (K8s, GitHub Actions). */ + WorkloadIdentity = "workload_identity", +} + +/** + * OAuth configuration for LanceDB authentication. + * + * All token acquisition and refresh is handled in the Rust layer. + * This config is passed through to Rust via napi-rs. + * + * @example Client Credentials (service-to-service): + * ```typescript + * const config: OAuthConfig = { + * issuerUrl: "https://login.microsoftonline.com/{tenant}/v2.0", + * clientId: "app-id", + * clientSecret: "secret", + * scopes: ["api://lancedb-api/.default"], + * }; + * ``` + * + * @example Azure Managed Identity: + * ```typescript + * const config: OAuthConfig = { + * issuerUrl: "https://login.microsoftonline.com/{tenant}/v2.0", + * clientId: "app-id", + * scopes: ["api://lancedb-api/.default"], + * flow: OAuthFlowType.AzureManagedIdentity, + * }; + * ``` + */ +export interface OAuthConfig { + /** + * OIDC issuer URL or OAuth authority URL. + * For Azure: `https://login.microsoftonline.com/{tenant_id}/v2.0` + */ + issuerUrl: string; + + /** Application / Client ID. */ + clientId: string; + + /** + * OAuth scopes to request. + * For Azure: `["api://{app_id}/.default"]` + */ + scopes: string[]; + + /** Authentication flow (default: ClientCredentials). */ + flow?: OAuthFlowType; + + /** Client secret (required for ClientCredentials). */ + clientSecret?: string; + + /** Redirect URI (AuthorizationCodePKCE flow). */ + redirectUri?: string; + + /** Port for local callback server (AuthorizationCodePKCE, default: 8400). */ + callbackPort?: number; + + /** Client ID for user-assigned managed identity (AzureManagedIdentity). */ + managedIdentityClientId?: string; + + /** Path to federated token file (WorkloadIdentity). */ + tokenFile?: string; + + /** Seconds before expiry to trigger proactive refresh (default: 300). */ + refreshBufferSecs?: number; +} diff --git a/nodejs/src/connection.rs b/nodejs/src/connection.rs index 09be9465f..ddcede873 100644 --- a/nodejs/src/connection.rs +++ b/nodejs/src/connection.rs @@ -85,6 +85,11 @@ impl Connection { builder = builder.client_config(rust_config); + if let Some(oauth_config) = options.oauth_config { + let config: lancedb::remote::oauth::OAuthConfig = oauth_config.into(); + builder = builder.oauth_config(config); + } + if let Some(api_key) = options.api_key { builder = builder.api_key(&api_key); } diff --git a/nodejs/src/lib.rs b/nodejs/src/lib.rs index 87bc97ce7..71352257c 100644 --- a/nodejs/src/lib.rs +++ b/nodejs/src/lib.rs @@ -60,6 +60,10 @@ pub struct ConnectionOptions { /// (For LanceDB cloud only): the host to use for LanceDB cloud. Used /// for testing purposes. pub host_override: Option, + /// (For LanceDB cloud only): OAuth configuration for IdP-based + /// authentication (e.g., Azure Entra ID). When set, token acquisition + /// and refresh are handled entirely in Rust. + pub oauth_config: Option, } #[napi(object)] diff --git a/nodejs/src/remote.rs b/nodejs/src/remote.rs index 8cfcbc984..4a15546db 100644 --- a/nodejs/src/remote.rs +++ b/nodejs/src/remote.rs @@ -140,6 +140,67 @@ impl From for lancedb::remote::TlsConfig { } } +/// OAuth configuration for LanceDB authentication. +/// All token acquisition and refresh is handled in the Rust layer. +#[napi(object)] +#[derive(Debug, Clone)] +pub struct OAuthConfig { + /// OIDC issuer URL or OAuth authority URL. + /// For Azure: `https://login.microsoftonline.com/{tenant_id}/v2.0` + pub issuer_url: String, + /// Application / Client ID. + pub client_id: String, + /// OAuth scopes to request. For Azure: `["api://{app_id}/.default"]` + pub scopes: Vec, + /// Authentication flow: "client_credentials", "authorization_code_pkce", + /// "device_code", "azure_managed_identity", "workload_identity" + pub flow: Option, + /// Client secret (required for client_credentials). + pub client_secret: Option, + /// Redirect URI (authorization_code_pkce flow). + pub redirect_uri: Option, + /// Port for local callback server (authorization_code_pkce, default: 8400). + pub callback_port: Option, + /// Client ID for user-assigned managed identity (azure_managed_identity). + pub managed_identity_client_id: Option, + /// Path to federated token file (workload_identity). + pub token_file: Option, + /// Seconds before expiry to trigger proactive refresh (default: 300). + pub refresh_buffer_secs: Option, +} + +impl From for lancedb::remote::oauth::OAuthConfig { + fn from(config: OAuthConfig) -> Self { + use lancedb::remote::oauth::OAuthFlow; + + let flow = match config.flow.as_deref().unwrap_or("client_credentials") { + "authorization_code_pkce" => OAuthFlow::AuthorizationCodePKCE { + redirect_uri: config.redirect_uri, + callback_port: config.callback_port, + }, + "device_code" => OAuthFlow::DeviceCode, + "azure_managed_identity" => OAuthFlow::AzureManagedIdentity { + client_id: config.managed_identity_client_id, + }, + "workload_identity" => OAuthFlow::WorkloadIdentity { + token_file: config + .token_file + .expect("tokenFile is required for workload_identity flow"), + }, + other => panic!("Unknown OAuth flow type: {other}"), + }; + + Self { + issuer_url: config.issuer_url, + client_id: config.client_id, + client_secret: config.client_secret, + scopes: config.scopes, + flow, + refresh_buffer_secs: config.refresh_buffer_secs.map(|v| v as u64), + } + } +} + impl From for lancedb::remote::ClientConfig { fn from(config: ClientConfig) -> Self { Self { diff --git a/python/python/lancedb/__init__.py b/python/python/lancedb/__init__.py index efeed258f..89399b16f 100644 --- a/python/python/lancedb/__init__.py +++ b/python/python/lancedb/__init__.py @@ -320,6 +320,7 @@ async def connect_async( session: Optional[Session] = None, manifest_enabled: bool = False, namespace_client_properties: Optional[Dict[str, str]] = None, + oauth_config=None, ) -> AsyncConnection: """Connect to a LanceDB database. @@ -410,6 +411,7 @@ async def connect_async( session, manifest_enabled, namespace_client_properties, + oauth_config, ) ) diff --git a/python/python/lancedb/_lancedb.pyi b/python/python/lancedb/_lancedb.pyi index 8811723e2..5e9efabe1 100644 --- a/python/python/lancedb/_lancedb.pyi +++ b/python/python/lancedb/_lancedb.pyi @@ -247,6 +247,7 @@ async def connect( session: Optional[Session], manifest_enabled: bool = False, namespace_client_properties: Optional[Dict[str, str]] = None, + oauth_config: Optional[Any] = None, ) -> Connection: ... class RecordBatchStream: diff --git a/python/python/lancedb/remote/__init__.py b/python/python/lancedb/remote/__init__.py index 289e28942..a6ef55eb5 100644 --- a/python/python/lancedb/remote/__init__.py +++ b/python/python/lancedb/remote/__init__.py @@ -9,6 +9,7 @@ from typing import List, Optional from lancedb import __version__ from .header import HeaderProvider +from .oauth import OAuthConfig, OAuthFlowType __all__ = [ "TimeoutConfig", @@ -16,6 +17,8 @@ __all__ = [ "TlsConfig", "ClientConfig", "HeaderProvider", + "OAuthConfig", + "OAuthFlowType", ] diff --git a/python/python/lancedb/remote/oauth.py b/python/python/lancedb/remote/oauth.py new file mode 100644 index 000000000..4b588c16c --- /dev/null +++ b/python/python/lancedb/remote/oauth.py @@ -0,0 +1,90 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright The LanceDB Authors + +from dataclasses import dataclass +from enum import Enum +from typing import List, Optional + + +class OAuthFlowType(str, Enum): + """OAuth authentication flow types.""" + + CLIENT_CREDENTIALS = "client_credentials" + """Client Credentials grant (service-to-service / M2M).""" + + AUTHORIZATION_CODE_PKCE = "authorization_code_pkce" + """Authorization Code with PKCE (interactive browser-based auth).""" + + DEVICE_CODE = "device_code" + """Device Code grant (CLI / headless environments).""" + + AZURE_MANAGED_IDENTITY = "azure_managed_identity" + """Azure Managed Identity via IMDS.""" + + WORKLOAD_IDENTITY = "workload_identity" + """Workload Identity Federation (K8s, GitHub Actions).""" + + +@dataclass +class OAuthConfig: + """OAuth configuration for LanceDB authentication. + + All token acquisition and refresh is handled in the Rust layer. + This config is passed through to Rust via PyO3. + + Parameters + ---------- + issuer_url : str + OIDC issuer URL or OAuth authority URL. + For Azure: ``https://login.microsoftonline.com/{tenant_id}/v2.0`` + client_id : str + Application / Client ID. + scopes : List[str] + OAuth scopes to request. + For Azure: ``["api://{app_id}/.default"]`` + flow : OAuthFlowType + Authentication flow to use. Default: CLIENT_CREDENTIALS. + client_secret : Optional[str] + Client secret (required for CLIENT_CREDENTIALS). + redirect_uri : Optional[str] + Redirect URI for AUTHORIZATION_CODE_PKCE flow. + callback_port : Optional[int] + Port for local HTTP callback server (AUTHORIZATION_CODE_PKCE, default: 8400). + managed_identity_client_id : Optional[str] + Client ID for user-assigned managed identity (AZURE_MANAGED_IDENTITY). + token_file : Optional[str] + Path to federated token file (WORKLOAD_IDENTITY). + refresh_buffer_secs : Optional[int] + Seconds before expiry to trigger proactive refresh (default: 300). + + Examples + -------- + Client Credentials (service-to-service): + + >>> config = OAuthConfig( + ... issuer_url="https://login.microsoftonline.com/{tenant}/v2.0", + ... client_id="app-id", + ... client_secret="secret", + ... scopes=["api://lancedb-api/.default"], + ... ) + + Azure Managed Identity: + + >>> config = OAuthConfig( + ... issuer_url="https://login.microsoftonline.com/{tenant}/v2.0", + ... client_id="app-id", + ... scopes=["api://lancedb-api/.default"], + ... flow=OAuthFlowType.AZURE_MANAGED_IDENTITY, + ... ) + """ + + issuer_url: str + client_id: str + scopes: List[str] + flow: OAuthFlowType = OAuthFlowType.CLIENT_CREDENTIALS + client_secret: Optional[str] = None + redirect_uri: Optional[str] = None + callback_port: Optional[int] = None + managed_identity_client_id: Optional[str] = None + token_file: Optional[str] = None + refresh_buffer_secs: Optional[int] = None diff --git a/python/src/connection.rs b/python/src/connection.rs index 703b44424..8070c2d14 100644 --- a/python/src/connection.rs +++ b/python/src/connection.rs @@ -524,7 +524,7 @@ impl Connection { } #[pyfunction] -#[pyo3(signature = (uri, api_key=None, region=None, host_override=None, read_consistency_interval=None, client_config=None, storage_options=None, session=None, manifest_enabled=false, namespace_client_properties=None))] +#[pyo3(signature = (uri, api_key=None, region=None, host_override=None, read_consistency_interval=None, client_config=None, storage_options=None, session=None, manifest_enabled=false, namespace_client_properties=None, oauth_config=None))] #[allow(clippy::too_many_arguments)] pub fn connect( py: Python<'_>, @@ -538,6 +538,7 @@ pub fn connect( session: Option, manifest_enabled: bool, namespace_client_properties: Option>, + oauth_config: Option, ) -> PyResult> { future_into_py(py, async move { let mut builder = lancedb::connect(&uri); @@ -567,6 +568,10 @@ pub fn connect( if let Some(client_config) = client_config { builder = builder.client_config(client_config.into()); } + if let Some(oauth_config) = oauth_config { + let config: lancedb::remote::oauth::OAuthConfig = oauth_config.into(); + builder = builder.oauth_config(config); + } if let Some(session) = session { builder = builder.session(session.inner.clone()); } diff --git a/python/src/lib.rs b/python/src/lib.rs index d0e933dba..e764a9ff1 100644 --- a/python/src/lib.rs +++ b/python/src/lib.rs @@ -26,6 +26,7 @@ pub mod expr; pub mod header; pub mod index; pub mod namespace; +pub mod oauth; pub mod permutation; pub mod query; pub mod runtime; diff --git a/python/src/oauth.rs b/python/src/oauth.rs new file mode 100644 index 000000000..ad11f6951 --- /dev/null +++ b/python/src/oauth.rs @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright The LanceDB Authors + +use pyo3::FromPyObject; + +use lancedb::remote::oauth::{OAuthConfig, OAuthFlow}; + +/// Python-side OAuth configuration, extracted via FromPyObject. +/// Maps to `lancedb.remote.oauth.OAuthConfig` Python dataclass. +#[derive(FromPyObject)] +pub struct PyOAuthConfig { + pub issuer_url: String, + pub client_id: String, + pub scopes: Vec, + pub flow: String, + pub client_secret: Option, + pub redirect_uri: Option, + pub callback_port: Option, + pub managed_identity_client_id: Option, + pub token_file: Option, + pub refresh_buffer_secs: Option, +} + +impl From for OAuthConfig { + fn from(py: PyOAuthConfig) -> Self { + let flow = match py.flow.as_str() { + "client_credentials" => OAuthFlow::ClientCredentials, + "authorization_code_pkce" => OAuthFlow::AuthorizationCodePKCE { + redirect_uri: py.redirect_uri, + callback_port: py.callback_port, + }, + "device_code" => OAuthFlow::DeviceCode, + "azure_managed_identity" => OAuthFlow::AzureManagedIdentity { + client_id: py.managed_identity_client_id, + }, + "workload_identity" => OAuthFlow::WorkloadIdentity { + token_file: py + .token_file + .expect("token_file is required for workload_identity flow"), + }, + other => panic!("Unknown OAuth flow type: {other}"), + }; + + OAuthConfig { + issuer_url: py.issuer_url, + client_id: py.client_id, + client_secret: py.client_secret, + scopes: py.scopes, + flow, + refresh_buffer_secs: py.refresh_buffer_secs, + } + } +} diff --git a/rust/lancedb/Cargo.toml b/rust/lancedb/Cargo.toml index b05302b9b..8caf85b96 100644 --- a/rust/lancedb/Cargo.toml +++ b/rust/lancedb/Cargo.toml @@ -75,6 +75,11 @@ reqwest = { version = "0.12.0", default-features = false, features = [ "stream", ], optional = true } http = { version = "1", optional = true } # Matching what is in reqwest +# OAuth dependencies (used by remote feature) +sha2 = { version = "0.10", optional = true } +base64 = { version = "0.22", optional = true } +urlencoding = { version = "2", optional = true } +open = { version = "5", optional = true } uuid = { version = "1.7.0", features = ["v4"] } polars-arrow = { version = ">=0.37,<0.40.0", optional = true } polars = { version = ">=0.37,<0.40.0", optional = true } @@ -128,7 +133,7 @@ huggingface = [ "lance-namespace-impls/dir-huggingface", ] dynamodb = ["lance/dynamodb", "aws"] -remote = ["dep:reqwest", "dep:http", "lance-namespace-impls/rest", "lance-namespace-impls/rest-adapter"] +remote = ["dep:reqwest", "dep:http", "dep:sha2", "dep:base64", "dep:urlencoding", "dep:open", "lance-namespace-impls/rest", "lance-namespace-impls/rest-adapter"] fp16kernels = ["lance-linalg/fp16kernels"] s3-test = [] bedrock = ["dep:aws-sdk-bedrockruntime"] diff --git a/rust/lancedb/src/connection.rs b/rust/lancedb/src/connection.rs index 8034c2a53..a0f18d8a7 100644 --- a/rust/lancedb/src/connection.rs +++ b/rust/lancedb/src/connection.rs @@ -622,6 +622,8 @@ pub struct ConnectRequest { pub struct ConnectBuilder { request: ConnectRequest, embedding_registry: Option>, + #[cfg(feature = "remote")] + oauth_config: Option, } #[cfg(feature = "remote")] @@ -643,6 +645,8 @@ impl ConnectBuilder { session: None, }, embedding_registry: None, + #[cfg(feature = "remote")] + oauth_config: None, } } @@ -731,6 +735,19 @@ impl ConnectBuilder { self } + /// Configure OAuth authentication for LanceDB Cloud/Enterprise. + /// + /// This creates an [`OAuthHeaderProvider`](crate::remote::OAuthHeaderProvider) + /// from the given config and sets it as the header provider, replacing any + /// previously configured header provider or API key. + /// + /// Token acquisition and refresh are handled entirely in Rust. + #[cfg(feature = "remote")] + pub fn oauth_config(mut self, config: crate::remote::oauth::OAuthConfig) -> Self { + self.oauth_config = Some(config); + self + } + /// Provide a custom [`EmbeddingRegistry`] to use for this connection. pub fn embedding_registry(mut self, registry: Arc) -> Self { self.embedding_registry = Some(registry); @@ -874,9 +891,29 @@ impl ConnectBuilder { let region = options.region.ok_or_else(|| Error::InvalidInput { message: "A region is required when connecting to LanceDb Cloud".to_string(), })?; - let api_key = options.api_key.ok_or_else(|| Error::InvalidInput { - message: "An api_key is required when connecting to LanceDb Cloud".to_string(), - })?; + + // When OAuth is configured, api_key is not required + let api_key = match (&self.oauth_config, &options.api_key) { + (Some(_), None) => String::new(), + (Some(_), Some(key)) => key.clone(), + (None, Some(key)) => key.clone(), + (None, None) => { + return Err(Error::InvalidInput { + message: + "An api_key or oauth_config is required when connecting to LanceDb Cloud" + .to_string(), + }); + } + }; + + let mut client_config = self.request.client_config; + + // Apply OAuth header provider if configured + if let Some(oauth_config) = self.oauth_config { + let provider = crate::remote::oauth::OAuthHeaderProvider::new(oauth_config)?; + client_config.header_provider = + Some(Arc::new(provider) as Arc); + } let storage_options = StorageOptions(options.storage_options.clone()); let internal = Arc::new(crate::remote::db::RemoteDatabase::try_new( @@ -884,7 +921,7 @@ impl ConnectBuilder { &api_key, ®ion, options.host_override, - self.request.client_config, + client_config, storage_options.into(), )?); Ok(Connection { diff --git a/rust/lancedb/src/remote.rs b/rust/lancedb/src/remote.rs index 866ecdcd8..25e19c537 100644 --- a/rust/lancedb/src/remote.rs +++ b/rust/lancedb/src/remote.rs @@ -8,6 +8,7 @@ pub(crate) mod client; pub(crate) mod db; +pub mod oauth; mod retry; pub(crate) mod table; pub(crate) mod util; @@ -20,3 +21,4 @@ const JSON_CONTENT_TYPE: &str = "application/json"; pub use client::{ClientConfig, HeaderProvider, RetryConfig, TimeoutConfig, TlsConfig}; pub use db::{RemoteDatabaseOptions, RemoteDatabaseOptionsBuilder}; +pub use oauth::{OAuthConfig, OAuthFlow, OAuthHeaderProvider}; diff --git a/rust/lancedb/src/remote/oauth.rs b/rust/lancedb/src/remote/oauth.rs new file mode 100644 index 000000000..5150f1b93 --- /dev/null +++ b/rust/lancedb/src/remote/oauth.rs @@ -0,0 +1,906 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright The LanceDB Authors + +use std::collections::HashMap; +use std::sync::Arc; +use std::time::{Duration, Instant}; + +use log::{debug, info, warn}; +use reqwest::Client; +use serde::Deserialize; +use tokio::sync::RwLock; + +use crate::error::{Error, Result}; +use crate::remote::client::HeaderProvider; + +const DEFAULT_REFRESH_BUFFER_SECS: u64 = 300; +const DEFAULT_CALLBACK_PORT: u16 = 8400; +const AZURE_IMDS_ENDPOINT: &str = "http://169.254.169.254/metadata/identity/oauth2/token"; +const AZURE_IMDS_API_VERSION: &str = "2018-02-01"; + +/// OAuth authentication flow configuration. +#[derive(Debug, Clone)] +pub enum OAuthFlow { + /// Client Credentials grant (service-to-service / M2M). + /// Requires `client_secret` in [`OAuthConfig`]. + ClientCredentials, + + /// Authorization Code with PKCE (interactive browser-based auth). + AuthorizationCodePKCE { + /// Redirect URI (default: `http://localhost:{callback_port}/callback`) + redirect_uri: Option, + /// Port for the local HTTP callback server (default: 8400) + callback_port: Option, + }, + + /// Device Code grant (CLI / headless environments). + /// Displays a verification URL and user code for out-of-band authentication. + DeviceCode, + + /// Azure Managed Identity via IMDS. + /// Works on Azure VMs, AKS, App Service, and Azure Functions. + AzureManagedIdentity { + /// Client ID for user-assigned managed identity. + /// Omit for system-assigned managed identity. + client_id: Option, + }, + + /// Workload Identity Federation. + /// Exchanges a platform token (K8s service account, GitHub OIDC) for an IdP token. + WorkloadIdentity { + /// Path to the federated token file + /// (e.g. `AZURE_FEDERATED_TOKEN_FILE`). + token_file: String, + }, +} + +/// OAuth configuration for LanceDB authentication. +/// +/// All token acquisition and refresh is handled in the Rust layer. +/// Python and TypeScript bindings expose this as a plain config object. +#[derive(Debug, Clone)] +pub struct OAuthConfig { + /// OIDC issuer URL or OAuth authority URL. + /// For Azure: `https://login.microsoftonline.com/{tenant_id}/v2.0` + pub issuer_url: String, + + /// Application / Client ID. + pub client_id: String, + + /// Client secret (required for `ClientCredentials`, optional for others). + pub client_secret: Option, + + /// OAuth scopes to request. + /// For Azure: `["api://{app_id}/.default"]` + pub scopes: Vec, + + /// Authentication flow to use. + pub flow: OAuthFlow, + + /// Seconds before token expiry to trigger proactive refresh (default: 300). + pub refresh_buffer_secs: Option, +} + +// -- OIDC Discovery -- + +#[derive(Debug, Deserialize)] +struct OidcDiscovery { + token_endpoint: String, + authorization_endpoint: Option, + device_authorization_endpoint: Option, +} + +// -- Token Response -- + +#[derive(Debug, Deserialize)] +struct TokenResponse { + access_token: String, + #[serde(default)] + refresh_token: Option, + /// Token lifetime in seconds. + /// Some providers (Azure IMDS) return this as a string, so we accept both. + #[serde(default, deserialize_with = "deserialize_optional_u64_or_string")] + expires_in: Option, + #[serde(default)] + #[allow(dead_code)] + token_type: Option, +} + +fn deserialize_optional_u64_or_string<'de, D>( + deserializer: D, +) -> std::result::Result, D::Error> +where + D: serde::Deserializer<'de>, +{ + use serde::de; + + struct U64OrString; + impl<'de> de::Visitor<'de> for U64OrString { + type Value = Option; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a u64, a numeric string, or null") + } + + fn visit_u64(self, v: u64) -> std::result::Result { + Ok(Some(v)) + } + + fn visit_i64(self, v: i64) -> std::result::Result { + Ok(Some(v as u64)) + } + + fn visit_str(self, v: &str) -> std::result::Result { + v.parse::().map(Some).map_err(de::Error::custom) + } + + fn visit_none(self) -> std::result::Result { + Ok(None) + } + + fn visit_unit(self) -> std::result::Result { + Ok(None) + } + } + + deserializer.deserialize_any(U64OrString) +} + +// -- Device Code Response -- + +#[derive(Debug, Deserialize)] +struct DeviceCodeResponse { + device_code: String, + user_code: String, + verification_uri: String, + #[serde(default)] + verification_uri_complete: Option, + expires_in: u64, + interval: Option, +} + +// -- Internal Token State -- + +struct TokenState { + access_token: Option, + refresh_token: Option, + expires_at: Option, +} + +impl TokenState { + fn new() -> Self { + Self { + access_token: None, + refresh_token: None, + expires_at: None, + } + } + + fn is_expired(&self, buffer: Duration) -> bool { + match (self.access_token.as_ref(), self.expires_at) { + (Some(_), Some(expires_at)) => Instant::now() + buffer >= expires_at, + (None, _) => true, + (Some(_), None) => false, // no expiry info, assume valid + } + } + + fn update(&mut self, resp: &TokenResponse) { + self.access_token = Some(resp.access_token.clone()); + if resp.refresh_token.is_some() { + self.refresh_token = resp.refresh_token.clone(); + } + self.expires_at = resp + .expires_in + .map(|secs| Instant::now() + Duration::from_secs(secs)); + } +} + +/// OAuth header provider that manages the full token lifecycle. +/// +/// Implements [`HeaderProvider`] to inject `Authorization: Bearer ` +/// headers into every LanceDB request, with automatic token refresh. +pub struct OAuthHeaderProvider { + config: OAuthConfig, + http_client: Client, + token_state: Arc>, + /// Cached OIDC discovery document + discovery: Arc>>, + refresh_buffer: Duration, +} + +impl std::fmt::Debug for OAuthHeaderProvider { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("OAuthHeaderProvider") + .field("issuer_url", &self.config.issuer_url) + .field("client_id", &self.config.client_id) + .field("flow", &self.config.flow) + .finish() + } +} + +impl OAuthHeaderProvider { + /// Create a new OAuth header provider from configuration. + pub fn new(config: OAuthConfig) -> Result { + // Validate config upfront + if matches!(config.flow, OAuthFlow::ClientCredentials) && config.client_secret.is_none() { + return Err(Error::InvalidInput { + message: "client_secret is required for ClientCredentials flow".to_string(), + }); + } + if config.scopes.is_empty() { + return Err(Error::InvalidInput { + message: "At least one OAuth scope is required".to_string(), + }); + } + + let http_client = Client::builder() + .timeout(Duration::from_secs(30)) + .build() + .map_err(|e| Error::Runtime { + message: format!("Failed to create HTTP client for OAuth: {e}"), + })?; + + let refresh_buffer = Duration::from_secs( + config + .refresh_buffer_secs + .unwrap_or(DEFAULT_REFRESH_BUFFER_SECS), + ); + + Ok(Self { + config, + http_client, + token_state: Arc::new(RwLock::new(TokenState::new())), + discovery: Arc::new(RwLock::new(None)), + refresh_buffer, + }) + } + + /// Get a valid access token, refreshing if necessary. + async fn get_valid_token(&self) -> Result { + // Fast path: check if current token is still valid + { + let state = self.token_state.read().await; + if !state.is_expired(self.refresh_buffer) + && let Some(ref token) = state.access_token + { + return Ok(token.clone()); + } + } + + // Slow path: acquire or refresh token + let mut state = self.token_state.write().await; + + // Double-check after acquiring write lock + if !state.is_expired(self.refresh_buffer) + && let Some(ref token) = state.access_token + { + return Ok(token.clone()); + } + + let uses_refresh_token = !matches!( + self.config.flow, + OAuthFlow::ClientCredentials + | OAuthFlow::AzureManagedIdentity { .. } + | OAuthFlow::WorkloadIdentity { .. } + ); + + let resp = if let Some(ref refresh_token) = state.refresh_token + && uses_refresh_token + { + debug!("Refreshing OAuth token using refresh_token"); + self.refresh_with_token(refresh_token).await? + } else { + debug!("Acquiring new OAuth token via {:?} flow", self.config.flow); + self.acquire_token().await? + }; + + state.update(&resp); + Ok(resp.access_token) + } + + /// Acquire a new token using the configured flow. + async fn acquire_token(&self) -> Result { + match &self.config.flow { + OAuthFlow::ClientCredentials => self.acquire_client_credentials().await, + OAuthFlow::AuthorizationCodePKCE { + redirect_uri, + callback_port, + } => { + self.acquire_authorization_code_pkce( + redirect_uri.as_deref(), + callback_port.unwrap_or(DEFAULT_CALLBACK_PORT), + ) + .await + } + OAuthFlow::DeviceCode => self.acquire_device_code().await, + OAuthFlow::AzureManagedIdentity { client_id } => { + self.acquire_managed_identity(client_id.as_deref()).await + } + OAuthFlow::WorkloadIdentity { token_file } => { + self.acquire_workload_identity(token_file).await + } + } + } + + // -- OIDC Discovery -- + + async fn get_discovery(&self) -> Result { + { + let cached = self.discovery.read().await; + if let Some(ref disc) = *cached { + return Ok(OidcDiscovery { + token_endpoint: disc.token_endpoint.clone(), + authorization_endpoint: disc.authorization_endpoint.clone(), + device_authorization_endpoint: disc.device_authorization_endpoint.clone(), + }); + } + } + + let mut cache = self.discovery.write().await; + // Double-check + if let Some(ref disc) = *cache { + return Ok(OidcDiscovery { + token_endpoint: disc.token_endpoint.clone(), + authorization_endpoint: disc.authorization_endpoint.clone(), + device_authorization_endpoint: disc.device_authorization_endpoint.clone(), + }); + } + + let discovery_url = format!( + "{}/.well-known/openid-configuration", + self.config.issuer_url.trim_end_matches('/') + ); + + debug!("Fetching OIDC discovery from {}", discovery_url); + + let resp = self + .http_client + .get(&discovery_url) + .send() + .await + .map_err(|e| Error::Runtime { + message: format!("Failed to fetch OIDC discovery document: {e}"), + })?; + + if !resp.status().is_success() { + return Err(Error::Runtime { + message: format!( + "OIDC discovery failed with status {}: {}", + resp.status(), + resp.text().await.unwrap_or_default() + ), + }); + } + + let disc: OidcDiscovery = resp.json().await.map_err(|e| Error::Runtime { + message: format!("Failed to parse OIDC discovery document: {e}"), + })?; + + let result = OidcDiscovery { + token_endpoint: disc.token_endpoint.clone(), + authorization_endpoint: disc.authorization_endpoint.clone(), + device_authorization_endpoint: disc.device_authorization_endpoint.clone(), + }; + + *cache = Some(disc); + Ok(result) + } + + fn get_token_endpoint_from_issuer(&self) -> String { + // Derive Azure v2.0 token endpoint from issuer URL + // issuer: https://login.microsoftonline.com/{tenant}/v2.0 + // token: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token + let base = self.config.issuer_url.trim_end_matches("/v2.0"); + format!("{base}/oauth2/v2.0/token") + } + + async fn get_token_endpoint(&self) -> Result { + match self.get_discovery().await { + Ok(disc) => Ok(disc.token_endpoint), + Err(e) => { + warn!("OIDC discovery failed, falling back to derived endpoint: {e}"); + Ok(self.get_token_endpoint_from_issuer()) + } + } + } + + fn scopes_string(&self) -> String { + self.config.scopes.join(" ") + } + + // -- Client Credentials Flow -- + + async fn acquire_client_credentials(&self) -> Result { + let client_secret = self + .config + .client_secret + .as_ref() + .ok_or(Error::InvalidInput { + message: "client_secret is required for ClientCredentials flow".to_string(), + })?; + + let token_endpoint = self.get_token_endpoint().await?; + + let params = [ + ("grant_type", "client_credentials"), + ("client_id", &self.config.client_id), + ("client_secret", client_secret), + ("scope", &self.scopes_string()), + ]; + + self.post_token_request(&token_endpoint, ¶ms).await + } + + // -- Authorization Code + PKCE Flow -- + + async fn acquire_authorization_code_pkce( + &self, + redirect_uri: Option<&str>, + callback_port: u16, + ) -> Result { + use rand::Rng; + use tokio::io::AsyncWriteExt; + use tokio::net::TcpListener; + + let discovery = self.get_discovery().await?; + let auth_endpoint = discovery.authorization_endpoint.ok_or(Error::Runtime { + message: "OIDC discovery did not provide authorization_endpoint".to_string(), + })?; + + let default_redirect = format!("http://localhost:{callback_port}/callback"); + let redirect = redirect_uri.unwrap_or(&default_redirect); + + // Generate PKCE code verifier and challenge (S256) + const PKCE_CHARSET: &[u8] = + b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"; + let code_verifier: String = { + let mut rng = rand::rng(); + (0..128) + .map(|_| { + let idx = rng.random_range(0..PKCE_CHARSET.len()); + PKCE_CHARSET[idx] as char + }) + .collect() + }; + let code_challenge = { + use sha2::{Digest, Sha256}; + let hash = Sha256::digest(code_verifier.as_bytes()); + base64_url_encode(&hash) + }; + + let state: String = { + let mut rng = rand::rng(); + (0..32) + .map(|_| { + let idx = rng.random_range(0..16u8); + b"0123456789abcdef"[idx as usize] as char + }) + .collect() + }; + + // Build authorization URL + let auth_url = format!( + "{auth_endpoint}?response_type=code&client_id={}&redirect_uri={}&scope={}&code_challenge={}&code_challenge_method=S256&state={state}", + urlencoding::encode(&self.config.client_id), + urlencoding::encode(redirect), + urlencoding::encode(&self.scopes_string()), + urlencoding::encode(&code_challenge), + ); + + info!("Opening browser for OAuth login..."); + info!("If the browser doesn't open, visit: {auth_url}"); + + // Try to open browser + let _ = open::that(&auth_url); + + // Start local callback server + let listener = TcpListener::bind(format!("127.0.0.1:{callback_port}")) + .await + .map_err(|e| Error::Runtime { + message: format!("Failed to bind callback server on port {callback_port}: {e}"), + })?; + + info!("Waiting for OAuth callback on port {callback_port}..."); + + let (mut stream, _) = listener.accept().await.map_err(|e| Error::Runtime { + message: format!("Failed to accept callback connection: {e}"), + })?; + + // Read the HTTP request + let mut buf = vec![0u8; 4096]; + let n = tokio::io::AsyncReadExt::read(&mut stream, &mut buf) + .await + .map_err(|e| Error::Runtime { + message: format!("Failed to read callback request: {e}"), + })?; + let request_str = String::from_utf8_lossy(&buf[..n]); + + // Extract authorization code from query params + let code = extract_query_param(&request_str, "code").ok_or(Error::Runtime { + message: "No authorization code in callback".to_string(), + })?; + + let returned_state = extract_query_param(&request_str, "state"); + if returned_state.as_deref() != Some(&state) { + return Err(Error::Runtime { + message: "OAuth state mismatch — possible CSRF attack".to_string(), + }); + } + + // Send success response to browser + let response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n

Authentication successful!

You can close this window.

"; + let _ = stream.write_all(response.as_bytes()).await; + + // Exchange code for tokens + let token_endpoint = self.get_token_endpoint().await?; + let mut params = vec![ + ("grant_type", "authorization_code"), + ("client_id", self.config.client_id.as_str()), + ("code", &code), + ("redirect_uri", redirect), + ("code_verifier", &code_verifier), + ]; + if let Some(ref secret) = self.config.client_secret { + params.push(("client_secret", secret)); + } + + self.post_token_request(&token_endpoint, ¶ms).await + } + + // -- Device Code Flow -- + + async fn acquire_device_code(&self) -> Result { + let discovery = self.get_discovery().await?; + let device_endpoint = discovery + .device_authorization_endpoint + .ok_or(Error::Runtime { + message: "OIDC discovery did not provide device_authorization_endpoint".to_string(), + })?; + + let params = [ + ("client_id", self.config.client_id.as_str()), + ("scope", &self.scopes_string()), + ]; + + let resp = self + .http_client + .post(&device_endpoint) + .form(¶ms) + .send() + .await + .map_err(|e| Error::Runtime { + message: format!("Device code request failed: {e}"), + })?; + + if !resp.status().is_success() { + return Err(Error::Runtime { + message: format!( + "Device code request failed with status {}: {}", + resp.status(), + resp.text().await.unwrap_or_default() + ), + }); + } + + let device_resp: DeviceCodeResponse = resp.json().await.map_err(|e| Error::Runtime { + message: format!("Failed to parse device code response: {e}"), + })?; + + // Display instructions to user + info!( + "To sign in, visit {} and enter code: {}", + device_resp.verification_uri, device_resp.user_code + ); + if let Some(ref uri) = device_resp.verification_uri_complete { + info!("Or visit: {uri}"); + } + + // Poll token endpoint + let token_endpoint = self.get_token_endpoint().await?; + let poll_interval = Duration::from_secs(device_resp.interval.unwrap_or(5)); + let deadline = Instant::now() + Duration::from_secs(device_resp.expires_in); + + loop { + if Instant::now() >= deadline { + return Err(Error::Runtime { + message: "Device code flow timed out waiting for user authentication" + .to_string(), + }); + } + + tokio::time::sleep(poll_interval).await; + + let poll_params = [ + ("grant_type", "urn:ietf:params:oauth:grant-type:device_code"), + ("client_id", self.config.client_id.as_str()), + ("device_code", &device_resp.device_code), + ]; + + let poll_resp = self + .http_client + .post(&token_endpoint) + .form(&poll_params) + .send() + .await + .map_err(|e| Error::Runtime { + message: format!("Device code poll failed: {e}"), + })?; + + if poll_resp.status().is_success() { + return poll_resp.json().await.map_err(|e| Error::Runtime { + message: format!("Failed to parse token response: {e}"), + }); + } + + // Check for pending / slow_down errors + let body = poll_resp.text().await.unwrap_or_default(); + if body.contains("authorization_pending") { + continue; + } + if body.contains("slow_down") { + tokio::time::sleep(Duration::from_secs(5)).await; + continue; + } + + return Err(Error::Runtime { + message: format!("Device code poll failed: {body}"), + }); + } + } + + // -- Azure Managed Identity Flow -- + + async fn acquire_managed_identity(&self, mi_client_id: Option<&str>) -> Result { + let resource = self.scopes_string().replace("/.default", ""); + + let mut url = format!( + "{AZURE_IMDS_ENDPOINT}?api-version={AZURE_IMDS_API_VERSION}&resource={}", + urlencoding::encode(&resource), + ); + if let Some(cid) = mi_client_id { + url.push_str(&format!("&client_id={}", urlencoding::encode(cid))); + } + + let resp = self + .http_client + .get(&url) + .header("Metadata", "true") + .send() + .await + .map_err(|e| Error::Runtime { + message: format!("Azure IMDS request failed: {e}"), + })?; + + if !resp.status().is_success() { + return Err(Error::Runtime { + message: format!( + "Azure IMDS returned status {}: {}", + resp.status(), + resp.text().await.unwrap_or_default() + ), + }); + } + + resp.json().await.map_err(|e| Error::Runtime { + message: format!("Failed to parse IMDS token response: {e}"), + }) + } + + // -- Workload Identity Federation Flow -- + + async fn acquire_workload_identity(&self, token_file: &str) -> Result { + let federated_token = + tokio::fs::read_to_string(token_file) + .await + .map_err(|e| Error::Runtime { + message: format!("Failed to read federated token file '{token_file}': {e}"), + })?; + + let token_endpoint = self.get_token_endpoint().await?; + + let params = [ + ("grant_type", "client_credentials"), + ("client_id", self.config.client_id.as_str()), + ( + "client_assertion_type", + "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", + ), + ("client_assertion", federated_token.trim()), + ("scope", &self.scopes_string()), + ]; + + self.post_token_request(&token_endpoint, ¶ms).await + } + + // -- Refresh Token Flow -- + + async fn refresh_with_token(&self, refresh_token: &str) -> Result { + let token_endpoint = self.get_token_endpoint().await?; + + let mut params = vec![ + ("grant_type", "refresh_token"), + ("client_id", self.config.client_id.as_str()), + ("refresh_token", refresh_token), + ]; + if let Some(ref secret) = self.config.client_secret { + params.push(("client_secret", secret.as_str())); + } + + self.post_token_request(&token_endpoint, ¶ms).await + } + + // -- Shared Helpers -- + + async fn post_token_request( + &self, + endpoint: &str, + params: &[(&str, &str)], + ) -> Result { + let resp = self + .http_client + .post(endpoint) + .form(params) + .send() + .await + .map_err(|e| Error::Runtime { + message: format!("Token request to {endpoint} failed: {e}"), + })?; + + if !resp.status().is_success() { + return Err(Error::Runtime { + message: format!( + "Token request failed with status {}: {}", + resp.status(), + resp.text().await.unwrap_or_default() + ), + }); + } + + resp.json().await.map_err(|e| Error::Runtime { + message: format!("Failed to parse token response: {e}"), + }) + } +} + +#[async_trait::async_trait] +impl HeaderProvider for OAuthHeaderProvider { + async fn get_headers(&self) -> Result> { + let token = self.get_valid_token().await?; + Ok(HashMap::from([( + "authorization".to_string(), + format!("Bearer {token}"), + )])) + } +} + +// -- Utility functions -- + +fn base64_url_encode(input: &[u8]) -> String { + use base64::Engine; + base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(input) +} + +/// Extract a query parameter value from a raw HTTP GET request line. +fn extract_query_param(request: &str, param: &str) -> Option { + let first_line = request.lines().next()?; + let path = first_line.split_whitespace().nth(1)?; + let query = path.split('?').nth(1)?; + for pair in query.split('&') { + let mut kv = pair.splitn(2, '='); + if let (Some(key), Some(value)) = (kv.next(), kv.next()) + && key == param + { + return Some(urlencoding::decode(value).ok()?.into_owned()); + } + } + None +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_extract_query_param() { + let request = "GET /callback?code=abc123&state=xyz HTTP/1.1\r\nHost: localhost\r\n"; + assert_eq!( + extract_query_param(request, "code"), + Some("abc123".to_string()) + ); + assert_eq!( + extract_query_param(request, "state"), + Some("xyz".to_string()) + ); + assert_eq!(extract_query_param(request, "missing"), None); + } + + #[test] + fn test_extract_query_param_encoded() { + let request = "GET /callback?code=abc%20123&state=x%26y HTTP/1.1\r\n"; + assert_eq!( + extract_query_param(request, "code"), + Some("abc 123".to_string()) + ); + assert_eq!( + extract_query_param(request, "state"), + Some("x&y".to_string()) + ); + } + + #[test] + fn test_token_state_expiry() { + let mut state = TokenState::new(); + assert!(state.is_expired(Duration::from_secs(0))); + + state.access_token = Some("tok".to_string()); + state.expires_at = Some(Instant::now() + Duration::from_secs(600)); + assert!(!state.is_expired(Duration::from_secs(300))); + assert!(state.is_expired(Duration::from_secs(601))); + } + + #[test] + fn test_base64_url_encode() { + let input = b"hello world"; + let encoded = base64_url_encode(input); + assert!(!encoded.contains('+')); + assert!(!encoded.contains('/')); + assert!(!encoded.contains('=')); + } + + #[test] + fn test_scopes_string() { + let config = OAuthConfig { + issuer_url: "https://login.microsoftonline.com/tenant/v2.0".to_string(), + client_id: "app-id".to_string(), + client_secret: Some("secret".to_string()), + scopes: vec!["scope1".to_string(), "scope2".to_string()], + flow: OAuthFlow::ClientCredentials, + refresh_buffer_secs: None, + }; + let provider = OAuthHeaderProvider::new(config).unwrap(); + assert_eq!(provider.scopes_string(), "scope1 scope2"); + } + + #[test] + fn test_token_endpoint_derivation() { + let config = OAuthConfig { + issuer_url: "https://login.microsoftonline.com/my-tenant/v2.0".to_string(), + client_id: "id".to_string(), + client_secret: None, + scopes: vec!["api://test/.default".to_string()], + flow: OAuthFlow::DeviceCode, + refresh_buffer_secs: None, + }; + let provider = OAuthHeaderProvider::new(config).unwrap(); + assert_eq!( + provider.get_token_endpoint_from_issuer(), + "https://login.microsoftonline.com/my-tenant/oauth2/v2.0/token" + ); + } + + #[test] + fn test_client_credentials_requires_secret() { + let config = OAuthConfig { + issuer_url: "https://login.microsoftonline.com/tenant/v2.0".to_string(), + client_id: "app-id".to_string(), + client_secret: None, + scopes: vec!["scope".to_string()], + flow: OAuthFlow::ClientCredentials, + refresh_buffer_secs: None, + }; + assert!(OAuthHeaderProvider::new(config).is_err()); + } + + #[test] + fn test_empty_scopes_rejected() { + let config = OAuthConfig { + issuer_url: "https://login.microsoftonline.com/tenant/v2.0".to_string(), + client_id: "app-id".to_string(), + client_secret: None, + scopes: vec![], + flow: OAuthFlow::DeviceCode, + refresh_buffer_secs: None, + }; + assert!(OAuthHeaderProvider::new(config).is_err()); + } +}