diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 3f3d7aa..aff9d15 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -45,8 +45,9 @@ jobs: - name: Copy binary to output run: | cp target/lambda/docbox-http-lambda/bootstrap.zip docbox-http-lambda-amd64.zip - cp target/lambda/docbox-presigned-cleanup-lambda/bootstrap.zip docbox-presigned-cleanup-lambda-amd64.zip + cp target/lambda/docbox-cleanup-lambda/bootstrap.zip docbox-cleanup-lambda-amd64.zip cp target/lambda/docbox-upload-completion-lambda/bootstrap.zip docbox-upload-completion-lambda-amd64.zip + cp target/lambda/docbox-management-lambda/bootstrap.zip docbox-management-lambda-amd64.zip shell: bash # Build the docker layers @@ -63,11 +64,11 @@ jobs: name: docbox-http-lambda-amd64.zip path: docbox-http-lambda-amd64.zip - - name: Upload docbox-presigned-cleanup-lambda-amd64.zip + - name: Upload docbox-cleanup-lambda-amd64.zip uses: actions/upload-artifact@v4 with: - name: docbox-presigned-cleanup-lambda-amd64.zip - path: docbox-presigned-cleanup-lambda-amd64.zip + name: docbox-cleanup-lambda-amd64.zip + path: docbox-cleanup-lambda-amd64.zip - name: Upload docbox-upload-completion-lambda-amd64.zip uses: actions/upload-artifact@v4 @@ -75,6 +76,12 @@ jobs: name: docbox-upload-completion-lambda-amd64.zip path: docbox-upload-completion-lambda-amd64.zip + - name: Upload docbox-management-lambda-amd64.zip + uses: actions/upload-artifact@v4 + with: + name: docbox-management-lambda-amd64.zip + path: docbox-management-lambda-amd64.zip + - name: Upload poppler-lambda-layer-amd64.zip uses: actions/upload-artifact@v4 with: @@ -112,8 +119,9 @@ jobs: - name: Copy binary to output run: | cp target/lambda/docbox-http-lambda/bootstrap.zip docbox-http-lambda-arm64.zip - cp target/lambda/docbox-presigned-cleanup-lambda/bootstrap.zip docbox-presigned-cleanup-lambda-arm64.zip + cp target/lambda/docbox-cleanup-lambda/bootstrap.zip docbox-cleanup-lambda-arm64.zip cp target/lambda/docbox-upload-completion-lambda/bootstrap.zip docbox-upload-completion-lambda-arm64.zip + cp target/lambda/docbox-management-lambda/bootstrap.zip docbox-management-lambda-arm64.zip shell: bash - name: Set up QEMU @@ -136,11 +144,11 @@ jobs: name: docbox-http-lambda-arm64.zip path: docbox-http-lambda-arm64.zip - - name: Upload docbox-presigned-cleanup-lambda-arm64.zip + - name: Upload docbox-cleanup-lambda-arm64.zip uses: actions/upload-artifact@v4 with: - name: docbox-presigned-cleanup-lambda-arm64.zip - path: docbox-presigned-cleanup-lambda-arm64.zip + name: docbox-cleanup-lambda-arm64.zip + path: docbox-cleanup-lambda-arm64.zip - name: Upload docbox-upload-completion-lambda-arm64.zip uses: actions/upload-artifact@v4 @@ -148,6 +156,12 @@ jobs: name: docbox-upload-completion-lambda-arm64.zip path: docbox-upload-completion-lambda-arm64.zip + - name: Upload docbox-management-lambda-arm64.zip + uses: actions/upload-artifact@v4 + with: + name: docbox-management-lambda-arm64.zip + path: docbox-management-lambda-arm64.zip + - name: Upload poppler-lambda-layer-arm64.zip uses: actions/upload-artifact@v4 with: diff --git a/.gitignore b/.gitignore index 61652c5..b6ec730 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ # Terraform backend config files *.tfbackend - -/terraform - +/terraform/**/*.zip +/terraform/data /private diff --git a/Cargo.lock b/Cargo.lock index cca6701..1d23748 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,13 +8,24 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aes" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fc76eaeac4c9164506c466d4ffdd8ec9d0c5bf57ee97177c4d8eceb3a0e138" +dependencies = [ + "cipher", + "cpubits", + "cpufeatures 0.3.0", +] + [[package]] name = "ahash" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "version_check", ] @@ -76,9 +87,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "arbitrary" @@ -86,6 +97,15 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +[[package]] +name = "arc-swap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] + [[package]] name = "arg_enum_proc_macro" version = "0.3.4" @@ -94,14 +114,14 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "as-slice" @@ -114,22 +134,21 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.35" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07a926debf178f2d355197f9caddb08e54a9329d44748034bba349c5848cb519" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" dependencies = [ "compression-codecs", "compression-core", - "futures-core", "pin-project-lite", "tokio", ] [[package]] name = "async-lock" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener", "event-listener-strategy", @@ -155,7 +174,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -166,7 +185,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -178,6 +197,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -186,9 +214,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "av-scenechange" @@ -226,18 +254,18 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" +checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" dependencies = [ "arrayvec", ] [[package]] name = "aws-config" -version = "1.8.12" +version = "1.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96571e6996817bf3d58f6b569e4b9fd2e9d2fcf9f7424eed07b2ce9bb87535e5" +checksum = "8a8fc176d53d6fe85017f230405e3255cedb4a02221cb55ed6d76dccbbb099b2" dependencies = [ "aws-credential-types", "aws-runtime", @@ -245,8 +273,8 @@ dependencies = [ "aws-sdk-ssooidc", "aws-sdk-sts", "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-http 0.63.6", + "aws-smithy-json 0.62.7", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -254,7 +282,7 @@ dependencies = [ "bytes", "fastrand", "hex", - "http 1.4.0", + "http 1.4.2", "ring", "time", "tokio", @@ -265,9 +293,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.11" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd362783681b15d136480ad555a099e82ecd8e2d10a841e14dfd0078d67fee3" +checksum = "e93964ffdaf57857f544be3666a5f57570bb699e934700f11b49708f61bb556e" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -277,9 +305,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.15.1" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b5ce75405893cd713f9ab8e297d8e438f624dde7d706108285f7e17a25a180f" +checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" dependencies = [ "aws-lc-sys", "zeroize", @@ -287,35 +315,39 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.34.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "179c3777a8b5e70e90ea426114ffc565b2c1a9f82f6c4a0c5a34aa6ef5e781b6" +checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] name = "aws-runtime" -version = "1.5.18" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "959dab27ce613e6c9658eb3621064d0e2027e5f2acb65bc526a43577facea557" +checksum = "7816e98ee912159f45d307e5ee6bfea4a335a55aee15f7f3e32f81a6f3000f1d" dependencies = [ "aws-credential-types", "aws-sigv4", "aws-smithy-async", "aws-smithy-eventstream", - "aws-smithy-http", + "aws-smithy-http 0.64.0", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", + "bytes-utils", "fastrand", "http 0.2.12", + "http 1.4.2", "http-body 0.4.6", + "http-body 1.1.0", "percent-encoding", "pin-project-lite", "tracing", @@ -324,198 +356,220 @@ dependencies = [ [[package]] name = "aws-sdk-lambda" -version = "1.113.0" +version = "1.135.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e580e0770852d081af1379ea3074e736639dc6cbb29827dc0d4cd67fc56728" +checksum = "606b6b79742c529c90e2305f9d3f986b8f842e82243ffe0cfe621aea14cf40ac" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-eventstream", - "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-http 0.64.0", + "aws-smithy-json 0.63.0", "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-s3" -version = "1.120.0" +version = "1.138.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06673901e961f20fa8d7da907da48f7ad6c1b383e3726c22bd418900f015abe1" +checksum = "7c29be98554a0deea25d4eaca131240a224dcbcaf20357e35cc432e17b721ab5" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-sigv4", "aws-smithy-async", "aws-smithy-checksums", "aws-smithy-eventstream", - "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-http 0.64.0", + "aws-smithy-json 0.63.0", "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", "aws-smithy-types", "aws-smithy-xml", "aws-types", "bytes", "fastrand", "hex", - "hmac", + "hmac 0.13.0", "http 0.2.12", - "http 1.4.0", - "http-body 0.4.6", + "http 1.4.2", + "http-body 1.1.0", "lru", "percent-encoding", "regex-lite", - "sha2", + "sha2 0.11.0", "tracing", "url", ] [[package]] name = "aws-sdk-secretsmanager" -version = "1.98.0" +version = "1.109.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe845a0db234857edc466b59d0bf25d7959f6b7ab2e9e78f8a97f7cf8deeed5" +checksum = "661ce910a6ed895c6bde66aa78040272628b127714fe0e9bb799f07ab4db407b" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-http 0.64.0", + "aws-smithy-json 0.63.0", "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sqs" -version = "1.92.0" +version = "1.103.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a930bbcf95be5e2e1424c1df814265e86e5796ad0eac3104ebeb0180279ab7" +checksum = "52add2841d4ed9995145a0e87e53f6731b88cf643b77bcbe1cad726ce8307e5a" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-http 0.64.0", + "aws-smithy-json 0.63.0", "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sso" -version = "1.91.0" +version = "1.103.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee6402a36f27b52fe67661c6732d684b2635152b676aa2babbfb5204f99115d" +checksum = "0469f435f645ad2162cfb463b15bde37115966ee3acf2d87fb4871ee309b8401" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-http 0.64.0", + "aws-smithy-json 0.63.0", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.93.0" +version = "1.105.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45a7f750bbd170ee3677671ad782d90b894548f4e4ae168302c57ec9de5cb3e" +checksum = "085faefb253f770655e162b9304321e62a1e71adf7f019ee1f4454228a377b3a" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-http 0.64.0", + "aws-smithy-json 0.63.0", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.95.0" +version = "1.108.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55542378e419558e6b1f398ca70adb0b2088077e79ad9f14eb09441f2f7b2164" +checksum = "3c72b08911d8128dd360fe1b22a9fec0fa8b552dde8ec828dcf20ef5ec974e9f" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", + "aws-smithy-http 0.64.0", + "aws-smithy-json 0.63.0", + "aws-smithy-observability", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", "aws-smithy-types", "aws-smithy-xml", "aws-types", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "1.3.7" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e523e1c4e8e7e8ff219d732988e22bfeae8a1cafdbe6d9eca1546fa080be7c" +checksum = "723c2234ad7511ceef63eab016b7ba6ff7c55590fefb96fa8467af014a07309f" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", - "aws-smithy-http", + "aws-smithy-http 0.64.0", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", - "crypto-bigint 0.5.5", + "crypto-bigint", "form_urlencoded", "hex", - "hmac", + "hmac 0.13.0", "http 0.2.12", - "http 1.4.0", + "http 1.4.2", "p256", "percent-encoding", - "ring", - "sha2", + "sha2 0.11.0", "subtle", "time", "tracing", @@ -524,9 +578,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.7" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee19095c7c4dda59f1697d028ce704c24b2d33c6718790c7f1d5a3015b4107c" +checksum = "f02e407fb3b54891734224b9ffac8a71fdd35f542500fa1af95754a6b2beb316" dependencies = [ "futures-util", "pin-project-lite", @@ -535,29 +589,30 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.13" +version = "0.65.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23374b9170cbbcc6f5df8dc5ebb9b6c5c28a3c8f599f0e8b8b10eb6f4a5c6e74" +checksum = "b67ecd999972b58e67cab052f5129906c08c25883bd0788ceefc55ef97d61307" dependencies = [ - "aws-smithy-http", + "aws-smithy-http 0.64.0", "aws-smithy-types", "bytes", "crc-fast", "hex", - "http 0.2.12", - "http-body 0.4.6", - "md-5", + "http 1.4.2", + "http-body 1.1.0", + "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.14" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc12f8b310e38cad85cf3bef45ad236f470717393c613266ce0a89512286b650" +checksum = "5a9381123ab62d20c13082b151f30f962a3b112b727345394536dfa39a482944" dependencies = [ "aws-smithy-types", "bytes", @@ -566,9 +621,30 @@ 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-runtime-api", + "aws-smithy-types", + "bytes", + "bytes-utils", + "futures-core", + "futures-util", + "http 1.4.2", + "http-body 1.1.0", + "http-body-util", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + +[[package]] +name = "aws-smithy-http" +version = "0.64.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37843d9add67c3aff5856f409c6dc315d3cdff60f9c0cb5b670dab1e9920306d" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -577,9 +653,9 @@ dependencies = [ "bytes-utils", "futures-core", "futures-util", - "http 0.2.12", - "http 1.4.0", - "http-body 0.4.6", + "http 1.4.2", + "http-body 1.1.0", + "http-body-util", "percent-encoding", "pin-project-lite", "pin-utils", @@ -588,26 +664,26 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.5" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e62db736db19c488966c8d787f52e6270be565727236fd5579eaa301e7bc4a" +checksum = "635d23afda0a6ab48d666c4d447c4873e8d1e83518a2be2093122397e50b838e" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", "h2 0.3.27", - "h2 0.4.12", + "h2 0.4.15", "http 0.2.12", - "http 1.4.0", + "http 1.4.2", "http-body 0.4.6", "hyper 0.14.32", - "hyper 1.8.1", + "hyper 1.10.1", "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.35", + "rustls 0.23.42", "rustls-native-certs", "rustls-pki-types", "tokio", @@ -618,27 +694,40 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.9" +version = "0.62.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fa1213db31ac95288d981476f78d05d9cbb0353d22cdf3472cc05bb02f6551" +checksum = "701a947f4797e52a911e114a898667c746c39feea467bbd1abd7b3721f702ffa" dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-schema 0.1.0", + "aws-smithy-types", +] + +[[package]] +name = "aws-smithy-json" +version = "0.63.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dc65a121adb4b33729919fcfa14fa36fb33c1555a8f06bb0e2188dbfdc1d9ef" +dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1fcbefc7ece1d70dcce29e490f269695dfca2d2bacdeaf9e5c3f799e4e6a42" +checksum = "8e86338c869539a581bf161247762a6e87f92c5c075060057b5ed6d06632ed0c" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" -version = "0.60.9" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae5d689cf437eae90460e944a58b5668530d433b4ff85789e69d2f2a556e057d" +checksum = "dd22a6ba36e3f113cb8d5b3d1fe0ed31c76ee608ef63322d753bb8d2c9479e77" dependencies = [ "aws-smithy-types", "urlencoding", @@ -646,22 +735,24 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.9.8" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb5b6167fcdf47399024e81ac08e795180c576a20e4d4ce67949f9a88ae37dc1" +checksum = "bea94a9ff8464016338c851e24b472d7131c388c88898a502e781815b2ee6045" dependencies = [ "aws-smithy-async", - "aws-smithy-http", + "aws-smithy-http 0.64.0", "aws-smithy-http-client", "aws-smithy-observability", "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", "aws-smithy-types", "bytes", "fastrand", "http 0.2.12", - "http 1.4.0", + "http 1.4.2", "http-body 0.4.6", - "http-body 1.0.1", + "http-body 1.1.0", + "http-body-util", "pin-project-lite", "pin-utils", "tokio", @@ -670,35 +761,69 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.10.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efce7aaaf59ad53c5412f14fc19b2d5c6ab2c3ec688d272fd31f76ec12f44fb0" +checksum = "22ed1ebe6e0a95ea84570225f5a8208dec4b8f77e61a9b0d6f51773fcb4612f0" dependencies = [ "aws-smithy-async", + "aws-smithy-runtime-api-macros", "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.4.0", + "http 1.4.2", "pin-project-lite", "tokio", "tracing", "zeroize", ] +[[package]] +name = "aws-smithy-runtime-api-macros" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "221eaa237ddf1ca79b60d1372aad77e47f9c0ea5b3ce5099da8c61d027dc77b3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "aws-smithy-schema" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7442cb268338f0eb8278140a107c046756aa01093d8ef5e99628d34ae09c94f5" +dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-types", + "http 1.4.2", +] + +[[package]] +name = "aws-smithy-schema" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56e0a4e53127a632224e43633b0fe045fa9e1e3cfc68b9830f1115e103f910" +dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-types", + "http 1.4.2", +] + [[package]] name = "aws-smithy-types" -version = "1.3.6" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65f172bcb02424eb94425db8aed1b6d583b5104d4d5ddddf22402c661a320048" +checksum = "d6dc683efb34b9e755675b37fedbe0103141e5b6df7bdc9eb6967756a8c167d8" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", "http 0.2.12", - "http 1.4.0", + "http 1.4.2", "http-body 0.4.6", - "http-body 1.0.1", + "http-body 1.1.0", "http-body-util", "itoa", "num-integer", @@ -713,22 +838,26 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.13" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b2f670422ff42bf7065031e72b45bc52a3508bd089f743ea90731ca2b6ea57" +checksum = "ea3f68eec3607f02acd24067969ce2abc6ba16aa7d5ce59ca450ed2fb5f78957" dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", + "aws-smithy-types", "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.11" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d980627d2dd7bfc32a3c025685a033eeab8d365cc840c631ef59d1b8f428164" +checksum = "e957a6c6dbce82b7a91f44231c09273159703769f447cbe85e854dfe9cf67f86" dependencies = [ "aws-credential-types", "aws-smithy-async", "aws-smithy-runtime-api", + "aws-smithy-schema 0.2.0", "aws-smithy-types", "rustc_version", "tracing", @@ -736,15 +865,15 @@ dependencies = [ [[package]] name = "aws_lambda_events" -version = "1.0.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac59c9b189a3bd75146633e1c87f35fb727f53b03c7f331af789ff1293a9f350" +checksum = "d02c123e89527e7b424f74f52d11be0d17ef2887819323a42dcae1c7630ca53d" dependencies = [ "base64", "bytes", "chrono", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-serde", "query_map", "serde", @@ -762,10 +891,10 @@ dependencies = [ "bytes", "form_urlencoded", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", - "hyper 1.8.1", + "hyper 1.10.1", "hyper-util", "itoa", "matchit", @@ -788,14 +917,14 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", "mime", "pin-project-lite", @@ -818,8 +947,8 @@ dependencies = [ "form_urlencoded", "futures-util", "headers", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", "mime", "percent-encoding", @@ -835,13 +964,13 @@ dependencies = [ [[package]] name = "axum-macros" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" +checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -853,9 +982,9 @@ dependencies = [ "axum-core", "bytes", "ciborium", - "http 1.4.0", + "http 1.4.2", "mime", - "quick-xml", + "quick-xml 0.37.5", "rmp-serde", "serde", "serde_yaml", @@ -880,9 +1009,9 @@ dependencies = [ [[package]] name = "axum_typed_multipart" -version = "0.16.5" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c8b2ee396b35396ec27f5b9aa101f77000ba842dc82549a381b74c3ae2db7e" +checksum = "b119aa21c8511fd05757a37f521d20b65bc85cfc41415b2281a01b8460c39764" dependencies = [ "anyhow", "async-trait", @@ -901,23 +1030,24 @@ dependencies = [ [[package]] name = "axum_typed_multipart_macros" -version = "0.16.5" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27cefbd055910a29c4a3710016559cece5bdb4fb78ec055a1c2e9f8c61e3aa9" +checksum = "d752f8e44098682e56c28027836ada161798a90ec0f3430f7f079fc6f16554a3" dependencies = [ - "darling 0.23.0", + "darling", "heck", "proc-macro-error2", + "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", "ubyte", ] [[package]] name = "base16ct" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -937,18 +1067,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.8.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bit_field" @@ -958,27 +1079,27 @@ checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" dependencies = [ "serde_core", ] [[package]] name = "bitstream-io" -version = "4.9.0" +version = "4.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" +checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" dependencies = [ - "core2", + "no_std_io2", ] [[package]] name = "bitvec" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ "funty", "radium", @@ -995,40 +1116,60 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", + "zeroize", +] + [[package]] name = "borsh" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" dependencies = [ "borsh-derive", + "bytes", "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", ] [[package]] name = "built" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytecheck" @@ -1054,9 +1195,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "d6aedf8ae72766347502cf3cb4f41cf5e9cc37d28bee90f1fdaaae15f9cf9424" [[package]] name = "byteorder" @@ -1072,9 +1213,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" dependencies = [ "serde", ] @@ -1089,6 +1230,15 @@ dependencies = [ "either", ] +[[package]] +name = "bzip2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" +dependencies = [ + "libbz2-rs-sys", +] + [[package]] name = "card-validate" version = "2.4.0" @@ -1110,9 +1260,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.49" +version = "1.2.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" +checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38" dependencies = [ "find-msvc-tools", "jobserver", @@ -1120,12 +1270,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfg-if" version = "1.0.4" @@ -1138,6 +1282,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + [[package]] name = "chrono" version = "0.4.43" @@ -1179,15 +1334,40 @@ dependencies = [ "half", ] +[[package]] +name = "cipher" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c" +dependencies = [ + "crypto-common 0.2.2", + "inout", +] + [[package]] name = "cmake" -version = "0.1.54" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -1206,9 +1386,9 @@ dependencies = [ [[package]] name = "compact_str" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" +checksum = "7fd622ebbb56a5b2ccb651b32b911cdeb2a9b4b11776b2473bf26a26a286244e" dependencies = [ "castaway", "cfg-if", @@ -1221,9 +1401,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.34" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a3cbbb8b6eca96f3a5c4bf6938d5b27ced3675d69f95bb51948722870bc323" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" dependencies = [ "compression-core", "flate2", @@ -1232,9 +1412,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" @@ -1251,6 +1431,18 @@ 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 = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + [[package]] name = "core-foundation" version = "0.9.4" @@ -1278,13 +1470,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "core2" -version = "0.4.0" +name = "cpubits" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] +checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" [[package]] name = "cpufeatures" @@ -1295,31 +1484,38 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" dependencies = [ "crc-catalog", ] [[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" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd92aca2c6001b1bf5ba0ff84ee74ec8501b52bbef0cac80bf25a6c1d87a83d" +checksum = "e75b2483e97a5a7da73ac68a05b629f9c53cff58d8ed1c77866079e18b00dba5" dependencies = [ - "crc", - "digest", - "rustversion", - "spin 0.10.0", + "digest 0.10.7", + "spin 0.10.1", ] [[package]] @@ -1331,20 +1527,26 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1352,27 +1554,27 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -1380,26 +1582,16 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ + "generic-array", "rand_core 0.6.4", "subtle", + "zeroize", ] [[package]] @@ -1413,37 +1605,31 @@ dependencies = [ ] [[package]] -name = "darling" -version = "0.21.3" +name = "crypto-common" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", + "hybrid-array", ] [[package]] -name = "darling" -version = "0.23.0" +name = "ctutils" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" dependencies = [ - "darling_core 0.23.0", - "darling_macro 0.23.0", + "cmov", ] [[package]] -name = "darling_core" -version = "0.21.3" +name = "darling" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.111", + "darling_core", + "darling_macro", ] [[package]] @@ -1456,18 +1642,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.111", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core 0.21.3", - "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -1476,20 +1651,16 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core 0.23.0", + "darling_core", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] -name = "der" -version = "0.6.1" +name = "deflate64" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", -] +checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" [[package]] name = "der" @@ -1497,18 +1668,17 @@ 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", ] [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", "serde_core", ] @@ -1518,28 +1688,56 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", + "block-buffer 0.10.4", + "const-oid 0.9.6", + "crypto-common 0.1.7", "subtle", ] +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid 0.10.2", + "crypto-common 0.2.2", + "ctutils", + "zeroize", +] + [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", +] + +[[package]] +name = "docbox-cleanup-lambda" +version = "0.0.3" +dependencies = [ + "aws-config", + "aws_lambda_events", + "chrono", + "docbox-core", + "dotenvy", + "lambda_runtime", + "thiserror 2.0.18", + "tokio", + "tracing", ] [[package]] name = "docbox-core" -version = "0.11.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78f04c83177ec240022d6d4843191d292069d41bdbe3726c796a1dc2ac939db" +checksum = "bffdf8eb466e11b14dfe5e84fa9fd86eb7b2d0ebbd7a5c5ccc0b0826227f17d1" dependencies = [ "aws-config", "aws-sdk-sqs", @@ -1567,13 +1765,14 @@ dependencies = [ "urlencoding", "utoipa", "uuid", + "zip", ] [[package]] name = "docbox-database" -version = "0.10.2" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb5bbb65592e741bea86d09611d5fed372b8fac9c09961a97c3b683f4e0a2247" +checksum = "f357f1079ae6e114c29cf15379ebe110c8677f60b4e5abfbc16ee8cb4c51d278" dependencies = [ "aws-config", "aws-credential-types", @@ -1584,7 +1783,7 @@ dependencies = [ "serde", "serde_json", "sqlx", - "strum 0.27.2", + "strum 0.28.0", "thiserror 2.0.18", "tokio", "tracing", @@ -1595,9 +1794,9 @@ dependencies = [ [[package]] name = "docbox-http" -version = "0.7.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc419b4d0de7425d4e86f423342caabb1f6d9a52198a5e2f5dd566ce1d12d737" +checksum = "c9c53214c6b5db8c37161271c5740078df6ab2cefcc0b262447ae25a4f06febd" dependencies = [ "axum", "axum-valid", @@ -1616,7 +1815,6 @@ dependencies = [ "tokio", "tower", "tracing", - "tracing-subscriber", "utoipa", "uuid", ] @@ -1638,15 +1836,32 @@ dependencies = [ ] [[package]] -name = "docbox-presigned-cleanup-lambda" -version = "0.0.3" +name = "docbox-management" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0ce6c6cf5102db37e6b265d19c4cb48e8f824051fe95e7278c2b3cff02bf421" dependencies = [ "aws-config", - "aws_lambda_events", - "chrono", "docbox-core", + "futures", + "rand 0.10.2", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tracing", +] + +[[package]] +name = "docbox-management-lambda" +version = "0.0.3" +dependencies = [ + "docbox-management", "dotenvy", "lambda_runtime", + "serde", + "serde_json", "thiserror 2.0.18", "tokio", "tracing", @@ -1654,9 +1869,9 @@ dependencies = [ [[package]] name = "docbox-processing" -version = "0.6.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93dd5c733c707525665f443cff9fdea83ecb43ce73545d94832859ad5e15c91f" +checksum = "18763abd6fda3556b87b002314541c5c98817e54ec8c7d319f490bc32fed64a2" dependencies = [ "aws-config", "aws-sdk-lambda", @@ -1673,7 +1888,7 @@ dependencies = [ "office-convert-client", "office-convert-lambda-client", "pdf_process", - "reqwest 0.13.1", + "reqwest", "serde", "serde_json", "thiserror 2.0.18", @@ -1685,9 +1900,9 @@ dependencies = [ [[package]] name = "docbox-search" -version = "0.10.1" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e07f7cf960b0ccc1133462595b7b8ca2d09c83ee512ade2c8b3636be1ae423" +checksum = "8deeb4188a31062a23ebc1c365146d12dcb2cbde86e2682c7f70ec152d22bf70" dependencies = [ "aws-config", "chrono", @@ -1697,7 +1912,7 @@ dependencies = [ "itertools", "mime", "opensearch", - "reqwest 0.13.1", + "reqwest", "serde", "serde_json", "serde_with", @@ -1725,9 +1940,9 @@ dependencies = [ [[package]] name = "docbox-storage" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d6ac991045fe47c181e627480e5ecf49446eeeec1ed7469b091336e8bd0b85" +checksum = "3dbe02e3e403d1b943097f1968062d519ee028b07138e0328d8b6dd9d7558f4a" dependencies = [ "aws-config", "aws-sdk-s3", @@ -1736,6 +1951,7 @@ dependencies = [ "bytes-utils", "chrono", "futures", + "itertools", "serde", "thiserror 2.0.18", "tracing", @@ -1750,6 +1966,7 @@ dependencies = [ "docbox-core", "dotenvy", "lambda_runtime", + "serde_json", "thiserror 2.0.18", "tokio", "tracing", @@ -1758,15 +1975,15 @@ dependencies = [ [[package]] name = "docbox-web-scraper" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9c46420ec86933c88f8ca57d5cc71b8880ee30eef286d44d4b8ab86ed8727d" +checksum = "93d5f8ec2a1d824b9b21358558d3dbb07bc0a191daea94f0bc24e8f3f8517faf" dependencies = [ "base64", "bytes", "futures", "mime", - "reqwest 0.13.1", + "reqwest", "robotstxt", "serde", "thiserror 2.0.18", @@ -1796,45 +2013,59 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "ecdsa" -version = "0.14.8" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der 0.6.1", + "der", + "digest 0.10.7", "elliptic-curve", "rfc6979", - "signature 1.6.4", + "signature", + "spki", ] [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" dependencies = [ "serde", ] [[package]] name = "elliptic-curve" -version = "0.12.3" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest", + "crypto-bigint", + "digest 0.10.7", "ff", "generic-array", "group", - "pkcs8 0.9.0", + "pem-rfc7468", + "pkcs8", "rand_core 0.6.4", "sec1", "subtle", "zeroize", ] +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -1861,7 +2092,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -1914,14 +2145,16 @@ dependencies = [ [[package]] name = "exr" -version = "1.74.0" +version = "1.74.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" +checksum = "711fe42c9964295e01ee3fba3f9fe0e1d24b98886950d68efe81b1c76e21adf3" dependencies = [ "bit_field", "half", "lebe", "miniz_oxide", + "num-complex", + "pulp", "rayon-core", "smallvec", "zune-inflate", @@ -1929,41 +2162,27 @@ dependencies = [ [[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 = "faststr" -version = "0.2.32" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baec6a0289d7f1fe5665586ef7340af82e3037207bef60f5785e57569776f0c8" +checksum = "1ca7d44d22004409a61c393afb3369c8f7bb74abcae49fe249ee01dcc3002113" dependencies = [ "bytes", - "rkyv 0.8.12", + "rkyv 0.8.17", "serde", "simdutf8", ] [[package]] name = "fax" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" -dependencies = [ - "fax_derive", -] - -[[package]] -name = "fax_derive" -version = "0.2.0" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] +checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" [[package]] name = "fdeflate" @@ -1976,9 +2195,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.12.1" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ "rand_core 0.6.4", "subtle", @@ -1986,18 +2205,19 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", + "zlib-rs", ] [[package]] @@ -2008,7 +2228,7 @@ checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", - "spin 0.9.8", + "spin 0.9.9", ] [[package]] @@ -2052,9 +2272,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -2067,9 +2287,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -2077,15 +2297,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -2105,38 +2325,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -2146,7 +2366,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -2178,7 +2397,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -2189,13 +2408,14 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -2211,18 +2431,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", "wasm-bindgen", ] [[package]] name = "gif" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" dependencies = [ "color_quant", "weezl", @@ -2230,9 +2462,9 @@ dependencies = [ [[package]] name = "group" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", "rand_core 0.6.4", @@ -2251,7 +2483,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.12.1", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -2260,17 +2492,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.4.0", - "indexmap 2.12.1", + "http 1.4.2", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -2288,6 +2520,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -2319,15 +2560,22 @@ dependencies = [ "foldhash 0.2.0", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "hashify" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "149e3ea90eb5a26ad354cfe3cb7f7401b9329032d0235f2687d03a35f30e5d4c" +checksum = "dd1246c0e5493286aeb2dde35b1f4eb9c4ce00e628641210a5e553fc001a1f26" dependencies = [ + "indexmap 2.14.0", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -2348,10 +2596,10 @@ dependencies = [ "base64", "bytes", "headers-core", - "http 1.4.0", + "http 1.4.2", "httpdate", "mime", - "sha1", + "sha1 0.10.7", ] [[package]] @@ -2360,7 +2608,21 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 1.4.0", + "http 1.4.2", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin 0.9.9", + "stable_deref_trait", ] [[package]] @@ -2381,7 +2643,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac", + "hmac 0.12.1", ] [[package]] @@ -2390,7 +2652,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]] @@ -2404,12 +2675,9 @@ dependencies = [ [[package]] name = "html-escape" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" -dependencies = [ - "utf8-width", -] +checksum = "46c1ff2d1cbf39efe5af0900ced8a069b5e61557a17544eb0c4a50239937389e" [[package]] name = "http" @@ -2424,9 +2692,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", "itoa", @@ -2445,24 +2713,24 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", - "http 1.4.0", + "http 1.4.2", ] [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "pin-project-lite", ] @@ -2472,7 +2740,7 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd" dependencies = [ - "http 1.4.0", + "http 1.4.2", "serde", ] @@ -2488,6 +2756,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "hybrid-array" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" version = "0.14.32" @@ -2514,22 +2791,21 @@ dependencies = [ [[package]] name = "hyper" -version = "1.8.1" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", - "h2 0.4.12", - "http 1.4.0", - "http-body 1.0.1", + "h2 0.4.15", + "http 1.4.2", + "http-body 1.1.0", "httparse", "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -2552,41 +2828,38 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http 1.4.0", - "hyper 1.8.1", + "http 1.4.2", + "hyper 1.10.1", "hyper-util", - "rustls 0.23.35", + "rustls 0.23.42", "rustls-native-certs", - "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.4", ] [[package]] name = "hyper-util" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64", "bytes", "futures-channel", - "futures-core", "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "hyper 1.8.1", + "http 1.4.2", + "http-body 1.1.0", + "hyper 1.10.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.6.5", "system-configuration", "tokio", "tower-service", @@ -2596,9 +2869,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2620,12 +2893,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", @@ -2633,9 +2907,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", @@ -2646,9 +2920,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", @@ -2660,15 +2934,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", @@ -2680,15 +2954,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", @@ -2718,9 +2992,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", @@ -2728,9 +3002,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.9" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", @@ -2746,8 +3020,8 @@ dependencies = [ "rayon", "rgb", "tiff", - "zune-core 0.5.0", - "zune-jpeg 0.5.8", + "zune-core", + "zune-jpeg", ] [[package]] @@ -2762,9 +3036,9 @@ dependencies = [ [[package]] name = "imgref" -version = "1.12.0" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" +checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" [[package]] name = "indexmap" @@ -2779,16 +3053,25 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "serde", "serde_core", ] +[[package]] +name = "inout" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7" +dependencies = [ + "hybrid-array", +] + [[package]] name = "interpolate_name" version = "0.2.4" @@ -2797,20 +3080,20 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.9" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +checksum = "95b1e6eaf9624f23be1969198c8f8e649ea8791e7ecfd6275ede2bdfeb88e168" dependencies = [ "memchr", "serde", @@ -2827,66 +3110,94 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jni" -version = "0.21.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" dependencies = [ - "cesu8", "cfg-if", "combine", + "jni-macros", "jni-sys", "log", - "thiserror 1.0.69", + "simd_cesu8", + "thiserror 2.0.18", "walkdir", - "windows-sys 0.45.0", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", ] [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.83" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] [[package]] name = "lambda_http" -version = "1.0.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a106755a9079a3ed20b4262e32c9a5efa127c97546cb2ecf69bbf3d17dbf970b" +checksum = "e69eb3117d123f471f7d2b5d02b5afe150f54f9f7cff3264e578c9dd03675ad9" dependencies = [ "aws_lambda_events", "bytes", "encoding_rs", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", - "hyper 1.8.1", + "hyper 1.10.1", "lambda_runtime", "mime", "percent-encoding", @@ -2900,18 +3211,18 @@ dependencies = [ [[package]] name = "lambda_runtime" -version = "1.0.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e566d19773ae483b0d32cc6045c5420d7b3eec6192ecb1c26ffa4e0091388a" +checksum = "484647f147899f866a7b5db6aaa1671e943f89f4be76e2a383c96b1b27058294" dependencies = [ "async-stream", "base64", "bytes", "futures", - "http 1.4.0", + "http 1.4.2", "http-body-util", "http-serde", - "hyper 1.8.1", + "hyper 1.10.1", "lambda_runtime_api_client", "pin-project", "serde", @@ -2925,17 +3236,17 @@ dependencies = [ [[package]] name = "lambda_runtime_api_client" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c039f06329949692a81a993ede4cfaa6abab3ac8e72590cf7c5e6a64a9ec7b1" +checksum = "a92e6500e47d17c1ffd3e6ad3ca224bb86382fc8b63414f6f20b1b2d98dfb7cf" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", - "hyper 1.8.1", + "hyper 1.10.1", "hyper-util", "tower", "tracing", @@ -2948,7 +3259,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.9.8", + "spin 0.9.9", ] [[package]] @@ -2957,17 +3268,23 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" +[[package]] +name = "libbz2-rs-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" + [[package]] name = "libc" -version = "0.2.178" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libfuzzer-sys" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" dependencies = [ "arbitrary", "cc", @@ -2975,19 +3292,20 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ "bitflags", "libc", - "redox_syscall", + "plain", + "redox_syscall 0.9.0", ] [[package]] @@ -3008,15 +3326,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -3029,9 +3347,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "loop9" @@ -3044,9 +3362,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.16.3" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" dependencies = [ "hashbrown 0.16.1", ] @@ -3066,13 +3384,21 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "lzma-rust2" +version = "0.16.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca93e534d1142d1d0dcca6d25fe302508a5dfb40b302802904577725ea0b695b" +dependencies = [ + "sha2 0.11.0", +] + [[package]] name = "mail-parser" -version = "0.11.1" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf4390741c4e6fa330bdeccdfb580815dbb462952de91838b723357985119a3" +checksum = "47785d444be4d32c1709171c6219a90f667c0ad0ffe68b4b179e794f31f4f9e8" dependencies = [ - "encoding_rs", "hashify", ] @@ -3108,14 +3434,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "md-5" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" +dependencies = [ + "cfg-if", + "digest 0.11.3", ] [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "mime" @@ -3157,9 +3493,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "wasi", @@ -3168,9 +3504,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3dec6bd31b08944e08b58fd99373893a6c17054d6f3ea5006cc894f4f4eee2a" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" dependencies = [ "async-lock", "crossbeam-channel", @@ -3188,9 +3524,9 @@ dependencies = [ [[package]] name = "moxcms" -version = "0.7.10" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80986bbbcf925ebd3be54c26613d861255284584501595cf418320c078945608" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" dependencies = [ "num-traits", "pxfm", @@ -3205,11 +3541,11 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http 1.4.0", + "http 1.4.2", "httparse", "memchr", "mime", - "spin 0.9.8", + "spin 0.9.9", "version_check", ] @@ -3230,7 +3566,7 @@ checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -3239,6 +3575,15 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "no_std_io2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +dependencies = [ + "memchr", +] + [[package]] name = "nom" version = "7.1.3" @@ -3264,20 +3609,11 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" dependencies = [ "num-integer", "num-traits", @@ -3294,16 +3630,26 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.7", "smallvec", "zeroize", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "bytemuck", + "num-traits", +] + [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-derive" @@ -3313,7 +3659,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -3327,11 +3673,10 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -3364,7 +3709,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a37727637b66a32cf8375b649c532a3f326266edc155d2249b5b521bdb688e" dependencies = [ "bytes", - "reqwest 0.13.1", + "reqwest", "serde", "serde_json", "thiserror 2.0.18", @@ -3374,9 +3719,9 @@ dependencies = [ [[package]] name = "office-convert-lambda-client" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb28bb7848017c014207741650c9242fd249a22c4a17195188f5088c7b13d32" +checksum = "527a0cac553a85783da946c663921596433612164ade59b222859f9355c463a0" dependencies = [ "aws-sdk-lambda", "serde", @@ -3387,9 +3732,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "oncemutex" @@ -3399,9 +3744,9 @@ checksum = "44d11de466f4a3006fe8a5e7ec84e93b79c70cb992ae0aa0eb631ad2df8abfe2" [[package]] name = "opensearch" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62b025c3503d3d53eaba3b6f14adb955af9f69fc71141b4d030a4e5331f5d42" +checksum = "2af6815a23449a0860c8fe049a828c3589d3ad56d3b5875d0d1f340d1291871e" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -3412,7 +3757,7 @@ dependencies = [ "dyn-clone", "lazy_static", "percent-encoding", - "reqwest 0.12.28", + "reqwest", "rustc_version", "serde", "serde_json", @@ -3423,9 +3768,9 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "outref" @@ -3435,13 +3780,14 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" [[package]] name = "p256" -version = "0.11.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ "ecdsa", "elliptic-curve", - "sha2", + "primeorder", + "sha2 0.10.9", ] [[package]] @@ -3468,7 +3814,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", "windows-link", ] @@ -3485,6 +3831,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" +[[package]] +name = "pbkdf2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629" +dependencies = [ + "digest 0.11.3", + "hmac 0.13.0", +] + [[package]] name = "pdf_process" version = "0.2.0" @@ -3514,49 +3870,49 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phonenumber" -version = "0.3.7+8.13.52" +version = "0.3.10+9.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2247167dc3741816fdd4d3690e97f56a892a264b44f4c702078b72d1f8b6bd40" +checksum = "66d85d3cc5477bfe2f357939e7f02a5a566632508633af1a2c37577d0bef87d9" dependencies = [ - "bincode", "either", "fnv", "nom 7.1.3", "once_cell", - "quick-xml", + "postcard", + "quick-xml 0.41.0", "regex", "regex-cache", "serde", "serde_derive", - "strum 0.26.3", - "thiserror 1.0.69", + "strum 0.27.2", + "thiserror 2.0.18", ] [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -3570,19 +3926,9 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "der 0.7.10", - "pkcs8 0.10.2", - "spki 0.7.3", -] - -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", + "der", + "pkcs8", + "spki", ] [[package]] @@ -3591,21 +3937,27 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.10", - "spki 0.7.3", + "der", + "spki", ] [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "png" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ "bitflags", "crc32fast", @@ -3616,15 +3968,28 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "postcard" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] [[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", ] @@ -3635,6 +4000,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppmd-rust" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -3644,13 +4015,22 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.23.9", + "toml_edit 0.25.13+spec-1.1.0", ] [[package]] @@ -3672,35 +4052,35 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" dependencies = [ "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -3723,7 +4103,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -3763,18 +4143,38 @@ checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] -name = "pxfm" -version = "0.1.27" +name = "pulp" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" dependencies = [ - "num-traits", + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", + "reborrow", + "version_check", ] +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" + +[[package]] +name = "pxfm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + [[package]] name = "qoi" version = "0.4.1" @@ -3811,11 +4211,20 @@ dependencies = [ "serde", ] +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -3823,8 +4232,8 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.35", - "socket2 0.6.1", + "rustls 0.23.42", + "socket2 0.6.5", "thiserror 2.0.18", "tokio", "tracing", @@ -3833,18 +4242,19 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "aws-lc-rs", "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.2", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", - "rustls 0.23.35", + "rustls 0.23.42", "rustls-pki-types", "slab", "thiserror 2.0.18", @@ -3855,23 +4265,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.6.5", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.42" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] @@ -3882,6 +4292,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "radium" version = "0.7.0" @@ -3890,18 +4306,18 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rancor" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee" +checksum = "daff8b7b3ccf5f7ba270b3e7a0a4d4c701c5797e38dec27c7e2c3dbb830fed1c" dependencies = [ "ptr_meta 0.3.1", ] [[package]] name = "rand" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -3910,12 +4326,23 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -3935,7 +4362,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -3944,18 +4371,33 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "rav1e" version = "0.8.1" @@ -3983,7 +4425,7 @@ dependencies = [ "num-traits", "paste", "profiling", - "rand 0.9.2", + "rand 0.9.5", "rand_chacha 0.9.0", "simd_helpers", "thiserror 2.0.18", @@ -3993,9 +4435,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" dependencies = [ "avif-serialize", "imgref", @@ -4006,11 +4448,20 @@ dependencies = [ "rgb", ] +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags", +] + [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -4026,6 +4477,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + [[package]] name = "redox_syscall" version = "0.5.18" @@ -4035,6 +4492,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_syscall" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759" +dependencies = [ + "bitflags", +] + [[package]] name = "ref-cast" version = "1.0.25" @@ -4052,30 +4518,30 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.8.8", + "regex-syntax 0.8.11", ] [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.8", + "regex-syntax 0.8.11", ] [[package]] @@ -4092,9 +4558,9 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" @@ -4104,9 +4570,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rend" @@ -4119,65 +4585,27 @@ dependencies = [ [[package]] name = "rend" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6" - -[[package]] -name = "reqwest" -version = "0.12.28" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64", - "bytes", - "futures-core", - "http 1.4.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.7", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls 0.23.35", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls 0.26.4", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 1.0.4", -] +checksum = "663ba70707f96e871406fe10d68128412e619b06d1d47cb91c3a4c6501176240" [[package]] name = "reqwest" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.12", - "http 1.4.0", - "http-body 1.0.1", + "h2 0.4.15", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.7", + "hyper 1.10.1", + "hyper-rustls 0.27.9", "hyper-util", "js-sys", "log", @@ -4186,7 +4614,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.35", + "rustls 0.23.42", "rustls-pki-types", "rustls-platform-verifier", "serde", @@ -4208,20 +4636,19 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "crypto-bigint 0.4.9", - "hmac", - "zeroize", + "hmac 0.12.1", + "subtle", ] [[package]] name = "rgb" -version = "0.8.52" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" [[package]] name = "ring" @@ -4231,7 +4658,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -4239,9 +4666,9 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.45" +version = "0.7.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" dependencies = [ "bitvec", "bytecheck", @@ -4249,7 +4676,7 @@ dependencies = [ "hashbrown 0.12.3", "ptr_meta 0.1.4", "rend 0.4.2", - "rkyv_derive 0.7.45", + "rkyv_derive 0.7.46", "seahash", "tinyvec", "uuid", @@ -4257,27 +4684,27 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.8.12" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a640b26f007713818e9a9b65d34da1cf58538207b052916a83d80e43f3ffa4" +checksum = "815cc8a37159a463064825246cadb07961e25cd9885908606f6d08a98d8f8874" dependencies = [ "bytes", - "hashbrown 0.15.5", - "indexmap 2.12.1", + "hashbrown 0.17.1", + "indexmap 2.14.0", "munge", "ptr_meta 0.3.1", "rancor", - "rend 0.5.3", - "rkyv_derive 0.8.12", + "rend 0.5.4", + "rkyv_derive 0.8.17", "tinyvec", "uuid", ] [[package]] name = "rkyv_derive" -version = "0.7.45" +version = "0.7.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" dependencies = [ "proc-macro2", "quote", @@ -4286,33 +4713,30 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.8.12" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd83f5f173ff41e00337d97f6572e416d022ef8a19f371817259ae960324c482" +checksum = "c0ed1a78a1b19d184b0daa629dd9a024573173ec7d485b287cb369fb3607cc1c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "rmp" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" dependencies = [ - "byteorder", "num-traits", - "paste", ] [[package]] name = "rmp-serde" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" dependencies = [ - "byteorder", "rmp", "serde", ] @@ -4325,45 +4749,46 @@ checksum = "bbc52377db80e3fec3a2c748ca603b8b6cacdd34ff89ff4b742a635361d4b4a7" [[package]] name = "rsa" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +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", + "pkcs8", "rand_core 0.6.4", - "signature 2.2.0", - "spki 0.7.3", + "signature", + "spki", "subtle", "zeroize", ] [[package]] name = "rust_decimal" -version = "1.39.0" +version = "1.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282" +checksum = "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a" dependencies = [ "arrayvec", "borsh", "bytes", "num-traits", - "rand 0.8.5", - "rkyv 0.7.45", + "rand 0.8.7", + "rkyv 0.7.46", "serde", "serde_json", + "wasm-bindgen", ] [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc_version" @@ -4376,9 +4801,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags", "errno", @@ -4401,24 +4826,24 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" dependencies = [ "aws-lc-rs", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.8", + "rustls-webpki 0.103.13", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -4428,9 +4853,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" dependencies = [ "web-time", "zeroize", @@ -4438,19 +4863,19 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", "jni", "log", "once_cell", - "rustls 0.23.35", + "rustls 0.23.42", "rustls-native-certs", "rustls-platform-verifier-android", - "rustls-webpki 0.103.8", + "rustls-webpki 0.103.13", "security-framework", "security-framework-sys", "webpki-root-certs", @@ -4475,9 +4900,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", @@ -4487,15 +4912,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -4508,9 +4933,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -4529,9 +4954,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", @@ -4563,23 +4988,23 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "sec1" -version = "0.3.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", - "der 0.6.1", + "der", "generic-array", - "pkcs8 0.9.0", + "pkcs8", "subtle", "zeroize", ] [[package]] name = "security-framework" -version = "3.5.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ "bitflags", "core-foundation 0.10.1", @@ -4590,9 +5015,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -4600,9 +5025,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 = "serde" @@ -4631,7 +5056,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -4641,7 +5066,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" dependencies = [ "form_urlencoded", - "indexmap 2.12.1", + "indexmap 2.14.0", "itoa", "ryu", "serde_core", @@ -4694,17 +5119,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.16.1" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ "base64", + "bs58", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.12.1", + "indexmap 2.14.0", "schemars 0.9.0", - "schemars 1.1.0", + "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", @@ -4713,14 +5139,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.16.1" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ - "darling 0.21.3", + "darling", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -4729,7 +5155,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.14.0", "itoa", "ryu", "serde", @@ -4738,13 +5164,24 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -4754,8 +5191,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -4767,7 +5215,7 @@ dependencies = [ "async-trait", "bytes", "hex", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -4781,44 +5229,45 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" -version = "1.4.7" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest", - "rand_core 0.6.4", -] - [[package]] name = "signature" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] [[package]] name = "simd_helpers" @@ -4837,15 +5286,15 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" dependencies = [ "serde", ] @@ -4862,28 +5311,28 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "sonic-number" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a74044c092f4f43ca7a6cfd62854cf9fb5ac8502b131347c990bf22bef1dfe" +checksum = "3775c3390edf958191f1ab1e8c5c188907feebd0f3ce1604cb621f72961dbf32" dependencies = [ "cfg-if", ] [[package]] name = "sonic-rs" -version = "0.5.6" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4425ea8d66ec950e0a8f2ef52c766cc3d68d661d9a0845c353c40833179fd866" +checksum = "d971cc77a245ccf1756dbd1a87c3e7f709c0191464096510d43eec056d0f2c4f" dependencies = [ "ahash 0.8.12", "bumpalo", @@ -4892,47 +5341,37 @@ dependencies = [ "faststr", "itoa", "ref-cast", - "ryu", "serde", "simdutf8", "sonic-number", "sonic-simd", "thiserror 2.0.18", + "zmij", ] [[package]] name = "sonic-simd" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5707edbfb34a40c9f2a55fa09a49101d9fec4e0cc171ce386086bd9616f34257" +checksum = "f99e664ecd2d85a68c87e3c7a3cfe691f647ea9e835de984aba4d54a41f817d4" dependencies = [ "cfg-if", ] [[package]] name = "spin" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" dependencies = [ "lock_api", ] [[package]] name = "spin" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" - -[[package]] -name = "spki" -version = "0.6.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] +checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3" [[package]] name = "spki" @@ -4941,7 +5380,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der 0.7.10", + "der", ] [[package]] @@ -4976,15 +5415,15 @@ dependencies = [ "futures-util", "hashbrown 0.15.5", "hashlink", - "indexmap 2.12.1", + "indexmap 2.14.0", "log", "memchr", "once_cell", "percent-encoding", - "rustls 0.23.35", + "rustls 0.23.42", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "smallvec", "thiserror 2.0.18", "tokio", @@ -5005,7 +5444,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -5023,12 +5462,12 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "sqlx-core", "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.111", + "syn 2.0.119", "tokio", "url", ] @@ -5046,7 +5485,7 @@ dependencies = [ "bytes", "chrono", "crc", - "digest", + "digest 0.10.7", "dotenvy", "either", "futures-channel", @@ -5056,18 +5495,18 @@ dependencies = [ "generic-array", "hex", "hkdf", - "hmac", + "hmac 0.12.1", "itoa", "log", - "md-5", + "md-5 0.10.6", "memchr", "once_cell", "percent-encoding", - "rand 0.8.5", + "rand 0.8.7", "rsa", "serde", - "sha1", - "sha2", + "sha1 0.10.7", + "sha2 0.10.9", "smallvec", "sqlx-core", "stringprep", @@ -5096,17 +5535,17 @@ dependencies = [ "futures-util", "hex", "hkdf", - "hmac", + "hmac 0.12.1", "home", "itoa", "log", - "md-5", + "md-5 0.10.6", "memchr", "once_cell", - "rand 0.8.5", + "rand 0.8.7", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "smallvec", "sqlx-core", "stringprep", @@ -5173,45 +5612,44 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.26.3" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ - "strum_macros 0.26.4", + "strum_macros 0.27.2", ] [[package]] name = "strum" -version = "0.27.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" dependencies = [ - "strum_macros 0.27.2", + "strum_macros 0.28.0", ] [[package]] name = "strum_macros" -version = "0.26.4" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "strum_macros" -version = "0.27.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -5233,9 +5671,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.111" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -5259,14 +5697,14 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "system-configuration" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ "bitflags", "core-foundation 0.9.4", @@ -5297,12 +5735,12 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys 0.61.2", @@ -5334,7 +5772,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -5345,58 +5783,58 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] [[package]] name = "tiff" -version = "0.10.3" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" dependencies = [ "fax", "flate2", "half", "quick-error", "weezl", - "zune-jpeg 0.4.21", + "zune-jpeg", ] [[package]] name = "time" -version = "0.3.44" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" dependencies = [ "deranged", - "itoa", + "js-sys", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" dependencies = [ "num-conv", "time-core", @@ -5404,9 +5842,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", @@ -5414,9 +5852,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -5435,9 +5873,9 @@ checksum = "b130bd8a58c163224b44e217b4239ca7b927d82bf6cc2fea1fc561d15056e3f7" [[package]] name = "tokio" -version = "1.49.0" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -5445,20 +5883,20 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2 0.6.5", "tokio-macros", "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -5477,15 +5915,15 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.35", + "rustls 0.23.42", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -5494,9 +5932,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -5528,9 +5966,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -5541,33 +5979,33 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.14.0", "serde", "serde_spanned", "toml_datetime 0.6.11", "toml_write", - "winnow", + "winnow 0.7.15", ] [[package]] name = "toml_edit" -version = "0.23.9" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ - "indexmap 2.12.1", - "toml_datetime 0.7.3", + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow", + "winnow 1.0.4", ] [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow", + "winnow 1.0.4", ] [[package]] @@ -5603,8 +6041,8 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", "iri-string", "pin-project-lite", @@ -5648,7 +6086,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -5661,17 +6099,6 @@ dependencies = [ "valuable", ] -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - [[package]] name = "tracing-serde" version = "0.2.0" @@ -5684,22 +6111,19 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", - "nu-ansi-term", "once_cell", "regex-automata", "serde", "serde_json", "sharded-slab", - "smallvec", "thread_local", "tracing", "tracing-core", - "tracing-log", "tracing-serde", ] @@ -5709,11 +6133,17 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ubyte" @@ -5723,9 +6153,9 @@ checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-bidi" @@ -5735,9 +6165,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" @@ -5756,9 +6186,9 @@ checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unsafe-libyaml" @@ -5790,12 +6220,6 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" -[[package]] -name = "utf8-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -5804,11 +6228,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utoipa" -version = "5.4.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" +checksum = "8bde15df68e80b16c7d16b9616e80770ad158988daa56a27dccd1e55558b0160" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.14.0", "serde", "serde_json", "utoipa-gen", @@ -5816,25 +6240,25 @@ dependencies = [ [[package]] name = "utoipa-gen" -version = "5.4.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b" +checksum = "6ba0b99ee52df3028635d93840c797102da61f8a7bb3cf751032455895b52ef8" dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.111", + "syn 2.0.119", "url", "uuid", ] [[package]] name = "uuid" -version = "1.19.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "js-sys", "serde_core", "wasm-bindgen", @@ -5908,9 +6332,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen", ] @@ -5923,35 +6347,33 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", "rustversion", + "serde", "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.56" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.106" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5959,31 +6381,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.106" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.106" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-streams" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" dependencies = [ "futures-util", "js-sys", @@ -5994,9 +6416,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.83" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -6014,9 +6436,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.5" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" dependencies = [ "rustls-pki-types", ] @@ -6027,14 +6449,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.4", + "webpki-roots 1.0.8", ] [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" dependencies = [ "rustls-pki-types", ] @@ -6085,7 +6507,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -6096,7 +6518,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] @@ -6134,15 +6556,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -6161,15 +6574,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -6179,21 +6583,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.48.5" @@ -6218,36 +6607,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -6260,18 +6626,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -6284,18 +6638,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -6308,30 +6650,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -6344,18 +6668,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -6368,18 +6680,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -6392,18 +6692,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -6417,31 +6705,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" +name = "winnow" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] [[package]] name = "winnow" -version = "0.7.14" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "wyz" @@ -6466,9 +6757,9 @@ checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -6477,68 +6768,68 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.31" +version = "0.8.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.31" +version = "0.8.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -6547,9 +6838,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", @@ -6558,56 +6849,114 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.119", ] [[package]] -name = "zmij" -version = "1.0.14" +name = "zip" +version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" +checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" +dependencies = [ + "aes", + "bzip2", + "constant_time_eq", + "crc32fast", + "deflate64", + "flate2", + "getrandom 0.4.3", + "hmac 0.13.0", + "indexmap 2.14.0", + "lzma-rust2", + "memchr", + "pbkdf2", + "ppmd-rust", + "sha1 0.11.0", + "time", + "typed-path", + "zeroize", + "zopfli", + "zstd", +] [[package]] -name = "zune-core" -version = "0.4.12" +name = "zlib-rs" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" +checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5" [[package]] -name = "zune-core" -version = "0.5.0" +name = "zmij" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111f7d9820f05fd715df3144e254d6fc02ee4088b0644c0ffd0efc9e6d9d2773" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] -name = "zune-inflate" -version = "0.2.54" +name = "zopfli" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" dependencies = [ + "bumpalo", + "crc32fast", + "log", "simd-adler32", ] [[package]] -name = "zune-jpeg" -version = "0.4.21" +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + +[[package]] +name = "zune-inflate" +version = "0.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ - "zune-core 0.4.12", + "simd-adler32", ] [[package]] name = "zune-jpeg" -version = "0.5.8" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35aee689668bf9bd6f6f3a6c60bb29ba1244b3b43adfd50edd554a371da37d5" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" dependencies = [ - "zune-core 0.5.0", + "zune-core", ] diff --git a/Cargo.toml b/Cargo.toml index f3b9845..ac99d05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,18 +2,22 @@ resolver = "3" members = [ "lambdas/http", - "lambdas/presigned-cleanup", + "lambdas/cleanup", "lambdas/upload-completion", + "lambdas/management" ] [workspace.dependencies] dotenvy = "=0.15.7" # Docbox HTTP layer -docbox-http = "0.7.1" +docbox-http = "0.9.2" # Docbox Core -docbox-core = "0.11.0" +docbox-core = "0.13.3" + +# Docbox management layer +docbox-management = "0.12.2" # Bytes type used for cheap shared bytes (and utilities) bytes = "=1.11.0" @@ -29,12 +33,13 @@ thiserror = "=2.0.18" chrono = { version = "=0.4.43", features = ["serde"] } # AWS configuration -aws-config = { version = "=1.8.12", features = ["behavior-version-latest"] } +aws-config = { version = "=1.8.14", features = ["behavior-version-latest"] } # Serialization and JSON serde = { version = "=1.0.228", features = ["derive"] } serde_json = "=1.0.149" # [patch.crates-io] -# docbox-http = { version = "0.7.0", path = "../docbox/packages/docbox-http" } -# docbox-core = { version = "0.10.0", path = "../docbox/packages/docbox-core" } +# docbox-http = { version = "0.9.1", path = "../docbox/packages/docbox-http" } +# docbox-core = { version = "0.13.2", path = "../docbox/packages/docbox-core" } +# docbox-management = { version = "0.12.2", path = "../docbox/packages/docbox-management" } diff --git a/lambdas/presigned-cleanup/.gitignore b/lambdas/cleanup/.gitignore similarity index 100% rename from lambdas/presigned-cleanup/.gitignore rename to lambdas/cleanup/.gitignore diff --git a/lambdas/presigned-cleanup/Cargo.toml b/lambdas/cleanup/Cargo.toml similarity index 90% rename from lambdas/presigned-cleanup/Cargo.toml rename to lambdas/cleanup/Cargo.toml index bf75172..9227cd7 100644 --- a/lambdas/presigned-cleanup/Cargo.toml +++ b/lambdas/cleanup/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "docbox-presigned-cleanup-lambda" +name = "docbox-cleanup-lambda" version = "0.0.3" edition = "2024" diff --git a/lambdas/presigned-cleanup/README.md b/lambdas/cleanup/README.md similarity index 95% rename from lambdas/presigned-cleanup/README.md rename to lambdas/cleanup/README.md index a0620f8..042af80 100644 --- a/lambdas/presigned-cleanup/README.md +++ b/lambdas/cleanup/README.md @@ -1,4 +1,4 @@ -# Docbox Presigned Cleanup Lambda +# Docbox Cleanup Lambda presigned-cleanup is a background task to perform cleanup and deletion of expired presigned file upload resource diff --git a/lambdas/presigned-cleanup/src/event_handler.rs b/lambdas/cleanup/src/event_handler.rs similarity index 94% rename from lambdas/presigned-cleanup/src/event_handler.rs rename to lambdas/cleanup/src/event_handler.rs index 7921a03..d255d18 100644 --- a/lambdas/presigned-cleanup/src/event_handler.rs +++ b/lambdas/cleanup/src/event_handler.rs @@ -4,6 +4,7 @@ use docbox_core::{ database::{DatabasePoolCache, DatabasePoolCacheConfig}, purge::{ purge_expired_presigned_tasks::safe_purge_expired_presigned_tasks, + purge_expired_tasks::safe_purge_expired_tasks, purge_expired_website_metadata::safe_purge_expired_website_metadata, }, secrets::{SecretManager, SecretsManagerConfig}, @@ -57,6 +58,7 @@ async fn function_handler( ) -> Result<(), Error> { safe_purge_expired_presigned_tasks(dependencies.db.clone(), dependencies.storage.clone()).await; safe_purge_expired_website_metadata(dependencies.db.clone()).await; + safe_purge_expired_tasks(dependencies.db.clone()).await; Ok(()) } diff --git a/lambdas/presigned-cleanup/src/main.rs b/lambdas/cleanup/src/main.rs similarity index 92% rename from lambdas/presigned-cleanup/src/main.rs rename to lambdas/cleanup/src/main.rs index c3d0332..4007a31 100644 --- a/lambdas/presigned-cleanup/src/main.rs +++ b/lambdas/cleanup/src/main.rs @@ -1,3 +1,4 @@ +#![recursion_limit = "256"] use lambda_runtime::{Error, run, service_fn, tracing}; mod event_handler; diff --git a/lambdas/http/src/authorizer.rs b/lambdas/http/src/authorizer.rs index 347c641..f32865e 100644 --- a/lambdas/http/src/authorizer.rs +++ b/lambdas/http/src/authorizer.rs @@ -86,7 +86,7 @@ pub async fn authorizer_middleware( if let Some(tenant) = authorizer .fields .get("tenant") - .map(|value| serde_json::from_value::(value.clone())) + .map(|value| serde_json::from_str::(value.as_str().unwrap())) .transpose() .map_err(InvalidAuthorizerTenant)? { @@ -100,7 +100,7 @@ pub async fn authorizer_middleware( if let Some(user) = authorizer .fields .get("user") - .map(|value| serde_json::from_value::(value.clone())) + .map(|value| serde_json::from_str::(value.as_str().unwrap())) .transpose() .map_err(InvalidAuthorizerUser)? { diff --git a/lambdas/http/src/main.rs b/lambdas/http/src/main.rs index c87ef12..0c7e729 100644 --- a/lambdas/http/src/main.rs +++ b/lambdas/http/src/main.rs @@ -1,3 +1,4 @@ +#![recursion_limit = "256"] use axum::{Extension, Router}; use docbox_http::{ core::{ @@ -15,7 +16,7 @@ use docbox_http::{ middleware::api_key::ApiKeyLayer, routes::router, }; -use lambda_http::{Error, run_with_streaming_response, tracing}; +use lambda_http::{Error, tracing}; use std::sync::Arc; use tower_http::trace::TraceLayer; @@ -35,7 +36,12 @@ async fn main() -> Result<(), Error> { let app = app().await?; - run_with_streaming_response(app).await + // Check if we are running in the restricted local environment + if std::env::var("LOCAL_DEVELOPMENT").is_ok_and(|value| value == "true") { + lambda_http::run(app).await + } else { + lambda_http::run_with_streaming_response(app).await + } } // TODO: Needs a db_cache.close_all() cleanup logic when the program exits diff --git a/lambdas/management/.gitignore b/lambdas/management/.gitignore new file mode 100644 index 0000000..1de5659 --- /dev/null +++ b/lambdas/management/.gitignore @@ -0,0 +1 @@ +target \ No newline at end of file diff --git a/lambdas/management/Cargo.toml b/lambdas/management/Cargo.toml new file mode 100644 index 0000000..27118d1 --- /dev/null +++ b/lambdas/management/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "docbox-management-lambda" +version = "0.0.3" +edition = "2024" + +[dependencies] +dotenvy.workspace = true + +tokio = { version = "1", features = ["macros"] } + +docbox-management.workspace = true + +serde.workspace = true +serde_json.workspace = true + +thiserror.workspace = true + +tracing.workspace= true + +lambda_runtime = { version = "1.3.0", features = ["tracing"] } diff --git a/lambdas/management/README.md b/lambdas/management/README.md new file mode 100644 index 0000000..c0ce971 --- /dev/null +++ b/lambdas/management/README.md @@ -0,0 +1,15 @@ +# Docbox Management Lambda + +This lambda is responsible for providing the privileged management layer for managing +docbox and its tenants + +## Prerequisites + +- [Rust](https://www.rust-lang.org/tools/install) +- [Cargo Lambda](https://www.cargo-lambda.info/guide/installation.html) + +## Building + +To build the project for production, run `cargo lambda build --release`. Remove the `--release` flag to build for development. + +Read more about building your lambda function in [the Cargo Lambda documentation](https://www.cargo-lambda.info/commands/build.html). diff --git a/lambdas/management/src/commands/migrate.rs b/lambdas/management/src/commands/migrate.rs new file mode 100644 index 0000000..6abeac5 --- /dev/null +++ b/lambdas/management/src/commands/migrate.rs @@ -0,0 +1,86 @@ +use docbox_management::{ + server::ManagedServer, + tenant::{ + migrate_tenant_secret_to_iam::migrate_tenant_secret_to_iam, + migrate_tenants::MigrateTenantsConfig, + migrate_tenants_search::{MigrateTenantsSearchConfig, migrate_tenants_search}, + migrate_tenants_storage::{MigrateTenantsStorageConfig, migrate_tenants_storage}, + }, +}; +use serde_json::json; + +use crate::{commands::MigrateTenantIamCommand, error::CommandResult}; + +pub async fn migrate( + managed_server: &ManagedServer, + config: MigrateTenantsConfig, +) -> CommandResult { + let outcome = docbox_management::tenant::migrate_tenants::migrate_tenants( + &managed_server.db_provider, + config, + ) + .await?; + + let payload = serde_json::to_value(outcome)?; + Ok(payload) +} + +pub async fn migrate_root(managed_server: &ManagedServer) -> CommandResult { + docbox_management::root::migrate_root::migrate_root(&managed_server.db_provider, None).await?; + + Ok(json!({})) +} + +pub async fn migrate_search( + managed_server: &ManagedServer, + config: MigrateTenantsSearchConfig, +) -> CommandResult { + let outcome = + migrate_tenants_search(&managed_server.db_provider, &managed_server.search, config).await?; + let payload = serde_json::to_value(outcome)?; + Ok(payload) +} + +pub async fn migrate_storage( + managed_server: &ManagedServer, + config: MigrateTenantsStorageConfig, +) -> CommandResult { + let outcome = + migrate_tenants_storage(&managed_server.db_provider, &managed_server.storage, config) + .await?; + + let payload = serde_json::to_value(outcome)?; + Ok(payload) +} + +pub async fn migrate_tenant_iam( + managed_server: &ManagedServer, + config: MigrateTenantIamCommand, +) -> CommandResult { + let mut tenants = + docbox_management::tenant::get_tenants::get_tenants(&managed_server.db_provider).await?; + + tenants.retain(|tenant| { + tenant.env.eq(&config.env) && config.tenant_id.is_none_or(|id| tenant.id.eq(&id)) + }); + + let mut migrated_tenants = Vec::new(); + + for mut tenant in tenants { + if tenant.db_iam_user_name.is_some() { + tracing::debug!(?tenant, "skipping tenant with iam user name already set"); + continue; + } + + migrate_tenant_secret_to_iam( + &managed_server.db_provider, + &managed_server.secrets, + &mut tenant, + ) + .await?; + migrated_tenants.push(tenant); + } + + let payload = serde_json::to_value(migrated_tenants)?; + Ok(payload) +} diff --git a/lambdas/management/src/commands/mod.rs b/lambdas/management/src/commands/mod.rs new file mode 100644 index 0000000..aa827bf --- /dev/null +++ b/lambdas/management/src/commands/mod.rs @@ -0,0 +1,107 @@ +use docbox_management::{ + config::ServerConfigData, + database::sqlx::types::Uuid, + server::ManagedServer, + tenant::{ + create_tenant::CreateTenantConfig, delete_tenant::DeleteTenantOptions, + migrate_tenants::MigrateTenantsConfig, migrate_tenants_search::MigrateTenantsSearchConfig, + migrate_tenants_storage::MigrateTenantsStorageConfig, + }, +}; +use lambda_runtime::Diagnostic; +use serde::Deserialize; + +mod migrate; +mod root; +mod tenant; +mod tenants; + +#[derive(Debug, Deserialize)] +#[serde(tag = "command", content = "payload")] +pub enum Command { + /// Create and initialize the root database + CreateRoot, + /// Check the root database is initialized + CheckRoot, + /// Create a new tenant + CreateTenant(CreateTenantConfig), + /// Get a specific tenant + GetTenant(GetTenantCommand), + /// Delete a tenant + DeleteTenant(DeleteTenantCommand), + /// Get a list of tenants + GetTenants(GetTenantsCommand), + /// Set the allowed CORS origins for a tenant + SetTenantAllowedCorsOrigins(SetTenantAllowedCorsOriginsCommand), + /// Apply database migrations for a collection of tenants + Migrate(MigrateTenantsConfig), + /// Apply root migrations + MigrateRoot, + /// Apply search migrations for a collection of tenants + MigrateSearch(MigrateTenantsSearchConfig), + /// Apply storage migrations for a collection of tenants + MigrateStorage(MigrateTenantsStorageConfig), + /// Migrate a tenant from secrets based DB authentication to IAM authentication + MigrateIAM(MigrateTenantIamCommand), +} + +#[derive(Debug, Deserialize)] +pub struct GetTenantCommand { + pub env: String, + pub tenant_id: Uuid, +} + +#[derive(Debug, Deserialize)] +pub struct DeleteTenantCommand { + pub env: String, + pub tenant_id: Uuid, + pub options: DeleteTenantOptions, +} + +#[derive(Debug, Deserialize)] +pub struct SetTenantAllowedCorsOriginsCommand { + pub env: String, + pub tenant_id: Uuid, + pub origins: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct GetTenantsCommand { + pub env: Option, +} + +#[derive(Debug, Deserialize)] +pub struct MigrateTenantIamCommand { + pub env: String, + pub tenant_id: Option, +} + +pub async fn execute_command( + managed_server: &ManagedServer, + config: &ServerConfigData, + command: Command, +) -> Result { + let result = match command { + Command::CreateRoot => root::create_root(managed_server, config).await, + Command::CheckRoot => root::check_root(managed_server).await, + Command::CreateTenant(tenant_config) => { + tenant::create_tenant(managed_server, tenant_config).await + } + Command::GetTenant(command) => tenant::get_tenant(managed_server, command).await, + Command::DeleteTenant(command) => { + tenant::delete_tenant(managed_server, config, command).await + } + Command::GetTenants(command) => tenants::get_tenants(managed_server, command).await, + Command::SetTenantAllowedCorsOrigins(command) => { + tenant::set_allowed_storage_cors_origins(managed_server, command).await + } + Command::Migrate(command) => migrate::migrate(managed_server, command).await, + Command::MigrateRoot => migrate::migrate_root(managed_server).await, + Command::MigrateSearch(command) => migrate::migrate_search(managed_server, command).await, + Command::MigrateStorage(command) => migrate::migrate_storage(managed_server, command).await, + Command::MigrateIAM(command) => migrate::migrate_tenant_iam(managed_server, command).await, + }; + + let payload = result?; + Ok(payload) +} diff --git a/lambdas/management/src/commands/root.rs b/lambdas/management/src/commands/root.rs new file mode 100644 index 0000000..7788150 --- /dev/null +++ b/lambdas/management/src/commands/root.rs @@ -0,0 +1,28 @@ +use crate::error::CommandResult; +use docbox_management::{config::ServerConfigData, server::ManagedServer}; +use serde_json::json; + +pub async fn create_root( + managed_server: &ManagedServer, + config: &ServerConfigData, +) -> CommandResult { + if config.database.root_iam { + docbox_management::root::initialize::initialize_iam(&managed_server.db_provider).await?; + } else if let Some(root_secret_name) = config.database.root_secret_name.as_ref() { + docbox_management::root::initialize::initialize( + &managed_server.db_provider, + &managed_server.secrets, + root_secret_name, + ) + .await?; + } + + Ok(json!({ "success": true })) +} + +pub async fn check_root(managed_server: &ManagedServer) -> CommandResult { + let is_initialized = + docbox_management::root::initialize::is_initialized(&managed_server.db_provider).await?; + + Ok(json!({ "is_initialized": is_initialized})) +} diff --git a/lambdas/management/src/commands/tenant.rs b/lambdas/management/src/commands/tenant.rs new file mode 100644 index 0000000..ca08525 --- /dev/null +++ b/lambdas/management/src/commands/tenant.rs @@ -0,0 +1,109 @@ +use docbox_management::{ + config::ServerConfigData, + core::tenant::tenant_options_ext::TenantOptionsExt, + server::ManagedServer, + tenant::{ + create_tenant::CreateTenantConfig, delete_tenant::DeleteTenant, + flush_tenant_cache::flush_tenant_cache, + }, +}; +use serde_json::json; + +use crate::{ + commands::{DeleteTenantCommand, GetTenantCommand, SetTenantAllowedCorsOriginsCommand}, + error::{CommandResult, TenantNotFoundError}, +}; + +pub async fn create_tenant( + managed_server: &ManagedServer, + tenant_config: CreateTenantConfig, +) -> CommandResult { + tracing::info!(?tenant_config, "creating tenant"); + + let tenant = docbox_management::tenant::create_tenant::create_tenant( + &managed_server.db_provider, + &managed_server.search, + &managed_server.storage, + &managed_server.secrets, + tenant_config, + ) + .await?; + + tracing::info!(?tenant, "tenant created successfully"); + let payload = serde_json::to_value(&tenant)?; + Ok(payload) +} + +pub async fn get_tenant( + managed_server: &ManagedServer, + command: GetTenantCommand, +) -> CommandResult { + let tenant = docbox_management::tenant::get_tenant::get_tenant( + &managed_server.db_provider, + &command.env, + command.tenant_id, + ) + .await? + .ok_or(TenantNotFoundError)?; + + let payload = serde_json::to_value(&tenant)?; + Ok(payload) +} + +pub async fn delete_tenant( + managed_server: &ManagedServer, + config: &ServerConfigData, + command: DeleteTenantCommand, +) -> CommandResult { + let tenant = docbox_management::tenant::get_tenant::get_tenant( + &managed_server.db_provider, + &command.env, + command.tenant_id, + ) + .await? + .ok_or(TenantNotFoundError)?; + + // Must close the connections in advance to ensure the tenant + // database can be deleted + managed_server.db_cache.close_tenant_pool(&tenant).await; + + // Tell the API server to flush and close its database pools + flush_tenant_cache(&config.api).await?; + + docbox_management::tenant::delete_tenant::delete_tenant( + &managed_server.db_provider, + &managed_server.search, + &managed_server.storage, + &managed_server.events, + &managed_server.secrets, + DeleteTenant { + env: command.env, + tenant_id: command.tenant_id, + options: command.options, + }, + ) + .await?; + + Ok(json!({})) +} + +pub async fn set_allowed_storage_cors_origins( + managed_server: &ManagedServer, + command: SetTenantAllowedCorsOriginsCommand, +) -> CommandResult { + let tenant = docbox_management::tenant::get_tenant::get_tenant( + &managed_server.db_provider, + &command.env, + command.tenant_id, + ) + .await? + .ok_or(TenantNotFoundError)?; + + let storage = managed_server + .storage + .create_layer(tenant.storage_layer_options()); + + storage.set_bucket_cors_origins(command.origins).await?; + + Ok(json!({})) +} diff --git a/lambdas/management/src/commands/tenants.rs b/lambdas/management/src/commands/tenants.rs new file mode 100644 index 0000000..ca610d1 --- /dev/null +++ b/lambdas/management/src/commands/tenants.rs @@ -0,0 +1,17 @@ +use crate::{commands::GetTenantsCommand, error::CommandResult}; +use docbox_management::server::ManagedServer; + +pub async fn get_tenants( + managed_server: &ManagedServer, + command: GetTenantsCommand, +) -> CommandResult { + let mut tenants = + docbox_management::tenant::get_tenants::get_tenants(&managed_server.db_provider).await?; + + if let Some(env) = command.env { + tenants.retain(|tenant| tenant.env.eq(&env)); + } + + let payload = serde_json::to_value(tenants)?; + Ok(payload) +} diff --git a/lambdas/management/src/error.rs b/lambdas/management/src/error.rs new file mode 100644 index 0000000..d295e67 --- /dev/null +++ b/lambdas/management/src/error.rs @@ -0,0 +1,120 @@ +use docbox_management::{ + core::storage::StorageLayerError, + database::DbErr, + root::{initialize::InitializeError, migrate_root::MigrateRootError}, + tenant::{ + create_tenant::CreateTenantError, delete_tenant::DeleteTenantError, + flush_tenant_cache::FlushTenantCacheError, migrate_tenant_secret_to_iam::MigrateIAMError, + migrate_tenants::MigrateTenantsError, migrate_tenants_search::MigrateTenantsSearchError, + migrate_tenants_storage::MigrateTenantsStorageError, + }, +}; +use lambda_runtime::Diagnostic; +use std::{ + error::Error, + fmt::{Debug, Display}, +}; +use thiserror::Error; + +pub type CommandResult = Result; + +/// Wrapper for dynamic error handling using [HttpError] types +pub struct DynCommandError { + /// The dynamic error cause + inner: Box, +} + +impl Debug for DynCommandError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple(self.inner.type_name()) + .field(&self.inner) + .finish() + } +} + +impl Display for DynCommandError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + Display::fmt(&self.inner, f) + } +} + +impl Error for DynCommandError {} + +impl From for Diagnostic { + fn from(value: DynCommandError) -> Self { + Diagnostic { + error_type: value.inner.code(), + error_message: value.inner.reason(), + } + } +} + +/// Trait implemented by errors that can be converted into [HttpError]s +/// and used as error responses +pub trait CommandError: Error + Send + Sync + 'static { + /// Provides the HTTP [StatusCode] to use when creating this error response + fn code(&self) -> String { + "INTERNAL_ERROR".to_string() + } + + /// Provides the reason message to use in the error response + fn reason(&self) -> String { + self.to_string() + } + + /// Provides the full type name for the actual error type thats been + /// erased by dynamic typing (For better error source clarity) + fn type_name(&self) -> &str { + std::any::type_name::() + } +} + +/// Allow conversion from implementors of [HttpError] into a [DynHttpError] +impl From for DynCommandError +where + E: CommandError, +{ + fn from(value: E) -> Self { + DynCommandError { + inner: Box::new(value), + } + } +} + +impl CommandError for serde_json::Error { + fn code(&self) -> String { + "SERIALIZE_VALUE".to_string() + } +} + +impl CommandError for MigrateTenantsStorageError {} + +impl CommandError for DbErr {} + +impl CommandError for DeleteTenantError {} + +impl CommandError for FlushTenantCacheError {} + +impl CommandError for CreateTenantError {} + +impl CommandError for StorageLayerError {} + +impl CommandError for InitializeError {} + +impl CommandError for MigrateTenantsError {} + +impl CommandError for MigrateRootError {} + +impl CommandError for MigrateIAMError {} + +impl CommandError for MigrateTenantsSearchError {} + +#[derive(Debug, Error)] +#[error("tenant not found")] +pub struct TenantNotFoundError; + +impl CommandError for TenantNotFoundError { + fn code(&self) -> String { + "TENANT_NOT_FOUND".to_string() + } +} diff --git a/lambdas/management/src/main.rs b/lambdas/management/src/main.rs new file mode 100644 index 0000000..75291d0 --- /dev/null +++ b/lambdas/management/src/main.rs @@ -0,0 +1,72 @@ +#![recursion_limit = "256"] +use docbox_management::{ + config::{ServerConfigData, load_server_config_data_secret}, + core::aws::aws_config, + server::{ManagedServer, load_managed_server}, +}; +use lambda_runtime::{Diagnostic, LambdaEvent, service_fn}; +use std::sync::OnceLock; +use thiserror::Error; + +use crate::commands::{Command, execute_command}; + +mod commands; +mod error; + +/// The server version extracted from the Cargo.toml +pub const VERSION: &str = env!("CARGO_PKG_VERSION"); + +struct AppState { + managed_server: ManagedServer, + config: ServerConfigData, +} + +static APP_STATE: OnceLock = OnceLock::new(); + +#[tokio::main] +async fn main() -> Result<(), lambda_runtime::Error> { + #[cfg(debug_assertions)] + { + _ = dotenvy::dotenv(); + } + + lambda_runtime::tracing::init_default_subscriber(); + + // Load AWS configuration + let aws_config = aws_config().await; + + let config_secret_name = std::env::var("DOCBOX_MANAGEMENT_CONFIG_SECRET_NAME") + .map_err(|_| MissingConfigSecretName)?; + + // Load the config data + let config: ServerConfigData = + load_server_config_data_secret(&aws_config, &config_secret_name).await?; + + let managed_server = load_managed_server(&aws_config, &config).await?; + + if APP_STATE + .set(AppState { + managed_server, + config, + }) + .is_err() + { + panic!("failed to setup global app state") + } + + lambda_runtime::run(service_fn(function_handler)).await +} + +async fn function_handler(event: LambdaEvent) -> Result { + let AppState { + managed_server, + config, + } = APP_STATE.get().expect("app state uninitialized"); + let payload = execute_command(managed_server, config, event.payload).await?; + + Ok(payload) +} + +#[derive(Debug, Error)] +#[error("missing required DOCBOX_MANAGEMENT_CONFIG_SECRET_NAME environment variable")] +struct MissingConfigSecretName; diff --git a/lambdas/upload-completion/Cargo.toml b/lambdas/upload-completion/Cargo.toml index d45e75f..cece9e9 100644 --- a/lambdas/upload-completion/Cargo.toml +++ b/lambdas/upload-completion/Cargo.toml @@ -5,7 +5,7 @@ edition = "2024" [dependencies] aws-config.workspace = true -aws_lambda_events = { version = "1.0.0", default-features = false, features = ["s3"] } +aws_lambda_events = { version = "1.0.0", default-features = false, features = ["s3", "sqs"] } lambda_runtime = "1.0.1" tokio = { version = "1", features = ["macros"] } @@ -17,5 +17,7 @@ thiserror.workspace = true # URL encoding to decode object key names urlencoding = "=2.1.3" +serde_json.workspace = true + tracing.workspace = true dotenvy.workspace = true diff --git a/lambdas/upload-completion/src/event_handler.rs b/lambdas/upload-completion/src/event_handler.rs index e8d8fd7..567a9ff 100644 --- a/lambdas/upload-completion/src/event_handler.rs +++ b/lambdas/upload-completion/src/event_handler.rs @@ -1,5 +1,5 @@ use ::tracing::Instrument; -use aws_lambda_events::event::s3::S3Event; +use aws_lambda_events::{event::s3::S3Event, sqs::SqsEvent}; use docbox_core::{ aws::{SqsClient, aws_config}, database::{ @@ -88,21 +88,31 @@ async fn dependencies() -> Result) -> Result<(), Error> { +pub(crate) async fn outer_function_handler(event: LambdaEvent) -> Result<(), Error> { let dependencies = DEPENDENCIES.get_or_try_init(dependencies).await?; function_handler(event, dependencies).await } async fn function_handler( - event: LambdaEvent, + event: LambdaEvent, dependencies: &Dependencies, ) -> Result<(), Error> { - let (bucket_name, object_key) = match get_object_parts(&event.payload) { - Some(value) => value, - None => return Ok(()), - }; + for message in event.payload.records { + let body = match message.body { + Some(value) => value, + None => continue, + }; + + let event: S3Event = serde_json::from_str(&body)?; + + let (bucket_name, object_key) = match get_object_parts(&event) { + Some(value) => value, + None => continue, + }; + + handle_file_uploaded(dependencies, bucket_name, object_key).await; + } - handle_file_uploaded(dependencies, bucket_name, object_key).await; Ok(()) } diff --git a/lambdas/upload-completion/src/main.rs b/lambdas/upload-completion/src/main.rs index c3d0332..4007a31 100644 --- a/lambdas/upload-completion/src/main.rs +++ b/lambdas/upload-completion/src/main.rs @@ -1,3 +1,4 @@ +#![recursion_limit = "256"] use lambda_runtime::{Error, run, service_fn, tracing}; mod event_handler; diff --git a/terraform/.gitignore b/terraform/.gitignore new file mode 100644 index 0000000..66ee655 --- /dev/null +++ b/terraform/.gitignore @@ -0,0 +1,44 @@ +# Local .terraform directories +.terraform/ + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Ignore transient lock info files created by terraform apply +.terraform.tfstate.lock.info + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc + +# Optional: ignore graph output files generated by `terraform graph` +# *.dot + +# Optional: ignore plan files saved before destroying Terraform configuration +# Uncomment the line below if you want to ignore planout files. +# planout diff --git a/terraform/.terraform.lock.hcl b/terraform/.terraform.lock.hcl new file mode 100644 index 0000000..3b5e9fc --- /dev/null +++ b/terraform/.terraform.lock.hcl @@ -0,0 +1,106 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/archive" { + version = "2.8.0" + hashes = [ + "h1:jdmKm+xl6ZcQrijxapnZ94RVuz/G4vk7hsIa1N0VT5Q=", + "zh:0d14713fdc259fb377d0b899ad3c650a34194bd52194c863303ef22a65a580e2", + "zh:369b56040c7a8085d04e7e8ffac1e2b321a3170e502f788819bc34b868ec016f", + "zh:4d1a3b983ed6af5a52bfe12794674ae55cbadfa6021b37106ade68b433ad216a", + "zh:5c547549e26e083573c78a966ca68ce6d7df6bb8f3948f66a575f07da46b74ea", + "zh:6de093e62a975eb19a5e3017ce38e6e3cb639c17b79648d2000e0a8348f0e997", + "zh:7267936c2cdbc448efeb594d73e6b56a53d6a7ae14fe88cdd2a4133adc3302f0", + "zh:7482f023050ed426b4b45116e1761643bc33b1fd4ce4a6fab207ae2571f35940", + "zh:76bbd93b234e5a2927d98b511d86565700f549b570871a194c35f944b96cefb7", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:c6afc4bc1f002bac9c173007dd4da05fde788cd14c2916089f958c33fedb0dfa", + "zh:d3ba40bd806a3a08e9237dece679193c99afb2085de6b45d7f5d1f673cfcd368", + "zh:e1ad7ded53ecd6f0e5b473a3b44eae2b2e885653a56050ab583d387332be02e4", + "zh:e93e78575ce82be6084cc153c24ba8f385dc8d6880888ee66e918460c870953d", + ] +} + +provider "registry.terraform.io/hashicorp/aws" { + version = "6.54.0" + constraints = "~> 6.54.0" + hashes = [ + "h1:pdl5u/cxTU5ctqlHFr/Z4IPPVIDX9Gt+wBQbzZjLWlM=", + "zh:0557777baa82faa7907adce61a2a3f9b2a487070bb03f29df20a7502edfe966f", + "zh:0767256c36b9c4d4b66d4af882de480c6535ff9eac26410fca253e87b89cb478", + "zh:0be7595ef70273af5eb72d850d45eb264d39796d0578c7f3eda9988d7f0781e5", + "zh:0fd81edad00c8da35b37aa310c7466f7a8d61056b95b37b349c510d21a8a52f6", + "zh:11a976648c864d126a70eb2d40182a17ecfeb3c6c3bf790c4f7eafa5e4c204ba", + "zh:14065875294ea597303ae8e462189041067de3b1f5d97c9f2b04b5d14aeb4f7c", + "zh:55a76258b109f8394cad20c9e07f376fe3051920931bf43d1b62f4d7242f20c8", + "zh:69b04cc363dda4df3d703c3954ae87ef36b0fea8fe45a236db89f8647a879274", + "zh:79e3425219f59e285f128e88a7c294a6d33c7bfa73c57a42e31ac0d8daa2f20a", + "zh:8d6c46c8a215f73c3c1109695a9bfd8894852d0b1c592516f09efb8a84e08b0c", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:9db8f8fac77d6e999a2886df52bebb106b93ba8dfc4fea1e04decc8fda8070cd", + "zh:b4fc365f093b232531905547a50d4f62dbd9d5a843707867520b8b04e8b36e4f", + "zh:c9135045fbc561d30ec72f0b9335fcfe7590eed7e6b4eb8988455e6c8b4d348a", + "zh:db5f51f9f7037428cb7e8f8d43a63e0d3de498c9730fe98a3c539a75cc49208e", + "zh:f807b2a66174b20749c11d58cf7b2ffa8e89b4ec60dd70382959074f8490c387", + ] +} + +provider "registry.terraform.io/hashicorp/http" { + version = "3.6.0" + hashes = [ + "h1:FekY+4cjIw3QBdpk2dVQ20+t8AeDwCK/VaKOnjfeJvw=", + "zh:0996c7db5d7627bc6ab8c4d217f18fb122d60e99e454812b080ee5695cad1003", + "zh:25b7ee0ba9edc912a00365c776d062ae7c66d94050c6c13038447c8e8b95ddf2", + "zh:29c4ba54add6eee7f1d0034d331ba0f14f3046234b1f7520a537e6444e4521b7", + "zh:30a3aa3ef978f8142daf2ced3f9f1ecda8b0831cdc6911e7e930e95eab191b4f", + "zh:30bf0810acdfe96e799ed9b64cb70e96d6f7c033621e0373b9897513977c49c5", + "zh:4ecaaf3dfd20feaa2b92af521018501bc7d874b6a6642ef86ea4cc3c251d737a", + "zh:661760406e3d5372e6725d18ca80734996f21adabc02d82e36ed6d8db07cad7d", + "zh:70dd9556bd2633082efd9681421f89dd4abdde6fcd84834627fa4b8b8f9e7afe", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:973a72066866579ac6fa0e0c9e9eee8e77d238cf78f1b1f96ce6536052fa73ce", + "zh:b2ac9463a9499b478147186027fabee65c04b8f6d963a8df3d49241ce5784fe2", + "zh:c6acc05dc3456c0001b5fb99e1b57005f5a3d3d766f9bddfc21ffe8364fa7535", + "zh:f97f2d57ebcefe62f0644f58e8ba68593f8f05baf7856c99953396aedd14e415", + ] +} + +provider "registry.terraform.io/hashicorp/local" { + version = "2.9.0" + hashes = [ + "h1:9rBZCMNpxKwMlRbWH2QpwD3kqUCAejdOZQ/aiiDObXQ=", + "zh:0baa4566cf77f1ff52f4293d1c8536202dd23edc197c3196413a28343c3ac3a0", + "zh:16b5559c3c07088ddad11a9bb9e9c0799999363c2958e9a5be2bcbbf2cd9ca64", + "zh:197c79015a10d1cce904a8ea722cbc750c42aeae2da53f44a6a0751d9fd1aa90", + "zh:29d0b03e5343a80677ebfeb2e2c31cbe4b1f65e736e53417454a4277fec2544c", + "zh:4896bfa6cf1d2fd562b47ef2e87f47862ae92a04f8ad5d764380f0c6653473b8", + "zh:531f8529cbca49f681883e57761a05a8398afaef6d1ab0d205d26bf12f4428e8", + "zh:6aaf5011d83161c86d2bfb80c0923ec934e578288758da2f37acb7aec129004b", + "zh:7430275253d3d3c40aa6179e0ec0d63212874dbbc06c5a51b9d07ec590f9756c", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:be17dc611e95e26cdf6cad79dfccf1064f0e32032a2efeb939a9bbe7fb1cbfe9", + "zh:f0e3b0aa644202e1d79d2000dca91f6019425da71e9800fa23f27e51c034f195", + "zh:f62bae4519e4ead49182ddc8afe8cf61e2a4c3ba3973b0fbba967736a2696aa3", + "zh:fcafa360a5b0b96244f26f4e3a6d642b716a376557142c2442ff2fb12d11da18", + ] +} + +provider "registry.terraform.io/hashicorp/null" { + version = "3.3.0" + hashes = [ + "h1:l+dm3lhmu4ys7GbvIldfn544olSPH0DOiYruuFSfQkY=", + "zh:021748b5ea3b5f6956f2e75c42c5cdc113b391fb98ac71364a4965d23b37000f", + "zh:3b27956f8541d46704fda234e0d535c2ae2a4b33411848b1ee262a1ec03568b0", + "zh:3de4ed47d6d0f4d8edba4a5092c7c9799950eda63989d8d0d2586e6afcb0aa20", + "zh:57ed8935c7d56dbc91cf2673534582cacfaab7a2f105f51d9f797e99df0c0c47", + "zh:58e176ba1d142827089e30e0711e007309a9f2726e8881986da5026e9778fdf4", + "zh:5949c4a3d4a93f841f155cdb7e991c087e637145c1630572e21948224f8f4923", + "zh:76d60f366b743003c1b085afa769b45b2198ee919927e45807d7d44fb42c067d", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:79cd1bab1261a07f84e917191d7ddc4340ac5f5524283767256f7ffd7f87caf0", + "zh:8ec9083038cf710b30e319eaa467c9df7fa52bbd9969b61053a35bc2cdd2e0a6", + "zh:a6e502cb579685ab7aeb886c2bb11ddd9cfed74b41008592d57cbc3351a9218b", + "zh:acb74d6b4f66ff6acfcda315df802a7432170ef3955c9b432cb4580767004006", + "zh:f0ce55d8d9ffdb33dab612b1246f9bab060a9d54fc32ce2b4a038646155660af", + ] +} diff --git a/terraform/authorizer.js b/terraform/authorizer.js new file mode 100644 index 0000000..d1d93af --- /dev/null +++ b/terraform/authorizer.js @@ -0,0 +1,29 @@ +exports.handler = async (event) => { + // TODO: Real authentication logic + // const methodArn = event.methodArn; + + return { + principalId: "user-session-id", + policyDocument: { + Version: "2012-10-17", + Statement: [ + { + Action: "execute-api:Invoke", + Effect: "Allow", + Resource: "*", + }, + ], + }, + context: { + tenant: JSON.stringify({ + id: "0fa523d6-bbc7-4537-95d6-fe3d23c5eebd", + env: "Production", + }), + user: JSON.stringify({ + id: "8c7c42b8-f18d-4ab1-a1db-c65247ad5704", + name: "Test User", + image_id: "xxxx", + }), + }, + }; +}; diff --git a/terraform/database.tf b/terraform/database.tf new file mode 100644 index 0000000..948c965 --- /dev/null +++ b/terraform/database.tf @@ -0,0 +1,82 @@ +data "aws_vpc" "default" { + id = var.vpc_id +} + +data "aws_subnets" "default" { + filter { + name = "vpc-id" + values = [var.vpc_id] + } +} + +resource "aws_db_subnet_group" "db_subnets" { + name = "docbox-db-subnet-group" + subnet_ids = data.aws_subnets.default.ids + + tags = { + Name = "Docbox DB Subnet Group" + } +} + +resource "aws_security_group" "rds_sg" { + name = "docbox-rds-security-group" + description = "Allows incoming traffic to PostgreSQL" + vpc_id = data.aws_vpc.default.id + + # TODO: Lock down to lambda security group + ingress { + from_port = 5432 + to_port = 5432 + protocol = "tcp" + cidr_blocks = [data.aws_vpc.default.cidr_block] + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } +} + +resource "aws_db_instance" "postgres" { + identifier = "docbox-postgres-db" + allocated_storage = 20 + max_allocated_storage = 100 + engine = "postgres" + engine_version = "16.3" + + instance_class = "db.t3.micro" + + db_name = "docbox" + username = "docbox_admin" + manage_master_user_password = true + + db_subnet_group_name = aws_db_subnet_group.db_subnets.name + vpc_security_group_ids = [aws_security_group.rds_sg.id] + + publicly_accessible = true + skip_final_snapshot = true + iam_database_authentication_enabled = true +} + +# IAM Policy that allows the docbox role to connect to the docbox databases +resource "aws_iam_policy" "docbox_iam_rds_policy" { + name = "docbox_iam_rds_policy" + description = "Allow access to per tenant database and docbox database credentials" + + policy = jsonencode({ + Version = "2012-10-17", + Statement = [{ + Effect = "Allow", + Action = "rds-db:connect" + Resource = [ + # Root database role access + "arn:aws:rds-db:${var.aws_region}:${data.aws_caller_identity.current.account_id}:dbuser:${aws_db_instance.postgres.resource_id}/docbox_config_api", + # Tenant wildcard database roles access + "arn:aws:rds-db:${var.aws_region}:${data.aws_caller_identity.current.account_id}:dbuser:${aws_db_instance.postgres.resource_id}/docbox_*_dev_api", + "arn:aws:rds-db:${var.aws_region}:${data.aws_caller_identity.current.account_id}:dbuser:${aws_db_instance.postgres.resource_id}/docbox_*_prod_api", + ] + }] + }) +} diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 0000000..202a932 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,106 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 6.54.0" + } + } + + required_version = ">= 1.2.0" + + # Use an AWS S3 bucket to store and manage the terraform state + backend "s3" {} +} + +provider "aws" { + region = var.aws_region + profile = var.aws_profile +} + +data "aws_caller_identity" "current" {} + +# ZIP for the authorizer js file +data "archive_file" "authorizer_zip" { + type = "zip" + output_path = "${path.module}/authorizer.zip" + + source { + filename = "index.js" + content = file("authorizer.js") + } +} + +# Lambda for docbox HTTP API +module "authorizer_lambda" { + architecture = var.architecture + source = "./modules/zip_lambda" + zip_source = data.archive_file.authorizer_zip.output_path + function_name = "docbox-authorizer-lambda" + timeout = 60 + memory_size = 256 + handler = "index.handler" + runtime = "nodejs22.x" +} + +# Base docbox infra +module "serverless_docbox" { + source = "./modules/serverless_docbox" + aws_profile = var.aws_profile + aws_region = var.aws_region + architecture = var.architecture + environment_variables = { + RUST_LOG = "debug", + DOCBOX_DB_HOST = aws_db_instance.postgres.address + DOCBOX_DB_PORT = tostring(aws_db_instance.postgres.port) + DOCBOX_DB_ROOT_IAM = "true" + DOCBOX_SEARCH_INDEX_FACTORY = "database", + LOCAL_DEVELOPMENT = tostring(var.local_deploy_override), + } + policy_arns = [ + # Provide database access + aws_iam_policy.docbox_iam_rds_policy.arn + ] + management_policy_arns = [] + use_local_zip = var.use_local_zip + management_config_secret_id = aws_secretsmanager_secret.config_secret.id +} + +# Serverless API gateway into docbox combined with the user defined authorizer +module "serverless_docbox_api" { + source = "./modules/serverless_docbox_api" + + http_lambda_function_name = module.serverless_docbox.http_lambda_function_name + http_lambda_response_streaming_invoke_arn = module.serverless_docbox.http_lambda_response_streaming_invoke_arn + + authorizer_lambda_function_name = module.authorizer_lambda.function_name + authorizer_lambda_invoke_arn = module.authorizer_lambda.function_invoke_arn +} + +resource "aws_secretsmanager_secret" "config_secret" { + name = "docbox-management-config-secret" + description = "Secret containing the management configuration for docbox" +} + +resource "aws_secretsmanager_secret_version" "config_secret_version" { + secret_id = aws_secretsmanager_secret.config_secret.id + secret_string = jsonencode({ + api = { + url = module.serverless_docbox_api.api_endpoint + } + database = { + host = aws_db_instance.postgres.address + port = aws_db_instance.postgres.port + setup_user_secret_name = aws_db_instance.postgres.master_user_secret[0].secret_arn + root_iam = true + } + search = { + provider = "database" + } + secrets = { + provider = "aws" + } + storage = { + provider = "s3" + } + }) +} diff --git a/terraform/modules/office_converter_lambda/README.md b/terraform/modules/office_converter_lambda/README.md new file mode 100644 index 0000000..7ff7207 --- /dev/null +++ b/terraform/modules/office_converter_lambda/README.md @@ -0,0 +1,3 @@ +# Office Convert Lambda + +Module for the office conversion lambda and related resources diff --git a/terraform/modules/office_converter_lambda/ecr.tf b/terraform/modules/office_converter_lambda/ecr.tf new file mode 100644 index 0000000..a565a4b --- /dev/null +++ b/terraform/modules/office_converter_lambda/ecr.tf @@ -0,0 +1,43 @@ +locals { + is_windows = substr(pathexpand("~"), 0, 1) == "/" ? false : true + + # TODO: I NEED TO PULL THESE OVER + script_hash = filemd5(local.is_windows ? "./scripts/pull-converter-image.ps1" : "./scripts/pull-converter-image.sh") +} + +# ECR repository is required as the lambda cannot use an image from a public ECR +resource "aws_ecr_repository" "docbox_ecr_private" { + name = "docbox-office-convert-lambda" + image_tag_mutability = "MUTABLE" + + image_scanning_configuration { + scan_on_push = true + } +} + +# Use null_resource to trigger the pull-through cache +# +# This pulls the docker image for the lambda through the public ECR +# and into our private ECR +resource "null_resource" "trigger_cache_pull" { + provisioner "local-exec" { + command = templatefile(local.is_windows ? "./scripts/pull-converter-image.ps1" : "./scripts/pull-converter-image.sh", { + aws_region = var.aws_region + aws_profile = var.aws_profile + + ecr_repo = aws_ecr_repository.docbox_ecr_private.repository_url + source_image = "${var.source_image_url}:${var.source_image_tag}" + dest_image = "${aws_ecr_repository.docbox_ecr_private.repository_url}:${var.source_image_tag}" + }) + + interpreter = local.is_windows ? ["PowerShell", "-Command"] : ["bash", "-c"] + on_failure = fail + } + + # Re-run if the image tag or cache rule changes + triggers = { + image_ref = "${var.source_image_url}:${var.source_image_tag}" + ecr_repo = aws_ecr_repository.docbox_ecr_private.id + script_hash = local.script_hash + } +} diff --git a/terraform/modules/office_converter_lambda/iam.tf b/terraform/modules/office_converter_lambda/iam.tf new file mode 100644 index 0000000..2f69692 --- /dev/null +++ b/terraform/modules/office_converter_lambda/iam.tf @@ -0,0 +1,74 @@ +# Role for the office converter lambda +resource "aws_iam_role" "docbox_office_converter_role" { + name = "docbox_office_converter_role" + + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [{ + Effect = "Allow" + Principal = { + Service = "lambda.amazonaws.com" + } + Action = "sts:AssumeRole" + }] + }) +} + +# Attach the AWSLambdaBasicExecutionRole role policy +resource "aws_iam_role_policy_attachment" "docbox_office_converter_role_basic_execution" { + role = aws_iam_role.docbox_office_converter_role.name + policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" +} + + +# IAM Policy that allows performing the following actions on S3 scoped to +# the office converter temporary bucket: +# - Upload files +# - Get files +# - Delete files +# This is granted to both the office converter role and the docbox role +# (Docbox must store input and read output, converter must read, store, and delete) +resource "aws_iam_policy" "docbox_office_converter_s3_access_policy" { + name = "docbox_office_converter_s3_access_policy" + description = "Allows S3 access to the office converter temporary bucket" + + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Action = [ + "s3:PutObject", + "s3:GetObject", + "s3:DeleteObject" + ] + Resource = [ + "${aws_s3_bucket.docbox_office_converter_bucket.arn}/*" + ] + } + ] + }) +} + +# Attach the "docbox_sqs_read" policy to the office converter role +resource "aws_iam_role_policy_attachment" "docbox_office_converter_role_converter_s3_access" { + role = aws_iam_role.docbox_office_converter_role.name + policy_arn = aws_iam_policy.docbox_office_converter_s3_access_policy.arn +} + +# IAM Policy to allow invoking the converter lambda +resource "aws_iam_policy" "docbox_office_converter_invoke" { + name = "docbox-office-converter-invoke-policy" + description = "Allows invoking the office converter lambda" + + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Action = ["lambda:InvokeFunction"] + Resource = aws_lambda_function.office_converter.arn + } + ] + }) +} diff --git a/terraform/modules/office_converter_lambda/main.tf b/terraform/modules/office_converter_lambda/main.tf new file mode 100644 index 0000000..175f97f --- /dev/null +++ b/terraform/modules/office_converter_lambda/main.tf @@ -0,0 +1,26 @@ +# Lambda for performing office file conversions (https://github.com/jacobtread/office-convert-lambda) +resource "aws_lambda_function" "office_converter" { + function_name = "docbox-office-convert-lambda" + role = aws_iam_role.docbox_office_converter_role.arn + package_type = "Image" + + architectures = [var.architecture] + + image_uri = "${aws_ecr_repository.docbox_ecr_private.repository_url}:${var.source_image_tag}" + + timeout = 60 + memory_size = 2048 + + environment { + variables = { + // Tell the converter to abort and kill the program if it + // spends longer than 55s trying to convert a file + // (Consider the program to have hanged) + "CONVERT_TIMEOUT_SECONDS" = "55" + } + } + + depends_on = [ + null_resource.trigger_cache_pull + ] +} diff --git a/terraform/modules/office_converter_lambda/outputs.tf b/terraform/modules/office_converter_lambda/outputs.tf new file mode 100644 index 0000000..567f858 --- /dev/null +++ b/terraform/modules/office_converter_lambda/outputs.tf @@ -0,0 +1,30 @@ +# Name of the office converter function for invoking +output "function_name" { + value = aws_lambda_function.office_converter.function_name +} + +# ARN of the office converter function +output "function_arn" { + value = aws_lambda_function.office_converter.arn +} + +# ARN for the ECR containing the office converter image +output "ecr_arn" { + value = aws_ecr_repository.docbox_ecr_private.arn +} + +# ARN for the aws_iam_policy that allows access to the office converter temporary +# S3 bucket for uploading input files, downloading output files, and deleting both +output "s3_access_policy_arn" { + value = aws_iam_policy.docbox_office_converter_s3_access_policy.arn +} + +# ARN for the aws_iam_policy that allows invoking the office converter lambda +output "invoke_policy_arn" { + value = aws_iam_policy.docbox_office_converter_invoke.arn +} + +# S3 bucket for uploads and downloads +output "bucket" { + value = aws_s3_bucket.docbox_office_converter_bucket.bucket +} diff --git a/terraform/modules/office_converter_lambda/s3.tf b/terraform/modules/office_converter_lambda/s3.tf new file mode 100644 index 0000000..d8c285e --- /dev/null +++ b/terraform/modules/office_converter_lambda/s3.tf @@ -0,0 +1,21 @@ + +# Temporary bucket for the office converter lambda to use +resource "aws_s3_bucket" "docbox_office_converter_bucket" { + bucket = "docbox-office-converter-tmp" +} + +# Enforce a short 1 day lifecycle for objects within the temporary bucket +resource "aws_s3_bucket_lifecycle_configuration" "docbox_office_converter_bucket_lifecycle" { + bucket = aws_s3_bucket.docbox_office_converter_bucket.id + + rule { + id = "expire-after-1-day" + status = "Enabled" + + filter {} + + expiration { + days = 1 + } + } +} diff --git a/terraform/modules/office_converter_lambda/variables.tf b/terraform/modules/office_converter_lambda/variables.tf new file mode 100644 index 0000000..abdcd6a --- /dev/null +++ b/terraform/modules/office_converter_lambda/variables.tf @@ -0,0 +1,28 @@ +variable "aws_region" { + description = "The AWS region to deploy the resources" + type = string +} + +variable "aws_profile" { + description = "The AWS cli profile to use" + type = string +} + +variable "source_image_url" { + description = "Source public ECR image" + type = string + default = "public.ecr.aws/jacobtread/office-convert-lambda" +} + +variable "source_image_tag" { + description = "Source public ECR image tag" + type = string + default = "0.1.0" +} + + +variable "architecture" { + type = string + description = "The name of the Lambda function" + default = "arm64" +} diff --git a/terraform/modules/serverless_docbox/cleanup_lambda.tf b/terraform/modules/serverless_docbox/cleanup_lambda.tf new file mode 100644 index 0000000..c6fdcc7 --- /dev/null +++ b/terraform/modules/serverless_docbox/cleanup_lambda.tf @@ -0,0 +1,46 @@ +locals { + cleanup_lambda_environment_variables = local.shared_environment_variables + cleanup_lambda_policies = concat(var.policy_arns, [ + # Provide access to S3 storage for docbox-* buckets + aws_iam_policy.docbox_s3_access_policy.arn, + # TODO: Policy to allow execution via event + ]) + + cleanup_lambda_zip_path = "${path.module}/../../../target/lambda/docbox-cleanup-lambda/bootstrap.zip" + cleanup_lambda_download_url = "${local.serverless_base_url}/docbox-cleanup-lambda-${local.serverless_zip_arch}.zip" +} + +# Lambda for the automated presigned database&s3 cleanup task +module "presigned_cleanup_lambda" { + architecture = var.architecture + source = "../zip_lambda" + function_name = var.cleanup_lambda_function_name + zip_source = var.use_local_zip ? local.cleanup_lambda_zip_path : local.cleanup_lambda_download_url + timeout = var.cleanup_lambda_timeout + memory_size = var.cleanup_lambda_memory_size + environment_variables = local.cleanup_lambda_environment_variables + additional_policy_arns = local.cleanup_lambda_policies +} + +# Setup a schedule event rule +resource "aws_cloudwatch_event_rule" "cleanup_schedule" { + name = "docbox-cleanup-lambda-schedule" + description = "Triggers cleanup lambda on a schedule" + schedule_expression = var.cleanup_schedule_expression +} + +# Create the lambda invoke target +resource "aws_cloudwatch_event_target" "lambda_target" { + rule = aws_cloudwatch_event_rule.cleanup_schedule.name + target_id = "SendToLambda" + arn = module.presigned_cleanup_lambda.function_arn +} + +# Create the invoke permission +resource "aws_lambda_permission" "allow_eventbridge" { + statement_id = "AllowExecutionFromEventBridge" + action = "lambda:InvokeFunction" + function_name = module.presigned_cleanup_lambda.function_name + principal = "events.amazonaws.com" + source_arn = aws_cloudwatch_event_rule.cleanup_schedule.arn +} diff --git a/terraform/modules/serverless_docbox/http_lambda.tf b/terraform/modules/serverless_docbox/http_lambda.tf new file mode 100644 index 0000000..2658414 --- /dev/null +++ b/terraform/modules/serverless_docbox/http_lambda.tf @@ -0,0 +1,25 @@ +locals { + http_lambda_environment_variables = merge(local.shared_environment_variables, { + AWS_LAMBDA_HTTP_IGNORE_STAGE_IN_PATH = "true", + }) + + http_lambda_policies = concat(var.policy_arns, [ + # Provide access to S3 storage for docbox-* buckets + aws_iam_policy.docbox_s3_access_policy.arn, + ]) + + http_lambda_zip_path = "${path.module}/../../../target/lambda/docbox-http-lambda/bootstrap.zip" + http_lambda_download_url = "${local.serverless_base_url}/docbox-http-lambda-${local.serverless_zip_arch}.zip" +} + +# Lambda for docbox HTTP API +module "http_lambda" { + architecture = var.architecture + source = "../zip_lambda" + zip_source = var.use_local_zip ? local.http_lambda_zip_path : local.http_lambda_download_url + function_name = var.http_lambda_function_name + timeout = var.http_lambda_timeout + memory_size = var.http_lambda_memory_size + environment_variables = local.http_lambda_environment_variables + additional_policy_arns = local.http_lambda_policies +} diff --git a/terraform/modules/serverless_docbox/iam.tf b/terraform/modules/serverless_docbox/iam.tf new file mode 100644 index 0000000..1dfe226 --- /dev/null +++ b/terraform/modules/serverless_docbox/iam.tf @@ -0,0 +1,28 @@ +# IAM Policy that allows the docbox role to perform the following actions on S3 scoped to docbox-* buckets: +# - Upload files +# - Tag uploaded files +# - Get files +# - Delete files +resource "aws_iam_policy" "docbox_s3_access_policy" { + name = "docbox_s3_access_policy" + description = "Allows S3 access to freely modify any buckets prefixed with docbox- for the docbox EC2" + + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + # Object level actions + { + Effect = "Allow" + Action = [ + "s3:PutObject", + "s3:PutObjectTagging", + "s3:GetObject", + "s3:DeleteObject" + ] + Resource = [ + "arn:aws:s3:::docbox-*/*" + ] + } + ] + }) +} diff --git a/terraform/modules/serverless_docbox/main.tf b/terraform/modules/serverless_docbox/main.tf new file mode 100644 index 0000000..6d1aa4e --- /dev/null +++ b/terraform/modules/serverless_docbox/main.tf @@ -0,0 +1,9 @@ +locals { + serverless_repo = "docbox-nz/docbox-serverless-lambda" + serverless_version = "0.0.2" + serverless_base_url = "https://github.com/${local.serverless_repo}/releases/download/${local.serverless_version}" + serverless_zip_arch = var.architecture == "x86_64" ? "amd64" : "arm64" + shared_environment_variables = merge(var.environment_variables, { + RUST_LOG = "debug,docbox_core::notifications::sqs=info" + }) +} diff --git a/terraform/modules/serverless_docbox/management_lambda.tf b/terraform/modules/serverless_docbox/management_lambda.tf new file mode 100644 index 0000000..b8af05f --- /dev/null +++ b/terraform/modules/serverless_docbox/management_lambda.tf @@ -0,0 +1,51 @@ +locals { + management_lambda_environment_variables = merge(local.shared_environment_variables, { + DOCBOX_MANAGEMENT_CONFIG_SECRET_NAME = var.management_config_secret_id + }) + management_lambda_policies = concat(var.policy_arns, var.management_policy_arns, [ + aws_iam_policy.docbox_management_lambda_s3.arn + ]) + + management_lambda_zip_path = "${path.module}/../../../target/lambda/docbox-management-lambda/bootstrap.zip" + management_lambda_download_url = "${local.serverless_base_url}/docbox-management-lambda-${local.serverless_zip_arch}.zip" +} + +# Lambda for management of the serverless docbox setup +# (Since in most cases its not going to be easy to access the database and other resources directly) +module "management_lambda" { + architecture = var.architecture + source = "../zip_lambda" + function_name = var.management_lambda_function_name + zip_source = var.use_local_zip ? local.management_lambda_zip_path : local.management_lambda_download_url + timeout = var.management_lambda_timeout + memory_size = var.management_lambda_memory_size + environment_variables = local.management_lambda_environment_variables + additional_policy_arns = local.management_lambda_policies +} + +resource "aws_iam_policy" "docbox_management_lambda_s3" { + name = "docbox-management-lambda-s3-access" + description = "Allows management of docbox S3 buckets" + + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + # Bucket level actions + { + Effect = "Allow" + Action = [ + "s3:HeadBucket", + "s3:CreateBucket", + "s3:DeleteBucket", + "s3:PutBucketNotificationConfiguration", + "s3:PutBucketCors", + "s3:GetBucketLifecycleConfiguration", + "s3:PutBucketLifecycleConfiguration", + ] + Resource = [ + "arn:aws:s3:::docbox-*", + ] + } + ] + }) +} diff --git a/terraform/modules/serverless_docbox/outputs.tf b/terraform/modules/serverless_docbox/outputs.tf new file mode 100644 index 0000000..f631522 --- /dev/null +++ b/terraform/modules/serverless_docbox/outputs.tf @@ -0,0 +1,19 @@ +# ARN for the S3 upload topic +output "sqs_upload_notifications_arn" { + value = aws_sqs_queue.docbox_queue.arn +} + +# URL for the uploads event queue +output "sqs_upload_queue_url" { + value = aws_sqs_queue.docbox_queue.url +} + +# Streaming invoke ARN for the HTTP lambda +output "http_lambda_response_streaming_invoke_arn" { + value = module.http_lambda.response_streaming_invoke_arn +} + +# Function name of the HTTP lambda +output "http_lambda_function_name" { + value = module.http_lambda.function_name +} diff --git a/terraform/modules/serverless_docbox/upload_completion_lambda.tf b/terraform/modules/serverless_docbox/upload_completion_lambda.tf new file mode 100644 index 0000000..f3f2ab6 --- /dev/null +++ b/terraform/modules/serverless_docbox/upload_completion_lambda.tf @@ -0,0 +1,82 @@ +locals { + upload_completion_lambda_environment_variables = merge(local.shared_environment_variables, { + DOCBOX_OFFICE_CONVERTER = "lambda" + DOCBOX_CONVERT_LAMBDA_TMP_BUCKET = module.office_converter_lambda.bucket + DOCBOX_CONVERT_LAMBDA_FUNCTION_NAME = module.office_converter_lambda.function_name + }) + upload_completion_lambda_policies = concat(var.policy_arns, [ + # We need to attach the SQS Queue Execution role so that SQS can trigger this + # lambda based on S3 events + "arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole", + # Provide access the office converter temporary S3 bucket + module.office_converter_lambda.s3_access_policy_arn, + # Provide invoke access to the office converter lambda + module.office_converter_lambda.invoke_policy_arn + ]) + + upload_completion_lambda_zip_path = "${path.module}/../../../target/lambda/docbox-upload-completion-lambda/bootstrap.zip" + upload_completion_lambda_download_url = "${local.serverless_base_url}/docbox-upload-completion-lambda-${local.serverless_zip_arch}.zip" +} + +# Lambda for performing office file conversion +module "office_converter_lambda" { + aws_profile = var.aws_profile + aws_region = var.aws_region + architecture = var.architecture + source = "../office_converter_lambda" +} + +# Lambda for handling file processing on upload completion +module "upload_completion_lambda" { + architecture = var.architecture + source = "../zip_lambda" + function_name = var.upload_completion_lambda_function_name + zip_source = var.use_local_zip ? local.upload_completion_lambda_zip_path : local.upload_completion_lambda_download_url + timeout = var.upload_completion_lambda_timeout + memory_size = var.upload_completion_lambda_memory_size + environment_variables = local.upload_completion_lambda_environment_variables + additional_policy_arns = local.upload_completion_lambda_policies +} + +# Queue for file upload messages +resource "aws_sqs_queue" "docbox_queue" { + name = "docbox-s3-upload-queue" + tags = { + Name = "docbox-sqs-queue" + } +} + +# Pass events from the S3 upload queue to the upload completion lambda +resource "aws_lambda_event_source_mapping" "sqs_trigger" { + event_source_arn = aws_sqs_queue.docbox_queue.arn + function_name = module.upload_completion_lambda.function_name + batch_size = 1 # Perform trigger in 1 item batches to make failure easier to handle + depends_on = [module.upload_completion_lambda] +} + + +# Policy on the docbox S3 notification SQS queue that permits AWS S3 +# to push new messages onto the queue +resource "aws_sqs_queue_policy" "docbox_s3_sqs_policy" { + queue_url = aws_sqs_queue.docbox_queue.id + + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Sid = "docbox-queue-events" + Effect = "Allow" + Principal = { + Service = "s3.amazonaws.com" + } + Action = "SQS:SendMessage" + Resource = aws_sqs_queue.docbox_queue.arn + Condition = { + ArnLike = { + "aws:SourceArn" = "arn:aws:s3:::docbox-*" + } + } + } + ] + }) +} diff --git a/terraform/modules/serverless_docbox/variables.tf b/terraform/modules/serverless_docbox/variables.tf new file mode 100644 index 0000000..fa6ac84 --- /dev/null +++ b/terraform/modules/serverless_docbox/variables.tf @@ -0,0 +1,118 @@ +variable "architecture" { + type = string + description = "The architecture of the Lambda function" + default = "arm64" +} + +variable "use_local_zip" { + type = bool + description = "Whether to use a local zip of docbox" + default = false +} + +variable "policy_arns" { + type = list(string) + description = "ARNs of required IAM policies for the lambdas (HTTP, Presigned Cleanup, Upload Completion) include your database IAM policy ARN here " +} + +variable "management_policy_arns" { + type = list(string) + description = "ARNs of required IAM policies for the the management lambda, these should be the policies that allow it to perform required setup actions" +} + + +variable "management_config_secret_id" { + type = string + description = "ID of the secret that the management config is stored in" +} + +variable "environment_variables" { + type = map(string) + description = "The shared environment variables mapping required by Docbox services" + default = {} +} + +variable "aws_region" { + description = "The AWS region to deploy the resources" + type = string +} + +variable "aws_profile" { + description = "The AWS cli profile to use" + type = string +} + +variable "http_lambda_timeout" { + description = "Timeout for the http lambda" + default = 60 +} + +variable "http_lambda_memory_size" { + description = "Memory size for the http lambda" + type = number + default = 256 +} + +variable "http_lambda_function_name" { + description = "Function name for the http lambda" + type = string + default = "docbox-http-lambda" +} + +variable "upload_completion_lambda_timeout" { + description = "Timeout for the file upload completion lambda" + type = number + default = 900 +} + +variable "upload_completion_lambda_memory_size" { + description = "Memory size for the file upload completion lambda" + type = number + default = 512 +} + +variable "upload_completion_lambda_function_name" { + description = "Function name for the upload completion lambda" + type = string + default = "docbox-upload-completion-lambda" +} + +variable "management_lambda_timeout" { + description = "Timeout for the management lambda" + default = 60 +} + +variable "management_lambda_memory_size" { + description = "Memory size for the management lambda" + type = number + default = 128 +} + +variable "management_lambda_function_name" { + description = "Function name for the management lambda" + type = string + default = "docbox-management-lambda" +} + +variable "cleanup_lambda_timeout" { + description = "Timeout for the cleanup lambda" + default = 180 +} + +variable "cleanup_lambda_memory_size" { + description = "Memory size for the cleanup lambda" + type = number + default = 256 +} + +variable "cleanup_lambda_function_name" { + description = "Function name for the cleanup lambda" + type = string + default = "docbox-cleanup-lambda" +} + +variable "cleanup_schedule_expression" { + description = "Schedule expression for how often the cleanup lambda should run" + type = string + default = "rate(1 day)" +} diff --git a/terraform/modules/serverless_docbox_api/main.tf b/terraform/modules/serverless_docbox_api/main.tf new file mode 100644 index 0000000..ffeccf6 --- /dev/null +++ b/terraform/modules/serverless_docbox_api/main.tf @@ -0,0 +1,72 @@ +resource "aws_api_gateway_rest_api" "rest_api" { + name = "docbox-rest-api" +} + +resource "aws_api_gateway_resource" "proxy" { + rest_api_id = aws_api_gateway_rest_api.rest_api.id + parent_id = aws_api_gateway_rest_api.rest_api.root_resource_id + path_part = "{proxy+}" +} + +resource "aws_api_gateway_method" "proxy_method" { + rest_api_id = aws_api_gateway_rest_api.rest_api.id + resource_id = aws_api_gateway_resource.proxy.id + http_method = "ANY" + authorization = "CUSTOM" + authorizer_id = aws_api_gateway_authorizer.auth.id +} + +resource "aws_api_gateway_authorizer" "auth" { + name = "docbox-authorizer" + rest_api_id = aws_api_gateway_rest_api.rest_api.id + authorizer_uri = var.authorizer_lambda_invoke_arn + type = "TOKEN" +} + + +resource "aws_lambda_permission" "apigw_authorizer" { + statement_id = "AllowExecutionFromAPIGatewayAuth" + action = "lambda:InvokeFunction" + function_name = var.authorizer_lambda_function_name + principal = "apigateway.amazonaws.com" + source_arn = "${aws_api_gateway_rest_api.rest_api.execution_arn}/authorizers/${aws_api_gateway_authorizer.auth.id}" +} + + +resource "aws_api_gateway_integration" "lambda_integration" { + rest_api_id = aws_api_gateway_rest_api.rest_api.id + resource_id = aws_api_gateway_resource.proxy.id + http_method = aws_api_gateway_method.proxy_method.http_method + type = "AWS_PROXY" + integration_http_method = "POST" + response_transfer_mode = "STREAM" + uri = var.http_lambda_response_streaming_invoke_arn +} + +resource "aws_api_gateway_deployment" "deployment" { + rest_api_id = aws_api_gateway_rest_api.rest_api.id + + lifecycle { + create_before_destroy = true + + replace_triggered_by = [ + aws_api_gateway_resource.proxy, + aws_api_gateway_method.proxy_method, + aws_api_gateway_integration.lambda_integration + ] + } +} + +resource "aws_api_gateway_stage" "default" { + deployment_id = aws_api_gateway_deployment.deployment.id + rest_api_id = aws_api_gateway_rest_api.rest_api.id + stage_name = "default" +} + +resource "aws_lambda_permission" "apigw_backend" { + statement_id = "AllowExecutionFromAPIGatewayBackend" + action = "lambda:InvokeWithResponseStreaming" + function_name = var.http_lambda_function_name + principal = "apigateway.amazonaws.com" + source_arn = "${aws_api_gateway_rest_api.rest_api.execution_arn}/*/*" +} diff --git a/terraform/modules/serverless_docbox_api/outputs.tf b/terraform/modules/serverless_docbox_api/outputs.tf new file mode 100644 index 0000000..56c9931 --- /dev/null +++ b/terraform/modules/serverless_docbox_api/outputs.tf @@ -0,0 +1,11 @@ +# Output the API endpoint +output "rest_api_id" { + description = "ID of the docbox REST API" + value = aws_api_gateway_stage.default.rest_api_id +} + +# Output the API endpoint +output "api_endpoint" { + description = "The public URL for the docbox API" + value = aws_api_gateway_stage.default.invoke_url +} diff --git a/terraform/modules/serverless_docbox_api/variables.tf b/terraform/modules/serverless_docbox_api/variables.tf new file mode 100644 index 0000000..c9a8ee8 --- /dev/null +++ b/terraform/modules/serverless_docbox_api/variables.tf @@ -0,0 +1,19 @@ +variable "authorizer_lambda_invoke_arn" { + type = string + description = "The invoke ARN the authorizer function" +} + +variable "authorizer_lambda_function_name" { + type = string + description = "The name of the authorizer lambda function" +} + +variable "http_lambda_function_name" { + type = string + description = "The function_name of the HTTP lambda to call through the API gateway" +} + +variable "http_lambda_response_streaming_invoke_arn" { + type = string + description = "The response_streaming_invoke_arn of the HTTP lambda to call through the API gateway" +} diff --git a/terraform/modules/zip_lambda/bootstrap b/terraform/modules/zip_lambda/bootstrap new file mode 100755 index 0000000..d67eff7 Binary files /dev/null and b/terraform/modules/zip_lambda/bootstrap differ diff --git a/terraform/modules/zip_lambda/main.tf b/terraform/modules/zip_lambda/main.tf new file mode 100644 index 0000000..5281c19 --- /dev/null +++ b/terraform/modules/zip_lambda/main.tf @@ -0,0 +1,75 @@ +locals { + is_url = length(regexall("^https?://", var.zip_source)) > 0 + zip_suffix = local.is_url ? "remote" : "local" + download_path = "${path.module}/${var.function_name}-${local.zip_suffix}.zip" +} + +data "http" "lambda_zip" { + count = local.is_url ? 1 : 0 + url = var.zip_source +} + +resource "local_sensitive_file" "downloaded_zip" { + count = local.is_url ? 1 : 0 + content_base64 = data.http.lambda_zip[0].response_body_base64 + filename = local.download_path +} + +locals { + lambda_file_path = local.is_url ? local.download_path : var.zip_source + lambda_source_hash = local.is_url ? base64sha256(data.http.lambda_zip[0].response_body_base64) : filebase64sha256(var.zip_source) +} + +# Generate an execution role unique to this module instance +resource "aws_iam_role" "lambda_exec" { + name = "${var.function_name}-exec-role" + + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Action = "sts:AssumeRole" + Effect = "Allow" + Principal = { + Service = "lambda.amazonaws.com" + } + } + ] + }) +} + +# Always attach basic execution for CloudWatch Logging +resource "aws_iam_role_policy_attachment" "lambda_logs" { + role = aws_iam_role.lambda_exec.name + policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" +} + +# Attach any special case policies (like SQS execution for the upload worker) +resource "aws_iam_role_policy_attachment" "additional" { + count = length(var.additional_policy_arns) + role = aws_iam_role.lambda_exec.name + policy_arn = var.additional_policy_arns[count.index] +} + +# Deploy the Lambda +resource "aws_lambda_function" "this" { + filename = local.lambda_file_path + function_name = var.function_name + role = aws_iam_role.lambda_exec.arn + architectures = [var.architecture] + runtime = var.runtime + handler = var.handler + source_code_hash = local.lambda_source_hash + + timeout = var.timeout + memory_size = var.memory_size + + environment { + variables = var.environment_variables + } + + depends_on = [ + aws_iam_role_policy_attachment.lambda_logs, + local_sensitive_file.downloaded_zip + ] +} diff --git a/terraform/modules/zip_lambda/output.tf b/terraform/modules/zip_lambda/output.tf new file mode 100644 index 0000000..6b38eda --- /dev/null +++ b/terraform/modules/zip_lambda/output.tf @@ -0,0 +1,24 @@ +# Name of the lambda function +output "function_name" { + value = aws_lambda_function.this.function_name +} + +# ARN of the lambda function +output "function_arn" { + value = aws_lambda_function.this.arn +} + +# Invoke ARN of the lambda function +output "function_invoke_arn" { + value = aws_lambda_function.this.invoke_arn +} + +# Response streaming invoke ARN +output "response_streaming_invoke_arn" { + value = aws_lambda_function.this.response_streaming_invoke_arn +} + +# Invoke ARN of the lambda function +output "invoke_policy_arn" { + value = aws_iam_role.lambda_exec.arn +} diff --git a/terraform/modules/zip_lambda/variables.tf b/terraform/modules/zip_lambda/variables.tf new file mode 100644 index 0000000..9df7327 --- /dev/null +++ b/terraform/modules/zip_lambda/variables.tf @@ -0,0 +1,56 @@ +variable "function_name" { + type = string + description = "The name of the Lambda function" +} + +variable "zip_source" { + type = string + description = "Either a local zip file path or the URL to download the zip file." + + validation { + condition = length(trimspace(var.zip_source)) > 0 + error_message = "The zip_source variable cannot be empty." + } +} + +variable "timeout" { + type = number + default = 60 + description = "The function execution timeout in seconds" +} + +variable "memory_size" { + type = number + default = 512 + description = "The amount of memory in MB allocated to the function" +} + +variable "additional_policy_arns" { + type = list(string) + default = [] + description = "Extra IAM policy ARNs to attach to this Lambda's role (e.g., SQS execution)" +} + +variable "environment_variables" { + type = map(string) + description = "The shared environment variables mapping required by Docbox services" + default = {} +} + +variable "architecture" { + type = string + description = "The architecture of the Lambda function" + default = "arm64" +} + +variable "runtime" { + type = string + description = "Lambda runtime to use" + default = "provided.al2023" +} + +variable "handler" { + type = string + description = "Lambda handler" + default = "bootstrap" +} diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 0000000..a428f91 --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,9 @@ +output "rest_api_id" { + description = "ID of the docbox REST API" + value = module.serverless_docbox_api.rest_api_id +} + +output "api_endpoint" { + description = "The public URL for the docbox API" + value = module.serverless_docbox_api.api_endpoint +} diff --git a/terraform/scripts/pull-converter-image.ps1 b/terraform/scripts/pull-converter-image.ps1 new file mode 100644 index 0000000..3172852 --- /dev/null +++ b/terraform/scripts/pull-converter-image.ps1 @@ -0,0 +1,13 @@ +$pass = aws ecr get-login-password --region ${aws_region} --profile ${aws_profile} + +# Password is passed through --password instead of --password-stdin because powershell is +# refusing to handle piping this properly +docker login --username AWS --password $pass ${ecr_repo} + +docker pull --platform linux/arm64 ${source_image} +docker tag ${source_image} ${dest_image} +docker push --platform linux/arm64 ${dest_image} +docker logout ${ecr_repo} + +# Sleep briefly to ensure ECR registers the image before we can use it +Start-Sleep -Seconds 5 diff --git a/terraform/scripts/pull-converter-image.sh b/terraform/scripts/pull-converter-image.sh new file mode 100644 index 0000000..12e2d7b --- /dev/null +++ b/terraform/scripts/pull-converter-image.sh @@ -0,0 +1,7 @@ +aws ecr get-login-password --region ${aws_region} --profile ${aws_profile} | \ +docker login --username AWS --password-stdin ${ecr_repo} && \ +docker pull --platform linux/arm64 ${source_image} && \ +docker tag ${source_image} ${dest_image} && \ +docker push --platform linux/arm64 ${dest_image} && \ +docker logout ${ecr_repo} && \ +sleep 5 diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 0000000..f612b22 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,34 @@ + +variable "aws_region" { + description = "The AWS region to deploy the resources" + type = string + default = "ap-southeast-2" +} + +variable "aws_profile" { + description = "The AWS cli profile to use" + type = string +} + +variable "vpc_id" { + description = "ID of the VPC to allocate resources within" + type = string +} + +variable "architecture" { + type = string + description = "The name of the Lambda function" + default = "arm64" +} + +variable "use_local_zip" { + type = bool + description = "Whether to use a local zip of docbox" + default = false +} + +variable "local_deploy_override" { + type = bool + description = "Whether to override behavior so that it works with local deployments (floci / localstack)" + default = false +}