From b2cb14c6aa18fca3d5576bb1c1e301d3ac36e45d Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Thu, 8 Oct 2026 00:21:50 +0200 Subject: [PATCH 1/3] Let dx bundle the Android module and the service worker through a dioxus feature --- .github/workflows/ci.yml | 9 +- Cargo.lock | 253 +++++++++- Cargo.toml | 6 + README.md | 15 +- examples/dioxus/Cargo.lock | 962 ++++++++++++++++++++++++++++++++++-- examples/dioxus/Cargo.toml | 6 +- examples/dioxus/Dioxus.toml | 2 - examples/dioxus/src/main.rs | 6 - src/config.rs | 11 +- src/dx.rs | 18 + src/lib.rs | 8 + src/web.rs | 11 +- src/web_parts.rs | 22 + 13 files changed, 1257 insertions(+), 72 deletions(-) create mode 100644 src/dx.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b966cb..8681fab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,10 +70,11 @@ jobs: - run: | rustup toolchain install 1.85 --profile minimal rustup target add --toolchain 1.85 aarch64-linux-android aarch64-apple-ios aarch64-apple-darwin - - run: cargo +1.85 check --workspace --all-features - - run: cargo +1.85 check --workspace --all-features --target aarch64-linux-android - - run: cargo +1.85 check --workspace --all-features --target aarch64-apple-ios - - run: cargo +1.85 check --workspace --all-features --target aarch64-apple-darwin + # Every feature but `dioxus`, which needs the Rust version Dioxus 0.7 apps already need. + - run: cargo +1.85 check --workspace --features stream + - run: cargo +1.85 check --workspace --features stream --target aarch64-linux-android + - run: cargo +1.85 check --workspace --features stream --target aarch64-apple-ios + - run: cargo +1.85 check --workspace --features stream --target aarch64-apple-darwin docs: name: Docs diff --git a/Cargo.lock b/Cargo.lock index 7552175..20997c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,7 +90,7 @@ dependencies = [ "polling", "rustix", "slab", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -148,7 +148,7 @@ dependencies = [ "rustix", "signal-hook-registry", "slab", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -241,6 +241,12 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +[[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.5" @@ -289,6 +295,48 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" +[[package]] +name = "const-serialize" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad7154afa56de2f290e3c82c2c6dc4f5b282b6870903f56ef3509aba95866edc" +dependencies = [ + "const-serialize-macro 0.7.2", +] + +[[package]] +name = "const-serialize" +version = "0.8.0-alpha.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e42cd5aabba86f128b3763da1fec1491c0f728ce99245062cd49b6f9e6d235b" +dependencies = [ + "const-serialize 0.7.2", + "const-serialize-macro 0.8.0-alpha.1", + "serde", +] + +[[package]] +name = "const-serialize-macro" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f160aad86b4343e8d4e261fee9965c3005b2fd6bc117d172ab65948779e4acf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "const-serialize-macro" +version = "0.8.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e4c3b1c2ce89797adff100c510b92c7cf32983fdbc632e703253f2ef516ef56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "cpubits" version = "0.1.1" @@ -389,6 +437,12 @@ dependencies = [ "block2", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "ecdsa" version = "0.17.0" @@ -466,7 +520,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -672,6 +726,22 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + [[package]] name = "jni" version = "0.22.4" @@ -681,10 +751,10 @@ dependencies = [ "cfg-if", "combine", "jni-macros", - "jni-sys", + "jni-sys 0.4.1", "log", "simd_cesu8", - "thiserror", + "thiserror 2.0.21", "walkdir", "windows-link", ] @@ -702,6 +772,15 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + [[package]] name = "jni-sys" version = "0.4.1" @@ -779,6 +858,59 @@ version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "manganis" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed2af894a724a0b6e521f9efe84f98cfdc74a4de6828efef77ffd3b1679fd52" +dependencies = [ + "const-serialize 0.7.2", + "const-serialize 0.8.0-alpha.0", + "jni 0.21.1", + "manganis-core", + "manganis-macro", + "ndk-context", + "objc2", + "thiserror 2.0.21", +] + +[[package]] +name = "manganis-core" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e258c71b137bf48deaffb48b8a8a2f994af9e5c3ca201daa20d41e26b379da11" +dependencies = [ + "const-serialize 0.7.2", + "const-serialize 0.8.0-alpha.0", + "serde", + "winnow 0.7.15", +] + +[[package]] +name = "manganis-macro" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0abae8346bbf637e6d21ac3831863bd5a98657517f5cd2d69d651046b95e7ce9" +dependencies = [ + "dunce", + "macro-string", + "manganis-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "memchr" version = "2.8.3" @@ -794,6 +926,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + [[package]] name = "num-traits" version = "0.2.19" @@ -970,7 +1108,7 @@ dependencies = [ "hermit-abi", "pin-project-lite", "rustix", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -1041,10 +1179,11 @@ dependencies = [ "futures-executor", "getrandom", "hkdf", - "jni", + "jni 0.22.4", "js-sys", "libc", "linkme", + "manganis", "objc2", "objc2-app-kit", "objc2-foundation", @@ -1055,7 +1194,7 @@ dependencies = [ "pushups-macros", "sha2", "tempfile", - "thiserror", + "thiserror 2.0.21", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -1136,7 +1275,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -1351,7 +1490,16 @@ dependencies = [ "getrandom", "once_cell", "rustix", - "windows-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", ] [[package]] @@ -1360,7 +1508,18 @@ version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -1458,7 +1617,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -1570,7 +1729,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -1674,6 +1833,15 @@ 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", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -1683,6 +1851,21 @@ 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", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + [[package]] name = "windows-threading" version = "0.2.1" @@ -1692,6 +1875,48 @@ dependencies = [ "windows-link", ] +[[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_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[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_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[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_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "winnow" version = "0.7.15" @@ -1750,7 +1975,7 @@ dependencies = [ "tracing", "uds_windows", "uuid", - "windows-sys", + "windows-sys 0.61.2", "winnow 0.7.15", "zbus_macros", "zbus_names", diff --git a/Cargo.toml b/Cargo.toml index 3bcb89c..fb90970 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,8 @@ exclude = ["/assets"] [features] stream = ["dep:futures-channel", "dep:futures-core"] +# Lets `dx` bundle the Android module and the static service worker from this crate. +dioxus = ["dep:manganis"] [workspace] members = ["pushups-macros"] @@ -28,6 +30,10 @@ thiserror = "2" futures-channel = { version = "0.3", default-features = false, features = ["std"] } jni = "0.22" +[target.'cfg(any(target_os = "android", all(target_arch = "wasm32", target_os = "unknown")))'.dependencies] +# The `dioxus` the app depends on resolves this to its own version. +manganis = { version = "0.7", optional = true } + [target.'cfg(any(target_os = "ios", target_os = "macos"))'.dependencies] block2 = "0.6" dispatch2 = { version = "0.3", default-features = false, features = ["std", "block2"] } diff --git a/README.md b/README.md index e03af71..3ddc27b 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,17 @@ let keys = web.web_push_keys().unwrap(); assert_eq!(keys.auth, "BwcHBwcHBwcHBwcHBwcHBw"); ``` +## Dioxus + +The `dioxus` feature lets `dx` bundle what the crate ships, the Android module and the web's static service worker, with no path into the crate in the app. + +```toml +[dependencies] +pushups = { version = "0.1", features = ["dioxus", "stream"] } +``` + +The app installs the crate in `main` before `dioxus::launch`, and a `use_future` in its root component reads `pushups::events()` into its signals, as `examples/dioxus` does. Apple's push entitlement and background mode go in `Dioxus.toml`. The feature builds with the Rust version Dioxus 0.7 needs, newer than the crate's own. + ## iOS and macOS `install` runs in `main`, on the main thread, before the toolkit starts. The crate adds its push methods to whatever app delegate the toolkit installs, and installs its own when there is none, so tao and winit need no change. It also handles the notification center's delegate, so a push arriving while the app is in front shows as a banner and a tap on a notification reaches the handler. Every push reaches the handler once, including one whose notification is tapped later. @@ -71,7 +82,7 @@ A push that wakes the app in the background runs the background handler below of ## Android -The crate ships a Gradle module in `android/` holding the FCM and UnifiedPush services. A `dx` app bundles it with `#[manganis::ffi("/android")]` on an `extern "Kotlin" { pub type Pushups; }` block, the path relative to the app's manifest directory, as `examples/dioxus` does. A Tauri app includes it as a Gradle project. cargo-apk and xbuild have no way to bundle it yet. +The crate ships a Gradle module in `android/` holding the FCM and UnifiedPush services. A `dx` app bundles it through the `dioxus` feature. A Tauri app includes it as a Gradle project. cargo-apk and xbuild have no way to bundle it yet. The app compiles its Firebase configuration in, from the `google-services.json` the Firebase console gives, with no Google services Gradle plugin. A process the push started with no UI can run Rust at once through a background handler. The push also waits on disk for the app's handler, which gets it when the UI opens. @@ -96,7 +107,7 @@ An app whose `Config` has a `UnifiedPushConfig` gets its pushes through a [Unifi The web target needs the app's VAPID public key. Every push shows a notification, as browsers require, and a payload in the [Declarative Web Push](https://webkit.org/blog/16535/meet-declarative-web-push/) shape (`"web_push": 8030`) is shown as it is. Pushes that arrive with no page open wait in `IndexedDB` for the next page's handler. -By default the app serves `js/pushups-sw.js` from this crate at `/pushups-sw.js`, a service worker with no wasm in it. An app that needs Rust to build the notification, to decrypt an end-to-end encrypted payload for instance, sets `rust_handler`. Its own wasm then runs as the service worker, with no second build, and its `main` serves the handler there. +By default the app serves `js/pushups-sw.js` from this crate at `/pushups-sw.js`, a service worker with no wasm in it, and with the `dioxus` feature `dx` serves it from the app's assets. An app that needs Rust to build the notification, to decrypt an end-to-end encrypted payload for instance, sets `rust_handler`. Its own wasm then runs as the service worker, with no second build, and its `main` serves the handler there. ```rust use pushups::{Config, Message, Notification, WebPushConfig}; diff --git a/examples/dioxus/Cargo.lock b/examples/dioxus/Cargo.lock index ad6d3a3..7453a29 100644 --- a/examples/dioxus/Cargo.lock +++ b/examples/dioxus/Cargo.lock @@ -8,6 +8,41 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aead" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1973cfbc1a2daf9cf550e74e1f088c28e7f7d8c1e1418fb6c9dc5184b7e84c99" +dependencies = [ + "crypto-common 0.2.2", + "inout", +] + +[[package]] +name = "aes" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8eb277bec05f56a0e0591f155a484cbd0f4f07ff2905051a48c72f004f7ed58" +dependencies = [ + "cipher", + "cpubits", + "cpufeatures 0.3.1", +] + +[[package]] +name = "aes-gcm" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2b8006a0c83f52b62ba44a97b58bf76fe2f70a329e588f67f89691d93d498f" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ctutils", + "ghash", +] + [[package]] name = "aho-corasick" version = "1.1.5" @@ -73,6 +108,120 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f8abc12baad266b1c8cec146854c195b5864b4221d4b2ca7296a7ae82d9e451" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + [[package]] name = "async-stream" version = "0.3.6" @@ -95,6 +244,12 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.92" @@ -248,6 +403,12 @@ dependencies = [ "tower-service", ] +[[package]] +name = "base16ct" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" + [[package]] name = "base64" version = "0.22.1" @@ -260,6 +421,12 @@ version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bit_field" version = "0.10.3" @@ -305,6 +472,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + [[package]] name = "block2" version = "0.6.2" @@ -314,6 +490,19 @@ dependencies = [ "objc2", ] +[[package]] +name = "blocking" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "built" version = "0.8.1" @@ -477,6 +666,23 @@ dependencies = [ "half", ] +[[package]] +name = "cipher" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c" +dependencies = [ + "block-buffer 0.12.1", + "crypto-common 0.2.2", + "inout", +] + +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + [[package]] name = "cocoa" version = "0.26.1" @@ -522,6 +728,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "const-serialize" version = "0.7.2" @@ -712,6 +933,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" +[[package]] +name = "cpubits" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -779,6 +1006,22 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "crypto-bigint" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a52aa3fcda4e6302a9f48734f234d35d4721b96f8fe07d073f07ce9df4f0271" +dependencies = [ + "cpubits", + "ctutils", + "getrandom 0.4.3", + "hybrid-array", + "num-traits", + "rand_core 0.10.1", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.7" @@ -789,6 +1032,17 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "getrandom 0.4.3", + "hybrid-array", + "rand_core 0.10.1", +] + [[package]] name = "cssparser" version = "0.29.6" @@ -816,6 +1070,25 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "ctr" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baaca1c4b237092596f64d571e9db6ce4109c4ef9742e27590f1709594461f21" +dependencies = [ + "cipher", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", + "subtle", +] + [[package]] name = "darling" version = "0.21.3" @@ -856,6 +1129,17 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" +[[package]] +name = "der" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a878c850e9e421b20262e9b41f9c860e4785fa07541c266b62ff9d1ef998a80a" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.5.8" @@ -904,8 +1188,20 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", + "block-buffer 0.10.4", + "crypto-common 0.1.7", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid", + "crypto-common 0.2.2", + "ctutils", ] [[package]] @@ -1513,12 +1809,49 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "ecdsa" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0681a4fc24c767085329728d8dfba959af91228aa4610cca4f8ce317ba46ae0" +dependencies = [ + "der", + "digest 0.11.3", + "elliptic-curve", + "rfc6979", + "signature", + "spki", + "zeroize", +] + [[package]] name = "either" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" +[[package]] +name = "elliptic-curve" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d65aa39b3a5c1c9c1b745c9a019234bb7a21b77abcb4f4d266d706e2d577d65" +dependencies = [ + "base16ct", + "crypto-bigint", + "crypto-common 0.2.2", + "digest 0.11.3", + "ff", + "group", + "hkdf", + "hybrid-array", + "pem-rfc7468", + "pkcs8", + "rand_core 0.10.1", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "encoding_rs" version = "0.8.42" @@ -1533,6 +1866,33 @@ dependencies = [ "simdutf8", ] +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "enumset" version = "1.1.14" @@ -1600,6 +1960,26 @@ dependencies = [ "serde", ] +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "exr" version = "1.74.2" @@ -1638,6 +2018,16 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "ff" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489f" +dependencies = [ + "rand_core 0.10.1", + "subtle", +] + [[package]] name = "field-offset" version = "0.3.6" @@ -1780,6 +2170,19 @@ version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.34" @@ -1994,6 +2397,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "ghash" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eecf2d5dc9b66b732b97707a0210906b1d30523eb773193ab777c0c84b3e8d5" +dependencies = [ + "polyval", +] + [[package]] name = "gif" version = "0.14.2" @@ -2157,6 +2569,17 @@ dependencies = [ "system-deps", ] +[[package]] +name = "group" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4" +dependencies = [ + "ff", + "rand_core 0.10.1", + "subtle", +] + [[package]] name = "gtk" version = "0.18.2" @@ -2262,6 +2685,36 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", +] + [[package]] name = "html5ever" version = "0.29.1" @@ -2319,6 +2772,17 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "hybrid-array" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" +dependencies = [ + "subtle", + "typenum", + "zeroize", +] + [[package]] name = "hyper" version = "1.11.1" @@ -2548,6 +3012,15 @@ dependencies = [ "cfb", ] +[[package]] +name = "inout" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7" +dependencies = [ + "hybrid-array", +] + [[package]] name = "interpolate_name" version = "0.2.4" @@ -2857,6 +3330,26 @@ dependencies = [ "x11", ] +[[package]] +name = "linkme" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3045e122bd98aef8ec3ad58ce84f0791f64e70163d1a02710af4aa11a4d54cc5" +dependencies = [ + "linkme-impl", +] + +[[package]] +name = "linkme-impl" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77060ebe535362c3da75682cd17b0431017b6e7c5661e714fc69a7ad017d1301" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -3511,19 +4004,42 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" name = "openssl-sys" version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "futures-core", + "pin-project-lite", ] [[package]] -name = "option-ext" -version = "0.2.0" +name = "p256" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "d2c9239b2dbc807adbbe147e8cf72ea7450c3a0aabe62cb8e75ff4ec22e1f72a" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primefield", + "primeorder", + "sha2 0.11.0", +] [[package]] name = "pango" @@ -3550,6 +4066,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -3585,6 +4107,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" +[[package]] +name = "pem-rfc7468" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -3737,6 +4268,27 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkcs8" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.34" @@ -3769,12 +4321,37 @@ dependencies = [ "miniz_oxide 0.8.9", ] +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "pollster" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +[[package]] +name = "polyval" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0fa31d631f2b2cb2a544d0aa321ce847a94764d701ca2becc411138b93d49cd" +dependencies = [ + "cpubits", + "cpufeatures 0.3.1", + "universal-hash", +] + [[package]] name = "potential_utf" version = "0.1.6" @@ -3805,6 +4382,33 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "primefield" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c555a6e4eb7d4e158fcb028c835c3b8642206ddc279b5c6b202ef9a8bdb592f4" +dependencies = [ + "crypto-bigint", + "crypto-common 0.2.2", + "ff", + "rand_core 0.10.1", + "subtle", + "zeroize", +] + +[[package]] +name = "primeorder" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c9f42978c78a00e3d68f69fc03e57a234debae69da4020a4fb588fcdcd07b06" +dependencies = [ + "elliptic-curve", + "once_cell", + "primefield", + "serdect", + "wnaf", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -3947,24 +4551,37 @@ checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" name = "pushups" version = "0.1.0" dependencies = [ + "aes-gcm", "block2", "dispatch2", "futures-channel", "futures-core", + "getrandom 0.4.3", + "hkdf", "jni 0.22.4", "js-sys", "libc", + "linkme", + "manganis", "objc2", "objc2-app-kit", "objc2-foundation", "objc2-ui-kit", "objc2-user-notifications", + "p256", "parking_lot", "pushups-macros", + "sha2 0.11.0", "thiserror 2.0.21", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "windows 0.62.2", + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-link 0.2.1", + "zbus", ] [[package]] @@ -3975,7 +4592,6 @@ dependencies = [ "dioxus", "futures-util", "js-sys", - "manganis", "pushups", "serde_json", "web-sys", @@ -4402,6 +5018,16 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "rfc6979" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a459cddafb3fe76b31fd8f1108007566c40301feb64dc7b54656eb7388172b" +dependencies = [ + "crypto-bigint", + "hmac", +] + [[package]] name = "rfd" version = "0.17.2" @@ -4551,6 +5177,20 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sec1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d" +dependencies = [ + "base16ct", + "ctutils", + "der", + "hybrid-array", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "3.7.0" @@ -4715,6 +5355,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serdect" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "servo_arc" version = "0.2.0" @@ -4733,7 +5383,7 @@ checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", "cpufeatures 0.2.17", - "digest", + "digest 0.10.7", ] [[package]] @@ -4744,7 +5394,18 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures 0.2.17", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "digest 0.11.3", ] [[package]] @@ -4782,6 +5443,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" +dependencies = [ + "digest 0.11.3", + "rand_core 0.10.1", +] + [[package]] name = "simd-adler32" version = "0.3.10" @@ -4918,6 +5589,16 @@ version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +[[package]] +name = "spki" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef958a98b9d5da290cfc78946e9f3e61e1e62a18db0d92cac0b83cc161491a9" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -5082,8 +5763,8 @@ dependencies = [ "tao-macros", "unicode-segmentation", "url", - "windows", - "windows-core", + "windows 0.61.3", + "windows-core 0.61.2", "windows-version", "x11-dl", ] @@ -5536,6 +6217,17 @@ version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + [[package]] name = "unicase" version = "2.9.0" @@ -5560,6 +6252,16 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4987bdc12753382e0bec4a65c50738ffaabc998b9cdd1f952fb5f39b0048a96" +dependencies = [ + "crypto-common 0.2.2", + "ctutils", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -5597,6 +6299,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97277d36b9c3ace13e58fa6e753f8b0bbbf302a18dd193240d70f9e29681059a" dependencies = [ "js-sys", + "serde_core", "wasm-bindgen", ] @@ -5857,8 +6560,8 @@ checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows", - "windows-core", + "windows 0.61.3", + "windows-core 0.61.2", "windows-implement", "windows-interface", ] @@ -5881,8 +6584,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" dependencies = [ "thiserror 2.0.21", - "windows", - "windows-core", + "windows 0.61.3", + "windows-core 0.61.2", ] [[package]] @@ -5928,11 +6631,23 @@ version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-collections", - "windows-core", - "windows-future", + "windows-collections 0.2.0", + "windows-core 0.61.2", + "windows-future 0.2.1", "windows-link 0.1.3", - "windows-numerics", + "windows-numerics 0.2.0", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-numerics 0.3.1", ] [[package]] @@ -5941,7 +6656,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-core", + "windows-core 0.61.2", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", ] [[package]] @@ -5953,8 +6677,21 @@ dependencies = [ "windows-implement", "windows-interface", "windows-link 0.1.3", - "windows-result", - "windows-strings", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -5963,9 +6700,20 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ - "windows-core", + "windows-core 0.61.2", "windows-link 0.1.3", - "windows-threading", + "windows-threading 0.1.0", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", ] [[package]] @@ -6008,10 +6756,20 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-core", + "windows-core 0.61.2", "windows-link 0.1.3", ] +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", +] + [[package]] name = "windows-result" version = "0.3.4" @@ -6021,6 +6779,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-strings" version = "0.4.2" @@ -6030,6 +6797,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -6132,6 +6908,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-version" version = "0.1.7" @@ -6312,6 +7097,18 @@ version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "wnaf" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "795ca18b3fdb5e62bf982199278341ddcf7ebf7d32e25e212ad05d496e95f6fa" +dependencies = [ + "ff", + "group", + "hybrid-array", + "primefield", +] + [[package]] name = "writeable" version = "0.6.4" @@ -6348,7 +7145,7 @@ dependencies = [ "once_cell", "percent-encoding", "raw-window-handle 0.6.2", - "sha2", + "sha2 0.10.9", "soup3", "tao-macros", "thiserror 2.0.21", @@ -6356,8 +7153,8 @@ dependencies = [ "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows", - "windows-core", + "windows 0.61.3", + "windows-core 0.61.2", "windows-version", ] @@ -6440,6 +7237,67 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zbus" +version = "5.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.15", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.15", + "zvariant", +] + [[package]] name = "zerocopy" version = "0.8.60" @@ -6555,3 +7413,43 @@ checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" dependencies = [ "zune-core", ] + +[[package]] +name = "zvariant" +version = "5.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.15", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.119", + "winnow 0.7.15", +] diff --git a/examples/dioxus/Cargo.toml b/examples/dioxus/Cargo.toml index fdbac06..9ef05a9 100644 --- a/examples/dioxus/Cargo.toml +++ b/examples/dioxus/Cargo.toml @@ -10,13 +10,9 @@ publish = false base64 = "0.22" dioxus = "0.7.10" futures-util = { version = "0.3", default-features = false } -pushups = { path = "../..", features = ["stream"] } +pushups = { path = "../..", features = ["stream", "dioxus"] } serde_json = "1" -[target.'cfg(target_os = "android")'.dependencies] -# Bundles the crate's Gradle module into the APK. -manganis = "0.7.10" - [target.'cfg(target_arch = "wasm32")'.dependencies] js-sys = "0.3" web-sys = { version = "0.3", features = ["console"] } diff --git a/examples/dioxus/Dioxus.toml b/examples/dioxus/Dioxus.toml index 86c0824..c77bc61 100644 --- a/examples/dioxus/Dioxus.toml +++ b/examples/dioxus/Dioxus.toml @@ -1,7 +1,5 @@ [application] name = "pushups-dioxus-example" -# Serves js/pushups-sw.js at /pushups-sw.js, the static worker's default path. -public_dir = "../../js" [web.app] title = "pushups example" diff --git a/examples/dioxus/src/main.rs b/examples/dioxus/src/main.rs index 4957c36..2fb6f50 100644 --- a/examples/dioxus/src/main.rs +++ b/examples/dioxus/src/main.rs @@ -15,12 +15,6 @@ use base64::Engine as _; use base64::engine::general_purpose::{STANDARD, URL_SAFE_NO_PAD}; use pushups::{Config, Context, Event, Message, Notification, Permission, WebPushConfig}; -#[cfg(target_os = "android")] -#[manganis::ffi("../../android")] -extern "Kotlin" { - pub type Pushups; -} - pushups::firebase_config!("google-services.json"); /// Where the background handler sends its request, forwarded to the host by diff --git a/src/config.rs b/src/config.rs index 4b6fd87..e74db19 100644 --- a/src/config.rs +++ b/src/config.rs @@ -103,13 +103,14 @@ impl WnsConfig { #[derive(Debug, Clone, PartialEq, Eq)] pub struct WebPushConfig { pub(crate) vapid_public_key: [u8; 65], - pub(crate) service_worker_path: String, + pub(crate) service_worker_path: Option, pub(crate) rust_handler: bool, } impl WebPushConfig { - /// The service worker path used unless [`service_worker_path`](Self::service_worker_path) - /// sets another. + /// The path of the static service worker unless [`service_worker_path`](Self::service_worker_path) + /// sets another. With the `dioxus` feature the default is the copy `dx` bundles from this + /// crate into the app's assets. pub const DEFAULT_SERVICE_WORKER_PATH: &str = "/pushups-sw.js"; /// A configuration for the app's VAPID public key, an uncompressed P-256 point. @@ -117,7 +118,7 @@ impl WebPushConfig { pub fn new(vapid_public_key: [u8; 65]) -> Self { Self { vapid_public_key, - service_worker_path: Self::DEFAULT_SERVICE_WORKER_PATH.to_owned(), + service_worker_path: None, rust_handler: false, } } @@ -125,7 +126,7 @@ impl WebPushConfig { /// Where the app serves the `js/pushups-sw.js` file this crate ships. #[must_use] pub fn service_worker_path(mut self, path: impl Into) -> Self { - self.service_worker_path = path.into(); + self.service_worker_path = Some(path.into()); self } diff --git a/src/dx.rs b/src/dx.rs new file mode 100644 index 0000000..6597e95 --- /dev/null +++ b/src/dx.rs @@ -0,0 +1,18 @@ +//! What `dx` bundles from this crate for a Dioxus app, declared here so the paths stay inside the +//! crate wherever Cargo keeps it. + +// `dx` copies the Gradle module into the app's Android project. +#[cfg(target_os = "android")] +#[manganis::ffi("android")] +extern "Kotlin" { + pub type Pushups; +} + +/// The static service worker, copied unchanged and unhashed into the app's assets. +#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +pub(crate) const WORKER: manganis::Asset = manganis::asset!( + "/js/pushups-sw.js", + manganis::AssetOptions::js() + .with_minify(false) + .with_hash_suffix(false) +); diff --git a/src/lib.rs b/src/lib.rs index c5c94f2..726dcfa 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,6 +18,14 @@ mod context; #[cfg(any(target_os = "ios", target_os = "macos", test))] mod delivered; mod dispatch; +#[cfg(all( + feature = "dioxus", + any( + target_os = "android", + all(target_arch = "wasm32", target_os = "unknown") + ) +))] +mod dx; mod error; mod event; #[cfg(any( diff --git a/src/web.rs b/src/web.rs index c0403f0..0effd5d 100644 --- a/src/web.rs +++ b/src/web.rs @@ -9,7 +9,9 @@ use web_sys::ServiceWorkerRegistration; use crate::backend::Backend; use crate::dispatch::DISPATCHER; -use crate::web_parts::{WorkerMode, permission_from, web_push_token, worker_script_url}; +use crate::web_parts::{ + WorkerMode, permission_from, static_worker_path, web_push_token, worker_script_url, +}; use crate::{Config, Error, Event, Message, Notification, Permission, WebPushConfig}; // wasm-bindgen reads the snippet without telling cargo, so a change to it would not rebuild. @@ -157,7 +159,12 @@ impl Backend for Web { let script = if web.rust_handler { worker_script_url(&GLUE_URL.with(Clone::clone), WorkerMode::Rust) } else { - worker_script_url(&web.service_worker_path, WorkerMode::Static) + #[cfg(feature = "dioxus")] + let bundled = Some(crate::dx::WORKER.to_string()); + #[cfg(not(feature = "dioxus"))] + let bundled = None; + let path = static_worker_path(web.service_worker_path.as_deref(), bundled); + worker_script_url(&path, WorkerMode::Static) }; let options = web_sys::RegistrationOptions::new(); options.set_type("module"); diff --git a/src/web_parts.rs b/src/web_parts.rs index eac4290..fb63696 100644 --- a/src/web_parts.rs +++ b/src/web_parts.rs @@ -23,6 +23,16 @@ pub(crate) fn worker_script_url(script: &str, mode: WorkerMode) -> String { format!("{script}{separator}pushups={mode}") } +/// The static worker's script: the app's own path, else the one `dx` bundled from this crate, +/// else [`WebPushConfig::DEFAULT_SERVICE_WORKER_PATH`](crate::WebPushConfig::DEFAULT_SERVICE_WORKER_PATH). +pub(crate) fn static_worker_path(configured: Option<&str>, bundled: Option) -> String { + match (configured, bundled) { + (Some(path), _) => path.to_owned(), + (None, Some(bundled)) => bundled, + (None, None) => crate::WebPushConfig::DEFAULT_SERVICE_WORKER_PATH.to_owned(), + } +} + /// The token of a push subscription, from its endpoint, keys and expiry in milliseconds. pub(crate) fn web_push_token( endpoint: String, @@ -84,6 +94,18 @@ mod tests { ); } + #[test] + fn the_static_worker_is_the_apps_path_then_the_bundled_one_then_the_default() { + let bundled = || Some("/assets/pushups-sw.js".to_owned()); + assert_eq!(static_worker_path(Some("/sw.js"), bundled()), "/sw.js"); + assert_eq!(static_worker_path(None, bundled()), "/assets/pushups-sw.js"); + assert_eq!(static_worker_path(None, None), "/pushups-sw.js"); + assert_eq!( + static_worker_path(Some("/pushups-sw.js"), bundled()), + "/pushups-sw.js" + ); + } + #[test] fn a_subscription_becomes_a_web_push_token() { let token = web_push_token( From cbd33e7490d65318aef7ffb68848a48ec9af1906 Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Thu, 8 Oct 2026 00:35:56 +0200 Subject: [PATCH 2/3] Give the Dioxus example a web app manifest and icons --- assets/brand/icon-maskable.svg | 14 ++++++++++++++ assets/brand/render.sh | 12 +++++++++++- assets/brand/variants.py | 2 ++ examples/dioxus/index.html | 2 ++ .../dioxus/public/icons/apple-touch-icon.png | Bin 0 -> 3622 bytes examples/dioxus/public/icons/icon-192.png | Bin 0 -> 3798 bytes examples/dioxus/public/icons/icon-512.png | Bin 0 -> 10871 bytes .../dioxus/public/icons/icon-maskable-192.png | Bin 0 -> 3119 bytes .../dioxus/public/icons/icon-maskable-512.png | Bin 0 -> 8836 bytes examples/dioxus/public/manifest.webmanifest | 15 +++++++++++++++ 10 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 assets/brand/icon-maskable.svg create mode 100644 examples/dioxus/public/icons/apple-touch-icon.png create mode 100644 examples/dioxus/public/icons/icon-192.png create mode 100644 examples/dioxus/public/icons/icon-512.png create mode 100644 examples/dioxus/public/icons/icon-maskable-192.png create mode 100644 examples/dioxus/public/icons/icon-maskable-512.png create mode 100644 examples/dioxus/public/manifest.webmanifest diff --git a/assets/brand/icon-maskable.svg b/assets/brand/icon-maskable.svg new file mode 100644 index 0000000..9ebbbb9 --- /dev/null +++ b/assets/brand/icon-maskable.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/assets/brand/render.sh b/assets/brand/render.sh index 71cfd4a..e6bfc8b 100755 --- a/assets/brand/render.sh +++ b/assets/brand/render.sh @@ -12,4 +12,14 @@ done # The repository's social preview, uploaded in the GitHub settings. rsvg-convert --width 1280 --height 640 "$brand/social.svg" --output "$brand/png/social.png" -oxipng --quiet --opt max --strip safe "$brand"/png/*.png +# The Dioxus example's web app icons, written where `dx` serves them from. +public=$brand/../../examples/dioxus/public +mkdir -p "$public/icons" +for size in 192 512; do + rsvg-convert --width "$size" --height "$size" "$brand/icon.svg" --output "$public/icons/icon-$size.png" + rsvg-convert --width "$size" --height "$size" "$brand/icon-maskable.svg" --output "$public/icons/icon-maskable-$size.png" +done +# iOS reads the home screen icon from this link and rounds its corners itself. +rsvg-convert --width 180 --height 180 "$brand/icon.svg" --output "$public/icons/apple-touch-icon.png" + +oxipng --quiet --opt max --strip safe "$brand"/png/*.png "$public"/icons/*.png diff --git a/assets/brand/variants.py b/assets/brand/variants.py index 1a19f3a..6218426 100644 --- a/assets/brand/variants.py +++ b/assets/brand/variants.py @@ -37,6 +37,8 @@ def svg(name, width, height, body, view_box=None): svg("icon.svg", 1024, 1024, f'\n {placed(1024, 0.66)}') # Apple's macOS icon grid, an 824 square with a 185 radius on a 1024 canvas. svg("icon-macos.svg", 1024, 1024, f'\n {placed(1024, 0.48)}') +# A maskable web icon, full bleed, with the mark inside the 80% circle Android crops to. +svg("icon-maskable.svg", 1024, 1024, f'\n {placed(1024, 0.56)}') svg("favicon.svg", 64, 64, f'\n {placed(64, 0.78)}') svg( "social.svg", diff --git a/examples/dioxus/index.html b/examples/dioxus/index.html index 7e63ce9..46dab72 100644 --- a/examples/dioxus/index.html +++ b/examples/dioxus/index.html @@ -5,6 +5,8 @@ + + diff --git a/examples/dioxus/public/icons/apple-touch-icon.png b/examples/dioxus/public/icons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d5997794357067ba7b0568bb1d33a238a7e46038 GIT binary patch literal 3622 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 O0Z>|o$Z`!k+&=*NDbX7M literal 0 HcmV?d00001 diff --git a/examples/dioxus/public/icons/icon-192.png b/examples/dioxus/public/icons/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..1319106d3f1a194101f68f8c926cfb7f20231649 GIT binary patch literal 3798 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 literal 0 HcmV?d00001 diff --git a/examples/dioxus/public/icons/icon-512.png b/examples/dioxus/public/icons/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ececf81efdb78af06615155bd33f0783aa1ee3 GIT binary patch literal 10871 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 literal 0 HcmV?d00001 diff --git a/examples/dioxus/public/icons/icon-maskable-512.png b/examples/dioxus/public/icons/icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..35bfd4801decd4639b5ff2bdef25eb46ebd95f1c GIT binary patch literal 8836 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

*e#Rl4-$d6PST>qOk@6(~ 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 JS}n(j{{knczQO Date: Thu, 8 Oct 2026 01:52:45 +0200 Subject: [PATCH 3/3] Check the example's bundled worker where the dioxus feature puts it --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8681fab..e6966a9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -282,7 +282,8 @@ jobs: run: | dx build --web --release --no-default-features --features web PUSHUPS_WEB_WORKER=static dx build --web --release --no-default-features --features web - test -f target/dx/pushups-dioxus-example/release/web/public/pushups-sw.js + # The `dioxus` feature has dx copy the worker unchanged into the assets. + cmp target/dx/pushups-dioxus-example/release/web/public/assets/pushups-sw.js ../../js/pushups-sw.js example-apple: name: Example apps for iOS and macOS