From 1841cf9b9429327b7e82c97286f68f274a988108 Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Tue, 7 Oct 2025 03:15:18 +0200 Subject: [PATCH 01/11] initial (very incomplete) integration of split-wasm tooling --- Cargo.lock | 1281 +++++++++++------------- examples/split-wasm/Cargo.toml | 16 + examples/split-wasm/build.sh | 44 + examples/split-wasm/index.html | 28 + examples/split-wasm/src/main.rs | 20 + examples/split-wasm/src/yew.rs | 79 ++ packages/yew/src/html/component/mod.rs | 20 + packages/yew/src/lazy.rs | 173 ++++ packages/yew/src/lib.rs | 1 + 9 files changed, 940 insertions(+), 722 deletions(-) create mode 100644 examples/split-wasm/Cargo.toml create mode 100755 examples/split-wasm/build.sh create mode 100644 examples/split-wasm/index.html create mode 100644 examples/split-wasm/src/main.rs create mode 100644 examples/split-wasm/src/yew.rs create mode 100644 packages/yew/src/lazy.rs diff --git a/Cargo.lock b/Cargo.lock index 61fdaceef1f..d9f39fa72c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags", + "bitflags 2.13.1", "bytes", "futures-core", "futures-sink", @@ -44,7 +44,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "bitflags", + "bitflags 2.13.1", "bytes", "derive_more", "futures-core", @@ -68,7 +68,7 @@ dependencies = [ "actix-service", "actix-utils", "base64", - "bitflags", + "bitflags 2.13.1", "brotli", "bytes", "bytestring", @@ -87,7 +87,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.2", + "rand 0.9.5", "sha1", "smallvec", "tokio", @@ -103,7 +103,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -205,7 +205,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.6.3", + "socket2 0.6.5", "time", "tracing", "url", @@ -220,7 +220,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -234,11 +234,11 @@ dependencies = [ "clap", "env_logger", "function_router", - "futures 0.3.32", - "getrandom 0.4.2", + "futures 0.3.34", + "getrandom 0.4.3", "gloo", "jemallocator", - "rand 0.10.0", + "rand 0.10.2", "serde", "serde_json", "ssr-e2e-harness", @@ -262,9 +262,9 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] @@ -277,9 +277,9 @@ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" dependencies = [ "alloc-no-stdlib", ] @@ -292,9 +292,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android_system_properties" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" dependencies = [ "libc", ] @@ -351,19 +351,25 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "async-once-cell" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "4288f83726785267c6f2ef073a3d83dc3f9b81464e9f99898240cced85fce35a" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] @@ -371,7 +377,7 @@ name = "async_clock" version = "0.0.1" dependencies = [ "chrono", - "futures 0.3.32", + "futures 0.3.34", "gloo-net", "yew", ] @@ -393,9 +399,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "average" @@ -410,9 +416,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.16.2" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" +checksum = "ce2b2dcc879c3bae0d371e77c99f2238400ef24ec001394befa67b6e543add9e" dependencies = [ "aws-lc-sys", "zeroize", @@ -420,14 +426,15 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.39.1" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" +checksum = "f09fae7be8bb3174e05c6afdb34199e6dc0c7c04ba9fa237b1967adfbde27483" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] @@ -440,7 +447,7 @@ dependencies = [ "bytes", "form_urlencoded", "futures-util", - "http 1.4.0", + "http 1.5.0", "http-body", "http-body-util", "hyper", @@ -471,7 +478,7 @@ checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", - "http 1.4.0", + "http 1.5.0", "http-body", "http-body-util", "mime", @@ -490,13 +497,13 @@ dependencies = [ "clap", "env_logger", "function_router", - "futures 0.3.32", - "getrandom 0.4.2", + "futures 0.3.34", + "getrandom 0.4.3", "gloo", "hyper", "hyper-util", "jemallocator", - "rand 0.10.0", + "rand 0.10.2", "serde", "serde_json", "ssr-e2e-harness", @@ -514,6 +521,12 @@ dependencies = [ "yew-router", ] +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + [[package]] name = "base64" version = "0.22.1" @@ -596,9 +609,15 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.11.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "block-buffer" @@ -614,9 +633,9 @@ name = "boids" version = "0.1.0" dependencies = [ "anyhow", - "getrandom 0.4.2", + "getrandom 0.4.3", "gloo", - "rand 0.10.0", + "rand 0.10.2", "serde", "web-sys", "yew", @@ -624,9 +643,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.2" +version = "8.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -635,9 +654,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "5.0.0" +version = "5.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -655,9 +674,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytecount" @@ -667,9 +686,9 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.25.0" +version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" [[package]] name = "byteorder" @@ -685,9 +704,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "bytestring" @@ -706,9 +725,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.59" +version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" +checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" dependencies = [ "find-msvc-tools", "jobserver", @@ -716,12 +735,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfg-if" version = "1.0.4" @@ -730,19 +743,19 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "chacha20" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "rand_core 0.10.0", + "rand_core 0.10.1", ] [[package]] @@ -762,9 +775,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -775,9 +788,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.1" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" dependencies = [ "clap_builder", "clap_derive", @@ -785,9 +798,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.0" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" dependencies = [ "anstream", "anstyle", @@ -798,14 +811,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.1" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] @@ -829,7 +842,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -849,9 +862,9 @@ checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "combine" -version = "4.6.7" +version = "4.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" dependencies = [ "bytes", "memchr", @@ -893,9 +906,9 @@ checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af" [[package]] name = "console" -version = "0.16.3" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" dependencies = [ "encode_unicode", "libc", @@ -1004,9 +1017,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" dependencies = [ "cfg-if", ] @@ -1048,7 +1061,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1059,7 +1072,38 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.117", + "syn 2.0.119", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.20", ] [[package]] @@ -1089,7 +1133,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1099,7 +1143,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1121,7 +1165,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.117", + "syn 2.0.119", "unicode-xid", ] @@ -1143,13 +1187,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] @@ -1174,7 +1218,7 @@ checksum = "9556bc800956545d6420a640173e5ba7dfa82f38d3ea5a167eb555bc69ac3323" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1206,9 +1250,9 @@ dependencies = [ [[package]] name = "either" -version = "1.15.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "encode_unicode" @@ -1227,9 +1271,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "1.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" dependencies = [ "log", "regex", @@ -1237,9 +1281,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" dependencies = [ "anstream", "anstyle", @@ -1272,7 +1316,7 @@ checksum = "ea6be833b323a56361118a747470a45a1bcd5c52a2ec9b1e40c83dafe687e453" dependencies = [ "deunicode", "either", - "rand 0.10.0", + "rand 0.10.2", ] [[package]] @@ -1308,9 +1352,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "flate2" @@ -1375,10 +1419,10 @@ name = "function_memory_game" version = "0.1.0" dependencies = [ "getrandom 0.3.4", - "getrandom 0.4.2", + "getrandom 0.4.3", "gloo", "nanoid", - "rand 0.10.0", + "rand 0.10.2", "serde", "strum", "strum_macros", @@ -1391,14 +1435,14 @@ name = "function_router" version = "0.1.0" dependencies = [ "getrandom 0.3.4", - "getrandom 0.4.2", + "getrandom 0.4.3", "gloo", "image", "instant", "lipsum", "log", - "rand 0.10.0", - "rand 0.9.2", + "rand 0.10.2", + "rand 0.9.5", "serde", "wasm-logger", "yew", @@ -1431,9 +1475,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" dependencies = [ "futures-channel", "futures-core", @@ -1445,9 +1489,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", "futures-sink", @@ -1455,44 +1499,44 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-channel", "futures-core", @@ -1509,10 +1553,10 @@ dependencies = [ name = "game_of_life" version = "0.1.4" dependencies = [ - "getrandom 0.4.2", + "getrandom 0.4.3", "gloo", "log", - "rand 0.10.0", + "rand 0.10.2", "wasm-logger", "yew", ] @@ -1556,17 +1600,15 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi 6.0.0", - "rand_core 0.10.0", - "wasip2", - "wasip3", + "rand_core 0.10.1", "wasm-bindgen", ] @@ -1576,7 +1618,7 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddddbf932745a6be37109b6112d3ee09696106f848449069d3a57bba937ab82e" dependencies = [ - "bitflags", + "bitflags 2.13.1", "libc", "libgit2-sys", "log", @@ -1584,9 +1626,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" [[package]] name = "gloo" @@ -1665,7 +1707,7 @@ dependencies = [ "serde", "serde-wasm-bindgen", "serde_urlencoded", - "thiserror 2.0.18", + "thiserror 2.0.20", "wasm-bindgen", "web-sys", ] @@ -1680,12 +1722,12 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils 0.3.0", - "http 1.4.0", + "http 1.5.0", "js-sys", "pin-project", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -1711,7 +1753,7 @@ dependencies = [ "js-sys", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "wasm-bindgen", "web-sys", ] @@ -1761,13 +1803,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "142478655c5d764e5168d3019510ea0c0885687a72ba74e90548bd74ae160a41" dependencies = [ "bincode 1.3.3", - "futures 0.3.32", + "futures 0.3.34", "gloo-utils 0.2.0", "gloo-worker-macros", "js-sys", "pinned", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -1782,7 +1824,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1806,16 +1848,16 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.14" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" +checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.4.0", + "http 1.5.0", "indexmap", "slab", "tokio", @@ -1832,15 +1874,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash 0.1.5", -] - [[package]] name = "hashbrown" version = "0.17.1" @@ -1861,7 +1894,7 @@ dependencies = [ "base64", "bytes", "headers-core", - "http 1.4.0", + "http 1.5.0", "httpdate", "mime", "sha1", @@ -1873,7 +1906,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 1.4.0", + "http 1.5.0", ] [[package]] @@ -1904,12 +1937,9 @@ checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "html-escape" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" -dependencies = [ - "utf8-width", -] +checksum = "c9356095b4b41197bba32173600e1582792cda618f65d12f68e2e77d273413c5" [[package]] name = "http" @@ -1924,9 +1954,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", "itoa", @@ -1934,23 +1964,23 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", - "http 1.4.0", + "http 1.5.0", ] [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" dependencies = [ "bytes", "futures-core", - "http 1.4.0", + "http 1.5.0", "http-body", "pin-project-lite", ] @@ -1981,16 +2011,16 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", - "h2 0.4.14", - "http 1.4.0", + "h2 0.4.19", + "http 1.5.0", "http-body", "httparse", "httpdate", @@ -2003,15 +2033,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http 1.4.0", + "http 1.5.0", "hyper", "hyper-util", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -2027,14 +2056,14 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.4.0", + "http 1.5.0", "http-body", "hyper", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.3", + "socket2 0.6.5", "system-configuration", "tokio", "tower-service", @@ -2147,12 +2176,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "ident_case" version = "1.0.1" @@ -2227,7 +2250,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "699c1b6d335e63d0ba5c1e1c7f647371ce989c3bcbe1f7ed2b85fa56e3bd1a21" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2237,16 +2260,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.17.1", + "hashbrown", "serde", "serde_core", ] [[package]] name = "indicatif" -version = "0.18.4" +version = "0.18.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +checksum = "9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c" dependencies = [ "console", "portable-atomic", @@ -2278,9 +2301,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" [[package]] name = "is_terminal_polyfill" @@ -2325,10 +2348,12 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" dependencies = [ + "defmt", + "jiff-core", "jiff-static", "log", "portable-atomic", @@ -2336,40 +2361,55 @@ dependencies = [ "serde_core", ] +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" dependencies = [ + "jiff-core", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "jni" -version = "0.21.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" dependencies = [ - "cesu8", "cfg-if", "combine", - "jni-sys 0.3.1", + "jni-macros", + "jni-sys", "log", - "thiserror 1.0.69", + "simd_cesu8", + "thiserror 2.0.20", "walkdir", - "windows-sys 0.45.0", + "windows-link", ] [[package]] -name = "jni-sys" -version = "0.3.1" +name = "jni-macros" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" dependencies = [ - "jni-sys 0.4.1", + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", ] [[package]] @@ -2388,16 +2428,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "libc", ] @@ -2405,8 +2445,8 @@ dependencies = [ name = "js-framework-benchmark-yew" version = "1.0.0" dependencies = [ - "getrandom 0.4.2", - "rand 0.10.0", + "getrandom 0.4.3", + "rand 0.10.2", "wasm-bindgen", "web-sys", "yew", @@ -2416,8 +2456,8 @@ dependencies = [ name = "js-framework-benchmark-yew-hooks" version = "1.0.0" dependencies = [ - "getrandom 0.4.2", - "rand 0.10.0", + "getrandom 0.4.3", + "rand 0.10.2", "wasm-bindgen", "web-sys", "yew", @@ -2425,13 +2465,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.94" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] @@ -2450,10 +2489,10 @@ name = "keyed_list" version = "0.1.0" dependencies = [ "fake", - "getrandom 0.4.2", + "getrandom 0.4.3", "instant", "log", - "rand 0.10.0", + "rand 0.10.2", "wasm-logger", "web-sys", "yew", @@ -2471,23 +2510,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libgit2-sys" -version = "0.18.5+1.9.4" +version = "0.18.8+1.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "005d6ae6eac1912906073e069f7db60b1fa98e052a68227824afe3e3a1c59ca2" +checksum = "7f7c568b25d7489bc3fb2988ed69ab111d2944d2f5fec3d5c987fe545ea97b50" dependencies = [ "cc", "libc", @@ -2503,9 +2536,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libz-sys" -version = "1.1.28" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc3a226e576f50782b3305c5ccf458698f92798987f551c6a02efe8276721e22" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", "libc", @@ -2524,15 +2557,15 @@ name = "lipsum" version = "0.9.1" source = "git+https://github.com/mgeisler/lipsum.git?rev=233e48a#233e48a36df40641a609a9476fe9009d928757c5" dependencies = [ - "rand 0.9.2", + "rand 0.9.5", "rand_chacha", ] [[package]] name = "litemap" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" [[package]] name = "local-channel" @@ -2562,17 +2595,17 @@ dependencies = [ [[package]] name = "log" -version = "0.4.31" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "113b30b4cd05f7c06868fdb2854f66a7b9fece9a48425351cd532e810d74024f" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "lru" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9" +checksum = "5d2f2f9b4ba7e6b24d95e7e899329d35be83bcded72c8540cdd5368932d1d90a" dependencies = [ - "hashbrown 0.17.1", + "hashbrown", ] [[package]] @@ -2595,9 +2628,9 @@ checksum = "8863b587001c1b9a8a4e36008cebc6b3612cb1226fe2de94858e06092687b608" [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "mime" @@ -2617,9 +2650,9 @@ dependencies = [ [[package]] name = "minicov" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4869b6a491569605d66d3952bcdf03df789e5b536e5f0cf7758a7f08a55ae24d" +checksum = "c3aa3aa12b448ac225b3102217d1ac5cc717908f02722926524b0599c933c7a0" dependencies = [ "cc", "walkdir", @@ -2637,9 +2670,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "log", @@ -2673,7 +2706,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8628de41fe064cc3f0cf07f3d299ee3e73521adaff72278731d5c8cae3797873" dependencies = [ - "rand 0.9.2", + "rand 0.9.5", ] [[package]] @@ -2807,22 +2840,22 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2837,16 +2870,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a829027bd95e54cfe13e3e258a1ae7b645960553fb82b75ff852c29688ee595b" dependencies = [ - "futures 0.3.32", + "futures 0.3.34", "rustversion", "thiserror 1.0.69", ] [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" [[package]] name = "png" @@ -2854,7 +2887,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags", + "bitflags 2.13.1", "crc32fast", "fdeflate", "flate2", @@ -2863,15 +2896,15 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "portable-atomic-util" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] @@ -2899,9 +2932,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ "zerovec", ] @@ -2928,7 +2961,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2989,14 +3022,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -3016,22 +3049,22 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" dependencies = [ - "bitflags", + "bitflags 2.13.1", "memchr", "unicase", ] [[package]] name = "pxfm" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -3040,8 +3073,8 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.3", - "thiserror 2.0.18", + "socket2 0.6.5", + "thiserror 2.0.20", "tokio", "tracing", "web-time", @@ -3049,21 +3082,22 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "04759210543be93709136e28212294a659ef5001836ff4eab4d663e4529bba83" dependencies = [ "aws-lc-rs", "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.2", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.20", "tinyvec", "tracing", "web-time", @@ -3071,23 +3105,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.3", + "socket2 0.6.5", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.45" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -3106,9 +3140,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.9.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha", "rand_core 0.9.5", @@ -3116,13 +3150,13 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20", - "getrandom 0.4.2", - "rand_core 0.10.0", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -3146,9 +3180,18 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.10.0" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] [[package]] name = "redox_syscall" @@ -3156,14 +3199,14 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.13.1", ] [[package]] name = "regex" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -3173,9 +3216,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -3190,9 +3233,9 @@ checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" @@ -3206,8 +3249,8 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.14", - "http 1.4.0", + "h2 0.4.19", + "http 1.5.0", "http-body", "http-body-util", "hyper", @@ -3256,13 +3299,13 @@ version = "0.1.0" dependencies = [ "function_router", "getrandom 0.3.4", - "getrandom 0.4.2", + "getrandom 0.4.3", "gloo", "instant", "lipsum", "log", - "rand 0.10.0", - "rand 0.9.2", + "rand 0.10.2", + "rand 0.9.5", "serde", "wasm-logger", "yew", @@ -3271,9 +3314,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc_version" @@ -3290,7 +3333,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys", @@ -3299,9 +3342,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "aws-lc-rs", "once_cell", @@ -3313,9 +3356,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -3325,9 +3368,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -3335,9 +3378,9 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", @@ -3362,9 +3405,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" dependencies = [ "aws-lc-rs", "ring", @@ -3374,9 +3417,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ryu" @@ -3420,7 +3463,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags", + "bitflags 2.13.1", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -3445,9 +3488,9 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -3466,29 +3509,29 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -3531,9 +3574,20 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures 0.2.17", @@ -3551,9 +3605,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" @@ -3567,16 +3621,32 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "simple_ssr" version = "0.1.0" dependencies = [ "clap", - "futures 0.3.32", + "futures 0.3.34", "reqwest", "serde", "ssr-e2e-harness", @@ -3598,9 +3668,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "socket2" @@ -3614,9 +3684,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -3624,13 +3694,24 @@ dependencies = [ [[package]] name = "spin" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" dependencies = [ "lock_api", ] +[[package]] +name = "split-wasm" +version = "0.1.0" +dependencies = [ + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm_split", + "web-sys", + "yew", +] + [[package]] name = "ssr-e2e" version = "0.1.0" @@ -3681,7 +3762,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3714,9 +3795,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" dependencies = [ "proc-macro2", "quote", @@ -3740,7 +3832,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3749,7 +3841,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags", + "bitflags 2.13.1", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -3785,14 +3877,14 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "target-triple" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591ef38edfb78ca4771ee32cf494cb8771944bee237a9b91fc9c1424ac4b777b" +checksum = "c3a6bfce3d99adfa72d24750a61f782f3036a81e7f86d8841ee1326deaebd171" [[package]] name = "termcolor" @@ -3833,11 +3925,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.20", ] [[package]] @@ -3848,25 +3940,25 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] @@ -3923,9 +4015,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", "zerovec", @@ -3933,9 +4025,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -3961,9 +4053,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -3971,20 +4063,20 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.3", + "socket2 0.6.5", "tokio-macros", "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] @@ -3999,9 +4091,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" dependencies = [ "futures-core", "pin-project-lite", @@ -4010,13 +4102,14 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-sink", + "libc", "pin-project-lite", "tokio", ] @@ -4027,7 +4120,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "661192fb77d88d35683b52df73be6ed35516a19e35988e3b0df315c36a1c6f3d" dependencies = [ - "futures 0.3.32", + "futures 0.3.34", "gloo", "num_cpus", "pin-project", @@ -4039,9 +4132,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.2+spec-1.1.0" +version = "1.1.4+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" dependencies = [ "indexmap", "serde_core", @@ -4049,7 +4142,7 @@ dependencies = [ "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 1.0.1", + "winnow 1.0.4", ] [[package]] @@ -4080,18 +4173,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.1.2+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow 1.0.1", + "winnow 1.0.4", ] [[package]] name = "toml_writer" -version = "1.1.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tower" @@ -4115,11 +4208,11 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags", + "bitflags 2.13.1", "bytes", "futures-core", "futures-util", - "http 1.4.0", + "http 1.5.0", "http-body", "http-body-util", "http-range-header", @@ -4168,7 +4261,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4227,9 +4320,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.116" +version = "1.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c635f0191bd3a2941013e5062667100969f8c4e9cd787c14f977265d73616e" +checksum = "4c5c9f7b7b1a048dd2bebdb7260b0cc71ec5587b19352fa5c3cd9e1c067103f0" dependencies = [ "glob", "serde", @@ -4250,9 +4343,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "unicase" @@ -4268,9 +4361,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-width" @@ -4320,12 +4413,6 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" -[[package]] -name = "utf8-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -4340,9 +4427,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.2" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7" +checksum = "f053576934f05a761a402421fbbe3d425d9366f75f978806a037b3ca481abecc" dependencies = [ "js-sys", "serde_core", @@ -4406,7 +4493,7 @@ dependencies = [ "bytes", "futures-util", "headers", - "http 1.4.0", + "http 1.5.0", "http-body", "http-body-util", "hyper", @@ -4452,23 +4539,14 @@ version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen 0.46.0", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.117" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" dependencies = [ "cfg-if", "once_cell", @@ -4479,9 +4557,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.67" +version = "0.4.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" dependencies = [ "js-sys", "wasm-bindgen", @@ -4489,9 +4567,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.117" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4499,31 +4577,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.117" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.117" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.67" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941c102b3f0c15b6d72a53205e09e6646aafcf2991e18412cc331dbac1806bc0" +checksum = "895a2607575412a4eda1df892084a375ea10dfeadc4d7d2ab87b854e4ddc7ba1" dependencies = [ "async-trait", "cast", @@ -4543,30 +4621,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.67" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26bd6570f39bb1440fd8f01b63461faaf2a3f6078a508e4e54efa99363108d2" +checksum = "4288cb0ebe215033bf949ae1fd046726daa4c32a157f24b9dc6ac387a52aa759" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "wasm-bindgen-test-shared" -version = "0.2.117" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c29582b14d5bf030b02fa232b9b57faf2afc322d2c61964dd80bad02bf76207" - -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] +checksum = "33ff1c1b360982e93b6d8ea9c04836f71dba0817a16f91e229cf3a51bdd9d987" [[package]] name = "wasm-logger" @@ -4580,34 +4648,30 @@ dependencies = [ ] [[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +name = "wasm_split" +version = "0.1.0" +source = "git+https://github.com/WorldSEnder/wasm-split-prototype.git?rev=9b4876034a3be928a634c55be9c55085a9395f46#9b4876034a3be928a634c55be9c55085a9395f46" dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", + "async-once-cell", + "wasm_split_macros", ] [[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +name = "wasm_split_macros" +version = "0.1.0" +source = "git+https://github.com/WorldSEnder/wasm-split-prototype.git?rev=9b4876034a3be928a634c55be9c55085a9395f46#9b4876034a3be928a634c55be9c55085a9395f46" dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap", - "semver", + "base16", + "quote", + "sha2", + "syn 2.0.119", ] [[package]] name = "web-sys" -version = "0.3.94" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" dependencies = [ "js-sys", "wasm-bindgen", @@ -4657,9 +4721,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" dependencies = [ "rustls-pki-types", ] @@ -4719,7 +4783,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4730,7 +4794,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4768,31 +4832,13 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -4804,192 +4850,70 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" version = "0.7.15" @@ -5001,9 +4925,9 @@ dependencies = [ [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" [[package]] name = "wit-bindgen" @@ -5011,99 +4935,11 @@ version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "prettyplease", - "syn 2.0.117", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - [[package]] name = "writeable" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" [[package]] name = "yew" @@ -5112,7 +4948,7 @@ dependencies = [ "base64ct", "bincode 2.0.1", "console_error_panic_hook", - "futures 0.3.32", + "futures 0.3.34", "gloo", "html-escape", "implicit-clone", @@ -5121,7 +4957,7 @@ dependencies = [ "rustversion", "serde", "slab", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tokise", "tracing", @@ -5137,7 +4973,7 @@ dependencies = [ name = "yew-agent" version = "0.5.0" dependencies = [ - "futures 0.3.32", + "futures 0.3.34", "gloo-worker", "serde", "wasm-bindgen", @@ -5152,7 +4988,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.117", + "syn 2.0.119", "trybuild", "yew-agent", ] @@ -5165,7 +5001,7 @@ checksum = "2c9907797523d92e6530bae73db4273c4255a0133911af8b79e6c4d6381f13bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5189,7 +5025,7 @@ version = "0.1.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5202,7 +5038,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.117", + "syn 2.0.119", "trybuild", "yew", ] @@ -5229,10 +5065,11 @@ dependencies = [ name = "yew-router-macro" version = "0.20.0" dependencies = [ + "matchit 0.9.2", "proc-macro2", "quote", "rustversion", - "syn 2.0.117", + "syn 2.0.119", "trybuild", "yew-router", ] @@ -5254,7 +5091,7 @@ dependencies = [ name = "yew-worker-prime" version = "0.1.0" dependencies = [ - "futures 0.3.32", + "futures 0.3.34", "primes", "serde", "yew", @@ -5263,9 +5100,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -5280,35 +5117,35 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] @@ -5321,21 +5158,21 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zerotrie" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", "yoke", @@ -5344,9 +5181,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" dependencies = [ "yoke", "zerofrom", @@ -5355,20 +5192,20 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zstd" diff --git a/examples/split-wasm/Cargo.toml b/examples/split-wasm/Cargo.toml new file mode 100644 index 00000000000..06735b6e521 --- /dev/null +++ b/examples/split-wasm/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "split-wasm" +version = "0.1.0" +authors = [] +edition = "2021" +license = "MIT OR Apache-2.0" + +[dependencies] +yew = { path = "../../packages/yew", features = ["csr"] } +wasm_split = { git = "https://github.com/WorldSEnder/wasm-split-prototype.git", version = "0.1", rev = "9b4876034a3be928a634c55be9c55085a9395f46" } +wasm-bindgen = "*" +wasm-bindgen-futures = "*" + +[dependencies.web-sys] +version = "0.3" +features = ["HtmlInputElement"] diff --git a/examples/split-wasm/build.sh b/examples/split-wasm/build.sh new file mode 100755 index 00000000000..78fb7536275 --- /dev/null +++ b/examples/split-wasm/build.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -e +shopt -s extglob + +CARGO="cargo" +WASM_BINDGEN=~/.cache/trunk/"$(cargo tree --package wasm-bindgen --depth=0 --format="{p}" -e normal | sed -e 's/ v/-/g')/wasm-bindgen" +echo "$WASM_BINDGEN" +WASM_OPT="$(ls -dv1 ~/.cache/trunk/wasm-opt-version_* | tail -n 1)"/bin/wasm-opt # will select most recently installed :) + +PROFILE="release" +THIS_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) +TARGET_DIR=$(cd -- "$THIS_DIR"/../../target/ &> /dev/null && pwd) +OPT=1 + +RUSTFLAGS="-Clink-args=--emit-relocs$(case "$CARGO" in *nightly*) echo " -Zunstable-options -Cpanic=immediate-abort" ;; esac)" \ + $CARGO build --target wasm32-unknown-unknown \ + $(case $PROFILE in "debug") ;; "release") echo "--release" ;; *) echo '--profile "${PROFILE}"' ;; esac) + +mkdir -p dist/ +GLOBIGNORE=".:.." +rm -rf dist/* +mkdir dist/.stage +( + cd ~/recreational/src/wasm-split-prototype/ + cargo run --features="build-binary" -- --verbose "$TARGET_DIR/wasm32-unknown-unknown/${PROFILE}/split-wasm.wasm" "$THIS_DIR"/dist/.stage/ \ + > "$THIS_DIR"/dist/.stage/split.log +) +echo "running wasm-bindgen" +$WASM_BINDGEN dist/.stage/main.wasm --out-dir dist/.stage --no-demangle --target web --keep-lld-exports --no-typescript +if [ "$OPT" == 1 ] ; then + echo "running wasm-opt" + for wasm in dist/.stage/!(main).wasm ; do + $WASM_OPT -Os "$wasm" -o dist/"$(basename -- "$wasm")" + done +else + for wasm in dist/.stage/!(main).wasm ; do + mv "$wasm" dist/"$(basename -- "$wasm")" + done +fi +echo "moving to dist dir" +mv dist/.stage/*.!(wasm) dist +#rmdir dist/.stage +cp index.html dist/ + diff --git a/examples/split-wasm/index.html b/examples/split-wasm/index.html new file mode 100644 index 00000000000..6d96bbcd761 --- /dev/null +++ b/examples/split-wasm/index.html @@ -0,0 +1,28 @@ + + + + + + + Yew • Split WASM + + + + + + + + + + + diff --git a/examples/split-wasm/src/main.rs b/examples/split-wasm/src/main.rs new file mode 100644 index 00000000000..4e6c354bc56 --- /dev/null +++ b/examples/split-wasm/src/main.rs @@ -0,0 +1,20 @@ +use std::cell::Cell; + +use wasm_bindgen::prelude::wasm_bindgen; + +// You can use a global variable from javascript, or a static +// and even thread local variable without any changes. +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(thread_local_v2, js_name = "globalFoo")] + static GLOBAL_FOO: u32; +} +thread_local! { + static COUNTER: Cell = const { Cell::new(0) }; +} + +mod yew; + +pub fn main() { + yew::main(); +} diff --git a/examples/split-wasm/src/yew.rs b/examples/split-wasm/src/yew.rs new file mode 100644 index 00000000000..ae2ecb366fd --- /dev/null +++ b/examples/split-wasm/src/yew.rs @@ -0,0 +1,79 @@ +use std::future::pending; + +use wasm_split::wasm_split as split; +use web_sys::HtmlInputElement; +use yew::lazy::{Lazy, LazyComponent, LazyVTable}; +use yew::prelude::*; +use yew::suspense::Suspension; +use yew::Renderer; + +use super::{COUNTER, GLOBAL_FOO}; + +// --------------------------------------------------------------------------- +// A counter component — the one we'll load lazily. +// Uses use_state, which triggers re-renders via the scope it was created with. +// --------------------------------------------------------------------------- + +#[derive(Clone, Debug, PartialEq, Properties)] +pub struct CounterProps { + pub label: AttrValue, +} + +#[component] +fn Counter(props: &CounterProps) -> Html { + let count = use_state(|| 0_i32); + let onclick = { + let count = count.clone(); + Callback::from(move |_| count.set(*count + 1)) + }; + let global_foo = GLOBAL_FOO.with(|f| *f); + let render_counter = COUNTER.with(|cnt| { + let c = cnt.get(); + cnt.set(c + 1); + c + }); + + html! { +
+

{"This component is loaded from a separate bundle, render count: "}{render_counter}

+

{"Here is a number loaded from (shared) memory: "}{global_foo}

+

{ &props.label }

+

{ *count }

+ +
+ } +} + +impl LazyComponent for Counter { + async fn fetch() -> LazyVTable { + #[split(lazy_addition)] + fn split_fetch() -> LazyVTable { + LazyVTable::::vtable() + } + split_fetch().await + } +} + +#[component] +fn Pending() -> HtmlResult { + Err(Suspension::from_future(pending()).into()) +} + +#[component] +fn App() -> Html { + let toggle = use_state(|| false); + let show = *toggle; + html! { + <> + ().checked())} /> + + {"not yet loaded"}

}}> + if show { label="A lazily loaded counter" /> } else { } +
+ + } +} + +pub fn main() { + let _ = Renderer::::new().render(); +} diff --git a/packages/yew/src/html/component/mod.rs b/packages/yew/src/html/component/mod.rs index 57bebce7cc9..abb090926bf 100644 --- a/packages/yew/src/html/component/mod.rs +++ b/packages/yew/src/html/component/mod.rs @@ -70,6 +70,26 @@ impl Context { state } + + pub(crate) fn narrow_scope>( + &self, + inner: &Scope, + ) -> Context { + let mut ctx = Context { + scope: inner.clone(), + props: self.props.clone(), + #[cfg(feature = "hydration")] + creation_mode: self.creation_mode, + #[cfg(feature = "hydration")] + prepared_state: None, + }; + let _ = &mut ctx; // silence warning due to feature conditional branch below + #[cfg(feature = "hydration")] + { + ctx.prepared_state = self.prepared_state.clone(); + } + ctx + } } /// The common base of both function components and struct components. diff --git a/packages/yew/src/lazy.rs b/packages/yew/src/lazy.rs new file mode 100644 index 00000000000..3b4aa134f00 --- /dev/null +++ b/packages/yew/src/lazy.rs @@ -0,0 +1,173 @@ +//! Implements lazy fetching of components + +// A simple wrapper is easy to implement. This module exists to support message passing and more +// involved logic + +use std::future::Future; + +use crate::html::{Scope, Scoped}; +use crate::suspense::Suspension; +use crate::{BaseComponent, Context, HtmlResult}; + +// we might be able to erase the BaseComponent bound here, then monomorphize for some size savings +/// This struct is (mentally) the same as a `dyn BaseComponent` but without informing the linker +/// about this. +#[derive(Debug)] +#[repr(C)] +struct CompVTableImpl { + create: fn(&Context) -> C, + update: fn(&mut C, &Context, C::Message) -> bool, + changed: fn(&mut C, &Context, &C::Properties) -> bool, + view: fn(&C, &Context) -> HtmlResult, + rendered: fn(&mut C, &Context, bool), + destroy: fn(&mut C, &Context), + prepare_state: fn(&C) -> Option, + //... +} +/// Component vtable for a component. +/// +/// Return `LazyVTable::::vtable()` from your implementation of +/// [`LazyComponent::fetch`] after resolving it. +pub struct LazyVTable { + imp: &'static CompVTableImpl, +} +impl std::fmt::Debug for LazyVTable { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("LazyVTable") + .field("vtable", &"...") + .finish() + } +} +impl LazyVTable { + /// Returns the singleton vtable for a component. + /// + /// Return this from [`LazyComponent::fetch`] for your lazy component. + pub fn vtable() -> LazyVTable { + LazyVTable { + imp: &const { + CompVTableImpl { + create: C::create, + update: C::update, + changed: C::changed, + view: C::view, + rendered: C::rendered, + destroy: C::destroy, + prepare_state: C::prepare_state, + } + }, + } + } +} +/// Implement this trait to support lazily loading your component. +/// +/// Used in conjunction with the [`Lazy`] component. +pub trait LazyComponent: BaseComponent { + /// Start fetching your component + fn fetch() -> impl Future> + Send; +} + +#[derive(Debug)] +enum LazyState { + Pending(Suspension), + Created(LazyVTable, C), +} +/// Wrapper for a lazily fetched component +/// +/// This component suspends as long as the underlying component is still being fetched, +/// then behaves as the underlying component itself. +#[derive(Debug)] +pub struct Lazy { + inner_scope: Scope, + state: LazyState, +} + +/// Message to send to a lazy component +#[derive(Debug)] +pub enum LazyMessage { + /// Forward the message to the underlying component once that is fetched + Forward(C::Message), + #[doc(hidden)] + FetchFinished(LazyVTable, C), +} + +impl BaseComponent for Lazy { + type Message = LazyMessage; + type Properties = C::Properties; + + fn create(ctx: &Context) -> Self { + let inner_scope = Scope::new(Some(ctx.link().to_any())); + let creation_ctx = ctx.narrow_scope(&inner_scope); + + let link = ctx.link().clone(); + // TODO: fetch once per component type not instance? + let suspension = Suspension::from_future(async move { + // Ignore error in case receiver was dropped + let vtable = C::fetch().await; + let comp = (vtable.imp.create)(&creation_ctx); + link.send_message(LazyMessage::FetchFinished(vtable, comp)); + }); + Self { + inner_scope, + state: LazyState::Pending(suspension), + } + } + + fn update(&mut self, ctx: &Context, msg: Self::Message) -> bool { + let msg = match msg { + LazyMessage::FetchFinished(vtable, comp) => { + self.state = LazyState::Created(vtable, comp); + return true; + } + LazyMessage::Forward(msg) => msg, + }; + match &mut self.state { + LazyState::Pending(_) => { + // has a queueing implementation. We don't rerender until the suspension resolves + self.inner_scope.send_message(msg); + false + } + LazyState::Created(vtable, comp) => { + (vtable.imp.update)(comp, &ctx.narrow_scope(&self.inner_scope), msg) + } + } + } + + fn changed(&mut self, ctx: &Context, old_props: &Self::Properties) -> bool { + if let LazyState::Created(vtable, comp) = &mut self.state { + (vtable.imp.changed)(comp, &ctx.narrow_scope(&self.inner_scope), old_props) + } else { + false + } + } + + fn view(&self, ctx: &Context) -> crate::HtmlResult { + match &self.state { + LazyState::Pending(suspension) => Err(suspension.clone().into()), + LazyState::Created(vtable, comp) => { + (vtable.imp.view)(comp, &ctx.narrow_scope(&self.inner_scope)) + } + } + } + + fn rendered(&mut self, ctx: &Context, first_render: bool) { + if let LazyState::Created(vtable, comp) = &mut self.state { + (vtable.imp.rendered)(comp, &ctx.narrow_scope(&self.inner_scope), first_render) + } else { + unreachable!("can't get rendered before fetching the vtable") + } + } + + fn destroy(&mut self, ctx: &Context) { + if let LazyState::Created(vtable, comp) = &mut self.state { + (vtable.imp.destroy)(comp, &ctx.narrow_scope(&self.inner_scope)) + } + } + + fn prepare_state(&self) -> Option { + if let LazyState::Created(vtable, comp) = &self.state { + (vtable.imp.prepare_state)(comp) + } else { + None + } + } +} diff --git a/packages/yew/src/lib.rs b/packages/yew/src/lib.rs index 677d61b1671..b749b5738f3 100644 --- a/packages/yew/src/lib.rs +++ b/packages/yew/src/lib.rs @@ -276,6 +276,7 @@ pub mod context; mod dom_bundle; pub mod functional; pub mod html; +pub mod lazy; pub mod platform; pub mod scheduler; mod sealed; From 7c2efe21eeafae3731c1cdc0b056b58097fb4923 Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Tue, 14 Oct 2025 22:37:01 +0200 Subject: [PATCH 02/11] update to release candidate and improve caching don't start fetching once per component, cache the vtable. --- Cargo.lock | 15 +++++++++------ examples/split-wasm/Cargo.toml | 3 ++- examples/split-wasm/src/yew.rs | 35 ++++++++++++++++++++++++++++------ packages/yew/src/lazy.rs | 28 +++++++++++++++++---------- 4 files changed, 58 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d9f39fa72c8..5abc018d3ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3705,9 +3705,10 @@ dependencies = [ name = "split-wasm" version = "0.1.0" dependencies = [ + "async-once-cell", "wasm-bindgen", "wasm-bindgen-futures", - "wasm_split", + "wasm_split_helpers", "web-sys", "yew", ] @@ -4648,9 +4649,10 @@ dependencies = [ ] [[package]] -name = "wasm_split" -version = "0.1.0" -source = "git+https://github.com/WorldSEnder/wasm-split-prototype.git?rev=9b4876034a3be928a634c55be9c55085a9395f46#9b4876034a3be928a634c55be9c55085a9395f46" +name = "wasm_split_helpers" +version = "0.2.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a63f86bb241fa35d6e87c50311e1abb9e403c5db690f3637525d6fa2876b8e" dependencies = [ "async-once-cell", "wasm_split_macros", @@ -4658,8 +4660,9 @@ dependencies = [ [[package]] name = "wasm_split_macros" -version = "0.1.0" -source = "git+https://github.com/WorldSEnder/wasm-split-prototype.git?rev=9b4876034a3be928a634c55be9c55085a9395f46#9b4876034a3be928a634c55be9c55085a9395f46" +version = "0.2.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee3692283763ee89e2eb075c51fff63c6385d6a31bcb1931262dc44180e58fb" dependencies = [ "base16", "quote", diff --git a/examples/split-wasm/Cargo.toml b/examples/split-wasm/Cargo.toml index 06735b6e521..61f8c168173 100644 --- a/examples/split-wasm/Cargo.toml +++ b/examples/split-wasm/Cargo.toml @@ -6,8 +6,9 @@ edition = "2021" license = "MIT OR Apache-2.0" [dependencies] +async-once-cell = "0.5.3" yew = { path = "../../packages/yew", features = ["csr"] } -wasm_split = { git = "https://github.com/WorldSEnder/wasm-split-prototype.git", version = "0.1", rev = "9b4876034a3be928a634c55be9c55085a9395f46" } +wasm_split_helpers = "0.2.0-rc.1" wasm-bindgen = "*" wasm-bindgen-futures = "*" diff --git a/examples/split-wasm/src/yew.rs b/examples/split-wasm/src/yew.rs index ae2ecb366fd..2984e861b2f 100644 --- a/examples/split-wasm/src/yew.rs +++ b/examples/split-wasm/src/yew.rs @@ -1,6 +1,7 @@ -use std::future::pending; +use std::future::{pending, Future}; +use std::pin::Pin; -use wasm_split::wasm_split as split; +use wasm_split_helpers::wasm_split as split; use web_sys::HtmlInputElement; use yew::lazy::{Lazy, LazyComponent, LazyVTable}; use yew::prelude::*; @@ -44,16 +45,38 @@ fn Counter(props: &CounterProps) -> Html { } } -impl LazyComponent for Counter { - async fn fetch() -> LazyVTable { +struct LazyAdditionProxy; + +impl LazyComponent for LazyAdditionProxy { + type Underlying = Counter; + + async fn fetch() -> LazyVTable { #[split(lazy_addition)] fn split_fetch() -> LazyVTable { LazyVTable::::vtable() } - split_fetch().await + struct F(Option> + Send>>>); + impl Future for F { + type Output = LazyVTable; + + fn poll( + mut self: Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll { + self.0 + .get_or_insert_with(|| Box::pin(split_fetch())) + .as_mut() + .poll(cx) + } + } + static CACHE: async_once_cell::Lazy, F> = + async_once_cell::Lazy::new(F(None)); + *Pin::static_ref(&CACHE).await.get_ref() } } +type LazyAddition = Lazy; + #[component] fn Pending() -> HtmlResult { Err(Suspension::from_future(pending()).into()) @@ -68,7 +91,7 @@ fn App() -> Html { ().checked())} /> {"not yet loaded"}

}}> - if show { label="A lazily loaded counter" /> } else { } + if show { } else { }
} diff --git a/packages/yew/src/lazy.rs b/packages/yew/src/lazy.rs index 3b4aa134f00..eb3623e67c0 100644 --- a/packages/yew/src/lazy.rs +++ b/packages/yew/src/lazy.rs @@ -38,6 +38,13 @@ impl std::fmt::Debug for LazyVTable { .finish() } } +impl Clone for LazyVTable { + fn clone(&self) -> Self { + *self + } +} +impl Copy for LazyVTable {} + impl LazyVTable { /// Returns the singleton vtable for a component. /// @@ -58,12 +65,14 @@ impl LazyVTable { } } } -/// Implement this trait to support lazily loading your component. +/// Implement this trait to support lazily loading a component. /// /// Used in conjunction with the [`Lazy`] component. -pub trait LazyComponent: BaseComponent { - /// Start fetching your component - fn fetch() -> impl Future> + Send; +pub trait LazyComponent: 'static { + /// The component that is lazily being fetched + type Underlying: BaseComponent; + /// Fetch the component's impl + fn fetch() -> impl Future> + Send; } #[derive(Debug)] @@ -76,9 +85,9 @@ enum LazyState { /// This component suspends as long as the underlying component is still being fetched, /// then behaves as the underlying component itself. #[derive(Debug)] -pub struct Lazy { - inner_scope: Scope, - state: LazyState, +pub struct Lazy { + inner_scope: Scope, + state: LazyState, } /// Message to send to a lazy component @@ -91,15 +100,14 @@ pub enum LazyMessage { } impl BaseComponent for Lazy { - type Message = LazyMessage; - type Properties = C::Properties; + type Message = LazyMessage; + type Properties = ::Properties; fn create(ctx: &Context) -> Self { let inner_scope = Scope::new(Some(ctx.link().to_any())); let creation_ctx = ctx.narrow_scope(&inner_scope); let link = ctx.link().clone(); - // TODO: fetch once per component type not instance? let suspension = Suspension::from_future(async move { // Ignore error in case receiver was dropped let vtable = C::fetch().await; From 4e017b61d61d4da293c2a7eebc5fc33d147edd85 Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Tue, 14 Oct 2025 22:57:13 +0200 Subject: [PATCH 03/11] add helper macro for lazy loading --- Cargo.lock | 1 + examples/split-wasm/src/yew.rs | 35 ++---------------------- packages/yew/Cargo.toml | 1 + packages/yew/src/lazy.rs | 50 ++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5abc018d3ef..ff8b3b237c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4948,6 +4948,7 @@ checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" name = "yew" version = "0.23.0" dependencies = [ + "async-once-cell", "base64ct", "bincode 2.0.1", "console_error_panic_hook", diff --git a/examples/split-wasm/src/yew.rs b/examples/split-wasm/src/yew.rs index 2984e861b2f..3750dcd0339 100644 --- a/examples/split-wasm/src/yew.rs +++ b/examples/split-wasm/src/yew.rs @@ -1,9 +1,8 @@ use std::future::{pending, Future}; -use std::pin::Pin; use wasm_split_helpers::wasm_split as split; use web_sys::HtmlInputElement; -use yew::lazy::{Lazy, LazyComponent, LazyVTable}; +use yew::lazy::declare_lazy_component; use yew::prelude::*; use yew::suspense::Suspension; use yew::Renderer; @@ -45,37 +44,7 @@ fn Counter(props: &CounterProps) -> Html { } } -struct LazyAdditionProxy; - -impl LazyComponent for LazyAdditionProxy { - type Underlying = Counter; - - async fn fetch() -> LazyVTable { - #[split(lazy_addition)] - fn split_fetch() -> LazyVTable { - LazyVTable::::vtable() - } - struct F(Option> + Send>>>); - impl Future for F { - type Output = LazyVTable; - - fn poll( - mut self: Pin<&mut Self>, - cx: &mut std::task::Context<'_>, - ) -> std::task::Poll { - self.0 - .get_or_insert_with(|| Box::pin(split_fetch())) - .as_mut() - .poll(cx) - } - } - static CACHE: async_once_cell::Lazy, F> = - async_once_cell::Lazy::new(F(None)); - *Pin::static_ref(&CACHE).await.get_ref() - } -} - -type LazyAddition = Lazy; +declare_lazy_component!(Counter as LazyAddition in lazy_addition); #[component] fn Pending() -> HtmlResult { diff --git a/packages/yew/Cargo.toml b/packages/yew/Cargo.toml index bcf4bcfad2d..f5538bf175d 100644 --- a/packages/yew/Cargo.toml +++ b/packages/yew/Cargo.toml @@ -34,6 +34,7 @@ serde = { workspace = true, features = ["derive"] } tracing = "0.1.44" tokise = "0.3" rustversion.workspace = true +async-once-cell = "0.5.3" [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen-futures.workspace = true diff --git a/packages/yew/src/lazy.rs b/packages/yew/src/lazy.rs index eb3623e67c0..4b01b80e5fe 100644 --- a/packages/yew/src/lazy.rs +++ b/packages/yew/src/lazy.rs @@ -179,3 +179,53 @@ impl BaseComponent for Lazy { } } } + +/// Make a component accessible as a lazily loaded component in a separate wasm module +#[doc(hidden)] +#[macro_export] +macro_rules! __declare_lazy_component { + ($comp:ty as $lazy_name:ident in $module:ident) => { + struct Proxy; + impl ::yew::lazy::LazyComponent for Proxy { + type Underlying = $comp; + + async fn fetch() -> ::yew::lazy::LazyVTable { + #[split($module)] + fn split_fetch() -> ::yew::lazy::LazyVTable<$comp> { + ::yew::lazy::LazyVTable::<$comp>::vtable() + } + struct F( + ::std::option::Option< + ::std::pin::Pin< + ::std::boxed::Box< + dyn ::std::future::Future> + + ::std::marker::Send, + >, + >, + >, + ); + impl Future for F { + type Output = ::yew::lazy::LazyVTable<$comp>; + + fn poll( + mut self: ::std::pin::Pin<&mut Self>, + cx: &mut ::std::task::Context<'_>, + ) -> ::std::task::Poll { + self.0 + .get_or_insert_with(|| ::std::boxed::Box::pin(split_fetch())) + .as_mut() + .poll(cx) + } + } + static CACHE: ::yew::lazy::LazyCell<::yew::lazy::LazyVTable<$comp>, F> = + ::yew::lazy::LazyCell::new(F(None)); + *::std::pin::Pin::static_ref(&CACHE).await.get_ref() + } + } + type $lazy_name = ::yew::lazy::Lazy; + }; +} +#[doc(hidden)] +pub use ::async_once_cell::Lazy as LazyCell; + +pub use crate::__declare_lazy_component as declare_lazy_component; From 3ee6eea7f797d461d4124e6dffd4f96cca068eb0 Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Thu, 16 Oct 2025 15:12:47 +0200 Subject: [PATCH 04/11] integrate wasm_split_helpers directly into yew makes it possible to implement a helper macro without the user pulling in an extra dependency and has tighter version requirements. --- Cargo.lock | 10 +++++----- examples/split-wasm/Cargo.toml | 1 - examples/split-wasm/build.sh | 3 +-- examples/split-wasm/src/yew.rs | 1 - packages/yew/Cargo.toml | 1 + packages/yew/src/lazy.rs | 4 +++- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ff8b3b237c9..2099ed29759 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3708,7 +3708,6 @@ dependencies = [ "async-once-cell", "wasm-bindgen", "wasm-bindgen-futures", - "wasm_split_helpers", "web-sys", "yew", ] @@ -4650,9 +4649,9 @@ dependencies = [ [[package]] name = "wasm_split_helpers" -version = "0.2.0-rc.1" +version = "0.2.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a63f86bb241fa35d6e87c50311e1abb9e403c5db690f3637525d6fa2876b8e" +checksum = "f68a5378142b01290e67fb6da5e8cc60eadccabab375bf57e1ac93c525d91053" dependencies = [ "async-once-cell", "wasm_split_macros", @@ -4660,9 +4659,9 @@ dependencies = [ [[package]] name = "wasm_split_macros" -version = "0.2.0-rc.1" +version = "0.2.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee3692283763ee89e2eb075c51fff63c6385d6a31bcb1931262dc44180e58fb" +checksum = "53f4b5cb3cc6173a614b7aef0573ee5ded1d0396f4ec634a9a8612e7bb027ca4" dependencies = [ "base16", "quote", @@ -4969,6 +4968,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test", + "wasm_split_helpers", "web-sys", "yew-macro", ] diff --git a/examples/split-wasm/Cargo.toml b/examples/split-wasm/Cargo.toml index 61f8c168173..0e7ac495cc9 100644 --- a/examples/split-wasm/Cargo.toml +++ b/examples/split-wasm/Cargo.toml @@ -8,7 +8,6 @@ license = "MIT OR Apache-2.0" [dependencies] async-once-cell = "0.5.3" yew = { path = "../../packages/yew", features = ["csr"] } -wasm_split_helpers = "0.2.0-rc.1" wasm-bindgen = "*" wasm-bindgen-futures = "*" diff --git a/examples/split-wasm/build.sh b/examples/split-wasm/build.sh index 78fb7536275..abf5a6928ac 100755 --- a/examples/split-wasm/build.sh +++ b/examples/split-wasm/build.sh @@ -21,8 +21,7 @@ GLOBIGNORE=".:.." rm -rf dist/* mkdir dist/.stage ( - cd ~/recreational/src/wasm-split-prototype/ - cargo run --features="build-binary" -- --verbose "$TARGET_DIR/wasm32-unknown-unknown/${PROFILE}/split-wasm.wasm" "$THIS_DIR"/dist/.stage/ \ + wasm_split_cli --verbose "$TARGET_DIR/wasm32-unknown-unknown/${PROFILE}/split-wasm.wasm" "$THIS_DIR"/dist/.stage/ \ > "$THIS_DIR"/dist/.stage/split.log ) echo "running wasm-bindgen" diff --git a/examples/split-wasm/src/yew.rs b/examples/split-wasm/src/yew.rs index 3750dcd0339..6f428c74f2c 100644 --- a/examples/split-wasm/src/yew.rs +++ b/examples/split-wasm/src/yew.rs @@ -1,6 +1,5 @@ use std::future::{pending, Future}; -use wasm_split_helpers::wasm_split as split; use web_sys::HtmlInputElement; use yew::lazy::declare_lazy_component; use yew::prelude::*; diff --git a/packages/yew/Cargo.toml b/packages/yew/Cargo.toml index f5538bf175d..81ff04005e2 100644 --- a/packages/yew/Cargo.toml +++ b/packages/yew/Cargo.toml @@ -34,6 +34,7 @@ serde = { workspace = true, features = ["derive"] } tracing = "0.1.44" tokise = "0.3" rustversion.workspace = true +wasm_split_helpers = "0.2.0-rc.2" async-once-cell = "0.5.3" [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/packages/yew/src/lazy.rs b/packages/yew/src/lazy.rs index 4b01b80e5fe..13f3de8fc63 100644 --- a/packages/yew/src/lazy.rs +++ b/packages/yew/src/lazy.rs @@ -190,7 +190,7 @@ macro_rules! __declare_lazy_component { type Underlying = $comp; async fn fetch() -> ::yew::lazy::LazyVTable { - #[split($module)] + #[$crate::lazy::wasm_split::wasm_split($module, wasm_split_path = $crate::lazy::wasm_split)] fn split_fetch() -> ::yew::lazy::LazyVTable<$comp> { ::yew::lazy::LazyVTable::<$comp>::vtable() } @@ -227,5 +227,7 @@ macro_rules! __declare_lazy_component { } #[doc(hidden)] pub use ::async_once_cell::Lazy as LazyCell; +#[doc(hidden)] +pub use ::wasm_split_helpers as wasm_split; pub use crate::__declare_lazy_component as declare_lazy_component; From 846ea67d2d48bf6d79dc0308fa16e26a6564c5eb Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Thu, 16 Oct 2025 15:27:51 +0200 Subject: [PATCH 05/11] fix: feature soundness --- packages/yew/src/lazy.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/yew/src/lazy.rs b/packages/yew/src/lazy.rs index 13f3de8fc63..823a30c034a 100644 --- a/packages/yew/src/lazy.rs +++ b/packages/yew/src/lazy.rs @@ -5,7 +5,7 @@ use std::future::Future; -use crate::html::{Scope, Scoped}; +use crate::html::Scope; use crate::suspense::Suspension; use crate::{BaseComponent, Context, HtmlResult}; @@ -104,7 +104,17 @@ impl BaseComponent for Lazy { type Properties = ::Properties; fn create(ctx: &Context) -> Self { - let inner_scope = Scope::new(Some(ctx.link().to_any())); + #[cfg(not(any(feature = "ssr", feature = "csr")))] + { + let _ = ctx; + todo!("Component shouldn't render without any rendering mode enabled"); + } + #[allow(unreachable_code)] + let inner_scope; + #[cfg(any(feature = "ssr", feature = "csr"))] + { + inner_scope = Scope::new(Some(ctx.link().clone().into())); + } let creation_ctx = ctx.narrow_scope(&inner_scope); let link = ctx.link().clone(); From 086e84c778ddf5da5bd0be6e4fc8c6a2bd0321a0 Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Wed, 22 Oct 2025 11:22:02 +0200 Subject: [PATCH 06/11] bump to release version --- Cargo.lock | 8 ++++---- packages/yew/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2099ed29759..0f93d01f656 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4649,9 +4649,9 @@ dependencies = [ [[package]] name = "wasm_split_helpers" -version = "0.2.0-rc.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f68a5378142b01290e67fb6da5e8cc60eadccabab375bf57e1ac93c525d91053" +checksum = "a114b3073258dd5de3d812cdd048cca6842342755e828a14dbf15f843f2d1b84" dependencies = [ "async-once-cell", "wasm_split_macros", @@ -4659,9 +4659,9 @@ dependencies = [ [[package]] name = "wasm_split_macros" -version = "0.2.0-rc.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53f4b5cb3cc6173a614b7aef0573ee5ded1d0396f4ec634a9a8612e7bb027ca4" +checksum = "56481f8ed1a9f9ae97ea7b08a5e2b12e8adf9a7818a6ba952b918e09c7be8bf0" dependencies = [ "base16", "quote", diff --git a/packages/yew/Cargo.toml b/packages/yew/Cargo.toml index 81ff04005e2..c4d4138c461 100644 --- a/packages/yew/Cargo.toml +++ b/packages/yew/Cargo.toml @@ -34,7 +34,7 @@ serde = { workspace = true, features = ["derive"] } tracing = "0.1.44" tokise = "0.3" rustversion.workspace = true -wasm_split_helpers = "0.2.0-rc.2" +wasm_split_helpers = "0.2.0" async-once-cell = "0.5.3" [target.'cfg(target_arch = "wasm32")'.dependencies] From 1aa30bff8e6b2f560271fafac21ef35a36a51e9f Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Thu, 12 Mar 2026 00:00:56 +0100 Subject: [PATCH 07/11] fix message passing of components we accept the penalty of running a lot of lifecycle hooks twice: once for the Lazy<_> component, once for the inner one, and just forward messages and other things, instead of hacking around in Scope. --- examples/split-wasm/.cargo/config.toml | 2 + examples/split-wasm/build.sh | 3 +- packages/yew/src/html/component/mod.rs | 26 +--- packages/yew/src/html/component/scope.rs | 12 +- packages/yew/src/lazy.rs | 179 +++++++++++------------ packages/yew/src/virtual_dom/vcomp.rs | 34 ++++- 6 files changed, 137 insertions(+), 119 deletions(-) create mode 100644 examples/split-wasm/.cargo/config.toml diff --git a/examples/split-wasm/.cargo/config.toml b/examples/split-wasm/.cargo/config.toml new file mode 100644 index 00000000000..b65cc8fb321 --- /dev/null +++ b/examples/split-wasm/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.'cfg(target_arch = "wasm32")'] +rustflags=["-Clink-args=--emit-relocs"] diff --git a/examples/split-wasm/build.sh b/examples/split-wasm/build.sh index abf5a6928ac..4f7b6b3d399 100755 --- a/examples/split-wasm/build.sh +++ b/examples/split-wasm/build.sh @@ -12,8 +12,7 @@ THIS_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) TARGET_DIR=$(cd -- "$THIS_DIR"/../../target/ &> /dev/null && pwd) OPT=1 -RUSTFLAGS="-Clink-args=--emit-relocs$(case "$CARGO" in *nightly*) echo " -Zunstable-options -Cpanic=immediate-abort" ;; esac)" \ - $CARGO build --target wasm32-unknown-unknown \ +$CARGO build --target wasm32-unknown-unknown \ $(case $PROFILE in "debug") ;; "release") echo "--release" ;; *) echo '--profile "${PROFILE}"' ;; esac) mkdir -p dist/ diff --git a/packages/yew/src/html/component/mod.rs b/packages/yew/src/html/component/mod.rs index abb090926bf..4b2b9a0f773 100644 --- a/packages/yew/src/html/component/mod.rs +++ b/packages/yew/src/html/component/mod.rs @@ -55,6 +55,12 @@ impl Context { &self.props } + /// The component's props as an Rc + #[inline] + pub(crate) fn rc_props(&self) -> &Rc { + &self.props + } + #[cfg(feature = "hydration")] pub(crate) fn creation_mode(&self) -> RenderMode { self.creation_mode @@ -70,26 +76,6 @@ impl Context { state } - - pub(crate) fn narrow_scope>( - &self, - inner: &Scope, - ) -> Context { - let mut ctx = Context { - scope: inner.clone(), - props: self.props.clone(), - #[cfg(feature = "hydration")] - creation_mode: self.creation_mode, - #[cfg(feature = "hydration")] - prepared_state: None, - }; - let _ = &mut ctx; // silence warning due to feature conditional branch below - #[cfg(feature = "hydration")] - { - ctx.prepared_state = self.prepared_state.clone(); - } - ctx - } } /// The common base of both function components and struct components. diff --git a/packages/yew/src/html/component/scope.rs b/packages/yew/src/html/component/scope.rs index 4a4681f385e..0d82e3e2fbe 100644 --- a/packages/yew/src/html/component/scope.rs +++ b/packages/yew/src/html/component/scope.rs @@ -388,7 +388,7 @@ mod feat_csr_ssr { use std::sync::atomic::{AtomicUsize, Ordering}; use super::*; - use crate::html::component::lifecycle::UpdateRunner; + use crate::html::component::lifecycle::{RenderRunner, UpdateRunner}; use crate::scheduler::{self, Shared}; #[derive(Debug)] @@ -471,6 +471,16 @@ mod feat_csr_ssr { scheduler::start(); } + #[inline] + pub(crate) fn schedule_render(&self) { + scheduler::push_component_render( + self.id, + Box::new(RenderRunner { + state: self.state.clone(), + }), + ); + } + #[inline] pub(super) fn arch_send_message(&self, msg: T) where diff --git a/packages/yew/src/lazy.rs b/packages/yew/src/lazy.rs index 823a30c034a..2ca634a5647 100644 --- a/packages/yew/src/lazy.rs +++ b/packages/yew/src/lazy.rs @@ -3,26 +3,23 @@ // A simple wrapper is easy to implement. This module exists to support message passing and more // involved logic +use std::cell::RefCell; use std::future::Future; +use std::rc::Rc; use crate::html::Scope; +use crate::scheduler::Shared; use crate::suspense::Suspension; -use crate::{BaseComponent, Context, HtmlResult}; +use crate::virtual_dom::VComp; +use crate::{BaseComponent, Context}; -// we might be able to erase the BaseComponent bound here, then monomorphize for some size savings -/// This struct is (mentally) the same as a `dyn BaseComponent` but without informing the linker -/// about this. #[derive(Debug)] -#[repr(C)] struct CompVTableImpl { - create: fn(&Context) -> C, - update: fn(&mut C, &Context, C::Message) -> bool, - changed: fn(&mut C, &Context, &C::Properties) -> bool, - view: fn(&C, &Context) -> HtmlResult, - rendered: fn(&mut C, &Context, bool), - destroy: fn(&mut C, &Context), - prepare_state: fn(&C) -> Option, - //... + /// The way to create a component from properties and a way to reference it later. + /// It is important that we return a structure that already captures the vtable to + /// the component's functionality (Mountable), so that the linker doesn't see that + /// the main module references C's BaseComponent impl. + wrap_html: fn(Rc, Shared>>) -> VComp, } /// Component vtable for a component. /// @@ -34,7 +31,7 @@ pub struct LazyVTable { impl std::fmt::Debug for LazyVTable { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("LazyVTable") - .field("vtable", &"...") + .field("vtable", &(self.imp as *const _)) .finish() } } @@ -50,16 +47,16 @@ impl LazyVTable { /// /// Return this from [`LazyComponent::fetch`] for your lazy component. pub fn vtable() -> LazyVTable { + fn wrap_html( + props: Rc, + scope_ref: Shared>>, + ) -> VComp { + VComp::new_with_ref(props, scope_ref) + } LazyVTable { imp: &const { CompVTableImpl { - create: C::create, - update: C::update, - changed: C::changed, - view: C::view, - rendered: C::rendered, - destroy: C::destroy, - prepare_state: C::prepare_state, + wrap_html: wrap_html::, } }, } @@ -75,118 +72,110 @@ pub trait LazyComponent: 'static { fn fetch() -> impl Future> + Send; } -#[derive(Debug)] enum LazyState { Pending(Suspension), - Created(LazyVTable, C), + Created(LazyVTable), +} + +impl std::fmt::Debug for LazyState { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Pending(arg0) => f.debug_tuple("Pending").field(arg0).finish(), + Self::Created(arg0) => f.debug_tuple("Created").field(arg0).finish(), + } + } } + /// Wrapper for a lazily fetched component /// /// This component suspends as long as the underlying component is still being fetched, /// then behaves as the underlying component itself. -#[derive(Debug)] pub struct Lazy { - inner_scope: Scope, - state: LazyState, + inner_scope: Shared>>, + // messages sent to the component before the inner_scope is set are buffered + message_buffer: RefCell::Message>>, + state: Shared>, } -/// Message to send to a lazy component -#[derive(Debug)] -pub enum LazyMessage { - /// Forward the message to the underlying component once that is fetched - Forward(C::Message), - #[doc(hidden)] - FetchFinished(LazyVTable, C), +impl std::fmt::Debug for Lazy { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Lazy") + .field("inner_scope", &self.inner_scope) + .field("message_buffer", &"...") + .field("state", &self.state) + .finish() + } } impl BaseComponent for Lazy { - type Message = LazyMessage; + type Message = ::Message; type Properties = ::Properties; fn create(ctx: &Context) -> Self { - #[cfg(not(any(feature = "ssr", feature = "csr")))] - { - let _ = ctx; - todo!("Component shouldn't render without any rendering mode enabled"); - } - #[allow(unreachable_code)] - let inner_scope; - #[cfg(any(feature = "ssr", feature = "csr"))] - { - inner_scope = Scope::new(Some(ctx.link().clone().into())); - } - let creation_ctx = ctx.narrow_scope(&inner_scope); - - let link = ctx.link().clone(); - let suspension = Suspension::from_future(async move { - // Ignore error in case receiver was dropped - let vtable = C::fetch().await; - let comp = (vtable.imp.create)(&creation_ctx); - link.send_message(LazyMessage::FetchFinished(vtable, comp)); + let host_scope = ctx.link().clone(); + let state = Rc::>::new_cyclic(move |state| { + let state = state.clone(); + let suspension = Suspension::from_future(async move { + // Ignore error in case receiver was dropped + let vtable = C::fetch().await; + #[cfg(any(feature = "ssr", feature = "csr"))] + if let Some(state) = state.upgrade() { + *state.borrow_mut() = LazyState::Created(vtable); + // force a re-render with this new state (without a message exchange) + host_scope.schedule_render(); + } + }); + RefCell::new(LazyState::Pending(suspension)) }); Self { - inner_scope, - state: LazyState::Pending(suspension), + inner_scope: Rc::default(), + message_buffer: RefCell::default(), + state, } } - fn update(&mut self, ctx: &Context, msg: Self::Message) -> bool { - let msg = match msg { - LazyMessage::FetchFinished(vtable, comp) => { - self.state = LazyState::Created(vtable, comp); - return true; - } - LazyMessage::Forward(msg) => msg, - }; - match &mut self.state { - LazyState::Pending(_) => { - // has a queueing implementation. We don't rerender until the suspension resolves - self.inner_scope.send_message(msg); - false - } - LazyState::Created(vtable, comp) => { - (vtable.imp.update)(comp, &ctx.narrow_scope(&self.inner_scope), msg) - } + fn update(&mut self, _: &Context, msg: Self::Message) -> bool { + if let Some(inner) = self.inner_scope.borrow().as_ref() { + inner.send_message(msg); + } else { + self.message_buffer.borrow_mut().push(msg); } + false } - fn changed(&mut self, ctx: &Context, old_props: &Self::Properties) -> bool { - if let LazyState::Created(vtable, comp) = &mut self.state { - (vtable.imp.changed)(comp, &ctx.narrow_scope(&self.inner_scope), old_props) - } else { - false - } + fn changed(&mut self, _: &Context, _old_props: &Self::Properties) -> bool { + true } fn view(&self, ctx: &Context) -> crate::HtmlResult { - match &self.state { + match &*self.state.borrow() { LazyState::Pending(suspension) => Err(suspension.clone().into()), - LazyState::Created(vtable, comp) => { - (vtable.imp.view)(comp, &ctx.narrow_scope(&self.inner_scope)) + LazyState::Created(lazy_vtable) => { + let comp = + (lazy_vtable.imp.wrap_html)(ctx.rc_props().clone(), self.inner_scope.clone()); + Ok(comp.into()) } } } - fn rendered(&mut self, ctx: &Context, first_render: bool) { - if let LazyState::Created(vtable, comp) = &mut self.state { - (vtable.imp.rendered)(comp, &ctx.narrow_scope(&self.inner_scope), first_render) + fn rendered(&mut self, _: &Context, first_render: bool) { + if first_render { + let inner = self.inner_scope.borrow(); + let inner = inner.as_ref().expect("lazy component to have rendered"); + inner.send_message_batch(std::mem::take(&mut *self.message_buffer.borrow_mut())); } else { - unreachable!("can't get rendered before fetching the vtable") + #[cfg(debug_assertions)] + assert!( + self.message_buffer.borrow().is_empty(), + "no message in buffer after first render" + ); } } - fn destroy(&mut self, ctx: &Context) { - if let LazyState::Created(vtable, comp) = &mut self.state { - (vtable.imp.destroy)(comp, &ctx.narrow_scope(&self.inner_scope)) - } - } + fn destroy(&mut self, _: &Context) {} fn prepare_state(&self) -> Option { - if let LazyState::Created(vtable, comp) = &self.state { - (vtable.imp.prepare_state)(comp) - } else { - None - } + None } } diff --git a/packages/yew/src/virtual_dom/vcomp.rs b/packages/yew/src/virtual_dom/vcomp.rs index 5087cc36c7a..1eaf2b81ae4 100644 --- a/packages/yew/src/virtual_dom/vcomp.rs +++ b/packages/yew/src/virtual_dom/vcomp.rs @@ -19,6 +19,7 @@ use crate::html::BaseComponent; use crate::html::Scoped; #[cfg(any(feature = "ssr", feature = "csr"))] use crate::html::{AnyScope, Scope}; +use crate::scheduler::Shared; #[cfg(feature = "ssr")] use crate::{feat_ssr::VTagKind, platform::fmt::BufWriter}; @@ -92,11 +93,25 @@ pub(crate) trait Mountable { pub(crate) struct PropsWrapper { props: Rc, + scope_ref: Option>>>, } impl PropsWrapper { pub fn new(props: Rc) -> Self { - Self { props } + Self { + props, + scope_ref: None, + } + } + + pub fn new_with_ref( + props: Rc, + scope_ref: Shared>>, + ) -> Self { + Self { + props, + scope_ref: Some(scope_ref), + } } } @@ -104,6 +119,7 @@ impl Mountable for PropsWrapper { fn copy(&self) -> Box { let wrapper: PropsWrapper = PropsWrapper { props: Rc::clone(&self.props), + scope_ref: self.scope_ref.clone(), }; Box::new(wrapper) } @@ -128,6 +144,9 @@ impl Mountable for PropsWrapper { slot: DomSlot, ) -> (Box, DynamicDomSlot) { let scope: Scope = Scope::new(Some(parent_scope.clone())); + if let Some(scope_ref) = self.scope_ref { + *scope_ref.borrow_mut() = Some(scope.clone()); + } let own_slot = scope.mount_in_place(root.clone(), parent, slot, self.props); (Box::new(scope), own_slot) @@ -248,6 +267,19 @@ impl VComp { _marker: 0, } } + + /// Attach a ref into which the scope of the child will be written when it is mounted + pub(crate) fn new_with_ref( + props: Rc, + scope_ref: Shared>>, + ) -> Self { + VComp { + type_id: TypeId::of::(), + mountable: Box::new(PropsWrapper::::new_with_ref(props, scope_ref)), + key: None, + _marker: 0, + } + } } impl PartialEq for VComp { From 44f31e9f04923bd0c13148e31cafdfb0750314d5 Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Thu, 12 Mar 2026 00:08:18 +0100 Subject: [PATCH 08/11] fix: feature soundness --- packages/yew/src/lazy.rs | 2 ++ packages/yew/src/virtual_dom/vcomp.rs | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/yew/src/lazy.rs b/packages/yew/src/lazy.rs index 2ca634a5647..a7267d510c2 100644 --- a/packages/yew/src/lazy.rs +++ b/packages/yew/src/lazy.rs @@ -74,6 +74,7 @@ pub trait LazyComponent: 'static { enum LazyState { Pending(Suspension), + #[allow(unused)] // Only constructed with feature csr or ssr Created(LazyVTable), } @@ -124,6 +125,7 @@ impl BaseComponent for Lazy { // force a re-render with this new state (without a message exchange) host_scope.schedule_render(); } + let _ = (host_scope, state, vtable); }); RefCell::new(LazyState::Pending(suspension)) }); diff --git a/packages/yew/src/virtual_dom/vcomp.rs b/packages/yew/src/virtual_dom/vcomp.rs index 1eaf2b81ae4..bc4980596d7 100644 --- a/packages/yew/src/virtual_dom/vcomp.rs +++ b/packages/yew/src/virtual_dom/vcomp.rs @@ -14,11 +14,11 @@ use super::Key; use crate::dom_bundle::Fragment; #[cfg(feature = "csr")] use crate::dom_bundle::{BSubtree, DomSlot, DynamicDomSlot}; -use crate::html::BaseComponent; +#[cfg(any(feature = "ssr", feature = "csr"))] +use crate::html::AnyScope; #[cfg(feature = "csr")] use crate::html::Scoped; -#[cfg(any(feature = "ssr", feature = "csr"))] -use crate::html::{AnyScope, Scope}; +use crate::html::{BaseComponent, Scope}; use crate::scheduler::Shared; #[cfg(feature = "ssr")] use crate::{feat_ssr::VTagKind, platform::fmt::BufWriter}; From ba75ecbe4bd7cc26e23ceef8827d1fd3e0da73be Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Thu, 12 Mar 2026 00:35:57 +0100 Subject: [PATCH 09/11] fix some lints and use $crate consistently in macro_rules --- packages/yew/src/lazy.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/yew/src/lazy.rs b/packages/yew/src/lazy.rs index a7267d510c2..05b62488f84 100644 --- a/packages/yew/src/lazy.rs +++ b/packages/yew/src/lazy.rs @@ -13,13 +13,15 @@ use crate::suspense::Suspension; use crate::virtual_dom::VComp; use crate::{BaseComponent, Context}; +type ScopeRef = Shared>>; + #[derive(Debug)] struct CompVTableImpl { /// The way to create a component from properties and a way to reference it later. /// It is important that we return a structure that already captures the vtable to /// the component's functionality (Mountable), so that the linker doesn't see that /// the main module references C's BaseComponent impl. - wrap_html: fn(Rc, Shared>>) -> VComp, + wrap_html: fn(Rc, ScopeRef) -> VComp, } /// Component vtable for a component. /// @@ -92,7 +94,7 @@ impl std::fmt::Debug for LazyState { /// This component suspends as long as the underlying component is still being fetched, /// then behaves as the underlying component itself. pub struct Lazy { - inner_scope: Shared>>, + inner_scope: ScopeRef, // messages sent to the component before the inner_scope is set are buffered message_buffer: RefCell::Message>>, state: Shared>, @@ -187,26 +189,26 @@ impl BaseComponent for Lazy { macro_rules! __declare_lazy_component { ($comp:ty as $lazy_name:ident in $module:ident) => { struct Proxy; - impl ::yew::lazy::LazyComponent for Proxy { + impl $crate::lazy::LazyComponent for Proxy { type Underlying = $comp; - async fn fetch() -> ::yew::lazy::LazyVTable { + async fn fetch() -> $crate::lazy::LazyVTable { #[$crate::lazy::wasm_split::wasm_split($module, wasm_split_path = $crate::lazy::wasm_split)] - fn split_fetch() -> ::yew::lazy::LazyVTable<$comp> { - ::yew::lazy::LazyVTable::<$comp>::vtable() + fn split_fetch() -> $crate::lazy::LazyVTable<$comp> { + $crate::lazy::LazyVTable::<$comp>::vtable() } struct F( ::std::option::Option< ::std::pin::Pin< ::std::boxed::Box< - dyn ::std::future::Future> + dyn ::std::future::Future> + ::std::marker::Send, >, >, >, ); impl Future for F { - type Output = ::yew::lazy::LazyVTable<$comp>; + type Output = $crate::lazy::LazyVTable<$comp>; fn poll( mut self: ::std::pin::Pin<&mut Self>, @@ -218,12 +220,12 @@ macro_rules! __declare_lazy_component { .poll(cx) } } - static CACHE: ::yew::lazy::LazyCell<::yew::lazy::LazyVTable<$comp>, F> = - ::yew::lazy::LazyCell::new(F(None)); + static CACHE: $crate::lazy::LazyCell<$crate::lazy::LazyVTable<$comp>, F> = + $crate::lazy::LazyCell::new(F(None)); *::std::pin::Pin::static_ref(&CACHE).await.get_ref() } } - type $lazy_name = ::yew::lazy::Lazy; + type $lazy_name = $crate::lazy::Lazy; }; } #[doc(hidden)] From f8b661e95c5f44402e5cc79dc071122c2e55cd5d Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Wed, 26 Aug 2026 13:37:21 +0200 Subject: [PATCH 10/11] remove unnecessary fragment --- examples/split-wasm/src/yew.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/split-wasm/src/yew.rs b/examples/split-wasm/src/yew.rs index 6f428c74f2c..f45461879f7 100644 --- a/examples/split-wasm/src/yew.rs +++ b/examples/split-wasm/src/yew.rs @@ -55,13 +55,11 @@ fn App() -> Html { let toggle = use_state(|| false); let show = *toggle; html! { - <> ().checked())} /> {"not yet loaded"}

}}> if show { } else { }
- } } From 67ba59f6756ef9ee7a3785a65bae438f1be31d0b Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Wed, 26 Aug 2026 13:40:41 +0200 Subject: [PATCH 11/11] update lock file (includes linker fix) --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f93d01f656..a69140cdfc1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4649,9 +4649,9 @@ dependencies = [ [[package]] name = "wasm_split_helpers" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a114b3073258dd5de3d812cdd048cca6842342755e828a14dbf15f843f2d1b84" +checksum = "ab578aae2fe2916edaea06843187d50f87b0965622da0ceef648edca27b385ba" dependencies = [ "async-once-cell", "wasm_split_macros", @@ -4659,9 +4659,9 @@ dependencies = [ [[package]] name = "wasm_split_macros" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56481f8ed1a9f9ae97ea7b08a5e2b12e8adf9a7818a6ba952b918e09c7be8bf0" +checksum = "3e653af7ee4a9ef0fce481a9ec6f43cb78de20d0cdb4f4f5862e1dc6e407e6c8" dependencies = [ "base16", "quote",