@@ -87,7 +87,7 @@ router.afterEach(() => {
const state = useAppState();
const profilePictureUrl: string = await useObject(
- state.value?.user?.profilePictureObjectId ?? ""
+ state.value.user?.profilePictureObjectId ?? ""
);
const adminUrl: string = await invoke("gen_drop_url", {
path: "/admin",
diff --git a/main/components/HeaderWidget.vue b/components/HeaderWidget.vue
similarity index 100%
rename from main/components/HeaderWidget.vue
rename to components/HeaderWidget.vue
diff --git a/main/components/InitiateAuthModule.vue b/components/InitiateAuthModule.vue
similarity index 100%
rename from main/components/InitiateAuthModule.vue
rename to components/InitiateAuthModule.vue
diff --git a/main/components/LibrarySearch.vue b/components/LibrarySearch.vue
similarity index 53%
rename from main/components/LibrarySearch.vue
rename to components/LibrarySearch.vue
index be9129b..cee9103 100644
--- a/main/components/LibrarySearch.vue
+++ b/components/LibrarySearch.vue
@@ -1,59 +1,72 @@
-
+
-
+
-
+
+
+
+
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/main/pages/store/index.vue b/pages/store/index.vue
similarity index 100%
rename from main/pages/store/index.vue
rename to pages/store/index.vue
diff --git a/main/plugins/global-error-handler.ts b/plugins/global-error-handler.ts
similarity index 100%
rename from main/plugins/global-error-handler.ts
rename to plugins/global-error-handler.ts
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..ab9d9a1 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -898,7 +898,7 @@ dependencies = [
"bitflags 2.9.1",
"core-foundation 0.10.1",
"core-graphics-types",
- "foreign-types 0.5.0",
+ "foreign-types",
"libc",
]
@@ -1284,7 +1284,7 @@ dependencies = [
[[package]]
name = "drop-app"
-version = "0.3.3"
+version = "0.3.1-appimage"
dependencies = [
"atomic-instant-full",
"bitcode",
@@ -1301,7 +1301,6 @@ dependencies = [
"hex 0.4.3",
"http 1.3.1",
"http-serde 2.1.1",
- "humansize",
"known-folders",
"log",
"log4rs",
@@ -1312,7 +1311,7 @@ dependencies = [
"rand 0.9.1",
"rayon",
"regex",
- "reqwest 0.12.22",
+ "reqwest 0.12.16",
"reqwest-middleware 0.4.2",
"reqwest-middleware-cache",
"reqwest-websocket",
@@ -1325,7 +1324,6 @@ dependencies = [
"sha1",
"shared_child",
"slice-deque",
- "sysinfo",
"tar",
"tauri",
"tauri-build",
@@ -1588,15 +1586,6 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-[[package]]
-name = "foreign-types"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
-dependencies = [
- "foreign-types-shared 0.1.1",
-]
-
[[package]]
name = "foreign-types"
version = "0.5.0"
@@ -1604,7 +1593,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
dependencies = [
"foreign-types-macros",
- "foreign-types-shared 0.3.1",
+ "foreign-types-shared",
]
[[package]]
@@ -1618,12 +1607,6 @@ dependencies = [
"syn 2.0.101",
]
-[[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
-
[[package]]
name = "foreign-types-shared"
version = "0.3.1"
@@ -2312,15 +2295,6 @@ 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",
-]
-
[[package]]
name = "humantime"
version = "2.2.0"
@@ -2381,7 +2355,6 @@ dependencies = [
"hyper 1.6.0",
"hyper-util",
"rustls",
- "rustls-native-certs",
"rustls-pki-types",
"tokio",
"tokio-rustls",
@@ -2389,22 +2362,6 @@ dependencies = [
"webpki-roots",
]
-[[package]]
-name = "hyper-tls"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
-dependencies = [
- "bytes",
- "http-body-util",
- "hyper 1.6.0",
- "hyper-util",
- "native-tls",
- "tokio",
- "tokio-native-tls",
- "tower-service",
-]
-
[[package]]
name = "hyper-util"
version = "0.1.13"
@@ -2817,9 +2774,9 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.174"
+version = "0.2.172"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
+checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
[[package]]
name = "libloading"
@@ -2831,12 +2788,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "libm"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
-
[[package]]
name = "libredox"
version = "0.1.3"
@@ -3099,23 +3050,6 @@ dependencies = [
"windows-sys 0.59.0",
]
-[[package]]
-name = "native-tls"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
-dependencies = [
- "libc",
- "log",
- "openssl",
- "openssl-probe",
- "openssl-sys",
- "schannel",
- "security-framework 2.11.1",
- "security-framework-sys",
- "tempfile",
-]
-
[[package]]
name = "native_model"
version = "0.6.1"
@@ -3208,15 +3142,6 @@ dependencies = [
"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"
@@ -3413,16 +3338,6 @@ dependencies = [
"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"
@@ -3553,50 +3468,6 @@ dependencies = [
"pathdiff",
]
-[[package]]
-name = "openssl"
-version = "0.10.73"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8"
-dependencies = [
- "bitflags 2.9.1",
- "cfg-if",
- "foreign-types 0.3.2",
- "libc",
- "once_cell",
- "openssl-macros",
- "openssl-sys",
-]
-
-[[package]]
-name = "openssl-macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.101",
-]
-
-[[package]]
-name = "openssl-probe"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
-
-[[package]]
-name = "openssl-sys"
-version = "0.9.109"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
[[package]]
name = "option-ext"
version = "0.2.0"
@@ -4420,9 +4291,9 @@ dependencies = [
[[package]]
name = "reqwest"
-version = "0.12.22"
+version = "0.12.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531"
+checksum = "2bf597b113be201cb2269b4c39b39a804d01b99ee95a4278f0ed04e45cff1c71"
dependencies = [
"base64 0.22.1",
"bytes",
@@ -4435,23 +4306,22 @@ dependencies = [
"http-body-util",
"hyper 1.6.0",
"hyper-rustls",
- "hyper-tls",
"hyper-util",
+ "ipnet",
"js-sys",
"log",
- "native-tls",
+ "mime",
+ "once_cell",
"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",
@@ -4490,7 +4360,7 @@ dependencies = [
"anyhow",
"async-trait",
"http 1.3.1",
- "reqwest 0.12.22",
+ "reqwest 0.12.16",
"serde",
"thiserror 1.0.69",
"tower-service",
@@ -4525,7 +4395,7 @@ dependencies = [
"async-tungstenite",
"bytes",
"futures-util",
- "reqwest 0.12.22",
+ "reqwest 0.12.16",
"thiserror 2.0.12",
"tokio",
"tokio-util",
@@ -4688,18 +4558,6 @@ dependencies = [
"zeroize",
]
-[[package]]
-name = "rustls-native-certs"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3"
-dependencies = [
- "openssl-probe",
- "rustls-pki-types",
- "schannel",
- "security-framework 3.2.0",
-]
-
[[package]]
name = "rustls-pki-types"
version = "1.12.0"
@@ -4742,15 +4600,6 @@ dependencies = [
"winapi-util",
]
-[[package]]
-name = "schannel"
-version = "0.1.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
-dependencies = [
- "windows-sys 0.59.0",
-]
-
[[package]]
name = "schemars"
version = "0.8.22"
@@ -4784,42 +4633,6 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-[[package]]
-name = "security-framework"
-version = "2.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
-dependencies = [
- "bitflags 2.9.1",
- "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"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
[[package]]
name = "selectors"
version = "0.24.0"
@@ -5189,7 +5002,7 @@ dependencies = [
"bytemuck",
"cfg_aliases",
"core-graphics",
- "foreign-types 0.5.0",
+ "foreign-types",
"js-sys",
"log",
"objc2 0.5.2",
@@ -5377,20 +5190,6 @@ 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"
@@ -5503,9 +5302,9 @@ dependencies = [
[[package]]
name = "tauri"
-version = "2.7.0"
+version = "2.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7"
+checksum = "124e129c9c0faa6bec792c5948c89e86c90094133b0b9044df0ce5f0a8efaa0d"
dependencies = [
"anyhow",
"bytes",
@@ -5530,7 +5329,7 @@ dependencies = [
"percent-encoding",
"plist",
"raw-window-handle",
- "reqwest 0.12.22",
+ "reqwest 0.12.16",
"serde",
"serde_json",
"serde_repr",
@@ -5554,9 +5353,9 @@ dependencies = [
[[package]]
name = "tauri-build"
-version = "2.3.1"
+version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064"
+checksum = "12f025c389d3adb83114bec704da973142e82fc6ec799c7c750c5e21cefaec83"
dependencies = [
"anyhow",
"cargo_toml",
@@ -5576,9 +5375,9 @@ dependencies = [
[[package]]
name = "tauri-codegen"
-version = "2.3.1"
+version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a"
+checksum = "f5df493a1075a241065bc865ed5ef8d0fbc1e76c7afdc0bf0eccfaa7d4f0e406"
dependencies = [
"base64 0.22.1",
"brotli",
@@ -5603,9 +5402,9 @@ dependencies = [
[[package]]
name = "tauri-macros"
-version = "2.3.2"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e"
+checksum = "f237fbea5866fa5f2a60a21bea807a2d6e0379db070d89c3a10ac0f2d4649bbc"
dependencies = [
"heck 0.5.0",
"proc-macro2",
@@ -5785,9 +5584,9 @@ dependencies = [
[[package]]
name = "tauri-runtime"
-version = "2.7.1"
+version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676"
+checksum = "9e7bb73d1bceac06c20b3f755b2c8a2cb13b20b50083084a8cf3700daf397ba4"
dependencies = [
"cookie",
"dpi",
@@ -5807,9 +5606,9 @@ dependencies = [
[[package]]
name = "tauri-runtime-wry"
-version = "2.7.2"
+version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439"
+checksum = "902b5aa9035e16f342eb64f8bf06ccdc2808e411a2525ed1d07672fa4e780bad"
dependencies = [
"gtk",
"http 1.3.1",
@@ -5834,9 +5633,9 @@ dependencies = [
[[package]]
name = "tauri-utils"
-version = "2.6.0"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e"
+checksum = "41743bbbeb96c3a100d234e5a0b60a46d5aa068f266160862c7afdbf828ca02e"
dependencies = [
"anyhow",
"brotli",
@@ -6061,16 +5860,6 @@ dependencies = [
"syn 2.0.101",
]
-[[package]]
-name = "tokio-native-tls"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
-dependencies = [
- "native-tls",
- "tokio",
-]
-
[[package]]
name = "tokio-rustls"
version = "0.26.2"
@@ -6175,9 +5964,9 @@ dependencies = [
[[package]]
name = "tower-http"
-version = "0.6.6"
+version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
+checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e"
dependencies = [
"bitflags 2.9.1",
"bytes",
@@ -6482,12 +6271,6 @@ 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 = "version-compare"
version = "0.2.0"
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index f999d73..0c0d6a3 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "drop-app"
-version = "0.3.3"
+version = "0.3.1-appimage"
description = "The client application for the open-source, self-hosted game distribution platform Drop"
authors = ["Drop OSS"]
edition = "2024"
@@ -71,8 +71,6 @@ 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]
@@ -80,7 +78,7 @@ version = "0.1.5"
features = ["curly"]
[dependencies.tauri]
-version = "2.7.0"
+version = "2.1.1"
features = ["protocol-asset", "tray-icon"]
[dependencies.tokio]
@@ -104,9 +102,9 @@ version = "2"
features = ["other_errors"] # You can also use "yaml_enc" or "bin_enc"
[dependencies.reqwest]
-version = "0.12.22"
+version = "0.12"
default-features = false
-features = ["json", "http2", "blocking", "rustls-tls", "native-tls-alpn", "rustls-tls-native-roots"]
+features = ["json", "http2", "blocking", "rustls-tls-webpki-roots"]
[dependencies.serde]
version = "1"
diff --git a/src-tauri/src/database/models.rs b/src-tauri/src/database/models.rs
index a2997b2..51c3004 100644
--- a/src-tauri/src/database/models.rs
+++ b/src-tauri/src/database/models.rs
@@ -266,7 +266,6 @@ pub mod data {
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,
diff --git a/src-tauri/src/download_manager/download_manager_builder.rs b/src-tauri/src/download_manager/download_manager_builder.rs
index ecee16c..7d8aeed 100644
--- a/src-tauri/src/download_manager/download_manager_builder.rs
+++ b/src-tauri/src/download_manager/download_manager_builder.rs
@@ -124,16 +124,11 @@ impl DownloadManagerBuilder {
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();
- }
+ *download_thread_lock = None;
drop(download_thread_lock);
}
- fn stop_and_wait_current_download(&self) -> bool {
+ fn stop_and_wait_current_download(&self) {
self.set_status(DownloadManagerStatus::Paused);
if let Some(current_flag) = &self.active_control_flag {
current_flag.set(DownloadThreadControlFlag::Stop);
@@ -141,10 +136,8 @@ impl DownloadManagerBuilder {
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
+ current_download_thread.join().unwrap();
+ }
}
fn manage_queue(mut self) -> Result<(), ()> {
@@ -220,6 +213,10 @@ impl DownloadManagerBuilder {
&& self.download_queue.read().front().unwrap()
== &self.current_download_agent.as_ref().unwrap().metadata()
{
+ debug!(
+ "Current download agent: {:?}",
+ self.current_download_agent.as_ref().unwrap().metadata()
+ );
return;
}
@@ -257,16 +254,12 @@ impl DownloadManagerBuilder {
}
};
- // If the download gets canceled
+ // If the download gets cancelled
// 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) => {
@@ -281,10 +274,6 @@ impl DownloadManagerBuilder {
}
};
- if download_agent.control_flag().get() == DownloadThreadControlFlag::Stop {
- return;
- }
-
if validate_result {
download_agent.on_complete(&app_handle);
sender
@@ -327,7 +316,6 @@ impl DownloadManagerBuilder {
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) {
diff --git a/src-tauri/src/download_manager/util/progress_object.rs b/src-tauri/src/download_manager/util/progress_object.rs
index c2c0c2f..9f67db5 100644
--- a/src-tauri/src/download_manager/util/progress_object.rs
+++ b/src-tauri/src/download_manager/util/progress_object.rs
@@ -1,8 +1,8 @@
use std::{
sync::{
- Arc, Mutex,
atomic::{AtomicUsize, Ordering},
mpsc::Sender,
+ Arc, Mutex,
},
time::{Duration, Instant},
};
@@ -23,10 +23,9 @@ pub struct ProgressObject {
//last_update: Arc>,
last_update_time: Arc,
bytes_last_update: Arc,
- rolling: RollingProgressWindow<1>,
+ rolling: RollingProgressWindow<250>,
}
-#[derive(Clone)]
pub struct ProgressHandle {
progress: Arc,
progress_object: Arc,
@@ -128,7 +127,7 @@ pub fn calculate_update(progress: &ProgressObject) {
.bytes_last_update
.swap(current_bytes_downloaded, Ordering::Acquire);
- let bytes_since_last_update = current_bytes_downloaded.saturating_sub(bytes_at_last_update);
+ let bytes_since_last_update = current_bytes_downloaded - bytes_at_last_update;
let kilobytes_per_second = bytes_since_last_update / (time_since_last_update as usize).max(1);
diff --git a/src-tauri/src/error/application_download_error.rs b/src-tauri/src/error/application_download_error.rs
index f8771a0..c1f3899 100644
--- a/src-tauri/src/error/application_download_error.rs
+++ b/src-tauri/src/error/application_download_error.rs
@@ -1,49 +1,30 @@
use std::{
fmt::{Display, Formatter},
- io, sync::Arc,
+ io,
};
use serde_with::SerializeDisplay;
-use humansize::{format_size, BINARY};
use super::remote_access_error::RemoteAccessError;
// TODO: Rename / separate from downloads
#[derive(Debug, SerializeDisplay)]
pub enum ApplicationDownloadError {
- NotInitialized,
Communication(RemoteAccessError),
- DiskFull(u64, u64),
- #[allow(dead_code)]
Checksum,
Lock,
- IoError(Arc),
+ IoError(io::ErrorKind),
DownloadError,
}
impl Display for ApplicationDownloadError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
- ApplicationDownloadError::NotInitialized => write!(f, "Download not initalized, did something go wrong?"),
- ApplicationDownloadError::DiskFull(required, available) => write!(
- f,
- "Game requires {}, {} remaining left on disk.",
- format_size(*required, BINARY),
- format_size(*available, BINARY),
- ),
ApplicationDownloadError::Communication(error) => write!(f, "{error}"),
- ApplicationDownloadError::Lock => write!(
- f,
- "failed to acquire lock. Something has gone very wrong internally. Please restart the application"
- ),
- ApplicationDownloadError::Checksum => {
- write!(f, "checksum failed to validate for download")
- }
+ ApplicationDownloadError::Lock => write!(f, "failed to acquire lock. Something has gone very wrong internally. Please restart the application"),
+ ApplicationDownloadError::Checksum => write!(f, "checksum failed to validate for download"),
ApplicationDownloadError::IoError(error) => write!(f, "io error: {error}"),
- ApplicationDownloadError::DownloadError => write!(
- f,
- "Download failed. See Download Manager status for specific error"
- ),
+ ApplicationDownloadError::DownloadError => write!(f, "download failed. See Download Manager status for specific error"),
}
}
}
diff --git a/src-tauri/src/error/remote_access_error.rs b/src-tauri/src/error/remote_access_error.rs
index d57ce15..fdc4b0c 100644
--- a/src-tauri/src/error/remote_access_error.rs
+++ b/src-tauri/src/error/remote_access_error.rs
@@ -23,7 +23,6 @@ pub enum RemoteAccessError {
ManifestDownloadFailed(StatusCode, String),
OutOfSync,
Cache(std::io::Error),
- CorruptedState,
}
impl Display for RemoteAccessError {
@@ -82,10 +81,6 @@ impl Display for RemoteAccessError {
"server's and client's time are out of sync. Please ensure they are within at least 30 seconds of each other"
),
RemoteAccessError::Cache(error) => write!(f, "Cache Error: {error}"),
- RemoteAccessError::CorruptedState => write!(
- f,
- "Drop encountered a corrupted internal state. Please report this to the developers, with details of reproduction."
- ),
}
}
}
diff --git a/src-tauri/src/games/collections/commands.rs b/src-tauri/src/games/collections/commands.rs
index a09d441..bff8928 100644
--- a/src-tauri/src/games/collections/commands.rs
+++ b/src-tauri/src/games/collections/commands.rs
@@ -1,96 +1,109 @@
use serde_json::json;
+use url::Url;
use crate::{
+ DB,
+ database::db::DatabaseImpls,
error::remote_access_error::RemoteAccessError,
- remote::{
- auth::generate_authorization_header,
- requests::{generate_url, make_authenticated_get},
- utils::DROP_CLIENT_ASYNC,
- },
+ remote::{auth::generate_authorization_header, requests::make_request, utils::DROP_CLIENT_SYNC},
};
use super::collection::{Collection, Collections};
#[tauri::command]
-pub async fn fetch_collections() -> Result {
- let response =
- make_authenticated_get(generate_url(&["/api/v1/client/collection"], &[])?).await?;
+pub fn fetch_collections() -> Result {
+ let client = DROP_CLIENT_SYNC.clone();
+ let response = make_request(&client, &["/api/v1/client/collection"], &[], |r| {
+ r.header("Authorization", generate_authorization_header())
+ })?
+ .send()?;
- Ok(response.json().await?)
+ Ok(response.json()?)
}
#[tauri::command]
-pub async fn fetch_collection(collection_id: String) -> Result {
- let response = make_authenticated_get(generate_url(
+pub fn fetch_collection(collection_id: String) -> Result {
+ let client = DROP_CLIENT_SYNC.clone();
+ let response = make_request(
+ &client,
&["/api/v1/client/collection/", &collection_id],
&[],
- )?)
- .await?;
+ |r| r.header("Authorization", generate_authorization_header()),
+ )?
+ .send()?;
- Ok(response.json().await?)
+ Ok(response.json()?)
}
#[tauri::command]
-pub async fn create_collection(name: String) -> Result {
- let client = DROP_CLIENT_ASYNC.clone();
- let url = generate_url(&["/api/v1/client/collection"], &[])?;
+pub fn create_collection(name: String) -> Result {
+ let client = DROP_CLIENT_SYNC.clone();
+ let base_url = DB.fetch_base_url();
+
+ let base_url = Url::parse(&format!("{base_url}api/v1/client/collection/"))?;
let response = client
- .post(url)
+ .post(base_url)
.header("Authorization", generate_authorization_header())
.json(&json!({"name": name}))
- .send()
- .await?;
+ .send()?;
- Ok(response.json().await?)
+ Ok(response.json()?)
}
#[tauri::command]
-pub async fn add_game_to_collection(
+pub fn add_game_to_collection(
collection_id: String,
game_id: String,
) -> Result<(), RemoteAccessError> {
- let client = DROP_CLIENT_ASYNC.clone();
-
- let url = generate_url(&["/api/v1/client/collection", &collection_id, "entry"], &[])?;
+ let client = DROP_CLIENT_SYNC.clone();
+ let url = Url::parse(&format!(
+ "{}api/v1/client/collection/{}/entry/",
+ DB.fetch_base_url(),
+ collection_id
+ ))?;
client
.post(url)
.header("Authorization", generate_authorization_header())
.json(&json!({"id": game_id}))
- .send()
- .await?;
+ .send()?;
Ok(())
}
#[tauri::command]
-pub async fn delete_collection(collection_id: String) -> Result {
- let client = DROP_CLIENT_ASYNC.clone();
-
- let url = generate_url(&["/api/v1/client/collection", &collection_id], &[])?;
+pub fn delete_collection(collection_id: String) -> Result {
+ let client = DROP_CLIENT_SYNC.clone();
+ let base_url = Url::parse(&format!(
+ "{}api/v1/client/collection/{}",
+ DB.fetch_base_url(),
+ collection_id
+ ))?;
let response = client
- .delete(url)
+ .delete(base_url)
.header("Authorization", generate_authorization_header())
- .send()
- .await?;
+ .send()?;
- Ok(response.json().await?)
+ Ok(response.json()?)
}
#[tauri::command]
-pub async fn delete_game_in_collection(
+pub fn delete_game_in_collection(
collection_id: String,
game_id: String,
) -> Result<(), RemoteAccessError> {
- let client = DROP_CLIENT_ASYNC.clone();
-
- let url = generate_url(&["/api/v1/client/collection", &collection_id, "entry"], &[])?;
+ let client = DROP_CLIENT_SYNC.clone();
+ let base_url = Url::parse(&format!(
+ "{}api/v1/client/collection/{}/entry",
+ DB.fetch_base_url(),
+ collection_id
+ ))?;
client
- .delete(url)
+ .delete(base_url)
.header("Authorization", generate_authorization_header())
.json(&json!({"id": game_id}))
- .send().await?;
+ .send()?;
Ok(())
}
diff --git a/src-tauri/src/games/commands.rs b/src-tauri/src/games/commands.rs
index b99084a..c26e4c6 100644
--- a/src-tauri/src/games/commands.rs
+++ b/src-tauri/src/games/commands.rs
@@ -18,28 +18,28 @@ use crate::{
use super::{
library::{
- FetchGameStruct, Game, fetch_game_logic, fetch_game_version_options_logic,
+ FetchGameStruct, Game, fetch_game_logic, fetch_game_verion_options_logic,
fetch_library_logic,
},
state::{GameStatusManager, GameStatusWithTransient},
};
#[tauri::command]
-pub async fn fetch_library(
- state: tauri::State<'_, Mutex>>,
+pub fn fetch_library(
+ state: tauri::State<'_, Mutex>,
) -> Result, RemoteAccessError> {
offline!(
state,
fetch_library_logic,
fetch_library_logic_offline,
state
- ).await
+ )
}
#[tauri::command]
-pub async fn fetch_game(
+pub fn fetch_game(
game_id: String,
- state: tauri::State<'_, Mutex>>,
+ state: tauri::State<'_, Mutex>,
) -> Result {
offline!(
state,
@@ -47,7 +47,7 @@ pub async fn fetch_game(
fetch_game_logic_offline,
game_id,
state
- ).await
+ )
}
#[tauri::command]
@@ -68,9 +68,9 @@ pub fn uninstall_game(game_id: String, app_handle: AppHandle) -> Result<(), Libr
}
#[tauri::command]
-pub async fn fetch_game_version_options(
+pub fn fetch_game_verion_options(
game_id: String,
- state: tauri::State<'_, Mutex>>,
+ state: tauri::State<'_, Mutex>,
) -> Result, RemoteAccessError> {
- fetch_game_version_options_logic(game_id, state).await
+ fetch_game_verion_options_logic(game_id, state)
}
diff --git a/src-tauri/src/games/downloads/commands.rs b/src-tauri/src/games/downloads/commands.rs
index 83aee8e..7e48162 100644
--- a/src-tauri/src/games/downloads/commands.rs
+++ b/src-tauri/src/games/downloads/commands.rs
@@ -3,48 +3,43 @@ use std::{
sync::{Arc, Mutex},
};
-
use crate::{
- AppState,
- database::{
- db::borrow_db_checked,
- models::data::GameDownloadStatus,
+ database::{db::borrow_db_checked, models::data::GameDownloadStatus},
+ download_manager::{
+ download_manager_frontend::DownloadManagerSignal, downloadable::Downloadable,
},
- download_manager::downloadable::Downloadable,
- error::application_download_error::ApplicationDownloadError,
+ error::download_manager_error::DownloadManagerError,
+ AppState,
};
use super::download_agent::GameDownloadAgent;
#[tauri::command]
-pub async fn download_game(
+pub fn download_game(
game_id: String,
game_version: String,
install_dir: usize,
- state: tauri::State<'_, Mutex>>,
-) -> Result<(), ApplicationDownloadError> {
- let sender = { state.lock().unwrap().download_manager.get_sender().clone() };
-
- let game_download_agent =
- GameDownloadAgent::new_from_index(game_id.clone(), game_version.clone(), install_dir, sender).await?;
-
- let game_download_agent =
- Arc::new(Box::new(game_download_agent) as Box);
- state
+ state: tauri::State<'_, Mutex>,
+) -> Result<(), DownloadManagerError> {
+ let sender = state.lock().unwrap().download_manager.get_sender();
+ let game_download_agent = Arc::new(Box::new(GameDownloadAgent::new_from_index(
+ game_id,
+ game_version,
+ install_dir,
+ sender,
+ )) as Box);
+ Ok(state
.lock()
.unwrap()
.download_manager
- .queue_download(game_download_agent.clone())
- .unwrap();
-
- Ok(())
+ .queue_download(game_download_agent)?)
}
#[tauri::command]
-pub async fn resume_download(
+pub fn resume_download(
game_id: String,
- state: tauri::State<'_, Mutex>>,
-) -> Result<(), ApplicationDownloadError> {
+ state: tauri::State<'_, Mutex>,
+) -> Result<(), DownloadManagerError> {
let s = borrow_db_checked()
.applications
.game_statuses
@@ -61,25 +56,17 @@ pub async fn resume_download(
install_dir,
} => (version_name, install_dir),
};
-
let sender = state.lock().unwrap().download_manager.get_sender();
let parent_dir: PathBuf = install_dir.into();
-
- let game_download_agent = Arc::new(Box::new(
- GameDownloadAgent::new(
- game_id,
- version_name.clone(),
- parent_dir.parent().unwrap().to_path_buf(),
- sender,
- )
- .await?,
- ) as Box);
-
- state
+ let game_download_agent = Arc::new(Box::new(GameDownloadAgent::new(
+ game_id,
+ version_name.clone(),
+ parent_dir.parent().unwrap().to_path_buf(),
+ sender,
+ )) as Box);
+ Ok(state
.lock()
.unwrap()
.download_manager
- .queue_download(game_download_agent)
- .unwrap();
- Ok(())
+ .queue_download(game_download_agent)?)
}
diff --git a/src-tauri/src/games/downloads/download_agent.rs b/src-tauri/src/games/downloads/download_agent.rs
index 14dc8b2..3ace071 100644
--- a/src-tauri/src/games/downloads/download_agent.rs
+++ b/src-tauri/src/games/downloads/download_agent.rs
@@ -11,19 +11,18 @@ use crate::download_manager::util::download_thread_control_flag::{
use crate::download_manager::util::progress_object::{ProgressHandle, ProgressObject};
use crate::error::application_download_error::ApplicationDownloadError;
use crate::error::remote_access_error::RemoteAccessError;
-use crate::games::downloads::manifest::{
- DownloadBucket, DownloadContext, DownloadDrop, DropManifest, DropValidateContext, ManifestBody,
-};
+use crate::games::downloads::manifest::{DropDownloadContext, DropManifest};
use crate::games::downloads::validate::validate_game_chunk;
-use crate::games::library::{on_game_complete, push_game_update, set_partially_installed};
+use crate::games::library::{
+ on_game_complete, push_game_update, set_partially_installed,
+};
use crate::games::state::GameStatusManager;
-use crate::process::utils::get_disk_available;
-use crate::remote::requests::generate_url;
-use crate::remote::utils::{DROP_CLIENT_ASYNC, DROP_CLIENT_SYNC};
-use log::{debug, error, info, warn};
+use crate::remote::requests::make_request;
+use crate::remote::utils::DROP_CLIENT_SYNC;
+use log::{debug, error, info};
use rayon::ThreadPoolBuilder;
-use std::collections::{HashMap, HashSet};
-use std::fs::{create_dir_all, OpenOptions};
+use std::collections::HashMap;
+use std::fs::{OpenOptions, create_dir_all};
use std::path::{Path, PathBuf};
use std::sync::mpsc::Sender;
use std::sync::{Arc, Mutex};
@@ -33,18 +32,14 @@ use tauri::{AppHandle, Emitter};
#[cfg(target_os = "linux")]
use rustix::fs::{FallocateFlags, fallocate};
-use super::download_logic::download_game_bucket;
+use super::download_logic::download_game_chunk;
use super::drop_data::DropData;
-static RETRY_COUNT: usize = 3;
-
-const TARGET_BUCKET_SIZE: usize = 63 * 1000 * 1000;
-
pub struct GameDownloadAgent {
pub id: String,
pub version: String,
pub control_flag: DownloadThreadControl,
- buckets: Mutex>,
+ contexts: Mutex>,
context_map: Mutex>,
pub manifest: Mutex