├── .github └── workflows │ └── release-binary.yaml ├── .gitignore ├── CHANGELOG.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE.md ├── README.md ├── example-project ├── .cargo │ └── config.toml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── examples │ ├── example.rs │ ├── snippets.rs │ └── snippets │ │ └── snippet.js ├── index.html └── src │ └── main.rs ├── rustfmt.toml ├── src ├── main.rs ├── server.rs ├── server │ └── certificate.rs └── wasm_bindgen.rs └── static └── index.html /.github/workflows/release-binary.yaml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | permissions: 4 | contents: write 5 | 6 | on: 7 | push: 8 | tags: 9 | - v[0-9]+.* 10 | 11 | jobs: 12 | create-release: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - uses: taiki-e/create-gh-release-action@v1 17 | with: 18 | changelog: CHANGELOG.md 19 | token: ${{ secrets.GITHUB_TOKEN }} 20 | 21 | upload-assets: 22 | runs-on: ubuntu-latest 23 | steps: 24 | - uses: actions/checkout@v3 25 | - uses: taiki-e/upload-rust-binary-action@v1 26 | with: 27 | bin: wasm-server-runner 28 | archive: $bin-$target 29 | token: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 1.0.0 2 | 3 | - Improve the error message you get when `wasm-bindgen` versions mismatch. 4 | - remove `Bindgen::reference_types` in favor of runtime detection 5 | - fix `WASM_SERVER_RUNNER_ADDRESS` parsing: it now supports `[::1]` without a specified port 6 | - update dependencies 7 | 8 | ## 0.6.3 9 | - update dependencies 10 | - remove `Bindgen::weak_refs` in favor of runtime detection 11 | 12 | ## 0.6.2 13 | - update dependencies 14 | 15 | ## 0.6.1 16 | - hide winit's "Using exceptions for control flow" error 17 | 18 | ## 0.6.0 19 | - only load a custom `index.html` when the `WASM_SERVER_RUNNER_CUSTOM_INDEX_HTML` environment variable is set 20 | - fix a panic during log relaying 21 | 22 | ## 0.5.0 23 | - relay logging from website back to console 24 | - cache https certificates 25 | - load `index.html` from directory if present 26 | - accept `true`/`1`/`yes` for bool options 27 | - use proper compression negotiation 28 | - improve mobile support 29 | 30 | ## 0.4.0 31 | - add workaround to make audio triggered in wasm play with any user interaction 32 | - make sure body fills whole page 33 | - add ability to use a custom serve directory 34 | - enable `--weak-refs` and `--reference-types` in `wasm-bindgen` 35 | 36 | ## 0.3.0 37 | - support wasm-bindgen snippets 38 | - use brotli at level 5 for compression (for good speed/size tradeoff) 39 | - support https (also with self-signed certificate) 40 | - add COOP and COEP headers 41 | - add ability to generate non-module JS 42 | 43 | ## 0.2.4 44 | - keep polling the server for updates forever 45 | 46 | ## 0.2.2 47 | - allow listening address to be customized with environment variable 48 | - clarify that printed size is compressed 49 | 50 | ## 0.2.1 51 | - prevent right click on body 52 | - add some more logs 53 | - try to fix fullscreen for bevy apps 54 | 55 | ## 0.2.0 56 | - pick free port instead of hardcoding `1338` 57 | - poll updates to reload page 58 | - compress wasm file using gzip 59 | 60 | ## 0.1.0 61 | 62 | - initial release 63 | -------------------------------------------------------------------------------- /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 0.31.1", 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 = "ahash" 22 | version = "0.8.11" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 25 | dependencies = [ 26 | "cfg-if", 27 | "once_cell", 28 | "version_check", 29 | "zerocopy 0.7.35", 30 | ] 31 | 32 | [[package]] 33 | name = "aho-corasick" 34 | version = "1.1.3" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 37 | dependencies = [ 38 | "memchr", 39 | ] 40 | 41 | [[package]] 42 | name = "alloc-no-stdlib" 43 | version = "2.0.4" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 46 | 47 | [[package]] 48 | name = "alloc-stdlib" 49 | version = "0.2.2" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 52 | dependencies = [ 53 | "alloc-no-stdlib", 54 | ] 55 | 56 | [[package]] 57 | name = "anyhow" 58 | version = "1.0.97" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" 61 | 62 | [[package]] 63 | name = "arc-swap" 64 | version = "1.7.1" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" 67 | 68 | [[package]] 69 | name = "async-compression" 70 | version = "0.4.21" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "c0cf008e5e1a9e9e22a7d3c9a4992e21a350290069e36d8fb72304ed17e8f2d2" 73 | dependencies = [ 74 | "brotli", 75 | "flate2", 76 | "futures-core", 77 | "memchr", 78 | "pin-project-lite", 79 | "tokio", 80 | "zstd", 81 | "zstd-safe", 82 | ] 83 | 84 | [[package]] 85 | name = "atomic-waker" 86 | version = "1.1.2" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 89 | 90 | [[package]] 91 | name = "autocfg" 92 | version = "1.4.0" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 95 | 96 | [[package]] 97 | name = "aws-lc-rs" 98 | version = "1.12.6" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "dabb68eb3a7aa08b46fddfd59a3d55c978243557a90ab804769f7e20e67d2b01" 101 | dependencies = [ 102 | "aws-lc-sys", 103 | "zeroize", 104 | ] 105 | 106 | [[package]] 107 | name = "aws-lc-sys" 108 | version = "0.27.1" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "77926887776171ced7d662120a75998e444d3750c951abfe07f90da130514b1f" 111 | dependencies = [ 112 | "bindgen", 113 | "cc", 114 | "cmake", 115 | "dunce", 116 | "fs_extra", 117 | ] 118 | 119 | [[package]] 120 | name = "axum" 121 | version = "0.8.1" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" 124 | dependencies = [ 125 | "axum-core", 126 | "base64", 127 | "bytes", 128 | "futures-util", 129 | "http", 130 | "http-body", 131 | "http-body-util", 132 | "hyper", 133 | "hyper-util", 134 | "itoa", 135 | "matchit", 136 | "memchr", 137 | "mime", 138 | "percent-encoding", 139 | "pin-project-lite", 140 | "rustversion", 141 | "serde", 142 | "sha1", 143 | "sync_wrapper", 144 | "tokio", 145 | "tokio-tungstenite", 146 | "tower", 147 | "tower-layer", 148 | "tower-service", 149 | ] 150 | 151 | [[package]] 152 | name = "axum-core" 153 | version = "0.5.0" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" 156 | dependencies = [ 157 | "bytes", 158 | "futures-util", 159 | "http", 160 | "http-body", 161 | "http-body-util", 162 | "mime", 163 | "pin-project-lite", 164 | "rustversion", 165 | "sync_wrapper", 166 | "tower-layer", 167 | "tower-service", 168 | ] 169 | 170 | [[package]] 171 | name = "axum-server" 172 | version = "0.7.2" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "495c05f60d6df0093e8fb6e74aa5846a0ad06abaf96d76166283720bf740f8ab" 175 | dependencies = [ 176 | "arc-swap", 177 | "bytes", 178 | "fs-err", 179 | "http", 180 | "http-body", 181 | "hyper", 182 | "hyper-util", 183 | "pin-project-lite", 184 | "rustls", 185 | "rustls-pemfile", 186 | "rustls-pki-types", 187 | "tokio", 188 | "tokio-rustls", 189 | "tower-service", 190 | ] 191 | 192 | [[package]] 193 | name = "axum-server-dual-protocol" 194 | version = "0.7.0" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | checksum = "2164551db024e87f20316d164eab9f5ad342d8188b08051ceb15ca92a60ea7b7" 197 | dependencies = [ 198 | "axum-server", 199 | "bytes", 200 | "http", 201 | "http-body-util", 202 | "pin-project", 203 | "rustls", 204 | "tokio", 205 | "tokio-rustls", 206 | "tokio-util", 207 | "tower-layer", 208 | "tower-service", 209 | ] 210 | 211 | [[package]] 212 | name = "backtrace" 213 | version = "0.3.74" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 216 | dependencies = [ 217 | "addr2line", 218 | "cfg-if", 219 | "libc", 220 | "miniz_oxide", 221 | "object", 222 | "rustc-demangle", 223 | "windows-targets", 224 | ] 225 | 226 | [[package]] 227 | name = "base64" 228 | version = "0.22.1" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 231 | 232 | [[package]] 233 | name = "bindgen" 234 | version = "0.69.5" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" 237 | dependencies = [ 238 | "bitflags", 239 | "cexpr", 240 | "clang-sys", 241 | "itertools", 242 | "lazy_static", 243 | "lazycell", 244 | "log", 245 | "prettyplease", 246 | "proc-macro2", 247 | "quote", 248 | "regex", 249 | "rustc-hash", 250 | "shlex", 251 | "syn", 252 | "which", 253 | ] 254 | 255 | [[package]] 256 | name = "bitflags" 257 | version = "2.9.0" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 260 | 261 | [[package]] 262 | name = "block-buffer" 263 | version = "0.10.4" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 266 | dependencies = [ 267 | "generic-array", 268 | ] 269 | 270 | [[package]] 271 | name = "brotli" 272 | version = "7.0.0" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" 275 | dependencies = [ 276 | "alloc-no-stdlib", 277 | "alloc-stdlib", 278 | "brotli-decompressor", 279 | ] 280 | 281 | [[package]] 282 | name = "brotli-decompressor" 283 | version = "4.0.2" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" 286 | dependencies = [ 287 | "alloc-no-stdlib", 288 | "alloc-stdlib", 289 | ] 290 | 291 | [[package]] 292 | name = "bytes" 293 | version = "1.10.1" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 296 | 297 | [[package]] 298 | name = "cc" 299 | version = "1.2.17" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" 302 | dependencies = [ 303 | "jobserver", 304 | "libc", 305 | "shlex", 306 | ] 307 | 308 | [[package]] 309 | name = "cexpr" 310 | version = "0.6.0" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 313 | dependencies = [ 314 | "nom", 315 | ] 316 | 317 | [[package]] 318 | name = "cfg-if" 319 | version = "1.0.0" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 322 | 323 | [[package]] 324 | name = "clang-sys" 325 | version = "1.8.1" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 328 | dependencies = [ 329 | "glob", 330 | "libc", 331 | "libloading", 332 | ] 333 | 334 | [[package]] 335 | name = "cmake" 336 | version = "0.1.54" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" 339 | dependencies = [ 340 | "cc", 341 | ] 342 | 343 | [[package]] 344 | name = "cpufeatures" 345 | version = "0.2.17" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 348 | dependencies = [ 349 | "libc", 350 | ] 351 | 352 | [[package]] 353 | name = "crc32fast" 354 | version = "1.4.2" 355 | source = "registry+https://github.com/rust-lang/crates.io-index" 356 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 357 | dependencies = [ 358 | "cfg-if", 359 | ] 360 | 361 | [[package]] 362 | name = "crossbeam-deque" 363 | version = "0.8.6" 364 | source = "registry+https://github.com/rust-lang/crates.io-index" 365 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 366 | dependencies = [ 367 | "crossbeam-epoch", 368 | "crossbeam-utils", 369 | ] 370 | 371 | [[package]] 372 | name = "crossbeam-epoch" 373 | version = "0.9.18" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 376 | dependencies = [ 377 | "crossbeam-utils", 378 | ] 379 | 380 | [[package]] 381 | name = "crossbeam-utils" 382 | version = "0.8.21" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 385 | 386 | [[package]] 387 | name = "crypto-common" 388 | version = "0.1.6" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 391 | dependencies = [ 392 | "generic-array", 393 | "typenum", 394 | ] 395 | 396 | [[package]] 397 | name = "data-encoding" 398 | version = "2.8.0" 399 | source = "registry+https://github.com/rust-lang/crates.io-index" 400 | checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" 401 | 402 | [[package]] 403 | name = "deranged" 404 | version = "0.4.1" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" 407 | dependencies = [ 408 | "powerfmt", 409 | ] 410 | 411 | [[package]] 412 | name = "digest" 413 | version = "0.10.7" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 416 | dependencies = [ 417 | "block-buffer", 418 | "crypto-common", 419 | ] 420 | 421 | [[package]] 422 | name = "directories" 423 | version = "6.0.0" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" 426 | dependencies = [ 427 | "dirs-sys", 428 | ] 429 | 430 | [[package]] 431 | name = "dirs-sys" 432 | version = "0.5.0" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" 435 | dependencies = [ 436 | "libc", 437 | "option-ext", 438 | "redox_users", 439 | "windows-sys 0.59.0", 440 | ] 441 | 442 | [[package]] 443 | name = "dunce" 444 | version = "1.0.5" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" 447 | 448 | [[package]] 449 | name = "either" 450 | version = "1.15.0" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 453 | 454 | [[package]] 455 | name = "equivalent" 456 | version = "1.0.2" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 459 | 460 | [[package]] 461 | name = "errno" 462 | version = "0.3.10" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 465 | dependencies = [ 466 | "libc", 467 | "windows-sys 0.59.0", 468 | ] 469 | 470 | [[package]] 471 | name = "fallible-iterator" 472 | version = "0.2.0" 473 | source = "registry+https://github.com/rust-lang/crates.io-index" 474 | checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" 475 | 476 | [[package]] 477 | name = "fastrand" 478 | version = "2.3.0" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 481 | 482 | [[package]] 483 | name = "flate2" 484 | version = "1.1.0" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" 487 | dependencies = [ 488 | "crc32fast", 489 | "miniz_oxide", 490 | ] 491 | 492 | [[package]] 493 | name = "fnv" 494 | version = "1.0.7" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 497 | 498 | [[package]] 499 | name = "fs-err" 500 | version = "3.1.0" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "1f89bda4c2a21204059a977ed3bfe746677dfd137b83c339e702b0ac91d482aa" 503 | dependencies = [ 504 | "autocfg", 505 | "tokio", 506 | ] 507 | 508 | [[package]] 509 | name = "fs_extra" 510 | version = "1.3.0" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" 513 | 514 | [[package]] 515 | name = "futures-channel" 516 | version = "0.3.31" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 519 | dependencies = [ 520 | "futures-core", 521 | ] 522 | 523 | [[package]] 524 | name = "futures-core" 525 | version = "0.3.31" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 528 | 529 | [[package]] 530 | name = "futures-sink" 531 | version = "0.3.31" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 534 | 535 | [[package]] 536 | name = "futures-task" 537 | version = "0.3.31" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 540 | 541 | [[package]] 542 | name = "futures-util" 543 | version = "0.3.31" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 546 | dependencies = [ 547 | "futures-core", 548 | "futures-sink", 549 | "futures-task", 550 | "pin-project-lite", 551 | "pin-utils", 552 | "slab", 553 | ] 554 | 555 | [[package]] 556 | name = "generic-array" 557 | version = "0.14.7" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 560 | dependencies = [ 561 | "typenum", 562 | "version_check", 563 | ] 564 | 565 | [[package]] 566 | name = "getrandom" 567 | version = "0.2.15" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 570 | dependencies = [ 571 | "cfg-if", 572 | "libc", 573 | "wasi 0.11.0+wasi-snapshot-preview1", 574 | ] 575 | 576 | [[package]] 577 | name = "getrandom" 578 | version = "0.3.2" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" 581 | dependencies = [ 582 | "cfg-if", 583 | "libc", 584 | "r-efi", 585 | "wasi 0.14.2+wasi-0.2.4", 586 | ] 587 | 588 | [[package]] 589 | name = "gimli" 590 | version = "0.26.2" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" 593 | dependencies = [ 594 | "fallible-iterator", 595 | "indexmap 1.9.3", 596 | "stable_deref_trait", 597 | ] 598 | 599 | [[package]] 600 | name = "gimli" 601 | version = "0.31.1" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 604 | 605 | [[package]] 606 | name = "glob" 607 | version = "0.3.2" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 610 | 611 | [[package]] 612 | name = "h2" 613 | version = "0.4.8" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" 616 | dependencies = [ 617 | "atomic-waker", 618 | "bytes", 619 | "fnv", 620 | "futures-core", 621 | "futures-sink", 622 | "http", 623 | "indexmap 2.8.0", 624 | "slab", 625 | "tokio", 626 | "tokio-util", 627 | "tracing", 628 | ] 629 | 630 | [[package]] 631 | name = "hashbrown" 632 | version = "0.12.3" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 635 | 636 | [[package]] 637 | name = "hashbrown" 638 | version = "0.14.5" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 641 | dependencies = [ 642 | "ahash", 643 | "serde", 644 | ] 645 | 646 | [[package]] 647 | name = "hashbrown" 648 | version = "0.15.2" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 651 | 652 | [[package]] 653 | name = "heck" 654 | version = "0.5.0" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 657 | 658 | [[package]] 659 | name = "home" 660 | version = "0.5.11" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 663 | dependencies = [ 664 | "windows-sys 0.59.0", 665 | ] 666 | 667 | [[package]] 668 | name = "http" 669 | version = "1.3.1" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 672 | dependencies = [ 673 | "bytes", 674 | "fnv", 675 | "itoa", 676 | ] 677 | 678 | [[package]] 679 | name = "http-body" 680 | version = "1.0.1" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 683 | dependencies = [ 684 | "bytes", 685 | "http", 686 | ] 687 | 688 | [[package]] 689 | name = "http-body-util" 690 | version = "0.1.3" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 693 | dependencies = [ 694 | "bytes", 695 | "futures-core", 696 | "http", 697 | "http-body", 698 | "pin-project-lite", 699 | ] 700 | 701 | [[package]] 702 | name = "http-range-header" 703 | version = "0.4.2" 704 | source = "registry+https://github.com/rust-lang/crates.io-index" 705 | checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" 706 | 707 | [[package]] 708 | name = "httparse" 709 | version = "1.10.1" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 712 | 713 | [[package]] 714 | name = "httpdate" 715 | version = "1.0.3" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 718 | 719 | [[package]] 720 | name = "hyper" 721 | version = "1.6.0" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 724 | dependencies = [ 725 | "bytes", 726 | "futures-channel", 727 | "futures-util", 728 | "h2", 729 | "http", 730 | "http-body", 731 | "httparse", 732 | "httpdate", 733 | "itoa", 734 | "pin-project-lite", 735 | "smallvec", 736 | "tokio", 737 | ] 738 | 739 | [[package]] 740 | name = "hyper-util" 741 | version = "0.1.10" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" 744 | dependencies = [ 745 | "bytes", 746 | "futures-util", 747 | "http", 748 | "http-body", 749 | "hyper", 750 | "pin-project-lite", 751 | "tokio", 752 | "tower-service", 753 | ] 754 | 755 | [[package]] 756 | name = "id-arena" 757 | version = "2.2.1" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" 760 | dependencies = [ 761 | "rayon", 762 | ] 763 | 764 | [[package]] 765 | name = "indexmap" 766 | version = "1.9.3" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 769 | dependencies = [ 770 | "autocfg", 771 | "hashbrown 0.12.3", 772 | ] 773 | 774 | [[package]] 775 | name = "indexmap" 776 | version = "2.8.0" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" 779 | dependencies = [ 780 | "equivalent", 781 | "hashbrown 0.15.2", 782 | "serde", 783 | ] 784 | 785 | [[package]] 786 | name = "itertools" 787 | version = "0.12.1" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 790 | dependencies = [ 791 | "either", 792 | ] 793 | 794 | [[package]] 795 | name = "itoa" 796 | version = "1.0.15" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 799 | 800 | [[package]] 801 | name = "jobserver" 802 | version = "0.1.32" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 805 | dependencies = [ 806 | "libc", 807 | ] 808 | 809 | [[package]] 810 | name = "lazy_static" 811 | version = "1.5.0" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 814 | 815 | [[package]] 816 | name = "lazycell" 817 | version = "1.3.0" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 820 | 821 | [[package]] 822 | name = "leb128" 823 | version = "0.2.5" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" 826 | 827 | [[package]] 828 | name = "libc" 829 | version = "0.2.171" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" 832 | 833 | [[package]] 834 | name = "libloading" 835 | version = "0.8.6" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 838 | dependencies = [ 839 | "cfg-if", 840 | "windows-targets", 841 | ] 842 | 843 | [[package]] 844 | name = "libredox" 845 | version = "0.1.3" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 848 | dependencies = [ 849 | "bitflags", 850 | "libc", 851 | ] 852 | 853 | [[package]] 854 | name = "linux-raw-sys" 855 | version = "0.4.15" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 858 | 859 | [[package]] 860 | name = "linux-raw-sys" 861 | version = "0.9.3" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" 864 | 865 | [[package]] 866 | name = "log" 867 | version = "0.4.27" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 870 | 871 | [[package]] 872 | name = "matchers" 873 | version = "0.1.0" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 876 | dependencies = [ 877 | "regex-automata 0.1.10", 878 | ] 879 | 880 | [[package]] 881 | name = "matchit" 882 | version = "0.8.4" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 885 | 886 | [[package]] 887 | name = "memchr" 888 | version = "2.7.4" 889 | source = "registry+https://github.com/rust-lang/crates.io-index" 890 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 891 | 892 | [[package]] 893 | name = "mime" 894 | version = "0.3.17" 895 | source = "registry+https://github.com/rust-lang/crates.io-index" 896 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 897 | 898 | [[package]] 899 | name = "mime_guess" 900 | version = "2.0.5" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 903 | dependencies = [ 904 | "mime", 905 | "unicase", 906 | ] 907 | 908 | [[package]] 909 | name = "minimal-lexical" 910 | version = "0.2.1" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 913 | 914 | [[package]] 915 | name = "miniz_oxide" 916 | version = "0.8.5" 917 | source = "registry+https://github.com/rust-lang/crates.io-index" 918 | checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" 919 | dependencies = [ 920 | "adler2", 921 | ] 922 | 923 | [[package]] 924 | name = "mio" 925 | version = "1.0.3" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 928 | dependencies = [ 929 | "libc", 930 | "wasi 0.11.0+wasi-snapshot-preview1", 931 | "windows-sys 0.52.0", 932 | ] 933 | 934 | [[package]] 935 | name = "nom" 936 | version = "7.1.3" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 939 | dependencies = [ 940 | "memchr", 941 | "minimal-lexical", 942 | ] 943 | 944 | [[package]] 945 | name = "nu-ansi-term" 946 | version = "0.46.0" 947 | source = "registry+https://github.com/rust-lang/crates.io-index" 948 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 949 | dependencies = [ 950 | "overload", 951 | "winapi", 952 | ] 953 | 954 | [[package]] 955 | name = "num-conv" 956 | version = "0.1.0" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 959 | 960 | [[package]] 961 | name = "object" 962 | version = "0.36.7" 963 | source = "registry+https://github.com/rust-lang/crates.io-index" 964 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 965 | dependencies = [ 966 | "memchr", 967 | ] 968 | 969 | [[package]] 970 | name = "once_cell" 971 | version = "1.21.1" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" 974 | 975 | [[package]] 976 | name = "option-ext" 977 | version = "0.2.0" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 980 | 981 | [[package]] 982 | name = "overload" 983 | version = "0.1.1" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 986 | 987 | [[package]] 988 | name = "percent-encoding" 989 | version = "2.3.1" 990 | source = "registry+https://github.com/rust-lang/crates.io-index" 991 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 992 | 993 | [[package]] 994 | name = "pin-project" 995 | version = "1.1.10" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 998 | dependencies = [ 999 | "pin-project-internal", 1000 | ] 1001 | 1002 | [[package]] 1003 | name = "pin-project-internal" 1004 | version = "1.1.10" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 1007 | dependencies = [ 1008 | "proc-macro2", 1009 | "quote", 1010 | "syn", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "pin-project-lite" 1015 | version = "0.2.16" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1018 | 1019 | [[package]] 1020 | name = "pin-utils" 1021 | version = "0.1.0" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1024 | 1025 | [[package]] 1026 | name = "pkg-config" 1027 | version = "0.3.32" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1030 | 1031 | [[package]] 1032 | name = "powerfmt" 1033 | version = "0.2.0" 1034 | source = "registry+https://github.com/rust-lang/crates.io-index" 1035 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1036 | 1037 | [[package]] 1038 | name = "ppv-lite86" 1039 | version = "0.2.21" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1042 | dependencies = [ 1043 | "zerocopy 0.8.24", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "prettyplease" 1048 | version = "0.2.31" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" 1051 | dependencies = [ 1052 | "proc-macro2", 1053 | "syn", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "proc-macro2" 1058 | version = "1.0.94" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" 1061 | dependencies = [ 1062 | "unicode-ident", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "quote" 1067 | version = "1.0.40" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1070 | dependencies = [ 1071 | "proc-macro2", 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "r-efi" 1076 | version = "5.2.0" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1079 | 1080 | [[package]] 1081 | name = "rand" 1082 | version = "0.9.0" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" 1085 | dependencies = [ 1086 | "rand_chacha", 1087 | "rand_core", 1088 | "zerocopy 0.8.24", 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "rand_chacha" 1093 | version = "0.9.0" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1096 | dependencies = [ 1097 | "ppv-lite86", 1098 | "rand_core", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "rand_core" 1103 | version = "0.9.3" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 1106 | dependencies = [ 1107 | "getrandom 0.3.2", 1108 | ] 1109 | 1110 | [[package]] 1111 | name = "rayon" 1112 | version = "1.10.0" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1115 | dependencies = [ 1116 | "either", 1117 | "rayon-core", 1118 | ] 1119 | 1120 | [[package]] 1121 | name = "rayon-core" 1122 | version = "1.12.1" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1125 | dependencies = [ 1126 | "crossbeam-deque", 1127 | "crossbeam-utils", 1128 | ] 1129 | 1130 | [[package]] 1131 | name = "rcgen" 1132 | version = "0.13.2" 1133 | source = "registry+https://github.com/rust-lang/crates.io-index" 1134 | checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" 1135 | dependencies = [ 1136 | "aws-lc-rs", 1137 | "rustls-pki-types", 1138 | "time", 1139 | "yasna", 1140 | ] 1141 | 1142 | [[package]] 1143 | name = "redox_users" 1144 | version = "0.5.0" 1145 | source = "registry+https://github.com/rust-lang/crates.io-index" 1146 | checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 1147 | dependencies = [ 1148 | "getrandom 0.2.15", 1149 | "libredox", 1150 | "thiserror", 1151 | ] 1152 | 1153 | [[package]] 1154 | name = "regex" 1155 | version = "1.11.1" 1156 | source = "registry+https://github.com/rust-lang/crates.io-index" 1157 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1158 | dependencies = [ 1159 | "aho-corasick", 1160 | "memchr", 1161 | "regex-automata 0.4.9", 1162 | "regex-syntax 0.8.5", 1163 | ] 1164 | 1165 | [[package]] 1166 | name = "regex-automata" 1167 | version = "0.1.10" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1170 | dependencies = [ 1171 | "regex-syntax 0.6.29", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "regex-automata" 1176 | version = "0.4.9" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1179 | dependencies = [ 1180 | "aho-corasick", 1181 | "memchr", 1182 | "regex-syntax 0.8.5", 1183 | ] 1184 | 1185 | [[package]] 1186 | name = "regex-syntax" 1187 | version = "0.6.29" 1188 | source = "registry+https://github.com/rust-lang/crates.io-index" 1189 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1190 | 1191 | [[package]] 1192 | name = "regex-syntax" 1193 | version = "0.8.5" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1196 | 1197 | [[package]] 1198 | name = "ring" 1199 | version = "0.17.14" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1202 | dependencies = [ 1203 | "cc", 1204 | "cfg-if", 1205 | "getrandom 0.2.15", 1206 | "libc", 1207 | "untrusted", 1208 | "windows-sys 0.52.0", 1209 | ] 1210 | 1211 | [[package]] 1212 | name = "rustc-demangle" 1213 | version = "0.1.24" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1216 | 1217 | [[package]] 1218 | name = "rustc-hash" 1219 | version = "1.1.0" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1222 | 1223 | [[package]] 1224 | name = "rustix" 1225 | version = "0.38.44" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1228 | dependencies = [ 1229 | "bitflags", 1230 | "errno", 1231 | "libc", 1232 | "linux-raw-sys 0.4.15", 1233 | "windows-sys 0.59.0", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "rustix" 1238 | version = "1.0.3" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" 1241 | dependencies = [ 1242 | "bitflags", 1243 | "errno", 1244 | "libc", 1245 | "linux-raw-sys 0.9.3", 1246 | "windows-sys 0.59.0", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "rustls" 1251 | version = "0.23.25" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" 1254 | dependencies = [ 1255 | "aws-lc-rs", 1256 | "once_cell", 1257 | "rustls-pki-types", 1258 | "rustls-webpki", 1259 | "subtle", 1260 | "zeroize", 1261 | ] 1262 | 1263 | [[package]] 1264 | name = "rustls-pemfile" 1265 | version = "2.2.0" 1266 | source = "registry+https://github.com/rust-lang/crates.io-index" 1267 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 1268 | dependencies = [ 1269 | "rustls-pki-types", 1270 | ] 1271 | 1272 | [[package]] 1273 | name = "rustls-pki-types" 1274 | version = "1.11.0" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 1277 | 1278 | [[package]] 1279 | name = "rustls-webpki" 1280 | version = "0.103.0" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" 1283 | dependencies = [ 1284 | "aws-lc-rs", 1285 | "ring", 1286 | "rustls-pki-types", 1287 | "untrusted", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "rustversion" 1292 | version = "1.0.20" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 1295 | 1296 | [[package]] 1297 | name = "ryu" 1298 | version = "1.0.20" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1301 | 1302 | [[package]] 1303 | name = "semver" 1304 | version = "1.0.26" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 1307 | 1308 | [[package]] 1309 | name = "serde" 1310 | version = "1.0.219" 1311 | source = "registry+https://github.com/rust-lang/crates.io-index" 1312 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1313 | dependencies = [ 1314 | "serde_derive", 1315 | ] 1316 | 1317 | [[package]] 1318 | name = "serde_derive" 1319 | version = "1.0.219" 1320 | source = "registry+https://github.com/rust-lang/crates.io-index" 1321 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1322 | dependencies = [ 1323 | "proc-macro2", 1324 | "quote", 1325 | "syn", 1326 | ] 1327 | 1328 | [[package]] 1329 | name = "serde_json" 1330 | version = "1.0.140" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 1333 | dependencies = [ 1334 | "itoa", 1335 | "memchr", 1336 | "ryu", 1337 | "serde", 1338 | ] 1339 | 1340 | [[package]] 1341 | name = "sha1" 1342 | version = "0.10.6" 1343 | source = "registry+https://github.com/rust-lang/crates.io-index" 1344 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1345 | dependencies = [ 1346 | "cfg-if", 1347 | "cpufeatures", 1348 | "digest", 1349 | ] 1350 | 1351 | [[package]] 1352 | name = "sharded-slab" 1353 | version = "0.1.7" 1354 | source = "registry+https://github.com/rust-lang/crates.io-index" 1355 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1356 | dependencies = [ 1357 | "lazy_static", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "shlex" 1362 | version = "1.3.0" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1365 | 1366 | [[package]] 1367 | name = "slab" 1368 | version = "0.4.9" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1371 | dependencies = [ 1372 | "autocfg", 1373 | ] 1374 | 1375 | [[package]] 1376 | name = "smallvec" 1377 | version = "1.14.0" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 1380 | 1381 | [[package]] 1382 | name = "socket2" 1383 | version = "0.5.8" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 1386 | dependencies = [ 1387 | "libc", 1388 | "windows-sys 0.52.0", 1389 | ] 1390 | 1391 | [[package]] 1392 | name = "stable_deref_trait" 1393 | version = "1.2.0" 1394 | source = "registry+https://github.com/rust-lang/crates.io-index" 1395 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1396 | 1397 | [[package]] 1398 | name = "subtle" 1399 | version = "2.6.1" 1400 | source = "registry+https://github.com/rust-lang/crates.io-index" 1401 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1402 | 1403 | [[package]] 1404 | name = "syn" 1405 | version = "2.0.100" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 1408 | dependencies = [ 1409 | "proc-macro2", 1410 | "quote", 1411 | "unicode-ident", 1412 | ] 1413 | 1414 | [[package]] 1415 | name = "sync_wrapper" 1416 | version = "1.0.2" 1417 | source = "registry+https://github.com/rust-lang/crates.io-index" 1418 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1419 | 1420 | [[package]] 1421 | name = "tempfile" 1422 | version = "3.19.1" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" 1425 | dependencies = [ 1426 | "fastrand", 1427 | "getrandom 0.3.2", 1428 | "once_cell", 1429 | "rustix 1.0.3", 1430 | "windows-sys 0.59.0", 1431 | ] 1432 | 1433 | [[package]] 1434 | name = "thiserror" 1435 | version = "2.0.12" 1436 | source = "registry+https://github.com/rust-lang/crates.io-index" 1437 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 1438 | dependencies = [ 1439 | "thiserror-impl", 1440 | ] 1441 | 1442 | [[package]] 1443 | name = "thiserror-impl" 1444 | version = "2.0.12" 1445 | source = "registry+https://github.com/rust-lang/crates.io-index" 1446 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 1447 | dependencies = [ 1448 | "proc-macro2", 1449 | "quote", 1450 | "syn", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "thread_local" 1455 | version = "1.1.8" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1458 | dependencies = [ 1459 | "cfg-if", 1460 | "once_cell", 1461 | ] 1462 | 1463 | [[package]] 1464 | name = "time" 1465 | version = "0.3.41" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 1468 | dependencies = [ 1469 | "deranged", 1470 | "num-conv", 1471 | "powerfmt", 1472 | "serde", 1473 | "time-core", 1474 | ] 1475 | 1476 | [[package]] 1477 | name = "time-core" 1478 | version = "0.1.4" 1479 | source = "registry+https://github.com/rust-lang/crates.io-index" 1480 | checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 1481 | 1482 | [[package]] 1483 | name = "tokio" 1484 | version = "1.44.1" 1485 | source = "registry+https://github.com/rust-lang/crates.io-index" 1486 | checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" 1487 | dependencies = [ 1488 | "backtrace", 1489 | "bytes", 1490 | "libc", 1491 | "mio", 1492 | "pin-project-lite", 1493 | "socket2", 1494 | "tokio-macros", 1495 | "windows-sys 0.52.0", 1496 | ] 1497 | 1498 | [[package]] 1499 | name = "tokio-macros" 1500 | version = "2.5.0" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1503 | dependencies = [ 1504 | "proc-macro2", 1505 | "quote", 1506 | "syn", 1507 | ] 1508 | 1509 | [[package]] 1510 | name = "tokio-rustls" 1511 | version = "0.26.2" 1512 | source = "registry+https://github.com/rust-lang/crates.io-index" 1513 | checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 1514 | dependencies = [ 1515 | "rustls", 1516 | "tokio", 1517 | ] 1518 | 1519 | [[package]] 1520 | name = "tokio-tungstenite" 1521 | version = "0.26.2" 1522 | source = "registry+https://github.com/rust-lang/crates.io-index" 1523 | checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" 1524 | dependencies = [ 1525 | "futures-util", 1526 | "log", 1527 | "tokio", 1528 | "tungstenite", 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "tokio-util" 1533 | version = "0.7.14" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" 1536 | dependencies = [ 1537 | "bytes", 1538 | "futures-core", 1539 | "futures-sink", 1540 | "pin-project-lite", 1541 | "tokio", 1542 | ] 1543 | 1544 | [[package]] 1545 | name = "tower" 1546 | version = "0.5.2" 1547 | source = "registry+https://github.com/rust-lang/crates.io-index" 1548 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1549 | dependencies = [ 1550 | "futures-core", 1551 | "futures-util", 1552 | "pin-project-lite", 1553 | "sync_wrapper", 1554 | "tokio", 1555 | "tower-layer", 1556 | "tower-service", 1557 | ] 1558 | 1559 | [[package]] 1560 | name = "tower-http" 1561 | version = "0.6.2" 1562 | source = "registry+https://github.com/rust-lang/crates.io-index" 1563 | checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" 1564 | dependencies = [ 1565 | "async-compression", 1566 | "bitflags", 1567 | "bytes", 1568 | "futures-core", 1569 | "futures-util", 1570 | "http", 1571 | "http-body", 1572 | "http-body-util", 1573 | "http-range-header", 1574 | "httpdate", 1575 | "mime", 1576 | "mime_guess", 1577 | "percent-encoding", 1578 | "pin-project-lite", 1579 | "tokio", 1580 | "tokio-util", 1581 | "tower-layer", 1582 | "tower-service", 1583 | "tracing", 1584 | ] 1585 | 1586 | [[package]] 1587 | name = "tower-layer" 1588 | version = "0.3.3" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1591 | 1592 | [[package]] 1593 | name = "tower-service" 1594 | version = "0.3.3" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1597 | 1598 | [[package]] 1599 | name = "tracing" 1600 | version = "0.1.41" 1601 | source = "registry+https://github.com/rust-lang/crates.io-index" 1602 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1603 | dependencies = [ 1604 | "pin-project-lite", 1605 | "tracing-core", 1606 | ] 1607 | 1608 | [[package]] 1609 | name = "tracing-core" 1610 | version = "0.1.33" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1613 | dependencies = [ 1614 | "once_cell", 1615 | "valuable", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "tracing-log" 1620 | version = "0.2.0" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1623 | dependencies = [ 1624 | "log", 1625 | "once_cell", 1626 | "tracing-core", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "tracing-subscriber" 1631 | version = "0.3.19" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 1634 | dependencies = [ 1635 | "matchers", 1636 | "nu-ansi-term", 1637 | "once_cell", 1638 | "regex", 1639 | "sharded-slab", 1640 | "smallvec", 1641 | "thread_local", 1642 | "tracing", 1643 | "tracing-core", 1644 | "tracing-log", 1645 | ] 1646 | 1647 | [[package]] 1648 | name = "tungstenite" 1649 | version = "0.26.2" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" 1652 | dependencies = [ 1653 | "bytes", 1654 | "data-encoding", 1655 | "http", 1656 | "httparse", 1657 | "log", 1658 | "rand", 1659 | "sha1", 1660 | "thiserror", 1661 | "utf-8", 1662 | ] 1663 | 1664 | [[package]] 1665 | name = "typenum" 1666 | version = "1.18.0" 1667 | source = "registry+https://github.com/rust-lang/crates.io-index" 1668 | checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 1669 | 1670 | [[package]] 1671 | name = "unicase" 1672 | version = "2.8.1" 1673 | source = "registry+https://github.com/rust-lang/crates.io-index" 1674 | checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 1675 | 1676 | [[package]] 1677 | name = "unicode-ident" 1678 | version = "1.0.18" 1679 | source = "registry+https://github.com/rust-lang/crates.io-index" 1680 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1681 | 1682 | [[package]] 1683 | name = "untrusted" 1684 | version = "0.9.0" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1687 | 1688 | [[package]] 1689 | name = "utf-8" 1690 | version = "0.7.6" 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" 1692 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 1693 | 1694 | [[package]] 1695 | name = "valuable" 1696 | version = "0.1.1" 1697 | source = "registry+https://github.com/rust-lang/crates.io-index" 1698 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 1699 | 1700 | [[package]] 1701 | name = "version_check" 1702 | version = "0.9.5" 1703 | source = "registry+https://github.com/rust-lang/crates.io-index" 1704 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1705 | 1706 | [[package]] 1707 | name = "walrus" 1708 | version = "0.23.3" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | checksum = "6481311b98508f4bc2d0abbfa5d42172e7a54b4b24d8f15e28b0dc650be0c59f" 1711 | dependencies = [ 1712 | "anyhow", 1713 | "gimli 0.26.2", 1714 | "id-arena", 1715 | "leb128", 1716 | "log", 1717 | "rayon", 1718 | "walrus-macro", 1719 | "wasm-encoder", 1720 | "wasmparser", 1721 | ] 1722 | 1723 | [[package]] 1724 | name = "walrus-macro" 1725 | version = "0.22.0" 1726 | source = "registry+https://github.com/rust-lang/crates.io-index" 1727 | checksum = "439ad39ff894c43c9649fa724cdde9a6fc50b855d517ef071a93e5df82fe51d3" 1728 | dependencies = [ 1729 | "heck", 1730 | "proc-macro2", 1731 | "quote", 1732 | "syn", 1733 | ] 1734 | 1735 | [[package]] 1736 | name = "wasi" 1737 | version = "0.11.0+wasi-snapshot-preview1" 1738 | source = "registry+https://github.com/rust-lang/crates.io-index" 1739 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1740 | 1741 | [[package]] 1742 | name = "wasi" 1743 | version = "0.14.2+wasi-0.2.4" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 1746 | dependencies = [ 1747 | "wit-bindgen-rt", 1748 | ] 1749 | 1750 | [[package]] 1751 | name = "wasm-bindgen-cli-support" 1752 | version = "0.2.100" 1753 | source = "registry+https://github.com/rust-lang/crates.io-index" 1754 | checksum = "21e1a4a49abe9cd6f762fc65fac2ef5732afeeb66be369d2f71a85b165a533cf" 1755 | dependencies = [ 1756 | "anyhow", 1757 | "base64", 1758 | "log", 1759 | "rustc-demangle", 1760 | "serde", 1761 | "serde_json", 1762 | "tempfile", 1763 | "walrus", 1764 | "wasm-bindgen-externref-xform", 1765 | "wasm-bindgen-multi-value-xform", 1766 | "wasm-bindgen-shared", 1767 | "wasm-bindgen-threads-xform", 1768 | "wasm-bindgen-wasm-conventions", 1769 | "wasm-bindgen-wasm-interpreter", 1770 | ] 1771 | 1772 | [[package]] 1773 | name = "wasm-bindgen-externref-xform" 1774 | version = "0.2.100" 1775 | source = "registry+https://github.com/rust-lang/crates.io-index" 1776 | checksum = "940542c5cdbe96c35f98b5da5c65fb9d18df55a0cb1d81fc5ca4acc4fda4d61c" 1777 | dependencies = [ 1778 | "anyhow", 1779 | "walrus", 1780 | "wasm-bindgen-wasm-conventions", 1781 | ] 1782 | 1783 | [[package]] 1784 | name = "wasm-bindgen-multi-value-xform" 1785 | version = "0.2.100" 1786 | source = "registry+https://github.com/rust-lang/crates.io-index" 1787 | checksum = "64b5ad2e97adde0c3e4369c38e0dbaee329ad8f6cc2ee8e01d1d0b13bd8b14cf" 1788 | dependencies = [ 1789 | "anyhow", 1790 | "walrus", 1791 | "wasm-bindgen-wasm-conventions", 1792 | ] 1793 | 1794 | [[package]] 1795 | name = "wasm-bindgen-shared" 1796 | version = "0.2.100" 1797 | source = "registry+https://github.com/rust-lang/crates.io-index" 1798 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1799 | dependencies = [ 1800 | "unicode-ident", 1801 | ] 1802 | 1803 | [[package]] 1804 | name = "wasm-bindgen-threads-xform" 1805 | version = "0.2.100" 1806 | source = "registry+https://github.com/rust-lang/crates.io-index" 1807 | checksum = "1cbdf2d55a50f7edc9dd9aecae7a3a40e9736fda851bd8816f98a86167c8c277" 1808 | dependencies = [ 1809 | "anyhow", 1810 | "walrus", 1811 | "wasm-bindgen-wasm-conventions", 1812 | ] 1813 | 1814 | [[package]] 1815 | name = "wasm-bindgen-wasm-conventions" 1816 | version = "0.2.100" 1817 | source = "registry+https://github.com/rust-lang/crates.io-index" 1818 | checksum = "b1c24fcaa34d2d84407122cfb1d3f37c3586756cf462be18e049b49245a16c08" 1819 | dependencies = [ 1820 | "anyhow", 1821 | "leb128", 1822 | "log", 1823 | "walrus", 1824 | "wasmparser", 1825 | ] 1826 | 1827 | [[package]] 1828 | name = "wasm-bindgen-wasm-interpreter" 1829 | version = "0.2.100" 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" 1831 | checksum = "33f24921401faadd6944206f9d6837d07bbb5ff766ed51ad34528089f66550e0" 1832 | dependencies = [ 1833 | "anyhow", 1834 | "log", 1835 | "walrus", 1836 | "wasm-bindgen-wasm-conventions", 1837 | ] 1838 | 1839 | [[package]] 1840 | name = "wasm-encoder" 1841 | version = "0.214.0" 1842 | source = "registry+https://github.com/rust-lang/crates.io-index" 1843 | checksum = "ff694f02a8d7a50b6922b197ae03883fbf18cdb2ae9fbee7b6148456f5f44041" 1844 | dependencies = [ 1845 | "leb128", 1846 | ] 1847 | 1848 | [[package]] 1849 | name = "wasm-server-runner" 1850 | version = "1.0.0" 1851 | dependencies = [ 1852 | "anyhow", 1853 | "axum", 1854 | "axum-server", 1855 | "axum-server-dual-protocol", 1856 | "directories", 1857 | "fastrand", 1858 | "http", 1859 | "rcgen", 1860 | "tokio", 1861 | "tower", 1862 | "tower-http", 1863 | "tracing", 1864 | "tracing-subscriber", 1865 | "wasm-bindgen-cli-support", 1866 | ] 1867 | 1868 | [[package]] 1869 | name = "wasmparser" 1870 | version = "0.214.0" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "5309c1090e3e84dad0d382f42064e9933fdaedb87e468cc239f0eabea73ddcb6" 1873 | dependencies = [ 1874 | "ahash", 1875 | "bitflags", 1876 | "hashbrown 0.14.5", 1877 | "indexmap 2.8.0", 1878 | "semver", 1879 | "serde", 1880 | ] 1881 | 1882 | [[package]] 1883 | name = "which" 1884 | version = "4.4.2" 1885 | source = "registry+https://github.com/rust-lang/crates.io-index" 1886 | checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" 1887 | dependencies = [ 1888 | "either", 1889 | "home", 1890 | "once_cell", 1891 | "rustix 0.38.44", 1892 | ] 1893 | 1894 | [[package]] 1895 | name = "winapi" 1896 | version = "0.3.9" 1897 | source = "registry+https://github.com/rust-lang/crates.io-index" 1898 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1899 | dependencies = [ 1900 | "winapi-i686-pc-windows-gnu", 1901 | "winapi-x86_64-pc-windows-gnu", 1902 | ] 1903 | 1904 | [[package]] 1905 | name = "winapi-i686-pc-windows-gnu" 1906 | version = "0.4.0" 1907 | source = "registry+https://github.com/rust-lang/crates.io-index" 1908 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1909 | 1910 | [[package]] 1911 | name = "winapi-x86_64-pc-windows-gnu" 1912 | version = "0.4.0" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1915 | 1916 | [[package]] 1917 | name = "windows-sys" 1918 | version = "0.52.0" 1919 | source = "registry+https://github.com/rust-lang/crates.io-index" 1920 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1921 | dependencies = [ 1922 | "windows-targets", 1923 | ] 1924 | 1925 | [[package]] 1926 | name = "windows-sys" 1927 | version = "0.59.0" 1928 | source = "registry+https://github.com/rust-lang/crates.io-index" 1929 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1930 | dependencies = [ 1931 | "windows-targets", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "windows-targets" 1936 | version = "0.52.6" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1939 | dependencies = [ 1940 | "windows_aarch64_gnullvm", 1941 | "windows_aarch64_msvc", 1942 | "windows_i686_gnu", 1943 | "windows_i686_gnullvm", 1944 | "windows_i686_msvc", 1945 | "windows_x86_64_gnu", 1946 | "windows_x86_64_gnullvm", 1947 | "windows_x86_64_msvc", 1948 | ] 1949 | 1950 | [[package]] 1951 | name = "windows_aarch64_gnullvm" 1952 | version = "0.52.6" 1953 | source = "registry+https://github.com/rust-lang/crates.io-index" 1954 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1955 | 1956 | [[package]] 1957 | name = "windows_aarch64_msvc" 1958 | version = "0.52.6" 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" 1960 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1961 | 1962 | [[package]] 1963 | name = "windows_i686_gnu" 1964 | version = "0.52.6" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1967 | 1968 | [[package]] 1969 | name = "windows_i686_gnullvm" 1970 | version = "0.52.6" 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" 1972 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1973 | 1974 | [[package]] 1975 | name = "windows_i686_msvc" 1976 | version = "0.52.6" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1979 | 1980 | [[package]] 1981 | name = "windows_x86_64_gnu" 1982 | version = "0.52.6" 1983 | source = "registry+https://github.com/rust-lang/crates.io-index" 1984 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1985 | 1986 | [[package]] 1987 | name = "windows_x86_64_gnullvm" 1988 | version = "0.52.6" 1989 | source = "registry+https://github.com/rust-lang/crates.io-index" 1990 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1991 | 1992 | [[package]] 1993 | name = "windows_x86_64_msvc" 1994 | version = "0.52.6" 1995 | source = "registry+https://github.com/rust-lang/crates.io-index" 1996 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1997 | 1998 | [[package]] 1999 | name = "wit-bindgen-rt" 2000 | version = "0.39.0" 2001 | source = "registry+https://github.com/rust-lang/crates.io-index" 2002 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 2003 | dependencies = [ 2004 | "bitflags", 2005 | ] 2006 | 2007 | [[package]] 2008 | name = "yasna" 2009 | version = "0.5.2" 2010 | source = "registry+https://github.com/rust-lang/crates.io-index" 2011 | checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" 2012 | dependencies = [ 2013 | "time", 2014 | ] 2015 | 2016 | [[package]] 2017 | name = "zerocopy" 2018 | version = "0.7.35" 2019 | source = "registry+https://github.com/rust-lang/crates.io-index" 2020 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2021 | dependencies = [ 2022 | "zerocopy-derive 0.7.35", 2023 | ] 2024 | 2025 | [[package]] 2026 | name = "zerocopy" 2027 | version = "0.8.24" 2028 | source = "registry+https://github.com/rust-lang/crates.io-index" 2029 | checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" 2030 | dependencies = [ 2031 | "zerocopy-derive 0.8.24", 2032 | ] 2033 | 2034 | [[package]] 2035 | name = "zerocopy-derive" 2036 | version = "0.7.35" 2037 | source = "registry+https://github.com/rust-lang/crates.io-index" 2038 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2039 | dependencies = [ 2040 | "proc-macro2", 2041 | "quote", 2042 | "syn", 2043 | ] 2044 | 2045 | [[package]] 2046 | name = "zerocopy-derive" 2047 | version = "0.8.24" 2048 | source = "registry+https://github.com/rust-lang/crates.io-index" 2049 | checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" 2050 | dependencies = [ 2051 | "proc-macro2", 2052 | "quote", 2053 | "syn", 2054 | ] 2055 | 2056 | [[package]] 2057 | name = "zeroize" 2058 | version = "1.8.1" 2059 | source = "registry+https://github.com/rust-lang/crates.io-index" 2060 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2061 | 2062 | [[package]] 2063 | name = "zstd" 2064 | version = "0.13.3" 2065 | source = "registry+https://github.com/rust-lang/crates.io-index" 2066 | checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" 2067 | dependencies = [ 2068 | "zstd-safe", 2069 | ] 2070 | 2071 | [[package]] 2072 | name = "zstd-safe" 2073 | version = "7.2.4" 2074 | source = "registry+https://github.com/rust-lang/crates.io-index" 2075 | checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" 2076 | dependencies = [ 2077 | "zstd-sys", 2078 | ] 2079 | 2080 | [[package]] 2081 | name = "zstd-sys" 2082 | version = "2.0.15+zstd.1.5.7" 2083 | source = "registry+https://github.com/rust-lang/crates.io-index" 2084 | checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" 2085 | dependencies = [ 2086 | "cc", 2087 | "pkg-config", 2088 | ] 2089 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "wasm-server-runner" 3 | version = "1.0.0" 4 | edition = "2021" 5 | readme = "README.md" 6 | repository = "https://github.com/jakobhellermann/wasm-server-runner/" 7 | license = "MIT" 8 | keywords = ["web", "wasm", "devtools"] 9 | categories = ["command-line-utilities", "development-tools", "development-tools::cargo-plugins", "wasm", "web-programming"] 10 | description = "cargo run for wasm programs" 11 | 12 | [dependencies] 13 | wasm-bindgen-cli-support = "0.2" 14 | anyhow = "1.0" 15 | 16 | tokio = { version = "1.11", default-features = false, features = ["rt-multi-thread"] } 17 | axum = { version = "0.8", default-features = false, features = ["http1", "ws"] } 18 | axum-server = { version = "0.7", features = ["tls-rustls"] } 19 | axum-server-dual-protocol = "0.7" 20 | tower-http = { version = "0.6", features = ["compression-full", "fs", "set-header", "trace"] } 21 | tower = "0.5" 22 | http = "1.0" 23 | rcgen = { version = "0.13", default-features = false, features = ["aws_lc_rs"] } 24 | 25 | tracing = { version = "0.1", default-features = false, features = ["release_max_level_debug"] } 26 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 27 | 28 | directories = "6" 29 | fastrand = "2.0" 30 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | 4 | Choose a license template 5 | 6 | 7 | Copyright (c) 2021 Jakob Hellermann 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy 10 | of this software and associated documentation files (the "Software"), to deal 11 | in the Software without restriction, including without limitation the rights 12 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | copies of the Software, and to permit persons to whom the Software is 14 | furnished to do so, subject to the following conditions: 15 | 16 | The above copyright notice and this permission notice shall be included in all 17 | copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | SOFTWARE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wasm-server-runner 2 | 3 | Allows you to run programs in the browser using web assembly using a simple `cargo run`. 4 | 5 | ## Usage 6 | 7 | ### Step 1. 8 | 9 | ```sh 10 | rustup target add wasm32-unknown-unknown 11 | cargo install wasm-server-runner 12 | ``` 13 | 14 | ### Step 2. 15 | 16 | Add this to your `~/.cargo/config.toml` (**not** the `Cargo.toml` of your project!): 17 | 18 | ```toml 19 | [target.wasm32-unknown-unknown] 20 | runner = "wasm-server-runner" 21 | ``` 22 | 23 | ### Step 3. 24 | 25 | Run programs in the browser using 26 | ```sh 27 | cargo run --target wasm32-unknown-unknown 28 | cargo run --target wasm32-unknown-unknown --example example 29 | 30 | wasm-server-runner path/to/file.wasm 31 | ``` 32 | 33 | Example output: 34 | ```yaml 35 | INFO wasm_server_runner: wasm output is 49.79kb large 36 | INFO wasm_server_runner: starting webserver at http://127.0.0.1:1334 37 | ``` 38 | 39 | The website will reload when the server is restarted and serve files relative to the current directory. 40 | 41 | ## Configuration options 42 | 43 | All configuration options can be specified via environment variables. 44 | 45 |
46 | WASM_SERVER_RUNNER_ADDRESS 47 | 48 | Default: `127.0.0.1` 49 | Control the address that the server listens on. Set to `0.0.0.0` to allow access from anywhere. 50 | 51 |
52 | 53 |
54 | WASM_SERVER_RUNNER_DIRECTORY 55 | 56 | Default: `.` 57 | 58 | Can be used to specify where relative path requests are loaded from. 59 | 60 |
61 | 62 |
63 | WASM_SERVER_RUNNER_CUSTOM_INDEX_HTML 64 | 65 | Default: _none_ 66 | 67 | When set, will try to load the custom `index.html` from that path instead of [the 68 | default](static/index.html). Can be relative to the directory. 69 | 70 | *Note*: To support both module and non-module style the `index.html` needs to have specific string that will be replaced at runtime. The body should contain something like 71 | ```html 72 | {{ NO_MODULE }} 73 | 76 | ``` 77 | 78 |
79 | 80 |
81 | WASM_SERVER_RUNNER_HTTPS 82 | 83 | Default: `false` 84 | 85 | Controls whether https is used. 86 | 87 |
88 | 89 |
90 | WASM_SERVER_RUNNER_NO_MODULE 91 | 92 | Default: `false` 93 | 94 | Controls whether the wasm-bindgen output uses `module`s or not. 95 |
96 | -------------------------------------------------------------------------------- /example-project/.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | target = "wasm32-unknown-unknown" 3 | 4 | [target.wasm32-unknown-unknown] 5 | runner = "wasm-server-runner" -------------------------------------------------------------------------------- /example-project/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /example-project/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 = "bumpalo" 7 | version = "3.16.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 10 | 11 | [[package]] 12 | name = "cfg-if" 13 | version = "1.0.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 16 | 17 | [[package]] 18 | name = "example-project" 19 | version = "0.1.0" 20 | dependencies = [ 21 | "wasm-bindgen", 22 | ] 23 | 24 | [[package]] 25 | name = "log" 26 | version = "0.4.25" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 29 | 30 | [[package]] 31 | name = "once_cell" 32 | version = "1.20.2" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 35 | 36 | [[package]] 37 | name = "proc-macro2" 38 | version = "1.0.93" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 41 | dependencies = [ 42 | "unicode-ident", 43 | ] 44 | 45 | [[package]] 46 | name = "quote" 47 | version = "1.0.38" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 50 | dependencies = [ 51 | "proc-macro2", 52 | ] 53 | 54 | [[package]] 55 | name = "rustversion" 56 | version = "1.0.19" 57 | source = "registry+https://github.com/rust-lang/crates.io-index" 58 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 59 | 60 | [[package]] 61 | name = "syn" 62 | version = "2.0.96" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" 65 | dependencies = [ 66 | "proc-macro2", 67 | "quote", 68 | "unicode-ident", 69 | ] 70 | 71 | [[package]] 72 | name = "unicode-ident" 73 | version = "1.0.15" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" 76 | 77 | [[package]] 78 | name = "wasm-bindgen" 79 | version = "0.2.100" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 82 | dependencies = [ 83 | "cfg-if", 84 | "once_cell", 85 | "rustversion", 86 | "wasm-bindgen-macro", 87 | ] 88 | 89 | [[package]] 90 | name = "wasm-bindgen-backend" 91 | version = "0.2.100" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 94 | dependencies = [ 95 | "bumpalo", 96 | "log", 97 | "proc-macro2", 98 | "quote", 99 | "syn", 100 | "wasm-bindgen-shared", 101 | ] 102 | 103 | [[package]] 104 | name = "wasm-bindgen-macro" 105 | version = "0.2.100" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 108 | dependencies = [ 109 | "quote", 110 | "wasm-bindgen-macro-support", 111 | ] 112 | 113 | [[package]] 114 | name = "wasm-bindgen-macro-support" 115 | version = "0.2.100" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 118 | dependencies = [ 119 | "proc-macro2", 120 | "quote", 121 | "syn", 122 | "wasm-bindgen-backend", 123 | "wasm-bindgen-shared", 124 | ] 125 | 126 | [[package]] 127 | name = "wasm-bindgen-shared" 128 | version = "0.2.100" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 131 | dependencies = [ 132 | "unicode-ident", 133 | ] 134 | -------------------------------------------------------------------------------- /example-project/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "example-project" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | wasm-bindgen = "0.2" 8 | -------------------------------------------------------------------------------- /example-project/examples/example.rs: -------------------------------------------------------------------------------- 1 | use wasm_bindgen::prelude::*; 2 | 3 | #[wasm_bindgen] 4 | extern "C" { 5 | #[wasm_bindgen(js_namespace = console)] 6 | fn log(s: &str); 7 | } 8 | 9 | fn main() { 10 | log("hello from example"); 11 | } 12 | -------------------------------------------------------------------------------- /example-project/examples/snippets.rs: -------------------------------------------------------------------------------- 1 | use wasm_bindgen::prelude::*; 2 | 3 | #[wasm_bindgen] 4 | extern "C" { 5 | #[wasm_bindgen(js_namespace = console)] 6 | fn log(s: &str); 7 | } 8 | 9 | #[wasm_bindgen(inline_js = "export function add(a, b) { return a + b; }")] 10 | extern "C" { 11 | fn add(a: u32, b: u32) -> u32; 12 | } 13 | #[wasm_bindgen(inline_js = "export function add2(a, b) { return a + b; }")] 14 | extern "C" { 15 | fn add2(a: u32, b: u32) -> u32; 16 | } 17 | #[wasm_bindgen(module = "/examples/snippets/snippet.js")] 18 | extern "C" { 19 | fn add3(a: u32, b: u32) -> u32; 20 | } 21 | 22 | fn main() { 23 | log(&add(2, 3).to_string()); 24 | log(&add2(2, 3).to_string()); 25 | log(&add3(2, 3).to_string()); 26 | } 27 | -------------------------------------------------------------------------------- /example-project/examples/snippets/snippet.js: -------------------------------------------------------------------------------- 1 | export function add3(a, b) { return a + b; } 2 | -------------------------------------------------------------------------------- /example-project/index.html: -------------------------------------------------------------------------------- 1 |

