-
-
{{ formatKilobytes(stats.speed) }}/s
-
{{ formatTime(stats.time) }} left
+
+
+ {{ formatKilobytes(stats.speed) }}
+ {{ formatTime(stats.time) }} left
+
-
+
-
+
-
+
- {{ games[element.meta.id].game.mName }}
+ {{ games[element.id].game.mName }}
- {{ games[element.meta.id].game.mShortDescription }}
+ {{ games[element.id].game.mShortDescription }}
@@ -49,79 +33,53 @@
{{ element.status }}
-
-
+
-
{{
- formatKilobytes(element.current / 1000)
- }}
- /
- {{ formatKilobytes(element.max / 1000) }}
- cancelGame(element.meta)" class="group">
-
+ cancelGame(element.id)" class="group">
+
Loading...
-
diff --git a/pages/settings/compatibility.vue b/pages/settings/compatibility.vue
new file mode 100644
index 0000000..27e0f69
--- /dev/null
+++ b/pages/settings/compatibility.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/pages/settings/downloads.vue b/pages/settings/downloads.vue
new file mode 100644
index 0000000..d7e7d53
--- /dev/null
+++ b/pages/settings/downloads.vue
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+ Install directories
+
+
+ This is where Drop will download game files to, and store them
+ indefinitely while you play. Drop and games may store other
+ information elsewhere, like saves or mods.
+
+
+
+ (open = true)"
+ type="button"
+ class="relative inline-flex items-center rounded-md bg-blue-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-blue-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600"
+ >
+ Add new directory
+
+
+
+
+
+
+
+
+ deleteDirectory(dirIdx)"
+ :disabled="dirs.length <= 1"
+ :class="[
+ dirs.length <= 1
+ ? 'text-zinc-700'
+ : 'text-zinc-400 hover:text-zinc-100',
+ '-m-2.5 block p-2.5',
+ ]"
+ >
+ Open options
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Select game directory
+
+ selectDirectory()"
+ class="block text-left w-full rounded-md border-0 px-3 py-1.5 text-zinc-100 shadow-sm ring-1 ring-inset ring-zinc-700 bg-zinc-800 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-blue-600 sm:text-sm/6"
+ >
+ {{
+ currentDirectory ?? "Click to select a directory..."
+ }}
+
+
+
+ Select an empty directory to add.
+
+
+
+
+
+ submitDirectory()"
+ :class="[
+ 'inline-flex w-full shadow-sm sm:ml-3 sm:w-auto',
+ currentDirectory === undefined
+ ? 'text-zinc-400 bg-blue-600/10 hover:bg-blue-600/10'
+ : 'text-white bg-blue-600 hover:bg-blue-500',
+ ]"
+ >
+ Add
+
+ cancelDirectory()"
+ ref="cancelButtonRef"
+ >
+ Cancel
+
+
+
+
+
+
+
+
+
+ {{ error }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/settings/index.vue b/pages/settings/index.vue
new file mode 100644
index 0000000..27e0f69
--- /dev/null
+++ b/pages/settings/index.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/pages/settings/interface.vue b/pages/settings/interface.vue
new file mode 100644
index 0000000..27e0f69
--- /dev/null
+++ b/pages/settings/interface.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/main/pages/setup/index.vue b/pages/setup/index.vue
similarity index 100%
rename from main/pages/setup/index.vue
rename to pages/setup/index.vue
diff --git a/main/pages/setup/server.vue b/pages/setup/server.vue
similarity index 100%
rename from main/pages/setup/server.vue
rename to pages/setup/server.vue
diff --git a/pages/store/index.vue b/pages/store/index.vue
new file mode 100644
index 0000000..64d8a3e
--- /dev/null
+++ b/pages/store/index.vue
@@ -0,0 +1,2 @@
+
+
diff --git a/plugins.ts b/plugins.ts
new file mode 100644
index 0000000..e65d2d4
--- /dev/null
+++ b/plugins.ts
@@ -0,0 +1 @@
+import 'tauri-plugin-gamepad-api'
\ No newline at end of file
diff --git a/main/plugins/global-error-handler.ts b/plugins/global-error-handler.ts
similarity index 80%
rename from main/plugins/global-error-handler.ts
rename to plugins/global-error-handler.ts
index c0b91ea..f9d7249 100644
--- a/main/plugins/global-error-handler.ts
+++ b/plugins/global-error-handler.ts
@@ -1,11 +1,8 @@
export default defineNuxtPlugin((nuxtApp) => {
// Also possible
- /*
nuxtApp.hook("vue:error", (error, instance, info) => {
-
- console.error(error, info);
+ console.log(error);
const router = useRouter();
router.replace(`/error`);
});
- */
});
diff --git a/main/plugins/vuedraggable.ts b/plugins/vuedraggable.ts
similarity index 100%
rename from main/plugins/vuedraggable.ts
rename to plugins/vuedraggable.ts
diff --git a/main/public/fonts/helvetica/Helvetica-Bold.woff b/public/fonts/helvetica/Helvetica-Bold.woff
similarity index 100%
rename from main/public/fonts/helvetica/Helvetica-Bold.woff
rename to public/fonts/helvetica/Helvetica-Bold.woff
diff --git a/main/public/fonts/helvetica/Helvetica-BoldOblique.woff b/public/fonts/helvetica/Helvetica-BoldOblique.woff
similarity index 100%
rename from main/public/fonts/helvetica/Helvetica-BoldOblique.woff
rename to public/fonts/helvetica/Helvetica-BoldOblique.woff
diff --git a/main/public/fonts/helvetica/Helvetica-Oblique.woff b/public/fonts/helvetica/Helvetica-Oblique.woff
similarity index 100%
rename from main/public/fonts/helvetica/Helvetica-Oblique.woff
rename to public/fonts/helvetica/Helvetica-Oblique.woff
diff --git a/main/public/fonts/helvetica/Helvetica.woff b/public/fonts/helvetica/Helvetica.woff
similarity index 100%
rename from main/public/fonts/helvetica/Helvetica.woff
rename to public/fonts/helvetica/Helvetica.woff
diff --git a/main/public/fonts/helvetica/helvetica-compressed-5871d14b6903a.woff b/public/fonts/helvetica/helvetica-compressed-5871d14b6903a.woff
similarity index 100%
rename from main/public/fonts/helvetica/helvetica-compressed-5871d14b6903a.woff
rename to public/fonts/helvetica/helvetica-compressed-5871d14b6903a.woff
diff --git a/main/public/fonts/helvetica/helvetica-light-587ebe5a59211.woff b/public/fonts/helvetica/helvetica-light-587ebe5a59211.woff
similarity index 100%
rename from main/public/fonts/helvetica/helvetica-light-587ebe5a59211.woff
rename to public/fonts/helvetica/helvetica-light-587ebe5a59211.woff
diff --git a/main/public/fonts/helvetica/helvetica-light-587ebe5a59211.woff2 b/public/fonts/helvetica/helvetica-light-587ebe5a59211.woff2
similarity index 100%
rename from main/public/fonts/helvetica/helvetica-light-587ebe5a59211.woff2
rename to public/fonts/helvetica/helvetica-light-587ebe5a59211.woff2
diff --git a/main/public/fonts/helvetica/helvetica-rounded-bold-5871d05ead8de.woff b/public/fonts/helvetica/helvetica-rounded-bold-5871d05ead8de.woff
similarity index 100%
rename from main/public/fonts/helvetica/helvetica-rounded-bold-5871d05ead8de.woff
rename to public/fonts/helvetica/helvetica-rounded-bold-5871d05ead8de.woff
diff --git a/main/public/fonts/inter/InterVariable-Italic.ttf b/public/fonts/inter/InterVariable-Italic.ttf
similarity index 100%
rename from main/public/fonts/inter/InterVariable-Italic.ttf
rename to public/fonts/inter/InterVariable-Italic.ttf
diff --git a/main/public/fonts/inter/InterVariable.ttf b/public/fonts/inter/InterVariable.ttf
similarity index 100%
rename from main/public/fonts/inter/InterVariable.ttf
rename to public/fonts/inter/InterVariable.ttf
diff --git a/main/public/fonts/motiva/MotivaSansBlack.woff.ttf b/public/fonts/motiva/MotivaSansBlack.woff.ttf
similarity index 100%
rename from main/public/fonts/motiva/MotivaSansBlack.woff.ttf
rename to public/fonts/motiva/MotivaSansBlack.woff.ttf
diff --git a/main/public/fonts/motiva/MotivaSansBold.woff.ttf b/public/fonts/motiva/MotivaSansBold.woff.ttf
similarity index 100%
rename from main/public/fonts/motiva/MotivaSansBold.woff.ttf
rename to public/fonts/motiva/MotivaSansBold.woff.ttf
diff --git a/main/public/fonts/motiva/MotivaSansExtraBold.ttf b/public/fonts/motiva/MotivaSansExtraBold.ttf
similarity index 100%
rename from main/public/fonts/motiva/MotivaSansExtraBold.ttf
rename to public/fonts/motiva/MotivaSansExtraBold.ttf
diff --git a/main/public/fonts/motiva/MotivaSansLight.woff.ttf b/public/fonts/motiva/MotivaSansLight.woff.ttf
similarity index 100%
rename from main/public/fonts/motiva/MotivaSansLight.woff.ttf
rename to public/fonts/motiva/MotivaSansLight.woff.ttf
diff --git a/main/public/fonts/motiva/MotivaSansMedium.woff.ttf b/public/fonts/motiva/MotivaSansMedium.woff.ttf
similarity index 100%
rename from main/public/fonts/motiva/MotivaSansMedium.woff.ttf
rename to public/fonts/motiva/MotivaSansMedium.woff.ttf
diff --git a/main/public/fonts/motiva/MotivaSansRegular.woff.ttf b/public/fonts/motiva/MotivaSansRegular.woff.ttf
similarity index 100%
rename from main/public/fonts/motiva/MotivaSansRegular.woff.ttf
rename to public/fonts/motiva/MotivaSansRegular.woff.ttf
diff --git a/main/public/fonts/motiva/MotivaSansThin.ttf b/public/fonts/motiva/MotivaSansThin.ttf
similarity index 100%
rename from main/public/fonts/motiva/MotivaSansThin.ttf
rename to public/fonts/motiva/MotivaSansThin.ttf
diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
index a95f43c..dfed7f9 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -58,9 +58,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.98"
+version = "1.0.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
+checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
[[package]]
name = "arc-swap"
@@ -68,120 +68,39 @@ version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
-[[package]]
-name = "arrayvec"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
-
[[package]]
name = "ashpd"
-version = "0.11.0"
+version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df"
+checksum = "4d43c03d9e36dd40cab48435be0b09646da362c278223ca535493877b2c1dee9"
dependencies = [
"enumflags2",
"futures-channel",
"futures-util",
- "rand 0.9.1",
+ "rand 0.8.5",
"raw-window-handle",
"serde",
"serde_repr",
"tokio",
"url",
+ "wayland-backend",
+ "wayland-client",
+ "wayland-protocols",
"zbus",
]
-[[package]]
-name = "asn1-rs"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048"
-dependencies = [
- "asn1-rs-derive 0.5.1",
- "asn1-rs-impl",
- "displaydoc",
- "nom",
- "num-traits",
- "rusticata-macros",
- "thiserror 1.0.69",
- "time",
-]
-
-[[package]]
-name = "asn1-rs"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60"
-dependencies = [
- "asn1-rs-derive 0.6.0",
- "asn1-rs-impl",
- "displaydoc",
- "nom",
- "num-traits",
- "rusticata-macros",
- "thiserror 2.0.12",
- "time",
-]
-
-[[package]]
-name = "asn1-rs-derive"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.101",
- "synstructure",
-]
-
-[[package]]
-name = "asn1-rs-derive"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.101",
- "synstructure",
-]
-
-[[package]]
-name = "asn1-rs-impl"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.101",
-]
-
[[package]]
name = "async-broadcast"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532"
dependencies = [
- "event-listener 5.4.0",
+ "event-listener",
"event-listener-strategy",
"futures-core",
"pin-project-lite",
]
-[[package]]
-name = "async-channel"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
-dependencies = [
- "concurrent-queue",
- "event-listener 2.5.3",
- "futures-core",
-]
-
[[package]]
name = "async-channel"
version = "2.3.1"
@@ -196,38 +115,33 @@ dependencies = [
[[package]]
name = "async-executor"
-version = "1.13.2"
+version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa"
+checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec"
dependencies = [
"async-task",
"concurrent-queue",
"fastrand",
"futures-lite",
- "pin-project-lite",
"slab",
]
[[package]]
-name = "async-global-executor"
-version = "2.4.1"
+name = "async-fs"
+version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c"
+checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a"
dependencies = [
- "async-channel 2.3.1",
- "async-executor",
- "async-io",
"async-lock",
"blocking",
"futures-lite",
- "once_cell",
]
[[package]]
name = "async-io"
-version = "2.4.1"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3"
+checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059"
dependencies = [
"async-lock",
"cfg-if",
@@ -236,7 +150,7 @@ dependencies = [
"futures-lite",
"parking",
"polling",
- "rustix 1.0.7",
+ "rustix",
"slab",
"tracing",
"windows-sys 0.59.0",
@@ -248,27 +162,27 @@ version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
dependencies = [
- "event-listener 5.4.0",
+ "event-listener",
"event-listener-strategy",
"pin-project-lite",
]
[[package]]
name = "async-process"
-version = "2.3.1"
+version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc"
+checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb"
dependencies = [
- "async-channel 2.3.1",
+ "async-channel",
"async-io",
"async-lock",
"async-signal",
"async-task",
"blocking",
"cfg-if",
- "event-listener 5.4.0",
+ "event-listener",
"futures-lite",
- "rustix 1.0.7",
+ "rustix",
"tracing",
]
@@ -280,14 +194,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "async-signal"
-version = "0.2.11"
+version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d"
+checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3"
dependencies = [
"async-io",
"async-lock",
@@ -295,39 +209,12 @@ dependencies = [
"cfg-if",
"futures-core",
"futures-io",
- "rustix 1.0.7",
+ "rustix",
"signal-hook-registry",
"slab",
"windows-sys 0.59.0",
]
-[[package]]
-name = "async-std"
-version = "1.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24"
-dependencies = [
- "async-channel 1.9.0",
- "async-global-executor",
- "async-io",
- "async-lock",
- "async-process",
- "crossbeam-utils",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-lite",
- "gloo-timers",
- "kv-log-macro",
- "log",
- "memchr",
- "once_cell",
- "pin-project-lite",
- "pin-utils",
- "slab",
- "wasm-bindgen-futures",
-]
-
[[package]]
name = "async-task"
version = "4.7.1"
@@ -336,29 +223,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
[[package]]
name = "async-trait"
-version = "0.1.88"
+version = "0.1.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5"
+checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
-]
-
-[[package]]
-name = "async-tungstenite"
-version = "0.29.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef0f7efedeac57d9b26170f72965ecfd31473ca52ca7a64e925b0b6f5f079886"
-dependencies = [
- "atomic-waker",
- "futures-core",
- "futures-io",
- "futures-task",
- "futures-util",
- "log",
- "pin-project-lite",
- "tungstenite",
+ "syn 2.0.91",
]
[[package]]
@@ -384,29 +255,12 @@ dependencies = [
"system-deps",
]
-[[package]]
-name = "atomic-instant-full"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db6541700e074cda41b1c6f98c2cae6cde819967bf142078f069cad85387cdbe"
-
[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
-[[package]]
-name = "auto-launch"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471"
-dependencies = [
- "dirs 4.0.0",
- "thiserror 1.0.69",
- "winreg 0.10.1",
-]
-
[[package]]
name = "autocfg"
version = "1.4.0"
@@ -415,9 +269,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]]
name = "backtrace"
-version = "0.3.75"
+version = "0.3.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
+checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
dependencies = [
"addr2line",
"cfg-if",
@@ -428,15 +282,6 @@ dependencies = [
"windows-targets 0.52.6",
]
-[[package]]
-name = "base64"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
-dependencies = [
- "byteorder",
-]
-
[[package]]
name = "base64"
version = "0.21.7"
@@ -450,36 +295,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
-name = "bincode"
-version = "1.3.3"
+name = "binary-stream"
+version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+checksum = "f4ef03ef225ea9a0b680a5926a58cb45d8eb56abf23d8a8b5c5dbc61235e2dac"
dependencies = [
- "serde",
-]
-
-[[package]]
-name = "bitcode"
-version = "0.6.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf300f4aa6e66f3bdff11f1236a88c622fe47ea814524792240b4d554d9858ee"
-dependencies = [
- "arrayvec",
- "bitcode_derive",
- "bytemuck",
- "glam",
- "serde",
-]
-
-[[package]]
-name = "bitcode_derive"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42b6b4cb608b8282dc3b53d0f4c9ab404655d562674c682db7e6c0458cc83c23"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.101",
+ "thiserror 1.0.69",
]
[[package]]
@@ -490,33 +311,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.9.1"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
dependencies = [
"serde",
]
[[package]]
-name = "block-buffer"
-version = "0.7.3"
+name = "block"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
-dependencies = [
- "block-padding",
- "byte-tools",
- "byteorder",
- "generic-array 0.12.4",
-]
-
-[[package]]
-name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array 0.14.7",
-]
+checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
[[package]]
name = "block-buffer"
@@ -524,16 +330,7 @@ version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
dependencies = [
- "generic-array 0.14.7",
-]
-
-[[package]]
-name = "block-padding"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
-dependencies = [
- "byte-tools",
+ "generic-array",
]
[[package]]
@@ -542,16 +339,7 @@ version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
dependencies = [
- "objc2 0.5.2",
-]
-
-[[package]]
-name = "block2"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2"
-dependencies = [
- "objc2 0.6.1",
+ "objc2",
]
[[package]]
@@ -560,7 +348,7 @@ version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea"
dependencies = [
- "async-channel 2.3.1",
+ "async-channel",
"async-task",
"futures-io",
"futures-lite",
@@ -569,15 +357,15 @@ dependencies = [
[[package]]
name = "boxcar"
-version = "0.2.12"
+version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66bb12751a83493ef4b8da1120451a262554e216a247f14b48cb5e8fe7ed8bdf"
+checksum = "7f839cdf7e2d3198ac6ca003fd8ebc61715755f41c1cad15ff13df67531e00ed"
[[package]]
name = "brotli"
-version = "8.0.1"
+version = "7.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d"
+checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
@@ -586,9 +374,9 @@ dependencies = [
[[package]]
name = "brotli-decompressor"
-version = "5.0.0"
+version = "4.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03"
+checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
@@ -596,21 +384,15 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.17.0"
+version = "3.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
-
-[[package]]
-name = "byte-tools"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
name = "bytemuck"
-version = "1.23.0"
+version = "1.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c"
+checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
[[package]]
name = "byteorder"
@@ -620,69 +402,20 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
-version = "1.10.1"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
+checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
dependencies = [
"serde",
]
-[[package]]
-name = "cacache"
-version = "9.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "205ae2da91f7633dd4ecc1b12fac60c991a48b61b2cd801ad533085b15392537"
-dependencies = [
- "async-std",
- "digest 0.9.0",
- "either",
- "futures",
- "hex 0.4.3",
- "memmap",
- "serde",
- "serde_derive",
- "serde_json",
- "sha-1 0.9.8",
- "sha2 0.9.9",
- "ssri 7.0.0",
- "tempfile",
- "thiserror 1.0.69",
- "walkdir",
-]
-
-[[package]]
-name = "cacache"
-version = "13.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5063741c7b2e260bbede781cf4679632dd90e2718e99f7715e46824b65670b"
-dependencies = [
- "async-std",
- "digest 0.10.7",
- "either",
- "futures",
- "hex 0.4.3",
- "libc",
- "memmap2",
- "miette",
- "reflink-copy",
- "serde",
- "serde_derive",
- "serde_json",
- "sha1",
- "sha2 0.10.9",
- "ssri 9.2.0",
- "tempfile",
- "thiserror 1.0.69",
- "walkdir",
-]
-
[[package]]
name = "cairo-rs"
version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.6.0",
"cairo-sys-rs",
"glib",
"libc",
@@ -721,36 +454,34 @@ dependencies = [
[[package]]
name = "cargo_metadata"
-version = "0.19.2"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba"
+checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037"
dependencies = [
"camino",
"cargo-platform",
"semver",
"serde",
"serde_json",
- "thiserror 2.0.12",
+ "thiserror 1.0.69",
]
[[package]]
name = "cargo_toml"
-version = "0.22.1"
+version = "0.17.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257"
+checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719"
dependencies = [
"serde",
- "toml",
+ "toml 0.8.2",
]
[[package]]
name = "cc"
-version = "1.2.24"
+version = "1.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7"
+checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e"
dependencies = [
- "jobserver",
- "libc",
"shlex",
]
@@ -795,9 +526,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]]
name = "chrono"
-version = "0.4.41"
+version = "0.4.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
dependencies = [
"android-tzdata",
"iana-time-zone",
@@ -805,7 +536,37 @@ dependencies = [
"num-traits",
"serde",
"wasm-bindgen",
- "windows-link",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "cocoa"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2"
+dependencies = [
+ "bitflags 2.6.0",
+ "block",
+ "cocoa-foundation",
+ "core-foundation 0.10.0",
+ "core-graphics",
+ "foreign-types 0.5.0",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "cocoa-foundation"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d"
+dependencies = [
+ "bitflags 2.6.0",
+ "block",
+ "core-foundation 0.10.0",
+ "core-graphics-types",
+ "libc",
+ "objc",
]
[[package]]
@@ -842,7 +603,7 @@ version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
dependencies = [
- "getrandom 0.2.16",
+ "getrandom 0.2.15",
"once_cell",
"tiny-keccak",
]
@@ -875,9 +636,9 @@ dependencies = [
[[package]]
name = "core-foundation"
-version = "0.10.1"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
+checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63"
dependencies = [
"core-foundation-sys",
"libc",
@@ -895,8 +656,8 @@ version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1"
dependencies = [
- "bitflags 2.9.1",
- "core-foundation 0.10.1",
+ "bitflags 2.6.0",
+ "core-foundation 0.10.0",
"core-graphics-types",
"foreign-types 0.5.0",
"libc",
@@ -908,16 +669,16 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
dependencies = [
- "bitflags 2.9.1",
- "core-foundation 0.10.1",
+ "bitflags 2.6.0",
+ "core-foundation 0.10.0",
"libc",
]
[[package]]
name = "cpufeatures"
-version = "0.2.17"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
+checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
dependencies = [
"libc",
]
@@ -933,9 +694,9 @@ dependencies = [
[[package]]
name = "crossbeam-channel"
-version = "0.5.15"
+version = "0.5.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
+checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471"
dependencies = [
"crossbeam-utils",
]
@@ -967,9 +728,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crunchy"
-version = "0.2.3"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
name = "crypto-common"
@@ -977,21 +738,21 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
- "generic-array 0.14.7",
+ "generic-array",
"typenum",
]
[[package]]
name = "cssparser"
-version = "0.29.6"
+version = "0.27.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa"
+checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a"
dependencies = [
"cssparser-macros",
"dtoa-short",
- "itoa",
+ "itoa 0.4.8",
"matches",
- "phf 0.10.1",
+ "phf 0.8.0",
"proc-macro2",
"quote",
"smallvec",
@@ -1005,7 +766,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -1015,14 +776,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501"
dependencies = [
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "darling"
-version = "0.20.11"
+version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
+checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
dependencies = [
"darling_core",
"darling_macro",
@@ -1030,68 +791,34 @@ dependencies = [
[[package]]
name = "darling_core"
-version = "0.20.11"
+version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
+checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "darling_macro"
-version = "0.20.11"
+version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
+checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.101",
-]
-
-[[package]]
-name = "data-encoding"
-version = "2.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
-
-[[package]]
-name = "der-parser"
-version = "9.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553"
-dependencies = [
- "asn1-rs 0.6.2",
- "displaydoc",
- "nom",
- "num-bigint",
- "num-traits",
- "rusticata-macros",
-]
-
-[[package]]
-name = "der-parser"
-version = "10.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6"
-dependencies = [
- "asn1-rs 0.7.1",
- "displaydoc",
- "nom",
- "num-bigint",
- "num-traits",
- "rusticata-macros",
+ "syn 2.0.91",
]
[[package]]
name = "deranged"
-version = "0.4.0"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
+checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
dependencies = [
"powerfmt",
"serde",
@@ -1110,15 +837,15 @@ dependencies = [
[[package]]
name = "derive_more"
-version = "0.99.20"
+version = "0.99.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f"
+checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce"
dependencies = [
"convert_case",
"proc-macro2",
"quote",
"rustc_version",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -1127,73 +854,44 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7"
-[[package]]
-name = "digest"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
-dependencies = [
- "generic-array 0.12.4",
-]
-
-[[package]]
-name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array 0.14.7",
-]
-
[[package]]
name = "digest"
version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
- "block-buffer 0.10.4",
+ "block-buffer",
"crypto-common",
]
[[package]]
-name = "dirs"
-version = "4.0.0"
+name = "directories"
+version = "5.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
+checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35"
dependencies = [
- "dirs-sys 0.3.7",
+ "dirs-sys",
]
[[package]]
name = "dirs"
-version = "6.0.0"
+version = "5.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
+checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
dependencies = [
- "dirs-sys 0.5.0",
+ "dirs-sys",
]
[[package]]
name = "dirs-sys"
-version = "0.3.7"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
-dependencies = [
- "libc",
- "redox_users 0.4.6",
- "winapi",
-]
-
-[[package]]
-name = "dirs-sys"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
+checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
dependencies = [
"libc",
"option-ext",
- "redox_users 0.5.0",
- "windows-sys 0.59.0",
+ "redox_users",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -1202,28 +900,6 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
-[[package]]
-name = "dispatch2"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a0d569e003ff27784e0e14e4a594048698e0c0f0b66cabcb51511be55a7caa0"
-dependencies = [
- "bitflags 2.9.1",
- "block2 0.6.1",
- "libc",
- "objc2 0.6.1",
-]
-
-[[package]]
-name = "dispatch2"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"
-dependencies = [
- "bitflags 2.9.1",
- "objc2 0.6.1",
-]
-
[[package]]
name = "displaydoc"
version = "0.2.5"
@@ -1232,7 +908,16 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
+]
+
+[[package]]
+name = "dlib"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"
+dependencies = [
+ "libloading 0.8.6",
]
[[package]]
@@ -1249,13 +934,13 @@ dependencies = [
[[package]]
name = "dlopen2_derive"
-version = "0.4.1"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4"
+checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -1268,107 +953,60 @@ dependencies = [
]
[[package]]
-name = "doc-comment"
-version = "0.3.3"
+name = "downcast-rs"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
[[package]]
name = "dpi"
-version = "0.1.2"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"
+checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53"
dependencies = [
"serde",
]
[[package]]
name = "drop-app"
-version = "0.3.3"
+version = "0.1.0"
dependencies = [
- "atomic-instant-full",
- "bitcode",
"boxcar",
- "cacache 13.1.0",
"chrono",
- "deranged",
- "dirs 6.0.0",
- "droplet-rs",
- "dynfmt",
- "filetime",
- "futures-lite",
- "gethostname",
- "hex 0.4.3",
- "http 1.3.1",
- "http-serde 2.1.1",
- "humansize",
- "known-folders",
+ "directories",
+ "hex",
+ "http",
"log",
"log4rs",
"md5",
- "native_model",
- "page_size",
- "parking_lot 0.12.3",
- "rand 0.9.1",
+ "openssl",
"rayon",
- "regex",
- "reqwest 0.12.22",
- "reqwest-middleware 0.4.2",
- "reqwest-middleware-cache",
- "reqwest-websocket",
+ "reqwest",
"rustbreak",
- "rustix 0.38.44",
- "schemars",
+ "rustix",
"serde",
+ "serde-binary",
"serde_json",
- "serde_with",
- "sha1",
- "shared_child",
- "slice-deque",
- "sysinfo",
- "tar",
"tauri",
"tauri-build",
- "tauri-plugin-autostart",
"tauri-plugin-deep-link",
"tauri-plugin-dialog",
- "tauri-plugin-opener",
+ "tauri-plugin-gamepad",
"tauri-plugin-os",
"tauri-plugin-shell",
"tauri-plugin-single-instance",
- "tempfile",
- "throttle_my_fn",
"tokio",
- "umu-wrapper-lib",
"url",
"urlencoding",
"uuid",
- "walkdir",
"webbrowser",
- "whoami",
- "zstd",
-]
-
-[[package]]
-name = "droplet-rs"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "926e179267dfe9fd891d4141d65d71fba06b6b82cd6834916a6310794df7d739"
-dependencies = [
- "hex 0.4.3",
- "rcgen",
- "ring",
- "time",
- "time-macros",
- "webpki",
- "x509-parser 0.17.0",
]
[[package]]
name = "dtoa"
-version = "1.0.10"
+version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04"
+checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653"
[[package]]
name = "dtoa-short"
@@ -1387,42 +1025,28 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
[[package]]
name = "dyn-clone"
-version = "1.0.19"
+version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005"
-
-[[package]]
-name = "dynfmt"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1c298552016db86f0d49e5de09818dd86c536f66095013cc415f4f85744033f"
-dependencies = [
- "erased-serde 0.3.31",
- "lazy_static",
- "regex",
- "serde",
- "serde_json",
- "thiserror 1.0.69",
-]
+checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125"
[[package]]
name = "either"
-version = "1.15.0"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
[[package]]
name = "embed-resource"
-version = "3.0.2"
+version = "2.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fbc6e0d8e0c03a655b53ca813f0463d2c956bc4db8138dbc89f120b066551e3"
+checksum = "b68b6f9f63a0b6a38bc447d4ce84e2b388f3ec95c99c641c8ff0dd3ef89a6379"
dependencies = [
"cc",
"memchr",
"rustc_version",
- "toml",
+ "toml 0.8.2",
"vswhom",
- "winreg 0.52.0",
+ "winreg",
]
[[package]]
@@ -1447,10 +1071,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf"
[[package]]
-name = "enumflags2"
-version = "0.7.11"
+name = "enum-iterator"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147"
+checksum = "c280b9e6b3ae19e152d8e31cf47f18389781e119d4013a2a2bb0180e5facc635"
+dependencies = [
+ "enum-iterator-derive",
+]
+
+[[package]]
+name = "enum-iterator-derive"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.91",
+]
+
+[[package]]
+name = "enumflags2"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d"
dependencies = [
"enumflags2_derive",
"serde",
@@ -1458,35 +1102,26 @@ dependencies = [
[[package]]
name = "enumflags2_derive"
-version = "0.7.11"
+version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79"
+checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "equivalent"
-version = "1.0.2"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "erased-serde"
-version = "0.3.31"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "erased-serde"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7"
+checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d"
dependencies = [
"serde",
"typeid",
@@ -1494,9 +1129,9 @@ dependencies = [
[[package]]
name = "errno"
-version = "0.3.12"
+version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18"
+checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [
"libc",
"windows-sys 0.59.0",
@@ -1504,15 +1139,9 @@ dependencies = [
[[package]]
name = "event-listener"
-version = "2.5.3"
+version = "5.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
-
-[[package]]
-name = "event-listener"
-version = "5.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae"
+checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba"
dependencies = [
"concurrent-queue",
"parking",
@@ -1521,20 +1150,14 @@ dependencies = [
[[package]]
name = "event-listener-strategy"
-version = "0.5.4"
+version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
+checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2"
dependencies = [
- "event-listener 5.4.0",
+ "event-listener",
"pin-project-lite",
]
-[[package]]
-name = "fake-simd"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
-
[[package]]
name = "fastrand"
version = "2.3.0"
@@ -1560,23 +1183,11 @@ dependencies = [
"rustc_version",
]
-[[package]]
-name = "filetime"
-version = "0.2.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586"
-dependencies = [
- "cfg-if",
- "libc",
- "libredox",
- "windows-sys 0.59.0",
-]
-
[[package]]
name = "flate2"
-version = "1.1.1"
+version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece"
+checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
dependencies = [
"crc32fast",
"miniz_oxide",
@@ -1615,7 +1226,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -1649,21 +1260,6 @@ dependencies = [
"new_debug_unreachable",
]
-[[package]]
-name = "futures"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-io",
- "futures-sink",
- "futures-task",
- "futures-util",
-]
-
[[package]]
name = "futures-channel"
version = "0.3.31"
@@ -1699,9 +1295,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
[[package]]
name = "futures-lite"
-version = "2.6.0"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532"
+checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1"
dependencies = [
"fastrand",
"futures-core",
@@ -1718,7 +1314,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -1739,7 +1335,6 @@ version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
dependencies = [
- "futures-channel",
"futures-core",
"futures-io",
"futures-macro",
@@ -1859,15 +1454,6 @@ dependencies = [
"x11",
]
-[[package]]
-name = "generic-array"
-version = "0.12.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
-dependencies = [
- "typenum",
-]
-
[[package]]
name = "generic-array"
version = "0.14.7"
@@ -1880,11 +1466,11 @@ dependencies = [
[[package]]
name = "gethostname"
-version = "1.0.2"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55"
+checksum = "dc3655aa6818d65bc620d6911f05aa7b6aeb596291e1e9f79e52df85583d1e30"
dependencies = [
- "rustix 1.0.7",
+ "rustix",
"windows-targets 0.52.6",
]
@@ -1901,29 +1487,47 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.16"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
- "js-sys",
"libc",
"wasi 0.11.0+wasi-snapshot-preview1",
- "wasm-bindgen",
]
[[package]]
-name = "getrandom"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
+name = "gilrs"
+version = "0.11.0"
+source = "git+https://github.com/eugenehp/gilrs.git#cbcff6a4cd722a132bf2ca3c55fa9147775c9fe9"
dependencies = [
- "cfg-if",
+ "fnv",
+ "gilrs-core",
+ "log",
+ "serde",
+ "uuid",
+ "vec_map",
+]
+
+[[package]]
+name = "gilrs-core"
+version = "0.6.0"
+source = "git+https://github.com/eugenehp/gilrs.git#cbcff6a4cd722a132bf2ca3c55fa9147775c9fe9"
+dependencies = [
+ "core-foundation 0.10.0",
+ "inotify",
+ "io-kit-sys",
"js-sys",
"libc",
- "r-efi",
- "wasi 0.14.2+wasi-0.2.4",
+ "libudev-sys",
+ "log",
+ "nix 0.29.0",
+ "serde",
+ "uuid",
+ "vec_map",
"wasm-bindgen",
+ "web-sys",
+ "windows",
]
[[package]]
@@ -1964,19 +1568,13 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "glam"
-version = "0.30.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50a99dbe56b72736564cfa4b85bf9a33079f16ae8b74983ab06af3b1a3696b11"
-
[[package]]
name = "glib"
version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.6.0",
"futures-channel",
"futures-core",
"futures-executor",
@@ -2000,11 +1598,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
dependencies = [
"heck 0.4.1",
- "proc-macro-crate 2.0.0",
+ "proc-macro-crate 2.0.2",
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -2019,21 +1617,9 @@ dependencies = [
[[package]]
name = "glob"
-version = "0.3.2"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
-
-[[package]]
-name = "gloo-timers"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994"
-dependencies = [
- "futures-channel",
- "futures-core",
- "js-sys",
- "wasm-bindgen",
-]
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
name = "gobject-sys"
@@ -2095,41 +1681,22 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "h2"
-version = "0.3.26"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
-dependencies = [
- "bytes",
- "fnv",
- "futures-core",
- "futures-sink",
- "futures-util",
- "http 0.2.12",
- "indexmap 2.9.0",
- "slab",
- "tokio",
- "tokio-util",
- "tracing",
-]
-
-[[package]]
-name = "h2"
-version = "0.4.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5"
+checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e"
dependencies = [
"atomic-waker",
"bytes",
"fnv",
"futures-core",
"futures-sink",
- "http 1.3.1",
- "indexmap 2.9.0",
+ "http",
+ "indexmap 2.7.0",
"slab",
"tokio",
"tokio-util",
@@ -2150,9 +1717,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
[[package]]
name = "hashbrown"
-version = "0.15.3"
+version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
[[package]]
name = "heck"
@@ -2168,15 +1735,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hermit-abi"
-version = "0.5.1"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08"
-
-[[package]]
-name = "hex"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77"
+checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
[[package]]
name = "hex"
@@ -2195,47 +1756,27 @@ dependencies = [
[[package]]
name = "html5ever"
-version = "0.29.1"
+version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c"
+checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7"
dependencies = [
"log",
"mac",
"markup5ever",
- "match_token",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
]
[[package]]
name = "http"
-version = "0.2.12"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
+checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea"
dependencies = [
"bytes",
"fnv",
- "itoa",
-]
-
-[[package]]
-name = "http"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
-dependencies = [
- "bytes",
- "fnv",
- "itoa",
-]
-
-[[package]]
-name = "http-body"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
-dependencies = [
- "bytes",
- "http 0.2.12",
- "pin-project-lite",
+ "itoa 1.0.14",
]
[[package]]
@@ -2245,126 +1786,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
dependencies = [
"bytes",
- "http 1.3.1",
+ "http",
]
[[package]]
name = "http-body-util"
-version = "0.1.3"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
+checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
dependencies = [
"bytes",
- "futures-core",
- "http 1.3.1",
- "http-body 1.0.1",
+ "futures-util",
+ "http",
+ "http-body",
"pin-project-lite",
]
-[[package]]
-name = "http-cache-semantics"
-version = "0.9.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "486d14f0f5e6981578cc683e01c5f50e2be31c984a75ff5517949af2e4268519"
-dependencies = [
- "chrono",
- "http 0.2.12",
- "http-serde 1.1.3",
- "reqwest 0.11.27",
- "serde",
-]
-
-[[package]]
-name = "http-range"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573"
-
-[[package]]
-name = "http-serde"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f560b665ad9f1572cfcaf034f7fb84338a7ce945216d64a90fd81f046a3caee"
-dependencies = [
- "http 0.2.12",
- "serde",
-]
-
-[[package]]
-name = "http-serde"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd"
-dependencies = [
- "http 1.3.1",
- "serde",
-]
-
[[package]]
name = "httparse"
-version = "1.10.1"
+version = "1.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
-
-[[package]]
-name = "httpdate"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
-
-[[package]]
-name = "humansize"
-version = "2.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7"
-dependencies = [
- "libm",
-]
+checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946"
[[package]]
name = "humantime"
-version = "2.2.0"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "hyper"
-version = "0.14.32"
+version = "1.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"
-dependencies = [
- "bytes",
- "futures-channel",
- "futures-core",
- "futures-util",
- "h2 0.3.26",
- "http 0.2.12",
- "http-body 0.4.6",
- "httparse",
- "httpdate",
- "itoa",
- "pin-project-lite",
- "socket2",
- "tokio",
- "tower-service",
- "tracing",
- "want",
-]
-
-[[package]]
-name = "hyper"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
+checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0"
dependencies = [
"bytes",
"futures-channel",
"futures-util",
- "h2 0.4.10",
- "http 1.3.1",
- "http-body 1.0.1",
+ "h2",
+ "http",
+ "http-body",
"httparse",
- "itoa",
+ "itoa 1.0.14",
"pin-project-lite",
"smallvec",
"tokio",
@@ -2373,20 +1836,19 @@ dependencies = [
[[package]]
name = "hyper-rustls"
-version = "0.27.6"
+version = "0.27.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d"
+checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2"
dependencies = [
- "http 1.3.1",
- "hyper 1.6.0",
+ "futures-util",
+ "http",
+ "hyper",
"hyper-util",
"rustls",
- "rustls-native-certs",
"rustls-pki-types",
"tokio",
"tokio-rustls",
"tower-service",
- "webpki-roots",
]
[[package]]
@@ -2397,7 +1859,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
dependencies = [
"bytes",
"http-body-util",
- "hyper 1.6.0",
+ "hyper",
"hyper-util",
"native-tls",
"tokio",
@@ -2407,21 +1869,16 @@ dependencies = [
[[package]]
name = "hyper-util"
-version = "0.1.13"
+version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8"
+checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4"
dependencies = [
- "base64 0.22.1",
"bytes",
"futures-channel",
- "futures-core",
"futures-util",
- "http 1.3.1",
- "http-body 1.0.1",
- "hyper 1.6.0",
- "ipnet",
- "libc",
- "percent-encoding",
+ "http",
+ "http-body",
+ "hyper",
"pin-project-lite",
"socket2",
"tokio",
@@ -2431,17 +1888,16 @@ dependencies = [
[[package]]
name = "iana-time-zone"
-version = "0.1.63"
+version = "0.1.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
- "log",
"wasm-bindgen",
- "windows-core",
+ "windows-core 0.52.0",
]
[[package]]
@@ -2455,9 +1911,9 @@ dependencies = [
[[package]]
name = "ico"
-version = "0.4.0"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98"
+checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae"
dependencies = [
"byteorder",
"png",
@@ -2465,22 +1921,21 @@ dependencies = [
[[package]]
name = "icu_collections"
-version = "2.0.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
+checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
dependencies = [
"displaydoc",
- "potential_utf",
"yoke",
"zerofrom",
"zerovec",
]
[[package]]
-name = "icu_locale_core"
-version = "2.0.0"
+name = "icu_locid"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
+checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
dependencies = [
"displaydoc",
"litemap",
@@ -2490,10 +1945,30 @@ dependencies = [
]
[[package]]
-name = "icu_normalizer"
-version = "2.0.0"
+name = "icu_locid_transform"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
+checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
+dependencies = [
+ "displaydoc",
+ "icu_locid",
+ "icu_locid_transform_data",
+ "icu_provider",
+ "tinystr",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locid_transform_data"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
+
+[[package]]
+name = "icu_normalizer"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
dependencies = [
"displaydoc",
"icu_collections",
@@ -2501,54 +1976,67 @@ dependencies = [
"icu_properties",
"icu_provider",
"smallvec",
+ "utf16_iter",
+ "utf8_iter",
+ "write16",
"zerovec",
]
[[package]]
name = "icu_normalizer_data"
-version = "2.0.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
+checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
[[package]]
name = "icu_properties"
-version = "2.0.1"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
+checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
dependencies = [
"displaydoc",
"icu_collections",
- "icu_locale_core",
+ "icu_locid_transform",
"icu_properties_data",
"icu_provider",
- "potential_utf",
- "zerotrie",
+ "tinystr",
"zerovec",
]
[[package]]
name = "icu_properties_data"
-version = "2.0.1"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
+checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
[[package]]
name = "icu_provider"
-version = "2.0.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
+checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
dependencies = [
"displaydoc",
- "icu_locale_core",
+ "icu_locid",
+ "icu_provider_macros",
"stable_deref_trait",
"tinystr",
"writeable",
"yoke",
"zerofrom",
- "zerotrie",
"zerovec",
]
+[[package]]
+name = "icu_provider_macros"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.91",
+]
+
[[package]]
name = "ident_case"
version = "1.0.1"
@@ -2568,9 +2056,9 @@ dependencies = [
[[package]]
name = "idna_adapter"
-version = "1.2.1"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
+checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
dependencies = [
"icu_normalizer",
"icu_properties",
@@ -2589,24 +2077,44 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.9.0"
+version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
+checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
dependencies = [
"equivalent",
- "hashbrown 0.15.3",
+ "hashbrown 0.15.2",
"serde",
]
[[package]]
name = "infer"
-version = "0.19.0"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7"
+checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847"
dependencies = [
"cfb",
]
+[[package]]
+name = "inotify"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3"
+dependencies = [
+ "bitflags 2.6.0",
+ "inotify-sys",
+ "libc",
+]
+
+[[package]]
+name = "inotify-sys"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb"
+dependencies = [
+ "libc",
+]
+
[[package]]
name = "instant"
version = "0.1.13"
@@ -2617,20 +2125,20 @@ dependencies = [
]
[[package]]
-name = "ipnet"
-version = "2.11.0"
+name = "io-kit-sys"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
+checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b"
+dependencies = [
+ "core-foundation-sys",
+ "mach2",
+]
[[package]]
-name = "iri-string"
-version = "0.7.8"
+name = "ipnet"
+version = "2.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
-dependencies = [
- "memchr",
- "serde",
-]
+checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708"
[[package]]
name = "is-docker"
@@ -2653,9 +2161,15 @@ dependencies = [
[[package]]
name = "itoa"
-version = "1.0.15"
+version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
+
+[[package]]
+name = "itoa"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "javascriptcore-rs"
@@ -2702,21 +2216,11 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
-[[package]]
-name = "jobserver"
-version = "0.1.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a"
-dependencies = [
- "getrandom 0.3.3",
- "libc",
-]
-
[[package]]
name = "js-sys"
-version = "0.3.77"
+version = "0.3.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -2750,41 +2254,24 @@ version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.6.0",
"serde",
"unicode-segmentation",
]
-[[package]]
-name = "known-folders"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7d9a1740cc8b46e259a0eb787d79d855e79ff10b9855a5eba58868d5da7927c"
-dependencies = [
- "windows-sys 0.59.0",
-]
-
[[package]]
name = "kuchikiki"
-version = "0.8.8-speedreader"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2"
+checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8"
dependencies = [
"cssparser",
"html5ever",
- "indexmap 2.9.0",
+ "indexmap 1.9.3",
+ "matches",
"selectors",
]
-[[package]]
-name = "kv-log-macro"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
-dependencies = [
- "log",
-]
-
[[package]]
name = "lazy_static"
version = "1.5.0"
@@ -2811,15 +2298,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf"
dependencies = [
"gtk-sys",
- "libloading",
+ "libloading 0.7.4",
"once_cell",
]
[[package]]
name = "libc"
-version = "0.2.174"
+version = "0.2.169"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
+checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
[[package]]
name = "libloading"
@@ -2832,10 +2319,14 @@ dependencies = [
]
[[package]]
-name = "libm"
-version = "0.2.15"
+name = "libloading"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
+checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
+dependencies = [
+ "cfg-if",
+ "windows-targets 0.52.6",
+]
[[package]]
name = "libredox"
@@ -2843,28 +2334,31 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.6.0",
"libc",
- "redox_syscall 0.5.12",
+]
+
+[[package]]
+name = "libudev-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324"
+dependencies = [
+ "libc",
+ "pkg-config",
]
[[package]]
name = "linux-raw-sys"
-version = "0.4.15"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]]
name = "litemap"
-version = "0.8.0"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
+checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
[[package]]
name = "lock_api"
@@ -2878,12 +2372,11 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.27"
+version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
dependencies = [
"serde",
- "value-bag",
]
[[package]]
@@ -2908,7 +2401,7 @@ dependencies = [
"log",
"log-mdc",
"once_cell",
- "parking_lot 0.12.3",
+ "parking_lot",
"rand 0.8.5",
"serde",
"serde-value",
@@ -2920,12 +2413,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "lru-slab"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
-
[[package]]
name = "mac"
version = "0.1.1"
@@ -2933,39 +2420,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
[[package]]
-name = "mach"
-version = "0.3.2"
+name = "mach2"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa"
+checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "malloc_buf"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
dependencies = [
"libc",
]
[[package]]
name = "markup5ever"
-version = "0.14.1"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18"
+checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016"
dependencies = [
"log",
- "phf 0.11.3",
- "phf_codegen 0.11.3",
+ "phf 0.10.1",
+ "phf_codegen 0.10.0",
"string_cache",
"string_cache_codegen",
"tendril",
]
-[[package]]
-name = "match_token"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.101",
-]
-
[[package]]
name = "matches"
version = "0.1.10"
@@ -2984,25 +2469,6 @@ version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
-[[package]]
-name = "memmap"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
-dependencies = [
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "memmap2"
-version = "0.5.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327"
-dependencies = [
- "libc",
-]
-
[[package]]
name = "memoffset"
version = "0.9.1"
@@ -3012,56 +2478,17 @@ dependencies = [
"autocfg",
]
-[[package]]
-name = "miette"
-version = "5.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e"
-dependencies = [
- "miette-derive",
- "once_cell",
- "thiserror 1.0.69",
- "unicode-width",
-]
-
-[[package]]
-name = "miette-derive"
-version = "5.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.101",
-]
-
[[package]]
name = "mime"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
-[[package]]
-name = "mime_guess"
-version = "2.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
-dependencies = [
- "mime",
- "unicase",
-]
-
-[[package]]
-name = "minimal-lexical"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-
[[package]]
name = "miniz_oxide"
-version = "0.8.8"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a"
+checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394"
dependencies = [
"adler2",
"simd-adler32",
@@ -3069,41 +2496,40 @@ dependencies = [
[[package]]
name = "mio"
-version = "1.0.4"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
+checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
dependencies = [
"libc",
"wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
]
[[package]]
name = "muda"
-version = "0.17.0"
+version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988"
+checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484"
dependencies = [
"crossbeam-channel",
"dpi",
"gtk",
"keyboard-types",
- "objc2 0.6.1",
+ "objc2",
"objc2-app-kit",
- "objc2-core-foundation",
- "objc2-foundation 0.3.1",
+ "objc2-foundation",
"once_cell",
"png",
"serde",
- "thiserror 2.0.12",
+ "thiserror 1.0.69",
"windows-sys 0.59.0",
]
[[package]]
name = "native-tls"
-version = "0.2.14"
+version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
+checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
dependencies = [
"libc",
"log",
@@ -3111,45 +2537,18 @@ dependencies = [
"openssl-probe",
"openssl-sys",
"schannel",
- "security-framework 2.11.1",
+ "security-framework",
"security-framework-sys",
"tempfile",
]
-[[package]]
-name = "native_model"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7050d759e3da6673361dddda4f4a743492279dd2c6484a21fbee0a8278620df0"
-dependencies = [
- "anyhow",
- "bincode",
- "doc-comment",
- "native_model_macro",
- "rmp-serde",
- "serde",
- "thiserror 2.0.12",
- "zerocopy",
-]
-
-[[package]]
-name = "native_model_macro"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1577a0bebf5ed1754e240baf5d9b1845f51e598b20600aa894f55e11cd20cc6c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.101",
-]
-
[[package]]
name = "ndk"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.6.0",
"jni-sys",
"log",
"ndk-sys",
@@ -3181,15 +2580,26 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
[[package]]
name = "nix"
-version = "0.30.1"
+version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
+checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.6.0",
+ "cfg-if",
+ "libc",
+ "memoffset",
+]
+
+[[package]]
+name = "nix"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
+dependencies = [
+ "bitflags 2.6.0",
"cfg-if",
"cfg_aliases",
"libc",
- "memoffset",
]
[[package]]
@@ -3198,50 +2608,12 @@ version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
-[[package]]
-name = "nom"
-version = "7.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
-dependencies = [
- "memchr",
- "minimal-lexical",
-]
-
-[[package]]
-name = "ntapi"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4"
-dependencies = [
- "winapi",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
-dependencies = [
- "num-integer",
- "num-traits",
-]
-
[[package]]
name = "num-conv"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
-[[package]]
-name = "num-integer"
-version = "0.1.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits",
-]
-
[[package]]
name = "num-traits"
version = "0.2.19"
@@ -3266,10 +2638,19 @@ version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
dependencies = [
- "proc-macro-crate 3.3.0",
+ "proc-macro-crate 2.0.2",
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
+]
+
+[[package]]
+name = "objc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+dependencies = [
+ "malloc_buf",
]
[[package]]
@@ -3277,6 +2658,9 @@ name = "objc-sys"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
+dependencies = [
+ "cc",
+]
[[package]]
name = "objc2"
@@ -3288,105 +2672,87 @@ dependencies = [
"objc2-encode",
]
-[[package]]
-name = "objc2"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551"
-dependencies = [
- "objc2-encode",
- "objc2-exception-helper",
-]
-
[[package]]
name = "objc2-app-kit"
-version = "0.3.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc"
+checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
dependencies = [
- "bitflags 2.9.1",
- "block2 0.6.1",
+ "bitflags 2.6.0",
+ "block2",
"libc",
- "objc2 0.6.1",
- "objc2-cloud-kit",
+ "objc2",
"objc2-core-data",
- "objc2-core-foundation",
- "objc2-core-graphics",
"objc2-core-image",
- "objc2-foundation 0.3.1",
- "objc2-quartz-core 0.3.1",
+ "objc2-foundation",
+ "objc2-quartz-core",
]
[[package]]
name = "objc2-cloud-kit"
-version = "0.3.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d"
+checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009"
dependencies = [
- "bitflags 2.9.1",
- "objc2 0.6.1",
- "objc2-foundation 0.3.1",
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-core-location",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-contacts"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889"
+dependencies = [
+ "block2",
+ "objc2",
+ "objc2-foundation",
]
[[package]]
name = "objc2-core-data"
-version = "0.3.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d"
+checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
dependencies = [
- "bitflags 2.9.1",
- "objc2 0.6.1",
- "objc2-foundation 0.3.1",
-]
-
-[[package]]
-name = "objc2-core-foundation"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166"
-dependencies = [
- "bitflags 2.9.1",
- "dispatch2 0.3.0",
- "objc2 0.6.1",
-]
-
-[[package]]
-name = "objc2-core-graphics"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4"
-dependencies = [
- "bitflags 2.9.1",
- "dispatch2 0.3.0",
- "objc2 0.6.1",
- "objc2-core-foundation",
- "objc2-io-surface",
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-foundation",
]
[[package]]
name = "objc2-core-image"
-version = "0.3.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e"
+checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
dependencies = [
- "objc2 0.6.1",
- "objc2-foundation 0.3.1",
+ "block2",
+ "objc2",
+ "objc2-foundation",
+ "objc2-metal",
+]
+
+[[package]]
+name = "objc2-core-location"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781"
+dependencies = [
+ "block2",
+ "objc2",
+ "objc2-contacts",
+ "objc2-foundation",
]
[[package]]
name = "objc2-encode"
-version = "4.1.0"
+version = "4.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
-
-[[package]]
-name = "objc2-exception-helper"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a"
-dependencies = [
- "cc",
-]
+checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8"
[[package]]
name = "objc2-foundation"
@@ -3394,44 +2760,23 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
dependencies = [
- "bitflags 2.9.1",
- "block2 0.5.1",
+ "bitflags 2.6.0",
+ "block2",
+ "dispatch",
"libc",
- "objc2 0.5.2",
+ "objc2",
]
[[package]]
-name = "objc2-foundation"
-version = "0.3.1"
+name = "objc2-link-presentation"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c"
+checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398"
dependencies = [
- "bitflags 2.9.1",
- "block2 0.6.1",
- "libc",
- "objc2 0.6.1",
- "objc2-core-foundation",
-]
-
-[[package]]
-name = "objc2-io-kit"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a"
-dependencies = [
- "libc",
- "objc2-core-foundation",
-]
-
-[[package]]
-name = "objc2-io-surface"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c"
-dependencies = [
- "bitflags 2.9.1",
- "objc2 0.6.1",
- "objc2-core-foundation",
+ "block2",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
]
[[package]]
@@ -3440,10 +2785,10 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
dependencies = [
- "bitflags 2.9.1",
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-foundation 0.2.2",
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-foundation",
]
[[package]]
@@ -3452,48 +2797,79 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
dependencies = [
- "bitflags 2.9.1",
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-foundation 0.2.2",
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-foundation",
"objc2-metal",
]
[[package]]
-name = "objc2-quartz-core"
-version = "0.3.1"
+name = "objc2-symbols"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5"
+checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc"
dependencies = [
- "bitflags 2.9.1",
- "objc2 0.6.1",
- "objc2-foundation 0.3.1",
+ "objc2",
+ "objc2-foundation",
]
[[package]]
name = "objc2-ui-kit"
-version = "0.3.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed"
+checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f"
dependencies = [
- "bitflags 2.9.1",
- "objc2 0.6.1",
- "objc2-core-foundation",
- "objc2-foundation 0.3.1",
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-cloud-kit",
+ "objc2-core-data",
+ "objc2-core-image",
+ "objc2-core-location",
+ "objc2-foundation",
+ "objc2-link-presentation",
+ "objc2-quartz-core",
+ "objc2-symbols",
+ "objc2-uniform-type-identifiers",
+ "objc2-user-notifications",
+]
+
+[[package]]
+name = "objc2-uniform-type-identifiers"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe"
+dependencies = [
+ "block2",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-user-notifications"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3"
+dependencies = [
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-core-location",
+ "objc2-foundation",
]
[[package]]
name = "objc2-web-kit"
-version = "0.3.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad"
+checksum = "68bc69301064cebefc6c4c90ce9cba69225239e4b8ff99d445a2b5563797da65"
dependencies = [
- "bitflags 2.9.1",
- "block2 0.6.1",
- "objc2 0.6.1",
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
"objc2-app-kit",
- "objc2-core-foundation",
- "objc2-foundation 0.3.1",
+ "objc2-foundation",
]
[[package]]
@@ -3505,49 +2881,18 @@ dependencies = [
"memchr",
]
-[[package]]
-name = "oid-registry"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9"
-dependencies = [
- "asn1-rs 0.6.2",
-]
-
-[[package]]
-name = "oid-registry"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7"
-dependencies = [
- "asn1-rs 0.7.1",
-]
-
[[package]]
name = "once_cell"
-version = "1.21.3"
+version = "1.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
-
-[[package]]
-name = "opaque-debug"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
-
-[[package]]
-name = "opaque-debug"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
+checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
[[package]]
name = "open"
-version = "5.3.2"
+version = "5.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95"
+checksum = "3ecd52f0b8d15c40ce4820aa251ed5de032e5d91fab27f7db2f40d42a8bdf69c"
dependencies = [
- "dunce",
"is-wsl",
"libc",
"pathdiff",
@@ -3555,11 +2900,11 @@ dependencies = [
[[package]]
name = "openssl"
-version = "0.10.73"
+version = "0.10.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8"
+checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.6.0",
"cfg-if",
"foreign-types 0.3.2",
"libc",
@@ -3576,23 +2921,33 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "openssl-probe"
-version = "0.1.6"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-src"
+version = "300.4.1+3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c"
+dependencies = [
+ "cc",
+]
[[package]]
name = "openssl-sys"
-version = "0.9.109"
+version = "0.9.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
+checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741"
dependencies = [
"cc",
"libc",
+ "openssl-src",
"pkg-config",
"vcpkg",
]
@@ -3634,9 +2989,9 @@ dependencies = [
[[package]]
name = "os_info"
-version = "3.11.0"
+version = "3.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41fc863e2ca13dc2d5c34fb22ea4a588248ac14db929616ba65c45f21744b1e9"
+checksum = "eb6651f4be5e39563c4fe5cc8326349eb99a25d805a3493f791d5bfd0269e430"
dependencies = [
"log",
"serde",
@@ -3645,24 +3000,14 @@ dependencies = [
[[package]]
name = "os_pipe"
-version = "1.2.2"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db335f4760b14ead6290116f2427bf33a14d4f0617d49f78a246de10c1831224"
+checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982"
dependencies = [
"libc",
"windows-sys 0.59.0",
]
-[[package]]
-name = "page_size"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da"
-dependencies = [
- "libc",
- "winapi",
-]
-
[[package]]
name = "pango"
version = "0.18.3"
@@ -3694,17 +3039,6 @@ version = "2.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
-[[package]]
-name = "parking_lot"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
-dependencies = [
- "instant",
- "lock_api",
- "parking_lot_core 0.8.6",
-]
-
[[package]]
name = "parking_lot"
version = "0.12.3"
@@ -3712,21 +3046,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
dependencies = [
"lock_api",
- "parking_lot_core 0.9.10",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
-dependencies = [
- "cfg-if",
- "instant",
- "libc",
- "redox_syscall 0.2.16",
- "smallvec",
- "winapi",
+ "parking_lot_core",
]
[[package]]
@@ -3737,33 +3057,17 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall 0.5.12",
+ "redox_syscall",
"smallvec",
"windows-targets 0.52.6",
]
-[[package]]
-name = "paste"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
-
[[package]]
name = "pathdiff"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
-[[package]]
-name = "pem"
-version = "3.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3"
-dependencies = [
- "base64 0.22.1",
- "serde",
-]
-
[[package]]
name = "percent-encoding"
version = "2.3.1"
@@ -3776,7 +3080,9 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
dependencies = [
+ "phf_macros 0.8.0",
"phf_shared 0.8.0",
+ "proc-macro-hack",
]
[[package]]
@@ -3785,19 +3091,17 @@ version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
dependencies = [
- "phf_macros 0.10.0",
"phf_shared 0.10.0",
- "proc-macro-hack",
]
[[package]]
name = "phf"
-version = "0.11.3"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
+checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
dependencies = [
- "phf_macros 0.11.3",
- "phf_shared 0.11.3",
+ "phf_macros 0.11.2",
+ "phf_shared 0.11.2",
]
[[package]]
@@ -3812,12 +3116,12 @@ dependencies = [
[[package]]
name = "phf_codegen"
-version = "0.11.3"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
+checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
dependencies = [
- "phf_generator 0.11.3",
- "phf_shared 0.11.3",
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
]
[[package]]
@@ -3842,22 +3146,22 @@ dependencies = [
[[package]]
name = "phf_generator"
-version = "0.11.3"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
+checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
dependencies = [
- "phf_shared 0.11.3",
+ "phf_shared 0.11.2",
"rand 0.8.5",
]
[[package]]
name = "phf_macros"
-version = "0.10.0"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0"
+checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
dependencies = [
- "phf_generator 0.10.0",
- "phf_shared 0.10.0",
+ "phf_generator 0.8.0",
+ "phf_shared 0.8.0",
"proc-macro-hack",
"proc-macro2",
"quote",
@@ -3866,15 +3170,15 @@ dependencies = [
[[package]]
name = "phf_macros"
-version = "0.11.3"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216"
+checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
dependencies = [
- "phf_generator 0.11.3",
- "phf_shared 0.11.3",
+ "phf_generator 0.11.2",
+ "phf_shared 0.11.2",
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -3883,7 +3187,7 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
dependencies = [
- "siphasher 0.3.11",
+ "siphasher",
]
[[package]]
@@ -3892,23 +3196,23 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
dependencies = [
- "siphasher 0.3.11",
+ "siphasher",
]
[[package]]
name = "phf_shared"
-version = "0.11.3"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
+checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
dependencies = [
- "siphasher 1.0.1",
+ "siphasher",
]
[[package]]
name = "pin-project-lite"
-version = "0.2.16"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
+checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff"
[[package]]
name = "pin-utils"
@@ -3929,19 +3233,19 @@ dependencies = [
[[package]]
name = "pkg-config"
-version = "0.3.32"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
[[package]]
name = "plist"
-version = "1.7.1"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eac26e981c03a6e53e0aee43c113e3202f5581d5360dae7bd2c70e800dd0451d"
+checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
dependencies = [
"base64 0.22.1",
- "indexmap 2.9.0",
- "quick-xml",
+ "indexmap 2.7.0",
+ "quick-xml 0.32.0",
"serde",
"time",
]
@@ -3961,28 +3265,19 @@ dependencies = [
[[package]]
name = "polling"
-version = "3.8.0"
+version = "3.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50"
+checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f"
dependencies = [
"cfg-if",
"concurrent-queue",
"hermit-abi",
"pin-project-lite",
- "rustix 1.0.7",
+ "rustix",
"tracing",
"windows-sys 0.59.0",
]
-[[package]]
-name = "potential_utf"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585"
-dependencies = [
- "zerovec",
-]
-
[[package]]
name = "powerfmt"
version = "0.2.0"
@@ -3991,9 +3286,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
-version = "0.2.21"
+version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
dependencies = [
"zerocopy",
]
@@ -4016,20 +3311,12 @@ dependencies = [
[[package]]
name = "proc-macro-crate"
-version = "2.0.0"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8"
+checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24"
dependencies = [
- "toml_edit 0.20.7",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "3.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35"
-dependencies = [
- "toml_edit 0.22.26",
+ "toml_datetime",
+ "toml_edit 0.20.2",
]
[[package]]
@@ -4064,9 +3351,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]]
name = "proc-macro2"
-version = "1.0.95"
+version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
dependencies = [
"unicode-ident",
]
@@ -4081,75 +3368,23 @@ dependencies = [
]
[[package]]
-name = "quinn"
-version = "0.11.8"
+name = "quick-xml"
+version = "0.36.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8"
+checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe"
dependencies = [
- "bytes",
- "cfg_aliases",
- "pin-project-lite",
- "quinn-proto",
- "quinn-udp",
- "rustc-hash",
- "rustls",
- "socket2",
- "thiserror 2.0.12",
- "tokio",
- "tracing",
- "web-time",
-]
-
-[[package]]
-name = "quinn-proto"
-version = "0.11.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e"
-dependencies = [
- "bytes",
- "getrandom 0.3.3",
- "lru-slab",
- "rand 0.9.1",
- "ring",
- "rustc-hash",
- "rustls",
- "rustls-pki-types",
- "slab",
- "thiserror 2.0.12",
- "tinyvec",
- "tracing",
- "web-time",
-]
-
-[[package]]
-name = "quinn-udp"
-version = "0.5.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842"
-dependencies = [
- "cfg_aliases",
- "libc",
- "once_cell",
- "socket2",
- "tracing",
- "windows-sys 0.59.0",
+ "memchr",
]
[[package]]
name = "quote"
-version = "1.0.40"
+version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
dependencies = [
"proc-macro2",
]
-[[package]]
-name = "r-efi"
-version = "5.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
-
[[package]]
name = "rand"
version = "0.7.3"
@@ -4175,16 +3410,6 @@ dependencies = [
"rand_core 0.6.4",
]
-[[package]]
-name = "rand"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
-dependencies = [
- "rand_chacha 0.9.0",
- "rand_core 0.9.3",
-]
-
[[package]]
name = "rand_chacha"
version = "0.2.2"
@@ -4205,16 +3430,6 @@ dependencies = [
"rand_core 0.6.4",
]
-[[package]]
-name = "rand_chacha"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.9.3",
-]
-
[[package]]
name = "rand_core"
version = "0.5.1"
@@ -4230,16 +3445,7 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
- "getrandom 0.2.16",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
-dependencies = [
- "getrandom 0.3.3",
+ "getrandom 0.2.15",
]
[[package]]
@@ -4286,36 +3492,13 @@ dependencies = [
"crossbeam-utils",
]
-[[package]]
-name = "rcgen"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2"
-dependencies = [
- "pem",
- "ring",
- "rustls-pki-types",
- "time",
- "x509-parser 0.16.0",
- "yasna",
-]
-
[[package]]
name = "redox_syscall"
-version = "0.2.16"
+version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.5.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
-dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.6.0",
]
[[package]]
@@ -4324,34 +3507,11 @@ version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
dependencies = [
- "getrandom 0.2.16",
+ "getrandom 0.2.15",
"libredox",
"thiserror 1.0.69",
]
-[[package]]
-name = "redox_users"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b"
-dependencies = [
- "getrandom 0.2.16",
- "libredox",
- "thiserror 2.0.12",
-]
-
-[[package]]
-name = "reflink-copy"
-version = "0.1.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78c81d000a2c524133cc00d2f92f019d399e57906c3b7119271a2495354fe895"
-dependencies = [
- "cfg-if",
- "libc",
- "rustix 1.0.7",
- "windows",
-]
-
[[package]]
name = "regex"
version = "1.11.1"
@@ -4383,218 +3543,88 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "reqwest"
-version = "0.11.27"
+version = "0.12.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
+checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f"
dependencies = [
- "base64 0.21.7",
+ "base64 0.22.1",
"bytes",
"encoding_rs",
+ "futures-channel",
"futures-core",
"futures-util",
- "h2 0.3.26",
- "http 0.2.12",
- "http-body 0.4.6",
- "hyper 0.14.32",
+ "h2",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-rustls",
+ "hyper-tls",
+ "hyper-util",
"ipnet",
"js-sys",
"log",
"mime",
- "mime_guess",
+ "native-tls",
"once_cell",
"percent-encoding",
"pin-project-lite",
+ "rustls-pemfile",
"serde",
"serde_json",
"serde_urlencoded",
- "sync_wrapper 0.1.2",
+ "sync_wrapper",
"system-configuration",
"tokio",
- "tower-service",
- "url",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
- "winreg 0.50.0",
-]
-
-[[package]]
-name = "reqwest"
-version = "0.12.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531"
-dependencies = [
- "base64 0.22.1",
- "bytes",
- "futures-channel",
- "futures-core",
- "futures-util",
- "h2 0.4.10",
- "http 1.3.1",
- "http-body 1.0.1",
- "http-body-util",
- "hyper 1.6.0",
- "hyper-rustls",
- "hyper-tls",
- "hyper-util",
- "js-sys",
- "log",
- "native-tls",
- "percent-encoding",
- "pin-project-lite",
- "quinn",
- "rustls",
- "rustls-native-certs",
- "rustls-pki-types",
- "serde",
- "serde_json",
- "serde_urlencoded",
- "sync_wrapper 1.0.2",
- "tokio",
"tokio-native-tls",
- "tokio-rustls",
"tokio-util",
- "tower",
- "tower-http",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"wasm-streams",
"web-sys",
- "webpki-roots",
-]
-
-[[package]]
-name = "reqwest-middleware"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69539cea4148dce683bec9dc95be3f0397a9bb2c248a49c8296a9d21659a8cdd"
-dependencies = [
- "anyhow",
- "async-trait",
- "futures",
- "http 0.2.12",
- "reqwest 0.11.27",
- "serde",
- "task-local-extensions",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "reqwest-middleware"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e"
-dependencies = [
- "anyhow",
- "async-trait",
- "http 1.3.1",
- "reqwest 0.12.22",
- "serde",
- "thiserror 1.0.69",
- "tower-service",
-]
-
-[[package]]
-name = "reqwest-middleware-cache"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64dbc0a15e4d69f96e9b66ea5ff8102e2f4cce287bc26562363013d1c39d8f66"
-dependencies = [
- "anyhow",
- "async-trait",
- "bincode",
- "cacache 9.0.0",
- "http 0.2.12",
- "http-cache-semantics",
- "httpdate",
- "reqwest 0.11.27",
- "reqwest-middleware 0.1.6",
- "serde",
- "task-local-extensions",
- "url",
-]
-
-[[package]]
-name = "reqwest-websocket"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f91a811daaa8b54faeaec9d507a336897a3d243834a4965254a17d39da8b5c9"
-dependencies = [
- "async-tungstenite",
- "bytes",
- "futures-util",
- "reqwest 0.12.22",
- "thiserror 2.0.12",
- "tokio",
- "tokio-util",
- "tracing",
- "tungstenite",
- "web-sys",
+ "windows-registry 0.2.0",
]
[[package]]
name = "rfd"
-version = "0.15.3"
+version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80c844748fdc82aae252ee4594a89b6e7ebef1063de7951545564cbc4e57075d"
+checksum = "8af382a047821a08aa6bfc09ab0d80ff48d45d8726f7cd8e44891f7cb4a4278e"
dependencies = [
"ashpd",
- "block2 0.6.1",
- "dispatch2 0.2.0",
+ "block2",
"glib-sys",
"gobject-sys",
"gtk-sys",
"js-sys",
"log",
- "objc2 0.6.1",
+ "objc2",
"objc2-app-kit",
- "objc2-core-foundation",
- "objc2-foundation 0.3.1",
+ "objc2-foundation",
"raw-window-handle",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
- "windows-sys 0.59.0",
+ "windows-sys 0.48.0",
]
[[package]]
name = "ring"
-version = "0.17.14"
+version = "0.17.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
+checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
dependencies = [
"cc",
"cfg-if",
- "getrandom 0.2.16",
+ "getrandom 0.2.15",
"libc",
+ "spin",
"untrusted",
"windows-sys 0.52.0",
]
-[[package]]
-name = "rmp"
-version = "0.8.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4"
-dependencies = [
- "byteorder",
- "num-traits",
- "paste",
-]
-
-[[package]]
-name = "rmp-serde"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db"
-dependencies = [
- "byteorder",
- "rmp",
- "serde",
-]
-
[[package]]
name = "rust-ini"
version = "0.21.1"
@@ -4612,7 +3642,6 @@ version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "460d97902465327d69ecfe8cefdb5972c6f94d6127ac9e992acdb51458bebc27"
dependencies = [
- "anyhow",
"serde",
"tempfile",
"thiserror 1.0.69",
@@ -4624,12 +3653,6 @@ version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
-[[package]]
-name = "rustc-hash"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
-
[[package]]
name = "rustc_version"
version = "0.4.1"
@@ -4639,49 +3662,26 @@ dependencies = [
"semver",
]
-[[package]]
-name = "rusticata-macros"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632"
-dependencies = [
- "nom",
-]
-
[[package]]
name = "rustix"
-version = "0.38.44"
+version = "0.38.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
+checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.6.0",
"errno",
"libc",
- "linux-raw-sys 0.4.15",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "rustix"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266"
-dependencies = [
- "bitflags 2.9.1",
- "errno",
- "libc",
- "linux-raw-sys 0.9.4",
+ "linux-raw-sys",
"windows-sys 0.59.0",
]
[[package]]
name = "rustls"
-version = "0.23.27"
+version = "0.23.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321"
+checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b"
dependencies = [
"once_cell",
- "ring",
"rustls-pki-types",
"rustls-webpki",
"subtle",
@@ -4689,49 +3689,36 @@ dependencies = [
]
[[package]]
-name = "rustls-native-certs"
-version = "0.8.1"
+name = "rustls-pemfile"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3"
+checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
dependencies = [
- "openssl-probe",
"rustls-pki-types",
- "schannel",
- "security-framework 3.2.0",
]
[[package]]
name = "rustls-pki-types"
-version = "1.12.0"
+version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
-dependencies = [
- "web-time",
- "zeroize",
-]
+checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37"
[[package]]
name = "rustls-webpki"
-version = "0.103.3"
+version = "0.102.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435"
+checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
dependencies = [
"ring",
"rustls-pki-types",
"untrusted",
]
-[[package]]
-name = "rustversion"
-version = "1.0.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
-
[[package]]
name = "ryu"
-version = "1.0.20"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
[[package]]
name = "same-file"
@@ -4753,9 +3740,9 @@ dependencies = [
[[package]]
name = "schemars"
-version = "0.8.22"
+version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615"
+checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92"
dependencies = [
"dyn-clone",
"indexmap 1.9.3",
@@ -4768,16 +3755,22 @@ dependencies = [
[[package]]
name = "schemars_derive"
-version = "0.8.22"
+version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d"
+checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e"
dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
- "syn 2.0.101",
+ "syn 2.0.91",
]
+[[package]]
+name = "scoped-tls"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
+
[[package]]
name = "scopeguard"
version = "1.2.0"
@@ -4790,31 +3783,18 @@ version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.6.0",
"core-foundation 0.9.4",
"core-foundation-sys",
"libc",
"security-framework-sys",
]
-[[package]]
-name = "security-framework"
-version = "3.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316"
-dependencies = [
- "bitflags 2.9.1",
- "core-foundation 0.10.1",
- "core-foundation-sys",
- "libc",
- "security-framework-sys",
-]
-
[[package]]
name = "security-framework-sys"
-version = "2.14.0"
+version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
+checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5"
dependencies = [
"core-foundation-sys",
"libc",
@@ -4822,47 +3802,60 @@ dependencies = [
[[package]]
name = "selectors"
-version = "0.24.0"
+version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416"
+checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
dependencies = [
"bitflags 1.3.2",
"cssparser",
"derive_more",
"fxhash",
"log",
+ "matches",
"phf 0.8.0",
"phf_codegen 0.8.0",
"precomputed-hash",
"servo_arc",
"smallvec",
+ "thin-slice",
]
[[package]]
name = "semver"
-version = "1.0.26"
+version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
+checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba"
dependencies = [
"serde",
]
[[package]]
name = "serde"
-version = "1.0.219"
+version = "1.0.216"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
+checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e"
dependencies = [
"serde_derive",
]
[[package]]
-name = "serde-untagged"
-version = "0.1.7"
+name = "serde-binary"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e"
+checksum = "b550db407b83ed53a4f76f888bfd7441b685abc2c086e20fb47781a286940506"
dependencies = [
- "erased-serde 0.4.6",
+ "binary-stream",
+ "serde",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "serde-untagged"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6"
+dependencies = [
+ "erased-serde",
"serde",
"typeid",
]
@@ -4879,13 +3872,13 @@ dependencies = [
[[package]]
name = "serde_derive"
-version = "1.0.219"
+version = "1.0.216"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
+checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -4896,16 +3889,16 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "serde_json"
-version = "1.0.140"
+version = "1.0.134"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
+checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d"
dependencies = [
- "itoa",
+ "itoa 1.0.14",
"memchr",
"ryu",
"serde",
@@ -4913,13 +3906,13 @@ dependencies = [
[[package]]
name = "serde_repr"
-version = "0.1.20"
+version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
+checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -4938,22 +3931,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
dependencies = [
"form_urlencoded",
- "itoa",
+ "itoa 1.0.14",
"ryu",
"serde",
]
[[package]]
name = "serde_with"
-version = "3.12.0"
+version = "3.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa"
+checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817"
dependencies = [
"base64 0.22.1",
"chrono",
- "hex 0.4.3",
+ "hex",
"indexmap 1.9.3",
- "indexmap 2.9.0",
+ "indexmap 2.7.0",
"serde",
"serde_derive",
"serde_json",
@@ -4963,14 +3956,14 @@ dependencies = [
[[package]]
name = "serde_with_macros"
-version = "3.12.0"
+version = "3.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e"
+checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d"
dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -4979,8 +3972,8 @@ version = "0.9.34+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
dependencies = [
- "indexmap 2.9.0",
- "itoa",
+ "indexmap 2.7.0",
+ "itoa 1.0.14",
"ryu",
"serde",
"unsafe-libyaml",
@@ -5010,50 +4003,14 @@ dependencies = [
[[package]]
name = "servo_arc"
-version = "0.2.0"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741"
+checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432"
dependencies = [
"nodrop",
"stable_deref_trait",
]
-[[package]]
-name = "sha-1"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
-dependencies = [
- "block-buffer 0.7.3",
- "digest 0.8.1",
- "fake-simd",
- "opaque-debug 0.2.3",
-]
-
-[[package]]
-name = "sha-1"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug 0.3.1",
-]
-
-[[package]]
-name = "sha-1"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest 0.10.7",
-]
-
[[package]]
name = "sha1"
version = "0.10.6"
@@ -5062,50 +4019,25 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
dependencies = [
"cfg-if",
"cpufeatures",
- "digest 0.10.7",
+ "digest",
]
[[package]]
name = "sha2"
-version = "0.8.2"
+version = "0.10.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69"
-dependencies = [
- "block-buffer 0.7.3",
- "digest 0.8.1",
- "fake-simd",
- "opaque-debug 0.2.3",
-]
-
-[[package]]
-name = "sha2"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug 0.3.1",
-]
-
-[[package]]
-name = "sha2"
-version = "0.10.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
+checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
dependencies = [
"cfg-if",
"cpufeatures",
- "digest 0.10.7",
+ "digest",
]
[[package]]
name = "shared_child"
-version = "1.0.2"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e297bd52991bbe0686c086957bee142f13df85d1e79b0b21630a99d374ae9dc"
+checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c"
dependencies = [
"libc",
"windows-sys 0.59.0",
@@ -5119,9 +4051,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook-registry"
-version = "1.4.5"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410"
+checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
dependencies = [
"libc",
]
@@ -5138,12 +4070,6 @@ version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
-[[package]]
-name = "siphasher"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
-
[[package]]
name = "slab"
version = "0.4.9"
@@ -5153,28 +4079,17 @@ dependencies = [
"autocfg",
]
-[[package]]
-name = "slice-deque"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31ef6ee280cdefba6d2d0b4b78a84a1c1a3f3a4cec98c2d4231c8bc225de0f25"
-dependencies = [
- "libc",
- "mach",
- "winapi",
-]
-
[[package]]
name = "smallvec"
-version = "1.15.0"
+version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
[[package]]
name = "socket2"
-version = "0.5.10"
+version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678"
+checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -5192,11 +4107,11 @@ dependencies = [
"foreign-types 0.5.0",
"js-sys",
"log",
- "objc2 0.5.2",
- "objc2-foundation 0.2.2",
- "objc2-quartz-core 0.2.2",
+ "objc2",
+ "objc2-foundation",
+ "objc2-quartz-core",
"raw-window-handle",
- "redox_syscall 0.5.12",
+ "redox_syscall",
"wasm-bindgen",
"web-sys",
"windows-sys 0.59.0",
@@ -5229,36 +4144,10 @@ dependencies = [
]
[[package]]
-name = "ssri"
-version = "7.0.0"
+name = "spin"
+version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9cec0d388f39fbe79d7aa600e8d38053bf97b1bc8d350da7c0ba800d0f423f2"
-dependencies = [
- "base64 0.10.1",
- "digest 0.8.1",
- "hex 0.3.2",
- "serde",
- "sha-1 0.8.2",
- "sha2 0.8.2",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "ssri"
-version = "9.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da7a2b3c2bc9693bcb40870c4e9b5bf0d79f9cb46273321bf855ec513e919082"
-dependencies = [
- "base64 0.21.7",
- "digest 0.10.7",
- "hex 0.4.3",
- "miette",
- "serde",
- "sha-1 0.10.1",
- "sha2 0.10.9",
- "thiserror 1.0.69",
- "xxhash-rust",
-]
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
[[package]]
name = "stable_deref_trait"
@@ -5274,25 +4163,26 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "string_cache"
-version = "0.8.9"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f"
+checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
dependencies = [
"new_debug_unreachable",
- "parking_lot 0.12.3",
- "phf_shared 0.11.3",
+ "once_cell",
+ "parking_lot",
+ "phf_shared 0.10.0",
"precomputed-hash",
"serde",
]
[[package]]
name = "string_cache_codegen"
-version = "0.5.4"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0"
+checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
dependencies = [
- "phf_generator 0.11.3",
- "phf_shared 0.11.3",
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
"proc-macro2",
"quote",
]
@@ -5333,21 +4223,15 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.101"
+version = "2.0.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
+checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
-[[package]]
-name = "sync_wrapper"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
-
[[package]]
name = "sync_wrapper"
version = "1.0.2"
@@ -5359,13 +4243,13 @@ dependencies = [
[[package]]
name = "synstructure"
-version = "0.13.2"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
+checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -5377,36 +4261,22 @@ dependencies = [
"libc",
]
-[[package]]
-name = "sysinfo"
-version = "0.36.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d"
-dependencies = [
- "libc",
- "memchr",
- "ntapi",
- "objc2-core-foundation",
- "objc2-io-kit",
- "windows",
-]
-
[[package]]
name = "system-configuration"
-version = "0.5.1"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
+checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.6.0",
"core-foundation 0.9.4",
"system-configuration-sys",
]
[[package]]
name = "system-configuration-sys"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
+checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
dependencies = [
"core-foundation-sys",
"libc",
@@ -5421,18 +4291,19 @@ dependencies = [
"cfg-expr",
"heck 0.5.0",
"pkg-config",
- "toml",
+ "toml 0.8.2",
"version-compare",
]
[[package]]
name = "tao"
-version = "0.34.0"
+version = "0.30.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a"
+checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da"
dependencies = [
- "bitflags 2.9.1",
- "core-foundation 0.10.1",
+ "bitflags 2.6.0",
+ "cocoa",
+ "core-foundation 0.10.0",
"core-graphics",
"crossbeam-channel",
"dispatch",
@@ -5441,6 +4312,7 @@ dependencies = [
"gdkwayland-sys",
"gdkx11-sys",
"gtk",
+ "instant",
"jni",
"lazy_static",
"libc",
@@ -5448,18 +4320,16 @@ dependencies = [
"ndk",
"ndk-context",
"ndk-sys",
- "objc2 0.6.1",
- "objc2-app-kit",
- "objc2-foundation 0.3.1",
+ "objc",
"once_cell",
- "parking_lot 0.12.3",
+ "parking_lot",
"raw-window-handle",
"scopeguard",
"tao-macros",
"unicode-segmentation",
"url",
"windows",
- "windows-core",
+ "windows-core 0.58.0",
"windows-version",
"x11-dl",
]
@@ -5472,18 +4342,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
-]
-
-[[package]]
-name = "tar"
-version = "0.4.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a"
-dependencies = [
- "filetime",
- "libc",
- "xattr",
+ "syn 2.0.91",
]
[[package]]
@@ -5492,45 +4351,35 @@ version = "0.12.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
-[[package]]
-name = "task-local-extensions"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8"
-dependencies = [
- "pin-utils",
-]
-
[[package]]
name = "tauri"
-version = "2.7.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7"
+checksum = "e545de0a2dfe296fa67db208266cd397c5a55ae782da77973ef4c4fac90e9f2c"
dependencies = [
"anyhow",
"bytes",
- "dirs 6.0.0",
+ "dirs",
"dunce",
"embed_plist",
- "getrandom 0.3.3",
+ "futures-util",
+ "getrandom 0.2.15",
"glob",
"gtk",
"heck 0.5.0",
- "http 1.3.1",
- "http-range",
+ "http",
"jni",
"libc",
"log",
"mime",
"muda",
- "objc2 0.6.1",
+ "objc2",
"objc2-app-kit",
- "objc2-foundation 0.3.1",
- "objc2-ui-kit",
+ "objc2-foundation",
"percent-encoding",
"plist",
"raw-window-handle",
- "reqwest 0.12.22",
+ "reqwest",
"serde",
"serde_json",
"serde_repr",
@@ -5541,7 +4390,7 @@ dependencies = [
"tauri-runtime",
"tauri-runtime-wry",
"tauri-utils",
- "thiserror 2.0.12",
+ "thiserror 2.0.9",
"tokio",
"tray-icon",
"url",
@@ -5554,13 +4403,13 @@ dependencies = [
[[package]]
name = "tauri-build"
-version = "2.3.1"
+version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064"
+checksum = "7bd2a4bcfaf5fb9f4be72520eefcb61ae565038f8ccba2a497d8c28f463b8c01"
dependencies = [
"anyhow",
"cargo_toml",
- "dirs 6.0.0",
+ "dirs",
"glob",
"heck 0.5.0",
"json-patch",
@@ -5570,15 +4419,15 @@ dependencies = [
"serde_json",
"tauri-utils",
"tauri-winres",
- "toml",
+ "toml 0.8.2",
"walkdir",
]
[[package]]
name = "tauri-codegen"
-version = "2.3.1"
+version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a"
+checksum = "bf79faeecf301d3e969b1fae977039edb77a4c1f25cc0a961be298b54bff97cf"
dependencies = [
"base64 0.22.1",
"brotli",
@@ -5591,10 +4440,10 @@ dependencies = [
"semver",
"serde",
"serde_json",
- "sha2 0.10.9",
- "syn 2.0.101",
+ "sha2",
+ "syn 2.0.91",
"tauri-utils",
- "thiserror 2.0.12",
+ "thiserror 2.0.9",
"time",
"url",
"uuid",
@@ -5603,23 +4452,23 @@ dependencies = [
[[package]]
name = "tauri-macros"
-version = "2.3.2"
+version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e"
+checksum = "c52027c8c5afb83166dacddc092ee8fff50772f9646d461d8c33ee887e447a03"
dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
"tauri-codegen",
"tauri-utils",
]
[[package]]
name = "tauri-plugin"
-version = "2.3.0"
+version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d9a0bd00bf1930ad1a604d08b0eb6b2a9c1822686d65d7f4731a7723b8901d3"
+checksum = "e753f2a30933a9bbf0a202fa47d7cc4a3401f06e8d6dcc53b79aa62954828c79"
dependencies = [
"anyhow",
"glob",
@@ -5628,29 +4477,15 @@ dependencies = [
"serde",
"serde_json",
"tauri-utils",
- "toml",
+ "toml 0.8.2",
"walkdir",
]
-[[package]]
-name = "tauri-plugin-autostart"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c58593aafcb03892dbf9998b35a96ead3b8e597435c7af46aff1654d076d5d03"
-dependencies = [
- "auto-launch",
- "serde",
- "serde_json",
- "tauri",
- "tauri-plugin",
- "thiserror 2.0.12",
-]
-
[[package]]
name = "tauri-plugin-deep-link"
-version = "2.3.0"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4976ac728ebc0487515aa956cfdf200abcc52b784e441493fc544bc6ce369c8"
+checksum = "35d51ffd286073414d26353bcfc9e83e3cd63f96fa7f7a912f92f2118e5de5a6"
dependencies = [
"dunce",
"rust-ini",
@@ -5659,18 +4494,18 @@ dependencies = [
"tauri",
"tauri-plugin",
"tauri-utils",
- "thiserror 2.0.12",
+ "thiserror 2.0.9",
"tracing",
"url",
- "windows-registry",
+ "windows-registry 0.3.0",
"windows-result",
]
[[package]]
name = "tauri-plugin-dialog"
-version = "2.2.2"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a33318fe222fc2a612961de8b0419e2982767f213f54a4d3a21b0d7b85c41df8"
+checksum = "8b59fd750551b1066744ab956a1cd6b1ea3e1b3763b0b9153ac27a044d596426"
dependencies = [
"log",
"raw-window-handle",
@@ -5680,15 +4515,15 @@ dependencies = [
"tauri",
"tauri-plugin",
"tauri-plugin-fs",
- "thiserror 2.0.12",
+ "thiserror 2.0.9",
"url",
]
[[package]]
name = "tauri-plugin-fs"
-version = "2.3.0"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33ead0daec5d305adcefe05af9d970fc437bcc7996052d564e7393eb291252da"
+checksum = "a1a1edf18000f02903a7c2e5997fb89aca455ecbc0acc15c6535afbb883be223"
dependencies = [
"anyhow",
"dunce",
@@ -5701,38 +4536,32 @@ dependencies = [
"tauri",
"tauri-plugin",
"tauri-utils",
- "thiserror 2.0.12",
- "toml",
+ "thiserror 2.0.9",
+ "toml 0.8.2",
"url",
+ "uuid",
]
[[package]]
-name = "tauri-plugin-opener"
-version = "2.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321"
+name = "tauri-plugin-gamepad"
+version = "0.0.5"
+source = "git+https://github.com/quexeky/tauri-plugin-gamepad.git#92cafc0aae66a3de01c252ae2ed599b329b0c686"
dependencies = [
- "dunce",
- "glob",
- "objc2-app-kit",
- "objc2-foundation 0.3.1",
- "open",
- "schemars",
+ "enum-iterator",
+ "gilrs",
"serde",
"serde_json",
"tauri",
"tauri-plugin",
- "thiserror 2.0.12",
- "url",
- "windows",
- "zbus",
+ "thiserror 2.0.9",
+ "uuid",
]
[[package]]
name = "tauri-plugin-os"
-version = "2.2.1"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "424f19432397850c2ddd42aa58078630c15287bbce3866eb1d90e7dbee680637"
+checksum = "dda2d571a9baf0664c1f2088db227e3072f9028602fafa885deade7547c3b738"
dependencies = [
"gethostname",
"log",
@@ -5743,14 +4572,14 @@ dependencies = [
"sys-locale",
"tauri",
"tauri-plugin",
- "thiserror 2.0.12",
+ "thiserror 2.0.9",
]
[[package]]
name = "tauri-plugin-shell"
-version = "2.2.1"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69d5eb3368b959937ad2aeaf6ef9a8f5d11e01ffe03629d3530707bbcb27ff5d"
+checksum = "bb2c50a63e60fb8925956cc5b7569f4b750ac197a4d39f13b8dd46ea8e2bad79"
dependencies = [
"encoding_rs",
"log",
@@ -5763,21 +4592,21 @@ dependencies = [
"shared_child",
"tauri",
"tauri-plugin",
- "thiserror 2.0.12",
+ "thiserror 2.0.9",
"tokio",
]
[[package]]
name = "tauri-plugin-single-instance"
-version = "2.2.4"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97d0e07b40fb2eb13778e30778f5979347a2bf30e1b9d47f78ff7fe92d2e4b3d"
+checksum = "0f36019ee9832dc99e4450bb55a21cfad8633b19c2c18bd17c7741939b070ede"
dependencies = [
"serde",
"serde_json",
"tauri",
"tauri-plugin-deep-link",
- "thiserror 2.0.12",
+ "thiserror 2.0.9",
"tracing",
"windows-sys 0.59.0",
"zbus",
@@ -5785,40 +4614,36 @@ dependencies = [
[[package]]
name = "tauri-runtime"
-version = "2.7.1"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676"
+checksum = "cce18d43f80d4aba3aa8a0c953bbe835f3d0f2370aca75e8dbb14bd4bab27958"
dependencies = [
- "cookie",
"dpi",
"gtk",
- "http 1.3.1",
+ "http",
"jni",
- "objc2 0.6.1",
- "objc2-ui-kit",
"raw-window-handle",
"serde",
"serde_json",
"tauri-utils",
- "thiserror 2.0.12",
+ "thiserror 2.0.9",
"url",
"windows",
]
[[package]]
name = "tauri-runtime-wry"
-version = "2.7.2"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439"
+checksum = "9f442a38863e10129ffe2cec7bd09c2dcf8a098a3a27801a476a304d5bb991d2"
dependencies = [
"gtk",
- "http 1.3.1",
+ "http",
"jni",
"log",
- "objc2 0.6.1",
+ "objc2",
"objc2-app-kit",
- "objc2-foundation 0.3.1",
- "once_cell",
+ "objc2-foundation",
"percent-encoding",
"raw-window-handle",
"softbuffer",
@@ -5834,24 +4659,23 @@ dependencies = [
[[package]]
name = "tauri-utils"
-version = "2.6.0"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e"
+checksum = "9271a88f99b4adea0dc71d0baca4505475a0bbd139fb135f62958721aaa8fe54"
dependencies = [
- "anyhow",
"brotli",
"cargo_metadata",
"ctor",
"dunce",
"glob",
"html5ever",
- "http 1.3.1",
+ "http",
"infer",
"json-patch",
"kuchikiki",
"log",
"memchr",
- "phf 0.11.3",
+ "phf 0.11.2",
"proc-macro2",
"quote",
"regex",
@@ -5862,8 +4686,8 @@ dependencies = [
"serde_json",
"serde_with",
"swift-rs",
- "thiserror 2.0.12",
- "toml",
+ "thiserror 2.0.9",
+ "toml 0.8.2",
"url",
"urlpattern",
"uuid",
@@ -5872,25 +4696,24 @@ dependencies = [
[[package]]
name = "tauri-winres"
-version = "0.3.1"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4"
+checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb"
dependencies = [
"embed-resource",
- "indexmap 2.9.0",
- "toml",
+ "toml 0.7.8",
]
[[package]]
name = "tempfile"
-version = "3.20.0"
+version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
+checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c"
dependencies = [
+ "cfg-if",
"fastrand",
- "getrandom 0.3.3",
"once_cell",
- "rustix 1.0.7",
+ "rustix",
"windows-sys 0.59.0",
]
@@ -5905,6 +4728,12 @@ dependencies = [
"utf-8",
]
+[[package]]
+name = "thin-slice"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
+
[[package]]
name = "thiserror"
version = "1.0.69"
@@ -5916,11 +4745,11 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "2.0.12"
+version = "2.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
+checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc"
dependencies = [
- "thiserror-impl 2.0.12",
+ "thiserror-impl 2.0.9",
]
[[package]]
@@ -5931,18 +4760,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "thiserror-impl"
-version = "2.0.12"
+version = "2.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
+checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -5955,26 +4784,14 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "throttle_my_fn"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "482c185e5675626c9a130b3a8f362c322a239338c882f745a1d9a85838b987f0"
-dependencies = [
- "parking_lot 0.11.2",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
[[package]]
name = "time"
-version = "0.3.41"
+version = "0.3.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
+checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21"
dependencies = [
"deranged",
- "itoa",
+ "itoa 1.0.14",
"num-conv",
"powerfmt",
"serde",
@@ -5984,15 +4801,15 @@ dependencies = [
[[package]]
name = "time-core"
-version = "0.1.4"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
[[package]]
name = "time-macros"
-version = "0.2.22"
+version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49"
+checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de"
dependencies = [
"num-conv",
"time-core",
@@ -6009,34 +4826,19 @@ dependencies = [
[[package]]
name = "tinystr"
-version = "0.8.1"
+version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
+checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
dependencies = [
"displaydoc",
"zerovec",
]
-[[package]]
-name = "tinyvec"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-
[[package]]
name = "tokio"
-version = "1.45.1"
+version = "1.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779"
+checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551"
dependencies = [
"backtrace",
"bytes",
@@ -6052,13 +4854,13 @@ dependencies = [
[[package]]
name = "tokio-macros"
-version = "2.5.0"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
+checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -6073,9 +4875,9 @@ dependencies = [
[[package]]
name = "tokio-rustls"
-version = "0.26.2"
+version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
+checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37"
dependencies = [
"rustls",
"tokio",
@@ -6083,13 +4885,12 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.15"
+version = "0.7.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df"
+checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078"
dependencies = [
"bytes",
"futures-core",
- "futures-io",
"futures-sink",
"pin-project-lite",
"tokio",
@@ -6097,21 +4898,33 @@ dependencies = [
[[package]]
name = "toml"
-version = "0.8.22"
+version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae"
+checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
- "toml_edit 0.22.26",
+ "toml_edit 0.19.15",
+]
+
+[[package]]
+name = "toml"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit 0.20.2",
]
[[package]]
name = "toml_datetime"
-version = "0.6.9"
+version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3"
+checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
dependencies = [
"serde",
]
@@ -6122,81 +4935,26 @@ version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
- "indexmap 2.9.0",
- "toml_datetime",
- "winnow 0.5.40",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.20.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
-dependencies = [
- "indexmap 2.9.0",
- "toml_datetime",
- "winnow 0.5.40",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.22.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e"
-dependencies = [
- "indexmap 2.9.0",
+ "indexmap 2.7.0",
"serde",
"serde_spanned",
"toml_datetime",
- "toml_write",
- "winnow 0.7.10",
+ "winnow",
]
[[package]]
-name = "toml_write"
-version = "0.1.1"
+name = "toml_edit"
+version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076"
-
-[[package]]
-name = "tower"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
+checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
dependencies = [
- "futures-core",
- "futures-util",
- "pin-project-lite",
- "sync_wrapper 1.0.2",
- "tokio",
- "tower-layer",
- "tower-service",
+ "indexmap 2.7.0",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow",
]
-[[package]]
-name = "tower-http"
-version = "0.6.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
-dependencies = [
- "bitflags 2.9.1",
- "bytes",
- "futures-util",
- "http 1.3.1",
- "http-body 1.0.1",
- "iri-string",
- "pin-project-lite",
- "tower",
- "tower-layer",
- "tower-service",
-]
-
-[[package]]
-name = "tower-layer"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
-
[[package]]
name = "tower-service"
version = "0.3.3"
@@ -6222,7 +4980,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
@@ -6236,23 +4994,22 @@ dependencies = [
[[package]]
name = "tray-icon"
-version = "0.21.0"
+version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a"
+checksum = "d48a05076dd272615d03033bf04f480199f7d1b66a8ac64d75c625fc4a70c06b"
dependencies = [
+ "core-graphics",
"crossbeam-channel",
- "dirs 6.0.0",
+ "dirs",
"libappindicator",
"muda",
- "objc2 0.6.1",
+ "objc2",
"objc2-app-kit",
- "objc2-core-foundation",
- "objc2-core-graphics",
- "objc2-foundation 0.3.1",
+ "objc2-foundation",
"once_cell",
"png",
"serde",
- "thiserror 2.0.12",
+ "thiserror 1.0.69",
"windows-sys 0.59.0",
]
@@ -6268,28 +5025,11 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
-[[package]]
-name = "tungstenite"
-version = "0.26.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13"
-dependencies = [
- "bytes",
- "data-encoding",
- "http 1.3.1",
- "httparse",
- "log",
- "rand 0.9.1",
- "sha1",
- "thiserror 2.0.12",
- "utf-8",
-]
-
[[package]]
name = "typeid"
-version = "1.0.3"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
+checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e"
[[package]]
name = "typemap-ors"
@@ -6302,9 +5042,9 @@ dependencies = [
[[package]]
name = "typenum"
-version = "1.18.0"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "uds_windows"
@@ -6317,12 +5057,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "umu-wrapper-lib"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baa36636bef667cee9eb4f497c24279182b8b9f098fd04b0b8c5d2ebc4e451f1"
-
[[package]]
name = "unic-char-property"
version = "0.9.0"
@@ -6364,17 +5098,11 @@ dependencies = [
"unic-common",
]
-[[package]]
-name = "unicase"
-version = "2.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539"
-
[[package]]
name = "unicode-ident"
-version = "1.0.18"
+version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
+checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "unicode-segmentation"
@@ -6382,12 +5110,6 @@ version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
-[[package]]
-name = "unicode-width"
-version = "0.1.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
-
[[package]]
name = "unsafe-any-ors"
version = "1.0.0"
@@ -6445,6 +5167,12 @@ version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+[[package]]
+name = "utf16_iter"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
+
[[package]]
name = "utf8_iter"
version = "1.0.4"
@@ -6453,41 +5181,39 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
-version = "1.17.0"
+version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
+checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a"
dependencies = [
- "getrandom 0.3.3",
- "js-sys",
- "rand 0.9.1",
+ "getrandom 0.2.15",
+ "rand 0.8.5",
"serde",
"uuid-macro-internal",
- "wasm-bindgen",
]
[[package]]
name = "uuid-macro-internal"
-version = "1.17.0"
+version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b682e8c381995ea03130e381928e0e005b7c9eb483c6c8682f50e07b33c2b7"
+checksum = "6b91f57fe13a38d0ce9e28a03463d8d3c2468ed03d75375110ec71d93b449a08"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
-[[package]]
-name = "value-bag"
-version = "1.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5"
-
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
[[package]]
name = "version-compare"
version = "0.2.0"
@@ -6512,9 +5238,9 @@ dependencies = [
[[package]]
name = "vswhom-sys"
-version = "0.1.3"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150"
+checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18"
dependencies = [
"cc",
"libc",
@@ -6551,52 +5277,36 @@ version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
-[[package]]
-name = "wasi"
-version = "0.14.2+wasi-0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
-dependencies = [
- "wit-bindgen-rt",
-]
-
-[[package]]
-name = "wasite"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
-
[[package]]
name = "wasm-bindgen"
-version = "0.2.100"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396"
dependencies = [
"cfg-if",
"once_cell",
- "rustversion",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.100"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79"
dependencies = [
"bumpalo",
"log",
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.50"
+version = "0.4.49"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61"
+checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2"
dependencies = [
"cfg-if",
"js-sys",
@@ -6607,9 +5317,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.100"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -6617,25 +5327,22 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.100"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.100"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
-dependencies = [
- "unicode-ident",
-]
+checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
[[package]]
name = "wasm-streams"
@@ -6651,20 +5358,70 @@ dependencies = [
]
[[package]]
-name = "web-sys"
-version = "0.3.77"
+name = "wayland-backend"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
+checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6"
dependencies = [
- "js-sys",
- "wasm-bindgen",
+ "cc",
+ "downcast-rs",
+ "rustix",
+ "scoped-tls",
+ "smallvec",
+ "wayland-sys",
]
[[package]]
-name = "web-time"
-version = "1.1.0"
+name = "wayland-client"
+version = "0.31.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
+checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280"
+dependencies = [
+ "bitflags 2.6.0",
+ "rustix",
+ "wayland-backend",
+ "wayland-scanner",
+]
+
+[[package]]
+name = "wayland-protocols"
+version = "0.32.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e"
+dependencies = [
+ "bitflags 2.6.0",
+ "wayland-backend",
+ "wayland-client",
+ "wayland-scanner",
+]
+
+[[package]]
+name = "wayland-scanner"
+version = "0.31.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3"
+dependencies = [
+ "proc-macro2",
+ "quick-xml 0.36.2",
+ "quote",
+]
+
+[[package]]
+name = "wayland-sys"
+version = "0.31.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09"
+dependencies = [
+ "dlib",
+ "log",
+ "pkg-config",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.76"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -6672,17 +5429,18 @@ dependencies = [
[[package]]
name = "webbrowser"
-version = "1.0.4"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5df295f8451142f1856b1bd86a606dfe9587d439bc036e319c827700dbd555e"
+checksum = "ea9fe1ebb156110ff855242c1101df158b822487e4957b0556d9ffce9db0f535"
dependencies = [
- "core-foundation 0.10.1",
+ "block2",
+ "core-foundation 0.10.0",
"home",
"jni",
"log",
"ndk-context",
- "objc2 0.6.1",
- "objc2-foundation 0.3.1",
+ "objc2",
+ "objc2-foundation",
"url",
"web-sys",
]
@@ -6731,35 +5489,16 @@ dependencies = [
"system-deps",
]
-[[package]]
-name = "webpki"
-version = "0.22.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53"
-dependencies = [
- "ring",
- "untrusted",
-]
-
-[[package]]
-name = "webpki-roots"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb"
-dependencies = [
- "rustls-pki-types",
-]
-
[[package]]
name = "webview2-com"
-version = "0.38.0"
+version = "0.33.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4"
+checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c"
dependencies = [
"webview2-com-macros",
"webview2-com-sys",
"windows",
- "windows-core",
+ "windows-core 0.58.0",
"windows-implement",
"windows-interface",
]
@@ -6772,29 +5511,18 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "webview2-com-sys"
-version = "0.38.0"
+version = "0.33.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c"
+checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886"
dependencies = [
- "thiserror 2.0.12",
+ "thiserror 1.0.69",
"windows",
- "windows-core",
-]
-
-[[package]]
-name = "whoami"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7"
-dependencies = [
- "redox_syscall 0.5.12",
- "wasite",
- "web-sys",
+ "windows-core 0.58.0",
]
[[package]]
@@ -6830,14 +5558,13 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "window-vibrancy"
-version = "0.6.0"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c"
+checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150"
dependencies = [
- "objc2 0.6.1",
+ "objc2",
"objc2-app-kit",
- "objc2-core-foundation",
- "objc2-foundation 0.3.1",
+ "objc2-foundation",
"raw-window-handle",
"windows-sys 0.59.0",
"windows-version",
@@ -6845,115 +5572,106 @@ dependencies = [
[[package]]
name = "windows"
-version = "0.61.1"
+version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419"
+checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6"
dependencies = [
- "windows-collections",
- "windows-core",
- "windows-future",
- "windows-link",
- "windows-numerics",
-]
-
-[[package]]
-name = "windows-collections"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
-dependencies = [
- "windows-core",
+ "windows-core 0.58.0",
+ "windows-targets 0.52.6",
]
[[package]]
name = "windows-core"
-version = "0.61.2"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
- "windows-implement",
- "windows-interface",
- "windows-link",
- "windows-result",
- "windows-strings",
+ "windows-targets 0.52.6",
]
[[package]]
-name = "windows-future"
-version = "0.2.1"
+name = "windows-core"
+version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
+checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"
dependencies = [
- "windows-core",
- "windows-link",
- "windows-threading",
+ "windows-implement",
+ "windows-interface",
+ "windows-result",
+ "windows-strings 0.1.0",
+ "windows-targets 0.52.6",
]
[[package]]
name = "windows-implement"
-version = "0.60.0"
+version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
+checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "windows-interface"
-version = "0.59.1"
+version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
+checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
-]
-
-[[package]]
-name = "windows-link"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
-
-[[package]]
-name = "windows-numerics"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
-dependencies = [
- "windows-core",
- "windows-link",
+ "syn 2.0.91",
]
[[package]]
name = "windows-registry"
-version = "0.5.2"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820"
+checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
dependencies = [
- "windows-link",
"windows-result",
- "windows-strings",
+ "windows-strings 0.1.0",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-registry"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bafa604f2104cf5ae2cc2db1dee84b7e6a5d11b05f737b60def0ffdc398cbc0a"
+dependencies = [
+ "windows-result",
+ "windows-strings 0.2.0",
+ "windows-targets 0.52.6",
]
[[package]]
name = "windows-result"
-version = "0.3.4"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
+checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
dependencies = [
- "windows-link",
+ "windows-targets 0.52.6",
]
[[package]]
name = "windows-strings"
-version = "0.4.2"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
+checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
dependencies = [
- "windows-link",
+ "windows-result",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978d65aedf914c664c510d9de43c8fd85ca745eaff1ed53edf409b479e441663"
+dependencies = [
+ "windows-targets 0.52.6",
]
[[package]]
@@ -7038,22 +5756,13 @@ dependencies = [
"windows_x86_64_msvc 0.52.6",
]
-[[package]]
-name = "windows-threading"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
-dependencies = [
- "windows-link",
-]
-
[[package]]
name = "windows-version"
-version = "0.1.4"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c"
+checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515"
dependencies = [
- "windows-link",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -7197,34 +5906,6 @@ dependencies = [
"memchr",
]
-[[package]]
-name = "winnow"
-version = "0.7.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "winreg"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
-dependencies = [
- "winapi",
-]
-
-[[package]]
-name = "winreg"
-version = "0.50.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
-dependencies = [
- "cfg-if",
- "windows-sys 0.48.0",
-]
-
[[package]]
name = "winreg"
version = "0.52.0"
@@ -7236,28 +5917,25 @@ dependencies = [
]
[[package]]
-name = "wit-bindgen-rt"
-version = "0.39.0"
+name = "write16"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
-dependencies = [
- "bitflags 2.9.1",
-]
+checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
[[package]]
name = "writeable"
-version = "0.6.1"
+version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
+checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
[[package]]
name = "wry"
-version = "0.52.1"
+version = "0.47.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9"
+checksum = "61ce51277d65170f6379d8cda935c80e3c2d1f0ff712a123c8bddb11b31a4b73"
dependencies = [
"base64 0.22.1",
- "block2 0.6.1",
+ "block2",
"cookie",
"crossbeam-channel",
"dpi",
@@ -7265,31 +5943,30 @@ dependencies = [
"gdkx11",
"gtk",
"html5ever",
- "http 1.3.1",
+ "http",
"javascriptcore-rs",
"jni",
"kuchikiki",
"libc",
"ndk",
- "objc2 0.6.1",
+ "objc2",
"objc2-app-kit",
- "objc2-core-foundation",
- "objc2-foundation 0.3.1",
+ "objc2-foundation",
"objc2-ui-kit",
"objc2-web-kit",
"once_cell",
"percent-encoding",
"raw-window-handle",
- "sha2 0.10.9",
+ "sha2",
"soup3",
"tao-macros",
- "thiserror 2.0.12",
+ "thiserror 1.0.69",
"url",
"webkit2gtk",
"webkit2gtk-sys",
"webview2-com",
"windows",
- "windows-core",
+ "windows-core 0.58.0",
"windows-version",
"x11-dl",
]
@@ -7316,71 +5993,20 @@ dependencies = [
]
[[package]]
-name = "x509-parser"
-version = "0.16.0"
+name = "xdg-home"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69"
-dependencies = [
- "asn1-rs 0.6.2",
- "data-encoding",
- "der-parser 9.0.0",
- "lazy_static",
- "nom",
- "oid-registry 0.7.1",
- "ring",
- "rusticata-macros",
- "thiserror 1.0.69",
- "time",
-]
-
-[[package]]
-name = "x509-parser"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4569f339c0c402346d4a75a9e39cf8dad310e287eef1ff56d4c68e5067f53460"
-dependencies = [
- "asn1-rs 0.7.1",
- "data-encoding",
- "der-parser 10.0.0",
- "lazy_static",
- "nom",
- "oid-registry 0.8.1",
- "ring",
- "rusticata-macros",
- "thiserror 2.0.12",
- "time",
-]
-
-[[package]]
-name = "xattr"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e"
+checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6"
dependencies = [
"libc",
- "rustix 1.0.7",
-]
-
-[[package]]
-name = "xxhash-rust"
-version = "0.8.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3"
-
-[[package]]
-name = "yasna"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd"
-dependencies = [
- "time",
+ "windows-sys 0.59.0",
]
[[package]]
name = "yoke"
-version = "0.8.0"
+version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
+checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
dependencies = [
"serde",
"stable_deref_trait",
@@ -7390,24 +6016,25 @@ dependencies = [
[[package]]
name = "yoke-derive"
-version = "0.8.0"
+version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
+checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
"synstructure",
]
[[package]]
name = "zbus"
-version = "5.7.1"
+version = "4.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68"
+checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030"
dependencies = [
"async-broadcast",
"async-executor",
+ "async-fs",
"async-io",
"async-lock",
"async-process",
@@ -7415,20 +6042,25 @@ dependencies = [
"async-task",
"async-trait",
"blocking",
+ "derivative",
"enumflags2",
- "event-listener 5.4.0",
+ "event-listener",
"futures-core",
- "futures-lite",
- "hex 0.4.3",
- "nix",
+ "futures-sink",
+ "futures-util",
+ "hex",
+ "nix 0.27.1",
"ordered-stream",
+ "rand 0.8.5",
"serde",
"serde_repr",
+ "sha1",
+ "static_assertions",
"tokio",
"tracing",
"uds_windows",
- "windows-sys 0.59.0",
- "winnow 0.7.10",
+ "windows-sys 0.52.0",
+ "xdg-home",
"zbus_macros",
"zbus_names",
"zvariant",
@@ -7436,69 +6068,68 @@ dependencies = [
[[package]]
name = "zbus_macros"
-version = "5.7.1"
+version = "4.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a"
+checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7"
dependencies = [
- "proc-macro-crate 3.3.0",
+ "proc-macro-crate 1.3.1",
"proc-macro2",
"quote",
- "syn 2.0.101",
- "zbus_names",
- "zvariant",
+ "regex",
+ "syn 1.0.109",
"zvariant_utils",
]
[[package]]
name = "zbus_names"
-version = "4.2.0"
+version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97"
+checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c"
dependencies = [
"serde",
"static_assertions",
- "winnow 0.7.10",
"zvariant",
]
[[package]]
name = "zerocopy"
-version = "0.8.25"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
+ "byteorder",
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.8.25"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
]
[[package]]
name = "zerofrom"
-version = "0.1.6"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
+checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
dependencies = [
"zerofrom-derive",
]
[[package]]
name = "zerofrom-derive"
-version = "0.1.6"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
+checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 2.0.91",
"synstructure",
]
@@ -7508,22 +6139,11 @@ version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
-[[package]]
-name = "zerotrie"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
-dependencies = [
- "displaydoc",
- "yoke",
- "zerofrom",
-]
-
[[package]]
name = "zerovec"
-version = "0.11.2"
+version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428"
+checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
dependencies = [
"yoke",
"zerofrom",
@@ -7532,81 +6152,49 @@ dependencies = [
[[package]]
name = "zerovec-derive"
-version = "0.11.1"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
+checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.101",
-]
-
-[[package]]
-name = "zstd"
-version = "0.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
-dependencies = [
- "zstd-safe",
-]
-
-[[package]]
-name = "zstd-safe"
-version = "7.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d"
-dependencies = [
- "zstd-sys",
-]
-
-[[package]]
-name = "zstd-sys"
-version = "2.0.15+zstd.1.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237"
-dependencies = [
- "cc",
- "pkg-config",
+ "syn 2.0.91",
]
[[package]]
name = "zvariant"
-version = "5.5.3"
+version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1"
+checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65"
dependencies = [
"endi",
"enumflags2",
"serde",
+ "static_assertions",
"url",
- "winnow 0.7.10",
"zvariant_derive",
- "zvariant_utils",
]
[[package]]
name = "zvariant_derive"
-version = "5.5.3"
+version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580"
+checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e"
dependencies = [
- "proc-macro-crate 3.3.0",
+ "proc-macro-crate 1.3.1",
"proc-macro2",
"quote",
- "syn 2.0.101",
+ "syn 1.0.109",
"zvariant_utils",
]
[[package]]
name = "zvariant_utils"
-version = "3.2.0"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34"
+checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172"
dependencies = [
"proc-macro2",
"quote",
- "serde",
- "static_assertions",
- "syn 2.0.101",
- "winnow 0.7.10",
+ "syn 1.0.109",
]
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index f999d73..6df35ed 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -1,9 +1,9 @@
[package]
name = "drop-app"
-version = "0.3.3"
+version = "0.1.0"
description = "The client application for the open-source, self-hosted game distribution platform Drop"
authors = ["Drop OSS"]
-edition = "2024"
+edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -16,6 +16,8 @@ tauri-plugin-single-instance = { version = "2.0.0", features = ["deep-link"] }
# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519
name = "drop_app_lib"
crate-type = ["staticlib", "cdylib", "rlib"]
+
+[build]
rustflags = ["-C", "target-feature=+aes,+sse2"]
@@ -23,9 +25,12 @@ rustflags = ["-C", "target-feature=+aes,+sse2"]
tauri-build = { version = "2.0.0", features = [] }
[dependencies]
-tauri-plugin-shell = "2.2.1"
+tauri-plugin-shell = "2.0.0"
+serde = { version = "1", features = ["derive", "rc"] }
serde_json = "1"
+serde-binary = "0.5.0"
rayon = "1.10.0"
+directories = "5.0.1"
webbrowser = "1.0.2"
url = "2.5.2"
tauri-plugin-deep-link = "2"
@@ -38,50 +43,12 @@ md5 = "0.7.0"
chrono = "0.4.38"
tauri-plugin-os = "2"
boxcar = "0.2.7"
-umu-wrapper-lib = "0.1.0"
-tauri-plugin-autostart = "2.0.0"
-shared_child = "1.0.1"
-serde_with = "3.12.0"
-slice-deque = "0.3.0"
-throttle_my_fn = "0.2.6"
-parking_lot = "0.12.3"
-atomic-instant-full = "0.1.0"
-cacache = "13.1.0"
-http-serde = "2.1.1"
-reqwest-middleware = "0.4.0"
-reqwest-middleware-cache = "0.1.1"
-deranged = "=0.4.0"
-droplet-rs = "0.7.3"
-gethostname = "1.0.1"
-zstd = "0.13.3"
-tar = "0.4.44"
-rand = "0.9.1"
-regex = "1.11.1"
-tempfile = "3.19.1"
-schemars = "0.8.22"
-sha1 = "0.10.6"
-dirs = "6.0.0"
-whoami = "1.6.0"
-filetime = "0.2.25"
-walkdir = "2.5.0"
-known-folders = "1.2.0"
-native_model = { version = "0.6.1", features = ["rmp_serde_1_3"] }
-tauri-plugin-opener = "2.4.0"
-bitcode = "0.6.6"
-reqwest-websocket = "0.5.0"
-futures-lite = "2.6.0"
-page_size = "0.6.0"
-sysinfo = "0.36.1"
-humansize = "2.1.3"
-# tailscale = { path = "./tailscale" }
-
-[dependencies.dynfmt]
-version = "0.1.5"
-features = ["curly"]
+tauri-plugin-gamepad = {git = "https://github.com/quexeky/tauri-plugin-gamepad.git", version = "0.0.5"}
[dependencies.tauri]
-version = "2.7.0"
-features = ["protocol-asset", "tray-icon"]
+version = "2.1.1"
+features = ["tray-icon"]
+
[dependencies.tokio]
version = "1.40.0"
@@ -97,20 +64,23 @@ features = ["fs"]
[dependencies.uuid]
version = "1.10.0"
-features = ["v4", "fast-rng", "macro-diagnostics"]
+features = [
+ "v4", # Lets you generate random UUIDs
+ "fast-rng", # Use a faster (but still sufficiently random) RNG
+ "macro-diagnostics", # Enable better diagnostics for compile-time UUIDs
+]
+
+[dependencies.openssl]
+version = "0.10.66"
+features = ["vendored"]
[dependencies.rustbreak]
version = "2"
-features = ["other_errors"] # You can also use "yaml_enc" or "bin_enc"
+features = [] # You can also use "yaml_enc" or "bin_enc"
[dependencies.reqwest]
-version = "0.12.22"
-default-features = false
-features = ["json", "http2", "blocking", "rustls-tls", "native-tls-alpn", "rustls-tls-native-roots"]
-
-[dependencies.serde]
-version = "1"
-features = ["derive", "rc"]
+version = "0.12"
+features = ["json", "blocking"]
[profile.release]
lto = true
diff --git a/src-tauri/build.rs b/src-tauri/build.rs
index 261851f..d860e1e 100644
--- a/src-tauri/build.rs
+++ b/src-tauri/build.rs
@@ -1,3 +1,3 @@
fn main() {
- tauri_build::build();
+ tauri_build::build()
}
diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json
index ac70625..bb5ce00 100644
--- a/src-tauri/capabilities/default.json
+++ b/src-tauri/capabilities/default.json
@@ -15,6 +15,6 @@
"deep-link:default",
"dialog:default",
"os:default",
- "opener:default"
+ "gamepad:default"
]
}
\ No newline at end of file
diff --git a/src-tauri/rust-toolchain.toml b/src-tauri/rust-toolchain.toml
deleted file mode 100644
index 271800c..0000000
--- a/src-tauri/rust-toolchain.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-[toolchain]
-channel = "nightly"
\ No newline at end of file
diff --git a/src-tauri/src/auth.rs b/src-tauri/src/auth.rs
new file mode 100644
index 0000000..9d6afb5
--- /dev/null
+++ b/src-tauri/src/auth.rs
@@ -0,0 +1,229 @@
+use std::{
+ env,
+ sync::Mutex,
+};
+
+use chrono::Utc;
+use log::{info, warn};
+use openssl::{ec::EcKey, hash::MessageDigest, pkey::PKey, sign::Signer};
+use serde::{Deserialize, Serialize};
+use tauri::{AppHandle, Emitter, Manager};
+use url::Url;
+
+use crate::{
+ db::{DatabaseAuth, DatabaseImpls},
+ remote::{DropServerError, RemoteAccessError},
+ AppState, AppStatus, User, DB,
+};
+
+#[derive(Serialize)]
+#[serde(rename_all = "camelCase")]
+struct InitiateRequestBody {
+ name: String,
+ platform: String,
+}
+
+#[derive(Serialize)]
+#[serde(rename_all = "camelCase")]
+struct HandshakeRequestBody {
+ client_id: String,
+ token: String,
+}
+
+#[derive(Deserialize)]
+#[serde(rename_all = "camelCase")]
+struct HandshakeResponse {
+ private: String,
+ certificate: String,
+ id: String,
+}
+
+pub fn sign_nonce(private_key: String, nonce: String) -> Result
{
+ let client_private_key = EcKey::private_key_from_pem(private_key.as_bytes()).unwrap();
+ let pkey_private_key = PKey::from_ec_key(client_private_key).unwrap();
+
+ let mut signer = Signer::new(MessageDigest::sha256(), &pkey_private_key).unwrap();
+ signer.update(nonce.as_bytes()).unwrap();
+ let signature = signer.sign_to_vec().unwrap();
+
+ let hex_signature = hex::encode(signature);
+
+ Ok(hex_signature)
+}
+
+pub fn generate_authorization_header() -> String {
+ let certs = {
+ let db = DB.borrow_data().unwrap();
+ db.auth.clone().unwrap()
+ };
+
+ let nonce = Utc::now().timestamp_millis().to_string();
+
+ let signature = sign_nonce(certs.private, nonce.clone()).unwrap();
+
+ format!("Nonce {} {} {}", certs.client_id, nonce, signature)
+}
+
+pub fn fetch_user() -> Result {
+ let base_url = DB.fetch_base_url();
+
+ let endpoint = base_url.join("/api/v1/client/user")?;
+ let header = generate_authorization_header();
+
+ let client = reqwest::blocking::Client::new();
+ let response = client
+ .get(endpoint.to_string())
+ .header("Authorization", header)
+ .send()?;
+
+ if response.status() != 200 {
+ let data = response.json::()?;
+ info!("Could not fetch user: {}", data.status_message);
+
+ if data.status_message == "Nonce expired" {
+ return Err(RemoteAccessError::OutOfSync);
+ }
+
+ return Err(RemoteAccessError::InvalidCodeError(0));
+ }
+
+ let user = response.json::()?;
+
+ Ok(user)
+}
+
+fn recieve_handshake_logic(app: &AppHandle, path: String) -> Result<(), RemoteAccessError> {
+ let path_chunks: Vec<&str> = path.split("/").collect();
+ if path_chunks.len() != 3 {
+ app.emit("auth/failed", ()).unwrap();
+ return Err(RemoteAccessError::InvalidResponse);
+ }
+
+ let base_url = {
+ let handle = DB.borrow_data().unwrap();
+ Url::parse(handle.base_url.as_str())?
+ };
+
+ let client_id = path_chunks.get(1).unwrap();
+ let token = path_chunks.get(2).unwrap();
+ let body = HandshakeRequestBody {
+ client_id: client_id.to_string(),
+ token: token.to_string(),
+ };
+
+ let endpoint = base_url.join("/api/v1/client/auth/handshake")?;
+ let client = reqwest::blocking::Client::new();
+ let response = client.post(endpoint).json(&body).send()?;
+ info!("{}", response.status().as_u16());
+ let response_struct = response.json::()?;
+
+ {
+ let mut handle = DB.borrow_data_mut().unwrap();
+ handle.auth = Some(DatabaseAuth {
+ private: response_struct.private,
+ cert: response_struct.certificate,
+ client_id: response_struct.id,
+ });
+ drop(handle);
+ DB.save().unwrap();
+ }
+
+ {
+ let app_state = app.state::>();
+ let mut app_state_handle = app_state.lock().unwrap();
+ app_state_handle.status = AppStatus::SignedIn;
+ app_state_handle.user = Some(fetch_user()?);
+ }
+
+ Ok(())
+}
+
+pub fn recieve_handshake(app: AppHandle, path: String) {
+ // Tell the app we're processing
+ app.emit("auth/processing", ()).unwrap();
+
+ let handshake_result = recieve_handshake_logic(&app, path);
+ if let Err(e) = handshake_result {
+ warn!("error with authentication: {}", e);
+ app.emit("auth/failed", e.to_string()).unwrap();
+ return;
+ }
+
+ app.emit("auth/finished", ()).unwrap();
+}
+
+fn auth_initiate_wrapper() -> Result<(), RemoteAccessError> {
+ let base_url = {
+ let db_lock = DB.borrow_data().unwrap();
+ Url::parse(&db_lock.base_url.clone())?
+ };
+
+ let endpoint = base_url.join("/api/v1/client/auth/initiate")?;
+ let body = InitiateRequestBody {
+ name: "Drop Desktop Client".to_string(),
+ platform: env::consts::OS.to_string(),
+ };
+
+ let client = reqwest::blocking::Client::new();
+ let response = client.post(endpoint.to_string()).json(&body).send()?;
+
+ if response.status() != 200 {
+ let data = response.json::()?;
+ info!("Could not start handshake: {}", data.status_message);
+
+ return Err(RemoteAccessError::HandshakeFailed(data.status_message));
+ }
+
+ let redir_url = response.text()?;
+ let complete_redir_url = base_url.join(&redir_url)?;
+
+ info!("opening web browser to continue authentication");
+ webbrowser::open(complete_redir_url.as_ref()).unwrap();
+
+ Ok(())
+}
+
+#[tauri::command]
+pub fn auth_initiate<'a>() -> Result<(), String> {
+ let result = auth_initiate_wrapper();
+ if result.is_err() {
+ return Err(result.err().unwrap().to_string());
+ }
+
+ Ok(())
+}
+
+#[tauri::command]
+pub fn retry_connect(state: tauri::State<'_, Mutex>) -> Result<(), ()> {
+ let (app_status, user) = setup()?;
+
+ let mut guard = state.lock().unwrap();
+ guard.status = app_status;
+ guard.user = user;
+ drop(guard);
+
+ Ok(())
+}
+
+pub fn setup() -> Result<(AppStatus, Option), ()> {
+ let data = DB.borrow_data().unwrap();
+ let auth = data.auth.clone();
+ drop(data);
+
+ if auth.is_some() {
+ let user_result = fetch_user();
+ if user_result.is_err() {
+ let error = user_result.err().unwrap();
+ warn!("auth setup failed with: {}", error);
+ match error {
+ RemoteAccessError::FetchError(_) => {
+ return Ok((AppStatus::ServerUnavailable, None))
+ }
+ _ => return Ok((AppStatus::SignedInNeedsReauth, None)),
+ }
+ }
+ return Ok((AppStatus::SignedIn, Some(user_result.unwrap())));
+ }
+
+ Ok((AppStatus::SignedOut, None))
+}
diff --git a/src-tauri/src/cleanup.rs b/src-tauri/src/cleanup.rs
new file mode 100644
index 0000000..925ea61
--- /dev/null
+++ b/src-tauri/src/cleanup.rs
@@ -0,0 +1,15 @@
+
+use log::info;
+use tauri::AppHandle;
+
+
+#[tauri::command]
+pub fn quit(app: tauri::AppHandle) {
+ cleanup_and_exit(&app);
+}
+
+pub fn cleanup_and_exit(app: &AppHandle) {
+ info!("exiting drop application...");
+
+ app.exit(0);
+}
diff --git a/src-tauri/src/client/autostart.rs b/src-tauri/src/client/autostart.rs
deleted file mode 100644
index a35f480..0000000
--- a/src-tauri/src/client/autostart.rs
+++ /dev/null
@@ -1,75 +0,0 @@
-use crate::database::db::{borrow_db_checked, borrow_db_mut_checked};
-use log::debug;
-use tauri::AppHandle;
-use tauri_plugin_autostart::ManagerExt;
-
-pub fn toggle_autostart_logic(app: AppHandle, enabled: bool) -> Result<(), String> {
- let manager = app.autolaunch();
- if enabled {
- manager.enable().map_err(|e| e.to_string())?;
- debug!("enabled autostart");
- } else {
- manager.disable().map_err(|e| e.to_string())?;
- debug!("eisabled autostart");
- }
-
- // Store the state in DB
- let mut db_handle = borrow_db_mut_checked();
- db_handle.settings.autostart = enabled;
- drop(db_handle);
-
- Ok(())
-}
-
-pub fn get_autostart_enabled_logic(app: AppHandle) -> Result {
- // First check DB state
- let db_handle = borrow_db_checked();
- let db_state = db_handle.settings.autostart;
- drop(db_handle);
-
- // Get actual system state
- let manager = app.autolaunch();
- let system_state = manager.is_enabled()?;
-
- // If they don't match, sync to DB state
- if db_state != system_state {
- if db_state {
- manager.enable()?;
- } else {
- manager.disable()?;
- }
- }
-
- Ok(db_state)
-}
-
-// New function to sync state on startup
-pub fn sync_autostart_on_startup(app: &AppHandle) -> Result<(), String> {
- let db_handle = borrow_db_checked();
- let should_be_enabled = db_handle.settings.autostart;
- drop(db_handle);
-
- let manager = app.autolaunch();
- let current_state = manager.is_enabled().map_err(|e| e.to_string())?;
-
- if current_state != should_be_enabled {
- if should_be_enabled {
- manager.enable().map_err(|e| e.to_string())?;
- debug!("synced autostart: enabled");
- } else {
- manager.disable().map_err(|e| e.to_string())?;
- debug!("synced autostart: disabled");
- }
- }
-
- Ok(())
-}
-#[tauri::command]
-pub fn toggle_autostart(app: AppHandle, enabled: bool) -> Result<(), String> {
- toggle_autostart_logic(app, enabled)
-}
-
-#[tauri::command]
-pub fn get_autostart_enabled(app: AppHandle) -> Result {
- get_autostart_enabled_logic(app)
-}
diff --git a/src-tauri/src/client/cleanup.rs b/src-tauri/src/client/cleanup.rs
deleted file mode 100644
index c6f0e80..0000000
--- a/src-tauri/src/client/cleanup.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-use log::{debug, error};
-use tauri::AppHandle;
-
-use crate::AppState;
-
-#[tauri::command]
-pub fn quit(app: tauri::AppHandle, state: tauri::State<'_, std::sync::Mutex>>) {
- cleanup_and_exit(&app, &state);
-}
-
-pub fn cleanup_and_exit(app: &AppHandle, state: &tauri::State<'_, std::sync::Mutex>>) {
- debug!("cleaning up and exiting application");
- let download_manager = state.lock().unwrap().download_manager.clone();
- match download_manager.ensure_terminated() {
- Ok(res) => match res {
- Ok(()) => debug!("download manager terminated correctly"),
- Err(()) => error!("download manager failed to terminate correctly"),
- },
- Err(e) => panic!("{e:?}"),
- }
-
- app.exit(0);
-}
diff --git a/src-tauri/src/client/commands.rs b/src-tauri/src/client/commands.rs
deleted file mode 100644
index b47a348..0000000
--- a/src-tauri/src/client/commands.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-use crate::AppState;
-
-#[tauri::command]
-pub fn fetch_state(
- state: tauri::State<'_, std::sync::Mutex>>,
-) -> Result {
- let guard = state.lock().unwrap();
- let cloned_state = serde_json::to_string(&guard.clone()).map_err(|e| e.to_string())?;
- drop(guard);
- Ok(cloned_state)
-}
diff --git a/src-tauri/src/client/mod.rs b/src-tauri/src/client/mod.rs
deleted file mode 100644
index 48b6821..0000000
--- a/src-tauri/src/client/mod.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-pub mod autostart;
-pub mod cleanup;
-pub mod commands;
diff --git a/src-tauri/src/cloud_saves/backup_manager.rs b/src-tauri/src/cloud_saves/backup_manager.rs
deleted file mode 100644
index 522126c..0000000
--- a/src-tauri/src/cloud_saves/backup_manager.rs
+++ /dev/null
@@ -1,102 +0,0 @@
-use std::{collections::HashMap, path::PathBuf, str::FromStr};
-
-use log::warn;
-
-use crate::{database::db::{GameVersion, DATA_ROOT_DIR}, error::backup_error::BackupError, process::process_manager::Platform};
-
-use super::path::CommonPath;
-
-pub struct BackupManager<'a> {
- pub current_platform: Platform,
- pub sources: HashMap<(Platform, Platform), &'a (dyn BackupHandler + Sync + Send)>,
-}
-
-impl BackupManager<'_> {
- pub fn new() -> Self {
- BackupManager {
- #[cfg(target_os = "windows")]
- current_platform: Platform::Windows,
-
- #[cfg(target_os = "macos")]
- current_platform: Platform::MacOs,
-
- #[cfg(target_os = "linux")]
- current_platform: Platform::Linux,
-
- sources: HashMap::from([
- // Current platform to target platform
- (
- (Platform::Windows, Platform::Windows),
- &WindowsBackupManager {} as &(dyn BackupHandler + Sync + Send),
- ),
- (
- (Platform::Linux, Platform::Linux),
- &LinuxBackupManager {} as &(dyn BackupHandler + Sync + Send),
- ),
- (
- (Platform::MacOs, Platform::MacOs),
- &MacBackupManager {} as &(dyn BackupHandler + Sync + Send),
- ),
-
- ]),
- }
- }
-
-}
-
-pub trait BackupHandler: Send + Sync {
- fn root_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result { Ok(DATA_ROOT_DIR.lock().unwrap().join("games")) }
- fn game_translate(&self, _path: &PathBuf, game: &GameVersion) -> Result { Ok(PathBuf::from_str(&game.game_id).unwrap()) }
- fn base_translate(&self, path: &PathBuf, game: &GameVersion) -> Result { Ok(self.root_translate(path, game)?.join(self.game_translate(path, game)?)) }
- fn home_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result { let c = CommonPath::Home.get().ok_or(BackupError::NotFound); println!("{:?}", c); c }
- fn store_user_id_translate(&self, _path: &PathBuf, game: &GameVersion) -> Result { PathBuf::from_str(&game.game_id).map_err(|_| BackupError::ParseError) }
- fn os_user_name_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result { Ok(PathBuf::from_str(&whoami::username()).unwrap()) }
- fn win_app_data_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result { warn!("Unexpected Windows Reference in Backup "); Err(BackupError::InvalidSystem) }
- fn win_local_app_data_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result { warn!("Unexpected Windows Reference in Backup "); Err(BackupError::InvalidSystem) }
- fn win_local_app_data_low_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result { warn!("Unexpected Windows Reference in Backup "); Err(BackupError::InvalidSystem) }
- fn win_documents_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result { warn!("Unexpected Windows Reference in Backup "); Err(BackupError::InvalidSystem) }
- fn win_public_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result { warn!("Unexpected Windows Reference in Backup "); Err(BackupError::InvalidSystem) }
- fn win_program_data_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result { warn!("Unexpected Windows Reference in Backup "); Err(BackupError::InvalidSystem) }
- fn win_dir_translate(&self, _path: &PathBuf,_game: &GameVersion) -> Result { warn!("Unexpected Windows Reference in Backup "); Err(BackupError::InvalidSystem) }
- fn xdg_data_translate(&self, _path: &PathBuf,_game: &GameVersion) -> Result { warn!("Unexpected XDG Reference in Backup "); Err(BackupError::InvalidSystem) }
- fn xdg_config_translate(&self, _path: &PathBuf,_game: &GameVersion) -> Result { warn!("Unexpected XDG Reference in Backup "); Err(BackupError::InvalidSystem) }
- fn skip_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result { Ok(PathBuf::new()) }
-}
-
-pub struct LinuxBackupManager {}
-impl BackupHandler for LinuxBackupManager {
- fn xdg_config_translate(&self, _path: &PathBuf,_game: &GameVersion) -> Result {
- Ok(CommonPath::Data.get().ok_or(BackupError::NotFound)?)
- }
- fn xdg_data_translate(&self, _path: &PathBuf,_game: &GameVersion) -> Result {
- Ok(CommonPath::Config.get().ok_or(BackupError::NotFound)?)
- }
-}
-pub struct WindowsBackupManager {}
-impl BackupHandler for WindowsBackupManager {
- fn win_app_data_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result {
- Ok(CommonPath::Config.get().ok_or(BackupError::NotFound)?)
- }
- fn win_local_app_data_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result {
- Ok(CommonPath::DataLocal.get().ok_or(BackupError::NotFound)?)
- }
- fn win_local_app_data_low_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result {
- Ok(CommonPath::DataLocalLow.get().ok_or(BackupError::NotFound)?)
- }
- fn win_dir_translate(&self, _path: &PathBuf,_game: &GameVersion) -> Result {
- Ok(PathBuf::from_str("C:/Windows").unwrap())
- }
- fn win_documents_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result {
- Ok(CommonPath::Document.get().ok_or(BackupError::NotFound)?)
-
- }
- fn win_program_data_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result {
- Ok(PathBuf::from_str("C:/ProgramData").unwrap())
- }
- fn win_public_translate(&self, _path: &PathBuf, _game: &GameVersion) -> Result {
- Ok(CommonPath::Public.get().ok_or(BackupError::NotFound)?)
-
- }
-}
-pub struct MacBackupManager {}
-impl BackupHandler for MacBackupManager {}
\ No newline at end of file
diff --git a/src-tauri/src/cloud_saves/conditions.rs b/src-tauri/src/cloud_saves/conditions.rs
deleted file mode 100644
index 1b3af87..0000000
--- a/src-tauri/src/cloud_saves/conditions.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-use crate::process::process_manager::Platform;
-
-#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
-pub enum Condition {
- Os(Platform)
-}
diff --git a/src-tauri/src/cloud_saves/metadata.rs b/src-tauri/src/cloud_saves/metadata.rs
deleted file mode 100644
index eefa587..0000000
--- a/src-tauri/src/cloud_saves/metadata.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-use crate::database::db::GameVersion;
-
-use super::conditions::{Condition};
-
-
-#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
-pub struct CloudSaveMetadata {
- pub files: Vec,
- pub game_version: GameVersion,
- pub save_id: String,
-}
-
-#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
-pub struct GameFile {
- pub path: String,
- pub id: Option,
- pub data_type: DataType,
- pub tags: Vec,
- pub conditions: Vec
-}
-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, serde::Serialize, serde::Deserialize)]
-pub enum DataType {
- Registry,
- File,
- Other
-}
-#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, serde::Serialize, serde::Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub enum Tag {
- Config,
- Save,
- #[default]
- #[serde(other)]
- Other,
-}
\ No newline at end of file
diff --git a/src-tauri/src/cloud_saves/mod.rs b/src-tauri/src/cloud_saves/mod.rs
deleted file mode 100644
index 34bf4f2..0000000
--- a/src-tauri/src/cloud_saves/mod.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-pub mod conditions;
-pub mod metadata;
-pub mod resolver;
-pub mod placeholder;
-pub mod normalise;
-pub mod path;
-pub mod backup_manager;
\ No newline at end of file
diff --git a/src-tauri/src/cloud_saves/normalise.rs b/src-tauri/src/cloud_saves/normalise.rs
deleted file mode 100644
index 67da752..0000000
--- a/src-tauri/src/cloud_saves/normalise.rs
+++ /dev/null
@@ -1,162 +0,0 @@
-use std::sync::LazyLock;
-
-use regex::Regex;
-use crate::process::process_manager::Platform;
-
-use super::placeholder::*;
-
-
-pub fn normalize(path: &str, os: Platform) -> String {
- let mut path = path.trim().trim_end_matches(['/', '\\']).replace('\\', "/");
-
- if path == "~" || path.starts_with("~/") {
- path = path.replacen('~', HOME, 1);
- }
-
- static CONSECUTIVE_SLASHES: LazyLock = LazyLock::new(|| Regex::new(r"/{2,}").unwrap());
- static UNNECESSARY_DOUBLE_STAR_1: LazyLock = LazyLock::new(|| Regex::new(r"([^/*])\*{2,}").unwrap());
- static UNNECESSARY_DOUBLE_STAR_2: LazyLock = LazyLock::new(|| Regex::new(r"\*{2,}([^/*])").unwrap());
- static ENDING_WILDCARD: LazyLock = LazyLock::new(|| Regex::new(r"(/\*)+$").unwrap());
- static ENDING_DOT: LazyLock = LazyLock::new(|| Regex::new(r"(/\.)$").unwrap());
- static INTERMEDIATE_DOT: LazyLock = LazyLock::new(|| Regex::new(r"(/\./)").unwrap());
- static BLANK_SEGMENT: LazyLock = LazyLock::new(|| Regex::new(r"(/\s+/)").unwrap());
- static APP_DATA: LazyLock = LazyLock::new(|| Regex::new(r"(?i)%appdata%").unwrap());
- static APP_DATA_ROAMING: LazyLock = LazyLock::new(|| Regex::new(r"(?i)%userprofile%/AppData/Roaming").unwrap());
- static APP_DATA_LOCAL: LazyLock = LazyLock::new(|| Regex::new(r"(?i)%localappdata%").unwrap());
- static APP_DATA_LOCAL_2: LazyLock = LazyLock::new(|| Regex::new(r"(?i)%userprofile%/AppData/Local/").unwrap());
- static USER_PROFILE: LazyLock = LazyLock::new(|| Regex::new(r"(?i)%userprofile%").unwrap());
- static DOCUMENTS: LazyLock = LazyLock::new(|| Regex::new(r"(?i)%userprofile%/Documents").unwrap());
-
- for (pattern, replacement) in [
- (&CONSECUTIVE_SLASHES, "/"),
- (&UNNECESSARY_DOUBLE_STAR_1, "${1}*"),
- (&UNNECESSARY_DOUBLE_STAR_2, "*${1}"),
- (&ENDING_WILDCARD, ""),
- (&ENDING_DOT, ""),
- (&INTERMEDIATE_DOT, "/"),
- (&BLANK_SEGMENT, "/"),
- (&APP_DATA, WIN_APP_DATA),
- (&APP_DATA_ROAMING, WIN_APP_DATA),
- (&APP_DATA_LOCAL, WIN_LOCAL_APP_DATA),
- (&APP_DATA_LOCAL_2, &format!("{}/", WIN_LOCAL_APP_DATA)),
- (&USER_PROFILE, HOME),
- (&DOCUMENTS, WIN_DOCUMENTS),
- ] {
- path = pattern.replace_all(&path, replacement).to_string();
- }
-
- if os == Platform::Windows {
- let documents_2: Regex = Regex::new(r"(?i)/Documents").unwrap();
-
- #[allow(clippy::single_element_loop)]
- for (pattern, replacement) in [(&documents_2, WIN_DOCUMENTS)] {
- path = pattern.replace_all(&path, replacement).to_string();
- }
- }
-
- for (pattern, replacement) in [
- ("{64BitSteamID}", STORE_USER_ID),
- ("{Steam3AccountID}", STORE_USER_ID),
- ] {
- path = path.replace(pattern, replacement);
- }
-
- path
-}
-
-fn too_broad(path: &str) -> bool {
- println!("Path: {}", path);
- use {BASE, HOME, ROOT, STORE_USER_ID, WIN_APP_DATA, WIN_DIR, WIN_DOCUMENTS, XDG_CONFIG, XDG_DATA};
-
- let path_lower = path.to_lowercase();
-
- for item in ALL {
- if path == *item {
- return true;
- }
- }
-
- for item in AVOID_WILDCARDS {
- if path.starts_with(&format!("{}/*", item)) || path.starts_with(&format!("{}/{}", item, STORE_USER_ID)) {
- return true;
- }
- }
-
- // These paths are present whether or not the game is installed.
- // If possible, they should be narrowed down on the wiki.
- for item in [
- format!("{}/{}", BASE, STORE_USER_ID), // because `` is handled as `*`
- format!("{}/Documents", HOME),
- format!("{}/Saved Games", HOME),
- format!("{}/AppData", HOME),
- format!("{}/AppData/Local", HOME),
- format!("{}/AppData/Local/Packages", HOME),
- format!("{}/AppData/LocalLow", HOME),
- format!("{}/AppData/Roaming", HOME),
- format!("{}/Documents/My Games", HOME),
- format!("{}/Library/Application Support", HOME),
- format!("{}/Library/Application Support/UserData", HOME),
- format!("{}/Library/Preferences", HOME),
- format!("{}/.renpy", HOME),
- format!("{}/.renpy/persistent", HOME),
- format!("{}/Library", HOME),
- format!("{}/Library/RenPy", HOME),
- format!("{}/Telltale Games", HOME),
- format!("{}/config", ROOT),
- format!("{}/MMFApplications", WIN_APP_DATA),
- format!("{}/RenPy", WIN_APP_DATA),
- format!("{}/RenPy/persistent", WIN_APP_DATA),
- format!("{}/win.ini", WIN_DIR),
- format!("{}/SysWOW64", WIN_DIR),
- format!("{}/My Games", WIN_DOCUMENTS),
- format!("{}/Telltale Games", WIN_DOCUMENTS),
- format!("{}/unity3d", XDG_CONFIG),
- format!("{}/unity3d", XDG_DATA),
- "C:/Program Files".to_string(),
- "C:/Program Files (x86)".to_string(),
- ] {
- let item = item.to_lowercase();
- if path_lower == item
- || path_lower.starts_with(&format!("{}/*", item))
- || path_lower.starts_with(&format!("{}/{}", item, STORE_USER_ID.to_lowercase()))
- || path_lower.starts_with(&format!("{}/savesdir", item))
- {
- return true;
- }
- }
-
-
- // Drive letters:
- let drives: Regex = Regex::new(r"^[a-zA-Z]:$").unwrap();
- if drives.is_match(path) {
- return true;
- }
-
- // Colon not for a drive letter
- if path.get(2..).is_some_and(|path| path.contains(':')) {
- return true;
- }
-
- // Root:
- if path == "/" {
- return true;
- }
-
- // Relative path wildcard:
- if path.starts_with('*') {
- return true;
- }
-
- false
-}
-
-pub fn usable(path: &str) -> bool {
- let unprintable: Regex = Regex::new(r"(\p{Cc}|\p{Cf})").unwrap();
-
- !path.is_empty()
- && !path.contains("{{")
- && !path.starts_with("./")
- && !path.starts_with("../")
- && !too_broad(path)
- && !unprintable.is_match(path)
-}
\ No newline at end of file
diff --git a/src-tauri/src/cloud_saves/path.rs b/src-tauri/src/cloud_saves/path.rs
deleted file mode 100644
index 92aaaf9..0000000
--- a/src-tauri/src/cloud_saves/path.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-use std::{path::PathBuf, sync::LazyLock};
-
-pub enum CommonPath {
- Config,
- Data,
- DataLocal,
- DataLocalLow,
- Document,
- Home,
- Public,
- SavedGames,
-}
-
-impl CommonPath {
- pub fn get(&self) -> Option {
- static CONFIG: LazyLock> = LazyLock::new(|| dirs::config_dir());
- static DATA: LazyLock > = LazyLock::new(|| dirs::data_dir());
- static DATA_LOCAL: LazyLock > = LazyLock::new(|| dirs::data_local_dir());
- static DOCUMENT: LazyLock > = LazyLock::new(|| dirs::document_dir());
- static HOME: LazyLock > = LazyLock::new(|| dirs::home_dir());
- static PUBLIC: LazyLock > = LazyLock::new(|| dirs::public_dir());
-
- #[cfg(windows)]
- static DATA_LOCAL_LOW: LazyLock > = LazyLock::new(|| {
- known_folders::get_known_folder_path(known_folders::KnownFolder::LocalAppDataLow)
- });
- #[cfg(not(windows))]
- static DATA_LOCAL_LOW: Option = None;
-
- #[cfg(windows)]
- static SAVED_GAMES: LazyLock> = LazyLock::new(|| {
- known_folders::get_known_folder_path(known_folders::KnownFolder::SavedGames)
- });
- #[cfg(not(windows))]
- static SAVED_GAMES: Option = None;
-
- match self {
- Self::Config => CONFIG.clone(),
- Self::Data => DATA.clone(),
- Self::DataLocal => DATA_LOCAL.clone(),
- Self::DataLocalLow => DATA_LOCAL_LOW.clone(),
- Self::Document => DOCUMENT.clone(),
- Self::Home => HOME.clone(),
- Self::Public => PUBLIC.clone(),
- Self::SavedGames => SAVED_GAMES.clone(),
- }
- }
-}
diff --git a/src-tauri/src/cloud_saves/placeholder.rs b/src-tauri/src/cloud_saves/placeholder.rs
deleted file mode 100644
index 3224565..0000000
--- a/src-tauri/src/cloud_saves/placeholder.rs
+++ /dev/null
@@ -1,51 +0,0 @@
-use std::sync::LazyLock;
-
-pub const ALL: &[&str] = &[
- ROOT,
- GAME,
- BASE,
- HOME,
- STORE_USER_ID,
- OS_USER_NAME,
- WIN_APP_DATA,
- WIN_LOCAL_APP_DATA,
- WIN_DOCUMENTS,
- WIN_PUBLIC,
- WIN_PROGRAM_DATA,
- WIN_DIR,
- XDG_DATA,
- XDG_CONFIG,
-];
-
-/// These are paths where `/*/` is suspicious.
-pub const AVOID_WILDCARDS: &[&str] = &[
- ROOT,
- HOME,
- WIN_APP_DATA,
- WIN_LOCAL_APP_DATA,
- WIN_DOCUMENTS,
- WIN_PUBLIC,
- WIN_PROGRAM_DATA,
- WIN_DIR,
- XDG_DATA,
- XDG_CONFIG,
-];
-
-pub const ROOT: &str = ""; // a directory where games are installed (configured in backup tool)
-pub const GAME: &str = ""; // an installDir (if defined) or the game's canonical name in the manifest
-pub const BASE: &str = " "; // shorthand for / (unless overridden by store-specific rules)
-pub const HOME: &str = ""; // current user's home directory in the OS (~)
-pub const STORE_USER_ID: &str = ""; // a store-specific id from the manifest, corresponding to the root's store type
-pub const OS_USER_NAME: &str = ""; // current user's ID in the game store
-pub const WIN_APP_DATA: &str = ""; // current user's name in the OS
-pub const WIN_LOCAL_APP_DATA: &str = ""; // %APPDATA% on Windows
-pub const WIN_LOCAL_APP_DATA_LOW: &str = ""; // %LOCALAPPDATA% on Windows
-pub const WIN_DOCUMENTS: &str = ""; // /AppData/LocalLow on Windows
-pub const WIN_PUBLIC: &str = ""; // /Documents (f.k.a. /My Documents) or a localized equivalent on Windows
-pub const WIN_PROGRAM_DATA: &str = ""; // %PUBLIC% on Windows
-pub const WIN_DIR: &str = ""; // %PROGRAMDATA% on Windows
-pub const XDG_DATA: &str = ""; // %WINDIR% on Windows
-pub const XDG_CONFIG: &str = ""; // $XDG_DATA_HOME on Linux
-pub const SKIP: &str = ""; // $XDG_CONFIG_HOME on Linux
-
-pub static OS_USERNAME: LazyLock = LazyLock::new(|| whoami::username());
\ No newline at end of file
diff --git a/src-tauri/src/cloud_saves/resolver.rs b/src-tauri/src/cloud_saves/resolver.rs
deleted file mode 100644
index c78fc36..0000000
--- a/src-tauri/src/cloud_saves/resolver.rs
+++ /dev/null
@@ -1,262 +0,0 @@
-use std::{
- fs::{self, create_dir_all, File},
- io::{self, ErrorKind, Read, Write},
- path::{Path, PathBuf},
- thread::sleep,
- time::Duration,
-};
-
-use super::{
- backup_manager::BackupHandler, conditions::Condition, metadata::GameFile, placeholder::*,
-};
-use log::{debug, warn};
-use rustix::path::Arg;
-use tempfile::tempfile;
-
-use crate::{
- database::db::GameVersion, error::backup_error::BackupError, process::process_manager::Platform,
-};
-
-use super::{backup_manager::BackupManager, metadata::CloudSaveMetadata, normalise::normalize};
-
-pub fn resolve(meta: &mut CloudSaveMetadata) -> File {
- let f = File::create_new("save").unwrap();
- let compressor = zstd::Encoder::new(f, 22).unwrap();
- let mut tarball = tar::Builder::new(compressor);
- let manager = BackupManager::new();
- for file in meta.files.iter_mut() {
- let id = uuid::Uuid::new_v4().to_string();
- let os = match file
- .conditions
- .iter()
- .find_map(|p| match p {
- super::conditions::Condition::Os(os) => Some(os),
- _ => None,
- })
- .cloned()
- {
- Some(os) => os,
- None => {
- warn!(
- "File {:?} could not be backed up because it did not provide an OS",
- &file
- );
- continue;
- }
- };
- let handler = match manager.sources.get(&(manager.current_platform, os)) {
- Some(h) => *h,
- None => continue,
- };
- let t_path = PathBuf::from(normalize(&file.path, os));
- println!("{:?}", &t_path);
- let path = parse_path(t_path, handler, &meta.game_version).unwrap();
- let f = std::fs::metadata(&path).unwrap(); // TODO: Fix unwrap here
- if f.is_dir() {
- tarball.append_dir_all(&id, path).unwrap();
- } else if f.is_file() {
- tarball
- .append_file(&id, &mut File::open(path).unwrap())
- .unwrap();
- }
- file.id = Some(id);
- }
- let binding = serde_json::to_string(meta).unwrap();
- let serialized = binding.as_bytes();
- let mut file = tempfile().unwrap();
- file.write(serialized).unwrap();
- tarball.append_file("metadata", &mut file).unwrap();
- tarball.into_inner().unwrap().finish().unwrap()
-}
-
-pub fn extract(file: PathBuf) -> Result<(), BackupError> {
- let tmpdir = tempfile::tempdir().unwrap();
-
- // Reopen the file for reading
- let file = File::open(file).unwrap();
-
- let decompressor = zstd::Decoder::new(file).unwrap();
- let mut f = tar::Archive::new(decompressor);
- f.unpack(tmpdir.path()).unwrap();
-
- let path = tmpdir.path();
-
- let mut manifest = File::open(path.join("metadata")).unwrap();
-
- let mut manifest_slice = Vec::new();
- manifest.read_to_end(&mut manifest_slice).unwrap();
-
- let manifest: CloudSaveMetadata = serde_json::from_slice(&manifest_slice).unwrap();
-
- for file in manifest.files {
- let current_path = path.join(file.id.as_ref().unwrap());
-
- let manager = BackupManager::new();
- let os = match file
- .conditions
- .iter()
- .find_map(|p| match p {
- super::conditions::Condition::Os(os) => Some(os),
- _ => None,
- })
- .cloned()
- {
- Some(os) => os,
- None => {
- warn!(
- "File {:?} could not be replaced up because it did not provide an OS",
- &file
- );
- continue;
- }
- };
- let handler = match manager.sources.get(&(manager.current_platform, os)) {
- Some(h) => *h,
- None => continue,
- };
-
- let new_path = parse_path(file.path.into(), handler, &manifest.game_version)?;
- create_dir_all(&new_path.parent().unwrap()).unwrap();
-
- println!(
- "Current path {:?} copying to {:?}",
- ¤t_path, &new_path
- );
-
- copy_item(current_path, new_path).unwrap();
- }
-
- Ok(())
-}
-
-pub fn copy_item>(src: P, dest: P) -> io::Result<()> {
- let src_path = src.as_ref();
- let dest_path = dest.as_ref();
-
- let metadata = fs::metadata(&src_path)?;
-
- if metadata.is_file() {
- // Ensure the parent directory of the destination exists for a file copy
- if let Some(parent) = dest_path.parent() {
- fs::create_dir_all(parent)?;
- }
- fs::copy(&src_path, &dest_path)?;
- } else if metadata.is_dir() {
- // For directories, we call the recursive helper function.
- // The destination for the recursive copy is the `dest_path` itself.
- copy_dir_recursive(&src_path, &dest_path)?;
- } else {
- // Handle other file types like symlinks if necessary,
- // for now, return an error or skip.
- return Err(io::Error::new(
- io::ErrorKind::Other,
- format!("Source {:?} is neither a file nor a directory", src_path),
- ));
- }
-
- Ok(())
-}
-
-fn copy_dir_recursive(src: &Path, dest: &Path) -> io::Result<()> {
- fs::create_dir_all(&dest)?;
-
- for entry in fs::read_dir(src)? {
- let entry = entry?;
- let entry_path = entry.path();
- let entry_file_name = match entry_path.file_name() {
- Some(name) => name,
- None => continue, // Skip if somehow there's no file name
- };
- let dest_entry_path = dest.join(entry_file_name);
- let metadata = entry.metadata()?;
-
- if metadata.is_file() {
- debug!(
- "Writing file {} to {}",
- entry_path.display(),
- dest_entry_path.display()
- );
- fs::copy(&entry_path, &dest_entry_path)?;
- } else if metadata.is_dir() {
- copy_dir_recursive(&entry_path, &dest_entry_path)?;
- }
- // Ignore other types like symlinks for this basic implementation
- }
-
- Ok(())
-}
-
-pub fn parse_path(
- path: PathBuf,
- backup_handler: &dyn BackupHandler,
- game: &GameVersion,
-) -> Result {
- println!("Parsing: {:?}", &path);
- let mut s = PathBuf::new();
- for component in path.components() {
- match component.as_str().unwrap() {
- ROOT => s.push(backup_handler.root_translate(&path, game)?),
- GAME => s.push(backup_handler.game_translate(&path, game)?),
- BASE => s.push(backup_handler.base_translate(&path, game)?),
- HOME => s.push(backup_handler.home_translate(&path, game)?),
- STORE_USER_ID => s.push(backup_handler.store_user_id_translate(&path, game)?),
- OS_USER_NAME => s.push(backup_handler.os_user_name_translate(&path, game)?),
- WIN_APP_DATA => s.push(backup_handler.win_app_data_translate(&path, game)?),
- WIN_LOCAL_APP_DATA => s.push(backup_handler.win_local_app_data_translate(&path, game)?),
- WIN_LOCAL_APP_DATA_LOW => {
- s.push(backup_handler.win_local_app_data_low_translate(&path, game)?)
- }
- WIN_DOCUMENTS => s.push(backup_handler.win_documents_translate(&path, game)?),
- WIN_PUBLIC => s.push(backup_handler.win_public_translate(&path, game)?),
- WIN_PROGRAM_DATA => s.push(backup_handler.win_program_data_translate(&path, game)?),
- WIN_DIR => s.push(backup_handler.win_dir_translate(&path, game)?),
- XDG_DATA => s.push(backup_handler.xdg_data_translate(&path, game)?),
- XDG_CONFIG => s.push(backup_handler.xdg_config_translate(&path, game)?),
- SKIP => s.push(backup_handler.skip_translate(&path, game)?),
- _ => s.push(PathBuf::from(component.as_os_str())),
- }
- }
-
- println!("Final line: {:?}", &s);
- Ok(s)
-}
-
-pub fn test() {
- let mut meta = CloudSaveMetadata {
- files: vec![
- GameFile {
- path: String::from("/favicon.png"),
- id: None,
- data_type: super::metadata::DataType::File,
- tags: Vec::new(),
- conditions: vec![Condition::Os(Platform::Linux)],
- },
- GameFile {
- path: String::from("/Documents/Pixel Art"),
- id: None,
- data_type: super::metadata::DataType::File,
- tags: Vec::new(),
- conditions: vec![Condition::Os(Platform::Linux)],
- },
- ],
- game_version: GameVersion {
- game_id: String::new(),
- version_name: String::new(),
- platform: Platform::Linux,
- launch_command: String::new(),
- launch_args: Vec::new(),
- launch_command_template: String::new(),
- setup_command: String::new(),
- setup_args: Vec::new(),
- setup_command_template: String::new(),
- only_setup: true,
- version_index: 0,
- delta: false,
- umu_id_override: None,
- },
- save_id: String::from("aaaaaaa"),
- };
- //resolve(&mut meta);
-
- extract("save".into()).unwrap();
-}
diff --git a/src-tauri/src/cloud_saves/strict_path.rs b/src-tauri/src/cloud_saves/strict_path.rs
deleted file mode 100644
index e69de29..0000000
diff --git a/src-tauri/src/database/commands.rs b/src-tauri/src/database/commands.rs
deleted file mode 100644
index c4de82b..0000000
--- a/src-tauri/src/database/commands.rs
+++ /dev/null
@@ -1,90 +0,0 @@
-use std::{
- fs::create_dir_all,
- io::{Error, ErrorKind},
- path::{Path, PathBuf},
-};
-
-use serde_json::Value;
-
-use crate::{
- database::{db::borrow_db_mut_checked, scan::scan_install_dirs}, error::download_manager_error::DownloadManagerError,
-};
-
-use super::{
- db::{borrow_db_checked, DATA_ROOT_DIR},
- debug::SystemData,
- models::data::Settings,
-};
-
-// Will, in future, return disk/remaining size
-// Just returns the directories that have been set up
-#[tauri::command]
-pub fn fetch_download_dir_stats() -> Vec {
- let lock = borrow_db_checked();
- lock.applications.install_dirs.clone()
-}
-
-#[tauri::command]
-pub fn delete_download_dir(index: usize) {
- let mut lock = borrow_db_mut_checked();
- lock.applications.install_dirs.remove(index);
-}
-
-#[tauri::command]
-pub fn add_download_dir(new_dir: PathBuf) -> Result<(), DownloadManagerError<()>> {
- // Check the new directory is all good
- let new_dir_path = Path::new(&new_dir);
- if new_dir_path.exists() {
- let dir_contents = new_dir_path.read_dir()?;
- if dir_contents.count() != 0 {
- return Err(Error::new(
- ErrorKind::DirectoryNotEmpty,
- "Selected directory cannot contain any existing files",
- )
- .into());
- }
- } else {
- create_dir_all(new_dir_path)?;
- }
-
- // Add it to the dictionary
- let mut lock = borrow_db_mut_checked();
- if lock.applications.install_dirs.contains(&new_dir) {
- return Err(Error::new(
- ErrorKind::AlreadyExists,
- "Selected directory already exists in database",
- )
- .into());
- }
- lock.applications.install_dirs.push(new_dir);
- drop(lock);
-
- scan_install_dirs();
-
- Ok(())
-}
-
-#[tauri::command]
-pub fn update_settings(new_settings: Value) {
- let mut db_lock = borrow_db_mut_checked();
- let mut current_settings = serde_json::to_value(db_lock.settings.clone()).unwrap();
- for (key, value) in new_settings.as_object().unwrap() {
- current_settings[key] = value.clone();
- }
- let new_settings: Settings = serde_json::from_value(current_settings).unwrap();
- db_lock.settings = new_settings;
-}
-#[tauri::command]
-pub fn fetch_settings() -> Settings {
- borrow_db_checked().settings.clone()
-}
-#[tauri::command]
-pub fn fetch_system_data() -> SystemData {
- let db_handle = borrow_db_checked();
- SystemData::new(
- db_handle.auth.as_ref().unwrap().client_id.clone(),
- db_handle.base_url.clone(),
- DATA_ROOT_DIR.to_string_lossy().to_string(),
- std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_string()),
- )
-}
diff --git a/src-tauri/src/database/db.rs b/src-tauri/src/database/db.rs
deleted file mode 100644
index bc08f7a..0000000
--- a/src-tauri/src/database/db.rs
+++ /dev/null
@@ -1,177 +0,0 @@
-use std::{
- fs::{self, create_dir_all},
- mem::ManuallyDrop,
- ops::{Deref, DerefMut},
- path::PathBuf,
- sync::{Arc, LazyLock, RwLockReadGuard, RwLockWriteGuard},
-};
-
-use chrono::Utc;
-use log::{debug, error, info, warn};
-use native_model::{Decode, Encode};
-use rustbreak::{DeSerError, DeSerializer, PathDatabase, RustbreakError};
-use serde::{Serialize, de::DeserializeOwned};
-use url::Url;
-
-use crate::DB;
-
-use super::models::data::Database;
-
-pub static DATA_ROOT_DIR: LazyLock> =
- LazyLock::new(|| Arc::new(dirs::data_dir().unwrap().join("drop")));
-
-// Custom JSON serializer to support everything we need
-#[derive(Debug, Default, Clone)]
-pub struct DropDatabaseSerializer;
-
-impl DeSerializer
- for DropDatabaseSerializer
-{
- fn serialize(&self, val: &T) -> rustbreak::error::DeSerResult> {
- native_model::rmp_serde_1_3::RmpSerde::encode(val)
- .map_err(|e| DeSerError::Internal(e.to_string()))
- }
-
- fn deserialize(&self, mut s: R) -> rustbreak::error::DeSerResult {
- let mut buf = Vec::new();
- s.read_to_end(&mut buf)
- .map_err(|e| rustbreak::error::DeSerError::Other(e.into()))?;
- let val = native_model::rmp_serde_1_3::RmpSerde::decode(buf)
- .map_err(|e| DeSerError::Internal(e.to_string()))?;
- Ok(val)
- }
-}
-
-pub type DatabaseInterface =
- rustbreak::Database;
-
-pub trait DatabaseImpls {
- fn set_up_database() -> DatabaseInterface;
- fn database_is_set_up(&self) -> bool;
- fn fetch_base_url(&self) -> Url;
-}
-impl DatabaseImpls for DatabaseInterface {
- fn set_up_database() -> DatabaseInterface {
- let db_path = DATA_ROOT_DIR.join("drop.db");
- let games_base_dir = DATA_ROOT_DIR.join("games");
- let logs_root_dir = DATA_ROOT_DIR.join("logs");
- let cache_dir = DATA_ROOT_DIR.join("cache");
- let pfx_dir = DATA_ROOT_DIR.join("pfx");
-
- debug!("creating data directory at {DATA_ROOT_DIR:?}");
- create_dir_all(DATA_ROOT_DIR.as_path()).unwrap();
- create_dir_all(&games_base_dir).unwrap();
- create_dir_all(&logs_root_dir).unwrap();
- create_dir_all(&cache_dir).unwrap();
- create_dir_all(&pfx_dir).unwrap();
-
- let exists = fs::exists(db_path.clone()).unwrap();
-
- if exists {
- match PathDatabase::load_from_path(db_path.clone()) {
- Ok(db) => db,
- Err(e) => handle_invalid_database(e, db_path, games_base_dir, cache_dir),
- }
- } else {
- let default = Database::new(games_base_dir, None, cache_dir);
- debug!(
- "Creating database at path {}",
- db_path.as_os_str().to_str().unwrap()
- );
- PathDatabase::create_at_path(db_path, default).expect("Database could not be created")
- }
- }
-
- fn database_is_set_up(&self) -> bool {
- !self.borrow_data().unwrap().base_url.is_empty()
- }
-
- fn fetch_base_url(&self) -> Url {
- let handle = self.borrow_data().unwrap();
- Url::parse(&handle.base_url).unwrap()
- }
-}
-
-// TODO: Make the error relelvant rather than just assume that it's a Deserialize error
-fn handle_invalid_database(
- _e: RustbreakError,
- db_path: PathBuf,
- games_base_dir: PathBuf,
- cache_dir: PathBuf,
-) -> rustbreak::Database {
- warn!("{_e}");
- let new_path = {
- let time = Utc::now().timestamp();
- let mut base = db_path.clone();
- base.set_file_name(format!("drop.db.backup-{time}"));
- base
- };
- info!("old database stored at: {}", new_path.to_string_lossy());
- fs::rename(&db_path, &new_path).unwrap();
-
- let db = Database::new(
- games_base_dir.into_os_string().into_string().unwrap(),
- Some(new_path),
- cache_dir,
- );
-
- PathDatabase::create_at_path(db_path, db).expect("Database could not be created")
-}
-
-// To automatically save the database upon drop
-pub struct DBRead<'a>(RwLockReadGuard<'a, Database>);
-pub struct DBWrite<'a>(ManuallyDrop>);
-impl<'a> Deref for DBWrite<'a> {
- type Target = Database;
-
- fn deref(&self) -> &Self::Target {
- &self.0
- }
-}
-impl<'a> DerefMut for DBWrite<'a> {
- fn deref_mut(&mut self) -> &mut Self::Target {
- &mut self.0
- }
-}
-impl<'a> Deref for DBRead<'a> {
- type Target = Database;
-
- fn deref(&self) -> &Self::Target {
- &self.0
- }
-}
-impl Drop for DBWrite<'_> {
- fn drop(&mut self) {
- unsafe {
- ManuallyDrop::drop(&mut self.0);
- }
-
- match DB.save() {
- Ok(()) => {}
- Err(e) => {
- error!("database failed to save with error {e}");
- panic!("database failed to save with error {e}")
- }
- }
- }
-}
-
-pub fn borrow_db_checked<'a>() -> DBRead<'a> {
- match DB.borrow_data() {
- Ok(data) => DBRead(data),
- Err(e) => {
- error!("database borrow failed with error {e}");
- panic!("database borrow failed with error {e}");
- }
- }
-}
-
-pub fn borrow_db_mut_checked<'a>() -> DBWrite<'a> {
- match DB.borrow_data_mut() {
- Ok(data) => DBWrite(ManuallyDrop::new(data)),
- Err(e) => {
- error!("database borrow mut failed with error {e}");
- panic!("database borrow mut failed with error {e}");
- }
- }
-}
diff --git a/src-tauri/src/database/debug.rs b/src-tauri/src/database/debug.rs
deleted file mode 100644
index 45d2034..0000000
--- a/src-tauri/src/database/debug.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-use serde::Serialize;
-
-#[derive(Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SystemData {
- client_id: String,
- base_url: String,
- data_dir: String,
- log_level: String,
-}
-
-impl SystemData {
- pub fn new(client_id: String, base_url: String, data_dir: String, log_level: String) -> Self {
- Self {
- client_id,
- base_url,
- data_dir,
- log_level,
- }
- }
-}
diff --git a/src-tauri/src/database/mod.rs b/src-tauri/src/database/mod.rs
deleted file mode 100644
index 6c77e25..0000000
--- a/src-tauri/src/database/mod.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-pub mod commands;
-pub mod db;
-pub mod debug;
-pub mod models;
-pub mod scan;
\ No newline at end of file
diff --git a/src-tauri/src/database/models.rs b/src-tauri/src/database/models.rs
deleted file mode 100644
index a2997b2..0000000
--- a/src-tauri/src/database/models.rs
+++ /dev/null
@@ -1,351 +0,0 @@
-/**
- * NEXT BREAKING CHANGE
- *
- * UPDATE DATABASE TO USE RPMSERDENAMED
- *
- * WE CAN'T DELETE ANY FIELDS
- */
-pub mod data {
- use std::path::PathBuf;
-
-
- use native_model::native_model;
- use serde::{Deserialize, Serialize};
-
- pub type GameVersion = v1::GameVersion;
- pub type Database = v3::Database;
- pub type Settings = v1::Settings;
- pub type DatabaseAuth = v1::DatabaseAuth;
-
- pub type GameDownloadStatus = v2::GameDownloadStatus;
- pub type ApplicationTransientStatus = v1::ApplicationTransientStatus;
- pub type DownloadableMetadata = v1::DownloadableMetadata;
- pub type DownloadType = v1::DownloadType;
- pub type DatabaseApplications = v2::DatabaseApplications;
- pub type DatabaseCompatInfo = v2::DatabaseCompatInfo;
-
- use std::collections::HashMap;
-
- pub mod v1 {
- use crate::process::process_manager::Platform;
- use serde_with::serde_as;
- use std::{collections::HashMap, path::PathBuf};
-
- use super::{Deserialize, Serialize, native_model};
-
- fn default_template() -> String {
- "{}".to_owned()
- }
-
- #[derive(Serialize, Deserialize, Clone, Debug)]
- #[serde(rename_all = "camelCase")]
- #[native_model(id = 2, version = 1, with = native_model::rmp_serde_1_3::RmpSerde)]
- pub struct GameVersion {
- pub game_id: String,
- pub version_name: String,
-
- pub platform: Platform,
-
- pub launch_command: String,
- pub launch_args: Vec,
- #[serde(default = "default_template")]
- pub launch_command_template: String,
-
- pub setup_command: String,
- pub setup_args: Vec,
- #[serde(default = "default_template")]
- pub setup_command_template: String,
-
- pub only_setup: bool,
-
- pub version_index: usize,
- pub delta: bool,
-
- pub umu_id_override: Option,
- }
-
- #[serde_as]
- #[derive(Serialize, Clone, Deserialize, Default)]
- #[serde(rename_all = "camelCase")]
- #[native_model(id = 3, version = 1, with = native_model::rmp_serde_1_3::RmpSerde)]
- pub struct DatabaseApplications {
- pub install_dirs: Vec,
- // Guaranteed to exist if the game also exists in the app state map
- pub game_statuses: HashMap,
- pub game_versions: HashMap>,
- pub installed_game_version: HashMap,
-
- #[serde(skip)]
- pub transient_statuses: HashMap,
- }
-
- #[derive(Serialize, Deserialize, Clone, Debug)]
- #[serde(rename_all = "camelCase")]
- #[native_model(id = 4, version = 1, with = native_model::rmp_serde_1_3::RmpSerde)]
- pub struct Settings {
- pub autostart: bool,
- pub max_download_threads: usize,
- pub force_offline: bool, // ... other settings ...
- }
- impl Default for Settings {
- fn default() -> Self {
- Self {
- autostart: false,
- max_download_threads: 4,
- force_offline: false,
- }
- }
- }
-
- // Strings are version names for a particular game
- #[derive(Serialize, Clone, Deserialize)]
- #[serde(tag = "type")]
- #[native_model(id = 5, version = 1, with = native_model::rmp_serde_1_3::RmpSerde)]
- pub enum GameDownloadStatus {
- Remote {},
- SetupRequired {
- version_name: String,
- install_dir: String,
- },
- Installed {
- version_name: String,
- install_dir: String,
- },
- }
-
- // Stuff that shouldn't be synced to disk
- #[derive(Clone, Serialize, Deserialize, Debug)]
- pub enum ApplicationTransientStatus {
- Downloading { version_name: String },
- Uninstalling {},
- Updating { version_name: String },
- Validating { version_name: String },
- Running {},
- }
-
- #[derive(serde::Serialize, Clone, Deserialize)]
- #[native_model(id = 6, version = 1, with = native_model::rmp_serde_1_3::RmpSerde)]
- pub struct DatabaseAuth {
- pub private: String,
- pub cert: String,
- pub client_id: String,
- pub web_token: Option,
- }
-
- #[native_model(id = 8, version = 1)]
- #[derive(
- Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, Clone, Copy,
- )]
- pub enum DownloadType {
- Game,
- Tool,
- Dlc,
- Mod,
- }
-
- #[native_model(id = 7, version = 1, with = native_model::rmp_serde_1_3::RmpSerde)]
- #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, Clone)]
- #[serde(rename_all = "camelCase")]
- pub struct DownloadableMetadata {
- pub id: String,
- pub version: Option,
- pub download_type: DownloadType,
- }
- impl DownloadableMetadata {
- pub fn new(id: String, version: Option, download_type: DownloadType) -> Self {
- Self {
- id,
- version,
- download_type,
- }
- }
- }
-
- #[native_model(id = 1, version = 1)]
- #[derive(Serialize, Deserialize, Clone, Default)]
- pub struct Database {
- #[serde(default)]
- pub settings: Settings,
- pub auth: Option,
- pub base_url: String,
- pub applications: DatabaseApplications,
- pub prev_database: Option,
- pub cache_dir: PathBuf,
- }
- }
-
- pub mod v2 {
- use std::{collections::HashMap, path::PathBuf};
-
- use serde_with::serde_as;
-
- use super::{
- ApplicationTransientStatus, DatabaseAuth, Deserialize, DownloadableMetadata,
- GameVersion, Serialize, Settings, native_model, v1,
- };
-
- #[native_model(id = 1, version = 2, with = native_model::rmp_serde_1_3::RmpSerde)]
- #[derive(Serialize, Deserialize, Clone, Default)]
- pub struct Database {
- #[serde(default)]
- pub settings: Settings,
- pub auth: Option,
- pub base_url: String,
- pub applications: v1::DatabaseApplications,
- #[serde(skip)]
- pub prev_database: Option,
- pub cache_dir: PathBuf,
- pub compat_info: Option,
- }
-
- #[native_model(id = 8, version = 2, with = native_model::rmp_serde_1_3::RmpSerde)]
- #[derive(Serialize, Deserialize, Clone, Default)]
-
- pub struct DatabaseCompatInfo {
- pub umu_installed: bool,
- }
-
- impl From for Database {
- fn from(value: v1::Database) -> Self {
- Self {
- settings: value.settings,
- auth: value.auth,
- base_url: value.base_url,
- applications: value.applications,
- prev_database: value.prev_database,
- cache_dir: value.cache_dir,
- compat_info: None,
- }
- }
- }
- // Strings are version names for a particular game
- #[derive(Serialize, Clone, Deserialize, Debug)]
- #[serde(tag = "type")]
- #[native_model(id = 5, version = 2, with = native_model::rmp_serde_1_3::RmpSerde)]
- pub enum GameDownloadStatus {
- Remote {},
- SetupRequired {
- version_name: String,
- install_dir: String,
- },
- Installed {
- version_name: String,
- install_dir: String,
- },
- PartiallyInstalled {
- version_name: String,
- install_dir: String,
- },
- }
- impl From for GameDownloadStatus {
- fn from(value: v1::GameDownloadStatus) -> Self {
- match value {
- v1::GameDownloadStatus::Remote {} => Self::Remote {},
- v1::GameDownloadStatus::SetupRequired {
- version_name,
- install_dir,
- } => Self::SetupRequired {
- version_name,
- install_dir,
- },
- v1::GameDownloadStatus::Installed {
- version_name,
- install_dir,
- } => Self::Installed {
- version_name,
- install_dir,
- },
- }
- }
- }
- #[serde_as]
- #[derive(Serialize, Clone, Deserialize, Default)]
- #[serde(rename_all = "camelCase")]
- #[native_model(id = 3, version = 2, with = native_model::rmp_serde_1_3::RmpSerde)]
- pub struct DatabaseApplications {
- pub install_dirs: Vec,
- // Guaranteed to exist if the game also exists in the app state map
- pub game_statuses: HashMap,
-
- pub game_versions: HashMap>,
- pub installed_game_version: HashMap,
-
- #[serde(skip)]
- pub transient_statuses: HashMap,
- }
- impl From for DatabaseApplications {
- fn from(value: v1::DatabaseApplications) -> Self {
- Self {
- game_statuses: value
- .game_statuses
- .into_iter()
- .map(|x| (x.0, x.1.into()))
- .collect::>(),
- install_dirs: value.install_dirs,
- game_versions: value.game_versions,
- installed_game_version: value.installed_game_version,
- transient_statuses: value.transient_statuses,
- }
- }
- }
- }
- mod v3 {
- use std::path::PathBuf;
-
- use super::{
- DatabaseApplications, DatabaseAuth, DatabaseCompatInfo, Deserialize, Serialize,
- Settings, native_model, v2,
- };
- #[native_model(id = 1, version = 3, with = native_model::rmp_serde_1_3::RmpSerde)]
- #[derive(Serialize, Deserialize, Clone, Default)]
- pub struct Database {
- #[serde(default)]
- pub settings: Settings,
- pub auth: Option,
- pub base_url: String,
- pub applications: DatabaseApplications,
- #[serde(skip)]
- pub prev_database: Option,
- pub cache_dir: PathBuf,
- pub compat_info: Option,
- }
-
- impl From for Database {
- fn from(value: v2::Database) -> Self {
- Self {
- settings: value.settings,
- auth: value.auth,
- base_url: value.base_url,
- applications: value.applications.into(),
- prev_database: value.prev_database,
- cache_dir: value.cache_dir,
- compat_info: None,
- }
- }
- }
- }
-
- impl Database {
- pub fn new>(
- games_base_dir: T,
- prev_database: Option,
- cache_dir: PathBuf,
- ) -> Self {
- Self {
- applications: DatabaseApplications {
- install_dirs: vec![games_base_dir.into()],
- game_statuses: HashMap::new(),
- game_versions: HashMap::new(),
- installed_game_version: HashMap::new(),
- transient_statuses: HashMap::new(),
- },
- prev_database,
- base_url: String::new(),
- auth: None,
- settings: Settings::default(),
- cache_dir,
- compat_info: None,
- }
- }
- }
-}
diff --git a/src-tauri/src/database/scan.rs b/src-tauri/src/database/scan.rs
deleted file mode 100644
index 326aee5..0000000
--- a/src-tauri/src/database/scan.rs
+++ /dev/null
@@ -1,52 +0,0 @@
-use std::fs;
-
-use log::warn;
-
-use crate::{
- database::{
- db::borrow_db_mut_checked,
- models::data::v1::{DownloadType, DownloadableMetadata},
- },
- games::{
- downloads::drop_data::{v1::DropData, DROP_DATA_PATH},
- library::set_partially_installed_db,
- },
-};
-
-pub fn scan_install_dirs() {
- let mut db_lock = borrow_db_mut_checked();
- for install_dir in db_lock.applications.install_dirs.clone() {
- let Ok(files) = fs::read_dir(install_dir) else {
- continue;
- };
- for game in files.into_iter().flatten() {
- let drop_data_file = game.path().join(DROP_DATA_PATH);
- if !drop_data_file.exists() {
- continue;
- }
- let game_id = game.file_name().into_string().unwrap();
- let Ok(drop_data) = DropData::read(&game.path()) else {
- warn!(
- ".dropdata exists for {}, but couldn't read it. is it corrupted?",
- game.file_name().into_string().unwrap()
- );
- continue;
- };
- if db_lock.applications.game_statuses.contains_key(&game_id) {
- continue;
- }
-
- let metadata = DownloadableMetadata::new(
- drop_data.game_id,
- Some(drop_data.game_version),
- DownloadType::Game,
- );
- set_partially_installed_db(
- &mut db_lock,
- &metadata,
- drop_data.base_path.to_str().unwrap().to_string(),
- None,
- );
- }
- }
-}
diff --git a/src-tauri/src/db.rs b/src-tauri/src/db.rs
new file mode 100644
index 0000000..662d943
--- /dev/null
+++ b/src-tauri/src/db.rs
@@ -0,0 +1,210 @@
+use std::{
+ collections::HashMap,
+ fs::{self, create_dir_all},
+ path::{Path, PathBuf},
+ sync::{LazyLock, Mutex},
+};
+
+use directories::BaseDirs;
+use log::debug;
+use rustbreak::{DeSerError, DeSerializer, PathDatabase};
+use serde::{de::DeserializeOwned, Deserialize, Serialize};
+use url::Url;
+
+use crate::{process::process_manager::Platform, DB};
+
+#[derive(serde::Serialize, Clone, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct DatabaseAuth {
+ pub private: String,
+ pub cert: String,
+ pub client_id: String,
+}
+
+pub struct GameStatusData {
+ version_name: String,
+ install_dir: String,
+}
+
+// Strings are version names for a particular game
+#[derive(Serialize, Clone, Deserialize)]
+#[serde(tag = "type")]
+pub enum GameStatus {
+ Remote {},
+ SetupRequired {
+ version_name: String,
+ install_dir: String,
+ },
+ Installed {
+ version_name: String,
+ install_dir: String,
+ },
+}
+
+// Stuff that shouldn't be synced to disk
+#[derive(Clone, Serialize)]
+pub enum GameTransientStatus {
+ Downloading { version_name: String },
+ Uninstalling {},
+ Updating { version_name: String },
+ Running {},
+}
+
+#[derive(Serialize, Deserialize, Clone)]
+#[serde(rename_all = "camelCase")]
+pub struct GameVersion {
+ pub version_index: usize,
+ pub version_name: String,
+ pub launch_command: String,
+ pub setup_command: String,
+ pub platform: Platform,
+}
+
+#[derive(Serialize, Clone, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct DatabaseGames {
+ pub install_dirs: Vec,
+ // Guaranteed to exist if the game also exists in the app state map
+ pub statuses: HashMap,
+ pub versions: HashMap>,
+
+ #[serde(skip)]
+ pub transient_statuses: HashMap,
+}
+
+#[derive(Serialize, Clone, Deserialize)]
+#[serde(rename_all = "camelCase")]
+pub struct Database {
+ pub auth: Option,
+ pub base_url: String,
+ pub games: DatabaseGames,
+}
+pub static DATA_ROOT_DIR: LazyLock> =
+ LazyLock::new(|| Mutex::new(BaseDirs::new().unwrap().data_dir().join("drop")));
+
+// Custom JSON serializer to support everything we need
+#[derive(Debug, Default, Clone)]
+pub struct DropDatabaseSerializer;
+
+impl DeSerializer for DropDatabaseSerializer {
+ fn serialize(&self, val: &T) -> rustbreak::error::DeSerResult> {
+ serde_json::to_vec(val).map_err(|e| DeSerError::Internal(e.to_string()))
+ }
+
+ fn deserialize(&self, s: R) -> rustbreak::error::DeSerResult {
+ serde_json::from_reader(s).map_err(|e| DeSerError::Internal(e.to_string()))
+ }
+}
+
+pub type DatabaseInterface =
+ rustbreak::Database;
+
+pub trait DatabaseImpls {
+ fn set_up_database() -> DatabaseInterface;
+ fn database_is_set_up(&self) -> bool;
+ fn fetch_base_url(&self) -> Url;
+}
+impl DatabaseImpls for DatabaseInterface {
+ fn set_up_database() -> DatabaseInterface {
+ let data_root_dir = DATA_ROOT_DIR.lock().unwrap();
+ let db_path = data_root_dir.join("drop.db");
+ let games_base_dir = data_root_dir.join("games");
+ let logs_root_dir = data_root_dir.join("logs");
+
+ debug!("Creating data directory at {:?}", data_root_dir);
+ create_dir_all(data_root_dir.clone()).unwrap();
+ debug!("Creating games directory");
+ create_dir_all(games_base_dir.clone()).unwrap();
+ debug!("Creating logs directory");
+ create_dir_all(logs_root_dir.clone()).unwrap();
+
+ #[allow(clippy::let_and_return)]
+ let exists = fs::exists(db_path.clone()).unwrap();
+
+ match exists {
+ true => PathDatabase::load_from_path(db_path).expect("Database loading failed"),
+ false => {
+ let default = Database {
+ auth: None,
+ base_url: "".to_string(),
+ games: DatabaseGames {
+ install_dirs: vec![games_base_dir.to_str().unwrap().to_string()],
+ statuses: HashMap::new(),
+ transient_statuses: HashMap::new(),
+ versions: HashMap::new(),
+ },
+ };
+ debug!(
+ "Creating database at path {}",
+ db_path.as_os_str().to_str().unwrap()
+ );
+ PathDatabase::create_at_path(db_path, default)
+ .expect("Database could not be created")
+ }
+ }
+ }
+
+ fn database_is_set_up(&self) -> bool {
+ !self.borrow_data().unwrap().base_url.is_empty()
+ }
+
+ fn fetch_base_url(&self) -> Url {
+ let handle = self.borrow_data().unwrap();
+ Url::parse(&handle.base_url).unwrap()
+ }
+}
+
+#[tauri::command]
+pub fn add_download_dir(new_dir: String) -> Result<(), String> {
+ // Check the new directory is all good
+ let new_dir_path = Path::new(&new_dir);
+ if new_dir_path.exists() {
+ let metadata = new_dir_path
+ .metadata()
+ .map_err(|e| format!("Unable to access file or directory: {}", e))?;
+ if !metadata.is_dir() {
+ return Err("Invalid path: not a directory".to_string());
+ }
+ let dir_contents = new_dir_path
+ .read_dir()
+ .map_err(|e| format!("Unable to check directory contents: {}", e))?;
+ if dir_contents.count() != 0 {
+ return Err("Directory is not empty".to_string());
+ }
+ } else {
+ create_dir_all(new_dir_path)
+ .map_err(|e| format!("Unable to create directories to path: {}", e))?;
+ }
+
+ // Add it to the dictionary
+ let mut lock = DB.borrow_data_mut().unwrap();
+ if lock.games.install_dirs.contains(&new_dir) {
+ return Err("Download directory already used".to_string());
+ }
+ lock.games.install_dirs.push(new_dir);
+ drop(lock);
+ DB.save().unwrap();
+
+ Ok(())
+}
+
+#[tauri::command]
+pub fn delete_download_dir(index: usize) -> Result<(), String> {
+ let mut lock = DB.borrow_data_mut().unwrap();
+ lock.games.install_dirs.remove(index);
+ drop(lock);
+ DB.save().unwrap();
+
+ Ok(())
+}
+
+// Will, in future, return disk/remaining size
+// Just returns the directories that have been set up
+#[tauri::command]
+pub fn fetch_download_dir_stats() -> Result, String> {
+ let lock = DB.borrow_data().unwrap();
+ let directories = lock.games.install_dirs.clone();
+ drop(lock);
+
+ Ok(directories)
+}
diff --git a/src-tauri/src/download_manager/commands.rs b/src-tauri/src/download_manager/commands.rs
deleted file mode 100644
index e336c23..0000000
--- a/src-tauri/src/download_manager/commands.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-use std::sync::Mutex;
-
-use crate::{database::models::data::DownloadableMetadata, AppState};
-
-#[tauri::command]
-pub fn pause_downloads(state: tauri::State<'_, Mutex>) {
- state.lock().unwrap().download_manager.pause_downloads();
-}
-
-#[tauri::command]
-pub fn resume_downloads(state: tauri::State<'_, Mutex>) {
- state.lock().unwrap().download_manager.resume_downloads();
-}
-
-#[tauri::command]
-pub fn move_download_in_queue(
- state: tauri::State<'_, Mutex>,
- old_index: usize,
- new_index: usize,
-) {
- state
- .lock()
- .unwrap()
- .download_manager
- .rearrange(old_index, new_index);
-}
-
-#[tauri::command]
-pub fn cancel_game(state: tauri::State<'_, Mutex>, meta: DownloadableMetadata) {
- state.lock().unwrap().download_manager.cancel(meta);
-}
diff --git a/src-tauri/src/download_manager/download_manager_builder.rs b/src-tauri/src/download_manager/download_manager_builder.rs
deleted file mode 100644
index ecee16c..0000000
--- a/src-tauri/src/download_manager/download_manager_builder.rs
+++ /dev/null
@@ -1,400 +0,0 @@
-use std::{
- collections::HashMap,
- sync::{
- Arc, Mutex,
- mpsc::{Receiver, Sender, channel},
- },
- thread::{JoinHandle, spawn},
-};
-
-use log::{debug, error, info, warn};
-use tauri::{AppHandle, Emitter};
-
-use crate::{
- database::models::data::DownloadableMetadata,
- error::application_download_error::ApplicationDownloadError,
- games::library::{QueueUpdateEvent, QueueUpdateEventQueueData, StatsUpdateEvent},
-};
-
-use super::{
- download_manager_frontend::{DownloadManager, DownloadManagerSignal, DownloadManagerStatus},
- downloadable::Downloadable,
- util::{
- download_thread_control_flag::{DownloadThreadControl, DownloadThreadControlFlag},
- progress_object::ProgressObject,
- queue::Queue,
- },
-};
-
-pub type DownloadAgent = Arc>;
-pub type CurrentProgressObject = Arc>>>;
-
-/*
-
-Welcome to the download manager, the most overengineered, glorious piece of bullshit.
-
-The download manager takes a queue of ids and their associated
-DownloadAgents, and then, one-by-one, executes them. It provides an interface
-to interact with the currently downloading agent, and manage the queue.
-
-When the DownloadManager is initialised, it is designed to provide a reference
-which can be used to provide some instructions (the DownloadManagerInterface),
-but other than that, it runs without any sort of interruptions.
-
-It does this by opening up two data structures. Primarily is the command_receiver,
-and mpsc (multi-channel-single-producer) which allows commands to be sent from
-the Interface, and queued up for the Manager to process.
-
-These have been mapped in the DownloadManagerSignal docs.
-
-The other way to interact with the DownloadManager is via the donwload_queue,
-which is just a collection of ids which may be rearranged to suit
-whichever download queue order is required.
-
-+----------------------------------------------------------------------------+
-| DO NOT ATTEMPT TO ADD OR REMOVE FROM THE QUEUE WITHOUT USING SIGNALS!! |
-| THIS WILL CAUSE A DESYNC BETWEEN THE DOWNLOAD AGENT REGISTRY AND THE QUEUE |
-| WHICH HAS NOT BEEN ACCOUNTED FOR |
-+----------------------------------------------------------------------------+
-
-This download queue does not actually own any of the DownloadAgents. It is
-simply an id-based reference system. The actual Agents are stored in the
-download_agent_registry HashMap, as ordering is no issue here. This is why
-appending or removing from the download_queue must be done via signals.
-
-Behold, my madness - quexeky
-
-*/
-
-pub struct DownloadManagerBuilder {
- download_agent_registry: HashMap,
- download_queue: Queue,
- command_receiver: Receiver,
- sender: Sender,
- progress: CurrentProgressObject,
- status: Arc>,
- app_handle: AppHandle,
-
- current_download_agent: Option, // Should be the only download agent in the map with the "Go" flag
- current_download_thread: Mutex>>,
- active_control_flag: Option,
-}
-impl DownloadManagerBuilder {
- pub fn build(app_handle: AppHandle) -> DownloadManager {
- let queue = Queue::new();
- let (command_sender, command_receiver) = channel();
- let active_progress = Arc::new(Mutex::new(None));
- let status = Arc::new(Mutex::new(DownloadManagerStatus::Empty));
-
- let manager = Self {
- download_agent_registry: HashMap::new(),
- download_queue: queue.clone(),
- command_receiver,
- status: status.clone(),
- sender: command_sender.clone(),
- progress: active_progress.clone(),
- app_handle,
-
- current_download_agent: None,
- current_download_thread: Mutex::new(None),
- active_control_flag: None,
- };
-
- let terminator = spawn(|| manager.manage_queue());
-
- DownloadManager::new(terminator, queue, active_progress, command_sender)
- }
-
- fn set_status(&self, status: DownloadManagerStatus) {
- *self.status.lock().unwrap() = status;
- }
-
- fn remove_and_cleanup_front_download(&mut self, meta: &DownloadableMetadata) -> DownloadAgent {
- self.download_queue.pop_front();
- let download_agent = self.download_agent_registry.remove(meta).unwrap();
- self.cleanup_current_download();
- download_agent
- }
-
- // CAREFUL WITH THIS FUNCTION
- // Make sure the download thread is terminated
- fn cleanup_current_download(&mut self) {
- self.active_control_flag = None;
- *self.progress.lock().unwrap() = None;
- self.current_download_agent = None;
-
- let mut download_thread_lock = self.current_download_thread.lock().unwrap();
-
- if let Some(unfinished_thread) = download_thread_lock.take()
- && !unfinished_thread.is_finished()
- {
- unfinished_thread.join().unwrap();
- }
- drop(download_thread_lock);
- }
-
- fn stop_and_wait_current_download(&self) -> bool {
- self.set_status(DownloadManagerStatus::Paused);
- if let Some(current_flag) = &self.active_control_flag {
- current_flag.set(DownloadThreadControlFlag::Stop);
- }
-
- let mut download_thread_lock = self.current_download_thread.lock().unwrap();
- if let Some(current_download_thread) = download_thread_lock.take() {
- return current_download_thread.join().is_ok();
- };
-
- true
- }
-
- fn manage_queue(mut self) -> Result<(), ()> {
- loop {
- let signal = match self.command_receiver.recv() {
- Ok(signal) => signal,
- Err(_) => return Err(()),
- };
-
- match signal {
- DownloadManagerSignal::Go => {
- self.manage_go_signal();
- }
- DownloadManagerSignal::Stop => {
- self.manage_stop_signal();
- }
- DownloadManagerSignal::Completed(meta) => {
- self.manage_completed_signal(meta);
- }
- DownloadManagerSignal::Queue(download_agent) => {
- self.manage_queue_signal(download_agent);
- }
- DownloadManagerSignal::Error(e) => {
- self.manage_error_signal(e);
- }
- DownloadManagerSignal::UpdateUIQueue => {
- self.push_ui_queue_update();
- }
- DownloadManagerSignal::UpdateUIStats(kbs, time) => {
- self.push_ui_stats_update(kbs, time);
- }
- DownloadManagerSignal::Finish => {
- self.stop_and_wait_current_download();
- return Ok(());
- }
- DownloadManagerSignal::Cancel(meta) => {
- self.manage_cancel_signal(&meta);
- }
- }
- }
- }
- fn manage_queue_signal(&mut self, download_agent: DownloadAgent) {
- debug!("got signal Queue");
- let meta = download_agent.metadata();
-
- debug!("queue metadata: {meta:?}");
-
- if self.download_queue.exists(meta.clone()) {
- warn!("download with same ID already exists");
- return;
- }
-
- download_agent.on_initialised(&self.app_handle);
- self.download_queue.append(meta.clone());
- self.download_agent_registry.insert(meta, download_agent);
-
- self.sender
- .send(DownloadManagerSignal::UpdateUIQueue)
- .unwrap();
- }
-
- fn manage_go_signal(&mut self) {
- debug!("got signal Go");
- if self.download_agent_registry.is_empty() {
- debug!(
- "Download agent registry: {:?}",
- self.download_agent_registry.len()
- );
- return;
- }
-
- if self.current_download_agent.is_some()
- && self.download_queue.read().front().unwrap()
- == &self.current_download_agent.as_ref().unwrap().metadata()
- {
- return;
- }
-
- debug!("current download queue: {:?}", self.download_queue.read());
-
- // Should always be Some if the above two statements keep going
- let agent_data = self.download_queue.read().front().unwrap().clone();
-
- info!("starting download for {agent_data:?}");
-
- let download_agent = self
- .download_agent_registry
- .get(&agent_data)
- .unwrap()
- .clone();
-
- self.active_control_flag = Some(download_agent.control_flag());
- self.current_download_agent = Some(download_agent.clone());
-
- let sender = self.sender.clone();
-
- let mut download_thread_lock = self.current_download_thread.lock().unwrap();
- let app_handle = self.app_handle.clone();
-
- *download_thread_lock = Some(spawn(move || {
- loop {
- let download_result = match download_agent.download(&app_handle) {
- // Ok(true) is for completed and exited properly
- Ok(v) => v,
- Err(e) => {
- error!("download {:?} has error {}", download_agent.metadata(), &e);
- download_agent.on_error(&app_handle, &e);
- sender.send(DownloadManagerSignal::Error(e)).unwrap();
- return;
- }
- };
-
- // If the download gets canceled
- // immediately return, on_cancelled gets called for us earlier
- if !download_result {
- return;
- }
-
- if download_agent.control_flag().get() == DownloadThreadControlFlag::Stop {
- return;
- }
-
- let validate_result = match download_agent.validate(&app_handle) {
- Ok(v) => v,
- Err(e) => {
- error!(
- "download {:?} has validation error {}",
- download_agent.metadata(),
- &e
- );
- download_agent.on_error(&app_handle, &e);
- sender.send(DownloadManagerSignal::Error(e)).unwrap();
- return;
- }
- };
-
- if download_agent.control_flag().get() == DownloadThreadControlFlag::Stop {
- return;
- }
-
- if validate_result {
- download_agent.on_complete(&app_handle);
- sender
- .send(DownloadManagerSignal::Completed(download_agent.metadata()))
- .unwrap();
- sender.send(DownloadManagerSignal::UpdateUIQueue).unwrap();
- return;
- }
- }
- }));
-
- self.set_status(DownloadManagerStatus::Downloading);
- let active_control_flag = self.active_control_flag.clone().unwrap();
- active_control_flag.set(DownloadThreadControlFlag::Go);
- }
- fn manage_stop_signal(&mut self) {
- debug!("got signal Stop");
-
- if let Some(active_control_flag) = self.active_control_flag.clone() {
- self.set_status(DownloadManagerStatus::Paused);
- active_control_flag.set(DownloadThreadControlFlag::Stop);
- }
- }
- fn manage_completed_signal(&mut self, meta: DownloadableMetadata) {
- debug!("got signal Completed");
- if let Some(interface) = &self.current_download_agent
- && interface.metadata() == meta
- {
- self.remove_and_cleanup_front_download(&meta);
- }
-
- self.push_ui_queue_update();
- self.sender.send(DownloadManagerSignal::Go).unwrap();
- }
- fn manage_error_signal(&mut self, error: ApplicationDownloadError) {
- debug!("got signal Error");
- if let Some(current_agent) = self.current_download_agent.clone() {
- current_agent.on_error(&self.app_handle, &error);
-
- self.stop_and_wait_current_download();
- self.remove_and_cleanup_front_download(¤t_agent.metadata());
- }
- self.push_ui_queue_update();
- self.set_status(DownloadManagerStatus::Error);
- }
- fn manage_cancel_signal(&mut self, meta: &DownloadableMetadata) {
- debug!("got signal Cancel");
-
- if let Some(current_download) = &self.current_download_agent {
- if ¤t_download.metadata() == meta {
- self.set_status(DownloadManagerStatus::Paused);
- current_download.on_cancelled(&self.app_handle);
- self.stop_and_wait_current_download();
-
- self.download_queue.pop_front();
-
- self.cleanup_current_download();
- debug!("current download queue: {:?}", self.download_queue.read());
- }
- // TODO: Collapse these two into a single if statement somehow
- else if let Some(download_agent) = self.download_agent_registry.get(meta) {
- let index = self.download_queue.get_by_meta(meta);
- if let Some(index) = index {
- download_agent.on_cancelled(&self.app_handle);
- let _ = self.download_queue.edit().remove(index).unwrap();
- let removed = self.download_agent_registry.remove(meta);
- debug!(
- "removed {:?} from queue {:?}",
- removed.map(|x| x.metadata()),
- self.download_queue.read()
- );
- }
- }
- } else if let Some(download_agent) = self.download_agent_registry.get(meta) {
- let index = self.download_queue.get_by_meta(meta);
- if let Some(index) = index {
- download_agent.on_cancelled(&self.app_handle);
- let _ = self.download_queue.edit().remove(index).unwrap();
- let removed = self.download_agent_registry.remove(meta);
- debug!(
- "removed {:?} from queue {:?}",
- removed.map(|x| x.metadata()),
- self.download_queue.read()
- );
- }
- }
- self.push_ui_queue_update();
- }
- fn push_ui_stats_update(&self, kbs: usize, time: usize) {
- let event_data = StatsUpdateEvent { speed: kbs, time };
-
- self.app_handle.emit("update_stats", event_data).unwrap();
- }
- fn push_ui_queue_update(&self) {
- let queue = &self.download_queue.read();
- let queue_objs = queue
- .iter()
- .map(|key| {
- let val = self.download_agent_registry.get(key).unwrap();
- QueueUpdateEventQueueData {
- meta: DownloadableMetadata::clone(key),
- status: val.status(),
- progress: val.progress().get_progress(),
- current: val.progress().sum(),
- max: val.progress().get_max(),
- }
- })
- .collect();
-
- let event_data = QueueUpdateEvent { queue: queue_objs };
- self.app_handle.emit("update_queue", event_data).unwrap();
- }
-}
diff --git a/src-tauri/src/download_manager/downloadable.rs b/src-tauri/src/download_manager/downloadable.rs
deleted file mode 100644
index 9a74077..0000000
--- a/src-tauri/src/download_manager/downloadable.rs
+++ /dev/null
@@ -1,27 +0,0 @@
-use std::sync::Arc;
-
-use tauri::AppHandle;
-
-use crate::{
- database::models::data::DownloadableMetadata,
- error::application_download_error::ApplicationDownloadError,
-};
-
-use super::{
- download_manager_frontend::DownloadStatus,
- util::{download_thread_control_flag::DownloadThreadControl, progress_object::ProgressObject},
-};
-
-pub trait Downloadable: Send + Sync {
- fn download(&self, app_handle: &AppHandle) -> Result;
- fn validate(&self, app_handle: &AppHandle) -> Result;
-
- fn progress(&self) -> Arc;
- fn control_flag(&self) -> DownloadThreadControl;
- fn status(&self) -> DownloadStatus;
- fn metadata(&self) -> DownloadableMetadata;
- fn on_initialised(&self, app_handle: &AppHandle);
- fn on_error(&self, app_handle: &AppHandle, error: &ApplicationDownloadError);
- fn on_complete(&self, app_handle: &AppHandle);
- fn on_cancelled(&self, app_handle: &AppHandle);
-}
diff --git a/src-tauri/src/download_manager/mod.rs b/src-tauri/src/download_manager/mod.rs
deleted file mode 100644
index 756a1ad..0000000
--- a/src-tauri/src/download_manager/mod.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-pub mod commands;
-pub mod download_manager_builder;
-pub mod download_manager_frontend;
-pub mod downloadable;
-pub mod util;
diff --git a/src-tauri/src/download_manager/util/mod.rs b/src-tauri/src/download_manager/util/mod.rs
deleted file mode 100644
index 5476d22..0000000
--- a/src-tauri/src/download_manager/util/mod.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-pub mod download_thread_control_flag;
-pub mod progress_object;
-pub mod queue;
-pub mod rolling_progress_updates;
diff --git a/src-tauri/src/download_manager/util/progress_object.rs b/src-tauri/src/download_manager/util/progress_object.rs
deleted file mode 100644
index c2c0c2f..0000000
--- a/src-tauri/src/download_manager/util/progress_object.rs
+++ /dev/null
@@ -1,165 +0,0 @@
-use std::{
- sync::{
- Arc, Mutex,
- atomic::{AtomicUsize, Ordering},
- mpsc::Sender,
- },
- time::{Duration, Instant},
-};
-
-use atomic_instant_full::AtomicInstant;
-use throttle_my_fn::throttle;
-
-use crate::download_manager::download_manager_frontend::DownloadManagerSignal;
-
-use super::rolling_progress_updates::RollingProgressWindow;
-
-#[derive(Clone)]
-pub struct ProgressObject {
- max: Arc>,
- progress_instances: Arc>>>,
- start: Arc>,
- sender: Sender,
- //last_update: Arc>,
- last_update_time: Arc,
- bytes_last_update: Arc,
- rolling: RollingProgressWindow<1>,
-}
-
-#[derive(Clone)]
-pub struct ProgressHandle {
- progress: Arc,
- progress_object: Arc,
-}
-
-impl ProgressHandle {
- pub fn new(progress: Arc, progress_object: Arc) -> Self {
- Self {
- progress,
- progress_object,
- }
- }
- pub fn set(&self, amount: usize) {
- self.progress.store(amount, Ordering::Release);
- }
- pub fn add(&self, amount: usize) {
- self.progress
- .fetch_add(amount, std::sync::atomic::Ordering::AcqRel);
- calculate_update(&self.progress_object);
- }
- pub fn skip(&self, amount: usize) {
- self.progress
- .fetch_add(amount, std::sync::atomic::Ordering::Acquire);
- // Offset the bytes at last offset by this amount
- self.progress_object
- .bytes_last_update
- .fetch_add(amount, Ordering::Acquire);
- // Dont' fire update
- }
-}
-
-impl ProgressObject {
- pub fn new(max: usize, length: usize, sender: Sender) -> Self {
- let arr = Mutex::new((0..length).map(|_| Arc::new(AtomicUsize::new(0))).collect());
- Self {
- max: Arc::new(Mutex::new(max)),
- progress_instances: Arc::new(arr),
- start: Arc::new(Mutex::new(Instant::now())),
- sender,
-
- last_update_time: Arc::new(AtomicInstant::now()),
- bytes_last_update: Arc::new(AtomicUsize::new(0)),
- rolling: RollingProgressWindow::new(),
- }
- }
-
- pub fn set_time_now(&self) {
- *self.start.lock().unwrap() = Instant::now();
- }
- pub fn sum(&self) -> usize {
- self.progress_instances
- .lock()
- .unwrap()
- .iter()
- .map(|instance| instance.load(Ordering::Acquire))
- .sum()
- }
- pub fn reset(&self) {
- self.set_time_now();
- self.bytes_last_update.store(0, Ordering::Release);
- self.rolling.reset();
- self.progress_instances
- .lock()
- .unwrap()
- .iter()
- .for_each(|x| x.store(0, Ordering::SeqCst));
- }
- pub fn get_max(&self) -> usize {
- *self.max.lock().unwrap()
- }
- pub fn set_max(&self, new_max: usize) {
- *self.max.lock().unwrap() = new_max;
- }
- pub fn set_size(&self, length: usize) {
- *self.progress_instances.lock().unwrap() =
- (0..length).map(|_| Arc::new(AtomicUsize::new(0))).collect();
- }
- pub fn get_progress(&self) -> f64 {
- self.sum() as f64 / self.get_max() as f64
- }
- pub fn get(&self, index: usize) -> Arc {
- self.progress_instances.lock().unwrap()[index].clone()
- }
- fn update_window(&self, kilobytes_per_second: usize) {
- self.rolling.update(kilobytes_per_second);
- }
-}
-
-#[throttle(1, Duration::from_millis(20))]
-pub fn calculate_update(progress: &ProgressObject) {
- let last_update_time = progress
- .last_update_time
- .swap(Instant::now(), Ordering::SeqCst);
- let time_since_last_update = Instant::now().duration_since(last_update_time).as_millis();
-
- let current_bytes_downloaded = progress.sum();
- let max = progress.get_max();
- let bytes_at_last_update = progress
- .bytes_last_update
- .swap(current_bytes_downloaded, Ordering::Acquire);
-
- let bytes_since_last_update = current_bytes_downloaded.saturating_sub(bytes_at_last_update);
-
- let kilobytes_per_second = bytes_since_last_update / (time_since_last_update as usize).max(1);
-
- let bytes_remaining = max.saturating_sub(current_bytes_downloaded); // bytes
-
- progress.update_window(kilobytes_per_second);
- push_update(progress, bytes_remaining);
-}
-
-#[throttle(1, Duration::from_millis(500))]
-pub fn push_update(progress: &ProgressObject, bytes_remaining: usize) {
- let average_speed = progress.rolling.get_average();
- let time_remaining = (bytes_remaining / 1000) / average_speed.max(1);
-
- update_ui(progress, average_speed, time_remaining);
- update_queue(progress);
-}
-
-fn update_ui(progress_object: &ProgressObject, kilobytes_per_second: usize, time_remaining: usize) {
- progress_object
- .sender
- .send(DownloadManagerSignal::UpdateUIStats(
- kilobytes_per_second,
- time_remaining,
- ))
- .unwrap();
-}
-
-fn update_queue(progress: &ProgressObject) {
- progress
- .sender
- .send(DownloadManagerSignal::UpdateUIQueue)
- .unwrap();
-}
diff --git a/src-tauri/src/download_manager/util/queue.rs b/src-tauri/src/download_manager/util/queue.rs
deleted file mode 100644
index c4fda82..0000000
--- a/src-tauri/src/download_manager/util/queue.rs
+++ /dev/null
@@ -1,44 +0,0 @@
-use std::{
- collections::VecDeque,
- sync::{Arc, Mutex, MutexGuard},
-};
-
-use crate::database::models::data::DownloadableMetadata;
-
-#[derive(Clone)]
-pub struct Queue {
- inner: Arc>>,
-}
-
-#[allow(dead_code)]
-impl Default for Queue {
- fn default() -> Self {
- Self::new()
- }
-}
-
-impl Queue {
- pub fn new() -> Self {
- Self {
- inner: Arc::new(Mutex::new(VecDeque::new())),
- }
- }
- pub fn read(&self) -> VecDeque {
- self.inner.lock().unwrap().clone()
- }
- pub fn edit(&self) -> MutexGuard<'_, VecDeque> {
- self.inner.lock().unwrap()
- }
- pub fn pop_front(&self) -> Option {
- self.edit().pop_front()
- }
- pub fn exists(&self, meta: DownloadableMetadata) -> bool {
- self.read().contains(&meta)
- }
- pub fn append(&self, interface: DownloadableMetadata) {
- self.edit().push_back(interface);
- }
- pub fn get_by_meta(&self, meta: &DownloadableMetadata) -> Option {
- self.read().iter().position(|data| data == meta)
- }
-}
diff --git a/src-tauri/src/download_manager/util/rolling_progress_updates.rs b/src-tauri/src/download_manager/util/rolling_progress_updates.rs
deleted file mode 100644
index fadae99..0000000
--- a/src-tauri/src/download_manager/util/rolling_progress_updates.rs
+++ /dev/null
@@ -1,38 +0,0 @@
-use std::sync::{
- atomic::{AtomicUsize, Ordering},
- Arc,
-};
-
-#[derive(Clone)]
-pub struct RollingProgressWindow {
- window: Arc<[AtomicUsize; S]>,
- current: Arc,
-}
-impl RollingProgressWindow {
- pub fn new() -> Self {
- Self {
- window: Arc::new([(); S].map(|()| AtomicUsize::new(0))),
- current: Arc::new(AtomicUsize::new(0)),
- }
- }
- pub fn update(&self, kilobytes_per_second: usize) {
- let index = self.current.fetch_add(1, Ordering::SeqCst);
- let current = &self.window[index % S];
- current.store(kilobytes_per_second, Ordering::SeqCst);
- }
- pub fn get_average(&self) -> usize {
- let current = self.current.load(Ordering::SeqCst);
- self.window
- .iter()
- .enumerate()
- .filter(|(i, _)| i < ¤t)
- .map(|(_, x)| x.load(Ordering::Acquire))
- .sum::()
- / S
- }
- pub fn reset(&self) {
- self.window
- .iter()
- .for_each(|x| x.store(0, Ordering::Release));
- }
-}
diff --git a/src-tauri/src/downloads/download_agent.rs b/src-tauri/src/downloads/download_agent.rs
new file mode 100644
index 0000000..8b070be
--- /dev/null
+++ b/src-tauri/src/downloads/download_agent.rs
@@ -0,0 +1,331 @@
+use crate::auth::generate_authorization_header;
+use crate::db::DatabaseImpls;
+use crate::downloads::manifest::{DropDownloadContext, DropManifest};
+use crate::downloads::progress_object::ProgressHandle;
+use crate::remote::RemoteAccessError;
+use crate::DB;
+use log::{debug, error, info};
+use rayon::ThreadPoolBuilder;
+use std::collections::VecDeque;
+use std::fmt::{Display, Formatter};
+use std::fs::{create_dir_all, File};
+use std::io;
+use std::path::Path;
+use std::sync::mpsc::Sender;
+use std::sync::{Arc, Mutex};
+use std::time::Instant;
+use urlencoding::encode;
+
+#[cfg(target_os = "linux")]
+use rustix::fs::{fallocate, FallocateFlags};
+
+use super::download_logic::download_game_chunk;
+use super::download_manager::DownloadManagerSignal;
+use super::download_thread_control_flag::{DownloadThreadControl, DownloadThreadControlFlag};
+use super::progress_object::ProgressObject;
+use super::stored_manifest::StoredManifest;
+
+pub struct GameDownloadAgent {
+ pub id: String,
+ pub version: String,
+ pub control_flag: DownloadThreadControl,
+ contexts: Vec,
+ completed_contexts: VecDeque,
+ pub manifest: Mutex>,
+ pub progress: Arc,
+ sender: Sender,
+ pub stored_manifest: StoredManifest,
+}
+
+#[derive(Debug, Clone)]
+pub enum GameDownloadError {
+ Communication(RemoteAccessError),
+ Checksum,
+ Setup(SetupError),
+ Lock,
+ IoError(io::ErrorKind),
+ DownloadError,
+}
+
+#[derive(Debug, Clone)]
+pub enum SetupError {
+ Context,
+}
+
+impl Display for GameDownloadError {
+ fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+ match self {
+ GameDownloadError::Communication(error) => write!(f, "{}", error),
+ GameDownloadError::Setup(error) => write!(f, "An error occurred while setting up the download: {}", error),
+ GameDownloadError::Lock => write!(f, "Failed to acquire lock. Something has gone very wrong internally. Please restart the application"),
+ GameDownloadError::Checksum => write!(f, "Checksum failed to validate for download"),
+ GameDownloadError::IoError(error) => write!(f, "{}", error),
+ GameDownloadError::DownloadError => write!(f, "Download failed. See Download Manager status for specific error"),
+ }
+ }
+}
+
+impl Display for SetupError {
+ fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+ match self {
+ SetupError::Context => write!(f, "Failed to generate contexts for download"),
+ }
+ }
+}
+
+impl GameDownloadAgent {
+ pub fn new(
+ id: String,
+ version: String,
+ target_download_dir: usize,
+ sender: Sender,
+ ) -> Self {
+ // Don't run by default
+ let control_flag = DownloadThreadControl::new(DownloadThreadControlFlag::Stop);
+
+ let db_lock = DB.borrow_data().unwrap();
+ let base_dir = db_lock.games.install_dirs[target_download_dir].clone();
+ drop(db_lock);
+
+ let base_dir_path = Path::new(&base_dir);
+ let data_base_dir_path = base_dir_path.join(id.clone());
+
+ let stored_manifest =
+ StoredManifest::generate(id.clone(), version.clone(), data_base_dir_path.clone());
+
+ Self {
+ id,
+ version,
+ control_flag,
+ manifest: Mutex::new(None),
+ contexts: Vec::new(),
+ completed_contexts: VecDeque::new(),
+ progress: Arc::new(ProgressObject::new(0, 0, sender.clone())),
+ sender,
+ stored_manifest,
+ }
+ }
+
+ // Blocking
+ pub fn setup_download(&mut self) -> Result<(), GameDownloadError> {
+ self.ensure_manifest_exists()?;
+ info!("Ensured manifest exists");
+
+ self.ensure_contexts()?;
+ info!("Ensured contexts exists");
+
+ self.control_flag.set(DownloadThreadControlFlag::Go);
+
+ Ok(())
+ }
+
+ // Blocking
+ pub fn download(&mut self) -> Result<(), GameDownloadError> {
+ self.setup_download()?;
+ self.set_progress_object_params();
+ let timer = Instant::now();
+ self.run().map_err(|_| GameDownloadError::DownloadError)?;
+
+ info!(
+ "{} took {}ms to download",
+ self.id,
+ timer.elapsed().as_millis()
+ );
+ Ok(())
+ }
+
+ pub fn ensure_manifest_exists(&self) -> Result<(), GameDownloadError> {
+ if self.manifest.lock().unwrap().is_some() {
+ return Ok(());
+ }
+
+ self.download_manifest()
+ }
+
+ fn download_manifest(&self) -> Result<(), GameDownloadError> {
+ let base_url = DB.fetch_base_url();
+ let manifest_url = base_url
+ .join(
+ format!(
+ "/api/v1/client/metadata/manifest?id={}&version={}",
+ self.id,
+ encode(&self.version)
+ )
+ .as_str(),
+ )
+ .unwrap();
+
+ let header = generate_authorization_header();
+ let client = reqwest::blocking::Client::new();
+ let response = client
+ .get(manifest_url.to_string())
+ .header("Authorization", header)
+ .send()
+ .unwrap();
+
+ if response.status() != 200 {
+ return Err(GameDownloadError::Communication(
+ RemoteAccessError::ManifestDownloadFailed(
+ response.status(),
+ response.text().unwrap(),
+ ),
+ ));
+ }
+
+ let manifest_download = response.json::().unwrap();
+
+ if let Ok(mut manifest) = self.manifest.lock() {
+ *manifest = Some(manifest_download);
+ return Ok(());
+ }
+
+ Err(GameDownloadError::Lock)
+ }
+
+ fn set_progress_object_params(&self) {
+ // Avoid re-setting it
+ if self.progress.get_max() != 0 {
+ return;
+ }
+
+ let length = self.contexts.len();
+
+ let chunk_count = self.contexts.iter().map(|chunk| chunk.length).sum();
+
+ debug!("Setting ProgressObject max to {}", chunk_count);
+ self.progress.set_max(chunk_count);
+ debug!("Setting ProgressObject size to {}", length);
+ self.progress.set_size(length);
+ debug!("Setting ProgressObject time to now");
+ self.progress.set_time_now();
+ }
+
+ pub fn ensure_contexts(&mut self) -> Result<(), GameDownloadError> {
+ if !self.contexts.is_empty() {
+ return Ok(());
+ }
+
+ self.generate_contexts()?;
+ Ok(())
+ }
+
+ pub fn generate_contexts(&mut self) -> Result<(), GameDownloadError> {
+ let manifest = self.manifest.lock().unwrap().clone().unwrap();
+ let game_id = self.id.clone();
+
+ let mut contexts = Vec::new();
+ let base_path = Path::new(&self.stored_manifest.base_path);
+ create_dir_all(base_path).unwrap();
+
+ self.completed_contexts.clear();
+ self.completed_contexts
+ .extend(self.stored_manifest.get_completed_contexts());
+
+ for (raw_path, chunk) in manifest {
+ let path = base_path.join(Path::new(&raw_path));
+
+ let container = path.parent().unwrap();
+ create_dir_all(container).unwrap();
+
+ let file = File::create(path.clone()).unwrap();
+ let mut running_offset = 0;
+
+ for (index, length) in chunk.lengths.iter().enumerate() {
+ contexts.push(DropDownloadContext {
+ file_name: raw_path.to_string(),
+ version: chunk.version_name.to_string(),
+ offset: running_offset,
+ index,
+ game_id: game_id.to_string(),
+ path: path.clone(),
+ checksum: chunk.checksums[index].clone(),
+ length: *length,
+ permissions: chunk.permissions,
+ });
+ running_offset += *length as u64;
+ }
+
+ #[cfg(target_os = "linux")]
+ if running_offset > 0 {
+ let _ = fallocate(file, FallocateFlags::empty(), 0, running_offset);
+ }
+ }
+ self.contexts = contexts;
+
+ Ok(())
+ }
+
+ pub fn run(&mut self) -> Result<(), ()> {
+ info!("downloading game: {}", self.id);
+ const DOWNLOAD_MAX_THREADS: usize = 1;
+
+ let pool = ThreadPoolBuilder::new()
+ .num_threads(DOWNLOAD_MAX_THREADS)
+ .build()
+ .unwrap();
+
+ let completed_indexes = Arc::new(boxcar::Vec::new());
+ let completed_indexes_loop_arc = completed_indexes.clone();
+
+ pool.scope(|scope| {
+ for (index, context) in self.contexts.iter().enumerate() {
+ let completed_indexes = completed_indexes_loop_arc.clone();
+
+ let progress = self.progress.get(index); // Clone arcs
+ let progress_handle = ProgressHandle::new(progress, self.progress.clone());
+ // If we've done this one already, skip it
+ if self.completed_contexts.contains(&index) {
+ progress_handle.add(context.length);
+ continue;
+ }
+
+ let context = context.clone();
+ let control_flag = self.control_flag.clone(); // Clone arcs
+
+ let sender = self.sender.clone();
+
+ scope.spawn(move |_| {
+ match download_game_chunk(context.clone(), control_flag, progress_handle) {
+ Ok(res) => {
+ if res {
+ completed_indexes.push(index);
+ }
+ }
+ Err(e) => {
+ error!("{}", e);
+ sender.send(DownloadManagerSignal::Error(e)).unwrap();
+ }
+ }
+ });
+ }
+ });
+
+ let newly_completed = completed_indexes.to_owned();
+
+ let completed_lock_len = {
+ for (item, item_ref) in newly_completed.iter() {
+ self.completed_contexts.push_front(item);
+ }
+
+ self.completed_contexts.len()
+ };
+
+ // If we're not out of contexts, we're not done, so we don't fire completed
+ if completed_lock_len != self.contexts.len() {
+ info!("da for {} exited without completing", self.id.clone());
+ self.stored_manifest
+ .set_completed_contexts(&self.completed_contexts.clone().into());
+ info!("Setting completed contexts");
+ self.stored_manifest.write();
+ info!("Wrote completed contexts");
+ return Ok(());
+ }
+
+ // We've completed
+ self.sender
+ .send(DownloadManagerSignal::Completed(self.id.clone()))
+ .unwrap();
+
+ Ok(())
+ }
+}
diff --git a/src-tauri/src/downloads/download_commands.rs b/src-tauri/src/downloads/download_commands.rs
new file mode 100644
index 0000000..d3ca2e7
--- /dev/null
+++ b/src-tauri/src/downloads/download_commands.rs
@@ -0,0 +1,62 @@
+use std::sync::Mutex;
+
+use crate::AppState;
+
+#[tauri::command]
+pub fn download_game(
+ game_id: String,
+ game_version: String,
+ install_dir: usize,
+ state: tauri::State<'_, Mutex>,
+) -> Result<(), String> {
+ state
+ .lock()
+ .unwrap()
+ .download_manager
+ .queue_game(game_id, game_version, install_dir)
+ .map_err(|_| "An error occurred while communicating with the download manager.".to_string())
+}
+
+#[tauri::command]
+pub fn pause_game_downloads(state: tauri::State<'_, Mutex>) {
+ state.lock().unwrap().download_manager.pause_downloads()
+}
+
+#[tauri::command]
+pub fn resume_game_downloads(state: tauri::State<'_, Mutex>) {
+ state.lock().unwrap().download_manager.resume_downloads()
+}
+
+#[tauri::command]
+pub fn move_game_in_queue(
+ state: tauri::State<'_, Mutex>,
+ old_index: usize,
+ new_index: usize,
+) {
+ state
+ .lock()
+ .unwrap()
+ .download_manager
+ .rearrange(old_index, new_index)
+}
+
+#[tauri::command]
+pub fn cancel_game(state: tauri::State<'_, Mutex>, game_id: String) {
+ state.lock().unwrap().download_manager.cancel(game_id)
+}
+
+/*
+#[tauri::command]
+pub fn get_current_write_speed(state: tauri::State<'_, Mutex>) {}
+*/
+
+/*
+fn use_download_agent(
+ state: tauri::State<'_, Mutex>,
+ game_id: String,
+) -> Result, String> {
+ let lock = state.lock().unwrap();
+ let download_agent = lock.download_manager.get(&game_id).ok_or("Invalid game ID")?;
+ Ok(download_agent.clone()) // Clones the Arc, not the underlying data structure
+}
+*/
diff --git a/src-tauri/src/downloads/download_logic.rs b/src-tauri/src/downloads/download_logic.rs
new file mode 100644
index 0000000..420d0ef
--- /dev/null
+++ b/src-tauri/src/downloads/download_logic.rs
@@ -0,0 +1,212 @@
+use crate::auth::generate_authorization_header;
+use crate::db::DatabaseImpls;
+use crate::downloads::manifest::DropDownloadContext;
+use crate::remote::RemoteAccessError;
+use crate::DB;
+use log::warn;
+use md5::{Context, Digest};
+use reqwest::blocking::Response;
+
+use std::fs::{set_permissions, Permissions};
+use std::io::Read;
+#[cfg(unix)]
+use std::os::unix::fs::PermissionsExt;
+use std::{
+ fs::{File, OpenOptions},
+ io::{self, BufWriter, Seek, SeekFrom, Write},
+ path::PathBuf,
+};
+use urlencoding::encode;
+
+use super::download_agent::GameDownloadError;
+use super::download_thread_control_flag::{DownloadThreadControl, DownloadThreadControlFlag};
+use super::progress_object::ProgressHandle;
+
+pub struct DropWriter {
+ hasher: Context,
+ destination: W,
+}
+impl DropWriter {
+ fn new(path: PathBuf) -> Self {
+ Self {
+ destination: OpenOptions::new().write(true).open(path).unwrap(),
+ hasher: Context::new(),
+ }
+ }
+
+ fn finish(mut self) -> io::Result {
+ self.flush().unwrap();
+ Ok(self.hasher.compute())
+ }
+}
+// Write automatically pushes to file and hasher
+impl Write for DropWriter {
+ fn write(&mut self, buf: &[u8]) -> io::Result {
+ /*
+ self.hasher.write_all(buf).map_err(|e| {
+ io::Error::new(
+ ErrorKind::Other,
+ format!("Unable to write to hasher: {}", e),
+ )
+ })?;
+ */
+ self.destination.write(buf)
+ }
+
+ fn flush(&mut self) -> io::Result<()> {
+ // self.hasher.flush()?;
+ self.destination.flush()
+ }
+}
+// Seek moves around destination output
+impl Seek for DropWriter {
+ fn seek(&mut self, pos: SeekFrom) -> io::Result {
+ self.destination.seek(pos)
+ }
+}
+
+pub struct DropDownloadPipeline {
+ pub source: R,
+ pub destination: DropWriter,
+ pub control_flag: DownloadThreadControl,
+ pub progress: ProgressHandle,
+ pub size: usize,
+}
+impl DropDownloadPipeline {
+ fn new(
+ source: Response,
+ destination: DropWriter,
+ control_flag: DownloadThreadControl,
+ progress: ProgressHandle,
+ size: usize,
+ ) -> Self {
+ Self {
+ source,
+ destination,
+ control_flag,
+ progress,
+ size,
+ }
+ }
+
+ fn copy(&mut self) -> Result {
+ let copy_buf_size = 512;
+ let mut copy_buf = vec![0; copy_buf_size];
+ let mut buf_writer = BufWriter::with_capacity(1024 * 1024, &mut self.destination);
+
+ let mut current_size = 0;
+ loop {
+ if self.control_flag.get() == DownloadThreadControlFlag::Stop {
+ return Ok(false);
+ }
+
+ let bytes_read = self.source.read(&mut copy_buf)?;
+ current_size += bytes_read;
+
+ buf_writer.write_all(©_buf[0..bytes_read])?;
+ self.progress.add(bytes_read);
+
+ if current_size == self.size {
+ break;
+ }
+ }
+
+ Ok(true)
+ }
+
+ fn finish(self) -> Result {
+ let checksum = self.destination.finish()?;
+ Ok(checksum)
+ }
+}
+
+pub fn download_game_chunk(
+ ctx: DropDownloadContext,
+ control_flag: DownloadThreadControl,
+ progress: ProgressHandle,
+) -> Result {
+ // If we're paused
+ if control_flag.get() == DownloadThreadControlFlag::Stop {
+ progress.set(0);
+ return Ok(false);
+ }
+
+ let base_url = DB.fetch_base_url();
+
+ let client = reqwest::blocking::Client::new();
+ let chunk_url = base_url
+ .join(&format!(
+ "/api/v1/client/chunk?id={}&version={}&name={}&chunk={}",
+ // Encode the parts we don't trust
+ ctx.game_id,
+ encode(&ctx.version),
+ encode(&ctx.file_name),
+ ctx.index
+ ))
+ .unwrap();
+
+ let header = generate_authorization_header();
+
+ let response = client
+ .get(chunk_url)
+ .header("Authorization", header)
+ .send()
+ .map_err(|e| GameDownloadError::Communication(e.into()))?;
+
+ if response.status() != 200 {
+ warn!("{}", response.text().unwrap());
+ return Err(GameDownloadError::Communication(
+ RemoteAccessError::InvalidCodeError(400),
+ ));
+ }
+
+ let mut destination = DropWriter::new(ctx.path.clone());
+
+ if ctx.offset != 0 {
+ destination
+ .seek(SeekFrom::Start(ctx.offset))
+ .expect("Failed to seek to file offset");
+ }
+
+ let content_length = response.content_length();
+ if content_length.is_none() {
+ return Err(GameDownloadError::Communication(
+ RemoteAccessError::InvalidResponse,
+ ));
+ }
+
+ let mut pipeline = DropDownloadPipeline::new(
+ response,
+ destination,
+ control_flag,
+ progress,
+ content_length.unwrap().try_into().unwrap(),
+ );
+
+ let completed = pipeline
+ .copy()
+ .map_err(|e| GameDownloadError::IoError(e.kind()))?;
+ if !completed {
+ return Ok(false);
+ };
+
+ // If we complete the file, set the permissions (if on Linux)
+ #[cfg(unix)]
+ {
+ let permissions = Permissions::from_mode(ctx.permissions);
+ set_permissions(ctx.path, permissions).unwrap();
+ }
+
+ /*
+ let checksum = pipeline
+ .finish()
+ .map_err(|e| GameDownloadError::IoError(e))?;
+
+ let res = hex::encode(checksum.0);
+ if res != ctx.checksum {
+ return Err(GameDownloadError::Checksum);
+ }
+ */
+
+ Ok(true)
+}
diff --git a/src-tauri/src/download_manager/download_manager_frontend.rs b/src-tauri/src/downloads/download_manager.rs
similarity index 51%
rename from src-tauri/src/download_manager/download_manager_frontend.rs
rename to src-tauri/src/downloads/download_manager.rs
index 46ee853..55bfa83 100644
--- a/src-tauri/src/download_manager/download_manager_frontend.rs
+++ b/src-tauri/src/downloads/download_manager.rs
@@ -4,53 +4,56 @@ use std::{
fmt::Debug,
sync::{
mpsc::{SendError, Sender},
- Mutex, MutexGuard,
+ Arc, Mutex, MutexGuard,
},
thread::JoinHandle,
};
-use log::{debug, info};
+use log::info;
use serde::Serialize;
-use crate::{
- database::models::data::DownloadableMetadata,
- error::application_download_error::ApplicationDownloadError,
-};
-
use super::{
- download_manager_builder::{CurrentProgressObject, DownloadAgent},
- util::queue::Queue,
+ download_agent::{GameDownloadAgent, GameDownloadError},
+ download_manager_builder::CurrentProgressObject,
+ progress_object::ProgressObject,
+ queue::Queue,
};
pub enum DownloadManagerSignal {
- /// Resumes (or starts) the `DownloadManager`
+ /// Resumes (or starts) the DownloadManager
Go,
- /// Pauses the `DownloadManager`
+ /// Pauses the DownloadManager
Stop,
- /// Called when a `DownloadAgent` has fully completed a download.
- Completed(DownloadableMetadata),
- /// Generates and appends a `DownloadAgent`
+ /// Called when a GameDownloadAgent has fully completed a download.
+ Completed(String),
+ /// Generates and appends a GameDownloadAgent
/// to the registry and queue
- Queue(DownloadAgent),
+ Queue(String, String, usize),
/// Tells the Manager to stop the current
/// download, sync everything to disk, and
/// then exit
Finish,
- /// Stops, removes, and tells a download to cleanup
- Cancel(DownloadableMetadata),
+ /// Stops (but doesn't remove) current download
+ Cancel,
+ /// Removes a given game
+ Remove(String),
/// Any error which occurs in the agent
- Error(ApplicationDownloadError),
+ Error(GameDownloadError),
/// Pushes UI update
UpdateUIQueue,
UpdateUIStats(usize, usize), //kb/s and seconds
+ /// Uninstall game
+ /// Takes game ID
+ Uninstall(String),
}
-#[derive(Debug)]
+#[derive(Debug, Clone)]
pub enum DownloadManagerStatus {
Downloading,
Paused,
Empty,
- Error,
+ Error(GameDownloadError),
+ Finished,
}
impl Serialize for DownloadManagerStatus {
@@ -58,34 +61,54 @@ impl Serialize for DownloadManagerStatus {
where
S: serde::Serializer,
{
- serializer.serialize_str(&format!["{self:?}"])
+ serializer.serialize_str(&format!["{:?}", self])
}
}
-#[derive(Serialize, Clone, Debug)]
-pub enum DownloadStatus {
+#[derive(Serialize, Clone)]
+pub enum GameDownloadStatus {
Queued,
Downloading,
- Validating,
Error,
}
-/// Accessible front-end for the `DownloadManager`
+/// Accessible front-end for the DownloadManager
///
/// The system works entirely through signals, both internally and externally,
-/// all of which are accessible through the `DownloadManagerSignal` type, but
+/// all of which are accessible through the DownloadManagerSignal type, but
/// should not be used directly. Rather, signals are abstracted through this
/// interface.
///
-/// The actual download queue may be accessed through the .`edit()` function,
+/// The actual download queue may be accessed through the .edit() function,
/// which provides raw access to the underlying queue.
/// THIS EDITING IS BLOCKING!!!
pub struct DownloadManager {
- terminator: Mutex>>>,
+ terminator: JoinHandle>,
download_queue: Queue,
progress: CurrentProgressObject,
command_sender: Sender,
}
+pub struct GameDownloadAgentQueueStandin {
+ pub id: String,
+ pub status: Mutex,
+ pub progress: Arc,
+}
+impl From> for GameDownloadAgentQueueStandin {
+ fn from(value: Arc) -> Self {
+ Self {
+ id: value.id.clone(),
+ status: Mutex::from(GameDownloadStatus::Queued),
+ progress: value.progress.clone(),
+ }
+ }
+}
+impl Debug for GameDownloadAgentQueueStandin {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.debug_struct("GameDownloadAgentQueueStandin")
+ .field("id", &self.id)
+ .finish()
+ }
+}
#[allow(dead_code)]
impl DownloadManager {
@@ -96,63 +119,69 @@ impl DownloadManager {
command_sender: Sender,
) -> Self {
Self {
- terminator: Mutex::new(Some(terminator)),
+ terminator,
download_queue,
progress,
command_sender,
}
}
- pub fn queue_download(
+ pub fn queue_game(
&self,
- download: DownloadAgent,
+ id: String,
+ version: String,
+ target_download_dir: usize,
) -> Result<(), SendError> {
- info!("creating download with meta {:?}", download.metadata());
- self.command_sender
- .send(DownloadManagerSignal::Queue(download))?;
+ info!("Adding game id {}", id);
+ self.command_sender.send(DownloadManagerSignal::Queue(
+ id,
+ version,
+ target_download_dir,
+ ))?;
self.command_sender.send(DownloadManagerSignal::Go)
}
- pub fn edit(&self) -> MutexGuard<'_, VecDeque> {
+ pub fn edit(&self) -> MutexGuard<'_, VecDeque>> {
self.download_queue.edit()
}
- pub fn read_queue(&self) -> VecDeque {
+ pub fn read_queue(&self) -> VecDeque> {
self.download_queue.read()
}
- pub fn get_current_download_progress(&self) -> Option {
+ pub fn get_current_game_download_progress(&self) -> Option {
let progress_object = (*self.progress.lock().unwrap()).clone()?;
Some(progress_object.get_progress())
}
- pub fn rearrange_string(&self, meta: &DownloadableMetadata, new_index: usize) {
+ pub fn rearrange_string(&self, id: String, new_index: usize) {
let mut queue = self.edit();
- let current_index = get_index_from_id(&mut queue, meta).unwrap();
+ let current_index = get_index_from_id(&mut queue, id).unwrap();
let to_move = queue.remove(current_index).unwrap();
queue.insert(new_index, to_move);
self.command_sender
.send(DownloadManagerSignal::UpdateUIQueue)
.unwrap();
}
- pub fn cancel(&self, meta: DownloadableMetadata) {
+ pub fn cancel(&self, game_id: String) {
self.command_sender
- .send(DownloadManagerSignal::Cancel(meta))
+ .send(DownloadManagerSignal::Remove(game_id))
.unwrap();
}
pub fn rearrange(&self, current_index: usize, new_index: usize) {
if current_index == new_index {
return;
- }
+ };
let needs_pause = current_index == 0 || new_index == 0;
if needs_pause {
self.command_sender
- .send(DownloadManagerSignal::Stop)
+ .send(DownloadManagerSignal::Cancel)
.unwrap();
}
- debug!("moving download at index {current_index} to index {new_index}");
+ info!("moving {} to {}", current_index, new_index);
let mut queue = self.edit();
let to_move = queue.remove(current_index).unwrap();
queue.insert(new_index, to_move);
+ info!("new queue: {:?}", queue);
drop(queue);
if needs_pause {
@@ -161,7 +190,6 @@ impl DownloadManager {
self.command_sender
.send(DownloadManagerSignal::UpdateUIQueue)
.unwrap();
- self.command_sender.send(DownloadManagerSignal::Go).unwrap();
}
pub fn pause_downloads(&self) {
self.command_sender
@@ -171,25 +199,26 @@ impl DownloadManager {
pub fn resume_downloads(&self) {
self.command_sender.send(DownloadManagerSignal::Go).unwrap();
}
- pub fn ensure_terminated(&self) -> Result