├── .github └── workflows │ ├── ci.yml │ └── release.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── src └── main.rs └── tests └── cli.rs /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: tests 2 | 3 | on: 4 | push: 5 | branches: 6 | # This helps fill the caches properly, caches are not shared between PRs. 7 | - main 8 | pull_request: 9 | branches: 10 | - main 11 | 12 | env: 13 | MSRV: "1.81" 14 | RUST_BACKTRACE: 1 15 | RUSTFLAGS: -Dwarnings 16 | IROH_FORCE_STAGING_RELAYS: "1" 17 | 18 | concurrency: 19 | group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} 20 | cancel-in-progress: true 21 | 22 | jobs: 23 | lint: 24 | runs-on: ubuntu-latest 25 | steps: 26 | - uses: actions/checkout@v2 27 | - uses: dtolnay/rust-toolchain@stable 28 | - uses: swatinem/rust-cache@v2 29 | - name: cargo fmt 30 | run: cargo fmt --all -- --check 31 | - name: cargo clippy 32 | run: cargo clippy --locked --workspace --all-targets --all-features 33 | 34 | test: 35 | runs-on: ${{ matrix.target.os }} 36 | strategy: 37 | fail-fast: false 38 | matrix: 39 | target: 40 | - os: "ubuntu-latest" 41 | toolchain: "x86_64-unknown-linux-gnu" 42 | name: "Linux GNU" 43 | - os: "macOS-latest" 44 | toolchain: "x86_64-apple-darwin" 45 | name: "macOS" 46 | - os: "windows-latest" 47 | toolchain: "x86_64-pc-windows-msvc" 48 | name: "Windows MSVC" 49 | - os: "windows-latest" 50 | toolchain: "x86_64-pc-windows-gnu" 51 | name: "Windows GNU" 52 | channel: 53 | - "stable" 54 | - "beta" 55 | - "nightly" 56 | steps: 57 | - uses: actions/checkout@v2 58 | - uses: dtolnay/rust-toolchain@master 59 | with: 60 | toolchain: ${{ matrix.channel }} 61 | targets: ${{ matrix.target.toolchain }} 62 | - uses: swatinem/rust-cache@v2 63 | - name: cargo test 64 | run: cargo test --locked --workspace --all-features --bins --tests --examples 65 | 66 | # Checks correct runtime deps and features are requested by not including dev-dependencies. 67 | check-deps: 68 | runs-on: ubuntu-latest 69 | steps: 70 | - uses: actions/checkout@v2 71 | - uses: dtolnay/rust-toolchain@stable 72 | - uses: swatinem/rust-cache@v2 73 | - name: cargo check 74 | run: cargo check --workspace --all-features --bins 75 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | # The way this works is the following: 2 | # 3 | # The create-release job runs purely to initialize the GitHub release itself 4 | # and to output upload_url for the following job. 5 | # 6 | # The build-release job runs only once create-release is finished. It gets the 7 | # release upload URL from create-release job outputs, then builds the release 8 | # executables for each supported platform and attaches them as release assets 9 | # to the previously created release. 10 | # 11 | # The key here is that we create the release only once. 12 | # 13 | # Reference: 14 | # https://eugene-babichenko.github.io/blog/2020/05/09/github-actions-cross-platform-auto-releases/ 15 | # https://github.com/crate-ci/cargo-release/blob/91549dbf9db9915ba5f121890ad0816c7d851679/.github/workflows/post-release.yml 16 | 17 | name: release 18 | on: 19 | push: 20 | tags: 21 | - "v*" 22 | workflow_dispatch: 23 | inputs: 24 | release_version: 25 | description: "Release version" 26 | required: true 27 | default: "" 28 | create_release: 29 | description: "Create release" 30 | required: true 31 | default: "true" 32 | upload_artifacts: 33 | description: "Upload artifacts" 34 | required: true 35 | default: "true" 36 | 37 | env: 38 | BIN_NAME: sendme 39 | IROH_FORCE_STAGING_RELAYS: "1" 40 | 41 | jobs: 42 | create-release: 43 | name: create-release 44 | runs-on: ubuntu-latest 45 | outputs: 46 | upload_url: ${{ steps.release.outputs.upload_url }} 47 | release_version: ${{ env.RELEASE_VERSION }} 48 | steps: 49 | - name: Get the release version from the tag (push) 50 | shell: bash 51 | if: env.RELEASE_VERSION == '' && github.event_name == 'push' 52 | run: | 53 | # See: https://github.community/t5/GitHub-Actions/How-to-get-just-the-tag-name/m-p/32167/highlight/true#M1027 54 | echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV 55 | echo "version is: ${{ env.RELEASE_VERSION }}" 56 | - name: Get the release version from the tag (dispatch) 57 | shell: bash 58 | if: github.event_name == 'workflow_dispatch' 59 | run: | 60 | echo "RELEASE_VERSION=${{ github.event.inputs.release_version }}" >> $GITHUB_ENV 61 | echo "version is: ${{ env.RELEASE_VERSION }}" 62 | - name: Checkout repository 63 | uses: actions/checkout@v4 64 | with: 65 | fetch-depth: 1 66 | - name: Create GitHub release 67 | id: release 68 | if: github.event.inputs.create_release == 'true' || github.event_name == 'push' 69 | uses: actions/create-release@v1 70 | env: 71 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 72 | with: 73 | tag_name: ${{ env.RELEASE_VERSION }} 74 | release_name: ${{ env.RELEASE_VERSION }} 75 | build-release: 76 | name: build-release 77 | needs: create-release 78 | runs-on: ${{ matrix.runner }} 79 | strategy: 80 | matrix: 81 | name: [ubuntu-latest, ubuntu-arm-latest, macOS-arm-latest, macOS-latest, windows-latest] 82 | rust: [stable] 83 | include: 84 | - name: ubuntu-arm-latest 85 | os: ubuntu-latest 86 | target: linux-aarch64 87 | cargo_targets: "aarch64-unknown-linux-musl" 88 | runner: [self-hosted, linux, ARM64] 89 | - name: ubuntu-latest 90 | os: ubuntu-latest 91 | target: linux-x86_64 92 | cargo_targets: "x86_64-unknown-linux-musl" 93 | runner: [self-hosted, linux, X64] 94 | - name: macOS-latest 95 | os: macOS-latest 96 | target: darwin-x86_64 97 | cargo_targets: "x86_64-apple-darwin" 98 | runner: [self-hosted, macOS, ARM64] 99 | - name: macOS-arm-latest 100 | os: macOS-latest 101 | target: darwin-aarch64 102 | cargo_targets: "aarch64-apple-darwin" 103 | runner: [self-hosted, macOS, ARM64] 104 | # TODO: windows runner is not available on the org level 105 | - name: windows-latest 106 | os: windows-latest 107 | target: windows-x86_64 108 | cargo_targets: "x86_64-pc-windows-msvc" 109 | runner: [windows-latest] 110 | steps: 111 | - name: Checkout repository 112 | uses: actions/checkout@v4 113 | with: 114 | fetch-depth: 1 115 | - name: Install Rust 116 | uses: dtolnay/rust-toolchain@stable 117 | with: 118 | toolchain: ${{ matrix.rust }} 119 | targets: ${{ matrix.cargo_targets }} 120 | - name: Ensure musl support 121 | if: ${{ contains(matrix.cargo_targets, '-musl') }} 122 | run: sudo apt-get install musl-tools -y 123 | - name: Build release binary 124 | shell: bash 125 | run: | 126 | if [ "${{ matrix.name }}" = "ubuntu-arm-latest" ]; then 127 | export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-gnu-gcc 128 | export CC=aarch64-linux-gnu-gcc 129 | fi 130 | cargo build --verbose --release --target ${{ matrix.cargo_targets }} 131 | - name: Build archive 132 | shell: bash 133 | run: | 134 | staging="${{ env.BIN_NAME }}-${{ needs.create-release.outputs.release_version }}-${{ matrix.target }}" 135 | mkdir -p "$staging" 136 | if [ "${{ matrix.os }}" = "windows-latest" ]; then 137 | cp "target/${{ matrix.cargo_targets }}/release/${{ env.BIN_NAME }}.exe" "$staging/" 138 | cd "$staging" 139 | 7z a "../$staging.zip" . 140 | echo "ASSET=$staging.zip" >> $GITHUB_ENV 141 | else 142 | cp "target/${{ matrix.cargo_targets }}/release/${{ env.BIN_NAME }}" "$staging/" 143 | tar czf "$staging.tar.gz" -C "$staging" . 144 | echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV 145 | fi 146 | - name: Upload release archive 147 | uses: actions/upload-release-asset@v1.0.2 148 | if: github.event.inputs.upload_artifacts == 'true' || github.event_name == 'push' 149 | env: 150 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 151 | with: 152 | upload_url: ${{ needs.create-release.outputs.upload_url }} 153 | asset_path: ${{ env.ASSET }} 154 | asset_name: ${{ env.ASSET }} 155 | asset_content_type: application/octet-stream 156 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | tmp/* 3 | .sendme-* 4 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aead" 22 | version = "0.5.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" 25 | dependencies = [ 26 | "bytes", 27 | "crypto-common", 28 | "generic-array", 29 | ] 30 | 31 | [[package]] 32 | name = "ahash" 33 | version = "0.8.11" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 36 | dependencies = [ 37 | "cfg-if", 38 | "once_cell", 39 | "version_check", 40 | "zerocopy 0.7.35", 41 | ] 42 | 43 | [[package]] 44 | name = "aho-corasick" 45 | version = "1.1.3" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 48 | dependencies = [ 49 | "memchr", 50 | ] 51 | 52 | [[package]] 53 | name = "allocator-api2" 54 | version = "0.2.21" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 57 | 58 | [[package]] 59 | name = "android-tzdata" 60 | version = "0.1.1" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 63 | 64 | [[package]] 65 | name = "android_system_properties" 66 | version = "0.1.5" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 69 | dependencies = [ 70 | "libc", 71 | ] 72 | 73 | [[package]] 74 | name = "anstream" 75 | version = "0.6.18" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 78 | dependencies = [ 79 | "anstyle", 80 | "anstyle-parse", 81 | "anstyle-query", 82 | "anstyle-wincon", 83 | "colorchoice", 84 | "is_terminal_polyfill", 85 | "utf8parse", 86 | ] 87 | 88 | [[package]] 89 | name = "anstyle" 90 | version = "1.0.10" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 93 | 94 | [[package]] 95 | name = "anstyle-parse" 96 | version = "0.2.6" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 99 | dependencies = [ 100 | "utf8parse", 101 | ] 102 | 103 | [[package]] 104 | name = "anstyle-query" 105 | version = "1.1.2" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 108 | dependencies = [ 109 | "windows-sys 0.59.0", 110 | ] 111 | 112 | [[package]] 113 | name = "anstyle-wincon" 114 | version = "3.0.7" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 117 | dependencies = [ 118 | "anstyle", 119 | "once_cell", 120 | "windows-sys 0.59.0", 121 | ] 122 | 123 | [[package]] 124 | name = "anyhow" 125 | version = "1.0.95" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" 128 | 129 | [[package]] 130 | name = "arboard" 131 | version = "3.4.1" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" 134 | dependencies = [ 135 | "clipboard-win", 136 | "core-graphics", 137 | "image", 138 | "log", 139 | "objc2", 140 | "objc2-app-kit", 141 | "objc2-foundation", 142 | "parking_lot", 143 | "windows-sys 0.48.0", 144 | "x11rb", 145 | ] 146 | 147 | [[package]] 148 | name = "arrayref" 149 | version = "0.3.9" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 152 | 153 | [[package]] 154 | name = "arrayvec" 155 | version = "0.7.6" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 158 | 159 | [[package]] 160 | name = "asn1-rs" 161 | version = "0.6.2" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" 164 | dependencies = [ 165 | "asn1-rs-derive", 166 | "asn1-rs-impl", 167 | "displaydoc", 168 | "nom", 169 | "num-traits", 170 | "rusticata-macros", 171 | "thiserror 1.0.69", 172 | "time", 173 | ] 174 | 175 | [[package]] 176 | name = "asn1-rs-derive" 177 | version = "0.5.1" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" 180 | dependencies = [ 181 | "proc-macro2", 182 | "quote", 183 | "syn 2.0.98", 184 | "synstructure", 185 | ] 186 | 187 | [[package]] 188 | name = "asn1-rs-impl" 189 | version = "0.2.0" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" 192 | dependencies = [ 193 | "proc-macro2", 194 | "quote", 195 | "syn 2.0.98", 196 | ] 197 | 198 | [[package]] 199 | name = "async-channel" 200 | version = "2.3.1" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 203 | dependencies = [ 204 | "concurrent-queue", 205 | "event-listener-strategy", 206 | "futures-core", 207 | "pin-project-lite", 208 | ] 209 | 210 | [[package]] 211 | name = "async-compat" 212 | version = "0.2.4" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "7bab94bde396a3f7b4962e396fdad640e241ed797d4d8d77fc8c237d14c58fc0" 215 | dependencies = [ 216 | "futures-core", 217 | "futures-io", 218 | "once_cell", 219 | "pin-project-lite", 220 | "tokio", 221 | ] 222 | 223 | [[package]] 224 | name = "async-trait" 225 | version = "0.1.86" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" 228 | dependencies = [ 229 | "proc-macro2", 230 | "quote", 231 | "syn 2.0.98", 232 | ] 233 | 234 | [[package]] 235 | name = "async_io_stream" 236 | version = "0.3.3" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" 239 | dependencies = [ 240 | "futures", 241 | "pharos", 242 | "rustc_version", 243 | ] 244 | 245 | [[package]] 246 | name = "atomic-waker" 247 | version = "1.1.2" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 250 | 251 | [[package]] 252 | name = "attohttpc" 253 | version = "0.24.1" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" 256 | dependencies = [ 257 | "http 0.2.12", 258 | "log", 259 | "url", 260 | ] 261 | 262 | [[package]] 263 | name = "autocfg" 264 | version = "1.4.0" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 267 | 268 | [[package]] 269 | name = "backon" 270 | version = "1.4.0" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "49fef586913a57ff189f25c9b3d034356a5bf6b3fa9a7f067588fe1698ba1f5d" 273 | dependencies = [ 274 | "fastrand", 275 | "gloo-timers", 276 | "tokio", 277 | ] 278 | 279 | [[package]] 280 | name = "backtrace" 281 | version = "0.3.74" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 284 | dependencies = [ 285 | "addr2line", 286 | "cfg-if", 287 | "libc", 288 | "miniz_oxide", 289 | "object", 290 | "rustc-demangle", 291 | "windows-targets 0.52.6", 292 | ] 293 | 294 | [[package]] 295 | name = "bao-tree" 296 | version = "0.15.1" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "ff16d65e48353db458be63ee395c03028f24564fd48668389bd65fd945f5ac36" 299 | dependencies = [ 300 | "blake3", 301 | "bytes", 302 | "futures-lite", 303 | "genawaiter", 304 | "iroh-io", 305 | "positioned-io", 306 | "range-collections", 307 | "self_cell", 308 | "smallvec", 309 | ] 310 | 311 | [[package]] 312 | name = "base16ct" 313 | version = "0.2.0" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 316 | 317 | [[package]] 318 | name = "base32" 319 | version = "0.5.1" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" 322 | 323 | [[package]] 324 | name = "base64" 325 | version = "0.22.1" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 328 | 329 | [[package]] 330 | name = "base64ct" 331 | version = "1.6.0" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 334 | 335 | [[package]] 336 | name = "binary-merge" 337 | version = "0.1.2" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "597bb81c80a54b6a4381b23faba8d7774b144c94cbd1d6fe3f1329bd776554ab" 340 | 341 | [[package]] 342 | name = "bitflags" 343 | version = "1.3.2" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 346 | 347 | [[package]] 348 | name = "bitflags" 349 | version = "2.8.0" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 352 | 353 | [[package]] 354 | name = "blake3" 355 | version = "1.8.2" 356 | source = "registry+https://github.com/rust-lang/crates.io-index" 357 | checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" 358 | dependencies = [ 359 | "arrayref", 360 | "arrayvec", 361 | "cc", 362 | "cfg-if", 363 | "constant_time_eq", 364 | ] 365 | 366 | [[package]] 367 | name = "block-buffer" 368 | version = "0.10.4" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 371 | dependencies = [ 372 | "generic-array", 373 | ] 374 | 375 | [[package]] 376 | name = "block2" 377 | version = "0.5.1" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" 380 | dependencies = [ 381 | "objc2", 382 | ] 383 | 384 | [[package]] 385 | name = "bounded-integer" 386 | version = "0.5.8" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "102dbef1187b1893e6dfe05a774e79fd52265f49f214f6879c8ff49f52c8188b" 389 | 390 | [[package]] 391 | name = "bumpalo" 392 | version = "3.17.0" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 395 | 396 | [[package]] 397 | name = "bytemuck" 398 | version = "1.21.0" 399 | source = "registry+https://github.com/rust-lang/crates.io-index" 400 | checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" 401 | 402 | [[package]] 403 | name = "byteorder" 404 | version = "1.5.0" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 407 | 408 | [[package]] 409 | name = "byteorder-lite" 410 | version = "0.1.0" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 413 | 414 | [[package]] 415 | name = "bytes" 416 | version = "1.10.0" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" 419 | dependencies = [ 420 | "serde", 421 | ] 422 | 423 | [[package]] 424 | name = "cc" 425 | version = "1.2.14" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" 428 | dependencies = [ 429 | "shlex", 430 | ] 431 | 432 | [[package]] 433 | name = "cfg-if" 434 | version = "1.0.0" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 437 | 438 | [[package]] 439 | name = "cfg_aliases" 440 | version = "0.2.1" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 443 | 444 | [[package]] 445 | name = "chacha20" 446 | version = "0.9.1" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" 449 | dependencies = [ 450 | "cfg-if", 451 | "cipher", 452 | "cpufeatures", 453 | ] 454 | 455 | [[package]] 456 | name = "chrono" 457 | version = "0.4.39" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 460 | dependencies = [ 461 | "android-tzdata", 462 | "iana-time-zone", 463 | "js-sys", 464 | "num-traits", 465 | "serde", 466 | "wasm-bindgen", 467 | "windows-targets 0.52.6", 468 | ] 469 | 470 | [[package]] 471 | name = "cipher" 472 | version = "0.4.4" 473 | source = "registry+https://github.com/rust-lang/crates.io-index" 474 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 475 | dependencies = [ 476 | "crypto-common", 477 | "inout", 478 | "zeroize", 479 | ] 480 | 481 | [[package]] 482 | name = "clap" 483 | version = "4.5.29" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184" 486 | dependencies = [ 487 | "clap_builder", 488 | "clap_derive", 489 | ] 490 | 491 | [[package]] 492 | name = "clap_builder" 493 | version = "4.5.29" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9" 496 | dependencies = [ 497 | "anstream", 498 | "anstyle", 499 | "clap_lex", 500 | "strsim", 501 | ] 502 | 503 | [[package]] 504 | name = "clap_derive" 505 | version = "4.5.28" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" 508 | dependencies = [ 509 | "heck", 510 | "proc-macro2", 511 | "quote", 512 | "syn 2.0.98", 513 | ] 514 | 515 | [[package]] 516 | name = "clap_lex" 517 | version = "0.7.4" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 520 | 521 | [[package]] 522 | name = "clipboard-win" 523 | version = "5.4.0" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" 526 | dependencies = [ 527 | "error-code", 528 | ] 529 | 530 | [[package]] 531 | name = "cobs" 532 | version = "0.2.3" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" 535 | 536 | [[package]] 537 | name = "colorchoice" 538 | version = "1.0.3" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 541 | 542 | [[package]] 543 | name = "concurrent-queue" 544 | version = "2.5.0" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 547 | dependencies = [ 548 | "crossbeam-utils", 549 | ] 550 | 551 | [[package]] 552 | name = "console" 553 | version = "0.15.10" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" 556 | dependencies = [ 557 | "encode_unicode", 558 | "libc", 559 | "once_cell", 560 | "unicode-width", 561 | "windows-sys 0.59.0", 562 | ] 563 | 564 | [[package]] 565 | name = "const-oid" 566 | version = "0.9.6" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 569 | 570 | [[package]] 571 | name = "constant_time_eq" 572 | version = "0.3.1" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" 575 | 576 | [[package]] 577 | name = "cordyceps" 578 | version = "0.3.2" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "ec10f0a762d93c4498d2e97a333805cb6250d60bead623f71d8034f9a4152ba3" 581 | dependencies = [ 582 | "loom 0.5.6", 583 | "tracing", 584 | ] 585 | 586 | [[package]] 587 | name = "core-foundation" 588 | version = "0.9.4" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 591 | dependencies = [ 592 | "core-foundation-sys", 593 | "libc", 594 | ] 595 | 596 | [[package]] 597 | name = "core-foundation-sys" 598 | version = "0.8.7" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 601 | 602 | [[package]] 603 | name = "core-graphics" 604 | version = "0.23.2" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" 607 | dependencies = [ 608 | "bitflags 1.3.2", 609 | "core-foundation", 610 | "core-graphics-types", 611 | "foreign-types", 612 | "libc", 613 | ] 614 | 615 | [[package]] 616 | name = "core-graphics-types" 617 | version = "0.1.3" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 620 | dependencies = [ 621 | "bitflags 1.3.2", 622 | "core-foundation", 623 | "libc", 624 | ] 625 | 626 | [[package]] 627 | name = "cpufeatures" 628 | version = "0.2.17" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 631 | dependencies = [ 632 | "libc", 633 | ] 634 | 635 | [[package]] 636 | name = "crc" 637 | version = "3.2.1" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" 640 | dependencies = [ 641 | "crc-catalog", 642 | ] 643 | 644 | [[package]] 645 | name = "crc-catalog" 646 | version = "2.4.0" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 649 | 650 | [[package]] 651 | name = "crc32fast" 652 | version = "1.4.2" 653 | source = "registry+https://github.com/rust-lang/crates.io-index" 654 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 655 | dependencies = [ 656 | "cfg-if", 657 | ] 658 | 659 | [[package]] 660 | name = "critical-section" 661 | version = "1.2.0" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" 664 | 665 | [[package]] 666 | name = "crossbeam-channel" 667 | version = "0.5.14" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" 670 | dependencies = [ 671 | "crossbeam-utils", 672 | ] 673 | 674 | [[package]] 675 | name = "crossbeam-epoch" 676 | version = "0.9.18" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 679 | dependencies = [ 680 | "crossbeam-utils", 681 | ] 682 | 683 | [[package]] 684 | name = "crossbeam-utils" 685 | version = "0.8.21" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 688 | 689 | [[package]] 690 | name = "crypto-bigint" 691 | version = "0.5.5" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 694 | dependencies = [ 695 | "generic-array", 696 | "rand_core 0.6.4", 697 | "subtle", 698 | "zeroize", 699 | ] 700 | 701 | [[package]] 702 | name = "crypto-common" 703 | version = "0.1.6" 704 | source = "registry+https://github.com/rust-lang/crates.io-index" 705 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 706 | dependencies = [ 707 | "generic-array", 708 | "rand_core 0.6.4", 709 | "typenum", 710 | ] 711 | 712 | [[package]] 713 | name = "crypto_box" 714 | version = "0.9.1" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "16182b4f39a82ec8a6851155cc4c0cda3065bb1db33651726a29e1951de0f009" 717 | dependencies = [ 718 | "aead", 719 | "chacha20", 720 | "crypto_secretbox", 721 | "curve25519-dalek", 722 | "salsa20", 723 | "serdect", 724 | "subtle", 725 | "zeroize", 726 | ] 727 | 728 | [[package]] 729 | name = "crypto_secretbox" 730 | version = "0.1.1" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1" 733 | dependencies = [ 734 | "aead", 735 | "chacha20", 736 | "cipher", 737 | "generic-array", 738 | "poly1305", 739 | "salsa20", 740 | "subtle", 741 | "zeroize", 742 | ] 743 | 744 | [[package]] 745 | name = "curve25519-dalek" 746 | version = "4.1.3" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" 749 | dependencies = [ 750 | "cfg-if", 751 | "cpufeatures", 752 | "curve25519-dalek-derive", 753 | "digest", 754 | "fiat-crypto", 755 | "rand_core 0.6.4", 756 | "rustc_version", 757 | "serde", 758 | "subtle", 759 | "zeroize", 760 | ] 761 | 762 | [[package]] 763 | name = "curve25519-dalek-derive" 764 | version = "0.1.1" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" 767 | dependencies = [ 768 | "proc-macro2", 769 | "quote", 770 | "syn 2.0.98", 771 | ] 772 | 773 | [[package]] 774 | name = "data-encoding" 775 | version = "2.8.0" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" 778 | 779 | [[package]] 780 | name = "der" 781 | version = "0.7.9" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" 784 | dependencies = [ 785 | "const-oid", 786 | "der_derive", 787 | "pem-rfc7468", 788 | "zeroize", 789 | ] 790 | 791 | [[package]] 792 | name = "der-parser" 793 | version = "9.0.0" 794 | source = "registry+https://github.com/rust-lang/crates.io-index" 795 | checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" 796 | dependencies = [ 797 | "asn1-rs", 798 | "displaydoc", 799 | "nom", 800 | "num-bigint", 801 | "num-traits", 802 | "rusticata-macros", 803 | ] 804 | 805 | [[package]] 806 | name = "der_derive" 807 | version = "0.7.3" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" 810 | dependencies = [ 811 | "proc-macro2", 812 | "quote", 813 | "syn 2.0.98", 814 | ] 815 | 816 | [[package]] 817 | name = "deranged" 818 | version = "0.3.11" 819 | source = "registry+https://github.com/rust-lang/crates.io-index" 820 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 821 | dependencies = [ 822 | "powerfmt", 823 | ] 824 | 825 | [[package]] 826 | name = "derive_more" 827 | version = "1.0.0" 828 | source = "registry+https://github.com/rust-lang/crates.io-index" 829 | checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" 830 | dependencies = [ 831 | "derive_more-impl", 832 | ] 833 | 834 | [[package]] 835 | name = "derive_more-impl" 836 | version = "1.0.0" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" 839 | dependencies = [ 840 | "proc-macro2", 841 | "quote", 842 | "syn 2.0.98", 843 | "unicode-xid", 844 | ] 845 | 846 | [[package]] 847 | name = "diatomic-waker" 848 | version = "0.2.3" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" 851 | 852 | [[package]] 853 | name = "digest" 854 | version = "0.10.7" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 857 | dependencies = [ 858 | "block-buffer", 859 | "const-oid", 860 | "crypto-common", 861 | "subtle", 862 | ] 863 | 864 | [[package]] 865 | name = "displaydoc" 866 | version = "0.2.5" 867 | source = "registry+https://github.com/rust-lang/crates.io-index" 868 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 869 | dependencies = [ 870 | "proc-macro2", 871 | "quote", 872 | "syn 2.0.98", 873 | ] 874 | 875 | [[package]] 876 | name = "dlopen2" 877 | version = "0.5.0" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" 880 | dependencies = [ 881 | "libc", 882 | "once_cell", 883 | "winapi", 884 | ] 885 | 886 | [[package]] 887 | name = "document-features" 888 | version = "0.2.10" 889 | source = "registry+https://github.com/rust-lang/crates.io-index" 890 | checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" 891 | dependencies = [ 892 | "litrs", 893 | ] 894 | 895 | [[package]] 896 | name = "duct" 897 | version = "0.13.7" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "e4ab5718d1224b63252cd0c6f74f6480f9ffeb117438a2e0f5cf6d9a4798929c" 900 | dependencies = [ 901 | "libc", 902 | "once_cell", 903 | "os_pipe", 904 | "shared_child", 905 | ] 906 | 907 | [[package]] 908 | name = "dyn-clone" 909 | version = "1.0.19" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" 912 | 913 | [[package]] 914 | name = "ecdsa" 915 | version = "0.16.9" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 918 | dependencies = [ 919 | "der", 920 | "digest", 921 | "elliptic-curve", 922 | "rfc6979", 923 | "signature", 924 | "spki", 925 | ] 926 | 927 | [[package]] 928 | name = "ed25519" 929 | version = "2.2.3" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" 932 | dependencies = [ 933 | "pkcs8", 934 | "serde", 935 | "signature", 936 | ] 937 | 938 | [[package]] 939 | name = "ed25519-dalek" 940 | version = "2.1.1" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" 943 | dependencies = [ 944 | "curve25519-dalek", 945 | "ed25519", 946 | "rand_core 0.6.4", 947 | "serde", 948 | "sha2", 949 | "subtle", 950 | "zeroize", 951 | ] 952 | 953 | [[package]] 954 | name = "elliptic-curve" 955 | version = "0.13.8" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" 958 | dependencies = [ 959 | "base16ct", 960 | "crypto-bigint", 961 | "digest", 962 | "ff", 963 | "generic-array", 964 | "group", 965 | "pkcs8", 966 | "rand_core 0.6.4", 967 | "sec1", 968 | "subtle", 969 | "zeroize", 970 | ] 971 | 972 | [[package]] 973 | name = "embedded-io" 974 | version = "0.4.0" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" 977 | 978 | [[package]] 979 | name = "embedded-io" 980 | version = "0.6.1" 981 | source = "registry+https://github.com/rust-lang/crates.io-index" 982 | checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" 983 | 984 | [[package]] 985 | name = "encode_unicode" 986 | version = "1.0.0" 987 | source = "registry+https://github.com/rust-lang/crates.io-index" 988 | checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" 989 | 990 | [[package]] 991 | name = "enum-as-inner" 992 | version = "0.6.1" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" 995 | dependencies = [ 996 | "heck", 997 | "proc-macro2", 998 | "quote", 999 | "syn 2.0.98", 1000 | ] 1001 | 1002 | [[package]] 1003 | name = "enumflags2" 1004 | version = "0.7.11" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" 1007 | dependencies = [ 1008 | "enumflags2_derive", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "enumflags2_derive" 1013 | version = "0.7.11" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" 1016 | dependencies = [ 1017 | "proc-macro2", 1018 | "quote", 1019 | "syn 2.0.98", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "equivalent" 1024 | version = "1.0.2" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 1027 | 1028 | [[package]] 1029 | name = "errno" 1030 | version = "0.3.10" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 1033 | dependencies = [ 1034 | "libc", 1035 | "windows-sys 0.59.0", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "error-code" 1040 | version = "3.3.1" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" 1043 | 1044 | [[package]] 1045 | name = "event-listener" 1046 | version = "5.4.0" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1049 | dependencies = [ 1050 | "concurrent-queue", 1051 | "parking", 1052 | "pin-project-lite", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "event-listener-strategy" 1057 | version = "0.5.3" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" 1060 | dependencies = [ 1061 | "event-listener", 1062 | "pin-project-lite", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "fallible-iterator" 1067 | version = "0.3.0" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" 1070 | 1071 | [[package]] 1072 | name = "fastrand" 1073 | version = "2.3.0" 1074 | source = "registry+https://github.com/rust-lang/crates.io-index" 1075 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1076 | 1077 | [[package]] 1078 | name = "fdeflate" 1079 | version = "0.3.7" 1080 | source = "registry+https://github.com/rust-lang/crates.io-index" 1081 | checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" 1082 | dependencies = [ 1083 | "simd-adler32", 1084 | ] 1085 | 1086 | [[package]] 1087 | name = "ff" 1088 | version = "0.13.1" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" 1091 | dependencies = [ 1092 | "rand_core 0.6.4", 1093 | "subtle", 1094 | ] 1095 | 1096 | [[package]] 1097 | name = "fiat-crypto" 1098 | version = "0.2.9" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" 1101 | 1102 | [[package]] 1103 | name = "flate2" 1104 | version = "1.0.35" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" 1107 | dependencies = [ 1108 | "crc32fast", 1109 | "miniz_oxide", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "flume" 1114 | version = "0.11.1" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 1117 | dependencies = [ 1118 | "futures-core", 1119 | "futures-sink", 1120 | "nanorand", 1121 | "spin", 1122 | ] 1123 | 1124 | [[package]] 1125 | name = "fnv" 1126 | version = "1.0.7" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1129 | 1130 | [[package]] 1131 | name = "foldhash" 1132 | version = "0.1.4" 1133 | source = "registry+https://github.com/rust-lang/crates.io-index" 1134 | checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" 1135 | 1136 | [[package]] 1137 | name = "foreign-types" 1138 | version = "0.5.0" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 1141 | dependencies = [ 1142 | "foreign-types-macros", 1143 | "foreign-types-shared", 1144 | ] 1145 | 1146 | [[package]] 1147 | name = "foreign-types-macros" 1148 | version = "0.2.3" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 1151 | dependencies = [ 1152 | "proc-macro2", 1153 | "quote", 1154 | "syn 2.0.98", 1155 | ] 1156 | 1157 | [[package]] 1158 | name = "foreign-types-shared" 1159 | version = "0.3.1" 1160 | source = "registry+https://github.com/rust-lang/crates.io-index" 1161 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 1162 | 1163 | [[package]] 1164 | name = "form_urlencoded" 1165 | version = "1.2.1" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1168 | dependencies = [ 1169 | "percent-encoding", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "futures" 1174 | version = "0.3.31" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 1177 | dependencies = [ 1178 | "futures-channel", 1179 | "futures-core", 1180 | "futures-executor", 1181 | "futures-io", 1182 | "futures-sink", 1183 | "futures-task", 1184 | "futures-util", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "futures-buffered" 1189 | version = "0.2.11" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "fe940397c8b744b9c2c974791c2c08bca2c3242ce0290393249e98f215a00472" 1192 | dependencies = [ 1193 | "cordyceps", 1194 | "diatomic-waker", 1195 | "futures-core", 1196 | "pin-project-lite", 1197 | "spin", 1198 | ] 1199 | 1200 | [[package]] 1201 | name = "futures-channel" 1202 | version = "0.3.31" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1205 | dependencies = [ 1206 | "futures-core", 1207 | "futures-sink", 1208 | ] 1209 | 1210 | [[package]] 1211 | name = "futures-core" 1212 | version = "0.3.31" 1213 | source = "registry+https://github.com/rust-lang/crates.io-index" 1214 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1215 | 1216 | [[package]] 1217 | name = "futures-executor" 1218 | version = "0.3.31" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 1221 | dependencies = [ 1222 | "futures-core", 1223 | "futures-task", 1224 | "futures-util", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "futures-io" 1229 | version = "0.3.31" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1232 | 1233 | [[package]] 1234 | name = "futures-lite" 1235 | version = "2.6.0" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1238 | dependencies = [ 1239 | "fastrand", 1240 | "futures-core", 1241 | "futures-io", 1242 | "parking", 1243 | "pin-project-lite", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "futures-macro" 1248 | version = "0.3.31" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 1251 | dependencies = [ 1252 | "proc-macro2", 1253 | "quote", 1254 | "syn 2.0.98", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "futures-sink" 1259 | version = "0.3.31" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 1262 | 1263 | [[package]] 1264 | name = "futures-task" 1265 | version = "0.3.31" 1266 | source = "registry+https://github.com/rust-lang/crates.io-index" 1267 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 1268 | 1269 | [[package]] 1270 | name = "futures-util" 1271 | version = "0.3.31" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 1274 | dependencies = [ 1275 | "futures-channel", 1276 | "futures-core", 1277 | "futures-io", 1278 | "futures-macro", 1279 | "futures-sink", 1280 | "futures-task", 1281 | "memchr", 1282 | "pin-project-lite", 1283 | "pin-utils", 1284 | "slab", 1285 | ] 1286 | 1287 | [[package]] 1288 | name = "genawaiter" 1289 | version = "0.99.1" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | checksum = "c86bd0361bcbde39b13475e6e36cb24c329964aa2611be285289d1e4b751c1a0" 1292 | dependencies = [ 1293 | "futures-core", 1294 | "genawaiter-macro", 1295 | "genawaiter-proc-macro", 1296 | "proc-macro-hack", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "genawaiter-macro" 1301 | version = "0.99.1" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "0b32dfe1fdfc0bbde1f22a5da25355514b5e450c33a6af6770884c8750aedfbc" 1304 | 1305 | [[package]] 1306 | name = "genawaiter-proc-macro" 1307 | version = "0.99.1" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "784f84eebc366e15251c4a8c3acee82a6a6f427949776ecb88377362a9621738" 1310 | dependencies = [ 1311 | "proc-macro-error", 1312 | "proc-macro-hack", 1313 | "proc-macro2", 1314 | "quote", 1315 | "syn 1.0.109", 1316 | ] 1317 | 1318 | [[package]] 1319 | name = "generator" 1320 | version = "0.7.5" 1321 | source = "registry+https://github.com/rust-lang/crates.io-index" 1322 | checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" 1323 | dependencies = [ 1324 | "cc", 1325 | "libc", 1326 | "log", 1327 | "rustversion", 1328 | "windows 0.48.0", 1329 | ] 1330 | 1331 | [[package]] 1332 | name = "generator" 1333 | version = "0.8.4" 1334 | source = "registry+https://github.com/rust-lang/crates.io-index" 1335 | checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" 1336 | dependencies = [ 1337 | "cfg-if", 1338 | "libc", 1339 | "log", 1340 | "rustversion", 1341 | "windows 0.58.0", 1342 | ] 1343 | 1344 | [[package]] 1345 | name = "generic-array" 1346 | version = "0.14.7" 1347 | source = "registry+https://github.com/rust-lang/crates.io-index" 1348 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1349 | dependencies = [ 1350 | "typenum", 1351 | "version_check", 1352 | "zeroize", 1353 | ] 1354 | 1355 | [[package]] 1356 | name = "gethostname" 1357 | version = "0.4.3" 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" 1359 | checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" 1360 | dependencies = [ 1361 | "libc", 1362 | "windows-targets 0.48.5", 1363 | ] 1364 | 1365 | [[package]] 1366 | name = "getrandom" 1367 | version = "0.2.15" 1368 | source = "registry+https://github.com/rust-lang/crates.io-index" 1369 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 1370 | dependencies = [ 1371 | "cfg-if", 1372 | "js-sys", 1373 | "libc", 1374 | "wasi 0.11.0+wasi-snapshot-preview1", 1375 | "wasm-bindgen", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "getrandom" 1380 | version = "0.3.3" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1383 | dependencies = [ 1384 | "cfg-if", 1385 | "js-sys", 1386 | "libc", 1387 | "r-efi", 1388 | "wasi 0.14.2+wasi-0.2.4", 1389 | "wasm-bindgen", 1390 | ] 1391 | 1392 | [[package]] 1393 | name = "gimli" 1394 | version = "0.31.1" 1395 | source = "registry+https://github.com/rust-lang/crates.io-index" 1396 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1397 | 1398 | [[package]] 1399 | name = "glob" 1400 | version = "0.3.2" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1403 | 1404 | [[package]] 1405 | name = "gloo-timers" 1406 | version = "0.3.0" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" 1409 | dependencies = [ 1410 | "futures-channel", 1411 | "futures-core", 1412 | "js-sys", 1413 | "wasm-bindgen", 1414 | ] 1415 | 1416 | [[package]] 1417 | name = "group" 1418 | version = "0.13.0" 1419 | source = "registry+https://github.com/rust-lang/crates.io-index" 1420 | checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" 1421 | dependencies = [ 1422 | "ff", 1423 | "rand_core 0.6.4", 1424 | "subtle", 1425 | ] 1426 | 1427 | [[package]] 1428 | name = "h2" 1429 | version = "0.4.7" 1430 | source = "registry+https://github.com/rust-lang/crates.io-index" 1431 | checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" 1432 | dependencies = [ 1433 | "atomic-waker", 1434 | "bytes", 1435 | "fnv", 1436 | "futures-core", 1437 | "futures-sink", 1438 | "http 1.2.0", 1439 | "indexmap", 1440 | "slab", 1441 | "tokio", 1442 | "tokio-util", 1443 | "tracing", 1444 | ] 1445 | 1446 | [[package]] 1447 | name = "hashbrown" 1448 | version = "0.14.5" 1449 | source = "registry+https://github.com/rust-lang/crates.io-index" 1450 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1451 | dependencies = [ 1452 | "ahash", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "hashbrown" 1457 | version = "0.15.2" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 1460 | dependencies = [ 1461 | "allocator-api2", 1462 | "equivalent", 1463 | "foldhash", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "hashlink" 1468 | version = "0.9.1" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" 1471 | dependencies = [ 1472 | "hashbrown 0.14.5", 1473 | ] 1474 | 1475 | [[package]] 1476 | name = "heck" 1477 | version = "0.5.0" 1478 | source = "registry+https://github.com/rust-lang/crates.io-index" 1479 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1480 | 1481 | [[package]] 1482 | name = "hermit-abi" 1483 | version = "0.3.9" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 1486 | 1487 | [[package]] 1488 | name = "hex" 1489 | version = "0.4.3" 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" 1491 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1492 | 1493 | [[package]] 1494 | name = "hickory-proto" 1495 | version = "0.25.2" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" 1498 | dependencies = [ 1499 | "async-trait", 1500 | "cfg-if", 1501 | "data-encoding", 1502 | "enum-as-inner", 1503 | "futures-channel", 1504 | "futures-io", 1505 | "futures-util", 1506 | "idna", 1507 | "ipnet", 1508 | "once_cell", 1509 | "rand 0.9.0", 1510 | "ring", 1511 | "thiserror 2.0.11", 1512 | "tinyvec", 1513 | "tokio", 1514 | "tracing", 1515 | "url", 1516 | ] 1517 | 1518 | [[package]] 1519 | name = "hickory-resolver" 1520 | version = "0.25.2" 1521 | source = "registry+https://github.com/rust-lang/crates.io-index" 1522 | checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" 1523 | dependencies = [ 1524 | "cfg-if", 1525 | "futures-util", 1526 | "hickory-proto", 1527 | "ipconfig", 1528 | "moka", 1529 | "once_cell", 1530 | "parking_lot", 1531 | "rand 0.9.0", 1532 | "resolv-conf", 1533 | "smallvec", 1534 | "thiserror 2.0.11", 1535 | "tokio", 1536 | "tracing", 1537 | ] 1538 | 1539 | [[package]] 1540 | name = "hmac" 1541 | version = "0.12.1" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1544 | dependencies = [ 1545 | "digest", 1546 | ] 1547 | 1548 | [[package]] 1549 | name = "hmac-sha1" 1550 | version = "0.2.2" 1551 | source = "registry+https://github.com/rust-lang/crates.io-index" 1552 | checksum = "6b05da5b9e5d4720bfb691eebb2b9d42da3570745da71eac8a1f5bb7e59aab88" 1553 | dependencies = [ 1554 | "hmac", 1555 | "sha1", 1556 | ] 1557 | 1558 | [[package]] 1559 | name = "hmac-sha256" 1560 | version = "1.1.8" 1561 | source = "registry+https://github.com/rust-lang/crates.io-index" 1562 | checksum = "4a8575493d277c9092b988c780c94737fb9fd8651a1001e16bee3eccfc1baedb" 1563 | 1564 | [[package]] 1565 | name = "hostname" 1566 | version = "0.3.1" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" 1569 | dependencies = [ 1570 | "libc", 1571 | "match_cfg", 1572 | "winapi", 1573 | ] 1574 | 1575 | [[package]] 1576 | name = "hostname-validator" 1577 | version = "1.1.1" 1578 | source = "registry+https://github.com/rust-lang/crates.io-index" 1579 | checksum = "f558a64ac9af88b5ba400d99b579451af0d39c6d360980045b91aac966d705e2" 1580 | 1581 | [[package]] 1582 | name = "http" 1583 | version = "0.2.12" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1586 | dependencies = [ 1587 | "bytes", 1588 | "fnv", 1589 | "itoa", 1590 | ] 1591 | 1592 | [[package]] 1593 | name = "http" 1594 | version = "1.2.0" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" 1597 | dependencies = [ 1598 | "bytes", 1599 | "fnv", 1600 | "itoa", 1601 | ] 1602 | 1603 | [[package]] 1604 | name = "http-body" 1605 | version = "1.0.1" 1606 | source = "registry+https://github.com/rust-lang/crates.io-index" 1607 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1608 | dependencies = [ 1609 | "bytes", 1610 | "http 1.2.0", 1611 | ] 1612 | 1613 | [[package]] 1614 | name = "http-body-util" 1615 | version = "0.1.2" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 1618 | dependencies = [ 1619 | "bytes", 1620 | "futures-util", 1621 | "http 1.2.0", 1622 | "http-body", 1623 | "pin-project-lite", 1624 | ] 1625 | 1626 | [[package]] 1627 | name = "httparse" 1628 | version = "1.10.0" 1629 | source = "registry+https://github.com/rust-lang/crates.io-index" 1630 | checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" 1631 | 1632 | [[package]] 1633 | name = "httpdate" 1634 | version = "1.0.3" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1637 | 1638 | [[package]] 1639 | name = "hyper" 1640 | version = "1.6.0" 1641 | source = "registry+https://github.com/rust-lang/crates.io-index" 1642 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1643 | dependencies = [ 1644 | "bytes", 1645 | "futures-channel", 1646 | "futures-util", 1647 | "h2", 1648 | "http 1.2.0", 1649 | "http-body", 1650 | "httparse", 1651 | "httpdate", 1652 | "itoa", 1653 | "pin-project-lite", 1654 | "smallvec", 1655 | "tokio", 1656 | "want", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "hyper-rustls" 1661 | version = "0.27.5" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" 1664 | dependencies = [ 1665 | "futures-util", 1666 | "http 1.2.0", 1667 | "hyper", 1668 | "hyper-util", 1669 | "rustls", 1670 | "rustls-pki-types", 1671 | "tokio", 1672 | "tokio-rustls", 1673 | "tower-service", 1674 | "webpki-roots", 1675 | ] 1676 | 1677 | [[package]] 1678 | name = "hyper-util" 1679 | version = "0.1.11" 1680 | source = "registry+https://github.com/rust-lang/crates.io-index" 1681 | checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" 1682 | dependencies = [ 1683 | "bytes", 1684 | "futures-channel", 1685 | "futures-util", 1686 | "http 1.2.0", 1687 | "http-body", 1688 | "hyper", 1689 | "libc", 1690 | "pin-project-lite", 1691 | "socket2", 1692 | "tokio", 1693 | "tower-service", 1694 | "tracing", 1695 | ] 1696 | 1697 | [[package]] 1698 | name = "iana-time-zone" 1699 | version = "0.1.61" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 1702 | dependencies = [ 1703 | "android_system_properties", 1704 | "core-foundation-sys", 1705 | "iana-time-zone-haiku", 1706 | "js-sys", 1707 | "wasm-bindgen", 1708 | "windows-core 0.52.0", 1709 | ] 1710 | 1711 | [[package]] 1712 | name = "iana-time-zone-haiku" 1713 | version = "0.1.2" 1714 | source = "registry+https://github.com/rust-lang/crates.io-index" 1715 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1716 | dependencies = [ 1717 | "cc", 1718 | ] 1719 | 1720 | [[package]] 1721 | name = "icu_collections" 1722 | version = "1.5.0" 1723 | source = "registry+https://github.com/rust-lang/crates.io-index" 1724 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 1725 | dependencies = [ 1726 | "displaydoc", 1727 | "yoke", 1728 | "zerofrom", 1729 | "zerovec", 1730 | ] 1731 | 1732 | [[package]] 1733 | name = "icu_locid" 1734 | version = "1.5.0" 1735 | source = "registry+https://github.com/rust-lang/crates.io-index" 1736 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 1737 | dependencies = [ 1738 | "displaydoc", 1739 | "litemap", 1740 | "tinystr", 1741 | "writeable", 1742 | "zerovec", 1743 | ] 1744 | 1745 | [[package]] 1746 | name = "icu_locid_transform" 1747 | version = "1.5.0" 1748 | source = "registry+https://github.com/rust-lang/crates.io-index" 1749 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 1750 | dependencies = [ 1751 | "displaydoc", 1752 | "icu_locid", 1753 | "icu_locid_transform_data", 1754 | "icu_provider", 1755 | "tinystr", 1756 | "zerovec", 1757 | ] 1758 | 1759 | [[package]] 1760 | name = "icu_locid_transform_data" 1761 | version = "1.5.0" 1762 | source = "registry+https://github.com/rust-lang/crates.io-index" 1763 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 1764 | 1765 | [[package]] 1766 | name = "icu_normalizer" 1767 | version = "1.5.0" 1768 | source = "registry+https://github.com/rust-lang/crates.io-index" 1769 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 1770 | dependencies = [ 1771 | "displaydoc", 1772 | "icu_collections", 1773 | "icu_normalizer_data", 1774 | "icu_properties", 1775 | "icu_provider", 1776 | "smallvec", 1777 | "utf16_iter", 1778 | "utf8_iter", 1779 | "write16", 1780 | "zerovec", 1781 | ] 1782 | 1783 | [[package]] 1784 | name = "icu_normalizer_data" 1785 | version = "1.5.0" 1786 | source = "registry+https://github.com/rust-lang/crates.io-index" 1787 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 1788 | 1789 | [[package]] 1790 | name = "icu_properties" 1791 | version = "1.5.1" 1792 | source = "registry+https://github.com/rust-lang/crates.io-index" 1793 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 1794 | dependencies = [ 1795 | "displaydoc", 1796 | "icu_collections", 1797 | "icu_locid_transform", 1798 | "icu_properties_data", 1799 | "icu_provider", 1800 | "tinystr", 1801 | "zerovec", 1802 | ] 1803 | 1804 | [[package]] 1805 | name = "icu_properties_data" 1806 | version = "1.5.0" 1807 | source = "registry+https://github.com/rust-lang/crates.io-index" 1808 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 1809 | 1810 | [[package]] 1811 | name = "icu_provider" 1812 | version = "1.5.0" 1813 | source = "registry+https://github.com/rust-lang/crates.io-index" 1814 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 1815 | dependencies = [ 1816 | "displaydoc", 1817 | "icu_locid", 1818 | "icu_provider_macros", 1819 | "stable_deref_trait", 1820 | "tinystr", 1821 | "writeable", 1822 | "yoke", 1823 | "zerofrom", 1824 | "zerovec", 1825 | ] 1826 | 1827 | [[package]] 1828 | name = "icu_provider_macros" 1829 | version = "1.5.0" 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" 1831 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 1832 | dependencies = [ 1833 | "proc-macro2", 1834 | "quote", 1835 | "syn 2.0.98", 1836 | ] 1837 | 1838 | [[package]] 1839 | name = "idna" 1840 | version = "1.0.3" 1841 | source = "registry+https://github.com/rust-lang/crates.io-index" 1842 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1843 | dependencies = [ 1844 | "idna_adapter", 1845 | "smallvec", 1846 | "utf8_iter", 1847 | ] 1848 | 1849 | [[package]] 1850 | name = "idna_adapter" 1851 | version = "1.2.0" 1852 | source = "registry+https://github.com/rust-lang/crates.io-index" 1853 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 1854 | dependencies = [ 1855 | "icu_normalizer", 1856 | "icu_properties", 1857 | ] 1858 | 1859 | [[package]] 1860 | name = "igd-next" 1861 | version = "0.16.1" 1862 | source = "registry+https://github.com/rust-lang/crates.io-index" 1863 | checksum = "d06464e726471718db9ad3fefc020529fabcde03313a0fc3967510e2db5add12" 1864 | dependencies = [ 1865 | "async-trait", 1866 | "attohttpc", 1867 | "bytes", 1868 | "futures", 1869 | "http 1.2.0", 1870 | "http-body-util", 1871 | "hyper", 1872 | "hyper-util", 1873 | "log", 1874 | "rand 0.9.0", 1875 | "tokio", 1876 | "url", 1877 | "xmltree", 1878 | ] 1879 | 1880 | [[package]] 1881 | name = "image" 1882 | version = "0.25.5" 1883 | source = "registry+https://github.com/rust-lang/crates.io-index" 1884 | checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" 1885 | dependencies = [ 1886 | "bytemuck", 1887 | "byteorder-lite", 1888 | "num-traits", 1889 | "png", 1890 | "tiff", 1891 | ] 1892 | 1893 | [[package]] 1894 | name = "indexmap" 1895 | version = "2.7.1" 1896 | source = "registry+https://github.com/rust-lang/crates.io-index" 1897 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 1898 | dependencies = [ 1899 | "equivalent", 1900 | "hashbrown 0.15.2", 1901 | ] 1902 | 1903 | [[package]] 1904 | name = "indicatif" 1905 | version = "0.17.11" 1906 | source = "registry+https://github.com/rust-lang/crates.io-index" 1907 | checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" 1908 | dependencies = [ 1909 | "console", 1910 | "number_prefix", 1911 | "portable-atomic", 1912 | "unicode-width", 1913 | "web-time", 1914 | ] 1915 | 1916 | [[package]] 1917 | name = "inout" 1918 | version = "0.1.3" 1919 | source = "registry+https://github.com/rust-lang/crates.io-index" 1920 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 1921 | dependencies = [ 1922 | "generic-array", 1923 | ] 1924 | 1925 | [[package]] 1926 | name = "inplace-vec-builder" 1927 | version = "0.1.1" 1928 | source = "registry+https://github.com/rust-lang/crates.io-index" 1929 | checksum = "cf64c2edc8226891a71f127587a2861b132d2b942310843814d5001d99a1d307" 1930 | dependencies = [ 1931 | "smallvec", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "instant" 1936 | version = "0.1.13" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" 1939 | dependencies = [ 1940 | "cfg-if", 1941 | "js-sys", 1942 | "wasm-bindgen", 1943 | "web-sys", 1944 | ] 1945 | 1946 | [[package]] 1947 | name = "ipconfig" 1948 | version = "0.3.2" 1949 | source = "registry+https://github.com/rust-lang/crates.io-index" 1950 | checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" 1951 | dependencies = [ 1952 | "socket2", 1953 | "widestring", 1954 | "windows-sys 0.48.0", 1955 | "winreg", 1956 | ] 1957 | 1958 | [[package]] 1959 | name = "ipnet" 1960 | version = "2.11.0" 1961 | source = "registry+https://github.com/rust-lang/crates.io-index" 1962 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1963 | 1964 | [[package]] 1965 | name = "iroh" 1966 | version = "0.35.0" 1967 | source = "registry+https://github.com/rust-lang/crates.io-index" 1968 | checksum = "6ca758f4ce39ae3f07de922be6c73de6a48a07f39554e78b5745585652ce38f5" 1969 | dependencies = [ 1970 | "aead", 1971 | "anyhow", 1972 | "atomic-waker", 1973 | "backon", 1974 | "bytes", 1975 | "cfg_aliases", 1976 | "concurrent-queue", 1977 | "crypto_box", 1978 | "data-encoding", 1979 | "der", 1980 | "derive_more", 1981 | "ed25519-dalek", 1982 | "futures-buffered", 1983 | "futures-util", 1984 | "getrandom 0.3.3", 1985 | "hickory-resolver", 1986 | "http 1.2.0", 1987 | "igd-next", 1988 | "instant", 1989 | "iroh-base", 1990 | "iroh-metrics", 1991 | "iroh-quinn", 1992 | "iroh-quinn-proto", 1993 | "iroh-quinn-udp", 1994 | "iroh-relay", 1995 | "n0-future", 1996 | "netdev", 1997 | "netwatch", 1998 | "pin-project", 1999 | "pkarr", 2000 | "portmapper", 2001 | "rand 0.8.5", 2002 | "rcgen", 2003 | "reqwest", 2004 | "ring", 2005 | "rustls", 2006 | "rustls-webpki", 2007 | "serde", 2008 | "smallvec", 2009 | "spki", 2010 | "strum", 2011 | "stun-rs", 2012 | "surge-ping", 2013 | "thiserror 2.0.11", 2014 | "time", 2015 | "tokio", 2016 | "tokio-stream", 2017 | "tokio-util", 2018 | "tracing", 2019 | "url", 2020 | "wasm-bindgen-futures", 2021 | "webpki-roots", 2022 | "x509-parser", 2023 | "z32", 2024 | ] 2025 | 2026 | [[package]] 2027 | name = "iroh-base" 2028 | version = "0.35.0" 2029 | source = "registry+https://github.com/rust-lang/crates.io-index" 2030 | checksum = "f91ac4aaab68153d726c4e6b39c30f9f9253743f0e25664e52f4caeb46f48d11" 2031 | dependencies = [ 2032 | "curve25519-dalek", 2033 | "data-encoding", 2034 | "derive_more", 2035 | "ed25519-dalek", 2036 | "postcard", 2037 | "rand_core 0.6.4", 2038 | "serde", 2039 | "thiserror 2.0.11", 2040 | "url", 2041 | ] 2042 | 2043 | [[package]] 2044 | name = "iroh-blobs" 2045 | version = "0.35.0" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | checksum = "817b785193b73c34ef1f2dcb5ddf8729ecef9b72a8fc0e706ee6d7a9bf8766a6" 2048 | dependencies = [ 2049 | "anyhow", 2050 | "async-channel", 2051 | "bao-tree", 2052 | "blake3", 2053 | "bytes", 2054 | "chrono", 2055 | "data-encoding", 2056 | "derive_more", 2057 | "futures-buffered", 2058 | "futures-lite", 2059 | "futures-util", 2060 | "genawaiter", 2061 | "hashlink", 2062 | "hex", 2063 | "iroh", 2064 | "iroh-base", 2065 | "iroh-io", 2066 | "iroh-metrics", 2067 | "nested_enum_utils 0.1.0", 2068 | "num_cpus", 2069 | "oneshot", 2070 | "parking_lot", 2071 | "portable-atomic", 2072 | "postcard", 2073 | "quic-rpc", 2074 | "quic-rpc-derive", 2075 | "rand 0.8.5", 2076 | "range-collections", 2077 | "redb", 2078 | "reflink-copy", 2079 | "self_cell", 2080 | "serde", 2081 | "serde-error", 2082 | "smallvec", 2083 | "ssh-key", 2084 | "strum", 2085 | "tempfile", 2086 | "thiserror 2.0.11", 2087 | "tokio", 2088 | "tokio-util", 2089 | "tracing", 2090 | "tracing-futures", 2091 | "tracing-test", 2092 | "walkdir", 2093 | ] 2094 | 2095 | [[package]] 2096 | name = "iroh-io" 2097 | version = "0.6.2" 2098 | source = "registry+https://github.com/rust-lang/crates.io-index" 2099 | checksum = "e0a5feb781017b983ff1b155cd1faf8174da2acafd807aa482876da2d7e6577a" 2100 | dependencies = [ 2101 | "bytes", 2102 | "futures-lite", 2103 | "pin-project", 2104 | "smallvec", 2105 | "tokio", 2106 | ] 2107 | 2108 | [[package]] 2109 | name = "iroh-metrics" 2110 | version = "0.34.0" 2111 | source = "registry+https://github.com/rust-lang/crates.io-index" 2112 | checksum = "f70466f14caff7420a14373676947e25e2917af6a5b1bec45825beb2bf1eb6a7" 2113 | dependencies = [ 2114 | "iroh-metrics-derive", 2115 | "itoa", 2116 | "serde", 2117 | "snafu", 2118 | "tracing", 2119 | ] 2120 | 2121 | [[package]] 2122 | name = "iroh-metrics-derive" 2123 | version = "0.2.0" 2124 | source = "registry+https://github.com/rust-lang/crates.io-index" 2125 | checksum = "8d12f5c45c4ed2436302a4e03cad9a0ad34b2962ad0c5791e1019c0ee30eeb09" 2126 | dependencies = [ 2127 | "heck", 2128 | "proc-macro2", 2129 | "quote", 2130 | "syn 2.0.98", 2131 | ] 2132 | 2133 | [[package]] 2134 | name = "iroh-quinn" 2135 | version = "0.13.0" 2136 | source = "registry+https://github.com/rust-lang/crates.io-index" 2137 | checksum = "76c6245c9ed906506ab9185e8d7f64857129aee4f935e899f398a3bd3b70338d" 2138 | dependencies = [ 2139 | "bytes", 2140 | "cfg_aliases", 2141 | "iroh-quinn-proto", 2142 | "iroh-quinn-udp", 2143 | "pin-project-lite", 2144 | "rustc-hash", 2145 | "rustls", 2146 | "socket2", 2147 | "thiserror 2.0.11", 2148 | "tokio", 2149 | "tracing", 2150 | "web-time", 2151 | ] 2152 | 2153 | [[package]] 2154 | name = "iroh-quinn-proto" 2155 | version = "0.13.0" 2156 | source = "registry+https://github.com/rust-lang/crates.io-index" 2157 | checksum = "929d5d8fa77d5c304d3ee7cae9aede31f13908bd049f9de8c7c0094ad6f7c535" 2158 | dependencies = [ 2159 | "bytes", 2160 | "getrandom 0.2.15", 2161 | "rand 0.8.5", 2162 | "ring", 2163 | "rustc-hash", 2164 | "rustls", 2165 | "rustls-pki-types", 2166 | "slab", 2167 | "thiserror 2.0.11", 2168 | "tinyvec", 2169 | "tracing", 2170 | "web-time", 2171 | ] 2172 | 2173 | [[package]] 2174 | name = "iroh-quinn-udp" 2175 | version = "0.5.7" 2176 | source = "registry+https://github.com/rust-lang/crates.io-index" 2177 | checksum = "c53afaa1049f7c83ea1331f5ebb9e6ebc5fdd69c468b7a22dd598b02c9bcc973" 2178 | dependencies = [ 2179 | "cfg_aliases", 2180 | "libc", 2181 | "once_cell", 2182 | "socket2", 2183 | "tracing", 2184 | "windows-sys 0.59.0", 2185 | ] 2186 | 2187 | [[package]] 2188 | name = "iroh-relay" 2189 | version = "0.35.0" 2190 | source = "registry+https://github.com/rust-lang/crates.io-index" 2191 | checksum = "c63f122cdfaa4b4e0e7d6d3921d2b878f42a0c6d3ee5a29456dc3f5ab5ec931f" 2192 | dependencies = [ 2193 | "anyhow", 2194 | "bytes", 2195 | "cfg_aliases", 2196 | "data-encoding", 2197 | "derive_more", 2198 | "getrandom 0.3.3", 2199 | "hickory-resolver", 2200 | "http 1.2.0", 2201 | "http-body-util", 2202 | "hyper", 2203 | "hyper-util", 2204 | "iroh-base", 2205 | "iroh-metrics", 2206 | "iroh-quinn", 2207 | "iroh-quinn-proto", 2208 | "lru 0.12.5", 2209 | "n0-future", 2210 | "num_enum", 2211 | "pin-project", 2212 | "pkarr", 2213 | "postcard", 2214 | "rand 0.8.5", 2215 | "reqwest", 2216 | "rustls", 2217 | "rustls-webpki", 2218 | "serde", 2219 | "sha1", 2220 | "strum", 2221 | "stun-rs", 2222 | "thiserror 2.0.11", 2223 | "tokio", 2224 | "tokio-rustls", 2225 | "tokio-util", 2226 | "tokio-websockets", 2227 | "tracing", 2228 | "url", 2229 | "webpki-roots", 2230 | "ws_stream_wasm", 2231 | "z32", 2232 | ] 2233 | 2234 | [[package]] 2235 | name = "is_terminal_polyfill" 2236 | version = "1.70.1" 2237 | source = "registry+https://github.com/rust-lang/crates.io-index" 2238 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 2239 | 2240 | [[package]] 2241 | name = "itoa" 2242 | version = "1.0.14" 2243 | source = "registry+https://github.com/rust-lang/crates.io-index" 2244 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 2245 | 2246 | [[package]] 2247 | name = "jpeg-decoder" 2248 | version = "0.3.1" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" 2251 | 2252 | [[package]] 2253 | name = "js-sys" 2254 | version = "0.3.77" 2255 | source = "registry+https://github.com/rust-lang/crates.io-index" 2256 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 2257 | dependencies = [ 2258 | "once_cell", 2259 | "wasm-bindgen", 2260 | ] 2261 | 2262 | [[package]] 2263 | name = "lazy_static" 2264 | version = "1.5.0" 2265 | source = "registry+https://github.com/rust-lang/crates.io-index" 2266 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 2267 | dependencies = [ 2268 | "spin", 2269 | ] 2270 | 2271 | [[package]] 2272 | name = "libc" 2273 | version = "0.2.172" 2274 | source = "registry+https://github.com/rust-lang/crates.io-index" 2275 | checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 2276 | 2277 | [[package]] 2278 | name = "libm" 2279 | version = "0.2.11" 2280 | source = "registry+https://github.com/rust-lang/crates.io-index" 2281 | checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" 2282 | 2283 | [[package]] 2284 | name = "linux-raw-sys" 2285 | version = "0.4.15" 2286 | source = "registry+https://github.com/rust-lang/crates.io-index" 2287 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 2288 | 2289 | [[package]] 2290 | name = "litemap" 2291 | version = "0.7.4" 2292 | source = "registry+https://github.com/rust-lang/crates.io-index" 2293 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 2294 | 2295 | [[package]] 2296 | name = "litrs" 2297 | version = "0.4.1" 2298 | source = "registry+https://github.com/rust-lang/crates.io-index" 2299 | checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 2300 | 2301 | [[package]] 2302 | name = "lock_api" 2303 | version = "0.4.12" 2304 | source = "registry+https://github.com/rust-lang/crates.io-index" 2305 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 2306 | dependencies = [ 2307 | "autocfg", 2308 | "scopeguard", 2309 | ] 2310 | 2311 | [[package]] 2312 | name = "log" 2313 | version = "0.4.25" 2314 | source = "registry+https://github.com/rust-lang/crates.io-index" 2315 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 2316 | 2317 | [[package]] 2318 | name = "loom" 2319 | version = "0.5.6" 2320 | source = "registry+https://github.com/rust-lang/crates.io-index" 2321 | checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" 2322 | dependencies = [ 2323 | "cfg-if", 2324 | "generator 0.7.5", 2325 | "scoped-tls", 2326 | "tracing", 2327 | "tracing-subscriber", 2328 | ] 2329 | 2330 | [[package]] 2331 | name = "loom" 2332 | version = "0.7.2" 2333 | source = "registry+https://github.com/rust-lang/crates.io-index" 2334 | checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" 2335 | dependencies = [ 2336 | "cfg-if", 2337 | "generator 0.8.4", 2338 | "scoped-tls", 2339 | "tracing", 2340 | "tracing-subscriber", 2341 | ] 2342 | 2343 | [[package]] 2344 | name = "lru" 2345 | version = "0.12.5" 2346 | source = "registry+https://github.com/rust-lang/crates.io-index" 2347 | checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 2348 | dependencies = [ 2349 | "hashbrown 0.15.2", 2350 | ] 2351 | 2352 | [[package]] 2353 | name = "lru" 2354 | version = "0.13.0" 2355 | source = "registry+https://github.com/rust-lang/crates.io-index" 2356 | checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" 2357 | 2358 | [[package]] 2359 | name = "match_cfg" 2360 | version = "0.1.0" 2361 | source = "registry+https://github.com/rust-lang/crates.io-index" 2362 | checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" 2363 | 2364 | [[package]] 2365 | name = "matchers" 2366 | version = "0.1.0" 2367 | source = "registry+https://github.com/rust-lang/crates.io-index" 2368 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 2369 | dependencies = [ 2370 | "regex-automata 0.1.10", 2371 | ] 2372 | 2373 | [[package]] 2374 | name = "md5" 2375 | version = "0.7.0" 2376 | source = "registry+https://github.com/rust-lang/crates.io-index" 2377 | checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" 2378 | 2379 | [[package]] 2380 | name = "memchr" 2381 | version = "2.7.4" 2382 | source = "registry+https://github.com/rust-lang/crates.io-index" 2383 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 2384 | 2385 | [[package]] 2386 | name = "mime" 2387 | version = "0.3.17" 2388 | source = "registry+https://github.com/rust-lang/crates.io-index" 2389 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2390 | 2391 | [[package]] 2392 | name = "minimal-lexical" 2393 | version = "0.2.1" 2394 | source = "registry+https://github.com/rust-lang/crates.io-index" 2395 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 2396 | 2397 | [[package]] 2398 | name = "miniz_oxide" 2399 | version = "0.8.4" 2400 | source = "registry+https://github.com/rust-lang/crates.io-index" 2401 | checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" 2402 | dependencies = [ 2403 | "adler2", 2404 | "simd-adler32", 2405 | ] 2406 | 2407 | [[package]] 2408 | name = "mio" 2409 | version = "1.0.3" 2410 | source = "registry+https://github.com/rust-lang/crates.io-index" 2411 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 2412 | dependencies = [ 2413 | "libc", 2414 | "wasi 0.11.0+wasi-snapshot-preview1", 2415 | "windows-sys 0.52.0", 2416 | ] 2417 | 2418 | [[package]] 2419 | name = "moka" 2420 | version = "0.12.10" 2421 | source = "registry+https://github.com/rust-lang/crates.io-index" 2422 | checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" 2423 | dependencies = [ 2424 | "crossbeam-channel", 2425 | "crossbeam-epoch", 2426 | "crossbeam-utils", 2427 | "loom 0.7.2", 2428 | "parking_lot", 2429 | "portable-atomic", 2430 | "rustc_version", 2431 | "smallvec", 2432 | "tagptr", 2433 | "thiserror 1.0.69", 2434 | "uuid", 2435 | ] 2436 | 2437 | [[package]] 2438 | name = "n0-future" 2439 | version = "0.1.3" 2440 | source = "registry+https://github.com/rust-lang/crates.io-index" 2441 | checksum = "7bb0e5d99e681ab3c938842b96fcb41bf8a7bb4bfdb11ccbd653a7e83e06c794" 2442 | dependencies = [ 2443 | "cfg_aliases", 2444 | "derive_more", 2445 | "futures-buffered", 2446 | "futures-lite", 2447 | "futures-util", 2448 | "js-sys", 2449 | "pin-project", 2450 | "send_wrapper", 2451 | "tokio", 2452 | "tokio-util", 2453 | "wasm-bindgen", 2454 | "wasm-bindgen-futures", 2455 | "web-time", 2456 | ] 2457 | 2458 | [[package]] 2459 | name = "nanorand" 2460 | version = "0.7.0" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" 2463 | dependencies = [ 2464 | "getrandom 0.2.15", 2465 | ] 2466 | 2467 | [[package]] 2468 | name = "nested_enum_utils" 2469 | version = "0.1.0" 2470 | source = "registry+https://github.com/rust-lang/crates.io-index" 2471 | checksum = "8f256ef99e7ac37428ef98c89bef9d84b590172de4bbfbe81b68a4cd3abadb32" 2472 | dependencies = [ 2473 | "proc-macro-crate", 2474 | "proc-macro2", 2475 | "quote", 2476 | "syn 1.0.109", 2477 | ] 2478 | 2479 | [[package]] 2480 | name = "nested_enum_utils" 2481 | version = "0.2.2" 2482 | source = "registry+https://github.com/rust-lang/crates.io-index" 2483 | checksum = "43fa9161ed44d30e9702fe42bd78693bceac0fed02f647da749f36109023d3a3" 2484 | dependencies = [ 2485 | "proc-macro-crate", 2486 | "proc-macro2", 2487 | "quote", 2488 | "syn 1.0.109", 2489 | ] 2490 | 2491 | [[package]] 2492 | name = "netdev" 2493 | version = "0.31.0" 2494 | source = "registry+https://github.com/rust-lang/crates.io-index" 2495 | checksum = "f901362e84cd407be6f8cd9d3a46bccf09136b095792785401ea7d283c79b91d" 2496 | dependencies = [ 2497 | "dlopen2", 2498 | "ipnet", 2499 | "libc", 2500 | "netlink-packet-core", 2501 | "netlink-packet-route 0.17.1", 2502 | "netlink-sys", 2503 | "once_cell", 2504 | "system-configuration", 2505 | "windows-sys 0.52.0", 2506 | ] 2507 | 2508 | [[package]] 2509 | name = "netlink-packet-core" 2510 | version = "0.7.0" 2511 | source = "registry+https://github.com/rust-lang/crates.io-index" 2512 | checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" 2513 | dependencies = [ 2514 | "anyhow", 2515 | "byteorder", 2516 | "netlink-packet-utils", 2517 | ] 2518 | 2519 | [[package]] 2520 | name = "netlink-packet-route" 2521 | version = "0.17.1" 2522 | source = "registry+https://github.com/rust-lang/crates.io-index" 2523 | checksum = "053998cea5a306971f88580d0829e90f270f940befd7cf928da179d4187a5a66" 2524 | dependencies = [ 2525 | "anyhow", 2526 | "bitflags 1.3.2", 2527 | "byteorder", 2528 | "libc", 2529 | "netlink-packet-core", 2530 | "netlink-packet-utils", 2531 | ] 2532 | 2533 | [[package]] 2534 | name = "netlink-packet-route" 2535 | version = "0.23.0" 2536 | source = "registry+https://github.com/rust-lang/crates.io-index" 2537 | checksum = "0800eae8638a299eaa67476e1c6b6692922273e0f7939fd188fc861c837b9cd2" 2538 | dependencies = [ 2539 | "anyhow", 2540 | "bitflags 2.8.0", 2541 | "byteorder", 2542 | "libc", 2543 | "log", 2544 | "netlink-packet-core", 2545 | "netlink-packet-utils", 2546 | ] 2547 | 2548 | [[package]] 2549 | name = "netlink-packet-utils" 2550 | version = "0.5.2" 2551 | source = "registry+https://github.com/rust-lang/crates.io-index" 2552 | checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" 2553 | dependencies = [ 2554 | "anyhow", 2555 | "byteorder", 2556 | "paste", 2557 | "thiserror 1.0.69", 2558 | ] 2559 | 2560 | [[package]] 2561 | name = "netlink-proto" 2562 | version = "0.11.5" 2563 | source = "registry+https://github.com/rust-lang/crates.io-index" 2564 | checksum = "72452e012c2f8d612410d89eea01e2d9b56205274abb35d53f60200b2ec41d60" 2565 | dependencies = [ 2566 | "bytes", 2567 | "futures", 2568 | "log", 2569 | "netlink-packet-core", 2570 | "netlink-sys", 2571 | "thiserror 2.0.11", 2572 | ] 2573 | 2574 | [[package]] 2575 | name = "netlink-sys" 2576 | version = "0.8.7" 2577 | source = "registry+https://github.com/rust-lang/crates.io-index" 2578 | checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" 2579 | dependencies = [ 2580 | "bytes", 2581 | "futures", 2582 | "libc", 2583 | "log", 2584 | "tokio", 2585 | ] 2586 | 2587 | [[package]] 2588 | name = "netwatch" 2589 | version = "0.5.0" 2590 | source = "registry+https://github.com/rust-lang/crates.io-index" 2591 | checksum = "67eeaa5f7505c93c5a9b35ba84fd21fb8aa3f24678c76acfe8716af7862fb07a" 2592 | dependencies = [ 2593 | "atomic-waker", 2594 | "bytes", 2595 | "cfg_aliases", 2596 | "derive_more", 2597 | "iroh-quinn-udp", 2598 | "js-sys", 2599 | "libc", 2600 | "n0-future", 2601 | "nested_enum_utils 0.2.2", 2602 | "netdev", 2603 | "netlink-packet-core", 2604 | "netlink-packet-route 0.23.0", 2605 | "netlink-proto", 2606 | "netlink-sys", 2607 | "serde", 2608 | "snafu", 2609 | "socket2", 2610 | "time", 2611 | "tokio", 2612 | "tokio-util", 2613 | "tracing", 2614 | "web-sys", 2615 | "windows 0.59.0", 2616 | "windows-result 0.3.0", 2617 | "wmi", 2618 | ] 2619 | 2620 | [[package]] 2621 | name = "nix" 2622 | version = "0.29.0" 2623 | source = "registry+https://github.com/rust-lang/crates.io-index" 2624 | checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 2625 | dependencies = [ 2626 | "bitflags 2.8.0", 2627 | "cfg-if", 2628 | "cfg_aliases", 2629 | "libc", 2630 | ] 2631 | 2632 | [[package]] 2633 | name = "no-std-net" 2634 | version = "0.6.0" 2635 | source = "registry+https://github.com/rust-lang/crates.io-index" 2636 | checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" 2637 | 2638 | [[package]] 2639 | name = "nom" 2640 | version = "7.1.3" 2641 | source = "registry+https://github.com/rust-lang/crates.io-index" 2642 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2643 | dependencies = [ 2644 | "memchr", 2645 | "minimal-lexical", 2646 | ] 2647 | 2648 | [[package]] 2649 | name = "ntimestamp" 2650 | version = "1.0.0" 2651 | source = "registry+https://github.com/rust-lang/crates.io-index" 2652 | checksum = "c50f94c405726d3e0095e89e72f75ce7f6587b94a8bd8dc8054b73f65c0fd68c" 2653 | dependencies = [ 2654 | "base32", 2655 | "document-features", 2656 | "getrandom 0.2.15", 2657 | "httpdate", 2658 | "js-sys", 2659 | "once_cell", 2660 | "serde", 2661 | ] 2662 | 2663 | [[package]] 2664 | name = "nu-ansi-term" 2665 | version = "0.46.0" 2666 | source = "registry+https://github.com/rust-lang/crates.io-index" 2667 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 2668 | dependencies = [ 2669 | "overload", 2670 | "winapi", 2671 | ] 2672 | 2673 | [[package]] 2674 | name = "num-bigint" 2675 | version = "0.4.6" 2676 | source = "registry+https://github.com/rust-lang/crates.io-index" 2677 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 2678 | dependencies = [ 2679 | "num-integer", 2680 | "num-traits", 2681 | ] 2682 | 2683 | [[package]] 2684 | name = "num-bigint-dig" 2685 | version = "0.8.4" 2686 | source = "registry+https://github.com/rust-lang/crates.io-index" 2687 | checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 2688 | dependencies = [ 2689 | "byteorder", 2690 | "lazy_static", 2691 | "libm", 2692 | "num-integer", 2693 | "num-iter", 2694 | "num-traits", 2695 | "rand 0.8.5", 2696 | "smallvec", 2697 | "zeroize", 2698 | ] 2699 | 2700 | [[package]] 2701 | name = "num-conv" 2702 | version = "0.1.0" 2703 | source = "registry+https://github.com/rust-lang/crates.io-index" 2704 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 2705 | 2706 | [[package]] 2707 | name = "num-integer" 2708 | version = "0.1.46" 2709 | source = "registry+https://github.com/rust-lang/crates.io-index" 2710 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 2711 | dependencies = [ 2712 | "num-traits", 2713 | ] 2714 | 2715 | [[package]] 2716 | name = "num-iter" 2717 | version = "0.1.45" 2718 | source = "registry+https://github.com/rust-lang/crates.io-index" 2719 | checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 2720 | dependencies = [ 2721 | "autocfg", 2722 | "num-integer", 2723 | "num-traits", 2724 | ] 2725 | 2726 | [[package]] 2727 | name = "num-traits" 2728 | version = "0.2.19" 2729 | source = "registry+https://github.com/rust-lang/crates.io-index" 2730 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2731 | dependencies = [ 2732 | "autocfg", 2733 | "libm", 2734 | ] 2735 | 2736 | [[package]] 2737 | name = "num_cpus" 2738 | version = "1.16.0" 2739 | source = "registry+https://github.com/rust-lang/crates.io-index" 2740 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 2741 | dependencies = [ 2742 | "hermit-abi", 2743 | "libc", 2744 | ] 2745 | 2746 | [[package]] 2747 | name = "num_enum" 2748 | version = "0.7.3" 2749 | source = "registry+https://github.com/rust-lang/crates.io-index" 2750 | checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" 2751 | dependencies = [ 2752 | "num_enum_derive", 2753 | ] 2754 | 2755 | [[package]] 2756 | name = "num_enum_derive" 2757 | version = "0.7.3" 2758 | source = "registry+https://github.com/rust-lang/crates.io-index" 2759 | checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" 2760 | dependencies = [ 2761 | "proc-macro-crate", 2762 | "proc-macro2", 2763 | "quote", 2764 | "syn 2.0.98", 2765 | ] 2766 | 2767 | [[package]] 2768 | name = "number_prefix" 2769 | version = "0.4.0" 2770 | source = "registry+https://github.com/rust-lang/crates.io-index" 2771 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 2772 | 2773 | [[package]] 2774 | name = "objc-sys" 2775 | version = "0.3.5" 2776 | source = "registry+https://github.com/rust-lang/crates.io-index" 2777 | checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" 2778 | 2779 | [[package]] 2780 | name = "objc2" 2781 | version = "0.5.2" 2782 | source = "registry+https://github.com/rust-lang/crates.io-index" 2783 | checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" 2784 | dependencies = [ 2785 | "objc-sys", 2786 | "objc2-encode", 2787 | ] 2788 | 2789 | [[package]] 2790 | name = "objc2-app-kit" 2791 | version = "0.2.2" 2792 | source = "registry+https://github.com/rust-lang/crates.io-index" 2793 | checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" 2794 | dependencies = [ 2795 | "bitflags 2.8.0", 2796 | "block2", 2797 | "libc", 2798 | "objc2", 2799 | "objc2-core-data", 2800 | "objc2-core-image", 2801 | "objc2-foundation", 2802 | "objc2-quartz-core", 2803 | ] 2804 | 2805 | [[package]] 2806 | name = "objc2-core-data" 2807 | version = "0.2.2" 2808 | source = "registry+https://github.com/rust-lang/crates.io-index" 2809 | checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" 2810 | dependencies = [ 2811 | "bitflags 2.8.0", 2812 | "block2", 2813 | "objc2", 2814 | "objc2-foundation", 2815 | ] 2816 | 2817 | [[package]] 2818 | name = "objc2-core-image" 2819 | version = "0.2.2" 2820 | source = "registry+https://github.com/rust-lang/crates.io-index" 2821 | checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" 2822 | dependencies = [ 2823 | "block2", 2824 | "objc2", 2825 | "objc2-foundation", 2826 | "objc2-metal", 2827 | ] 2828 | 2829 | [[package]] 2830 | name = "objc2-encode" 2831 | version = "4.1.0" 2832 | source = "registry+https://github.com/rust-lang/crates.io-index" 2833 | checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" 2834 | 2835 | [[package]] 2836 | name = "objc2-foundation" 2837 | version = "0.2.2" 2838 | source = "registry+https://github.com/rust-lang/crates.io-index" 2839 | checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2840 | dependencies = [ 2841 | "bitflags 2.8.0", 2842 | "block2", 2843 | "libc", 2844 | "objc2", 2845 | ] 2846 | 2847 | [[package]] 2848 | name = "objc2-metal" 2849 | version = "0.2.2" 2850 | source = "registry+https://github.com/rust-lang/crates.io-index" 2851 | checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2852 | dependencies = [ 2853 | "bitflags 2.8.0", 2854 | "block2", 2855 | "objc2", 2856 | "objc2-foundation", 2857 | ] 2858 | 2859 | [[package]] 2860 | name = "objc2-quartz-core" 2861 | version = "0.2.2" 2862 | source = "registry+https://github.com/rust-lang/crates.io-index" 2863 | checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2864 | dependencies = [ 2865 | "bitflags 2.8.0", 2866 | "block2", 2867 | "objc2", 2868 | "objc2-foundation", 2869 | "objc2-metal", 2870 | ] 2871 | 2872 | [[package]] 2873 | name = "object" 2874 | version = "0.36.7" 2875 | source = "registry+https://github.com/rust-lang/crates.io-index" 2876 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 2877 | dependencies = [ 2878 | "memchr", 2879 | ] 2880 | 2881 | [[package]] 2882 | name = "oid-registry" 2883 | version = "0.7.1" 2884 | source = "registry+https://github.com/rust-lang/crates.io-index" 2885 | checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" 2886 | dependencies = [ 2887 | "asn1-rs", 2888 | ] 2889 | 2890 | [[package]] 2891 | name = "once_cell" 2892 | version = "1.20.3" 2893 | source = "registry+https://github.com/rust-lang/crates.io-index" 2894 | checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" 2895 | dependencies = [ 2896 | "critical-section", 2897 | "portable-atomic", 2898 | ] 2899 | 2900 | [[package]] 2901 | name = "oneshot" 2902 | version = "0.1.10" 2903 | source = "registry+https://github.com/rust-lang/crates.io-index" 2904 | checksum = "79d72a7c0f743d2ebb0a2ad1d219db75fdc799092ed3a884c9144c42a31225bd" 2905 | 2906 | [[package]] 2907 | name = "opaque-debug" 2908 | version = "0.3.1" 2909 | source = "registry+https://github.com/rust-lang/crates.io-index" 2910 | checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" 2911 | 2912 | [[package]] 2913 | name = "os_pipe" 2914 | version = "1.2.1" 2915 | source = "registry+https://github.com/rust-lang/crates.io-index" 2916 | checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" 2917 | dependencies = [ 2918 | "libc", 2919 | "windows-sys 0.59.0", 2920 | ] 2921 | 2922 | [[package]] 2923 | name = "overload" 2924 | version = "0.1.1" 2925 | source = "registry+https://github.com/rust-lang/crates.io-index" 2926 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 2927 | 2928 | [[package]] 2929 | name = "p256" 2930 | version = "0.13.2" 2931 | source = "registry+https://github.com/rust-lang/crates.io-index" 2932 | checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" 2933 | dependencies = [ 2934 | "ecdsa", 2935 | "elliptic-curve", 2936 | "primeorder", 2937 | "sha2", 2938 | ] 2939 | 2940 | [[package]] 2941 | name = "p384" 2942 | version = "0.13.1" 2943 | source = "registry+https://github.com/rust-lang/crates.io-index" 2944 | checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" 2945 | dependencies = [ 2946 | "ecdsa", 2947 | "elliptic-curve", 2948 | "primeorder", 2949 | "sha2", 2950 | ] 2951 | 2952 | [[package]] 2953 | name = "p521" 2954 | version = "0.13.3" 2955 | source = "registry+https://github.com/rust-lang/crates.io-index" 2956 | checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" 2957 | dependencies = [ 2958 | "base16ct", 2959 | "ecdsa", 2960 | "elliptic-curve", 2961 | "primeorder", 2962 | "rand_core 0.6.4", 2963 | "sha2", 2964 | ] 2965 | 2966 | [[package]] 2967 | name = "parking" 2968 | version = "2.2.1" 2969 | source = "registry+https://github.com/rust-lang/crates.io-index" 2970 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 2971 | 2972 | [[package]] 2973 | name = "parking_lot" 2974 | version = "0.12.3" 2975 | source = "registry+https://github.com/rust-lang/crates.io-index" 2976 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 2977 | dependencies = [ 2978 | "lock_api", 2979 | "parking_lot_core", 2980 | ] 2981 | 2982 | [[package]] 2983 | name = "parking_lot_core" 2984 | version = "0.9.10" 2985 | source = "registry+https://github.com/rust-lang/crates.io-index" 2986 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 2987 | dependencies = [ 2988 | "cfg-if", 2989 | "libc", 2990 | "redox_syscall", 2991 | "smallvec", 2992 | "windows-targets 0.52.6", 2993 | ] 2994 | 2995 | [[package]] 2996 | name = "paste" 2997 | version = "1.0.15" 2998 | source = "registry+https://github.com/rust-lang/crates.io-index" 2999 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 3000 | 3001 | [[package]] 3002 | name = "pem" 3003 | version = "3.0.4" 3004 | source = "registry+https://github.com/rust-lang/crates.io-index" 3005 | checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" 3006 | dependencies = [ 3007 | "base64", 3008 | "serde", 3009 | ] 3010 | 3011 | [[package]] 3012 | name = "pem-rfc7468" 3013 | version = "0.7.0" 3014 | source = "registry+https://github.com/rust-lang/crates.io-index" 3015 | checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 3016 | dependencies = [ 3017 | "base64ct", 3018 | ] 3019 | 3020 | [[package]] 3021 | name = "percent-encoding" 3022 | version = "2.3.1" 3023 | source = "registry+https://github.com/rust-lang/crates.io-index" 3024 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 3025 | 3026 | [[package]] 3027 | name = "pest" 3028 | version = "2.7.15" 3029 | source = "registry+https://github.com/rust-lang/crates.io-index" 3030 | checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" 3031 | dependencies = [ 3032 | "memchr", 3033 | "thiserror 2.0.11", 3034 | "ucd-trie", 3035 | ] 3036 | 3037 | [[package]] 3038 | name = "pest_derive" 3039 | version = "2.7.15" 3040 | source = "registry+https://github.com/rust-lang/crates.io-index" 3041 | checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" 3042 | dependencies = [ 3043 | "pest", 3044 | "pest_generator", 3045 | ] 3046 | 3047 | [[package]] 3048 | name = "pest_generator" 3049 | version = "2.7.15" 3050 | source = "registry+https://github.com/rust-lang/crates.io-index" 3051 | checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" 3052 | dependencies = [ 3053 | "pest", 3054 | "pest_meta", 3055 | "proc-macro2", 3056 | "quote", 3057 | "syn 2.0.98", 3058 | ] 3059 | 3060 | [[package]] 3061 | name = "pest_meta" 3062 | version = "2.7.15" 3063 | source = "registry+https://github.com/rust-lang/crates.io-index" 3064 | checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" 3065 | dependencies = [ 3066 | "once_cell", 3067 | "pest", 3068 | "sha2", 3069 | ] 3070 | 3071 | [[package]] 3072 | name = "pharos" 3073 | version = "0.5.3" 3074 | source = "registry+https://github.com/rust-lang/crates.io-index" 3075 | checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" 3076 | dependencies = [ 3077 | "futures", 3078 | "rustc_version", 3079 | ] 3080 | 3081 | [[package]] 3082 | name = "pin-project" 3083 | version = "1.1.9" 3084 | source = "registry+https://github.com/rust-lang/crates.io-index" 3085 | checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" 3086 | dependencies = [ 3087 | "pin-project-internal", 3088 | ] 3089 | 3090 | [[package]] 3091 | name = "pin-project-internal" 3092 | version = "1.1.9" 3093 | source = "registry+https://github.com/rust-lang/crates.io-index" 3094 | checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" 3095 | dependencies = [ 3096 | "proc-macro2", 3097 | "quote", 3098 | "syn 2.0.98", 3099 | ] 3100 | 3101 | [[package]] 3102 | name = "pin-project-lite" 3103 | version = "0.2.16" 3104 | source = "registry+https://github.com/rust-lang/crates.io-index" 3105 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 3106 | 3107 | [[package]] 3108 | name = "pin-utils" 3109 | version = "0.1.0" 3110 | source = "registry+https://github.com/rust-lang/crates.io-index" 3111 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 3112 | 3113 | [[package]] 3114 | name = "pkarr" 3115 | version = "3.7.1" 3116 | source = "registry+https://github.com/rust-lang/crates.io-index" 3117 | checksum = "e32222ae3d617bf92414db29085f8a959a4515effce916e038e9399a335a0d6d" 3118 | dependencies = [ 3119 | "async-compat", 3120 | "base32", 3121 | "bytes", 3122 | "cfg_aliases", 3123 | "document-features", 3124 | "dyn-clone", 3125 | "ed25519-dalek", 3126 | "futures-buffered", 3127 | "futures-lite", 3128 | "getrandom 0.2.15", 3129 | "log", 3130 | "lru 0.13.0", 3131 | "ntimestamp", 3132 | "reqwest", 3133 | "self_cell", 3134 | "serde", 3135 | "sha1_smol", 3136 | "simple-dns", 3137 | "thiserror 2.0.11", 3138 | "tokio", 3139 | "tracing", 3140 | "url", 3141 | "wasm-bindgen-futures", 3142 | ] 3143 | 3144 | [[package]] 3145 | name = "pkcs1" 3146 | version = "0.7.5" 3147 | source = "registry+https://github.com/rust-lang/crates.io-index" 3148 | checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 3149 | dependencies = [ 3150 | "der", 3151 | "pkcs8", 3152 | "spki", 3153 | ] 3154 | 3155 | [[package]] 3156 | name = "pkcs8" 3157 | version = "0.10.2" 3158 | source = "registry+https://github.com/rust-lang/crates.io-index" 3159 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 3160 | dependencies = [ 3161 | "der", 3162 | "spki", 3163 | ] 3164 | 3165 | [[package]] 3166 | name = "pnet_base" 3167 | version = "0.34.0" 3168 | source = "registry+https://github.com/rust-lang/crates.io-index" 3169 | checksum = "fe4cf6fb3ab38b68d01ab2aea03ed3d1132b4868fa4e06285f29f16da01c5f4c" 3170 | dependencies = [ 3171 | "no-std-net", 3172 | ] 3173 | 3174 | [[package]] 3175 | name = "pnet_macros" 3176 | version = "0.34.0" 3177 | source = "registry+https://github.com/rust-lang/crates.io-index" 3178 | checksum = "688b17499eee04a0408aca0aa5cba5fc86401d7216de8a63fdf7a4c227871804" 3179 | dependencies = [ 3180 | "proc-macro2", 3181 | "quote", 3182 | "regex", 3183 | "syn 2.0.98", 3184 | ] 3185 | 3186 | [[package]] 3187 | name = "pnet_macros_support" 3188 | version = "0.34.0" 3189 | source = "registry+https://github.com/rust-lang/crates.io-index" 3190 | checksum = "eea925b72f4bd37f8eab0f221bbe4c78b63498350c983ffa9dd4bcde7e030f56" 3191 | dependencies = [ 3192 | "pnet_base", 3193 | ] 3194 | 3195 | [[package]] 3196 | name = "pnet_packet" 3197 | version = "0.34.0" 3198 | source = "registry+https://github.com/rust-lang/crates.io-index" 3199 | checksum = "a9a005825396b7fe7a38a8e288dbc342d5034dac80c15212436424fef8ea90ba" 3200 | dependencies = [ 3201 | "glob", 3202 | "pnet_base", 3203 | "pnet_macros", 3204 | "pnet_macros_support", 3205 | ] 3206 | 3207 | [[package]] 3208 | name = "png" 3209 | version = "0.17.16" 3210 | source = "registry+https://github.com/rust-lang/crates.io-index" 3211 | checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" 3212 | dependencies = [ 3213 | "bitflags 1.3.2", 3214 | "crc32fast", 3215 | "fdeflate", 3216 | "flate2", 3217 | "miniz_oxide", 3218 | ] 3219 | 3220 | [[package]] 3221 | name = "poly1305" 3222 | version = "0.8.0" 3223 | source = "registry+https://github.com/rust-lang/crates.io-index" 3224 | checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" 3225 | dependencies = [ 3226 | "cpufeatures", 3227 | "opaque-debug", 3228 | "universal-hash", 3229 | ] 3230 | 3231 | [[package]] 3232 | name = "portable-atomic" 3233 | version = "1.10.0" 3234 | source = "registry+https://github.com/rust-lang/crates.io-index" 3235 | checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" 3236 | 3237 | [[package]] 3238 | name = "portmapper" 3239 | version = "0.5.0" 3240 | source = "registry+https://github.com/rust-lang/crates.io-index" 3241 | checksum = "7d6db66007eac4a0ec8331d0d20c734bd64f6445d64bbaf0d0a27fea7a054e36" 3242 | dependencies = [ 3243 | "base64", 3244 | "bytes", 3245 | "derive_more", 3246 | "futures-lite", 3247 | "futures-util", 3248 | "hyper-util", 3249 | "igd-next", 3250 | "iroh-metrics", 3251 | "libc", 3252 | "nested_enum_utils 0.2.2", 3253 | "netwatch", 3254 | "num_enum", 3255 | "rand 0.8.5", 3256 | "serde", 3257 | "smallvec", 3258 | "snafu", 3259 | "socket2", 3260 | "time", 3261 | "tokio", 3262 | "tokio-util", 3263 | "tower-layer", 3264 | "tracing", 3265 | "url", 3266 | ] 3267 | 3268 | [[package]] 3269 | name = "positioned-io" 3270 | version = "0.3.3" 3271 | source = "registry+https://github.com/rust-lang/crates.io-index" 3272 | checksum = "ccabfeeb89c73adf4081f0dca7f8e28dbda90981a222ceea37f619e93ea6afe9" 3273 | dependencies = [ 3274 | "libc", 3275 | "winapi", 3276 | ] 3277 | 3278 | [[package]] 3279 | name = "postcard" 3280 | version = "1.1.1" 3281 | source = "registry+https://github.com/rust-lang/crates.io-index" 3282 | checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" 3283 | dependencies = [ 3284 | "cobs", 3285 | "embedded-io 0.4.0", 3286 | "embedded-io 0.6.1", 3287 | "postcard-derive", 3288 | "serde", 3289 | ] 3290 | 3291 | [[package]] 3292 | name = "postcard-derive" 3293 | version = "0.1.2" 3294 | source = "registry+https://github.com/rust-lang/crates.io-index" 3295 | checksum = "0239fa9c1d225d4b7eb69925c25c5e082307a141e470573fbbe3a817ce6a7a37" 3296 | dependencies = [ 3297 | "proc-macro2", 3298 | "quote", 3299 | "syn 1.0.109", 3300 | ] 3301 | 3302 | [[package]] 3303 | name = "powerfmt" 3304 | version = "0.2.0" 3305 | source = "registry+https://github.com/rust-lang/crates.io-index" 3306 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 3307 | 3308 | [[package]] 3309 | name = "ppv-lite86" 3310 | version = "0.2.20" 3311 | source = "registry+https://github.com/rust-lang/crates.io-index" 3312 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 3313 | dependencies = [ 3314 | "zerocopy 0.7.35", 3315 | ] 3316 | 3317 | [[package]] 3318 | name = "precis-core" 3319 | version = "0.1.11" 3320 | source = "registry+https://github.com/rust-lang/crates.io-index" 3321 | checksum = "9c2e7b31f132e0c6f8682cfb7bf4a5340dbe925b7986618d0826a56dfe0c8e56" 3322 | dependencies = [ 3323 | "precis-tools", 3324 | "ucd-parse", 3325 | "unicode-normalization", 3326 | ] 3327 | 3328 | [[package]] 3329 | name = "precis-profiles" 3330 | version = "0.1.12" 3331 | source = "registry+https://github.com/rust-lang/crates.io-index" 3332 | checksum = "dc4f67f78f50388f03494794766ba824a704db16fb5d400fe8d545fa7bc0d3f1" 3333 | dependencies = [ 3334 | "lazy_static", 3335 | "precis-core", 3336 | "precis-tools", 3337 | "unicode-normalization", 3338 | ] 3339 | 3340 | [[package]] 3341 | name = "precis-tools" 3342 | version = "0.1.9" 3343 | source = "registry+https://github.com/rust-lang/crates.io-index" 3344 | checksum = "6cc1eb2d5887ac7bfd2c0b745764db89edb84b856e4214e204ef48ef96d10c4a" 3345 | dependencies = [ 3346 | "lazy_static", 3347 | "regex", 3348 | "ucd-parse", 3349 | ] 3350 | 3351 | [[package]] 3352 | name = "primeorder" 3353 | version = "0.13.6" 3354 | source = "registry+https://github.com/rust-lang/crates.io-index" 3355 | checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" 3356 | dependencies = [ 3357 | "elliptic-curve", 3358 | ] 3359 | 3360 | [[package]] 3361 | name = "proc-macro-crate" 3362 | version = "3.2.0" 3363 | source = "registry+https://github.com/rust-lang/crates.io-index" 3364 | checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" 3365 | dependencies = [ 3366 | "toml_edit", 3367 | ] 3368 | 3369 | [[package]] 3370 | name = "proc-macro-error" 3371 | version = "0.4.12" 3372 | source = "registry+https://github.com/rust-lang/crates.io-index" 3373 | checksum = "18f33027081eba0a6d8aba6d1b1c3a3be58cbb12106341c2d5759fcd9b5277e7" 3374 | dependencies = [ 3375 | "proc-macro-error-attr", 3376 | "proc-macro2", 3377 | "quote", 3378 | "syn 1.0.109", 3379 | "version_check", 3380 | ] 3381 | 3382 | [[package]] 3383 | name = "proc-macro-error-attr" 3384 | version = "0.4.12" 3385 | source = "registry+https://github.com/rust-lang/crates.io-index" 3386 | checksum = "8a5b4b77fdb63c1eca72173d68d24501c54ab1269409f6b672c85deb18af69de" 3387 | dependencies = [ 3388 | "proc-macro2", 3389 | "quote", 3390 | "syn 1.0.109", 3391 | "syn-mid", 3392 | "version_check", 3393 | ] 3394 | 3395 | [[package]] 3396 | name = "proc-macro-hack" 3397 | version = "0.5.20+deprecated" 3398 | source = "registry+https://github.com/rust-lang/crates.io-index" 3399 | checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" 3400 | 3401 | [[package]] 3402 | name = "proc-macro2" 3403 | version = "1.0.93" 3404 | source = "registry+https://github.com/rust-lang/crates.io-index" 3405 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 3406 | dependencies = [ 3407 | "unicode-ident", 3408 | ] 3409 | 3410 | [[package]] 3411 | name = "quic-rpc" 3412 | version = "0.20.0" 3413 | source = "registry+https://github.com/rust-lang/crates.io-index" 3414 | checksum = "18bad98bd048264ceb1361ff9d77a031535d8c1e3fe8f12c6966ec825bf68eb7" 3415 | dependencies = [ 3416 | "anyhow", 3417 | "document-features", 3418 | "flume", 3419 | "futures-lite", 3420 | "futures-sink", 3421 | "futures-util", 3422 | "pin-project", 3423 | "serde", 3424 | "slab", 3425 | "smallvec", 3426 | "time", 3427 | "tokio", 3428 | "tokio-util", 3429 | "tracing", 3430 | ] 3431 | 3432 | [[package]] 3433 | name = "quic-rpc-derive" 3434 | version = "0.20.0" 3435 | source = "registry+https://github.com/rust-lang/crates.io-index" 3436 | checksum = "abf13f1bced5f2f2642d9d89a29d75f2d81ab34c4acfcb434c209d6094b9b2b7" 3437 | dependencies = [ 3438 | "proc-macro2", 3439 | "quic-rpc", 3440 | "quote", 3441 | "syn 1.0.109", 3442 | ] 3443 | 3444 | [[package]] 3445 | name = "quick-error" 3446 | version = "1.2.3" 3447 | source = "registry+https://github.com/rust-lang/crates.io-index" 3448 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 3449 | 3450 | [[package]] 3451 | name = "quinn" 3452 | version = "0.11.6" 3453 | source = "registry+https://github.com/rust-lang/crates.io-index" 3454 | checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" 3455 | dependencies = [ 3456 | "bytes", 3457 | "pin-project-lite", 3458 | "quinn-proto", 3459 | "quinn-udp", 3460 | "rustc-hash", 3461 | "rustls", 3462 | "socket2", 3463 | "thiserror 2.0.11", 3464 | "tokio", 3465 | "tracing", 3466 | ] 3467 | 3468 | [[package]] 3469 | name = "quinn-proto" 3470 | version = "0.11.9" 3471 | source = "registry+https://github.com/rust-lang/crates.io-index" 3472 | checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" 3473 | dependencies = [ 3474 | "bytes", 3475 | "getrandom 0.2.15", 3476 | "rand 0.8.5", 3477 | "ring", 3478 | "rustc-hash", 3479 | "rustls", 3480 | "rustls-pki-types", 3481 | "slab", 3482 | "thiserror 2.0.11", 3483 | "tinyvec", 3484 | "tracing", 3485 | "web-time", 3486 | ] 3487 | 3488 | [[package]] 3489 | name = "quinn-udp" 3490 | version = "0.5.10" 3491 | source = "registry+https://github.com/rust-lang/crates.io-index" 3492 | checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" 3493 | dependencies = [ 3494 | "cfg_aliases", 3495 | "libc", 3496 | "once_cell", 3497 | "socket2", 3498 | "tracing", 3499 | "windows-sys 0.59.0", 3500 | ] 3501 | 3502 | [[package]] 3503 | name = "quote" 3504 | version = "1.0.38" 3505 | source = "registry+https://github.com/rust-lang/crates.io-index" 3506 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 3507 | dependencies = [ 3508 | "proc-macro2", 3509 | ] 3510 | 3511 | [[package]] 3512 | name = "quoted-string-parser" 3513 | version = "0.1.0" 3514 | source = "registry+https://github.com/rust-lang/crates.io-index" 3515 | checksum = "0dc75379cdb451d001f1cb667a9f74e8b355e9df84cc5193513cbe62b96fc5e9" 3516 | dependencies = [ 3517 | "pest", 3518 | "pest_derive", 3519 | ] 3520 | 3521 | [[package]] 3522 | name = "r-efi" 3523 | version = "5.2.0" 3524 | source = "registry+https://github.com/rust-lang/crates.io-index" 3525 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 3526 | 3527 | [[package]] 3528 | name = "rand" 3529 | version = "0.8.5" 3530 | source = "registry+https://github.com/rust-lang/crates.io-index" 3531 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 3532 | dependencies = [ 3533 | "libc", 3534 | "rand_chacha 0.3.1", 3535 | "rand_core 0.6.4", 3536 | ] 3537 | 3538 | [[package]] 3539 | name = "rand" 3540 | version = "0.9.0" 3541 | source = "registry+https://github.com/rust-lang/crates.io-index" 3542 | checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" 3543 | dependencies = [ 3544 | "rand_chacha 0.9.0", 3545 | "rand_core 0.9.0", 3546 | "zerocopy 0.8.18", 3547 | ] 3548 | 3549 | [[package]] 3550 | name = "rand_chacha" 3551 | version = "0.3.1" 3552 | source = "registry+https://github.com/rust-lang/crates.io-index" 3553 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 3554 | dependencies = [ 3555 | "ppv-lite86", 3556 | "rand_core 0.6.4", 3557 | ] 3558 | 3559 | [[package]] 3560 | name = "rand_chacha" 3561 | version = "0.9.0" 3562 | source = "registry+https://github.com/rust-lang/crates.io-index" 3563 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 3564 | dependencies = [ 3565 | "ppv-lite86", 3566 | "rand_core 0.9.0", 3567 | ] 3568 | 3569 | [[package]] 3570 | name = "rand_core" 3571 | version = "0.6.4" 3572 | source = "registry+https://github.com/rust-lang/crates.io-index" 3573 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 3574 | dependencies = [ 3575 | "getrandom 0.2.15", 3576 | ] 3577 | 3578 | [[package]] 3579 | name = "rand_core" 3580 | version = "0.9.0" 3581 | source = "registry+https://github.com/rust-lang/crates.io-index" 3582 | checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" 3583 | dependencies = [ 3584 | "getrandom 0.3.3", 3585 | "zerocopy 0.8.18", 3586 | ] 3587 | 3588 | [[package]] 3589 | name = "range-collections" 3590 | version = "0.4.5" 3591 | source = "registry+https://github.com/rust-lang/crates.io-index" 3592 | checksum = "ca9edd21e2db51000ac63eccddabba622f826e631a60be7bade9bd6a76b69537" 3593 | dependencies = [ 3594 | "binary-merge", 3595 | "inplace-vec-builder", 3596 | "ref-cast", 3597 | "smallvec", 3598 | ] 3599 | 3600 | [[package]] 3601 | name = "rcgen" 3602 | version = "0.13.2" 3603 | source = "registry+https://github.com/rust-lang/crates.io-index" 3604 | checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" 3605 | dependencies = [ 3606 | "pem", 3607 | "ring", 3608 | "rustls-pki-types", 3609 | "time", 3610 | "yasna", 3611 | ] 3612 | 3613 | [[package]] 3614 | name = "redb" 3615 | version = "2.4.0" 3616 | source = "registry+https://github.com/rust-lang/crates.io-index" 3617 | checksum = "ea0a72cd7140de9fc3e318823b883abf819c20d478ec89ce880466dc2ef263c6" 3618 | dependencies = [ 3619 | "libc", 3620 | ] 3621 | 3622 | [[package]] 3623 | name = "redox_syscall" 3624 | version = "0.5.8" 3625 | source = "registry+https://github.com/rust-lang/crates.io-index" 3626 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 3627 | dependencies = [ 3628 | "bitflags 2.8.0", 3629 | ] 3630 | 3631 | [[package]] 3632 | name = "ref-cast" 3633 | version = "1.0.23" 3634 | source = "registry+https://github.com/rust-lang/crates.io-index" 3635 | checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" 3636 | dependencies = [ 3637 | "ref-cast-impl", 3638 | ] 3639 | 3640 | [[package]] 3641 | name = "ref-cast-impl" 3642 | version = "1.0.23" 3643 | source = "registry+https://github.com/rust-lang/crates.io-index" 3644 | checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" 3645 | dependencies = [ 3646 | "proc-macro2", 3647 | "quote", 3648 | "syn 2.0.98", 3649 | ] 3650 | 3651 | [[package]] 3652 | name = "reflink-copy" 3653 | version = "0.1.23" 3654 | source = "registry+https://github.com/rust-lang/crates.io-index" 3655 | checksum = "fbd3533fd4222b8337470456ea84d80436b4c91c53db51c372461d5f7e6eb0b4" 3656 | dependencies = [ 3657 | "cfg-if", 3658 | "libc", 3659 | "rustix", 3660 | "windows 0.59.0", 3661 | ] 3662 | 3663 | [[package]] 3664 | name = "regex" 3665 | version = "1.11.1" 3666 | source = "registry+https://github.com/rust-lang/crates.io-index" 3667 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 3668 | dependencies = [ 3669 | "aho-corasick", 3670 | "memchr", 3671 | "regex-automata 0.4.9", 3672 | "regex-syntax 0.8.5", 3673 | ] 3674 | 3675 | [[package]] 3676 | name = "regex-automata" 3677 | version = "0.1.10" 3678 | source = "registry+https://github.com/rust-lang/crates.io-index" 3679 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 3680 | dependencies = [ 3681 | "regex-syntax 0.6.29", 3682 | ] 3683 | 3684 | [[package]] 3685 | name = "regex-automata" 3686 | version = "0.4.9" 3687 | source = "registry+https://github.com/rust-lang/crates.io-index" 3688 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3689 | dependencies = [ 3690 | "aho-corasick", 3691 | "memchr", 3692 | "regex-syntax 0.8.5", 3693 | ] 3694 | 3695 | [[package]] 3696 | name = "regex-lite" 3697 | version = "0.1.6" 3698 | source = "registry+https://github.com/rust-lang/crates.io-index" 3699 | checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" 3700 | 3701 | [[package]] 3702 | name = "regex-syntax" 3703 | version = "0.6.29" 3704 | source = "registry+https://github.com/rust-lang/crates.io-index" 3705 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 3706 | 3707 | [[package]] 3708 | name = "regex-syntax" 3709 | version = "0.8.5" 3710 | source = "registry+https://github.com/rust-lang/crates.io-index" 3711 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3712 | 3713 | [[package]] 3714 | name = "reqwest" 3715 | version = "0.12.15" 3716 | source = "registry+https://github.com/rust-lang/crates.io-index" 3717 | checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" 3718 | dependencies = [ 3719 | "base64", 3720 | "bytes", 3721 | "futures-core", 3722 | "futures-util", 3723 | "http 1.2.0", 3724 | "http-body", 3725 | "http-body-util", 3726 | "hyper", 3727 | "hyper-rustls", 3728 | "hyper-util", 3729 | "ipnet", 3730 | "js-sys", 3731 | "log", 3732 | "mime", 3733 | "once_cell", 3734 | "percent-encoding", 3735 | "pin-project-lite", 3736 | "quinn", 3737 | "rustls", 3738 | "rustls-pemfile", 3739 | "rustls-pki-types", 3740 | "serde", 3741 | "serde_json", 3742 | "serde_urlencoded", 3743 | "sync_wrapper", 3744 | "tokio", 3745 | "tokio-rustls", 3746 | "tokio-util", 3747 | "tower", 3748 | "tower-service", 3749 | "url", 3750 | "wasm-bindgen", 3751 | "wasm-bindgen-futures", 3752 | "wasm-streams", 3753 | "web-sys", 3754 | "webpki-roots", 3755 | "windows-registry", 3756 | ] 3757 | 3758 | [[package]] 3759 | name = "resolv-conf" 3760 | version = "0.7.0" 3761 | source = "registry+https://github.com/rust-lang/crates.io-index" 3762 | checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" 3763 | dependencies = [ 3764 | "hostname", 3765 | "quick-error", 3766 | ] 3767 | 3768 | [[package]] 3769 | name = "rfc6979" 3770 | version = "0.4.0" 3771 | source = "registry+https://github.com/rust-lang/crates.io-index" 3772 | checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" 3773 | dependencies = [ 3774 | "hmac", 3775 | "subtle", 3776 | ] 3777 | 3778 | [[package]] 3779 | name = "ring" 3780 | version = "0.17.9" 3781 | source = "registry+https://github.com/rust-lang/crates.io-index" 3782 | checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24" 3783 | dependencies = [ 3784 | "cc", 3785 | "cfg-if", 3786 | "getrandom 0.2.15", 3787 | "libc", 3788 | "untrusted", 3789 | "windows-sys 0.52.0", 3790 | ] 3791 | 3792 | [[package]] 3793 | name = "rsa" 3794 | version = "0.9.8" 3795 | source = "registry+https://github.com/rust-lang/crates.io-index" 3796 | checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" 3797 | dependencies = [ 3798 | "const-oid", 3799 | "digest", 3800 | "num-bigint-dig", 3801 | "num-integer", 3802 | "num-traits", 3803 | "pkcs1", 3804 | "pkcs8", 3805 | "rand_core 0.6.4", 3806 | "sha2", 3807 | "signature", 3808 | "spki", 3809 | "subtle", 3810 | "zeroize", 3811 | ] 3812 | 3813 | [[package]] 3814 | name = "rustc-demangle" 3815 | version = "0.1.24" 3816 | source = "registry+https://github.com/rust-lang/crates.io-index" 3817 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 3818 | 3819 | [[package]] 3820 | name = "rustc-hash" 3821 | version = "2.1.1" 3822 | source = "registry+https://github.com/rust-lang/crates.io-index" 3823 | checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 3824 | 3825 | [[package]] 3826 | name = "rustc_version" 3827 | version = "0.4.1" 3828 | source = "registry+https://github.com/rust-lang/crates.io-index" 3829 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 3830 | dependencies = [ 3831 | "semver", 3832 | ] 3833 | 3834 | [[package]] 3835 | name = "rusticata-macros" 3836 | version = "4.1.0" 3837 | source = "registry+https://github.com/rust-lang/crates.io-index" 3838 | checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" 3839 | dependencies = [ 3840 | "nom", 3841 | ] 3842 | 3843 | [[package]] 3844 | name = "rustix" 3845 | version = "0.38.44" 3846 | source = "registry+https://github.com/rust-lang/crates.io-index" 3847 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 3848 | dependencies = [ 3849 | "bitflags 2.8.0", 3850 | "errno", 3851 | "libc", 3852 | "linux-raw-sys", 3853 | "windows-sys 0.59.0", 3854 | ] 3855 | 3856 | [[package]] 3857 | name = "rustls" 3858 | version = "0.23.23" 3859 | source = "registry+https://github.com/rust-lang/crates.io-index" 3860 | checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" 3861 | dependencies = [ 3862 | "log", 3863 | "once_cell", 3864 | "ring", 3865 | "rustls-pki-types", 3866 | "rustls-webpki", 3867 | "subtle", 3868 | "zeroize", 3869 | ] 3870 | 3871 | [[package]] 3872 | name = "rustls-pemfile" 3873 | version = "2.2.0" 3874 | source = "registry+https://github.com/rust-lang/crates.io-index" 3875 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 3876 | dependencies = [ 3877 | "rustls-pki-types", 3878 | ] 3879 | 3880 | [[package]] 3881 | name = "rustls-pki-types" 3882 | version = "1.11.0" 3883 | source = "registry+https://github.com/rust-lang/crates.io-index" 3884 | checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 3885 | dependencies = [ 3886 | "web-time", 3887 | ] 3888 | 3889 | [[package]] 3890 | name = "rustls-webpki" 3891 | version = "0.102.8" 3892 | source = "registry+https://github.com/rust-lang/crates.io-index" 3893 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 3894 | dependencies = [ 3895 | "ring", 3896 | "rustls-pki-types", 3897 | "untrusted", 3898 | ] 3899 | 3900 | [[package]] 3901 | name = "rustversion" 3902 | version = "1.0.19" 3903 | source = "registry+https://github.com/rust-lang/crates.io-index" 3904 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 3905 | 3906 | [[package]] 3907 | name = "ryu" 3908 | version = "1.0.19" 3909 | source = "registry+https://github.com/rust-lang/crates.io-index" 3910 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 3911 | 3912 | [[package]] 3913 | name = "salsa20" 3914 | version = "0.10.2" 3915 | source = "registry+https://github.com/rust-lang/crates.io-index" 3916 | checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" 3917 | dependencies = [ 3918 | "cipher", 3919 | ] 3920 | 3921 | [[package]] 3922 | name = "same-file" 3923 | version = "1.0.6" 3924 | source = "registry+https://github.com/rust-lang/crates.io-index" 3925 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 3926 | dependencies = [ 3927 | "winapi-util", 3928 | ] 3929 | 3930 | [[package]] 3931 | name = "scoped-tls" 3932 | version = "1.0.1" 3933 | source = "registry+https://github.com/rust-lang/crates.io-index" 3934 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 3935 | 3936 | [[package]] 3937 | name = "scopeguard" 3938 | version = "1.2.0" 3939 | source = "registry+https://github.com/rust-lang/crates.io-index" 3940 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 3941 | 3942 | [[package]] 3943 | name = "sec1" 3944 | version = "0.7.3" 3945 | source = "registry+https://github.com/rust-lang/crates.io-index" 3946 | checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 3947 | dependencies = [ 3948 | "base16ct", 3949 | "der", 3950 | "generic-array", 3951 | "pkcs8", 3952 | "subtle", 3953 | "zeroize", 3954 | ] 3955 | 3956 | [[package]] 3957 | name = "self_cell" 3958 | version = "1.1.0" 3959 | source = "registry+https://github.com/rust-lang/crates.io-index" 3960 | checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" 3961 | 3962 | [[package]] 3963 | name = "semver" 3964 | version = "1.0.25" 3965 | source = "registry+https://github.com/rust-lang/crates.io-index" 3966 | checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 3967 | 3968 | [[package]] 3969 | name = "send_wrapper" 3970 | version = "0.6.0" 3971 | source = "registry+https://github.com/rust-lang/crates.io-index" 3972 | checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 3973 | 3974 | [[package]] 3975 | name = "sendme" 3976 | version = "0.26.0" 3977 | dependencies = [ 3978 | "anyhow", 3979 | "arboard", 3980 | "async-channel", 3981 | "clap", 3982 | "console", 3983 | "data-encoding", 3984 | "derive_more", 3985 | "duct", 3986 | "futures-buffered", 3987 | "futures-lite", 3988 | "indicatif", 3989 | "iroh", 3990 | "iroh-blobs", 3991 | "iroh-io", 3992 | "n0-future", 3993 | "nix", 3994 | "num_cpus", 3995 | "rand 0.8.5", 3996 | "serde", 3997 | "serde_json", 3998 | "tempfile", 3999 | "tokio", 4000 | "tracing", 4001 | "tracing-subscriber", 4002 | "walkdir", 4003 | ] 4004 | 4005 | [[package]] 4006 | name = "serde" 4007 | version = "1.0.219" 4008 | source = "registry+https://github.com/rust-lang/crates.io-index" 4009 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 4010 | dependencies = [ 4011 | "serde_derive", 4012 | ] 4013 | 4014 | [[package]] 4015 | name = "serde-error" 4016 | version = "0.1.3" 4017 | source = "registry+https://github.com/rust-lang/crates.io-index" 4018 | checksum = "342110fb7a5d801060c885da03bf91bfa7c7ca936deafcc64bb6706375605d47" 4019 | dependencies = [ 4020 | "serde", 4021 | ] 4022 | 4023 | [[package]] 4024 | name = "serde_derive" 4025 | version = "1.0.219" 4026 | source = "registry+https://github.com/rust-lang/crates.io-index" 4027 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 4028 | dependencies = [ 4029 | "proc-macro2", 4030 | "quote", 4031 | "syn 2.0.98", 4032 | ] 4033 | 4034 | [[package]] 4035 | name = "serde_json" 4036 | version = "1.0.138" 4037 | source = "registry+https://github.com/rust-lang/crates.io-index" 4038 | checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" 4039 | dependencies = [ 4040 | "itoa", 4041 | "memchr", 4042 | "ryu", 4043 | "serde", 4044 | ] 4045 | 4046 | [[package]] 4047 | name = "serde_urlencoded" 4048 | version = "0.7.1" 4049 | source = "registry+https://github.com/rust-lang/crates.io-index" 4050 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 4051 | dependencies = [ 4052 | "form_urlencoded", 4053 | "itoa", 4054 | "ryu", 4055 | "serde", 4056 | ] 4057 | 4058 | [[package]] 4059 | name = "serdect" 4060 | version = "0.2.0" 4061 | source = "registry+https://github.com/rust-lang/crates.io-index" 4062 | checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" 4063 | dependencies = [ 4064 | "base16ct", 4065 | "serde", 4066 | ] 4067 | 4068 | [[package]] 4069 | name = "sha1" 4070 | version = "0.10.6" 4071 | source = "registry+https://github.com/rust-lang/crates.io-index" 4072 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 4073 | dependencies = [ 4074 | "cfg-if", 4075 | "cpufeatures", 4076 | "digest", 4077 | ] 4078 | 4079 | [[package]] 4080 | name = "sha1_smol" 4081 | version = "1.0.1" 4082 | source = "registry+https://github.com/rust-lang/crates.io-index" 4083 | checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" 4084 | 4085 | [[package]] 4086 | name = "sha2" 4087 | version = "0.10.8" 4088 | source = "registry+https://github.com/rust-lang/crates.io-index" 4089 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 4090 | dependencies = [ 4091 | "cfg-if", 4092 | "cpufeatures", 4093 | "digest", 4094 | ] 4095 | 4096 | [[package]] 4097 | name = "sharded-slab" 4098 | version = "0.1.7" 4099 | source = "registry+https://github.com/rust-lang/crates.io-index" 4100 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 4101 | dependencies = [ 4102 | "lazy_static", 4103 | ] 4104 | 4105 | [[package]] 4106 | name = "shared_child" 4107 | version = "1.0.1" 4108 | source = "registry+https://github.com/rust-lang/crates.io-index" 4109 | checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c" 4110 | dependencies = [ 4111 | "libc", 4112 | "windows-sys 0.59.0", 4113 | ] 4114 | 4115 | [[package]] 4116 | name = "shlex" 4117 | version = "1.3.0" 4118 | source = "registry+https://github.com/rust-lang/crates.io-index" 4119 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 4120 | 4121 | [[package]] 4122 | name = "signal-hook-registry" 4123 | version = "1.4.2" 4124 | source = "registry+https://github.com/rust-lang/crates.io-index" 4125 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 4126 | dependencies = [ 4127 | "libc", 4128 | ] 4129 | 4130 | [[package]] 4131 | name = "signature" 4132 | version = "2.2.0" 4133 | source = "registry+https://github.com/rust-lang/crates.io-index" 4134 | checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 4135 | dependencies = [ 4136 | "digest", 4137 | "rand_core 0.6.4", 4138 | ] 4139 | 4140 | [[package]] 4141 | name = "simd-adler32" 4142 | version = "0.3.7" 4143 | source = "registry+https://github.com/rust-lang/crates.io-index" 4144 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 4145 | 4146 | [[package]] 4147 | name = "simdutf8" 4148 | version = "0.1.5" 4149 | source = "registry+https://github.com/rust-lang/crates.io-index" 4150 | checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" 4151 | 4152 | [[package]] 4153 | name = "simple-dns" 4154 | version = "0.9.3" 4155 | source = "registry+https://github.com/rust-lang/crates.io-index" 4156 | checksum = "dee851d0e5e7af3721faea1843e8015e820a234f81fda3dea9247e15bac9a86a" 4157 | dependencies = [ 4158 | "bitflags 2.8.0", 4159 | ] 4160 | 4161 | [[package]] 4162 | name = "slab" 4163 | version = "0.4.9" 4164 | source = "registry+https://github.com/rust-lang/crates.io-index" 4165 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 4166 | dependencies = [ 4167 | "autocfg", 4168 | ] 4169 | 4170 | [[package]] 4171 | name = "smallvec" 4172 | version = "1.13.2" 4173 | source = "registry+https://github.com/rust-lang/crates.io-index" 4174 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 4175 | dependencies = [ 4176 | "serde", 4177 | ] 4178 | 4179 | [[package]] 4180 | name = "snafu" 4181 | version = "0.8.5" 4182 | source = "registry+https://github.com/rust-lang/crates.io-index" 4183 | checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" 4184 | dependencies = [ 4185 | "snafu-derive", 4186 | ] 4187 | 4188 | [[package]] 4189 | name = "snafu-derive" 4190 | version = "0.8.5" 4191 | source = "registry+https://github.com/rust-lang/crates.io-index" 4192 | checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" 4193 | dependencies = [ 4194 | "heck", 4195 | "proc-macro2", 4196 | "quote", 4197 | "syn 2.0.98", 4198 | ] 4199 | 4200 | [[package]] 4201 | name = "socket2" 4202 | version = "0.5.9" 4203 | source = "registry+https://github.com/rust-lang/crates.io-index" 4204 | checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 4205 | dependencies = [ 4206 | "libc", 4207 | "windows-sys 0.52.0", 4208 | ] 4209 | 4210 | [[package]] 4211 | name = "spin" 4212 | version = "0.9.8" 4213 | source = "registry+https://github.com/rust-lang/crates.io-index" 4214 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 4215 | dependencies = [ 4216 | "lock_api", 4217 | ] 4218 | 4219 | [[package]] 4220 | name = "spki" 4221 | version = "0.7.3" 4222 | source = "registry+https://github.com/rust-lang/crates.io-index" 4223 | checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 4224 | dependencies = [ 4225 | "base64ct", 4226 | "der", 4227 | ] 4228 | 4229 | [[package]] 4230 | name = "ssh-cipher" 4231 | version = "0.2.0" 4232 | source = "registry+https://github.com/rust-lang/crates.io-index" 4233 | checksum = "caac132742f0d33c3af65bfcde7f6aa8f62f0e991d80db99149eb9d44708784f" 4234 | dependencies = [ 4235 | "cipher", 4236 | "ssh-encoding", 4237 | ] 4238 | 4239 | [[package]] 4240 | name = "ssh-encoding" 4241 | version = "0.2.0" 4242 | source = "registry+https://github.com/rust-lang/crates.io-index" 4243 | checksum = "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" 4244 | dependencies = [ 4245 | "base64ct", 4246 | "pem-rfc7468", 4247 | "sha2", 4248 | ] 4249 | 4250 | [[package]] 4251 | name = "ssh-key" 4252 | version = "0.6.7" 4253 | source = "registry+https://github.com/rust-lang/crates.io-index" 4254 | checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" 4255 | dependencies = [ 4256 | "ed25519-dalek", 4257 | "p256", 4258 | "p384", 4259 | "p521", 4260 | "rand_core 0.6.4", 4261 | "rsa", 4262 | "sec1", 4263 | "sha2", 4264 | "signature", 4265 | "ssh-cipher", 4266 | "ssh-encoding", 4267 | "subtle", 4268 | "zeroize", 4269 | ] 4270 | 4271 | [[package]] 4272 | name = "stable_deref_trait" 4273 | version = "1.2.0" 4274 | source = "registry+https://github.com/rust-lang/crates.io-index" 4275 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 4276 | 4277 | [[package]] 4278 | name = "strsim" 4279 | version = "0.11.1" 4280 | source = "registry+https://github.com/rust-lang/crates.io-index" 4281 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 4282 | 4283 | [[package]] 4284 | name = "strum" 4285 | version = "0.26.3" 4286 | source = "registry+https://github.com/rust-lang/crates.io-index" 4287 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 4288 | dependencies = [ 4289 | "strum_macros", 4290 | ] 4291 | 4292 | [[package]] 4293 | name = "strum_macros" 4294 | version = "0.26.4" 4295 | source = "registry+https://github.com/rust-lang/crates.io-index" 4296 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 4297 | dependencies = [ 4298 | "heck", 4299 | "proc-macro2", 4300 | "quote", 4301 | "rustversion", 4302 | "syn 2.0.98", 4303 | ] 4304 | 4305 | [[package]] 4306 | name = "stun-rs" 4307 | version = "0.1.11" 4308 | source = "registry+https://github.com/rust-lang/crates.io-index" 4309 | checksum = "fb921f10397d5669e1af6455e9e2d367bf1f9cebcd6b1dd1dc50e19f6a9ac2ac" 4310 | dependencies = [ 4311 | "base64", 4312 | "bounded-integer", 4313 | "byteorder", 4314 | "crc", 4315 | "enumflags2", 4316 | "fallible-iterator", 4317 | "hmac-sha1", 4318 | "hmac-sha256", 4319 | "hostname-validator", 4320 | "lazy_static", 4321 | "md5", 4322 | "paste", 4323 | "precis-core", 4324 | "precis-profiles", 4325 | "quoted-string-parser", 4326 | "rand 0.9.0", 4327 | ] 4328 | 4329 | [[package]] 4330 | name = "subtle" 4331 | version = "2.6.1" 4332 | source = "registry+https://github.com/rust-lang/crates.io-index" 4333 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 4334 | 4335 | [[package]] 4336 | name = "surge-ping" 4337 | version = "0.8.1" 4338 | source = "registry+https://github.com/rust-lang/crates.io-index" 4339 | checksum = "efbf95ce4c7c5b311d2ce3f088af2b93edef0f09727fa50fbe03c7a979afce77" 4340 | dependencies = [ 4341 | "hex", 4342 | "parking_lot", 4343 | "pnet_packet", 4344 | "rand 0.8.5", 4345 | "socket2", 4346 | "thiserror 1.0.69", 4347 | "tokio", 4348 | "tracing", 4349 | ] 4350 | 4351 | [[package]] 4352 | name = "syn" 4353 | version = "1.0.109" 4354 | source = "registry+https://github.com/rust-lang/crates.io-index" 4355 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 4356 | dependencies = [ 4357 | "proc-macro2", 4358 | "quote", 4359 | "unicode-ident", 4360 | ] 4361 | 4362 | [[package]] 4363 | name = "syn" 4364 | version = "2.0.98" 4365 | source = "registry+https://github.com/rust-lang/crates.io-index" 4366 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 4367 | dependencies = [ 4368 | "proc-macro2", 4369 | "quote", 4370 | "unicode-ident", 4371 | ] 4372 | 4373 | [[package]] 4374 | name = "syn-mid" 4375 | version = "0.5.4" 4376 | source = "registry+https://github.com/rust-lang/crates.io-index" 4377 | checksum = "fea305d57546cc8cd04feb14b62ec84bf17f50e3f7b12560d7bfa9265f39d9ed" 4378 | dependencies = [ 4379 | "proc-macro2", 4380 | "quote", 4381 | "syn 1.0.109", 4382 | ] 4383 | 4384 | [[package]] 4385 | name = "sync_wrapper" 4386 | version = "1.0.2" 4387 | source = "registry+https://github.com/rust-lang/crates.io-index" 4388 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 4389 | dependencies = [ 4390 | "futures-core", 4391 | ] 4392 | 4393 | [[package]] 4394 | name = "synstructure" 4395 | version = "0.13.1" 4396 | source = "registry+https://github.com/rust-lang/crates.io-index" 4397 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 4398 | dependencies = [ 4399 | "proc-macro2", 4400 | "quote", 4401 | "syn 2.0.98", 4402 | ] 4403 | 4404 | [[package]] 4405 | name = "system-configuration" 4406 | version = "0.6.1" 4407 | source = "registry+https://github.com/rust-lang/crates.io-index" 4408 | checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 4409 | dependencies = [ 4410 | "bitflags 2.8.0", 4411 | "core-foundation", 4412 | "system-configuration-sys", 4413 | ] 4414 | 4415 | [[package]] 4416 | name = "system-configuration-sys" 4417 | version = "0.6.0" 4418 | source = "registry+https://github.com/rust-lang/crates.io-index" 4419 | checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 4420 | dependencies = [ 4421 | "core-foundation-sys", 4422 | "libc", 4423 | ] 4424 | 4425 | [[package]] 4426 | name = "tagptr" 4427 | version = "0.2.0" 4428 | source = "registry+https://github.com/rust-lang/crates.io-index" 4429 | checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" 4430 | 4431 | [[package]] 4432 | name = "tempfile" 4433 | version = "3.16.0" 4434 | source = "registry+https://github.com/rust-lang/crates.io-index" 4435 | checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" 4436 | dependencies = [ 4437 | "cfg-if", 4438 | "fastrand", 4439 | "getrandom 0.3.3", 4440 | "once_cell", 4441 | "rustix", 4442 | "windows-sys 0.59.0", 4443 | ] 4444 | 4445 | [[package]] 4446 | name = "thiserror" 4447 | version = "1.0.69" 4448 | source = "registry+https://github.com/rust-lang/crates.io-index" 4449 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 4450 | dependencies = [ 4451 | "thiserror-impl 1.0.69", 4452 | ] 4453 | 4454 | [[package]] 4455 | name = "thiserror" 4456 | version = "2.0.11" 4457 | source = "registry+https://github.com/rust-lang/crates.io-index" 4458 | checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" 4459 | dependencies = [ 4460 | "thiserror-impl 2.0.11", 4461 | ] 4462 | 4463 | [[package]] 4464 | name = "thiserror-impl" 4465 | version = "1.0.69" 4466 | source = "registry+https://github.com/rust-lang/crates.io-index" 4467 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 4468 | dependencies = [ 4469 | "proc-macro2", 4470 | "quote", 4471 | "syn 2.0.98", 4472 | ] 4473 | 4474 | [[package]] 4475 | name = "thiserror-impl" 4476 | version = "2.0.11" 4477 | source = "registry+https://github.com/rust-lang/crates.io-index" 4478 | checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" 4479 | dependencies = [ 4480 | "proc-macro2", 4481 | "quote", 4482 | "syn 2.0.98", 4483 | ] 4484 | 4485 | [[package]] 4486 | name = "thread_local" 4487 | version = "1.1.8" 4488 | source = "registry+https://github.com/rust-lang/crates.io-index" 4489 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 4490 | dependencies = [ 4491 | "cfg-if", 4492 | "once_cell", 4493 | ] 4494 | 4495 | [[package]] 4496 | name = "tiff" 4497 | version = "0.9.1" 4498 | source = "registry+https://github.com/rust-lang/crates.io-index" 4499 | checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" 4500 | dependencies = [ 4501 | "flate2", 4502 | "jpeg-decoder", 4503 | "weezl", 4504 | ] 4505 | 4506 | [[package]] 4507 | name = "time" 4508 | version = "0.3.37" 4509 | source = "registry+https://github.com/rust-lang/crates.io-index" 4510 | checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" 4511 | dependencies = [ 4512 | "deranged", 4513 | "itoa", 4514 | "js-sys", 4515 | "num-conv", 4516 | "powerfmt", 4517 | "serde", 4518 | "time-core", 4519 | "time-macros", 4520 | ] 4521 | 4522 | [[package]] 4523 | name = "time-core" 4524 | version = "0.1.2" 4525 | source = "registry+https://github.com/rust-lang/crates.io-index" 4526 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 4527 | 4528 | [[package]] 4529 | name = "time-macros" 4530 | version = "0.2.19" 4531 | source = "registry+https://github.com/rust-lang/crates.io-index" 4532 | checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" 4533 | dependencies = [ 4534 | "num-conv", 4535 | "time-core", 4536 | ] 4537 | 4538 | [[package]] 4539 | name = "tinystr" 4540 | version = "0.7.6" 4541 | source = "registry+https://github.com/rust-lang/crates.io-index" 4542 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 4543 | dependencies = [ 4544 | "displaydoc", 4545 | "zerovec", 4546 | ] 4547 | 4548 | [[package]] 4549 | name = "tinyvec" 4550 | version = "1.8.1" 4551 | source = "registry+https://github.com/rust-lang/crates.io-index" 4552 | checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" 4553 | dependencies = [ 4554 | "tinyvec_macros", 4555 | ] 4556 | 4557 | [[package]] 4558 | name = "tinyvec_macros" 4559 | version = "0.1.1" 4560 | source = "registry+https://github.com/rust-lang/crates.io-index" 4561 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 4562 | 4563 | [[package]] 4564 | name = "tokio" 4565 | version = "1.45.0" 4566 | source = "registry+https://github.com/rust-lang/crates.io-index" 4567 | checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" 4568 | dependencies = [ 4569 | "backtrace", 4570 | "bytes", 4571 | "libc", 4572 | "mio", 4573 | "parking_lot", 4574 | "pin-project-lite", 4575 | "signal-hook-registry", 4576 | "socket2", 4577 | "tokio-macros", 4578 | "windows-sys 0.52.0", 4579 | ] 4580 | 4581 | [[package]] 4582 | name = "tokio-macros" 4583 | version = "2.5.0" 4584 | source = "registry+https://github.com/rust-lang/crates.io-index" 4585 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 4586 | dependencies = [ 4587 | "proc-macro2", 4588 | "quote", 4589 | "syn 2.0.98", 4590 | ] 4591 | 4592 | [[package]] 4593 | name = "tokio-rustls" 4594 | version = "0.26.1" 4595 | source = "registry+https://github.com/rust-lang/crates.io-index" 4596 | checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" 4597 | dependencies = [ 4598 | "rustls", 4599 | "tokio", 4600 | ] 4601 | 4602 | [[package]] 4603 | name = "tokio-stream" 4604 | version = "0.1.17" 4605 | source = "registry+https://github.com/rust-lang/crates.io-index" 4606 | checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 4607 | dependencies = [ 4608 | "futures-core", 4609 | "pin-project-lite", 4610 | "tokio", 4611 | "tokio-util", 4612 | ] 4613 | 4614 | [[package]] 4615 | name = "tokio-util" 4616 | version = "0.7.15" 4617 | source = "registry+https://github.com/rust-lang/crates.io-index" 4618 | checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 4619 | dependencies = [ 4620 | "bytes", 4621 | "futures-core", 4622 | "futures-sink", 4623 | "futures-util", 4624 | "hashbrown 0.15.2", 4625 | "pin-project-lite", 4626 | "slab", 4627 | "tokio", 4628 | ] 4629 | 4630 | [[package]] 4631 | name = "tokio-websockets" 4632 | version = "0.11.4" 4633 | source = "registry+https://github.com/rust-lang/crates.io-index" 4634 | checksum = "9fcaf159b4e7a376b05b5bfd77bfd38f3324f5fce751b4213bfc7eaa47affb4e" 4635 | dependencies = [ 4636 | "base64", 4637 | "bytes", 4638 | "futures-core", 4639 | "futures-sink", 4640 | "getrandom 0.3.3", 4641 | "http 1.2.0", 4642 | "httparse", 4643 | "rand 0.9.0", 4644 | "ring", 4645 | "rustls-pki-types", 4646 | "simdutf8", 4647 | "tokio", 4648 | "tokio-rustls", 4649 | "tokio-util", 4650 | ] 4651 | 4652 | [[package]] 4653 | name = "toml_datetime" 4654 | version = "0.6.8" 4655 | source = "registry+https://github.com/rust-lang/crates.io-index" 4656 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 4657 | 4658 | [[package]] 4659 | name = "toml_edit" 4660 | version = "0.22.24" 4661 | source = "registry+https://github.com/rust-lang/crates.io-index" 4662 | checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" 4663 | dependencies = [ 4664 | "indexmap", 4665 | "toml_datetime", 4666 | "winnow", 4667 | ] 4668 | 4669 | [[package]] 4670 | name = "tower" 4671 | version = "0.5.2" 4672 | source = "registry+https://github.com/rust-lang/crates.io-index" 4673 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 4674 | dependencies = [ 4675 | "futures-core", 4676 | "futures-util", 4677 | "pin-project-lite", 4678 | "sync_wrapper", 4679 | "tokio", 4680 | "tower-layer", 4681 | "tower-service", 4682 | ] 4683 | 4684 | [[package]] 4685 | name = "tower-layer" 4686 | version = "0.3.3" 4687 | source = "registry+https://github.com/rust-lang/crates.io-index" 4688 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 4689 | 4690 | [[package]] 4691 | name = "tower-service" 4692 | version = "0.3.3" 4693 | source = "registry+https://github.com/rust-lang/crates.io-index" 4694 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 4695 | 4696 | [[package]] 4697 | name = "tracing" 4698 | version = "0.1.41" 4699 | source = "registry+https://github.com/rust-lang/crates.io-index" 4700 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 4701 | dependencies = [ 4702 | "log", 4703 | "pin-project-lite", 4704 | "tracing-attributes", 4705 | "tracing-core", 4706 | ] 4707 | 4708 | [[package]] 4709 | name = "tracing-attributes" 4710 | version = "0.1.28" 4711 | source = "registry+https://github.com/rust-lang/crates.io-index" 4712 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 4713 | dependencies = [ 4714 | "proc-macro2", 4715 | "quote", 4716 | "syn 2.0.98", 4717 | ] 4718 | 4719 | [[package]] 4720 | name = "tracing-core" 4721 | version = "0.1.33" 4722 | source = "registry+https://github.com/rust-lang/crates.io-index" 4723 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 4724 | dependencies = [ 4725 | "once_cell", 4726 | "valuable", 4727 | ] 4728 | 4729 | [[package]] 4730 | name = "tracing-futures" 4731 | version = "0.2.5" 4732 | source = "registry+https://github.com/rust-lang/crates.io-index" 4733 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 4734 | dependencies = [ 4735 | "pin-project", 4736 | "tracing", 4737 | ] 4738 | 4739 | [[package]] 4740 | name = "tracing-log" 4741 | version = "0.2.0" 4742 | source = "registry+https://github.com/rust-lang/crates.io-index" 4743 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 4744 | dependencies = [ 4745 | "log", 4746 | "once_cell", 4747 | "tracing-core", 4748 | ] 4749 | 4750 | [[package]] 4751 | name = "tracing-subscriber" 4752 | version = "0.3.19" 4753 | source = "registry+https://github.com/rust-lang/crates.io-index" 4754 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 4755 | dependencies = [ 4756 | "matchers", 4757 | "nu-ansi-term", 4758 | "once_cell", 4759 | "regex", 4760 | "sharded-slab", 4761 | "smallvec", 4762 | "thread_local", 4763 | "tracing", 4764 | "tracing-core", 4765 | "tracing-log", 4766 | ] 4767 | 4768 | [[package]] 4769 | name = "tracing-test" 4770 | version = "0.2.5" 4771 | source = "registry+https://github.com/rust-lang/crates.io-index" 4772 | checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" 4773 | dependencies = [ 4774 | "tracing-core", 4775 | "tracing-subscriber", 4776 | "tracing-test-macro", 4777 | ] 4778 | 4779 | [[package]] 4780 | name = "tracing-test-macro" 4781 | version = "0.2.5" 4782 | source = "registry+https://github.com/rust-lang/crates.io-index" 4783 | checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" 4784 | dependencies = [ 4785 | "quote", 4786 | "syn 2.0.98", 4787 | ] 4788 | 4789 | [[package]] 4790 | name = "try-lock" 4791 | version = "0.2.5" 4792 | source = "registry+https://github.com/rust-lang/crates.io-index" 4793 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 4794 | 4795 | [[package]] 4796 | name = "typenum" 4797 | version = "1.17.0" 4798 | source = "registry+https://github.com/rust-lang/crates.io-index" 4799 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 4800 | 4801 | [[package]] 4802 | name = "ucd-parse" 4803 | version = "0.1.13" 4804 | source = "registry+https://github.com/rust-lang/crates.io-index" 4805 | checksum = "c06ff81122fcbf4df4c1660b15f7e3336058e7aec14437c9f85c6b31a0f279b9" 4806 | dependencies = [ 4807 | "regex-lite", 4808 | ] 4809 | 4810 | [[package]] 4811 | name = "ucd-trie" 4812 | version = "0.1.7" 4813 | source = "registry+https://github.com/rust-lang/crates.io-index" 4814 | checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 4815 | 4816 | [[package]] 4817 | name = "unicode-ident" 4818 | version = "1.0.16" 4819 | source = "registry+https://github.com/rust-lang/crates.io-index" 4820 | checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" 4821 | 4822 | [[package]] 4823 | name = "unicode-normalization" 4824 | version = "0.1.24" 4825 | source = "registry+https://github.com/rust-lang/crates.io-index" 4826 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 4827 | dependencies = [ 4828 | "tinyvec", 4829 | ] 4830 | 4831 | [[package]] 4832 | name = "unicode-width" 4833 | version = "0.2.0" 4834 | source = "registry+https://github.com/rust-lang/crates.io-index" 4835 | checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 4836 | 4837 | [[package]] 4838 | name = "unicode-xid" 4839 | version = "0.2.6" 4840 | source = "registry+https://github.com/rust-lang/crates.io-index" 4841 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 4842 | 4843 | [[package]] 4844 | name = "universal-hash" 4845 | version = "0.5.1" 4846 | source = "registry+https://github.com/rust-lang/crates.io-index" 4847 | checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" 4848 | dependencies = [ 4849 | "crypto-common", 4850 | "subtle", 4851 | ] 4852 | 4853 | [[package]] 4854 | name = "untrusted" 4855 | version = "0.9.0" 4856 | source = "registry+https://github.com/rust-lang/crates.io-index" 4857 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 4858 | 4859 | [[package]] 4860 | name = "url" 4861 | version = "2.5.4" 4862 | source = "registry+https://github.com/rust-lang/crates.io-index" 4863 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 4864 | dependencies = [ 4865 | "form_urlencoded", 4866 | "idna", 4867 | "percent-encoding", 4868 | "serde", 4869 | ] 4870 | 4871 | [[package]] 4872 | name = "utf16_iter" 4873 | version = "1.0.5" 4874 | source = "registry+https://github.com/rust-lang/crates.io-index" 4875 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 4876 | 4877 | [[package]] 4878 | name = "utf8_iter" 4879 | version = "1.0.4" 4880 | source = "registry+https://github.com/rust-lang/crates.io-index" 4881 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 4882 | 4883 | [[package]] 4884 | name = "utf8parse" 4885 | version = "0.2.2" 4886 | source = "registry+https://github.com/rust-lang/crates.io-index" 4887 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 4888 | 4889 | [[package]] 4890 | name = "uuid" 4891 | version = "1.13.1" 4892 | source = "registry+https://github.com/rust-lang/crates.io-index" 4893 | checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" 4894 | dependencies = [ 4895 | "getrandom 0.3.3", 4896 | ] 4897 | 4898 | [[package]] 4899 | name = "valuable" 4900 | version = "0.1.1" 4901 | source = "registry+https://github.com/rust-lang/crates.io-index" 4902 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 4903 | 4904 | [[package]] 4905 | name = "version_check" 4906 | version = "0.9.5" 4907 | source = "registry+https://github.com/rust-lang/crates.io-index" 4908 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 4909 | 4910 | [[package]] 4911 | name = "walkdir" 4912 | version = "2.5.0" 4913 | source = "registry+https://github.com/rust-lang/crates.io-index" 4914 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 4915 | dependencies = [ 4916 | "same-file", 4917 | "winapi-util", 4918 | ] 4919 | 4920 | [[package]] 4921 | name = "want" 4922 | version = "0.3.1" 4923 | source = "registry+https://github.com/rust-lang/crates.io-index" 4924 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 4925 | dependencies = [ 4926 | "try-lock", 4927 | ] 4928 | 4929 | [[package]] 4930 | name = "wasi" 4931 | version = "0.11.0+wasi-snapshot-preview1" 4932 | source = "registry+https://github.com/rust-lang/crates.io-index" 4933 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 4934 | 4935 | [[package]] 4936 | name = "wasi" 4937 | version = "0.14.2+wasi-0.2.4" 4938 | source = "registry+https://github.com/rust-lang/crates.io-index" 4939 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 4940 | dependencies = [ 4941 | "wit-bindgen-rt", 4942 | ] 4943 | 4944 | [[package]] 4945 | name = "wasm-bindgen" 4946 | version = "0.2.100" 4947 | source = "registry+https://github.com/rust-lang/crates.io-index" 4948 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 4949 | dependencies = [ 4950 | "cfg-if", 4951 | "once_cell", 4952 | "rustversion", 4953 | "wasm-bindgen-macro", 4954 | ] 4955 | 4956 | [[package]] 4957 | name = "wasm-bindgen-backend" 4958 | version = "0.2.100" 4959 | source = "registry+https://github.com/rust-lang/crates.io-index" 4960 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 4961 | dependencies = [ 4962 | "bumpalo", 4963 | "log", 4964 | "proc-macro2", 4965 | "quote", 4966 | "syn 2.0.98", 4967 | "wasm-bindgen-shared", 4968 | ] 4969 | 4970 | [[package]] 4971 | name = "wasm-bindgen-futures" 4972 | version = "0.4.50" 4973 | source = "registry+https://github.com/rust-lang/crates.io-index" 4974 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 4975 | dependencies = [ 4976 | "cfg-if", 4977 | "js-sys", 4978 | "once_cell", 4979 | "wasm-bindgen", 4980 | "web-sys", 4981 | ] 4982 | 4983 | [[package]] 4984 | name = "wasm-bindgen-macro" 4985 | version = "0.2.100" 4986 | source = "registry+https://github.com/rust-lang/crates.io-index" 4987 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 4988 | dependencies = [ 4989 | "quote", 4990 | "wasm-bindgen-macro-support", 4991 | ] 4992 | 4993 | [[package]] 4994 | name = "wasm-bindgen-macro-support" 4995 | version = "0.2.100" 4996 | source = "registry+https://github.com/rust-lang/crates.io-index" 4997 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 4998 | dependencies = [ 4999 | "proc-macro2", 5000 | "quote", 5001 | "syn 2.0.98", 5002 | "wasm-bindgen-backend", 5003 | "wasm-bindgen-shared", 5004 | ] 5005 | 5006 | [[package]] 5007 | name = "wasm-bindgen-shared" 5008 | version = "0.2.100" 5009 | source = "registry+https://github.com/rust-lang/crates.io-index" 5010 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 5011 | dependencies = [ 5012 | "unicode-ident", 5013 | ] 5014 | 5015 | [[package]] 5016 | name = "wasm-streams" 5017 | version = "0.4.2" 5018 | source = "registry+https://github.com/rust-lang/crates.io-index" 5019 | checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" 5020 | dependencies = [ 5021 | "futures-util", 5022 | "js-sys", 5023 | "wasm-bindgen", 5024 | "wasm-bindgen-futures", 5025 | "web-sys", 5026 | ] 5027 | 5028 | [[package]] 5029 | name = "web-sys" 5030 | version = "0.3.77" 5031 | source = "registry+https://github.com/rust-lang/crates.io-index" 5032 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 5033 | dependencies = [ 5034 | "js-sys", 5035 | "wasm-bindgen", 5036 | ] 5037 | 5038 | [[package]] 5039 | name = "web-time" 5040 | version = "1.1.0" 5041 | source = "registry+https://github.com/rust-lang/crates.io-index" 5042 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 5043 | dependencies = [ 5044 | "js-sys", 5045 | "wasm-bindgen", 5046 | ] 5047 | 5048 | [[package]] 5049 | name = "webpki-roots" 5050 | version = "0.26.8" 5051 | source = "registry+https://github.com/rust-lang/crates.io-index" 5052 | checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" 5053 | dependencies = [ 5054 | "rustls-pki-types", 5055 | ] 5056 | 5057 | [[package]] 5058 | name = "weezl" 5059 | version = "0.1.8" 5060 | source = "registry+https://github.com/rust-lang/crates.io-index" 5061 | checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" 5062 | 5063 | [[package]] 5064 | name = "widestring" 5065 | version = "1.1.0" 5066 | source = "registry+https://github.com/rust-lang/crates.io-index" 5067 | checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" 5068 | 5069 | [[package]] 5070 | name = "winapi" 5071 | version = "0.3.9" 5072 | source = "registry+https://github.com/rust-lang/crates.io-index" 5073 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 5074 | dependencies = [ 5075 | "winapi-i686-pc-windows-gnu", 5076 | "winapi-x86_64-pc-windows-gnu", 5077 | ] 5078 | 5079 | [[package]] 5080 | name = "winapi-i686-pc-windows-gnu" 5081 | version = "0.4.0" 5082 | source = "registry+https://github.com/rust-lang/crates.io-index" 5083 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 5084 | 5085 | [[package]] 5086 | name = "winapi-util" 5087 | version = "0.1.9" 5088 | source = "registry+https://github.com/rust-lang/crates.io-index" 5089 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 5090 | dependencies = [ 5091 | "windows-sys 0.59.0", 5092 | ] 5093 | 5094 | [[package]] 5095 | name = "winapi-x86_64-pc-windows-gnu" 5096 | version = "0.4.0" 5097 | source = "registry+https://github.com/rust-lang/crates.io-index" 5098 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 5099 | 5100 | [[package]] 5101 | name = "windows" 5102 | version = "0.48.0" 5103 | source = "registry+https://github.com/rust-lang/crates.io-index" 5104 | checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" 5105 | dependencies = [ 5106 | "windows-targets 0.48.5", 5107 | ] 5108 | 5109 | [[package]] 5110 | name = "windows" 5111 | version = "0.58.0" 5112 | source = "registry+https://github.com/rust-lang/crates.io-index" 5113 | checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" 5114 | dependencies = [ 5115 | "windows-core 0.58.0", 5116 | "windows-targets 0.52.6", 5117 | ] 5118 | 5119 | [[package]] 5120 | name = "windows" 5121 | version = "0.59.0" 5122 | source = "registry+https://github.com/rust-lang/crates.io-index" 5123 | checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1" 5124 | dependencies = [ 5125 | "windows-core 0.59.0", 5126 | "windows-targets 0.53.0", 5127 | ] 5128 | 5129 | [[package]] 5130 | name = "windows-core" 5131 | version = "0.52.0" 5132 | source = "registry+https://github.com/rust-lang/crates.io-index" 5133 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 5134 | dependencies = [ 5135 | "windows-targets 0.52.6", 5136 | ] 5137 | 5138 | [[package]] 5139 | name = "windows-core" 5140 | version = "0.58.0" 5141 | source = "registry+https://github.com/rust-lang/crates.io-index" 5142 | checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" 5143 | dependencies = [ 5144 | "windows-implement 0.58.0", 5145 | "windows-interface 0.58.0", 5146 | "windows-result 0.2.0", 5147 | "windows-strings 0.1.0", 5148 | "windows-targets 0.52.6", 5149 | ] 5150 | 5151 | [[package]] 5152 | name = "windows-core" 5153 | version = "0.59.0" 5154 | source = "registry+https://github.com/rust-lang/crates.io-index" 5155 | checksum = "810ce18ed2112484b0d4e15d022e5f598113e220c53e373fb31e67e21670c1ce" 5156 | dependencies = [ 5157 | "windows-implement 0.59.0", 5158 | "windows-interface 0.59.0", 5159 | "windows-result 0.3.0", 5160 | "windows-strings 0.3.0", 5161 | "windows-targets 0.53.0", 5162 | ] 5163 | 5164 | [[package]] 5165 | name = "windows-implement" 5166 | version = "0.58.0" 5167 | source = "registry+https://github.com/rust-lang/crates.io-index" 5168 | checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" 5169 | dependencies = [ 5170 | "proc-macro2", 5171 | "quote", 5172 | "syn 2.0.98", 5173 | ] 5174 | 5175 | [[package]] 5176 | name = "windows-implement" 5177 | version = "0.59.0" 5178 | source = "registry+https://github.com/rust-lang/crates.io-index" 5179 | checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1" 5180 | dependencies = [ 5181 | "proc-macro2", 5182 | "quote", 5183 | "syn 2.0.98", 5184 | ] 5185 | 5186 | [[package]] 5187 | name = "windows-interface" 5188 | version = "0.58.0" 5189 | source = "registry+https://github.com/rust-lang/crates.io-index" 5190 | checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" 5191 | dependencies = [ 5192 | "proc-macro2", 5193 | "quote", 5194 | "syn 2.0.98", 5195 | ] 5196 | 5197 | [[package]] 5198 | name = "windows-interface" 5199 | version = "0.59.0" 5200 | source = "registry+https://github.com/rust-lang/crates.io-index" 5201 | checksum = "cb26fd936d991781ea39e87c3a27285081e3c0da5ca0fcbc02d368cc6f52ff01" 5202 | dependencies = [ 5203 | "proc-macro2", 5204 | "quote", 5205 | "syn 2.0.98", 5206 | ] 5207 | 5208 | [[package]] 5209 | name = "windows-registry" 5210 | version = "0.4.0" 5211 | source = "registry+https://github.com/rust-lang/crates.io-index" 5212 | checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" 5213 | dependencies = [ 5214 | "windows-result 0.3.0", 5215 | "windows-strings 0.3.0", 5216 | "windows-targets 0.53.0", 5217 | ] 5218 | 5219 | [[package]] 5220 | name = "windows-result" 5221 | version = "0.2.0" 5222 | source = "registry+https://github.com/rust-lang/crates.io-index" 5223 | checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 5224 | dependencies = [ 5225 | "windows-targets 0.52.6", 5226 | ] 5227 | 5228 | [[package]] 5229 | name = "windows-result" 5230 | version = "0.3.0" 5231 | source = "registry+https://github.com/rust-lang/crates.io-index" 5232 | checksum = "d08106ce80268c4067c0571ca55a9b4e9516518eaa1a1fe9b37ca403ae1d1a34" 5233 | dependencies = [ 5234 | "windows-targets 0.53.0", 5235 | ] 5236 | 5237 | [[package]] 5238 | name = "windows-strings" 5239 | version = "0.1.0" 5240 | source = "registry+https://github.com/rust-lang/crates.io-index" 5241 | checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 5242 | dependencies = [ 5243 | "windows-result 0.2.0", 5244 | "windows-targets 0.52.6", 5245 | ] 5246 | 5247 | [[package]] 5248 | name = "windows-strings" 5249 | version = "0.3.0" 5250 | source = "registry+https://github.com/rust-lang/crates.io-index" 5251 | checksum = "b888f919960b42ea4e11c2f408fadb55f78a9f236d5eef084103c8ce52893491" 5252 | dependencies = [ 5253 | "windows-targets 0.53.0", 5254 | ] 5255 | 5256 | [[package]] 5257 | name = "windows-sys" 5258 | version = "0.48.0" 5259 | source = "registry+https://github.com/rust-lang/crates.io-index" 5260 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 5261 | dependencies = [ 5262 | "windows-targets 0.48.5", 5263 | ] 5264 | 5265 | [[package]] 5266 | name = "windows-sys" 5267 | version = "0.52.0" 5268 | source = "registry+https://github.com/rust-lang/crates.io-index" 5269 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 5270 | dependencies = [ 5271 | "windows-targets 0.52.6", 5272 | ] 5273 | 5274 | [[package]] 5275 | name = "windows-sys" 5276 | version = "0.59.0" 5277 | source = "registry+https://github.com/rust-lang/crates.io-index" 5278 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 5279 | dependencies = [ 5280 | "windows-targets 0.52.6", 5281 | ] 5282 | 5283 | [[package]] 5284 | name = "windows-targets" 5285 | version = "0.48.5" 5286 | source = "registry+https://github.com/rust-lang/crates.io-index" 5287 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 5288 | dependencies = [ 5289 | "windows_aarch64_gnullvm 0.48.5", 5290 | "windows_aarch64_msvc 0.48.5", 5291 | "windows_i686_gnu 0.48.5", 5292 | "windows_i686_msvc 0.48.5", 5293 | "windows_x86_64_gnu 0.48.5", 5294 | "windows_x86_64_gnullvm 0.48.5", 5295 | "windows_x86_64_msvc 0.48.5", 5296 | ] 5297 | 5298 | [[package]] 5299 | name = "windows-targets" 5300 | version = "0.52.6" 5301 | source = "registry+https://github.com/rust-lang/crates.io-index" 5302 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 5303 | dependencies = [ 5304 | "windows_aarch64_gnullvm 0.52.6", 5305 | "windows_aarch64_msvc 0.52.6", 5306 | "windows_i686_gnu 0.52.6", 5307 | "windows_i686_gnullvm 0.52.6", 5308 | "windows_i686_msvc 0.52.6", 5309 | "windows_x86_64_gnu 0.52.6", 5310 | "windows_x86_64_gnullvm 0.52.6", 5311 | "windows_x86_64_msvc 0.52.6", 5312 | ] 5313 | 5314 | [[package]] 5315 | name = "windows-targets" 5316 | version = "0.53.0" 5317 | source = "registry+https://github.com/rust-lang/crates.io-index" 5318 | checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" 5319 | dependencies = [ 5320 | "windows_aarch64_gnullvm 0.53.0", 5321 | "windows_aarch64_msvc 0.53.0", 5322 | "windows_i686_gnu 0.53.0", 5323 | "windows_i686_gnullvm 0.53.0", 5324 | "windows_i686_msvc 0.53.0", 5325 | "windows_x86_64_gnu 0.53.0", 5326 | "windows_x86_64_gnullvm 0.53.0", 5327 | "windows_x86_64_msvc 0.53.0", 5328 | ] 5329 | 5330 | [[package]] 5331 | name = "windows_aarch64_gnullvm" 5332 | version = "0.48.5" 5333 | source = "registry+https://github.com/rust-lang/crates.io-index" 5334 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 5335 | 5336 | [[package]] 5337 | name = "windows_aarch64_gnullvm" 5338 | version = "0.52.6" 5339 | source = "registry+https://github.com/rust-lang/crates.io-index" 5340 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 5341 | 5342 | [[package]] 5343 | name = "windows_aarch64_gnullvm" 5344 | version = "0.53.0" 5345 | source = "registry+https://github.com/rust-lang/crates.io-index" 5346 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 5347 | 5348 | [[package]] 5349 | name = "windows_aarch64_msvc" 5350 | version = "0.48.5" 5351 | source = "registry+https://github.com/rust-lang/crates.io-index" 5352 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 5353 | 5354 | [[package]] 5355 | name = "windows_aarch64_msvc" 5356 | version = "0.52.6" 5357 | source = "registry+https://github.com/rust-lang/crates.io-index" 5358 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 5359 | 5360 | [[package]] 5361 | name = "windows_aarch64_msvc" 5362 | version = "0.53.0" 5363 | source = "registry+https://github.com/rust-lang/crates.io-index" 5364 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 5365 | 5366 | [[package]] 5367 | name = "windows_i686_gnu" 5368 | version = "0.48.5" 5369 | source = "registry+https://github.com/rust-lang/crates.io-index" 5370 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 5371 | 5372 | [[package]] 5373 | name = "windows_i686_gnu" 5374 | version = "0.52.6" 5375 | source = "registry+https://github.com/rust-lang/crates.io-index" 5376 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 5377 | 5378 | [[package]] 5379 | name = "windows_i686_gnu" 5380 | version = "0.53.0" 5381 | source = "registry+https://github.com/rust-lang/crates.io-index" 5382 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 5383 | 5384 | [[package]] 5385 | name = "windows_i686_gnullvm" 5386 | version = "0.52.6" 5387 | source = "registry+https://github.com/rust-lang/crates.io-index" 5388 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 5389 | 5390 | [[package]] 5391 | name = "windows_i686_gnullvm" 5392 | version = "0.53.0" 5393 | source = "registry+https://github.com/rust-lang/crates.io-index" 5394 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 5395 | 5396 | [[package]] 5397 | name = "windows_i686_msvc" 5398 | version = "0.48.5" 5399 | source = "registry+https://github.com/rust-lang/crates.io-index" 5400 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 5401 | 5402 | [[package]] 5403 | name = "windows_i686_msvc" 5404 | version = "0.52.6" 5405 | source = "registry+https://github.com/rust-lang/crates.io-index" 5406 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 5407 | 5408 | [[package]] 5409 | name = "windows_i686_msvc" 5410 | version = "0.53.0" 5411 | source = "registry+https://github.com/rust-lang/crates.io-index" 5412 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 5413 | 5414 | [[package]] 5415 | name = "windows_x86_64_gnu" 5416 | version = "0.48.5" 5417 | source = "registry+https://github.com/rust-lang/crates.io-index" 5418 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 5419 | 5420 | [[package]] 5421 | name = "windows_x86_64_gnu" 5422 | version = "0.52.6" 5423 | source = "registry+https://github.com/rust-lang/crates.io-index" 5424 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 5425 | 5426 | [[package]] 5427 | name = "windows_x86_64_gnu" 5428 | version = "0.53.0" 5429 | source = "registry+https://github.com/rust-lang/crates.io-index" 5430 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 5431 | 5432 | [[package]] 5433 | name = "windows_x86_64_gnullvm" 5434 | version = "0.48.5" 5435 | source = "registry+https://github.com/rust-lang/crates.io-index" 5436 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 5437 | 5438 | [[package]] 5439 | name = "windows_x86_64_gnullvm" 5440 | version = "0.52.6" 5441 | source = "registry+https://github.com/rust-lang/crates.io-index" 5442 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 5443 | 5444 | [[package]] 5445 | name = "windows_x86_64_gnullvm" 5446 | version = "0.53.0" 5447 | source = "registry+https://github.com/rust-lang/crates.io-index" 5448 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 5449 | 5450 | [[package]] 5451 | name = "windows_x86_64_msvc" 5452 | version = "0.48.5" 5453 | source = "registry+https://github.com/rust-lang/crates.io-index" 5454 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 5455 | 5456 | [[package]] 5457 | name = "windows_x86_64_msvc" 5458 | version = "0.52.6" 5459 | source = "registry+https://github.com/rust-lang/crates.io-index" 5460 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 5461 | 5462 | [[package]] 5463 | name = "windows_x86_64_msvc" 5464 | version = "0.53.0" 5465 | source = "registry+https://github.com/rust-lang/crates.io-index" 5466 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 5467 | 5468 | [[package]] 5469 | name = "winnow" 5470 | version = "0.7.2" 5471 | source = "registry+https://github.com/rust-lang/crates.io-index" 5472 | checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" 5473 | dependencies = [ 5474 | "memchr", 5475 | ] 5476 | 5477 | [[package]] 5478 | name = "winreg" 5479 | version = "0.50.0" 5480 | source = "registry+https://github.com/rust-lang/crates.io-index" 5481 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 5482 | dependencies = [ 5483 | "cfg-if", 5484 | "windows-sys 0.48.0", 5485 | ] 5486 | 5487 | [[package]] 5488 | name = "wit-bindgen-rt" 5489 | version = "0.39.0" 5490 | source = "registry+https://github.com/rust-lang/crates.io-index" 5491 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 5492 | dependencies = [ 5493 | "bitflags 2.8.0", 5494 | ] 5495 | 5496 | [[package]] 5497 | name = "wmi" 5498 | version = "0.14.5" 5499 | source = "registry+https://github.com/rust-lang/crates.io-index" 5500 | checksum = "7787dacdd8e71cbc104658aade4009300777f9b5fda6a75f19145fedb8a18e71" 5501 | dependencies = [ 5502 | "chrono", 5503 | "futures", 5504 | "log", 5505 | "serde", 5506 | "thiserror 2.0.11", 5507 | "windows 0.59.0", 5508 | "windows-core 0.59.0", 5509 | ] 5510 | 5511 | [[package]] 5512 | name = "write16" 5513 | version = "1.0.0" 5514 | source = "registry+https://github.com/rust-lang/crates.io-index" 5515 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 5516 | 5517 | [[package]] 5518 | name = "writeable" 5519 | version = "0.5.5" 5520 | source = "registry+https://github.com/rust-lang/crates.io-index" 5521 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 5522 | 5523 | [[package]] 5524 | name = "ws_stream_wasm" 5525 | version = "0.7.4" 5526 | source = "registry+https://github.com/rust-lang/crates.io-index" 5527 | checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" 5528 | dependencies = [ 5529 | "async_io_stream", 5530 | "futures", 5531 | "js-sys", 5532 | "log", 5533 | "pharos", 5534 | "rustc_version", 5535 | "send_wrapper", 5536 | "thiserror 1.0.69", 5537 | "wasm-bindgen", 5538 | "wasm-bindgen-futures", 5539 | "web-sys", 5540 | ] 5541 | 5542 | [[package]] 5543 | name = "x11rb" 5544 | version = "0.13.1" 5545 | source = "registry+https://github.com/rust-lang/crates.io-index" 5546 | checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" 5547 | dependencies = [ 5548 | "gethostname", 5549 | "rustix", 5550 | "x11rb-protocol", 5551 | ] 5552 | 5553 | [[package]] 5554 | name = "x11rb-protocol" 5555 | version = "0.13.1" 5556 | source = "registry+https://github.com/rust-lang/crates.io-index" 5557 | checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" 5558 | 5559 | [[package]] 5560 | name = "x509-parser" 5561 | version = "0.16.0" 5562 | source = "registry+https://github.com/rust-lang/crates.io-index" 5563 | checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" 5564 | dependencies = [ 5565 | "asn1-rs", 5566 | "data-encoding", 5567 | "der-parser", 5568 | "lazy_static", 5569 | "nom", 5570 | "oid-registry", 5571 | "rusticata-macros", 5572 | "thiserror 1.0.69", 5573 | "time", 5574 | ] 5575 | 5576 | [[package]] 5577 | name = "xml-rs" 5578 | version = "0.8.25" 5579 | source = "registry+https://github.com/rust-lang/crates.io-index" 5580 | checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" 5581 | 5582 | [[package]] 5583 | name = "xmltree" 5584 | version = "0.10.3" 5585 | source = "registry+https://github.com/rust-lang/crates.io-index" 5586 | checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" 5587 | dependencies = [ 5588 | "xml-rs", 5589 | ] 5590 | 5591 | [[package]] 5592 | name = "yasna" 5593 | version = "0.5.2" 5594 | source = "registry+https://github.com/rust-lang/crates.io-index" 5595 | checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" 5596 | dependencies = [ 5597 | "time", 5598 | ] 5599 | 5600 | [[package]] 5601 | name = "yoke" 5602 | version = "0.7.5" 5603 | source = "registry+https://github.com/rust-lang/crates.io-index" 5604 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 5605 | dependencies = [ 5606 | "serde", 5607 | "stable_deref_trait", 5608 | "yoke-derive", 5609 | "zerofrom", 5610 | ] 5611 | 5612 | [[package]] 5613 | name = "yoke-derive" 5614 | version = "0.7.5" 5615 | source = "registry+https://github.com/rust-lang/crates.io-index" 5616 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 5617 | dependencies = [ 5618 | "proc-macro2", 5619 | "quote", 5620 | "syn 2.0.98", 5621 | "synstructure", 5622 | ] 5623 | 5624 | [[package]] 5625 | name = "z32" 5626 | version = "1.3.0" 5627 | source = "registry+https://github.com/rust-lang/crates.io-index" 5628 | checksum = "2164e798d9e3d84ee2c91139ace54638059a3b23e361f5c11781c2c6459bde0f" 5629 | 5630 | [[package]] 5631 | name = "zerocopy" 5632 | version = "0.7.35" 5633 | source = "registry+https://github.com/rust-lang/crates.io-index" 5634 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 5635 | dependencies = [ 5636 | "byteorder", 5637 | "zerocopy-derive 0.7.35", 5638 | ] 5639 | 5640 | [[package]] 5641 | name = "zerocopy" 5642 | version = "0.8.18" 5643 | source = "registry+https://github.com/rust-lang/crates.io-index" 5644 | checksum = "79386d31a42a4996e3336b0919ddb90f81112af416270cff95b5f5af22b839c2" 5645 | dependencies = [ 5646 | "zerocopy-derive 0.8.18", 5647 | ] 5648 | 5649 | [[package]] 5650 | name = "zerocopy-derive" 5651 | version = "0.7.35" 5652 | source = "registry+https://github.com/rust-lang/crates.io-index" 5653 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 5654 | dependencies = [ 5655 | "proc-macro2", 5656 | "quote", 5657 | "syn 2.0.98", 5658 | ] 5659 | 5660 | [[package]] 5661 | name = "zerocopy-derive" 5662 | version = "0.8.18" 5663 | source = "registry+https://github.com/rust-lang/crates.io-index" 5664 | checksum = "76331675d372f91bf8d17e13afbd5fe639200b73d01f0fc748bb059f9cca2db7" 5665 | dependencies = [ 5666 | "proc-macro2", 5667 | "quote", 5668 | "syn 2.0.98", 5669 | ] 5670 | 5671 | [[package]] 5672 | name = "zerofrom" 5673 | version = "0.1.5" 5674 | source = "registry+https://github.com/rust-lang/crates.io-index" 5675 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 5676 | dependencies = [ 5677 | "zerofrom-derive", 5678 | ] 5679 | 5680 | [[package]] 5681 | name = "zerofrom-derive" 5682 | version = "0.1.5" 5683 | source = "registry+https://github.com/rust-lang/crates.io-index" 5684 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 5685 | dependencies = [ 5686 | "proc-macro2", 5687 | "quote", 5688 | "syn 2.0.98", 5689 | "synstructure", 5690 | ] 5691 | 5692 | [[package]] 5693 | name = "zeroize" 5694 | version = "1.8.1" 5695 | source = "registry+https://github.com/rust-lang/crates.io-index" 5696 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 5697 | 5698 | [[package]] 5699 | name = "zerovec" 5700 | version = "0.10.4" 5701 | source = "registry+https://github.com/rust-lang/crates.io-index" 5702 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 5703 | dependencies = [ 5704 | "yoke", 5705 | "zerofrom", 5706 | "zerovec-derive", 5707 | ] 5708 | 5709 | [[package]] 5710 | name = "zerovec-derive" 5711 | version = "0.10.3" 5712 | source = "registry+https://github.com/rust-lang/crates.io-index" 5713 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 5714 | dependencies = [ 5715 | "proc-macro2", 5716 | "quote", 5717 | "syn 2.0.98", 5718 | ] 5719 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "sendme" 3 | version = "0.26.0" 4 | edition = "2021" 5 | authors = ["Rüdiger Klaehn ", "n0 team"] 6 | keywords = ["scp", "sftp", "network", "p2p", "holepunching"] 7 | categories = ["network-programming"] 8 | license = "Apache-2.0 OR MIT" 9 | repository = "https://github.com/n0-computer/sendme" 10 | description = "A cli tool to send directories over the network, with NAT hole punching" 11 | readme = "README.md" 12 | 13 | # Sadly this also needs to be updated in .github/workflows/ci.yml 14 | rust-version = "1.81" 15 | 16 | [dependencies] 17 | anyhow = "1.0.75" 18 | async-channel = "2.3.1" 19 | clap = { version = "4.4.10", features = ["derive"] } 20 | console = "0.15.7" 21 | derive_more = { version = "1.0.0", features = [ 22 | "display", 23 | "from_str" 24 | ] } 25 | futures-buffered = "0.2.4" 26 | futures-lite = "2.3.0" 27 | indicatif = "0.17.7" 28 | iroh-blobs = { version = "0.35", features = ["net_protocol"] } 29 | iroh-io = "0.6" 30 | iroh = "0.35" 31 | num_cpus = "1.16.0" 32 | rand = "0.8.5" 33 | serde = { version = "1", features = ["derive"] } 34 | tokio = { version = "1.34.0", features = ["full"] } 35 | tracing = "0.1.40" 36 | tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } 37 | walkdir = "2.4.0" 38 | data-encoding = "2.6.0" 39 | n0-future = "0.1.2" 40 | arboard = "3.4.1" 41 | 42 | [dev-dependencies] 43 | duct = "0.13.6" 44 | nix = { version = "0.29", features = ["signal", "process"] } 45 | rand = "0.8.5" 46 | serde_json = "1.0.108" 47 | tempfile = "3.8.1" 48 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at 2 | 3 | http://www.apache.org/licenses/LICENSE-2.0 4 | 5 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sendme 2 | 3 | This is an example application using [iroh](https://crates.io/crates/iroh) with 4 | the [iroh-blobs](https://crates.io/crates/iroh-blobs) protocol to send files and 5 | directories over the internet. 6 | 7 | It is also useful as a standalone tool for quick copy jobs. 8 | 9 | Iroh will take care of hole punching and NAT traversal whenever possible, 10 | and fall back to a relay if hole punching does not succeed. 11 | 12 | Iroh-blobs will take care of [blake3](https://crates.io/crates/blake3) verified 13 | streaming, including resuming interrupted downloads. 14 | 15 | Sendme works with 256 bit node ids and is, therefore, location transparent. A ticket 16 | will remain valid if the IP address changes. Connections are encrypted using 17 | TLS. 18 | 19 | # Installation 20 | 21 | ``` 22 | cargo install sendme 23 | ``` 24 | 25 | # Usage 26 | 27 | ## Send side 28 | 29 | ``` 30 | sendme send 31 | ``` 32 | 33 | This will create a temporary [iroh](https://crates.io/crates/iroh) node that 34 | serves the content in the given file or directory. It will output a ticket that 35 | can be used to get the data. 36 | 37 | The provider will run until it is terminated using `Control-C`. On termination, it 38 | will delete the temporary directory. 39 | 40 | This currently will create a temporary directory in the current directory. In 41 | the future this won't be needed anymore. 42 | 43 | ### Receive side 44 | 45 | ``` 46 | sendme receive 47 | ``` 48 | 49 | This will download the data and create a file or directory named like the source 50 | in the **current directory**. 51 | 52 | It will create a temporary directory in the current directory, download the data 53 | (single file or directory), and only then move these files to the target 54 | directory. 55 | 56 | On completion, it will delete the temp directory. 57 | 58 | All temp directories start with `.sendme-`. 59 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | //! Command line arguments. 2 | 3 | use anyhow::Context; 4 | use arboard::Clipboard; 5 | use clap::{ 6 | error::{ContextKind, ErrorKind}, 7 | CommandFactory, Parser, Subcommand, 8 | }; 9 | use console::{style, Key, Term}; 10 | use data_encoding::HEXLOWER; 11 | use futures_buffered::BufferedStreamExt; 12 | use indicatif::{ 13 | HumanBytes, HumanDuration, MultiProgress, ProgressBar, ProgressDrawTarget, ProgressStyle, 14 | }; 15 | use iroh::{ 16 | discovery::{dns::DnsDiscovery, pkarr::PkarrPublisher}, 17 | Endpoint, NodeAddr, RelayMode, RelayUrl, SecretKey, 18 | }; 19 | use iroh_blobs::{ 20 | format::collection::Collection, 21 | get::{ 22 | db::DownloadProgress, 23 | fsm::{AtBlobHeaderNextError, DecodeError}, 24 | request::get_hash_seq_and_sizes, 25 | }, 26 | net_protocol::Blobs, 27 | provider::{self, CustomEventSender}, 28 | store::{ExportMode, ImportMode, ImportProgress}, 29 | ticket::BlobTicket, 30 | BlobFormat, Hash, HashAndFormat, TempTag, 31 | }; 32 | use n0_future::{future::Boxed, StreamExt}; 33 | use rand::Rng; 34 | use serde::{Deserialize, Serialize}; 35 | use std::{ 36 | collections::BTreeMap, 37 | fmt::{Display, Formatter}, 38 | net::{SocketAddrV4, SocketAddrV6}, 39 | path::{Component, Path, PathBuf}, 40 | str::FromStr, 41 | sync::Arc, 42 | time::Duration, 43 | }; 44 | use walkdir::WalkDir; 45 | 46 | /// Send a file or directory between two machines, using blake3 verified streaming. 47 | /// 48 | /// For all subcommands, you can specify a secret key using the IROH_SECRET 49 | /// environment variable. If you don't, a random one will be generated. 50 | /// 51 | /// You can also specify a port for the magicsocket. If you don't, a random one 52 | /// will be chosen. 53 | #[derive(Parser, Debug)] 54 | #[command(version, about)] 55 | pub struct Args { 56 | #[clap(subcommand)] 57 | pub command: Commands, 58 | } 59 | 60 | #[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] 61 | pub enum Format { 62 | #[default] 63 | Hex, 64 | Cid, 65 | } 66 | 67 | impl FromStr for Format { 68 | type Err = anyhow::Error; 69 | 70 | fn from_str(s: &str) -> Result { 71 | match s.to_ascii_lowercase().as_str() { 72 | "hex" => Ok(Format::Hex), 73 | "cid" => Ok(Format::Cid), 74 | _ => Err(anyhow::anyhow!("invalid format")), 75 | } 76 | } 77 | } 78 | 79 | impl Display for Format { 80 | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 81 | match self { 82 | Format::Hex => write!(f, "hex"), 83 | Format::Cid => write!(f, "cid"), 84 | } 85 | } 86 | } 87 | 88 | fn print_hash(hash: &Hash, format: Format) -> String { 89 | match format { 90 | Format::Hex => hash.to_hex().to_string(), 91 | Format::Cid => hash.to_string(), 92 | } 93 | } 94 | 95 | #[derive(Subcommand, Debug)] 96 | pub enum Commands { 97 | /// Send a file or directory. 98 | Send(SendArgs), 99 | 100 | /// Receive a file or directory. 101 | Receive(ReceiveArgs), 102 | } 103 | 104 | #[derive(Parser, Debug)] 105 | pub struct CommonArgs { 106 | /// The IPv4 address that magicsocket will listen on. 107 | /// 108 | /// If None, defaults to a random free port, but it can be useful to specify a fixed 109 | /// port, e.g. to configure a firewall rule. 110 | #[clap(long, default_value = None)] 111 | pub magic_ipv4_addr: Option, 112 | 113 | /// The IPv6 address that magicsocket will listen on. 114 | /// 115 | /// If None, defaults to a random free port, but it can be useful to specify a fixed 116 | /// port, e.g. to configure a firewall rule. 117 | #[clap(long, default_value = None)] 118 | pub magic_ipv6_addr: Option, 119 | 120 | #[clap(long, default_value_t = Format::Hex)] 121 | pub format: Format, 122 | 123 | #[clap(short = 'v', long, action = clap::ArgAction::Count)] 124 | pub verbose: u8, 125 | 126 | /// The relay URL to use as a home relay, 127 | /// 128 | /// Can be set to "disabled" to disable relay servers and "default" 129 | /// to configure default servers. 130 | #[clap(long, default_value_t = RelayModeOption::Default)] 131 | pub relay: RelayModeOption, 132 | } 133 | 134 | /// Available command line options for configuring relays. 135 | #[derive(Clone, Debug)] 136 | pub enum RelayModeOption { 137 | /// Disables relays altogether. 138 | Disabled, 139 | /// Uses the default relay servers. 140 | Default, 141 | /// Uses a single, custom relay server by URL. 142 | Custom(RelayUrl), 143 | } 144 | 145 | impl FromStr for RelayModeOption { 146 | type Err = anyhow::Error; 147 | 148 | fn from_str(s: &str) -> Result { 149 | match s { 150 | "disabled" => Ok(Self::Disabled), 151 | "default" => Ok(Self::Default), 152 | _ => Ok(Self::Custom(RelayUrl::from_str(s)?)), 153 | } 154 | } 155 | } 156 | 157 | impl Display for RelayModeOption { 158 | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 159 | match self { 160 | Self::Disabled => f.write_str("disabled"), 161 | Self::Default => f.write_str("default"), 162 | Self::Custom(url) => url.fmt(f), 163 | } 164 | } 165 | } 166 | 167 | impl From for RelayMode { 168 | fn from(value: RelayModeOption) -> Self { 169 | match value { 170 | RelayModeOption::Disabled => RelayMode::Disabled, 171 | RelayModeOption::Default => RelayMode::Default, 172 | RelayModeOption::Custom(url) => RelayMode::Custom(url.into()), 173 | } 174 | } 175 | } 176 | 177 | #[derive(Parser, Debug)] 178 | pub struct SendArgs { 179 | /// Path to the file or directory to send. 180 | /// 181 | /// The last component of the path will be used as the name of the data 182 | /// being shared. 183 | pub path: PathBuf, 184 | 185 | /// What type of ticket to use. 186 | /// 187 | /// Use "id" for the shortest type only including the node ID, 188 | /// "addresses" to only add IP addresses without a relay url, 189 | /// "relay" to only add a relay address, and leave the option out 190 | /// to use the biggest type of ticket that includes both relay and 191 | /// address information. 192 | /// 193 | /// Generally, the more information the higher the likelyhood of 194 | /// a successful connection, but also the bigger a ticket to connect. 195 | /// 196 | /// This is most useful for debugging which methods of connection 197 | /// establishment work well. 198 | #[clap(long, default_value_t = AddrInfoOptions::RelayAndAddresses)] 199 | pub ticket_type: AddrInfoOptions, 200 | 201 | #[clap(flatten)] 202 | pub common: CommonArgs, 203 | 204 | /// Store the receive command in the clipboard. 205 | #[clap(short = 'c', long)] 206 | pub clipboard: bool, 207 | } 208 | 209 | #[derive(Parser, Debug)] 210 | pub struct ReceiveArgs { 211 | /// The ticket to use to connect to the sender. 212 | pub ticket: BlobTicket, 213 | 214 | #[clap(flatten)] 215 | pub common: CommonArgs, 216 | } 217 | 218 | /// Options to configure what is included in a [`NodeAddr`] 219 | #[derive( 220 | Copy, 221 | Clone, 222 | PartialEq, 223 | Eq, 224 | Default, 225 | Debug, 226 | derive_more::Display, 227 | derive_more::FromStr, 228 | Serialize, 229 | Deserialize, 230 | )] 231 | pub enum AddrInfoOptions { 232 | /// Only the Node ID is added. 233 | /// 234 | /// This usually means that iroh-dns discovery is used to find address information. 235 | #[default] 236 | Id, 237 | /// Includes the Node ID and both the relay URL, and the direct addresses. 238 | RelayAndAddresses, 239 | /// Includes the Node ID and the relay URL. 240 | Relay, 241 | /// Includes the Node ID and the direct addresses. 242 | Addresses, 243 | } 244 | 245 | fn apply_options(addr: &mut NodeAddr, opts: AddrInfoOptions) { 246 | match opts { 247 | AddrInfoOptions::Id => { 248 | addr.direct_addresses.clear(); 249 | addr.relay_url = None; 250 | } 251 | AddrInfoOptions::RelayAndAddresses => { 252 | // nothing to do 253 | } 254 | AddrInfoOptions::Relay => { 255 | addr.direct_addresses.clear(); 256 | } 257 | AddrInfoOptions::Addresses => { 258 | addr.relay_url = None; 259 | } 260 | } 261 | } 262 | 263 | /// Get the secret key or generate a new one. 264 | /// 265 | /// Print the secret key to stderr if it was generated, so the user can save it. 266 | fn get_or_create_secret(print: bool) -> anyhow::Result { 267 | match std::env::var("IROH_SECRET") { 268 | Ok(secret) => SecretKey::from_str(&secret).context("invalid secret"), 269 | Err(_) => { 270 | let key = SecretKey::generate(rand::rngs::OsRng); 271 | if print { 272 | eprintln!("using secret key {}", key); 273 | } 274 | Ok(key) 275 | } 276 | } 277 | } 278 | 279 | fn validate_path_component(component: &str) -> anyhow::Result<()> { 280 | anyhow::ensure!( 281 | !component.contains('/'), 282 | "path components must not contain the only correct path separator, /" 283 | ); 284 | Ok(()) 285 | } 286 | 287 | /// This function converts an already canonicalized path to a string. 288 | /// 289 | /// If `must_be_relative` is true, the function will fail if any component of the path is 290 | /// `Component::RootDir` 291 | /// 292 | /// This function will also fail if the path is non canonical, i.e. contains 293 | /// `..` or `.`, or if the path components contain any windows or unix path 294 | /// separators. 295 | pub fn canonicalized_path_to_string( 296 | path: impl AsRef, 297 | must_be_relative: bool, 298 | ) -> anyhow::Result { 299 | let mut path_str = String::new(); 300 | let parts = path 301 | .as_ref() 302 | .components() 303 | .filter_map(|c| match c { 304 | Component::Normal(x) => { 305 | let c = match x.to_str() { 306 | Some(c) => c, 307 | None => return Some(Err(anyhow::anyhow!("invalid character in path"))), 308 | }; 309 | 310 | if !c.contains('/') && !c.contains('\\') { 311 | Some(Ok(c)) 312 | } else { 313 | Some(Err(anyhow::anyhow!("invalid path component {:?}", c))) 314 | } 315 | } 316 | Component::RootDir => { 317 | if must_be_relative { 318 | Some(Err(anyhow::anyhow!("invalid path component {:?}", c))) 319 | } else { 320 | path_str.push('/'); 321 | None 322 | } 323 | } 324 | _ => Some(Err(anyhow::anyhow!("invalid path component {:?}", c))), 325 | }) 326 | .collect::>>()?; 327 | let parts = parts.join("/"); 328 | path_str.push_str(&parts); 329 | Ok(path_str) 330 | } 331 | 332 | pub async fn show_ingest_progress( 333 | recv: async_channel::Receiver, 334 | ) -> anyhow::Result<()> { 335 | let mp = MultiProgress::new(); 336 | mp.set_draw_target(ProgressDrawTarget::stderr()); 337 | let op = mp.add(ProgressBar::hidden()); 338 | op.set_style( 339 | ProgressStyle::default_spinner().template("{spinner:.green} [{elapsed_precise}] {msg}")?, 340 | ); 341 | // op.set_message(format!("{} Ingesting ...\n", style("[1/2]").bold().dim())); 342 | // op.set_length(total_files); 343 | let mut names = BTreeMap::new(); 344 | let mut sizes = BTreeMap::new(); 345 | let mut pbs = BTreeMap::new(); 346 | loop { 347 | let event = recv.recv().await; 348 | match event { 349 | Ok(ImportProgress::Found { id, name }) => { 350 | names.insert(id, name); 351 | } 352 | Ok(ImportProgress::Size { id, size }) => { 353 | sizes.insert(id, size); 354 | let total_size = sizes.values().sum::(); 355 | op.set_message(format!( 356 | "{} Ingesting {} files, {}\n", 357 | style("[1/2]").bold().dim(), 358 | sizes.len(), 359 | HumanBytes(total_size) 360 | )); 361 | let name = names.get(&id).cloned().unwrap_or_default(); 362 | let pb = mp.add(ProgressBar::hidden()); 363 | pb.set_style(ProgressStyle::with_template( 364 | "{msg}{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes}", 365 | )?.progress_chars("#>-")); 366 | pb.set_message(format!("{} {}", style("[2/2]").bold().dim(), name)); 367 | pb.set_length(size); 368 | pbs.insert(id, pb); 369 | } 370 | Ok(ImportProgress::OutboardProgress { id, offset }) => { 371 | if let Some(pb) = pbs.get(&id) { 372 | pb.set_position(offset); 373 | } 374 | } 375 | Ok(ImportProgress::OutboardDone { id, .. }) => { 376 | // you are not guaranteed to get any OutboardProgress 377 | if let Some(pb) = pbs.remove(&id) { 378 | pb.finish_and_clear(); 379 | } 380 | } 381 | Ok(ImportProgress::CopyProgress { .. }) => { 382 | // we are not copying anything 383 | } 384 | Err(e) => { 385 | op.set_message(format!("Error receiving progress: {e}")); 386 | break; 387 | } 388 | } 389 | } 390 | op.finish_and_clear(); 391 | Ok(()) 392 | } 393 | 394 | /// Import from a file or directory into the database. 395 | /// 396 | /// The returned tag always refers to a collection. If the input is a file, this 397 | /// is a collection with a single blob, named like the file. 398 | /// 399 | /// If the input is a directory, the collection contains all the files in the 400 | /// directory. 401 | async fn import( 402 | path: PathBuf, 403 | db: impl iroh_blobs::store::Store, 404 | ) -> anyhow::Result<(TempTag, u64, Collection)> { 405 | let path = path.canonicalize()?; 406 | anyhow::ensure!(path.exists(), "path {} does not exist", path.display()); 407 | let root = path.parent().context("context get parent")?; 408 | // walkdir also works for files, so we don't need to special case them 409 | let files = WalkDir::new(path.clone()).into_iter(); 410 | // flatten the directory structure into a list of (name, path) pairs. 411 | // ignore symlinks. 412 | let data_sources: Vec<(String, PathBuf)> = files 413 | .map(|entry| { 414 | let entry = entry?; 415 | if !entry.file_type().is_file() { 416 | // Skip symlinks. Directories are handled by WalkDir. 417 | return Ok(None); 418 | } 419 | let path = entry.into_path(); 420 | let relative = path.strip_prefix(root)?; 421 | let name = canonicalized_path_to_string(relative, true)?; 422 | anyhow::Ok(Some((name, path))) 423 | }) 424 | .filter_map(Result::transpose) 425 | .collect::>>()?; 426 | let (send, recv) = async_channel::bounded(32); 427 | let progress = iroh_blobs::util::progress::AsyncChannelProgressSender::new(send); 428 | let show_progress = tokio::spawn(show_ingest_progress(recv)); 429 | // import all the files, using num_cpus workers, return names and temp tags 430 | let mut names_and_tags = futures_lite::stream::iter(data_sources) 431 | .map(|(name, path)| { 432 | let db = db.clone(); 433 | let progress = progress.clone(); 434 | async move { 435 | let (temp_tag, file_size) = db 436 | .import_file(path, ImportMode::TryReference, BlobFormat::Raw, progress) 437 | .await?; 438 | anyhow::Ok((name, temp_tag, file_size)) 439 | } 440 | }) 441 | .buffered_unordered(num_cpus::get()) 442 | .collect::>() 443 | .await 444 | .into_iter() 445 | .collect::>>()?; 446 | drop(progress); 447 | names_and_tags.sort_by(|(a, _, _), (b, _, _)| a.cmp(b)); 448 | // total size of all files 449 | let size = names_and_tags.iter().map(|(_, _, size)| *size).sum::(); 450 | // collect the (name, hash) tuples into a collection 451 | // we must also keep the tags around so the data does not get gced. 452 | let (collection, tags) = names_and_tags 453 | .into_iter() 454 | .map(|(name, tag, _)| ((name, *tag.hash()), tag)) 455 | .unzip::<_, _, Collection, Vec<_>>(); 456 | let temp_tag = collection.clone().store(&db).await?; 457 | // now that the collection is stored, we can drop the tags 458 | // data is protected by the collection 459 | drop(tags); 460 | show_progress.await??; 461 | Ok((temp_tag, size, collection)) 462 | } 463 | 464 | fn get_export_path(root: &Path, name: &str) -> anyhow::Result { 465 | let parts = name.split('/'); 466 | let mut path = root.to_path_buf(); 467 | for part in parts { 468 | validate_path_component(part)?; 469 | path.push(part); 470 | } 471 | Ok(path) 472 | } 473 | 474 | async fn export(db: impl iroh_blobs::store::Store, collection: Collection) -> anyhow::Result<()> { 475 | let root = std::env::current_dir()?; 476 | for (name, hash) in collection.iter() { 477 | let target = get_export_path(&root, name)?; 478 | if target.exists() { 479 | eprintln!( 480 | "target {} already exists. Export stopped.", 481 | target.display() 482 | ); 483 | eprintln!("You can remove the file or directory and try again. The download will not be repeated."); 484 | anyhow::bail!("target {} already exists", target.display()); 485 | } 486 | db.export( 487 | *hash, 488 | target, 489 | ExportMode::TryReference, 490 | Box::new(move |_position| Ok(())), 491 | ) 492 | .await?; 493 | } 494 | Ok(()) 495 | } 496 | 497 | #[derive(Debug, Clone)] 498 | struct SendStatus { 499 | /// the multiprogress bar 500 | mp: MultiProgress, 501 | } 502 | 503 | impl SendStatus { 504 | fn new() -> Self { 505 | let mp = MultiProgress::new(); 506 | mp.set_draw_target(ProgressDrawTarget::stderr()); 507 | Self { mp } 508 | } 509 | 510 | fn new_client(&self) -> ClientStatus { 511 | let current = self.mp.add(ProgressBar::hidden()); 512 | current.set_style( 513 | ProgressStyle::default_spinner() 514 | .template("{spinner:.green} [{elapsed_precise}] {msg}") 515 | .unwrap(), 516 | ); 517 | current.enable_steady_tick(Duration::from_millis(100)); 518 | current.set_message("waiting for requests"); 519 | ClientStatus { 520 | current: current.into(), 521 | } 522 | } 523 | } 524 | 525 | #[derive(Debug, Clone)] 526 | struct ClientStatus { 527 | current: Arc, 528 | } 529 | 530 | impl Drop for ClientStatus { 531 | fn drop(&mut self) { 532 | if Arc::strong_count(&self.current) == 1 { 533 | self.current.finish_and_clear(); 534 | } 535 | } 536 | } 537 | 538 | impl CustomEventSender for ClientStatus { 539 | fn send(&self, event: iroh_blobs::provider::Event) -> Boxed<()> { 540 | self.try_send(event); 541 | Box::pin(std::future::ready(())) 542 | } 543 | 544 | fn try_send(&self, event: provider::Event) { 545 | tracing::info!("{:?}", event); 546 | let msg = match event { 547 | provider::Event::ClientConnected { connection_id } => { 548 | Some(format!("{} got connection", connection_id)) 549 | } 550 | provider::Event::TransferBlobCompleted { 551 | connection_id, 552 | hash, 553 | index, 554 | size, 555 | .. 556 | } => Some(format!( 557 | "{} transfer blob completed {} {} {}", 558 | connection_id, 559 | hash, 560 | index, 561 | HumanBytes(size) 562 | )), 563 | provider::Event::TransferCompleted { 564 | connection_id, 565 | stats, 566 | .. 567 | } => Some(format!( 568 | "{} transfer completed {} {}", 569 | connection_id, 570 | stats.send.write_bytes.size, 571 | HumanDuration(stats.send.write_bytes.stats.duration) 572 | )), 573 | provider::Event::TransferAborted { connection_id, .. } => { 574 | Some(format!("{} transfer completed", connection_id)) 575 | } 576 | _ => None, 577 | }; 578 | if let Some(msg) = msg { 579 | self.current.set_message(msg); 580 | } 581 | } 582 | } 583 | 584 | async fn send(args: SendArgs) -> anyhow::Result<()> { 585 | let secret_key = get_or_create_secret(args.common.verbose > 0)?; 586 | // create a magicsocket endpoint 587 | let mut builder = Endpoint::builder() 588 | .alpns(vec![iroh_blobs::protocol::ALPN.to_vec()]) 589 | .secret_key(secret_key) 590 | .relay_mode(args.common.relay.into()); 591 | if args.ticket_type == AddrInfoOptions::Id { 592 | builder = 593 | builder.add_discovery(|secret_key| Some(PkarrPublisher::n0_dns(secret_key.clone()))); 594 | } 595 | if let Some(addr) = args.common.magic_ipv4_addr { 596 | builder = builder.bind_addr_v4(addr); 597 | } 598 | if let Some(addr) = args.common.magic_ipv6_addr { 599 | builder = builder.bind_addr_v6(addr); 600 | } 601 | 602 | // use a flat store - todo: use a partial in mem store instead 603 | let suffix = rand::thread_rng().gen::<[u8; 16]>(); 604 | let cwd = std::env::current_dir()?; 605 | let blobs_data_dir = cwd.join(format!(".sendme-send-{}", HEXLOWER.encode(&suffix))); 606 | if blobs_data_dir.exists() { 607 | println!( 608 | "can not share twice from the same directory: {}", 609 | cwd.display(), 610 | ); 611 | std::process::exit(1); 612 | } 613 | 614 | tokio::fs::create_dir_all(&blobs_data_dir).await?; 615 | 616 | let endpoint = builder.bind().await?; 617 | let ps = SendStatus::new(); 618 | let blobs = Blobs::persistent(&blobs_data_dir) 619 | .await? 620 | .events(ps.new_client().into()) 621 | .build(&endpoint); 622 | 623 | let router = iroh::protocol::Router::builder(endpoint) 624 | .accept(iroh_blobs::ALPN, blobs.clone()) 625 | .spawn(); 626 | 627 | let path = args.path; 628 | let (temp_tag, size, collection) = import(path.clone(), blobs.store().clone()).await?; 629 | let hash = *temp_tag.hash(); 630 | 631 | // wait for the endpoint to figure out its address before making a ticket 632 | let _ = router.endpoint().home_relay().initialized().await?; 633 | 634 | // make a ticket 635 | let mut addr = router.endpoint().node_addr().await?; 636 | apply_options(&mut addr, args.ticket_type); 637 | let ticket = BlobTicket::new(addr, hash, BlobFormat::HashSeq)?; 638 | let entry_type = if path.is_file() { "file" } else { "directory" }; 639 | println!( 640 | "imported {} {}, {}, hash {}", 641 | entry_type, 642 | path.display(), 643 | HumanBytes(size), 644 | print_hash(&hash, args.common.format) 645 | ); 646 | if args.common.verbose > 0 { 647 | for (name, hash) in collection.iter() { 648 | println!(" {} {name}", print_hash(hash, args.common.format)); 649 | } 650 | } 651 | 652 | println!("to get this data, use"); 653 | println!("sendme receive {}", ticket); 654 | 655 | // Add command to the clipboard 656 | if args.clipboard { 657 | add_to_clipboard(&ticket); 658 | } 659 | 660 | let _keyboard = tokio::task::spawn(async move { 661 | let term = Term::stdout(); 662 | println!("press c to copy command to clipboard, or use the --clipboard argument"); 663 | loop { 664 | if let Ok(Key::Char('c')) = term.read_key() { 665 | add_to_clipboard(&ticket); 666 | } 667 | } 668 | }); 669 | 670 | tokio::signal::ctrl_c().await?; 671 | 672 | drop(temp_tag); 673 | 674 | println!("shutting down"); 675 | tokio::time::timeout(Duration::from_secs(2), router.shutdown()).await??; 676 | tokio::fs::remove_dir_all(blobs_data_dir).await?; 677 | 678 | Ok(()) 679 | } 680 | 681 | fn add_to_clipboard(ticket: &BlobTicket) { 682 | let clipboard = Clipboard::new(); 683 | match clipboard { 684 | Ok(mut clip) => { 685 | if let Err(e) = clip.set_text(format!("sendme receive {}", ticket)) { 686 | eprintln!("Could not add to clipboard: {}", e); 687 | } else { 688 | println!("Command added to clipboard.") 689 | } 690 | } 691 | Err(e) => eprintln!("Could not access clipboard: {}", e), 692 | } 693 | } 694 | 695 | fn make_download_progress() -> ProgressBar { 696 | let pb = ProgressBar::hidden(); 697 | pb.enable_steady_tick(std::time::Duration::from_millis(100)); 698 | pb.set_style( 699 | ProgressStyle::with_template( 700 | "{msg}{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} {binary_bytes_per_sec}", 701 | ) 702 | .unwrap() 703 | .progress_chars("#>-"), 704 | ); 705 | pb 706 | } 707 | 708 | pub async fn show_download_progress( 709 | recv: async_channel::Receiver, 710 | total_size: u64, 711 | ) -> anyhow::Result<()> { 712 | let mp = MultiProgress::new(); 713 | mp.set_draw_target(ProgressDrawTarget::stderr()); 714 | let op = mp.add(make_download_progress()); 715 | op.set_message(format!("{} Connecting ...\n", style("[1/3]").bold().dim())); 716 | let mut total_done = 0; 717 | let mut sizes = BTreeMap::new(); 718 | loop { 719 | let x = recv.recv().await; 720 | match x { 721 | Ok(DownloadProgress::Connected) => { 722 | op.set_message(format!("{} Requesting ...\n", style("[2/3]").bold().dim())); 723 | } 724 | Ok(DownloadProgress::FoundHashSeq { children, .. }) => { 725 | op.set_message(format!( 726 | "{} Downloading {} blob(s)\n", 727 | style("[3/3]").bold().dim(), 728 | children + 1, 729 | )); 730 | op.set_length(total_size); 731 | op.reset(); 732 | } 733 | Ok(DownloadProgress::Found { id, size, .. }) => { 734 | sizes.insert(id, size); 735 | } 736 | Ok(DownloadProgress::Progress { offset, .. }) => { 737 | op.set_position(total_done + offset); 738 | } 739 | Ok(DownloadProgress::Done { id }) => { 740 | total_done += sizes.remove(&id).unwrap_or_default(); 741 | } 742 | Ok(DownloadProgress::AllDone(stats)) => { 743 | op.finish_and_clear(); 744 | eprintln!( 745 | "Transferred {} in {}, {}/s", 746 | HumanBytes(stats.bytes_read), 747 | HumanDuration(stats.elapsed), 748 | HumanBytes((stats.bytes_read as f64 / stats.elapsed.as_secs_f64()) as u64) 749 | ); 750 | break; 751 | } 752 | Ok(DownloadProgress::Abort(e)) => { 753 | anyhow::bail!("download aborted: {e:?}"); 754 | } 755 | Err(e) => { 756 | anyhow::bail!("error reading progress: {e:?}"); 757 | } 758 | _ => {} 759 | } 760 | } 761 | Ok(()) 762 | } 763 | 764 | fn show_get_error(e: anyhow::Error) -> anyhow::Error { 765 | if let Some(err) = e.downcast_ref::() { 766 | match err { 767 | DecodeError::NotFound => { 768 | eprintln!("{}", style("send side no longer has a file").yellow()) 769 | } 770 | DecodeError::LeafNotFound(_) | DecodeError::ParentNotFound(_) => eprintln!( 771 | "{}", 772 | style("send side no longer has part of a file").yellow() 773 | ), 774 | DecodeError::Io(err) => eprintln!( 775 | "{}", 776 | style(format!("generic network error: {}", err)).yellow() 777 | ), 778 | DecodeError::Read(err) => eprintln!( 779 | "{}", 780 | style(format!("error reading data from quinn: {}", err)).yellow() 781 | ), 782 | DecodeError::LeafHashMismatch(_) | DecodeError::ParentHashMismatch(_) => { 783 | eprintln!("{}", style("send side sent wrong data").red()) 784 | } 785 | }; 786 | } else if let Some(header_error) = e.downcast_ref::() { 787 | // TODO(iroh-bytes): get_to_db should have a concrete error type so you don't have to guess 788 | match header_error { 789 | AtBlobHeaderNextError::Io(err) => eprintln!( 790 | "{}", 791 | style(format!("generic network error: {}", err)).yellow() 792 | ), 793 | AtBlobHeaderNextError::Read(err) => eprintln!( 794 | "{}", 795 | style(format!("error reading data from quinn: {}", err)).yellow() 796 | ), 797 | AtBlobHeaderNextError::NotFound => { 798 | eprintln!("{}", style("send side no longer has a file").yellow()) 799 | } 800 | }; 801 | } else { 802 | eprintln!( 803 | "{}", 804 | style(format!("generic error: {:?}", e.root_cause())).red() 805 | ); 806 | } 807 | e 808 | } 809 | 810 | async fn receive(args: ReceiveArgs) -> anyhow::Result<()> { 811 | let ticket = args.ticket; 812 | let addr = ticket.node_addr().clone(); 813 | let secret_key = get_or_create_secret(args.common.verbose > 0)?; 814 | let mut builder = Endpoint::builder() 815 | .alpns(vec![]) 816 | .secret_key(secret_key) 817 | .relay_mode(args.common.relay.into()); 818 | 819 | if ticket.node_addr().relay_url.is_none() && ticket.node_addr().direct_addresses.is_empty() { 820 | builder = builder.add_discovery(|_| Some(DnsDiscovery::n0_dns())); 821 | } 822 | if let Some(addr) = args.common.magic_ipv4_addr { 823 | builder = builder.bind_addr_v4(addr); 824 | } 825 | if let Some(addr) = args.common.magic_ipv6_addr { 826 | builder = builder.bind_addr_v6(addr); 827 | } 828 | let endpoint = builder.bind().await?; 829 | let dir_name = format!(".sendme-get-{}", ticket.hash().to_hex()); 830 | let iroh_data_dir = std::env::current_dir()?.join(dir_name); 831 | let db = iroh_blobs::store::fs::Store::load(&iroh_data_dir).await?; 832 | let mp = MultiProgress::new(); 833 | let connect_progress = mp.add(ProgressBar::hidden()); 834 | connect_progress.set_draw_target(ProgressDrawTarget::stderr()); 835 | connect_progress.set_style(ProgressStyle::default_spinner()); 836 | connect_progress.set_message(format!("connecting to {}", addr.node_id)); 837 | let connection = endpoint.connect(addr, iroh_blobs::protocol::ALPN).await?; 838 | let hash_and_format = HashAndFormat { 839 | hash: ticket.hash(), 840 | format: ticket.format(), 841 | }; 842 | connect_progress.finish_and_clear(); 843 | let (send, recv) = async_channel::bounded(32); 844 | let progress = iroh_blobs::util::progress::AsyncChannelProgressSender::new(send); 845 | let (_hash_seq, sizes) = 846 | get_hash_seq_and_sizes(&connection, &hash_and_format.hash, 1024 * 1024 * 32) 847 | .await 848 | .map_err(show_get_error)?; 849 | let total_size = sizes.iter().sum::(); 850 | let total_files = sizes.len().saturating_sub(1); 851 | let payload_size = sizes.iter().skip(1).sum::(); 852 | eprintln!( 853 | "getting collection {} {} files, {}", 854 | print_hash(&ticket.hash(), args.common.format), 855 | total_files, 856 | HumanBytes(payload_size) 857 | ); 858 | // print the details of the collection only in verbose mode 859 | if args.common.verbose > 0 { 860 | eprintln!( 861 | "getting {} blobs in total, {}", 862 | sizes.len(), 863 | HumanBytes(total_size) 864 | ); 865 | } 866 | let _task = tokio::spawn(show_download_progress(recv, total_size)); 867 | let get_conn = || async move { Ok(connection) }; 868 | let stats = iroh_blobs::get::db::get_to_db(&db, get_conn, &hash_and_format, progress) 869 | .await 870 | .map_err(|e| show_get_error(anyhow::anyhow!(e)))?; 871 | let collection = Collection::load_db(&db, &hash_and_format.hash).await?; 872 | if args.common.verbose > 0 { 873 | for (name, hash) in collection.iter() { 874 | println!(" {} {name}", print_hash(hash, args.common.format)); 875 | } 876 | } 877 | if let Some((name, _)) = collection.iter().next() { 878 | if let Some(first) = name.split('/').next() { 879 | println!("downloading to: {};", first); 880 | } 881 | } 882 | export(db, collection).await?; 883 | tokio::fs::remove_dir_all(iroh_data_dir).await?; 884 | if args.common.verbose > 0 { 885 | println!( 886 | "downloaded {} files, {}. took {} ({}/s)", 887 | total_files, 888 | HumanBytes(payload_size), 889 | HumanDuration(stats.elapsed), 890 | HumanBytes((stats.bytes_read as f64 / stats.elapsed.as_secs_f64()) as u64), 891 | ); 892 | } 893 | Ok(()) 894 | } 895 | 896 | #[tokio::main] 897 | async fn main() -> anyhow::Result<()> { 898 | tracing_subscriber::fmt::init(); 899 | let args = match Args::try_parse() { 900 | Ok(args) => args, 901 | Err(cause) => { 902 | if let Some(text) = cause.get(ContextKind::InvalidSubcommand) { 903 | eprintln!("{} \"{}\"\n", ErrorKind::InvalidSubcommand, text); 904 | eprintln!("Available subcommands are"); 905 | for cmd in Args::command().get_subcommands() { 906 | eprintln!(" {}", style(cmd.get_name()).bold()); 907 | } 908 | std::process::exit(1); 909 | } else { 910 | cause.exit(); 911 | } 912 | } 913 | }; 914 | let res = match args.command { 915 | Commands::Send(args) => send(args).await, 916 | Commands::Receive(args) => receive(args).await, 917 | }; 918 | if let Err(e) = &res { 919 | eprintln!("{e}"); 920 | } 921 | match res { 922 | Ok(()) => std::process::exit(0), 923 | Err(_) => std::process::exit(1), 924 | } 925 | } 926 | -------------------------------------------------------------------------------- /tests/cli.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | io::{self, Read}, 3 | path::{Path, PathBuf}, 4 | str::FromStr, 5 | }; 6 | 7 | use iroh_blobs::ticket::BlobTicket; 8 | 9 | // binary path 10 | fn sendme_bin() -> &'static str { 11 | env!("CARGO_BIN_EXE_sendme") 12 | } 13 | 14 | /// Read `n` lines from `reader`, returning the bytes read including the newlines. 15 | /// 16 | /// This assumes that the header lines are ASCII and can be parsed byte by byte. 17 | fn read_ascii_lines(mut n: usize, reader: &mut impl Read) -> io::Result> { 18 | let mut buf = [0u8; 1]; 19 | let mut res = Vec::new(); 20 | loop { 21 | if reader.read(&mut buf)? != 1 { 22 | break; 23 | } 24 | let char = buf[0]; 25 | res.push(char); 26 | if char != b'\n' { 27 | continue; 28 | } 29 | if n > 1 { 30 | n -= 1; 31 | } else { 32 | break; 33 | } 34 | } 35 | Ok(res) 36 | } 37 | 38 | // fn wait2() -> Arc { 39 | // Arc::new(Barrier::new(2)) 40 | // } 41 | 42 | // /// generate a random, non privileged port 43 | // fn random_port() -> u16 { 44 | // rand::thread_rng().gen_range(10000u16..60000) 45 | // } 46 | 47 | #[test] 48 | fn send_recv_file() { 49 | let name = "somefile.bin"; 50 | let data = vec![0u8; 100]; 51 | // create src and tgt dir, and src file 52 | let src_dir = tempfile::tempdir().unwrap(); 53 | let tgt_dir = tempfile::tempdir().unwrap(); 54 | let src_file = src_dir.path().join(name); 55 | std::fs::write(&src_file, &data).unwrap(); 56 | let mut send_cmd = duct::cmd( 57 | sendme_bin(), 58 | ["send", src_file.as_os_str().to_str().unwrap()], 59 | ) 60 | .dir(src_dir.path()) 61 | .env_remove("RUST_LOG") // disable tracing 62 | .stderr_to_stdout() 63 | .reader() 64 | .unwrap(); 65 | let output = read_ascii_lines(3, &mut send_cmd).unwrap(); 66 | let output = String::from_utf8(output).unwrap(); 67 | let ticket = output.split_ascii_whitespace().last().unwrap(); 68 | let ticket = BlobTicket::from_str(ticket).unwrap(); 69 | let receive_output = duct::cmd(sendme_bin(), ["receive", &ticket.to_string()]) 70 | .dir(tgt_dir.path()) 71 | .env_remove("RUST_LOG") // disable tracing 72 | .stderr_to_stdout() 73 | .run() 74 | .unwrap(); 75 | assert!(receive_output.status.success()); 76 | let tgt_file = tgt_dir.path().join(name); 77 | let tgt_data = std::fs::read(tgt_file).unwrap(); 78 | assert_eq!(tgt_data, data); 79 | } 80 | 81 | #[test] 82 | fn send_recv_dir() { 83 | fn create_file(base: &Path, i: usize, j: usize, k: usize) -> (PathBuf, Vec) { 84 | let name = base 85 | .join(format!("dir-{}", i)) 86 | .join(format!("subdir-{}", j)) 87 | .join(format!("file-{}", k)); 88 | let len = i * 100 + j * 10 + k; 89 | let data = vec![0u8; len]; 90 | (name, data) 91 | } 92 | 93 | // create src and tgt dir, and src file 94 | let src_dir = tempfile::tempdir().unwrap(); 95 | let tgt_dir = tempfile::tempdir().unwrap(); 96 | let src_data_dir = src_dir.path().join("data"); 97 | let tgt_data_dir = tgt_dir.path().join("data"); 98 | // create a complex directory structure 99 | for i in 0..5 { 100 | for j in 0..5 { 101 | for k in 0..5 { 102 | let (name, data) = create_file(&src_data_dir, i, j, k); 103 | std::fs::create_dir_all(name.parent().unwrap()).unwrap(); 104 | std::fs::write(&name, &data).unwrap(); 105 | } 106 | } 107 | } 108 | let mut send_cmd = duct::cmd( 109 | sendme_bin(), 110 | ["send", src_data_dir.as_os_str().to_str().unwrap()], 111 | ) 112 | .dir(src_dir.path()) 113 | .env_remove("RUST_LOG") // disable tracing 114 | .stderr_to_stdout() 115 | .reader() 116 | .unwrap(); 117 | let output = read_ascii_lines(3, &mut send_cmd).unwrap(); 118 | let output = String::from_utf8(output).unwrap(); 119 | let ticket = output.split_ascii_whitespace().last().unwrap(); 120 | let ticket = BlobTicket::from_str(ticket).unwrap(); 121 | let receive_output = duct::cmd(sendme_bin(), ["receive", &ticket.to_string()]) 122 | .dir(tgt_dir.path()) 123 | .env_remove("RUST_LOG") // disable tracing 124 | .stderr_to_stdout() 125 | .run() 126 | .unwrap(); 127 | assert!(receive_output.status.success()); 128 | // validate directory structure 129 | for i in 0..5 { 130 | for j in 0..5 { 131 | for k in 0..5 { 132 | let (name, data) = create_file(&tgt_data_dir, i, j, k); 133 | let tgt_data = std::fs::read(&name).unwrap(); 134 | assert_eq!(tgt_data, data); 135 | } 136 | } 137 | } 138 | } 139 | --------------------------------------------------------------------------------