hi

2 | -------------------------------------------------------------------------------- /example-project/src/main.rs: -------------------------------------------------------------------------------- 1 | use wasm_bindgen::prelude::*; 2 | 3 | #[wasm_bindgen] 4 | extern "C" { 5 | #[wasm_bindgen(js_namespace = console)] 6 | fn log(s: &str); 7 | } 8 | 9 | fn main() { 10 | log("hello from wasm"); 11 | } 12 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | imports_granularity = "Module" 2 | use_small_heuristics = "Max" 3 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::path::PathBuf; 2 | 3 | use anyhow::{anyhow, ensure}; 4 | use tracing::info; 5 | use tracing_subscriber::EnvFilter; 6 | 7 | use crate::server::Options; 8 | 9 | pub type Result = std::result::Result; 10 | 11 | mod server; 12 | mod wasm_bindgen; 13 | 14 | fn bool_option(name: &str, default: bool) -> Result { 15 | match std::env::var(name) { 16 | Ok(value) if ["true", "1", "yes"].contains(&value.as_str()) => Ok(true), 17 | Ok(value) if ["false", "0", "no"].contains(&value.as_str()) => Ok(false), 18 | Ok(value) => Err(anyhow!("unexpected option {name}={value}, expected true,1 or false,0")), 19 | Err(_) => Ok(default), 20 | } 21 | } 22 | fn option(name: &str, default: &str) -> String { 23 | std::env::var(name).unwrap_or(default.to_owned()) 24 | } 25 | 26 | fn main() -> Result<(), anyhow::Error> { 27 | let filter = EnvFilter::try_from_default_env() 28 | .unwrap_or_else(|_| EnvFilter::new("info,app=debug,tower_http=debug,walrus=error")); 29 | tracing_subscriber::fmt::fmt().without_time().with_env_filter(filter).init(); 30 | 31 | let title = std::env::var("CARGO_PKG_NAME").unwrap_or_else(|_| "".to_string()); 32 | let address = option("WASM_SERVER_RUNNER_ADDRESS", "127.0.0.1"); 33 | let directory = option("WASM_SERVER_RUNNER_DIRECTORY", "."); 34 | let custom_index_html = 35 | std::env::var("WASM_SERVER_RUNNER_CUSTOM_INDEX_HTML").ok().map(PathBuf::from); 36 | let https = bool_option("WASM_SERVER_RUNNER_HTTPS", false)?; 37 | let no_module = bool_option("WASM_SERVER_RUNNER_NO_MODULE", false)?; 38 | 39 | let options = Options { 40 | title, 41 | address, 42 | directory: PathBuf::from(directory), 43 | custom_index_html, 44 | https, 45 | no_module, 46 | }; 47 | 48 | let wasm_file = std::env::args() 49 | .nth(1) 50 | .map(PathBuf::from) 51 | .ok_or_else(|| anyhow!("expected wasm file as argument"))?; 52 | 53 | let is_wasm_file = wasm_file.extension().is_some_and(|e| e == "wasm"); 54 | ensure!(is_wasm_file, "expected to be run with a wasm target"); 55 | 56 | let output = wasm_bindgen::generate(&options, &wasm_file)?; 57 | 58 | info!("uncompressed wasm output is {} in size", pretty_size(output.wasm.len())); 59 | 60 | let rt = tokio::runtime::Runtime::new()?; 61 | rt.block_on(server::run_server(options, output))?; 62 | 63 | Ok(()) 64 | } 65 | 66 | fn pretty_size(size_in_bytes: usize) -> String { 67 | let size_in_kb = size_in_bytes as f32 / 1024.0; 68 | if size_in_kb < 1024.0 { 69 | return format!("{:.2}kb", size_in_kb); 70 | } 71 | 72 | let size_in_mb = size_in_kb / 1024.0; 73 | format!("{:.2}mb", size_in_mb) 74 | } 75 | -------------------------------------------------------------------------------- /src/server.rs: -------------------------------------------------------------------------------- 1 | mod certificate; 2 | 3 | use std::borrow::Cow; 4 | use std::collections::HashMap; 5 | use std::net::SocketAddr; 6 | use std::path::PathBuf; 7 | 8 | use anyhow::Context as _; 9 | use axum::error_handling::HandleError; 10 | use axum::extract::ws::{self, WebSocket}; 11 | use axum::extract::{Path, WebSocketUpgrade}; 12 | use axum::http::{HeaderValue, StatusCode}; 13 | use axum::response::{Html, IntoResponse, Response}; 14 | use axum::routing::{get, get_service}; 15 | use axum::Router; 16 | use axum_server::tls_rustls::RustlsConfig; 17 | use axum_server_dual_protocol::ServerExt; 18 | use http::HeaderName; 19 | use tower::ServiceBuilder; 20 | use tower_http::compression::CompressionLayer; 21 | use tower_http::services::ServeDir; 22 | use tower_http::set_header::SetResponseHeaderLayer; 23 | 24 | use crate::wasm_bindgen::WasmBindgenOutput; 25 | use crate::Result; 26 | 27 | fn generate_version() -> String { 28 | std::iter::repeat_with(fastrand::alphanumeric).take(12).collect() 29 | } 30 | 31 | pub struct Options { 32 | pub title: String, 33 | pub address: String, 34 | pub directory: PathBuf, 35 | pub custom_index_html: Option, 36 | pub https: bool, 37 | pub no_module: bool, 38 | } 39 | 40 | pub async fn run_server(options: Options, output: WasmBindgenOutput) -> Result<()> { 41 | let WasmBindgenOutput { js, wasm, snippets, local_modules } = output; 42 | 43 | let middleware_stack = ServiceBuilder::new() 44 | .layer(CompressionLayer::new()) 45 | .layer(SetResponseHeaderLayer::if_not_present( 46 | HeaderName::from_static("cross-origin-opener-policy"), 47 | HeaderValue::from_static("same-origin"), 48 | )) 49 | .layer(SetResponseHeaderLayer::if_not_present( 50 | HeaderName::from_static("cross-origin-embedder-policy"), 51 | HeaderValue::from_static("require-corp"), 52 | )) 53 | .into_inner(); 54 | 55 | let version = generate_version(); 56 | 57 | let html_source = options 58 | .custom_index_html 59 | .map(|index_html_path| { 60 | let path = match index_html_path.is_absolute() { 61 | true => index_html_path, 62 | false => options.directory.join(index_html_path), 63 | }; 64 | std::fs::read_to_string(path).map(Cow::Owned) 65 | }) 66 | .unwrap_or_else(|| Ok(Cow::Borrowed(include_str!("../static/index.html"))))?; 67 | let mut html = html_source.replace("{{ TITLE }}", &options.title); 68 | 69 | if options.no_module { 70 | html = html 71 | .replace("{{ NO_MODULE }}", "") 72 | .replace("// {{ MODULE }}", ""); 73 | } else { 74 | html = html 75 | .replace("// {{ MODULE }}", "import wasm_bindgen from './api/wasm.js';") 76 | .replace("{{ NO_MODULE }}", ""); 77 | }; 78 | 79 | let serve_dir = 80 | HandleError::new(get_service(ServeDir::new(options.directory)), internal_server_error); 81 | 82 | let app = Router::new() 83 | .route("/", get(move || async { Html(html) })) 84 | .route("/api/wasm.js", get(|| async { WithContentType("application/javascript", js) })) 85 | .route("/api/wasm.wasm", get(|| async { WithContentType("application/wasm", wasm) })) 86 | .route("/api/version", get(move || async { version })) 87 | .route("/ws", get(|ws: WebSocketUpgrade| async { ws.on_upgrade(handle_ws) })) 88 | .route( 89 | "/api/snippets/{*rest}", 90 | get(|Path(path): Path| async move { 91 | match get_snippet_source(&path, &local_modules, &snippets) { 92 | Ok(source) => Ok(WithContentType("application/javascript", source)), 93 | Err(e) => { 94 | tracing::error!("failed to serve snippet `{path}`: {e}"); 95 | Err(e) 96 | } 97 | } 98 | }), 99 | ) 100 | .fallback_service(serve_dir) 101 | .layer(middleware_stack); 102 | 103 | let addr: SocketAddr = options 104 | .address 105 | .parse() 106 | .or_else(|_| { 107 | format!("{}:{}", options.address, pick_port::pick_free_port(1334, 10).unwrap_or(1334)) 108 | .parse() 109 | }) 110 | .context("Error parsing WASM_SERVER_RUNNER_ADDRESS")?; 111 | 112 | if options.https { 113 | let certificate = certificate::certificate()?; 114 | let config = 115 | RustlsConfig::from_der(vec![certificate.certificate], certificate.private_key).await?; 116 | 117 | tracing::info!(target: "wasm_server_runner", "starting webserver at https://{}", addr); 118 | axum_server_dual_protocol::bind_dual_protocol(addr, config) 119 | .set_upgrade(true) 120 | .serve(app.into_make_service()) 121 | .await?; 122 | } else { 123 | tracing::info!(target: "wasm_server_runner", "starting webserver at http://{}", addr); 124 | axum_server::bind(addr).serve(app.into_make_service()).await?; 125 | } 126 | 127 | Ok(()) 128 | } 129 | 130 | fn get_snippet_source( 131 | path: &str, 132 | local_modules: &HashMap, 133 | snippets: &HashMap>, 134 | ) -> Result { 135 | if let Some(module) = local_modules.get(path) { 136 | return Ok(module.clone()); 137 | }; 138 | 139 | let (snippet, inline_snippet_name) = path.split_once('/').ok_or("invalid snippet path")?; 140 | let index = inline_snippet_name 141 | .strip_prefix("inline") 142 | .and_then(|path| path.strip_suffix(".js")) 143 | .ok_or("invalid snippet name in path")?; 144 | let index: usize = index.parse().map_err(|_| "invalid index")?; 145 | let snippet = snippets 146 | .get(snippet) 147 | .ok_or("invalid snippet name")? 148 | .get(index) 149 | .ok_or("snippet index out of bounds")?; 150 | Ok(snippet.clone()) 151 | } 152 | 153 | async fn handle_ws(mut socket: WebSocket) { 154 | while let Some(msg) = socket.recv().await { 155 | let msg = match msg { 156 | Ok(msg) => msg, 157 | Err(e) => return tracing::warn!("got error {e}, closing websocket connection"), 158 | }; 159 | 160 | let msg = match msg { 161 | ws::Message::Text(msg) => msg, 162 | ws::Message::Close(_) => return, 163 | _ => unreachable!("got non-text message from websocket"), 164 | }; 165 | 166 | let (mut level, mut text) = msg.split_once(',').unwrap(); 167 | 168 | if let Some(rest) = text.strip_prefix("TRACE ") { 169 | level = "debug"; 170 | text = rest; 171 | } else if let Some(rest) = text.strip_prefix("DEBUG ") { 172 | level = "debug"; 173 | text = rest; 174 | } else if let Some(rest) = text.strip_prefix("INFO ") { 175 | level = "info"; 176 | text = rest; 177 | } else if let Some(rest) = text.strip_prefix("WARN ") { 178 | level = "warn"; 179 | text = rest; 180 | } else if let Some(rest) = text.strip_prefix("ERROR ") { 181 | level = "error"; 182 | text = rest; 183 | } 184 | 185 | match level { 186 | "log" => tracing::info!(target: "app", "{text}"), 187 | 188 | "trace" => tracing::trace!(target: "app", "{text}"), 189 | "debug" => tracing::debug!(target: "app", "{text}"), 190 | "info" => tracing::info!(target: "app", "{text}"), 191 | "warn" => tracing::warn!(target: "app", "{text}"), 192 | "error" => tracing::error!(target: "app", "{text}"), 193 | _ => unimplemented!("unexpected log level {level}: {text}"), 194 | } 195 | } 196 | } 197 | 198 | struct WithContentType(&'static str, T); 199 | impl IntoResponse for WithContentType { 200 | fn into_response(self) -> Response { 201 | let mut response = self.1.into_response(); 202 | response.headers_mut().insert("Content-Type", HeaderValue::from_static(self.0)); 203 | response 204 | } 205 | } 206 | 207 | async fn internal_server_error(error: impl std::fmt::Display) -> impl IntoResponse { 208 | (StatusCode::INTERNAL_SERVER_ERROR, format!("Unhandled internal error: {}", error)) 209 | } 210 | 211 | mod pick_port { 212 | use std::net::{Ipv4Addr, Ipv6Addr, SocketAddrV4, SocketAddrV6, TcpListener, ToSocketAddrs}; 213 | 214 | fn test_bind_tcp(addr: A) -> Option { 215 | Some(TcpListener::bind(addr).ok()?.local_addr().ok()?.port()) 216 | } 217 | fn is_free_tcp(port: u16) -> bool { 218 | let ipv4 = SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, port); 219 | let ipv6 = SocketAddrV6::new(Ipv6Addr::UNSPECIFIED, port, 0, 0); 220 | 221 | test_bind_tcp(ipv6).is_some() && test_bind_tcp(ipv4).is_some() 222 | } 223 | 224 | fn ask_free_tcp_port() -> Option { 225 | let ipv4 = SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 0); 226 | let ipv6 = SocketAddrV6::new(Ipv6Addr::UNSPECIFIED, 0, 0, 0); 227 | test_bind_tcp(ipv6).or_else(|| test_bind_tcp(ipv4)) 228 | } 229 | 230 | pub fn pick_free_port(starting_at: u16, try_consecutive: u16) -> Option { 231 | (starting_at..=starting_at + try_consecutive) 232 | .find(|&port| is_free_tcp(port)) 233 | .or_else(ask_free_tcp_port) 234 | } 235 | } 236 | -------------------------------------------------------------------------------- /src/server/certificate.rs: -------------------------------------------------------------------------------- 1 | use std::io::ErrorKind; 2 | use std::path::Path; 3 | 4 | use crate::Result; 5 | use directories::ProjectDirs; 6 | 7 | pub struct Certificate { 8 | pub certificate: Vec, 9 | pub private_key: Vec, 10 | } 11 | 12 | pub fn certificate() -> Result { 13 | let directories = match ProjectDirs::from("", "", "wasm-server-runner") { 14 | Some(directories) => directories, 15 | None => { 16 | tracing::warn!("failed to determine application directory"); 17 | return generate(); 18 | } 19 | }; 20 | 21 | let path = directories.data_local_dir(); 22 | 23 | let certificate = match read(&path.join("certificate.der")) { 24 | Ok(Some(certificate)) => certificate, 25 | Ok(None) => return generate_in(path), 26 | Err(()) => return generate(), 27 | }; 28 | 29 | let private_key = match read(&path.join("private_key.der")) { 30 | Ok(Some(private_key)) => private_key, 31 | Ok(None) => return generate_in(path), 32 | Err(()) => return generate(), 33 | }; 34 | 35 | tracing::info!("re-using certificate from \"{}\"", path.display()); 36 | 37 | Ok(Certificate { certificate, private_key }) 38 | } 39 | 40 | fn read(path: &Path) -> Result>, ()> { 41 | match std::fs::read(path) { 42 | Ok(file) => Ok(Some(file)), 43 | Err(error) => { 44 | if error.kind() == ErrorKind::NotFound { 45 | Ok(None) 46 | } else { 47 | tracing::error!("error reading file from \"{}\": {error}", path.display()); 48 | Err(()) 49 | } 50 | } 51 | } 52 | } 53 | 54 | fn write(path: &Path, data: &[u8]) -> Result<(), ()> { 55 | match std::fs::write(path, data) { 56 | Ok(()) => Ok(()), 57 | Err(error) => { 58 | tracing::error!("error saving file to \"{}\": {error}", path.display()); 59 | Err(()) 60 | } 61 | } 62 | } 63 | 64 | fn generate() -> Result { 65 | tracing::warn!("generated temporary certificate"); 66 | 67 | generate_internal() 68 | } 69 | 70 | fn generate_in(path: &Path) -> Result { 71 | let certificate = generate_internal()?; 72 | 73 | if let Err(error) = std::fs::create_dir_all(path) { 74 | tracing::error!("error creating directory \"{}\": {error}", path.display()); 75 | tracing::warn!("generated temporary certificate"); 76 | return Ok(certificate); 77 | } 78 | 79 | if let Err(()) = write(&path.join("certificate.der"), &certificate.certificate) 80 | .and_then(|_| write(&path.join("private_key.der"), &certificate.private_key)) 81 | { 82 | tracing::warn!("generated temporary certificate"); 83 | return Ok(certificate); 84 | } 85 | 86 | tracing::info!("generated new certificate in \"{}\"", path.display()); 87 | Ok(certificate) 88 | } 89 | 90 | fn generate_internal() -> Result { 91 | let certificate = rcgen::generate_simple_self_signed([String::from("localhost")])?; 92 | 93 | Ok(Certificate { 94 | certificate: certificate.cert.der().to_vec(), 95 | private_key: certificate.key_pair.serialize_der(), 96 | }) 97 | } 98 | -------------------------------------------------------------------------------- /src/wasm_bindgen.rs: -------------------------------------------------------------------------------- 1 | use crate::server::Options; 2 | use crate::Result; 3 | use std::collections::HashMap; 4 | use std::path::Path; 5 | use tracing::debug; 6 | 7 | pub struct WasmBindgenOutput { 8 | pub js: String, 9 | pub wasm: Vec, 10 | pub snippets: HashMap>, 11 | pub local_modules: HashMap, 12 | } 13 | pub fn generate(options: &Options, wasm_file: &Path) -> Result { 14 | debug!("running wasm-bindgen..."); 15 | let start = std::time::Instant::now(); 16 | let mut bindgen = wasm_bindgen_cli_support::Bindgen::new(); 17 | bindgen.input_path(wasm_file).typescript(false); 18 | 19 | if options.no_module { 20 | bindgen.no_modules(true)?; 21 | } else { 22 | bindgen.web(true)?; 23 | } 24 | 25 | let mut output = match bindgen.generate_output() { 26 | Ok(output) => output, 27 | Err(error) => { 28 | if let Some((wasm_version, runner_version)) = 29 | extract_error_message_versions(&error.to_string()) 30 | { 31 | return Err(anyhow::anyhow!( 32 | r#"The rust project was linked against a different version of wasm-bindgen. 33 | wasm-server-runner version: {runner_version} 34 | wasm file schema version: {wasm_version} 35 | 36 | To resolve this, update the wasm-bindgen dependency and/or wasm-server-runner binary: 37 | cargo update -p wasm-bindgen 38 | cargo install -f wasm-server-runner"# 39 | )); 40 | } 41 | 42 | return Err(error); 43 | } 44 | }; 45 | 46 | debug!("finished wasm-bindgen (took {:?})", start.elapsed()); 47 | 48 | let js = output.js().to_owned(); 49 | let snippets = output.snippets().clone(); 50 | let local_modules = output.local_modules().clone(); 51 | 52 | debug!("emitting wasm..."); 53 | let start = std::time::Instant::now(); 54 | let wasm = output.wasm_mut().emit_wasm(); 55 | debug!("emitting wasm took {:?}", start.elapsed()); 56 | 57 | Ok(WasmBindgenOutput { js, wasm, snippets, local_modules }) 58 | } 59 | 60 | fn extract_error_message_versions(msg: &str) -> Option<(&str, &str)> { 61 | let (_, msg) = msg.split_once("rust wasm file schema version: ")?; 62 | let (wasm_schema_version, msg) = msg.split_once("\n this binary schema version: ")?; 63 | let (binary_schema_version, _) = msg.split_once('\n')?; 64 | 65 | Some((wasm_schema_version, binary_schema_version)) 66 | } 67 | -------------------------------------------------------------------------------- /static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {{ TITLE }} 10 | 11 | 29 | 30 | 31 | 32 | {{ NO_MODULE }} 33 | 173 | 174 | 243 | 244 | 245 | 246 | --------------------------------------------------------------------------------