├── .github └── workflows │ ├── release-dev.yml │ └── release-prod.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── backend ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile.dev ├── example.http ├── src │ └── main.rs └── static │ └── .gitkeep ├── docker-compose.yaml ├── helm ├── .helmignore ├── Chart.yaml ├── templates │ ├── _helpers.tpl │ ├── deployment.yaml │ ├── ingress.yaml │ ├── service.yaml │ └── tests │ │ └── test-connection.yaml └── values.yaml └── ui ├── .dockerignore ├── .eslintrc.cjs ├── .gitignore ├── Dockerfile.dev ├── README.md ├── index.html ├── package-lock.json ├── package.json ├── public └── icon.svg ├── src ├── App.tsx ├── Components │ └── Uploader.tsx ├── Requests │ └── api.ts ├── main.tsx └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.github/workflows/release-dev.yml: -------------------------------------------------------------------------------- 1 | name: Build & Push DEV 📦 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | release: 10 | permissions: 11 | contents: read 12 | packages: write 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | 18 | - name: Docker meta 19 | id: meta 20 | uses: docker/metadata-action@v5 21 | with: 22 | images: ghcr.io/${{ github.repository }} 23 | tags: | 24 | type=ref,event=branch 25 | type=ref,event=pr 26 | type=semver,pattern=v{{version}} 27 | type=semver,pattern=v{{major}} 28 | type=semver,pattern=v{{major}}.{{minor}} 29 | 30 | - name: Set up QEMU 31 | uses: docker/setup-qemu-action@v3 32 | 33 | - name: Set up Docker Buildx 34 | uses: docker/setup-buildx-action@v3 35 | 36 | - name: Cache Docker layers 37 | uses: actions/cache@v2 38 | with: 39 | path: /tmp/.buildx-cache 40 | key: ${{ runner.os }}-buildx-${{ github.sha }} 41 | restore-keys: | 42 | ${{ runner.os }}-buildx- 43 | 44 | - name: Login to GHCR 45 | uses: docker/login-action@v3 46 | with: 47 | registry: ghcr.io 48 | username: ${{ github.actor }} 49 | password: ${{ secrets.GITHUB_TOKEN }} 50 | 51 | - name: Build and push 52 | uses: docker/build-push-action@v5 53 | with: 54 | push: true 55 | tags: ${{ steps.meta.outputs.tags }} 56 | labels: ${{ steps.meta.outputs.labels }} 57 | platforms: linux/amd64 #,linux/arm64 58 | cache-from: type=local,src=/tmp/.buildx-cache 59 | cache-to: type=local,dest=/tmp/.buildx-cache 60 | -------------------------------------------------------------------------------- /.github/workflows/release-prod.yml: -------------------------------------------------------------------------------- 1 | name: Build & Push PROD 📦 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v*" 7 | 8 | jobs: 9 | release: 10 | permissions: 11 | contents: read 12 | packages: write 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | 18 | - name: Docker meta 19 | id: meta 20 | uses: docker/metadata-action@v5 21 | with: 22 | images: ghcr.io/${{ github.repository }} 23 | tags: | 24 | type=ref,event=branch 25 | type=ref,event=pr 26 | type=semver,pattern=v{{version}} 27 | type=semver,pattern=v{{major}} 28 | type=semver,pattern=v{{major}}.{{minor}} 29 | 30 | - name: Set up QEMU 31 | uses: docker/setup-qemu-action@v3 32 | 33 | - name: Set up Docker Buildx 34 | uses: docker/setup-buildx-action@v3 35 | 36 | - name: Cache Docker layers 37 | uses: actions/cache@v2 38 | with: 39 | path: /tmp/.buildx-cache 40 | key: ${{ runner.os }}-buildx-${{ github.sha }} 41 | restore-keys: | 42 | ${{ runner.os }}-buildx- 43 | 44 | - name: Login to GHCR 45 | uses: docker/login-action@v3 46 | with: 47 | registry: ghcr.io 48 | username: ${{ github.actor }} 49 | password: ${{ secrets.GITHUB_TOKEN }} 50 | 51 | - name: Build and push 52 | uses: docker/build-push-action@v5 53 | with: 54 | push: true 55 | tags: ${{ steps.meta.outputs.tags }} 56 | labels: ${{ steps.meta.outputs.labels }} 57 | platforms: linux/amd64,linux/arm64 58 | cache-from: type=local,src=/tmp/.buildx-cache 59 | cache-to: type=local,dest=/tmp/.buildx-cache 60 | 61 | - name: Build and push Helm Chart 62 | run: | 63 | if [[ $GITHUB_REF_NAME != v* ]]; then 64 | exit 0 65 | fi 66 | mkdir -p .helm-packages 67 | HELM_VERSION="${GITHUB_REF_NAME#v}" 68 | helm package ./helm --version "$HELM_VERSION" --app-version "$GITHUB_REF_NAME" -d .helm-packages 69 | for pkg in .helm-packages/*; do 70 | if [ -z "${pkg:-}" ]; then 71 | break 72 | fi 73 | helm push "${pkg}" oci://ghcr.io/${{ github.repository_owner }}/helm-charts 74 | done -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | minio_data 2 | .idea -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:21 AS frontend 2 | WORKDIR /app 3 | COPY ui . 4 | RUN npm i && npm run build 5 | 6 | FROM --platform=linux/amd64 messense/rust-musl-cross:x86_64-musl AS amd64-chef 7 | RUN cargo install cargo-chef 8 | WORKDIR /app 9 | 10 | FROM --platform=linux/arm64 messense/rust-musl-cross:aarch64-musl AS arm64-chef 11 | RUN cargo install cargo-chef 12 | WORKDIR /app 13 | 14 | FROM ${TARGETARCH}-chef AS planner 15 | COPY backend . 16 | RUN cargo chef prepare --recipe-path recipe.json 17 | 18 | FROM ${TARGETARCH}-chef AS builder 19 | ARG TARGETARCH 20 | ARG BINARY_NAME=simple-file-transfer 21 | COPY --from=planner /app/recipe.json recipe.json 22 | RUN set -ex; \ 23 | case ${TARGETARCH} in \ 24 | arm64) target='aarch64' ;; \ 25 | amd64) target='x86_64' ;; \ 26 | *) exit 1 ;; \ 27 | esac; \ 28 | echo "Building for ${TARGETARCH} (${target})" && \ 29 | curl -sSL https://github.com/upx/upx/releases/download/v4.2.4/upx-4.2.4-${TARGETARCH}_linux.tar.xz -o upx.tar.xz && \ 30 | tar -xf upx.tar.xz && \ 31 | cd upx-*-${TARGETARCH}_linux && \ 32 | mv upx /bin/upx && \ 33 | cd .. && \ 34 | cargo chef cook --release --target $target-unknown-linux-musl --recipe-path recipe.json 35 | 36 | COPY backend . 37 | 38 | RUN set -ex; \ 39 | case ${TARGETARCH} in \ 40 | arm64) target='aarch64' ;; \ 41 | amd64) target='x86_64' ;; \ 42 | *) exit 1 ;; \ 43 | esac; \ 44 | cargo build --release --target $target-unknown-linux-musl --bin ${BINARY_NAME} && \ 45 | mv ./target/$target-unknown-linux-musl/release/${BINARY_NAME} /build && \ 46 | upx --best --lzma /build 47 | 48 | FROM scratch AS runtime 49 | COPY --from=builder /build /app 50 | COPY --from=frontend /app/dist /static 51 | COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ 52 | EXPOSE 3000 53 | CMD ["/app"] 54 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 espresso-lab 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Simple File Transfer 2 | 3 | A web app for simple and secure file sharing. 4 | 5 | 6 | [![GitHub tag](https://img.shields.io/github/tag/espresso-lab/simple-file-transfer?include_prereleases=&sort=semver&color=blue)](https://github.com/espresso-lab/simple-file-transfer/tags/) 7 | [![License](https://img.shields.io/badge/License-MIT-blue)](#license) 8 | [![Rust Report Card](https://rust-reportcard.xuri.me/badge/github.com/espresso-lab/simple-file-transfer)](https://rust-reportcard.xuri.me/report/github.com/espresso-lab/simple-file-transfer) 9 | 10 | ## Features 11 | 12 | - Upload files via drag'n'drop or via the "+" icon 13 | - Generate a secure shareable link (implemented via S3 presigned urls) 14 | - Blazing fast backend ⚡️ written in Rust ⚙️ 15 | - Clean and minimalistic UI 16 | - Upload files to S3 or S3 compatible storage (e.g. MinIO) 17 | - Shipped as a single container image 18 | 19 | ## Demo 20 | 21 | https://github.com/user-attachments/assets/97a12fc7-1add-43bc-bd00-6174f802a1cc 22 | 23 | ## Installation 24 | 25 | * Container Image: `ghcr.io/espresso-lab/simple-file-transfer:latest` 26 | * Docker Compose: https://github.com/espresso-lab/simple-file-transfer/blob/main/docker-compose.yaml 27 | * Helm Chart: https://github.com/espresso-lab/helm-charts 28 | 29 | ## Further infos 30 | 31 | - Issues, PR and contributions welcome! :) 32 | - To protect the "Upload UI" cosider using something like https://github.com/espresso-lab/oidc-forward-auth-middleware 33 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | -------------------------------------------------------------------------------- /backend/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "actix-codec" 7 | version = "0.5.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" 10 | dependencies = [ 11 | "bitflags", 12 | "bytes", 13 | "futures-core", 14 | "futures-sink", 15 | "memchr", 16 | "pin-project-lite", 17 | "tokio", 18 | "tokio-util", 19 | "tracing", 20 | ] 21 | 22 | [[package]] 23 | name = "actix-cors" 24 | version = "0.7.0" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "f9e772b3bcafe335042b5db010ab7c09013dad6eac4915c91d8d50902769f331" 27 | dependencies = [ 28 | "actix-utils", 29 | "actix-web", 30 | "derive_more", 31 | "futures-util", 32 | "log", 33 | "once_cell", 34 | "smallvec", 35 | ] 36 | 37 | [[package]] 38 | name = "actix-files" 39 | version = "0.6.6" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "0773d59061dedb49a8aed04c67291b9d8cf2fe0b60130a381aab53c6dd86e9be" 42 | dependencies = [ 43 | "actix-http", 44 | "actix-service", 45 | "actix-utils", 46 | "actix-web", 47 | "bitflags", 48 | "bytes", 49 | "derive_more", 50 | "futures-core", 51 | "http-range", 52 | "log", 53 | "mime", 54 | "mime_guess", 55 | "percent-encoding", 56 | "pin-project-lite", 57 | "v_htmlescape", 58 | ] 59 | 60 | [[package]] 61 | name = "actix-http" 62 | version = "3.9.0" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" 65 | dependencies = [ 66 | "actix-codec", 67 | "actix-rt", 68 | "actix-service", 69 | "actix-utils", 70 | "ahash", 71 | "base64 0.22.1", 72 | "bitflags", 73 | "brotli", 74 | "bytes", 75 | "bytestring", 76 | "derive_more", 77 | "encoding_rs", 78 | "flate2", 79 | "futures-core", 80 | "h2", 81 | "http 0.2.12", 82 | "httparse", 83 | "httpdate", 84 | "itoa", 85 | "language-tags", 86 | "local-channel", 87 | "mime", 88 | "percent-encoding", 89 | "pin-project-lite", 90 | "rand", 91 | "sha1", 92 | "smallvec", 93 | "tokio", 94 | "tokio-util", 95 | "tracing", 96 | "zstd", 97 | ] 98 | 99 | [[package]] 100 | name = "actix-macros" 101 | version = "0.2.4" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" 104 | dependencies = [ 105 | "quote", 106 | "syn 2.0.60", 107 | ] 108 | 109 | [[package]] 110 | name = "actix-router" 111 | version = "0.5.3" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" 114 | dependencies = [ 115 | "bytestring", 116 | "cfg-if", 117 | "http 0.2.12", 118 | "regex", 119 | "regex-lite", 120 | "serde", 121 | "tracing", 122 | ] 123 | 124 | [[package]] 125 | name = "actix-rt" 126 | version = "2.10.0" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" 129 | dependencies = [ 130 | "futures-core", 131 | "tokio", 132 | ] 133 | 134 | [[package]] 135 | name = "actix-server" 136 | version = "2.5.0" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894" 139 | dependencies = [ 140 | "actix-rt", 141 | "actix-service", 142 | "actix-utils", 143 | "futures-core", 144 | "futures-util", 145 | "mio 1.0.2", 146 | "socket2", 147 | "tokio", 148 | "tracing", 149 | ] 150 | 151 | [[package]] 152 | name = "actix-service" 153 | version = "2.0.2" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" 156 | dependencies = [ 157 | "futures-core", 158 | "paste", 159 | "pin-project-lite", 160 | ] 161 | 162 | [[package]] 163 | name = "actix-utils" 164 | version = "3.0.1" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" 167 | dependencies = [ 168 | "local-waker", 169 | "pin-project-lite", 170 | ] 171 | 172 | [[package]] 173 | name = "actix-web" 174 | version = "4.9.0" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" 177 | dependencies = [ 178 | "actix-codec", 179 | "actix-http", 180 | "actix-macros", 181 | "actix-router", 182 | "actix-rt", 183 | "actix-server", 184 | "actix-service", 185 | "actix-utils", 186 | "actix-web-codegen", 187 | "ahash", 188 | "bytes", 189 | "bytestring", 190 | "cfg-if", 191 | "cookie", 192 | "derive_more", 193 | "encoding_rs", 194 | "futures-core", 195 | "futures-util", 196 | "impl-more", 197 | "itoa", 198 | "language-tags", 199 | "log", 200 | "mime", 201 | "once_cell", 202 | "pin-project-lite", 203 | "regex", 204 | "regex-lite", 205 | "serde", 206 | "serde_json", 207 | "serde_urlencoded", 208 | "smallvec", 209 | "socket2", 210 | "time", 211 | "url", 212 | ] 213 | 214 | [[package]] 215 | name = "actix-web-codegen" 216 | version = "4.3.0" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" 219 | dependencies = [ 220 | "actix-router", 221 | "proc-macro2", 222 | "quote", 223 | "syn 2.0.60", 224 | ] 225 | 226 | [[package]] 227 | name = "addr2line" 228 | version = "0.21.0" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 231 | dependencies = [ 232 | "gimli", 233 | ] 234 | 235 | [[package]] 236 | name = "adler" 237 | version = "1.0.2" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 240 | 241 | [[package]] 242 | name = "adler2" 243 | version = "2.0.0" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 246 | 247 | [[package]] 248 | name = "ahash" 249 | version = "0.8.11" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 252 | dependencies = [ 253 | "cfg-if", 254 | "getrandom", 255 | "once_cell", 256 | "version_check", 257 | "zerocopy", 258 | ] 259 | 260 | [[package]] 261 | name = "aho-corasick" 262 | version = "1.1.3" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 265 | dependencies = [ 266 | "memchr", 267 | ] 268 | 269 | [[package]] 270 | name = "alloc-no-stdlib" 271 | version = "2.0.4" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 274 | 275 | [[package]] 276 | name = "alloc-stdlib" 277 | version = "0.2.2" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 280 | dependencies = [ 281 | "alloc-no-stdlib", 282 | ] 283 | 284 | [[package]] 285 | name = "allocator-api2" 286 | version = "0.2.18" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" 289 | 290 | [[package]] 291 | name = "android-tzdata" 292 | version = "0.1.1" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 295 | 296 | [[package]] 297 | name = "android_system_properties" 298 | version = "0.1.5" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 301 | dependencies = [ 302 | "libc", 303 | ] 304 | 305 | [[package]] 306 | name = "anstream" 307 | version = "0.6.15" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" 310 | dependencies = [ 311 | "anstyle", 312 | "anstyle-parse", 313 | "anstyle-query", 314 | "anstyle-wincon", 315 | "colorchoice", 316 | "is_terminal_polyfill", 317 | "utf8parse", 318 | ] 319 | 320 | [[package]] 321 | name = "anstyle" 322 | version = "1.0.8" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" 325 | 326 | [[package]] 327 | name = "anstyle-parse" 328 | version = "0.2.5" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" 331 | dependencies = [ 332 | "utf8parse", 333 | ] 334 | 335 | [[package]] 336 | name = "anstyle-query" 337 | version = "1.1.1" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" 340 | dependencies = [ 341 | "windows-sys 0.52.0", 342 | ] 343 | 344 | [[package]] 345 | name = "anstyle-wincon" 346 | version = "3.0.4" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" 349 | dependencies = [ 350 | "anstyle", 351 | "windows-sys 0.52.0", 352 | ] 353 | 354 | [[package]] 355 | name = "autocfg" 356 | version = "1.2.0" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" 359 | 360 | [[package]] 361 | name = "aws-config" 362 | version = "1.4.0" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "40ddbfb5db93d62521f47b3f223da0884a2f02741ff54cb9cda192a0e73ba08b" 365 | dependencies = [ 366 | "aws-credential-types", 367 | "aws-runtime", 368 | "aws-sdk-sso", 369 | "aws-sdk-ssooidc", 370 | "aws-sdk-sts", 371 | "aws-smithy-async", 372 | "aws-smithy-http", 373 | "aws-smithy-json", 374 | "aws-smithy-runtime", 375 | "aws-smithy-runtime-api", 376 | "aws-smithy-types", 377 | "aws-types", 378 | "bytes", 379 | "fastrand", 380 | "hex", 381 | "http 0.2.12", 382 | "hyper 0.14.28", 383 | "ring", 384 | "time", 385 | "tokio", 386 | "tracing", 387 | "url", 388 | "zeroize", 389 | ] 390 | 391 | [[package]] 392 | name = "aws-credential-types" 393 | version = "1.2.0" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "e16838e6c9e12125face1c1eff1343c75e3ff540de98ff7ebd61874a89bcfeb9" 396 | dependencies = [ 397 | "aws-smithy-async", 398 | "aws-smithy-runtime-api", 399 | "aws-smithy-types", 400 | "zeroize", 401 | ] 402 | 403 | [[package]] 404 | name = "aws-runtime" 405 | version = "1.2.2" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "75588e7ee5e8496eed939adac2035a6dbab9f7eb2acdd9ab2d31856dab6f3955" 408 | dependencies = [ 409 | "aws-credential-types", 410 | "aws-sigv4", 411 | "aws-smithy-async", 412 | "aws-smithy-eventstream", 413 | "aws-smithy-http", 414 | "aws-smithy-runtime-api", 415 | "aws-smithy-types", 416 | "aws-types", 417 | "bytes", 418 | "fastrand", 419 | "http 0.2.12", 420 | "http-body 0.4.6", 421 | "percent-encoding", 422 | "pin-project-lite", 423 | "tracing", 424 | "uuid", 425 | ] 426 | 427 | [[package]] 428 | name = "aws-sdk-s3" 429 | version = "1.24.0" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "7f522b68eb0294c59f7beb0defa30e84fed24ebc50ee219e111d6c33eaea96a8" 432 | dependencies = [ 433 | "ahash", 434 | "aws-credential-types", 435 | "aws-runtime", 436 | "aws-sigv4", 437 | "aws-smithy-async", 438 | "aws-smithy-checksums", 439 | "aws-smithy-eventstream", 440 | "aws-smithy-http", 441 | "aws-smithy-json", 442 | "aws-smithy-runtime", 443 | "aws-smithy-runtime-api", 444 | "aws-smithy-types", 445 | "aws-smithy-xml", 446 | "aws-types", 447 | "bytes", 448 | "fastrand", 449 | "hex", 450 | "hmac", 451 | "http 0.2.12", 452 | "http-body 0.4.6", 453 | "lru", 454 | "once_cell", 455 | "percent-encoding", 456 | "regex-lite", 457 | "sha2", 458 | "tracing", 459 | "url", 460 | ] 461 | 462 | [[package]] 463 | name = "aws-sdk-sso" 464 | version = "1.24.0" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "5fd6a9b38fe2dcaa2422b42e2c667112872d03a83522533f8b4165fd2d9d4bd1" 467 | dependencies = [ 468 | "aws-credential-types", 469 | "aws-runtime", 470 | "aws-smithy-async", 471 | "aws-smithy-http", 472 | "aws-smithy-json", 473 | "aws-smithy-runtime", 474 | "aws-smithy-runtime-api", 475 | "aws-smithy-types", 476 | "aws-types", 477 | "bytes", 478 | "http 0.2.12", 479 | "once_cell", 480 | "regex-lite", 481 | "tracing", 482 | ] 483 | 484 | [[package]] 485 | name = "aws-sdk-ssooidc" 486 | version = "1.25.0" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "c99f342a364c8490b7715387244d2f7ebfc05f07bb6a0fc6e70b8e62b7078d06" 489 | dependencies = [ 490 | "aws-credential-types", 491 | "aws-runtime", 492 | "aws-smithy-async", 493 | "aws-smithy-http", 494 | "aws-smithy-json", 495 | "aws-smithy-runtime", 496 | "aws-smithy-runtime-api", 497 | "aws-smithy-types", 498 | "aws-types", 499 | "bytes", 500 | "http 0.2.12", 501 | "once_cell", 502 | "regex-lite", 503 | "tracing", 504 | ] 505 | 506 | [[package]] 507 | name = "aws-sdk-sts" 508 | version = "1.24.0" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "7207ca62206c93e470457babf0512d7b6b97170fdba929a2a2f5682f9f68407c" 511 | dependencies = [ 512 | "aws-credential-types", 513 | "aws-runtime", 514 | "aws-smithy-async", 515 | "aws-smithy-http", 516 | "aws-smithy-json", 517 | "aws-smithy-query", 518 | "aws-smithy-runtime", 519 | "aws-smithy-runtime-api", 520 | "aws-smithy-types", 521 | "aws-smithy-xml", 522 | "aws-types", 523 | "http 0.2.12", 524 | "once_cell", 525 | "regex-lite", 526 | "tracing", 527 | ] 528 | 529 | [[package]] 530 | name = "aws-sigv4" 531 | version = "1.2.1" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "58b56f1cbe6fd4d0c2573df72868f20ab1c125ca9c9dbce17927a463433a2e57" 534 | dependencies = [ 535 | "aws-credential-types", 536 | "aws-smithy-eventstream", 537 | "aws-smithy-http", 538 | "aws-smithy-runtime-api", 539 | "aws-smithy-types", 540 | "bytes", 541 | "crypto-bigint 0.5.5", 542 | "form_urlencoded", 543 | "hex", 544 | "hmac", 545 | "http 0.2.12", 546 | "http 1.1.0", 547 | "once_cell", 548 | "p256", 549 | "percent-encoding", 550 | "ring", 551 | "sha2", 552 | "subtle", 553 | "time", 554 | "tracing", 555 | "zeroize", 556 | ] 557 | 558 | [[package]] 559 | name = "aws-smithy-async" 560 | version = "1.2.1" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "62220bc6e97f946ddd51b5f1361f78996e704677afc518a4ff66b7a72ea1378c" 563 | dependencies = [ 564 | "futures-util", 565 | "pin-project-lite", 566 | "tokio", 567 | ] 568 | 569 | [[package]] 570 | name = "aws-smithy-checksums" 571 | version = "0.60.7" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "83fa43bc04a6b2441968faeab56e68da3812f978a670a5db32accbdcafddd12f" 574 | dependencies = [ 575 | "aws-smithy-http", 576 | "aws-smithy-types", 577 | "bytes", 578 | "crc32c", 579 | "crc32fast", 580 | "hex", 581 | "http 0.2.12", 582 | "http-body 0.4.6", 583 | "md-5", 584 | "pin-project-lite", 585 | "sha1", 586 | "sha2", 587 | "tracing", 588 | ] 589 | 590 | [[package]] 591 | name = "aws-smithy-eventstream" 592 | version = "0.60.4" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858" 595 | dependencies = [ 596 | "aws-smithy-types", 597 | "bytes", 598 | "crc32fast", 599 | ] 600 | 601 | [[package]] 602 | name = "aws-smithy-http" 603 | version = "0.60.8" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "4a7de001a1b9a25601016d8057ea16e31a45fdca3751304c8edf4ad72e706c08" 606 | dependencies = [ 607 | "aws-smithy-eventstream", 608 | "aws-smithy-runtime-api", 609 | "aws-smithy-types", 610 | "bytes", 611 | "bytes-utils", 612 | "futures-core", 613 | "http 0.2.12", 614 | "http-body 0.4.6", 615 | "once_cell", 616 | "percent-encoding", 617 | "pin-project-lite", 618 | "pin-utils", 619 | "tracing", 620 | ] 621 | 622 | [[package]] 623 | name = "aws-smithy-json" 624 | version = "0.60.7" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "4683df9469ef09468dad3473d129960119a0d3593617542b7d52086c8486f2d6" 627 | dependencies = [ 628 | "aws-smithy-types", 629 | ] 630 | 631 | [[package]] 632 | name = "aws-smithy-query" 633 | version = "0.60.7" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" 636 | dependencies = [ 637 | "aws-smithy-types", 638 | "urlencoding", 639 | ] 640 | 641 | [[package]] 642 | name = "aws-smithy-runtime" 643 | version = "1.5.0" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "c9ac79e9f3a4d576f3cd4a470a0275b138d9e7b11b1cd514a6858ae0a79dd5bb" 646 | dependencies = [ 647 | "aws-smithy-async", 648 | "aws-smithy-http", 649 | "aws-smithy-runtime-api", 650 | "aws-smithy-types", 651 | "bytes", 652 | "fastrand", 653 | "h2", 654 | "http 0.2.12", 655 | "http-body 0.4.6", 656 | "http-body 1.0.0", 657 | "hyper 0.14.28", 658 | "hyper-rustls 0.24.2", 659 | "once_cell", 660 | "pin-project-lite", 661 | "pin-utils", 662 | "rustls 0.21.12", 663 | "tokio", 664 | "tracing", 665 | ] 666 | 667 | [[package]] 668 | name = "aws-smithy-runtime-api" 669 | version = "1.6.0" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "04ec42c2f5c0e7796a2848dde4d9f3bf8ce12ccbb3d5aa40c52fa0cdd61a1c47" 672 | dependencies = [ 673 | "aws-smithy-async", 674 | "aws-smithy-types", 675 | "bytes", 676 | "http 0.2.12", 677 | "http 1.1.0", 678 | "pin-project-lite", 679 | "tokio", 680 | "tracing", 681 | "zeroize", 682 | ] 683 | 684 | [[package]] 685 | name = "aws-smithy-types" 686 | version = "1.1.9" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "baf98d97bba6ddaba180f1b1147e202d8fe04940403a95a3f826c790f931bbd1" 689 | dependencies = [ 690 | "base64-simd", 691 | "bytes", 692 | "bytes-utils", 693 | "futures-core", 694 | "http 0.2.12", 695 | "http 1.1.0", 696 | "http-body 0.4.6", 697 | "http-body 1.0.0", 698 | "http-body-util", 699 | "itoa", 700 | "num-integer", 701 | "pin-project-lite", 702 | "pin-utils", 703 | "ryu", 704 | "serde", 705 | "time", 706 | "tokio", 707 | "tokio-util", 708 | ] 709 | 710 | [[package]] 711 | name = "aws-smithy-xml" 712 | version = "0.60.8" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "d123fbc2a4adc3c301652ba8e149bf4bc1d1725affb9784eb20c953ace06bf55" 715 | dependencies = [ 716 | "xmlparser", 717 | ] 718 | 719 | [[package]] 720 | name = "aws-types" 721 | version = "1.2.1" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "a807d90cd50a969b3d95e4e7ad1491fcae13c6e83948d8728363ecc09d66343a" 724 | dependencies = [ 725 | "aws-credential-types", 726 | "aws-smithy-async", 727 | "aws-smithy-runtime-api", 728 | "aws-smithy-types", 729 | "http 0.2.12", 730 | "rustc_version", 731 | "tracing", 732 | ] 733 | 734 | [[package]] 735 | name = "backtrace" 736 | version = "0.3.71" 737 | source = "registry+https://github.com/rust-lang/crates.io-index" 738 | checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 739 | dependencies = [ 740 | "addr2line", 741 | "cc", 742 | "cfg-if", 743 | "libc", 744 | "miniz_oxide 0.7.2", 745 | "object", 746 | "rustc-demangle", 747 | ] 748 | 749 | [[package]] 750 | name = "base16ct" 751 | version = "0.1.1" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" 754 | 755 | [[package]] 756 | name = "base64" 757 | version = "0.21.7" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 760 | 761 | [[package]] 762 | name = "base64" 763 | version = "0.22.1" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 766 | 767 | [[package]] 768 | name = "base64-simd" 769 | version = "0.8.0" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" 772 | dependencies = [ 773 | "outref", 774 | "vsimd", 775 | ] 776 | 777 | [[package]] 778 | name = "base64ct" 779 | version = "1.6.0" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 782 | 783 | [[package]] 784 | name = "bitflags" 785 | version = "2.5.0" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 788 | 789 | [[package]] 790 | name = "block-buffer" 791 | version = "0.10.4" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 794 | dependencies = [ 795 | "generic-array", 796 | ] 797 | 798 | [[package]] 799 | name = "brotli" 800 | version = "6.0.0" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" 803 | dependencies = [ 804 | "alloc-no-stdlib", 805 | "alloc-stdlib", 806 | "brotli-decompressor", 807 | ] 808 | 809 | [[package]] 810 | name = "brotli-decompressor" 811 | version = "4.0.1" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" 814 | dependencies = [ 815 | "alloc-no-stdlib", 816 | "alloc-stdlib", 817 | ] 818 | 819 | [[package]] 820 | name = "bumpalo" 821 | version = "3.16.0" 822 | source = "registry+https://github.com/rust-lang/crates.io-index" 823 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 824 | 825 | [[package]] 826 | name = "bytes" 827 | version = "1.7.2" 828 | source = "registry+https://github.com/rust-lang/crates.io-index" 829 | checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" 830 | 831 | [[package]] 832 | name = "bytes-utils" 833 | version = "0.1.4" 834 | source = "registry+https://github.com/rust-lang/crates.io-index" 835 | checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" 836 | dependencies = [ 837 | "bytes", 838 | "either", 839 | ] 840 | 841 | [[package]] 842 | name = "bytestring" 843 | version = "1.3.1" 844 | source = "registry+https://github.com/rust-lang/crates.io-index" 845 | checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" 846 | dependencies = [ 847 | "bytes", 848 | ] 849 | 850 | [[package]] 851 | name = "cc" 852 | version = "1.0.96" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" 855 | dependencies = [ 856 | "jobserver", 857 | "libc", 858 | "once_cell", 859 | ] 860 | 861 | [[package]] 862 | name = "cfg-if" 863 | version = "1.0.0" 864 | source = "registry+https://github.com/rust-lang/crates.io-index" 865 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 866 | 867 | [[package]] 868 | name = "chrono" 869 | version = "0.4.38" 870 | source = "registry+https://github.com/rust-lang/crates.io-index" 871 | checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 872 | dependencies = [ 873 | "android-tzdata", 874 | "iana-time-zone", 875 | "js-sys", 876 | "num-traits", 877 | "serde", 878 | "wasm-bindgen", 879 | "windows-targets 0.52.6", 880 | ] 881 | 882 | [[package]] 883 | name = "colorchoice" 884 | version = "1.0.2" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" 887 | 888 | [[package]] 889 | name = "confique" 890 | version = "0.2.6" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "12d6d568e8e1848c6e7df28ca716ab21f3d61c48760102c1848b5e0299793069" 893 | dependencies = [ 894 | "confique-macro", 895 | "json5", 896 | "serde", 897 | "serde_yaml", 898 | "toml", 899 | ] 900 | 901 | [[package]] 902 | name = "confique-macro" 903 | version = "0.0.10" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "e367f4d469a9fb1c3da5d4983f445c26dffa20eb293552287e8e9389e028e7dc" 906 | dependencies = [ 907 | "heck", 908 | "proc-macro2", 909 | "quote", 910 | "syn 1.0.109", 911 | ] 912 | 913 | [[package]] 914 | name = "const-oid" 915 | version = "0.9.6" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 918 | 919 | [[package]] 920 | name = "convert_case" 921 | version = "0.4.0" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 924 | 925 | [[package]] 926 | name = "cookie" 927 | version = "0.16.2" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" 930 | dependencies = [ 931 | "percent-encoding", 932 | "time", 933 | "version_check", 934 | ] 935 | 936 | [[package]] 937 | name = "core-foundation" 938 | version = "0.9.4" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 941 | dependencies = [ 942 | "core-foundation-sys", 943 | "libc", 944 | ] 945 | 946 | [[package]] 947 | name = "core-foundation-sys" 948 | version = "0.8.6" 949 | source = "registry+https://github.com/rust-lang/crates.io-index" 950 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 951 | 952 | [[package]] 953 | name = "cpufeatures" 954 | version = "0.2.12" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 957 | dependencies = [ 958 | "libc", 959 | ] 960 | 961 | [[package]] 962 | name = "crc32c" 963 | version = "0.6.5" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "89254598aa9b9fa608de44b3ae54c810f0f06d755e24c50177f1f8f31ff50ce2" 966 | dependencies = [ 967 | "rustc_version", 968 | ] 969 | 970 | [[package]] 971 | name = "crc32fast" 972 | version = "1.4.0" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" 975 | dependencies = [ 976 | "cfg-if", 977 | ] 978 | 979 | [[package]] 980 | name = "crypto-bigint" 981 | version = "0.4.9" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" 984 | dependencies = [ 985 | "generic-array", 986 | "rand_core", 987 | "subtle", 988 | "zeroize", 989 | ] 990 | 991 | [[package]] 992 | name = "crypto-bigint" 993 | version = "0.5.5" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 996 | dependencies = [ 997 | "rand_core", 998 | "subtle", 999 | ] 1000 | 1001 | [[package]] 1002 | name = "crypto-common" 1003 | version = "0.1.6" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 1006 | dependencies = [ 1007 | "generic-array", 1008 | "typenum", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "darling" 1013 | version = "0.20.10" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" 1016 | dependencies = [ 1017 | "darling_core", 1018 | "darling_macro", 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "darling_core" 1023 | version = "0.20.10" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" 1026 | dependencies = [ 1027 | "fnv", 1028 | "ident_case", 1029 | "proc-macro2", 1030 | "quote", 1031 | "strsim", 1032 | "syn 2.0.60", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "darling_macro" 1037 | version = "0.20.10" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" 1040 | dependencies = [ 1041 | "darling_core", 1042 | "quote", 1043 | "syn 2.0.60", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "der" 1048 | version = "0.6.1" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" 1051 | dependencies = [ 1052 | "const-oid", 1053 | "zeroize", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "deranged" 1058 | version = "0.3.11" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 1061 | dependencies = [ 1062 | "powerfmt", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "derive_more" 1067 | version = "0.99.18" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" 1070 | dependencies = [ 1071 | "convert_case", 1072 | "proc-macro2", 1073 | "quote", 1074 | "rustc_version", 1075 | "syn 2.0.60", 1076 | ] 1077 | 1078 | [[package]] 1079 | name = "digest" 1080 | version = "0.10.7" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 1083 | dependencies = [ 1084 | "block-buffer", 1085 | "crypto-common", 1086 | "subtle", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "ecdsa" 1091 | version = "0.14.8" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" 1094 | dependencies = [ 1095 | "der", 1096 | "elliptic-curve", 1097 | "rfc6979", 1098 | "signature", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "either" 1103 | version = "1.11.0" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" 1106 | 1107 | [[package]] 1108 | name = "elliptic-curve" 1109 | version = "0.12.3" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" 1112 | dependencies = [ 1113 | "base16ct", 1114 | "crypto-bigint 0.4.9", 1115 | "der", 1116 | "digest", 1117 | "ff", 1118 | "generic-array", 1119 | "group", 1120 | "pkcs8", 1121 | "rand_core", 1122 | "sec1", 1123 | "subtle", 1124 | "zeroize", 1125 | ] 1126 | 1127 | [[package]] 1128 | name = "encoding_rs" 1129 | version = "0.8.34" 1130 | source = "registry+https://github.com/rust-lang/crates.io-index" 1131 | checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" 1132 | dependencies = [ 1133 | "cfg-if", 1134 | ] 1135 | 1136 | [[package]] 1137 | name = "env_filter" 1138 | version = "0.1.2" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" 1141 | dependencies = [ 1142 | "log", 1143 | "regex", 1144 | ] 1145 | 1146 | [[package]] 1147 | name = "env_logger" 1148 | version = "0.11.5" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" 1151 | dependencies = [ 1152 | "anstream", 1153 | "anstyle", 1154 | "env_filter", 1155 | "humantime", 1156 | "log", 1157 | ] 1158 | 1159 | [[package]] 1160 | name = "equivalent" 1161 | version = "1.0.1" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 1164 | 1165 | [[package]] 1166 | name = "fastrand" 1167 | version = "2.1.0" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 1170 | 1171 | [[package]] 1172 | name = "ff" 1173 | version = "0.12.1" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" 1176 | dependencies = [ 1177 | "rand_core", 1178 | "subtle", 1179 | ] 1180 | 1181 | [[package]] 1182 | name = "flate2" 1183 | version = "1.0.34" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" 1186 | dependencies = [ 1187 | "crc32fast", 1188 | "miniz_oxide 0.8.0", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "fnv" 1193 | version = "1.0.7" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1196 | 1197 | [[package]] 1198 | name = "form_urlencoded" 1199 | version = "1.2.1" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1202 | dependencies = [ 1203 | "percent-encoding", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "futures-channel" 1208 | version = "0.3.30" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 1211 | dependencies = [ 1212 | "futures-core", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "futures-core" 1217 | version = "0.3.30" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 1220 | 1221 | [[package]] 1222 | name = "futures-sink" 1223 | version = "0.3.30" 1224 | source = "registry+https://github.com/rust-lang/crates.io-index" 1225 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 1226 | 1227 | [[package]] 1228 | name = "futures-task" 1229 | version = "0.3.30" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 1232 | 1233 | [[package]] 1234 | name = "futures-util" 1235 | version = "0.3.30" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 1238 | dependencies = [ 1239 | "futures-core", 1240 | "futures-task", 1241 | "pin-project-lite", 1242 | "pin-utils", 1243 | "slab", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "generic-array" 1248 | version = "0.14.7" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1251 | dependencies = [ 1252 | "typenum", 1253 | "version_check", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "getrandom" 1258 | version = "0.2.14" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" 1261 | dependencies = [ 1262 | "cfg-if", 1263 | "libc", 1264 | "wasi", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "gimli" 1269 | version = "0.28.1" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 1272 | 1273 | [[package]] 1274 | name = "group" 1275 | version = "0.12.1" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" 1278 | dependencies = [ 1279 | "ff", 1280 | "rand_core", 1281 | "subtle", 1282 | ] 1283 | 1284 | [[package]] 1285 | name = "h2" 1286 | version = "0.3.26" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 1289 | dependencies = [ 1290 | "bytes", 1291 | "fnv", 1292 | "futures-core", 1293 | "futures-sink", 1294 | "futures-util", 1295 | "http 0.2.12", 1296 | "indexmap", 1297 | "slab", 1298 | "tokio", 1299 | "tokio-util", 1300 | "tracing", 1301 | ] 1302 | 1303 | [[package]] 1304 | name = "hashbrown" 1305 | version = "0.14.5" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1308 | dependencies = [ 1309 | "ahash", 1310 | "allocator-api2", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "heck" 1315 | version = "0.3.3" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 1318 | dependencies = [ 1319 | "unicode-segmentation", 1320 | ] 1321 | 1322 | [[package]] 1323 | name = "hermit-abi" 1324 | version = "0.3.9" 1325 | source = "registry+https://github.com/rust-lang/crates.io-index" 1326 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 1327 | 1328 | [[package]] 1329 | name = "hex" 1330 | version = "0.4.3" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1333 | 1334 | [[package]] 1335 | name = "hmac" 1336 | version = "0.12.1" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1339 | dependencies = [ 1340 | "digest", 1341 | ] 1342 | 1343 | [[package]] 1344 | name = "http" 1345 | version = "0.2.12" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1348 | dependencies = [ 1349 | "bytes", 1350 | "fnv", 1351 | "itoa", 1352 | ] 1353 | 1354 | [[package]] 1355 | name = "http" 1356 | version = "1.1.0" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 1359 | dependencies = [ 1360 | "bytes", 1361 | "fnv", 1362 | "itoa", 1363 | ] 1364 | 1365 | [[package]] 1366 | name = "http-body" 1367 | version = "0.4.6" 1368 | source = "registry+https://github.com/rust-lang/crates.io-index" 1369 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 1370 | dependencies = [ 1371 | "bytes", 1372 | "http 0.2.12", 1373 | "pin-project-lite", 1374 | ] 1375 | 1376 | [[package]] 1377 | name = "http-body" 1378 | version = "1.0.0" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 1381 | dependencies = [ 1382 | "bytes", 1383 | "http 1.1.0", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "http-body-util" 1388 | version = "0.1.1" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" 1391 | dependencies = [ 1392 | "bytes", 1393 | "futures-core", 1394 | "http 1.1.0", 1395 | "http-body 1.0.0", 1396 | "pin-project-lite", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "http-range" 1401 | version = "0.1.5" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" 1404 | 1405 | [[package]] 1406 | name = "httparse" 1407 | version = "1.8.0" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1410 | 1411 | [[package]] 1412 | name = "httpdate" 1413 | version = "1.0.3" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1416 | 1417 | [[package]] 1418 | name = "humantime" 1419 | version = "2.1.0" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 1422 | 1423 | [[package]] 1424 | name = "hyper" 1425 | version = "0.14.28" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" 1428 | dependencies = [ 1429 | "bytes", 1430 | "futures-channel", 1431 | "futures-core", 1432 | "futures-util", 1433 | "h2", 1434 | "http 0.2.12", 1435 | "http-body 0.4.6", 1436 | "httparse", 1437 | "httpdate", 1438 | "itoa", 1439 | "pin-project-lite", 1440 | "socket2", 1441 | "tokio", 1442 | "tower-service", 1443 | "tracing", 1444 | "want", 1445 | ] 1446 | 1447 | [[package]] 1448 | name = "hyper" 1449 | version = "1.4.1" 1450 | source = "registry+https://github.com/rust-lang/crates.io-index" 1451 | checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" 1452 | dependencies = [ 1453 | "bytes", 1454 | "futures-channel", 1455 | "futures-util", 1456 | "http 1.1.0", 1457 | "http-body 1.0.0", 1458 | "httparse", 1459 | "itoa", 1460 | "pin-project-lite", 1461 | "smallvec", 1462 | "tokio", 1463 | "want", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "hyper-rustls" 1468 | version = "0.24.2" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" 1471 | dependencies = [ 1472 | "futures-util", 1473 | "http 0.2.12", 1474 | "hyper 0.14.28", 1475 | "log", 1476 | "rustls 0.21.12", 1477 | "rustls-native-certs", 1478 | "tokio", 1479 | "tokio-rustls 0.24.1", 1480 | ] 1481 | 1482 | [[package]] 1483 | name = "hyper-rustls" 1484 | version = "0.27.3" 1485 | source = "registry+https://github.com/rust-lang/crates.io-index" 1486 | checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" 1487 | dependencies = [ 1488 | "futures-util", 1489 | "http 1.1.0", 1490 | "hyper 1.4.1", 1491 | "hyper-util", 1492 | "rustls 0.23.14", 1493 | "rustls-pki-types", 1494 | "tokio", 1495 | "tokio-rustls 0.26.0", 1496 | "tower-service", 1497 | "webpki-roots", 1498 | ] 1499 | 1500 | [[package]] 1501 | name = "hyper-util" 1502 | version = "0.1.9" 1503 | source = "registry+https://github.com/rust-lang/crates.io-index" 1504 | checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" 1505 | dependencies = [ 1506 | "bytes", 1507 | "futures-channel", 1508 | "futures-util", 1509 | "http 1.1.0", 1510 | "http-body 1.0.0", 1511 | "hyper 1.4.1", 1512 | "pin-project-lite", 1513 | "socket2", 1514 | "tokio", 1515 | "tower-service", 1516 | "tracing", 1517 | ] 1518 | 1519 | [[package]] 1520 | name = "iana-time-zone" 1521 | version = "0.1.61" 1522 | source = "registry+https://github.com/rust-lang/crates.io-index" 1523 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 1524 | dependencies = [ 1525 | "android_system_properties", 1526 | "core-foundation-sys", 1527 | "iana-time-zone-haiku", 1528 | "js-sys", 1529 | "wasm-bindgen", 1530 | "windows-core", 1531 | ] 1532 | 1533 | [[package]] 1534 | name = "iana-time-zone-haiku" 1535 | version = "0.1.2" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1538 | dependencies = [ 1539 | "cc", 1540 | ] 1541 | 1542 | [[package]] 1543 | name = "ident_case" 1544 | version = "1.0.1" 1545 | source = "registry+https://github.com/rust-lang/crates.io-index" 1546 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1547 | 1548 | [[package]] 1549 | name = "idna" 1550 | version = "0.5.0" 1551 | source = "registry+https://github.com/rust-lang/crates.io-index" 1552 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 1553 | dependencies = [ 1554 | "unicode-bidi", 1555 | "unicode-normalization", 1556 | ] 1557 | 1558 | [[package]] 1559 | name = "impl-more" 1560 | version = "0.1.6" 1561 | source = "registry+https://github.com/rust-lang/crates.io-index" 1562 | checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" 1563 | 1564 | [[package]] 1565 | name = "indexmap" 1566 | version = "2.2.6" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 1569 | dependencies = [ 1570 | "equivalent", 1571 | "hashbrown", 1572 | ] 1573 | 1574 | [[package]] 1575 | name = "ipnet" 1576 | version = "2.10.1" 1577 | source = "registry+https://github.com/rust-lang/crates.io-index" 1578 | checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" 1579 | 1580 | [[package]] 1581 | name = "is_terminal_polyfill" 1582 | version = "1.70.1" 1583 | source = "registry+https://github.com/rust-lang/crates.io-index" 1584 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1585 | 1586 | [[package]] 1587 | name = "itoa" 1588 | version = "1.0.11" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 1591 | 1592 | [[package]] 1593 | name = "jobserver" 1594 | version = "0.1.32" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 1597 | dependencies = [ 1598 | "libc", 1599 | ] 1600 | 1601 | [[package]] 1602 | name = "js-sys" 1603 | version = "0.3.72" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" 1606 | dependencies = [ 1607 | "wasm-bindgen", 1608 | ] 1609 | 1610 | [[package]] 1611 | name = "json5" 1612 | version = "0.4.1" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" 1615 | dependencies = [ 1616 | "pest", 1617 | "pest_derive", 1618 | "serde", 1619 | ] 1620 | 1621 | [[package]] 1622 | name = "language-tags" 1623 | version = "0.3.2" 1624 | source = "registry+https://github.com/rust-lang/crates.io-index" 1625 | checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" 1626 | 1627 | [[package]] 1628 | name = "libc" 1629 | version = "0.2.154" 1630 | source = "registry+https://github.com/rust-lang/crates.io-index" 1631 | checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" 1632 | 1633 | [[package]] 1634 | name = "local-channel" 1635 | version = "0.1.5" 1636 | source = "registry+https://github.com/rust-lang/crates.io-index" 1637 | checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" 1638 | dependencies = [ 1639 | "futures-core", 1640 | "futures-sink", 1641 | "local-waker", 1642 | ] 1643 | 1644 | [[package]] 1645 | name = "local-waker" 1646 | version = "0.1.4" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" 1649 | 1650 | [[package]] 1651 | name = "lock_api" 1652 | version = "0.4.12" 1653 | source = "registry+https://github.com/rust-lang/crates.io-index" 1654 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1655 | dependencies = [ 1656 | "autocfg", 1657 | "scopeguard", 1658 | ] 1659 | 1660 | [[package]] 1661 | name = "log" 1662 | version = "0.4.21" 1663 | source = "registry+https://github.com/rust-lang/crates.io-index" 1664 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 1665 | 1666 | [[package]] 1667 | name = "lru" 1668 | version = "0.12.3" 1669 | source = "registry+https://github.com/rust-lang/crates.io-index" 1670 | checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" 1671 | dependencies = [ 1672 | "hashbrown", 1673 | ] 1674 | 1675 | [[package]] 1676 | name = "md-5" 1677 | version = "0.10.6" 1678 | source = "registry+https://github.com/rust-lang/crates.io-index" 1679 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1680 | dependencies = [ 1681 | "cfg-if", 1682 | "digest", 1683 | ] 1684 | 1685 | [[package]] 1686 | name = "memchr" 1687 | version = "2.7.2" 1688 | source = "registry+https://github.com/rust-lang/crates.io-index" 1689 | checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" 1690 | 1691 | [[package]] 1692 | name = "mime" 1693 | version = "0.3.17" 1694 | source = "registry+https://github.com/rust-lang/crates.io-index" 1695 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1696 | 1697 | [[package]] 1698 | name = "mime_guess" 1699 | version = "2.0.5" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 1702 | dependencies = [ 1703 | "mime", 1704 | "unicase", 1705 | ] 1706 | 1707 | [[package]] 1708 | name = "miniz_oxide" 1709 | version = "0.7.2" 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" 1711 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 1712 | dependencies = [ 1713 | "adler", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "miniz_oxide" 1718 | version = "0.8.0" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" 1721 | dependencies = [ 1722 | "adler2", 1723 | ] 1724 | 1725 | [[package]] 1726 | name = "mio" 1727 | version = "0.8.11" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 1730 | dependencies = [ 1731 | "libc", 1732 | "wasi", 1733 | "windows-sys 0.48.0", 1734 | ] 1735 | 1736 | [[package]] 1737 | name = "mio" 1738 | version = "1.0.2" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" 1741 | dependencies = [ 1742 | "hermit-abi", 1743 | "libc", 1744 | "log", 1745 | "wasi", 1746 | "windows-sys 0.52.0", 1747 | ] 1748 | 1749 | [[package]] 1750 | name = "num-conv" 1751 | version = "0.1.0" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1754 | 1755 | [[package]] 1756 | name = "num-integer" 1757 | version = "0.1.46" 1758 | source = "registry+https://github.com/rust-lang/crates.io-index" 1759 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1760 | dependencies = [ 1761 | "num-traits", 1762 | ] 1763 | 1764 | [[package]] 1765 | name = "num-traits" 1766 | version = "0.2.18" 1767 | source = "registry+https://github.com/rust-lang/crates.io-index" 1768 | checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" 1769 | dependencies = [ 1770 | "autocfg", 1771 | ] 1772 | 1773 | [[package]] 1774 | name = "object" 1775 | version = "0.32.2" 1776 | source = "registry+https://github.com/rust-lang/crates.io-index" 1777 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 1778 | dependencies = [ 1779 | "memchr", 1780 | ] 1781 | 1782 | [[package]] 1783 | name = "once_cell" 1784 | version = "1.19.0" 1785 | source = "registry+https://github.com/rust-lang/crates.io-index" 1786 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1787 | 1788 | [[package]] 1789 | name = "openssl-probe" 1790 | version = "0.1.5" 1791 | source = "registry+https://github.com/rust-lang/crates.io-index" 1792 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1793 | 1794 | [[package]] 1795 | name = "outref" 1796 | version = "0.5.1" 1797 | source = "registry+https://github.com/rust-lang/crates.io-index" 1798 | checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" 1799 | 1800 | [[package]] 1801 | name = "p256" 1802 | version = "0.11.1" 1803 | source = "registry+https://github.com/rust-lang/crates.io-index" 1804 | checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" 1805 | dependencies = [ 1806 | "ecdsa", 1807 | "elliptic-curve", 1808 | "sha2", 1809 | ] 1810 | 1811 | [[package]] 1812 | name = "parking_lot" 1813 | version = "0.12.2" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" 1816 | dependencies = [ 1817 | "lock_api", 1818 | "parking_lot_core", 1819 | ] 1820 | 1821 | [[package]] 1822 | name = "parking_lot_core" 1823 | version = "0.9.10" 1824 | source = "registry+https://github.com/rust-lang/crates.io-index" 1825 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1826 | dependencies = [ 1827 | "cfg-if", 1828 | "libc", 1829 | "redox_syscall", 1830 | "smallvec", 1831 | "windows-targets 0.52.6", 1832 | ] 1833 | 1834 | [[package]] 1835 | name = "paste" 1836 | version = "1.0.15" 1837 | source = "registry+https://github.com/rust-lang/crates.io-index" 1838 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1839 | 1840 | [[package]] 1841 | name = "percent-encoding" 1842 | version = "2.3.1" 1843 | source = "registry+https://github.com/rust-lang/crates.io-index" 1844 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1845 | 1846 | [[package]] 1847 | name = "pest" 1848 | version = "2.7.13" 1849 | source = "registry+https://github.com/rust-lang/crates.io-index" 1850 | checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" 1851 | dependencies = [ 1852 | "memchr", 1853 | "thiserror", 1854 | "ucd-trie", 1855 | ] 1856 | 1857 | [[package]] 1858 | name = "pest_derive" 1859 | version = "2.7.13" 1860 | source = "registry+https://github.com/rust-lang/crates.io-index" 1861 | checksum = "4d3a6e3394ec80feb3b6393c725571754c6188490265c61aaf260810d6b95aa0" 1862 | dependencies = [ 1863 | "pest", 1864 | "pest_generator", 1865 | ] 1866 | 1867 | [[package]] 1868 | name = "pest_generator" 1869 | version = "2.7.13" 1870 | source = "registry+https://github.com/rust-lang/crates.io-index" 1871 | checksum = "94429506bde1ca69d1b5601962c73f4172ab4726571a59ea95931218cb0e930e" 1872 | dependencies = [ 1873 | "pest", 1874 | "pest_meta", 1875 | "proc-macro2", 1876 | "quote", 1877 | "syn 2.0.60", 1878 | ] 1879 | 1880 | [[package]] 1881 | name = "pest_meta" 1882 | version = "2.7.13" 1883 | source = "registry+https://github.com/rust-lang/crates.io-index" 1884 | checksum = "ac8a071862e93690b6e34e9a5fb8e33ff3734473ac0245b27232222c4906a33f" 1885 | dependencies = [ 1886 | "once_cell", 1887 | "pest", 1888 | "sha2", 1889 | ] 1890 | 1891 | [[package]] 1892 | name = "pin-project-lite" 1893 | version = "0.2.14" 1894 | source = "registry+https://github.com/rust-lang/crates.io-index" 1895 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 1896 | 1897 | [[package]] 1898 | name = "pin-utils" 1899 | version = "0.1.0" 1900 | source = "registry+https://github.com/rust-lang/crates.io-index" 1901 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1902 | 1903 | [[package]] 1904 | name = "pkcs8" 1905 | version = "0.9.0" 1906 | source = "registry+https://github.com/rust-lang/crates.io-index" 1907 | checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" 1908 | dependencies = [ 1909 | "der", 1910 | "spki", 1911 | ] 1912 | 1913 | [[package]] 1914 | name = "pkg-config" 1915 | version = "0.3.31" 1916 | source = "registry+https://github.com/rust-lang/crates.io-index" 1917 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 1918 | 1919 | [[package]] 1920 | name = "powerfmt" 1921 | version = "0.2.0" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1924 | 1925 | [[package]] 1926 | name = "ppv-lite86" 1927 | version = "0.2.17" 1928 | source = "registry+https://github.com/rust-lang/crates.io-index" 1929 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1930 | 1931 | [[package]] 1932 | name = "proc-macro-error" 1933 | version = "1.0.4" 1934 | source = "registry+https://github.com/rust-lang/crates.io-index" 1935 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1936 | dependencies = [ 1937 | "proc-macro-error-attr", 1938 | "proc-macro2", 1939 | "quote", 1940 | "syn 1.0.109", 1941 | "version_check", 1942 | ] 1943 | 1944 | [[package]] 1945 | name = "proc-macro-error-attr" 1946 | version = "1.0.4" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1949 | dependencies = [ 1950 | "proc-macro2", 1951 | "quote", 1952 | "version_check", 1953 | ] 1954 | 1955 | [[package]] 1956 | name = "proc-macro2" 1957 | version = "1.0.81" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" 1960 | dependencies = [ 1961 | "unicode-ident", 1962 | ] 1963 | 1964 | [[package]] 1965 | name = "quinn" 1966 | version = "0.11.5" 1967 | source = "registry+https://github.com/rust-lang/crates.io-index" 1968 | checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" 1969 | dependencies = [ 1970 | "bytes", 1971 | "pin-project-lite", 1972 | "quinn-proto", 1973 | "quinn-udp", 1974 | "rustc-hash", 1975 | "rustls 0.23.14", 1976 | "socket2", 1977 | "thiserror", 1978 | "tokio", 1979 | "tracing", 1980 | ] 1981 | 1982 | [[package]] 1983 | name = "quinn-proto" 1984 | version = "0.11.8" 1985 | source = "registry+https://github.com/rust-lang/crates.io-index" 1986 | checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" 1987 | dependencies = [ 1988 | "bytes", 1989 | "rand", 1990 | "ring", 1991 | "rustc-hash", 1992 | "rustls 0.23.14", 1993 | "slab", 1994 | "thiserror", 1995 | "tinyvec", 1996 | "tracing", 1997 | ] 1998 | 1999 | [[package]] 2000 | name = "quinn-udp" 2001 | version = "0.5.4" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" 2004 | dependencies = [ 2005 | "libc", 2006 | "once_cell", 2007 | "socket2", 2008 | "tracing", 2009 | "windows-sys 0.52.0", 2010 | ] 2011 | 2012 | [[package]] 2013 | name = "quote" 2014 | version = "1.0.36" 2015 | source = "registry+https://github.com/rust-lang/crates.io-index" 2016 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 2017 | dependencies = [ 2018 | "proc-macro2", 2019 | ] 2020 | 2021 | [[package]] 2022 | name = "rand" 2023 | version = "0.8.5" 2024 | source = "registry+https://github.com/rust-lang/crates.io-index" 2025 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2026 | dependencies = [ 2027 | "libc", 2028 | "rand_chacha", 2029 | "rand_core", 2030 | ] 2031 | 2032 | [[package]] 2033 | name = "rand_chacha" 2034 | version = "0.3.1" 2035 | source = "registry+https://github.com/rust-lang/crates.io-index" 2036 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2037 | dependencies = [ 2038 | "ppv-lite86", 2039 | "rand_core", 2040 | ] 2041 | 2042 | [[package]] 2043 | name = "rand_core" 2044 | version = "0.6.4" 2045 | source = "registry+https://github.com/rust-lang/crates.io-index" 2046 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2047 | dependencies = [ 2048 | "getrandom", 2049 | ] 2050 | 2051 | [[package]] 2052 | name = "redox_syscall" 2053 | version = "0.5.1" 2054 | source = "registry+https://github.com/rust-lang/crates.io-index" 2055 | checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" 2056 | dependencies = [ 2057 | "bitflags", 2058 | ] 2059 | 2060 | [[package]] 2061 | name = "regex" 2062 | version = "1.10.4" 2063 | source = "registry+https://github.com/rust-lang/crates.io-index" 2064 | checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" 2065 | dependencies = [ 2066 | "aho-corasick", 2067 | "memchr", 2068 | "regex-automata", 2069 | "regex-syntax", 2070 | ] 2071 | 2072 | [[package]] 2073 | name = "regex-automata" 2074 | version = "0.4.6" 2075 | source = "registry+https://github.com/rust-lang/crates.io-index" 2076 | checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 2077 | dependencies = [ 2078 | "aho-corasick", 2079 | "memchr", 2080 | "regex-syntax", 2081 | ] 2082 | 2083 | [[package]] 2084 | name = "regex-lite" 2085 | version = "0.1.5" 2086 | source = "registry+https://github.com/rust-lang/crates.io-index" 2087 | checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" 2088 | 2089 | [[package]] 2090 | name = "regex-syntax" 2091 | version = "0.8.3" 2092 | source = "registry+https://github.com/rust-lang/crates.io-index" 2093 | checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" 2094 | 2095 | [[package]] 2096 | name = "reqwest" 2097 | version = "0.12.8" 2098 | source = "registry+https://github.com/rust-lang/crates.io-index" 2099 | checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" 2100 | dependencies = [ 2101 | "base64 0.22.1", 2102 | "bytes", 2103 | "futures-core", 2104 | "futures-util", 2105 | "http 1.1.0", 2106 | "http-body 1.0.0", 2107 | "http-body-util", 2108 | "hyper 1.4.1", 2109 | "hyper-rustls 0.27.3", 2110 | "hyper-util", 2111 | "ipnet", 2112 | "js-sys", 2113 | "log", 2114 | "mime", 2115 | "once_cell", 2116 | "percent-encoding", 2117 | "pin-project-lite", 2118 | "quinn", 2119 | "rustls 0.23.14", 2120 | "rustls-pemfile 2.2.0", 2121 | "rustls-pki-types", 2122 | "serde", 2123 | "serde_json", 2124 | "serde_urlencoded", 2125 | "sync_wrapper", 2126 | "tokio", 2127 | "tokio-rustls 0.26.0", 2128 | "tower-service", 2129 | "url", 2130 | "wasm-bindgen", 2131 | "wasm-bindgen-futures", 2132 | "web-sys", 2133 | "webpki-roots", 2134 | "windows-registry", 2135 | ] 2136 | 2137 | [[package]] 2138 | name = "rfc6979" 2139 | version = "0.3.1" 2140 | source = "registry+https://github.com/rust-lang/crates.io-index" 2141 | checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" 2142 | dependencies = [ 2143 | "crypto-bigint 0.4.9", 2144 | "hmac", 2145 | "zeroize", 2146 | ] 2147 | 2148 | [[package]] 2149 | name = "ring" 2150 | version = "0.17.8" 2151 | source = "registry+https://github.com/rust-lang/crates.io-index" 2152 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 2153 | dependencies = [ 2154 | "cc", 2155 | "cfg-if", 2156 | "getrandom", 2157 | "libc", 2158 | "spin", 2159 | "untrusted", 2160 | "windows-sys 0.52.0", 2161 | ] 2162 | 2163 | [[package]] 2164 | name = "rustc-demangle" 2165 | version = "0.1.23" 2166 | source = "registry+https://github.com/rust-lang/crates.io-index" 2167 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 2168 | 2169 | [[package]] 2170 | name = "rustc-hash" 2171 | version = "2.0.0" 2172 | source = "registry+https://github.com/rust-lang/crates.io-index" 2173 | checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" 2174 | 2175 | [[package]] 2176 | name = "rustc_version" 2177 | version = "0.4.0" 2178 | source = "registry+https://github.com/rust-lang/crates.io-index" 2179 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2180 | dependencies = [ 2181 | "semver", 2182 | ] 2183 | 2184 | [[package]] 2185 | name = "rustls" 2186 | version = "0.21.12" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" 2189 | dependencies = [ 2190 | "log", 2191 | "ring", 2192 | "rustls-webpki 0.101.7", 2193 | "sct", 2194 | ] 2195 | 2196 | [[package]] 2197 | name = "rustls" 2198 | version = "0.23.14" 2199 | source = "registry+https://github.com/rust-lang/crates.io-index" 2200 | checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" 2201 | dependencies = [ 2202 | "once_cell", 2203 | "ring", 2204 | "rustls-pki-types", 2205 | "rustls-webpki 0.102.8", 2206 | "subtle", 2207 | "zeroize", 2208 | ] 2209 | 2210 | [[package]] 2211 | name = "rustls-native-certs" 2212 | version = "0.6.3" 2213 | source = "registry+https://github.com/rust-lang/crates.io-index" 2214 | checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" 2215 | dependencies = [ 2216 | "openssl-probe", 2217 | "rustls-pemfile 1.0.4", 2218 | "schannel", 2219 | "security-framework", 2220 | ] 2221 | 2222 | [[package]] 2223 | name = "rustls-pemfile" 2224 | version = "1.0.4" 2225 | source = "registry+https://github.com/rust-lang/crates.io-index" 2226 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 2227 | dependencies = [ 2228 | "base64 0.21.7", 2229 | ] 2230 | 2231 | [[package]] 2232 | name = "rustls-pemfile" 2233 | version = "2.2.0" 2234 | source = "registry+https://github.com/rust-lang/crates.io-index" 2235 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 2236 | dependencies = [ 2237 | "rustls-pki-types", 2238 | ] 2239 | 2240 | [[package]] 2241 | name = "rustls-pki-types" 2242 | version = "1.9.0" 2243 | source = "registry+https://github.com/rust-lang/crates.io-index" 2244 | checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" 2245 | 2246 | [[package]] 2247 | name = "rustls-webpki" 2248 | version = "0.101.7" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 2251 | dependencies = [ 2252 | "ring", 2253 | "untrusted", 2254 | ] 2255 | 2256 | [[package]] 2257 | name = "rustls-webpki" 2258 | version = "0.102.8" 2259 | source = "registry+https://github.com/rust-lang/crates.io-index" 2260 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 2261 | dependencies = [ 2262 | "ring", 2263 | "rustls-pki-types", 2264 | "untrusted", 2265 | ] 2266 | 2267 | [[package]] 2268 | name = "ryu" 2269 | version = "1.0.17" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 2272 | 2273 | [[package]] 2274 | name = "schannel" 2275 | version = "0.1.23" 2276 | source = "registry+https://github.com/rust-lang/crates.io-index" 2277 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 2278 | dependencies = [ 2279 | "windows-sys 0.52.0", 2280 | ] 2281 | 2282 | [[package]] 2283 | name = "scopeguard" 2284 | version = "1.2.0" 2285 | source = "registry+https://github.com/rust-lang/crates.io-index" 2286 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2287 | 2288 | [[package]] 2289 | name = "sct" 2290 | version = "0.7.1" 2291 | source = "registry+https://github.com/rust-lang/crates.io-index" 2292 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 2293 | dependencies = [ 2294 | "ring", 2295 | "untrusted", 2296 | ] 2297 | 2298 | [[package]] 2299 | name = "sec1" 2300 | version = "0.3.0" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" 2303 | dependencies = [ 2304 | "base16ct", 2305 | "der", 2306 | "generic-array", 2307 | "pkcs8", 2308 | "subtle", 2309 | "zeroize", 2310 | ] 2311 | 2312 | [[package]] 2313 | name = "security-framework" 2314 | version = "2.11.0" 2315 | source = "registry+https://github.com/rust-lang/crates.io-index" 2316 | checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" 2317 | dependencies = [ 2318 | "bitflags", 2319 | "core-foundation", 2320 | "core-foundation-sys", 2321 | "libc", 2322 | "security-framework-sys", 2323 | ] 2324 | 2325 | [[package]] 2326 | name = "security-framework-sys" 2327 | version = "2.11.0" 2328 | source = "registry+https://github.com/rust-lang/crates.io-index" 2329 | checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" 2330 | dependencies = [ 2331 | "core-foundation-sys", 2332 | "libc", 2333 | ] 2334 | 2335 | [[package]] 2336 | name = "semver" 2337 | version = "1.0.22" 2338 | source = "registry+https://github.com/rust-lang/crates.io-index" 2339 | checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" 2340 | 2341 | [[package]] 2342 | name = "serde" 2343 | version = "1.0.200" 2344 | source = "registry+https://github.com/rust-lang/crates.io-index" 2345 | checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f" 2346 | dependencies = [ 2347 | "serde_derive", 2348 | ] 2349 | 2350 | [[package]] 2351 | name = "serde_derive" 2352 | version = "1.0.200" 2353 | source = "registry+https://github.com/rust-lang/crates.io-index" 2354 | checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" 2355 | dependencies = [ 2356 | "proc-macro2", 2357 | "quote", 2358 | "syn 2.0.60", 2359 | ] 2360 | 2361 | [[package]] 2362 | name = "serde_json" 2363 | version = "1.0.116" 2364 | source = "registry+https://github.com/rust-lang/crates.io-index" 2365 | checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" 2366 | dependencies = [ 2367 | "itoa", 2368 | "ryu", 2369 | "serde", 2370 | ] 2371 | 2372 | [[package]] 2373 | name = "serde_spanned" 2374 | version = "0.6.8" 2375 | source = "registry+https://github.com/rust-lang/crates.io-index" 2376 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 2377 | dependencies = [ 2378 | "serde", 2379 | ] 2380 | 2381 | [[package]] 2382 | name = "serde_urlencoded" 2383 | version = "0.7.1" 2384 | source = "registry+https://github.com/rust-lang/crates.io-index" 2385 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2386 | dependencies = [ 2387 | "form_urlencoded", 2388 | "itoa", 2389 | "ryu", 2390 | "serde", 2391 | ] 2392 | 2393 | [[package]] 2394 | name = "serde_yaml" 2395 | version = "0.9.34+deprecated" 2396 | source = "registry+https://github.com/rust-lang/crates.io-index" 2397 | checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" 2398 | dependencies = [ 2399 | "indexmap", 2400 | "itoa", 2401 | "ryu", 2402 | "serde", 2403 | "unsafe-libyaml", 2404 | ] 2405 | 2406 | [[package]] 2407 | name = "sha1" 2408 | version = "0.10.6" 2409 | source = "registry+https://github.com/rust-lang/crates.io-index" 2410 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 2411 | dependencies = [ 2412 | "cfg-if", 2413 | "cpufeatures", 2414 | "digest", 2415 | ] 2416 | 2417 | [[package]] 2418 | name = "sha2" 2419 | version = "0.10.8" 2420 | source = "registry+https://github.com/rust-lang/crates.io-index" 2421 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 2422 | dependencies = [ 2423 | "cfg-if", 2424 | "cpufeatures", 2425 | "digest", 2426 | ] 2427 | 2428 | [[package]] 2429 | name = "signal-hook-registry" 2430 | version = "1.4.2" 2431 | source = "registry+https://github.com/rust-lang/crates.io-index" 2432 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 2433 | dependencies = [ 2434 | "libc", 2435 | ] 2436 | 2437 | [[package]] 2438 | name = "signature" 2439 | version = "1.6.4" 2440 | source = "registry+https://github.com/rust-lang/crates.io-index" 2441 | checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" 2442 | dependencies = [ 2443 | "digest", 2444 | "rand_core", 2445 | ] 2446 | 2447 | [[package]] 2448 | name = "simple-file-transfer" 2449 | version = "0.1.0" 2450 | dependencies = [ 2451 | "actix-cors", 2452 | "actix-files", 2453 | "actix-web", 2454 | "aws-config", 2455 | "aws-sdk-s3", 2456 | "chrono", 2457 | "confique", 2458 | "env_logger", 2459 | "reqwest", 2460 | "serde", 2461 | "uuid", 2462 | "validator", 2463 | ] 2464 | 2465 | [[package]] 2466 | name = "slab" 2467 | version = "0.4.9" 2468 | source = "registry+https://github.com/rust-lang/crates.io-index" 2469 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2470 | dependencies = [ 2471 | "autocfg", 2472 | ] 2473 | 2474 | [[package]] 2475 | name = "smallvec" 2476 | version = "1.13.2" 2477 | source = "registry+https://github.com/rust-lang/crates.io-index" 2478 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 2479 | 2480 | [[package]] 2481 | name = "socket2" 2482 | version = "0.5.7" 2483 | source = "registry+https://github.com/rust-lang/crates.io-index" 2484 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 2485 | dependencies = [ 2486 | "libc", 2487 | "windows-sys 0.52.0", 2488 | ] 2489 | 2490 | [[package]] 2491 | name = "spin" 2492 | version = "0.9.8" 2493 | source = "registry+https://github.com/rust-lang/crates.io-index" 2494 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 2495 | 2496 | [[package]] 2497 | name = "spki" 2498 | version = "0.6.0" 2499 | source = "registry+https://github.com/rust-lang/crates.io-index" 2500 | checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" 2501 | dependencies = [ 2502 | "base64ct", 2503 | "der", 2504 | ] 2505 | 2506 | [[package]] 2507 | name = "strsim" 2508 | version = "0.11.1" 2509 | source = "registry+https://github.com/rust-lang/crates.io-index" 2510 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2511 | 2512 | [[package]] 2513 | name = "subtle" 2514 | version = "2.5.0" 2515 | source = "registry+https://github.com/rust-lang/crates.io-index" 2516 | checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 2517 | 2518 | [[package]] 2519 | name = "syn" 2520 | version = "1.0.109" 2521 | source = "registry+https://github.com/rust-lang/crates.io-index" 2522 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2523 | dependencies = [ 2524 | "proc-macro2", 2525 | "quote", 2526 | "unicode-ident", 2527 | ] 2528 | 2529 | [[package]] 2530 | name = "syn" 2531 | version = "2.0.60" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" 2534 | dependencies = [ 2535 | "proc-macro2", 2536 | "quote", 2537 | "unicode-ident", 2538 | ] 2539 | 2540 | [[package]] 2541 | name = "sync_wrapper" 2542 | version = "1.0.1" 2543 | source = "registry+https://github.com/rust-lang/crates.io-index" 2544 | checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" 2545 | dependencies = [ 2546 | "futures-core", 2547 | ] 2548 | 2549 | [[package]] 2550 | name = "thiserror" 2551 | version = "1.0.64" 2552 | source = "registry+https://github.com/rust-lang/crates.io-index" 2553 | checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" 2554 | dependencies = [ 2555 | "thiserror-impl", 2556 | ] 2557 | 2558 | [[package]] 2559 | name = "thiserror-impl" 2560 | version = "1.0.64" 2561 | source = "registry+https://github.com/rust-lang/crates.io-index" 2562 | checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" 2563 | dependencies = [ 2564 | "proc-macro2", 2565 | "quote", 2566 | "syn 2.0.60", 2567 | ] 2568 | 2569 | [[package]] 2570 | name = "time" 2571 | version = "0.3.36" 2572 | source = "registry+https://github.com/rust-lang/crates.io-index" 2573 | checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 2574 | dependencies = [ 2575 | "deranged", 2576 | "itoa", 2577 | "num-conv", 2578 | "powerfmt", 2579 | "serde", 2580 | "time-core", 2581 | "time-macros", 2582 | ] 2583 | 2584 | [[package]] 2585 | name = "time-core" 2586 | version = "0.1.2" 2587 | source = "registry+https://github.com/rust-lang/crates.io-index" 2588 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 2589 | 2590 | [[package]] 2591 | name = "time-macros" 2592 | version = "0.2.18" 2593 | source = "registry+https://github.com/rust-lang/crates.io-index" 2594 | checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" 2595 | dependencies = [ 2596 | "num-conv", 2597 | "time-core", 2598 | ] 2599 | 2600 | [[package]] 2601 | name = "tinyvec" 2602 | version = "1.6.0" 2603 | source = "registry+https://github.com/rust-lang/crates.io-index" 2604 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2605 | dependencies = [ 2606 | "tinyvec_macros", 2607 | ] 2608 | 2609 | [[package]] 2610 | name = "tinyvec_macros" 2611 | version = "0.1.1" 2612 | source = "registry+https://github.com/rust-lang/crates.io-index" 2613 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2614 | 2615 | [[package]] 2616 | name = "tokio" 2617 | version = "1.37.0" 2618 | source = "registry+https://github.com/rust-lang/crates.io-index" 2619 | checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" 2620 | dependencies = [ 2621 | "backtrace", 2622 | "bytes", 2623 | "libc", 2624 | "mio 0.8.11", 2625 | "parking_lot", 2626 | "pin-project-lite", 2627 | "signal-hook-registry", 2628 | "socket2", 2629 | "windows-sys 0.48.0", 2630 | ] 2631 | 2632 | [[package]] 2633 | name = "tokio-rustls" 2634 | version = "0.24.1" 2635 | source = "registry+https://github.com/rust-lang/crates.io-index" 2636 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 2637 | dependencies = [ 2638 | "rustls 0.21.12", 2639 | "tokio", 2640 | ] 2641 | 2642 | [[package]] 2643 | name = "tokio-rustls" 2644 | version = "0.26.0" 2645 | source = "registry+https://github.com/rust-lang/crates.io-index" 2646 | checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" 2647 | dependencies = [ 2648 | "rustls 0.23.14", 2649 | "rustls-pki-types", 2650 | "tokio", 2651 | ] 2652 | 2653 | [[package]] 2654 | name = "tokio-util" 2655 | version = "0.7.10" 2656 | source = "registry+https://github.com/rust-lang/crates.io-index" 2657 | checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 2658 | dependencies = [ 2659 | "bytes", 2660 | "futures-core", 2661 | "futures-sink", 2662 | "pin-project-lite", 2663 | "tokio", 2664 | "tracing", 2665 | ] 2666 | 2667 | [[package]] 2668 | name = "toml" 2669 | version = "0.8.19" 2670 | source = "registry+https://github.com/rust-lang/crates.io-index" 2671 | checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" 2672 | dependencies = [ 2673 | "serde", 2674 | "serde_spanned", 2675 | "toml_datetime", 2676 | "toml_edit", 2677 | ] 2678 | 2679 | [[package]] 2680 | name = "toml_datetime" 2681 | version = "0.6.8" 2682 | source = "registry+https://github.com/rust-lang/crates.io-index" 2683 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 2684 | dependencies = [ 2685 | "serde", 2686 | ] 2687 | 2688 | [[package]] 2689 | name = "toml_edit" 2690 | version = "0.22.20" 2691 | source = "registry+https://github.com/rust-lang/crates.io-index" 2692 | checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" 2693 | dependencies = [ 2694 | "indexmap", 2695 | "serde", 2696 | "serde_spanned", 2697 | "toml_datetime", 2698 | "winnow", 2699 | ] 2700 | 2701 | [[package]] 2702 | name = "tower-service" 2703 | version = "0.3.2" 2704 | source = "registry+https://github.com/rust-lang/crates.io-index" 2705 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2706 | 2707 | [[package]] 2708 | name = "tracing" 2709 | version = "0.1.40" 2710 | source = "registry+https://github.com/rust-lang/crates.io-index" 2711 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2712 | dependencies = [ 2713 | "log", 2714 | "pin-project-lite", 2715 | "tracing-attributes", 2716 | "tracing-core", 2717 | ] 2718 | 2719 | [[package]] 2720 | name = "tracing-attributes" 2721 | version = "0.1.27" 2722 | source = "registry+https://github.com/rust-lang/crates.io-index" 2723 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2724 | dependencies = [ 2725 | "proc-macro2", 2726 | "quote", 2727 | "syn 2.0.60", 2728 | ] 2729 | 2730 | [[package]] 2731 | name = "tracing-core" 2732 | version = "0.1.32" 2733 | source = "registry+https://github.com/rust-lang/crates.io-index" 2734 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2735 | dependencies = [ 2736 | "once_cell", 2737 | ] 2738 | 2739 | [[package]] 2740 | name = "try-lock" 2741 | version = "0.2.5" 2742 | source = "registry+https://github.com/rust-lang/crates.io-index" 2743 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2744 | 2745 | [[package]] 2746 | name = "typenum" 2747 | version = "1.17.0" 2748 | source = "registry+https://github.com/rust-lang/crates.io-index" 2749 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2750 | 2751 | [[package]] 2752 | name = "ucd-trie" 2753 | version = "0.1.7" 2754 | source = "registry+https://github.com/rust-lang/crates.io-index" 2755 | checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 2756 | 2757 | [[package]] 2758 | name = "unicase" 2759 | version = "2.7.0" 2760 | source = "registry+https://github.com/rust-lang/crates.io-index" 2761 | checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" 2762 | dependencies = [ 2763 | "version_check", 2764 | ] 2765 | 2766 | [[package]] 2767 | name = "unicode-bidi" 2768 | version = "0.3.15" 2769 | source = "registry+https://github.com/rust-lang/crates.io-index" 2770 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 2771 | 2772 | [[package]] 2773 | name = "unicode-ident" 2774 | version = "1.0.12" 2775 | source = "registry+https://github.com/rust-lang/crates.io-index" 2776 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2777 | 2778 | [[package]] 2779 | name = "unicode-normalization" 2780 | version = "0.1.23" 2781 | source = "registry+https://github.com/rust-lang/crates.io-index" 2782 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 2783 | dependencies = [ 2784 | "tinyvec", 2785 | ] 2786 | 2787 | [[package]] 2788 | name = "unicode-segmentation" 2789 | version = "1.12.0" 2790 | source = "registry+https://github.com/rust-lang/crates.io-index" 2791 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 2792 | 2793 | [[package]] 2794 | name = "unsafe-libyaml" 2795 | version = "0.2.11" 2796 | source = "registry+https://github.com/rust-lang/crates.io-index" 2797 | checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" 2798 | 2799 | [[package]] 2800 | name = "untrusted" 2801 | version = "0.9.0" 2802 | source = "registry+https://github.com/rust-lang/crates.io-index" 2803 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2804 | 2805 | [[package]] 2806 | name = "url" 2807 | version = "2.5.0" 2808 | source = "registry+https://github.com/rust-lang/crates.io-index" 2809 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2810 | dependencies = [ 2811 | "form_urlencoded", 2812 | "idna", 2813 | "percent-encoding", 2814 | ] 2815 | 2816 | [[package]] 2817 | name = "urlencoding" 2818 | version = "2.1.3" 2819 | source = "registry+https://github.com/rust-lang/crates.io-index" 2820 | checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 2821 | 2822 | [[package]] 2823 | name = "utf8parse" 2824 | version = "0.2.2" 2825 | source = "registry+https://github.com/rust-lang/crates.io-index" 2826 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2827 | 2828 | [[package]] 2829 | name = "uuid" 2830 | version = "1.8.0" 2831 | source = "registry+https://github.com/rust-lang/crates.io-index" 2832 | checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" 2833 | dependencies = [ 2834 | "getrandom", 2835 | "rand", 2836 | ] 2837 | 2838 | [[package]] 2839 | name = "v_htmlescape" 2840 | version = "0.15.8" 2841 | source = "registry+https://github.com/rust-lang/crates.io-index" 2842 | checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" 2843 | 2844 | [[package]] 2845 | name = "validator" 2846 | version = "0.18.1" 2847 | source = "registry+https://github.com/rust-lang/crates.io-index" 2848 | checksum = "db79c75af171630a3148bd3e6d7c4f42b6a9a014c2945bc5ed0020cbb8d9478e" 2849 | dependencies = [ 2850 | "idna", 2851 | "once_cell", 2852 | "regex", 2853 | "serde", 2854 | "serde_derive", 2855 | "serde_json", 2856 | "url", 2857 | "validator_derive", 2858 | ] 2859 | 2860 | [[package]] 2861 | name = "validator_derive" 2862 | version = "0.18.2" 2863 | source = "registry+https://github.com/rust-lang/crates.io-index" 2864 | checksum = "df0bcf92720c40105ac4b2dda2a4ea3aa717d4d6a862cc217da653a4bd5c6b10" 2865 | dependencies = [ 2866 | "darling", 2867 | "once_cell", 2868 | "proc-macro-error", 2869 | "proc-macro2", 2870 | "quote", 2871 | "syn 2.0.60", 2872 | ] 2873 | 2874 | [[package]] 2875 | name = "version_check" 2876 | version = "0.9.4" 2877 | source = "registry+https://github.com/rust-lang/crates.io-index" 2878 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2879 | 2880 | [[package]] 2881 | name = "vsimd" 2882 | version = "0.8.0" 2883 | source = "registry+https://github.com/rust-lang/crates.io-index" 2884 | checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" 2885 | 2886 | [[package]] 2887 | name = "want" 2888 | version = "0.3.1" 2889 | source = "registry+https://github.com/rust-lang/crates.io-index" 2890 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2891 | dependencies = [ 2892 | "try-lock", 2893 | ] 2894 | 2895 | [[package]] 2896 | name = "wasi" 2897 | version = "0.11.0+wasi-snapshot-preview1" 2898 | source = "registry+https://github.com/rust-lang/crates.io-index" 2899 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2900 | 2901 | [[package]] 2902 | name = "wasm-bindgen" 2903 | version = "0.2.95" 2904 | source = "registry+https://github.com/rust-lang/crates.io-index" 2905 | checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" 2906 | dependencies = [ 2907 | "cfg-if", 2908 | "once_cell", 2909 | "wasm-bindgen-macro", 2910 | ] 2911 | 2912 | [[package]] 2913 | name = "wasm-bindgen-backend" 2914 | version = "0.2.95" 2915 | source = "registry+https://github.com/rust-lang/crates.io-index" 2916 | checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" 2917 | dependencies = [ 2918 | "bumpalo", 2919 | "log", 2920 | "once_cell", 2921 | "proc-macro2", 2922 | "quote", 2923 | "syn 2.0.60", 2924 | "wasm-bindgen-shared", 2925 | ] 2926 | 2927 | [[package]] 2928 | name = "wasm-bindgen-futures" 2929 | version = "0.4.45" 2930 | source = "registry+https://github.com/rust-lang/crates.io-index" 2931 | checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" 2932 | dependencies = [ 2933 | "cfg-if", 2934 | "js-sys", 2935 | "wasm-bindgen", 2936 | "web-sys", 2937 | ] 2938 | 2939 | [[package]] 2940 | name = "wasm-bindgen-macro" 2941 | version = "0.2.95" 2942 | source = "registry+https://github.com/rust-lang/crates.io-index" 2943 | checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" 2944 | dependencies = [ 2945 | "quote", 2946 | "wasm-bindgen-macro-support", 2947 | ] 2948 | 2949 | [[package]] 2950 | name = "wasm-bindgen-macro-support" 2951 | version = "0.2.95" 2952 | source = "registry+https://github.com/rust-lang/crates.io-index" 2953 | checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" 2954 | dependencies = [ 2955 | "proc-macro2", 2956 | "quote", 2957 | "syn 2.0.60", 2958 | "wasm-bindgen-backend", 2959 | "wasm-bindgen-shared", 2960 | ] 2961 | 2962 | [[package]] 2963 | name = "wasm-bindgen-shared" 2964 | version = "0.2.95" 2965 | source = "registry+https://github.com/rust-lang/crates.io-index" 2966 | checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" 2967 | 2968 | [[package]] 2969 | name = "web-sys" 2970 | version = "0.3.72" 2971 | source = "registry+https://github.com/rust-lang/crates.io-index" 2972 | checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" 2973 | dependencies = [ 2974 | "js-sys", 2975 | "wasm-bindgen", 2976 | ] 2977 | 2978 | [[package]] 2979 | name = "webpki-roots" 2980 | version = "0.26.6" 2981 | source = "registry+https://github.com/rust-lang/crates.io-index" 2982 | checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" 2983 | dependencies = [ 2984 | "rustls-pki-types", 2985 | ] 2986 | 2987 | [[package]] 2988 | name = "windows-core" 2989 | version = "0.52.0" 2990 | source = "registry+https://github.com/rust-lang/crates.io-index" 2991 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2992 | dependencies = [ 2993 | "windows-targets 0.52.6", 2994 | ] 2995 | 2996 | [[package]] 2997 | name = "windows-registry" 2998 | version = "0.2.0" 2999 | source = "registry+https://github.com/rust-lang/crates.io-index" 3000 | checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" 3001 | dependencies = [ 3002 | "windows-result", 3003 | "windows-strings", 3004 | "windows-targets 0.52.6", 3005 | ] 3006 | 3007 | [[package]] 3008 | name = "windows-result" 3009 | version = "0.2.0" 3010 | source = "registry+https://github.com/rust-lang/crates.io-index" 3011 | checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 3012 | dependencies = [ 3013 | "windows-targets 0.52.6", 3014 | ] 3015 | 3016 | [[package]] 3017 | name = "windows-strings" 3018 | version = "0.1.0" 3019 | source = "registry+https://github.com/rust-lang/crates.io-index" 3020 | checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 3021 | dependencies = [ 3022 | "windows-result", 3023 | "windows-targets 0.52.6", 3024 | ] 3025 | 3026 | [[package]] 3027 | name = "windows-sys" 3028 | version = "0.48.0" 3029 | source = "registry+https://github.com/rust-lang/crates.io-index" 3030 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3031 | dependencies = [ 3032 | "windows-targets 0.48.5", 3033 | ] 3034 | 3035 | [[package]] 3036 | name = "windows-sys" 3037 | version = "0.52.0" 3038 | source = "registry+https://github.com/rust-lang/crates.io-index" 3039 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3040 | dependencies = [ 3041 | "windows-targets 0.52.6", 3042 | ] 3043 | 3044 | [[package]] 3045 | name = "windows-targets" 3046 | version = "0.48.5" 3047 | source = "registry+https://github.com/rust-lang/crates.io-index" 3048 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3049 | dependencies = [ 3050 | "windows_aarch64_gnullvm 0.48.5", 3051 | "windows_aarch64_msvc 0.48.5", 3052 | "windows_i686_gnu 0.48.5", 3053 | "windows_i686_msvc 0.48.5", 3054 | "windows_x86_64_gnu 0.48.5", 3055 | "windows_x86_64_gnullvm 0.48.5", 3056 | "windows_x86_64_msvc 0.48.5", 3057 | ] 3058 | 3059 | [[package]] 3060 | name = "windows-targets" 3061 | version = "0.52.6" 3062 | source = "registry+https://github.com/rust-lang/crates.io-index" 3063 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3064 | dependencies = [ 3065 | "windows_aarch64_gnullvm 0.52.6", 3066 | "windows_aarch64_msvc 0.52.6", 3067 | "windows_i686_gnu 0.52.6", 3068 | "windows_i686_gnullvm", 3069 | "windows_i686_msvc 0.52.6", 3070 | "windows_x86_64_gnu 0.52.6", 3071 | "windows_x86_64_gnullvm 0.52.6", 3072 | "windows_x86_64_msvc 0.52.6", 3073 | ] 3074 | 3075 | [[package]] 3076 | name = "windows_aarch64_gnullvm" 3077 | version = "0.48.5" 3078 | source = "registry+https://github.com/rust-lang/crates.io-index" 3079 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3080 | 3081 | [[package]] 3082 | name = "windows_aarch64_gnullvm" 3083 | version = "0.52.6" 3084 | source = "registry+https://github.com/rust-lang/crates.io-index" 3085 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3086 | 3087 | [[package]] 3088 | name = "windows_aarch64_msvc" 3089 | version = "0.48.5" 3090 | source = "registry+https://github.com/rust-lang/crates.io-index" 3091 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3092 | 3093 | [[package]] 3094 | name = "windows_aarch64_msvc" 3095 | version = "0.52.6" 3096 | source = "registry+https://github.com/rust-lang/crates.io-index" 3097 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3098 | 3099 | [[package]] 3100 | name = "windows_i686_gnu" 3101 | version = "0.48.5" 3102 | source = "registry+https://github.com/rust-lang/crates.io-index" 3103 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3104 | 3105 | [[package]] 3106 | name = "windows_i686_gnu" 3107 | version = "0.52.6" 3108 | source = "registry+https://github.com/rust-lang/crates.io-index" 3109 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3110 | 3111 | [[package]] 3112 | name = "windows_i686_gnullvm" 3113 | version = "0.52.6" 3114 | source = "registry+https://github.com/rust-lang/crates.io-index" 3115 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3116 | 3117 | [[package]] 3118 | name = "windows_i686_msvc" 3119 | version = "0.48.5" 3120 | source = "registry+https://github.com/rust-lang/crates.io-index" 3121 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3122 | 3123 | [[package]] 3124 | name = "windows_i686_msvc" 3125 | version = "0.52.6" 3126 | source = "registry+https://github.com/rust-lang/crates.io-index" 3127 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3128 | 3129 | [[package]] 3130 | name = "windows_x86_64_gnu" 3131 | version = "0.48.5" 3132 | source = "registry+https://github.com/rust-lang/crates.io-index" 3133 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3134 | 3135 | [[package]] 3136 | name = "windows_x86_64_gnu" 3137 | version = "0.52.6" 3138 | source = "registry+https://github.com/rust-lang/crates.io-index" 3139 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3140 | 3141 | [[package]] 3142 | name = "windows_x86_64_gnullvm" 3143 | version = "0.48.5" 3144 | source = "registry+https://github.com/rust-lang/crates.io-index" 3145 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3146 | 3147 | [[package]] 3148 | name = "windows_x86_64_gnullvm" 3149 | version = "0.52.6" 3150 | source = "registry+https://github.com/rust-lang/crates.io-index" 3151 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3152 | 3153 | [[package]] 3154 | name = "windows_x86_64_msvc" 3155 | version = "0.48.5" 3156 | source = "registry+https://github.com/rust-lang/crates.io-index" 3157 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3158 | 3159 | [[package]] 3160 | name = "windows_x86_64_msvc" 3161 | version = "0.52.6" 3162 | source = "registry+https://github.com/rust-lang/crates.io-index" 3163 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3164 | 3165 | [[package]] 3166 | name = "winnow" 3167 | version = "0.6.20" 3168 | source = "registry+https://github.com/rust-lang/crates.io-index" 3169 | checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" 3170 | dependencies = [ 3171 | "memchr", 3172 | ] 3173 | 3174 | [[package]] 3175 | name = "xmlparser" 3176 | version = "0.13.6" 3177 | source = "registry+https://github.com/rust-lang/crates.io-index" 3178 | checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" 3179 | 3180 | [[package]] 3181 | name = "zerocopy" 3182 | version = "0.7.32" 3183 | source = "registry+https://github.com/rust-lang/crates.io-index" 3184 | checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" 3185 | dependencies = [ 3186 | "zerocopy-derive", 3187 | ] 3188 | 3189 | [[package]] 3190 | name = "zerocopy-derive" 3191 | version = "0.7.32" 3192 | source = "registry+https://github.com/rust-lang/crates.io-index" 3193 | checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" 3194 | dependencies = [ 3195 | "proc-macro2", 3196 | "quote", 3197 | "syn 2.0.60", 3198 | ] 3199 | 3200 | [[package]] 3201 | name = "zeroize" 3202 | version = "1.7.0" 3203 | source = "registry+https://github.com/rust-lang/crates.io-index" 3204 | checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" 3205 | 3206 | [[package]] 3207 | name = "zstd" 3208 | version = "0.13.2" 3209 | source = "registry+https://github.com/rust-lang/crates.io-index" 3210 | checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" 3211 | dependencies = [ 3212 | "zstd-safe", 3213 | ] 3214 | 3215 | [[package]] 3216 | name = "zstd-safe" 3217 | version = "7.2.1" 3218 | source = "registry+https://github.com/rust-lang/crates.io-index" 3219 | checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" 3220 | dependencies = [ 3221 | "zstd-sys", 3222 | ] 3223 | 3224 | [[package]] 3225 | name = "zstd-sys" 3226 | version = "2.0.13+zstd.1.5.6" 3227 | source = "registry+https://github.com/rust-lang/crates.io-index" 3228 | checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" 3229 | dependencies = [ 3230 | "cc", 3231 | "pkg-config", 3232 | ] 3233 | -------------------------------------------------------------------------------- /backend/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "simple-file-transfer" 3 | version = "0.1.0" 4 | edition = "2021" 5 | publish = false 6 | 7 | [[bin]] 8 | name = "simple-file-transfer" 9 | path = "src/main.rs" 10 | 11 | [profile.release] 12 | opt-level = "z" # Optimize for size. 13 | lto = true # Enable Link Time Optimization 14 | codegen-units = 1 # Reduce number of codegen units to increase optimizations. 15 | panic = "abort" # Abort on panic 16 | strip = true # Automatically strip symbols from the binary. 17 | 18 | [dependencies] 19 | actix-web = "4" 20 | actix-cors = "0" 21 | actix-files = "0" 22 | env_logger = "0" 23 | aws-config = { version = "1", features = ["behavior-version-latest"] } 24 | aws-sdk-s3 = { version = "1", features = ["behavior-version-latest"] } 25 | serde = { version = "1", features = ["derive"], default-features = false } 26 | validator = { version = "0", features = ["derive"], default-features = false } 27 | uuid = { version = "1", features = ["fast-rng", "v4"] } 28 | reqwest = { version = "0.12.8", features = ["json", "rustls-tls"], default-features = false } 29 | chrono = { version = "0", features = ["serde"] } 30 | confique = "0" 31 | -------------------------------------------------------------------------------- /backend/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM rust:slim AS builder 2 | WORKDIR /app 3 | RUN cargo install cargo-watch 4 | COPY . . 5 | CMD cargo watch -x run 6 | -------------------------------------------------------------------------------- /backend/example.http: -------------------------------------------------------------------------------- 1 | @port=4000 2 | @hostname=http://localhost:{{port}} 3 | 4 | 5 | ### Get presigned url 6 | 7 | POST {{hostname}}/upload-url 8 | Content-Type: application/json 9 | 10 | { 11 | "file_name": "test.jpg", 12 | "expires_in_secs": 6000 13 | } 14 | 15 | 16 | 17 | ### Status 18 | 19 | GET {{hostname}}/status 20 | -------------------------------------------------------------------------------- /backend/src/main.rs: -------------------------------------------------------------------------------- 1 | use actix_cors::Cors; 2 | use actix_files as fs; 3 | use actix_web::{get, middleware::Logger, post, web, App, Error, HttpResponse, HttpServer, Responder}; 4 | use aws_config::SdkConfig; 5 | use aws_sdk_s3 as s3; 6 | use env_logger::Env; 7 | use s3::{presigning::PresigningConfig, Client}; 8 | use serde::{Deserialize, Serialize}; 9 | use std::env; 10 | use std::time::Duration; 11 | use uuid::Uuid; 12 | use validator::Validate; 13 | 14 | struct AppState { 15 | s3_client: Client, 16 | } 17 | 18 | fn init_client(config: &SdkConfig) -> Client { 19 | let s3_endpoint = env::var("S3_ENDPOINT").unwrap_or_default(); 20 | if s3_endpoint.is_empty() { 21 | return Client::new(config); 22 | } 23 | let local_config = aws_sdk_s3::config::Builder::from(config) 24 | .endpoint_url(s3_endpoint) 25 | .force_path_style(env::var("S3_FORCE_PATH_STYLE").unwrap_or_default() == "true") 26 | .build(); 27 | 28 | Client::from_conf(local_config) 29 | } 30 | 31 | #[derive(Deserialize, Debug, Validate)] 32 | #[serde(rename_all = "camelCase")] 33 | struct UploadRequest { 34 | #[validate(length(min = 3))] 35 | file_name: String, 36 | expires_in_secs: Option, 37 | } 38 | 39 | #[derive(Serialize, Debug)] 40 | #[serde(rename_all = "camelCase")] 41 | struct UploadResponse { 42 | upload_url: String, 43 | download_url: String, 44 | } 45 | 46 | #[derive(Serialize, Deserialize, Debug)] 47 | #[serde(rename_all = "camelCase")] 48 | struct LinkShortenerRequest { 49 | slug: String, 50 | target_url: String, 51 | expires_in_secs: u64 52 | } 53 | 54 | #[derive(Serialize, Deserialize, Debug)] 55 | #[serde(rename_all = "camelCase")] 56 | pub struct LinkShortenerResponse { 57 | pub shortened_url: String, 58 | } 59 | 60 | async fn generate_short_url(download_url: String, file_name: String, expires_in_secs: u64) -> Result { 61 | let link_shortener_endpoint = env::var("LINK_SHORTENER_ENDPOINT").unwrap_or_default(); 62 | if link_shortener_endpoint.is_empty() { 63 | return Ok(download_url); 64 | } 65 | let slug = if env::var("LINK_SHORTENER_RANDOM_SLUG").unwrap_or_default().eq_ignore_ascii_case("true") { 66 | "".to_string() 67 | } else { 68 | file_name 69 | }; 70 | let response = reqwest::Client::new() 71 | .post(&link_shortener_endpoint) 72 | .json(&LinkShortenerRequest { slug, target_url: download_url.clone(), expires_in_secs }) 73 | .send() 74 | .await.unwrap(); 75 | 76 | let link: LinkShortenerResponse = response.json().await.unwrap(); 77 | 78 | Ok(link.shortened_url) 79 | } 80 | 81 | #[post("/upload-url")] 82 | async fn upload_url_handler(req: web::Json, data: web::Data) -> Result> { 83 | let upload_request = req.into_inner(); 84 | if let Err(errors) = upload_request.validate() { 85 | return Ok(HttpResponse::BadRequest().body(errors.to_string())); 86 | } 87 | let file_name = format!("{}/{}", Uuid::new_v4(), upload_request.file_name); 88 | let expires_in_secs = upload_request.expires_in_secs.unwrap_or(86400 * 7); 89 | let bucket_name = env::var("S3_BUCKET_NAME").expect("Env 'S3_BUCKET_NAME' is empty."); 90 | let result_upload = data.s3_client 91 | .put_object() 92 | .bucket(&bucket_name) 93 | .key(&file_name) 94 | .presigned(PresigningConfig::expires_in(Duration::from_secs(600))?) 95 | .await?; 96 | let mut download_url = data.s3_client 97 | .get_object() 98 | .bucket(&bucket_name) 99 | .key(&file_name) 100 | .presigned(PresigningConfig::expires_in(Duration::from_secs(expires_in_secs))?) 101 | .await? 102 | .uri() 103 | .to_string(); 104 | 105 | if env::var("LINK_SHORTENER_ENDPOINT").is_ok() { 106 | if let Ok(val) = generate_short_url(download_url.clone(), file_name, expires_in_secs).await { 107 | download_url = val; 108 | } 109 | } 110 | 111 | Ok(HttpResponse::Ok().json(UploadResponse { 112 | upload_url: result_upload.uri().to_string(), 113 | download_url, 114 | })) 115 | } 116 | 117 | #[get("/status")] 118 | async fn status() -> impl Responder { 119 | HttpResponse::Ok().body("OK") 120 | } 121 | 122 | #[actix_web::main] 123 | async fn main() -> std::io::Result<()> { 124 | let config = aws_config::load_from_env().await; 125 | env_logger::init_from_env(Env::default().default_filter_or("info")); 126 | HttpServer::new(move || { 127 | let allowed_origins = env::var("CORS_ALLOWED_ORIGINS").unwrap_or("*".to_string()); 128 | let cors = Cors::default() 129 | .allowed_methods(vec!["OPTIONS", "GET", "POST"]) 130 | .allow_any_header() 131 | .allowed_origin_fn(move |origin, _| { 132 | if allowed_origins == "*" { 133 | true 134 | } else { 135 | allowed_origins.split(',').any(|s| s == origin.to_str().unwrap()) 136 | } 137 | }); 138 | App::new() 139 | .app_data(web::Data::new(AppState { s3_client: init_client(&config) })) 140 | .wrap(Logger::default()) 141 | .wrap(cors) 142 | .service(status) 143 | .service(upload_url_handler) 144 | .service(fs::Files::new("/icon.svg", "static").index_file("icon.svg")) 145 | .service(fs::Files::new("/", "static").index_file("index.html").show_files_listing()) 146 | }) 147 | .bind("0.0.0.0:3000")? 148 | .run() 149 | .await 150 | } 151 | -------------------------------------------------------------------------------- /backend/static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/espresso-lab/simple-file-transfer/caa7ee7d0f845ba691ecd1c37b707e25351255b4/backend/static/.gitkeep -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | minio: 3 | image: docker.io/bitnami/minio:latest 4 | ports: 5 | - "9000:9000" 6 | - "9001:9001" 7 | volumes: 8 | - "./minio_data:/data" 9 | environment: 10 | MINIO_ROOT_USER: user 11 | MINIO_ROOT_PASSWORD: password 12 | MINIO_DEFAULT_BUCKETS: examplebucket 13 | MINIO_DOMAIN: "localhost:9000" 14 | MINIO_SCHEME: http 15 | MINIO_SERVER_URL: "http://localhost:9000" 16 | 17 | backend: 18 | build: 19 | context: ./backend 20 | dockerfile: Dockerfile.dev 21 | volumes: 22 | - ./backend:/app 23 | - /app/target/ 24 | environment: 25 | S3_ENDPOINT: "http://localhost:9000" 26 | AWS_REGION: eu-central-1 27 | AWS_ACCESS_KEY_ID: user 28 | AWS_SECRET_ACCESS_KEY: password 29 | S3_BUCKET_NAME: examplebucket 30 | S3_FORCE_PATH_STYLE: "true" 31 | CORS_ALLOWED_ORIGINS: "http://localhost:5173" 32 | LINK_SHORTENER_ENDPOINT: "https://links.viets.dev/links" 33 | LINK_SHORTENER_RANDOM_SLUG: "true" 34 | ports: 35 | - 3000:3000 36 | 37 | ui: 38 | build: 39 | context: ./ui 40 | dockerfile: Dockerfile.dev 41 | volumes: 42 | - ./ui:/app 43 | - /app/node_modules/ 44 | ports: 45 | - 5173:5173 46 | -------------------------------------------------------------------------------- /helm/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /helm/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v2 2 | name: simple-file-transfer 3 | description: A Helm chart for Kubernetes 4 | type: application 5 | version: 0.0.0 # overwritten by build script 6 | appVersion: 0.0.0 # overwritten by build script 7 | -------------------------------------------------------------------------------- /helm/templates/_helpers.tpl: -------------------------------------------------------------------------------- 1 | {{/* 2 | Expand the name of the chart. 3 | */}} 4 | {{- define "simple-file-transfer.name" -}} 5 | {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} 6 | {{- end }} 7 | 8 | {{/* 9 | Create a default fully qualified app name. 10 | We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). 11 | If release name contains chart name it will be used as a full name. 12 | */}} 13 | {{- define "simple-file-transfer.fullname" -}} 14 | {{- if .Values.fullnameOverride }} 15 | {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} 16 | {{- else }} 17 | {{- $name := default .Chart.Name .Values.nameOverride }} 18 | {{- if contains $name .Release.Name }} 19 | {{- .Release.Name | trunc 63 | trimSuffix "-" }} 20 | {{- else }} 21 | {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} 22 | {{- end }} 23 | {{- end }} 24 | {{- end }} 25 | 26 | {{/* 27 | Create chart name and version as used by the chart label. 28 | */}} 29 | {{- define "simple-file-transfer.chart" -}} 30 | {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} 31 | {{- end }} 32 | 33 | {{/* 34 | Common labels 35 | */}} 36 | {{- define "simple-file-transfer.labels" -}} 37 | helm.sh/chart: {{ include "simple-file-transfer.chart" . }} 38 | {{ include "simple-file-transfer.selectorLabels" . }} 39 | {{- if .Chart.AppVersion }} 40 | app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} 41 | {{- end }} 42 | app.kubernetes.io/managed-by: {{ .Release.Service }} 43 | {{- end }} 44 | 45 | {{/* 46 | Selector labels 47 | */}} 48 | {{- define "simple-file-transfer.selectorLabels" -}} 49 | app.kubernetes.io/name: {{ include "simple-file-transfer.name" . }} 50 | app.kubernetes.io/instance: {{ .Release.Name }} 51 | {{- end }} 52 | -------------------------------------------------------------------------------- /helm/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: {{ include "simple-file-transfer.fullname" . }} 5 | labels: 6 | {{- include "simple-file-transfer.labels" . | nindent 4 }} 7 | spec: 8 | replicas: {{ .Values.replicaCount }} 9 | selector: 10 | matchLabels: 11 | {{- include "simple-file-transfer.selectorLabels" . | nindent 6 }} 12 | template: 13 | metadata: 14 | {{- with .Values.podAnnotations }} 15 | annotations: 16 | {{- toYaml . | nindent 8 }} 17 | {{- end }} 18 | labels: 19 | {{- include "simple-file-transfer.labels" . | nindent 8 }} 20 | {{- with .Values.podLabels }} 21 | {{- toYaml . | nindent 8 }} 22 | {{- end }} 23 | spec: 24 | {{- with .Values.imagePullSecrets }} 25 | imagePullSecrets: 26 | {{- toYaml . | nindent 8 }} 27 | {{- end }} 28 | securityContext: 29 | {{- toYaml .Values.podSecurityContext | nindent 8 }} 30 | containers: 31 | - name: {{ .Chart.Name }} 32 | securityContext: 33 | {{- toYaml .Values.securityContext | nindent 12 }} 34 | image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" 35 | imagePullPolicy: {{ .Values.image.pullPolicy }} 36 | env: 37 | - name: S3_ENDPOINT 38 | value: {{ .Values.config.s3.endpoint }} 39 | - name: AWS_REGION 40 | value: {{ .Values.config.s3.region }} 41 | - name: S3_BUCKET_NAME 42 | value: {{ .Values.config.s3.bucket }} 43 | - name: S3_FORCE_PATH_STYLE 44 | value: {{ .Values.config.s3.forcePathStyle | quote }} 45 | - name: CORS_ALLOWED_ORIGINS 46 | value: {{ .Values.config.corsAllowedOrigins | quote }} 47 | - name: LINK_SHORTENER_ENDPOINT 48 | value: {{ .Values.config.linkShortener.endpoint | quote }} 49 | - name: LINK_SHORTENER_RANDOM_SLUG 50 | value: {{ .Values.config.linkShortener.randomSlug | quote }} 51 | {{- if .Values.config.s3.existingSecret }} 52 | - name: AWS_ACCESS_KEY_ID 53 | valueFrom: 54 | secretKeyRef: 55 | name: {{ .Values.config.s3.existingSecret }} 56 | key: AWS_ACCESS_KEY_ID 57 | - name: AWS_SECRET_ACCESS_KEY 58 | valueFrom: 59 | secretKeyRef: 60 | name: {{ .Values.config.s3.existingSecret }} 61 | key: AWS_SECRET_ACCESS_KEY 62 | {{- else }} 63 | - name: AWS_ACCESS_KEY_ID 64 | value: {{ .Values.config.s3.accessKeyId }} 65 | - name: AWS_SECRET_ACCESS_KEY 66 | value: {{ .Values.config.s3.secretAccessKey }} 67 | {{- end }} 68 | {{- if .Values.extraEnvVars }} 69 | {{- toYaml .Values.extraEnvVars | nindent 12 }} 70 | {{- end }} 71 | ports: 72 | - name: http 73 | containerPort: {{ .Values.service.port }} 74 | protocol: TCP 75 | livenessProbe: 76 | httpGet: 77 | path: /status 78 | port: {{ .Values.service.port }} 79 | readinessProbe: 80 | httpGet: 81 | path: /status 82 | port: {{ .Values.service.port }} 83 | resources: 84 | {{- toYaml .Values.resources | nindent 12 }} 85 | {{- with .Values.nodeSelector }} 86 | nodeSelector: 87 | {{- toYaml . | nindent 8 }} 88 | {{- end }} 89 | {{- with .Values.affinity }} 90 | affinity: 91 | {{- toYaml . | nindent 8 }} 92 | {{- end }} 93 | {{- with .Values.tolerations }} 94 | tolerations: 95 | {{- toYaml . | nindent 8 }} 96 | {{- end }} 97 | -------------------------------------------------------------------------------- /helm/templates/ingress.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.ingress.enabled -}} 2 | {{- $fullName := include "simple-file-transfer.fullname" . -}} 3 | {{- $svcPort := .Values.service.port -}} 4 | apiVersion: networking.k8s.io/v1 5 | kind: Ingress 6 | metadata: 7 | name: {{ $fullName }} 8 | labels: 9 | {{- include "simple-file-transfer.labels" . | nindent 4 }} 10 | {{- with .Values.ingress.annotations }} 11 | annotations: 12 | {{- toYaml . | nindent 4 }} 13 | {{- end }} 14 | spec: 15 | {{- if .Values.ingress.className }} 16 | ingressClassName: {{ .Values.ingress.className }} 17 | {{- end }} 18 | {{- if .Values.ingress.tls }} 19 | tls: 20 | {{- range .Values.ingress.tls }} 21 | - hosts: 22 | {{- range .hosts }} 23 | - {{ . | quote }} 24 | {{- end }} 25 | secretName: {{ .secretName }} 26 | {{- end }} 27 | {{- end }} 28 | rules: 29 | {{- range .Values.ingress.hosts }} 30 | - host: {{ .host | quote }} 31 | http: 32 | paths: 33 | {{- range .paths }} 34 | - path: {{ .path | default "/" }} 35 | {{- if .pathType }} 36 | pathType: {{ .pathType | default "ImplementationSpecific" }} 37 | {{- end }} 38 | backend: 39 | service: 40 | name: {{ $fullName }} 41 | port: 42 | number: {{ $svcPort }} 43 | {{- end }} 44 | {{- end }} 45 | {{- end }} 46 | -------------------------------------------------------------------------------- /helm/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "simple-file-transfer.fullname" . }} 5 | labels: {{- include "simple-file-transfer.labels" . | nindent 4 }} 6 | spec: 7 | type: {{ .Values.service.type }} 8 | ports: 9 | - port: {{ .Values.service.port }} 10 | targetPort: http 11 | protocol: TCP 12 | name: http 13 | selector: 14 | {{- include "simple-file-transfer.selectorLabels" . | nindent 4 }} 15 | -------------------------------------------------------------------------------- /helm/templates/tests/test-connection.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: "{{ include "simple-file-transfer.fullname" . }}-test-connection" 5 | labels: 6 | {{- include "simple-file-transfer.labels" . | nindent 4 }} 7 | annotations: 8 | "helm.sh/hook": test 9 | spec: 10 | containers: 11 | - name: wget 12 | image: busybox 13 | command: ['wget'] 14 | args: ['{{ include "simple-file-transfer.fullname" . }}:{{ .Values.service.port }}'] 15 | restartPolicy: Never 16 | -------------------------------------------------------------------------------- /helm/values.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 1 2 | 3 | image: 4 | repository: ghcr.io/espresso-lab/simple-file-transfer 5 | pullPolicy: IfNotPresent 6 | tag: "" 7 | 8 | imagePullSecrets: [] 9 | nameOverride: "" 10 | fullnameOverride: "" 11 | 12 | podAnnotations: {} 13 | podLabels: {} 14 | 15 | podSecurityContext: {} 16 | 17 | securityContext: {} 18 | 19 | service: 20 | type: ClusterIP 21 | port: 3000 22 | 23 | ingress: 24 | enabled: false 25 | className: "" 26 | annotations: 27 | {} 28 | # kubernetes.io/ingress.class: nginx 29 | # kubernetes.io/tls-acme: "true" 30 | hosts: 31 | - host: chart-example.local 32 | paths: 33 | - path: / 34 | pathType: ImplementationSpecific 35 | tls: [] 36 | # - secretName: chart-example-tls 37 | # hosts: 38 | # - chart-example.local 39 | 40 | resources: {} 41 | 42 | config: 43 | corsAllowedOrigins: "*" 44 | s3: 45 | endpoint: "https://s3.example.com:9000" 46 | region: "eu-central-1" 47 | accessKeyId: "" 48 | secretAccessKey: "" 49 | # Provide the name of an existing secret containing the credentials with AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY 50 | existingSecret: "" 51 | bucket: "simple-file-transfer-bucket" 52 | forcePathStyle: true 53 | linkShortener: 54 | endpoint: "" 55 | randomSlug: true 56 | 57 | extraEnvVars: 58 | # - name: EXAMPLE_ENV 59 | # value: ABCD 60 | 61 | volumes: [] 62 | 63 | volumeMounts: [] 64 | 65 | nodeSelector: {} 66 | 67 | tolerations: [] 68 | 69 | affinity: {} 70 | -------------------------------------------------------------------------------- /ui/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /ui/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:@typescript-eslint/recommended', 7 | 'plugin:react-hooks/recommended', 8 | ], 9 | ignorePatterns: ['dist', '.eslintrc.cjs'], 10 | parser: '@typescript-eslint/parser', 11 | plugins: ['react-refresh'], 12 | rules: { 13 | 'react-refresh/only-export-components': [ 14 | 'warn', 15 | { allowConstantExport: true }, 16 | ], 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /ui/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /ui/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM node:slim 2 | EXPOSE 5173 3 | WORKDIR /app 4 | COPY package* . 5 | RUN npm install 6 | COPY . . 7 | CMD npm run dev -- --host 0.0.0.0 -------------------------------------------------------------------------------- /ui/README.md: -------------------------------------------------------------------------------- 1 | # React + TypeScript + Vite 2 | 3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. 4 | 5 | Currently, two official plugins are available: 6 | 7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh 8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 | 10 | ## Expanding the ESLint configuration 11 | 12 | If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: 13 | 14 | - Configure the top-level `parserOptions` property like this: 15 | 16 | ```js 17 | export default { 18 | // other rules... 19 | parserOptions: { 20 | ecmaVersion: "latest", 21 | sourceType: "module", 22 | project: ["./tsconfig.json", "./tsconfig.node.json"], 23 | tsconfigRootDir: __dirname, 24 | }, 25 | }; 26 | ``` 27 | 28 | - Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` 29 | - Optionally add `plugin:@typescript-eslint/stylistic-type-checked` 30 | - Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list 31 | -------------------------------------------------------------------------------- /ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Simple File Transfer 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "@mantine/core": "^7.13.2", 14 | "@mantine/dropzone": "^7.13.2", 15 | "@tabler/icons-react": "^3.19.0", 16 | "axios": "^1.7.7", 17 | "client-zip": "^2.4.5", 18 | "react": "^18.3.1", 19 | "react-dom": "^18.3.1" 20 | }, 21 | "devDependencies": { 22 | "@types/react": "^18.3.11", 23 | "@types/react-dom": "^18.3.0", 24 | "@typescript-eslint/eslint-plugin": "^8.8.1", 25 | "@typescript-eslint/parser": "^8.8.1", 26 | "@vitejs/plugin-react": "^4.3.2", 27 | "eslint": "^8.57.0", 28 | "eslint-plugin-react-hooks": "^4.6.2", 29 | "eslint-plugin-react-refresh": "^0.4.7", 30 | "sass": "^1.79.4", 31 | "typescript": "^5.6.2", 32 | "vite": "^5.4.8" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ui/public/icon.svg: -------------------------------------------------------------------------------- 1 | 12 | 22 | 23 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /ui/src/App.tsx: -------------------------------------------------------------------------------- 1 | import "@mantine/core/styles.css"; 2 | import "@mantine/dropzone/styles.css"; 3 | import { ColorSchemeScript, Container, MantineProvider } from "@mantine/core"; 4 | import { Uploader } from "./Components/Uploader"; 5 | 6 | export default function App() { 7 | return ( 8 | <> 9 | 10 | 16 | 24 | 25 | 26 | 27 | 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /ui/src/Components/Uploader.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | ActionIcon, 3 | Box, 4 | Button, 5 | Center, 6 | Container, 7 | CopyButton, 8 | Group, 9 | Loader, 10 | Progress, 11 | rem, 12 | Text, 13 | Tooltip, 14 | } from "@mantine/core"; 15 | import { Dropzone } from "@mantine/dropzone"; 16 | import {IconArrowDown, IconCheck, IconCopy, IconFilePlus, IconShare} from "@tabler/icons-react"; 17 | import axios, { AxiosProgressEvent, AxiosRequestConfig } from "axios"; 18 | import { downloadZip } from "client-zip"; 19 | import { useRef, useState } from "react"; 20 | import {fetchPreSignedUrls} from "../Requests/api"; 21 | 22 | export function Uploader() { 23 | const dropzoneOpenRef = useRef<() => void>(null); 24 | const [fileName, setFileName] = useState(); 25 | const [downloadUrl, setDownloadUrl] = useState(); 26 | const [isDragging, setIsDragging] = useState(false); 27 | const [isUploading, setIsUploading] = useState(false); 28 | const [uploadProgress, setUploadProgress] = useState(0); 29 | 30 | const handleDropzoneOpen = () => { 31 | setDownloadUrl(undefined); 32 | dropzoneOpenRef.current?.(); 33 | }; 34 | 35 | const handleDragEnter = () => { 36 | setIsDragging(true); 37 | setDownloadUrl(undefined); 38 | }; 39 | 40 | const handleDragLeave = () => { 41 | setIsDragging(false); 42 | }; 43 | 44 | const handleDropFiles = async (files: File[]) => { 45 | setIsDragging(false); 46 | setDownloadUrl(undefined); 47 | setIsUploading(true); 48 | setUploadProgress(0); 49 | 50 | let fileToUpload: File | Blob | null; 51 | let fileNameToUpload: string | undefined; 52 | 53 | if (files.length >= 2) { 54 | fileToUpload = await downloadZip(files, { buffersAreUTF8: true }).blob(); 55 | fileNameToUpload = `${files[0].name}-archive.zip`; 56 | } else { 57 | fileToUpload = files[0]; 58 | fileNameToUpload = files[0].name; 59 | } 60 | 61 | const { uploadUrl, downloadUrl } = await fetchPreSignedUrls({ 62 | fileName: fileNameToUpload, 63 | expiresInSecs: 7 * 24 * 60 * 60, // 7 days max for presigned urls 64 | }); 65 | 66 | const config: AxiosRequestConfig = { 67 | onUploadProgress: (progressEvent: AxiosProgressEvent) => { 68 | const progress = Math.round( 69 | (100 * progressEvent.loaded) / progressEvent.total!, 70 | ); 71 | setUploadProgress(progress); 72 | }, 73 | }; 74 | 75 | try { 76 | await axios.put(uploadUrl, fileToUpload, config); 77 | setDownloadUrl(downloadUrl); 78 | setIsUploading(false); 79 | setFileName(fileNameToUpload); 80 | navigator.clipboard.writeText(downloadUrl); 81 | } catch (error) { 82 | console.error("Failed to upload file:", error); 83 | setIsUploading(false); 84 | } 85 | }; 86 | 87 | const handleShareLink = () => { 88 | if (navigator.share && fileName && downloadUrl) { 89 | navigator 90 | .share({ 91 | title: `Share link ${fileName}`, 92 | text: "File Link:", 93 | url: downloadUrl, 94 | }) 95 | .then(() => console.log("Successful share")) 96 | .catch((error) => console.log("Error sharing:", error)); 97 | } 98 | }; 99 | 100 | return ( 101 | <> 102 | 115 |
116 | 128 | {isUploading ? ( 129 | 130 | ) : isDragging ? ( 131 | 135 | ) : ( 136 | 140 | )} 141 | 142 |
143 | 144 | 145 | {isUploading 146 | ? `Uploading... ${uploadProgress}%` 147 | : isDragging 148 | ? "Drop it like it's hot!" 149 | : "Upload files"} 150 | 151 | 152 | {isUploading && ( 153 | 154 | 155 | 156 | )} 157 | 158 |
159 | 160 | {!isUploading && !isDragging 161 | ? "Drag & drop files here to upload." 162 | : "\u00A0"} 163 | 164 |
165 |
166 | 167 | {downloadUrl && ( 168 | 178 | 179 | 180 | {({ copied, copy }) => ( 181 | 182 | 189 | 190 | )} 191 | 192 | 193 | 194 | 195 | )} 196 | 197 | 204 | 205 | ); 206 | } 207 | -------------------------------------------------------------------------------- /ui/src/Requests/api.ts: -------------------------------------------------------------------------------- 1 | const hostname = 2 | location.hostname === "localhost" ? "http://localhost:3000" : ""; 3 | 4 | export interface CreateLinkRequest { 5 | fileName: string; 6 | expiresInSecs: number; 7 | } 8 | 9 | export interface CreateLinkResponse { 10 | uploadUrl: string; 11 | downloadUrl: string; 12 | } 13 | 14 | export async function fetchPreSignedUrls(props: CreateLinkRequest) { 15 | const res = await fetch(`${hostname}/upload-url`, { 16 | method: "POST", 17 | body: JSON.stringify(props), 18 | headers: { 19 | "Content-Type": "application/json", 20 | }, 21 | }); 22 | 23 | // Session expired 24 | if (res.status === 403) { 25 | location.reload(); 26 | } 27 | 28 | if (!res.ok) { 29 | throw new Error(await res.json()); 30 | } 31 | return res.json() as Promise; 32 | } -------------------------------------------------------------------------------- /ui/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./App.tsx"; 4 | 5 | ReactDOM.createRoot(document.getElementById("root")!).render( 6 | 7 | 8 | , 9 | ); 10 | -------------------------------------------------------------------------------- /ui/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"], 24 | "references": [{ "path": "./tsconfig.node.json" }] 25 | } 26 | -------------------------------------------------------------------------------- /ui/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true, 8 | "strict": true 9 | }, 10 | "include": ["vite.config.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /ui/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | 4 | export default defineConfig({ 5 | plugins: [react()], 6 | }); 7 | --------------------------------------------------------------------------------