diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml
index c65a27b4d..2f61a62a6 100644
--- a/.github/workflows/build-and-release.yml
+++ b/.github/workflows/build-and-release.yml
@@ -271,15 +271,16 @@ jobs:
matrix:
include:
- platform: "macos-latest"
- args: "--target aarch64-apple-darwin"
+ # Enable CI feature so prod() spawns backend + sync in release builds
+ args: "--target aarch64-apple-darwin --features ci"
server-artifact: "PictoPy-MacOS"
sync-artifact: "PictoPy-Sync-MacOS"
- platform: "ubuntu-22.04"
- args: ""
+ args: "--features ci"
server-artifact: "PictoPy-Ubuntu"
sync-artifact: "PictoPy-Sync-Ubuntu"
- platform: "windows-latest"
- args: ""
+ args: "--features ci"
server-artifact: "PictoPy-Windows"
sync-artifact: "PictoPy-Sync-Windows"
runs-on: ${{ matrix.platform }}
diff --git a/.github/workflows/pr-check-build.yml b/.github/workflows/pr-check-build.yml
index af9b63ca5..a5d1a18f5 100644
--- a/.github/workflows/pr-check-build.yml
+++ b/.github/workflows/pr-check-build.yml
@@ -12,11 +12,11 @@ jobs:
matrix:
include:
- platform: "macos-latest"
- args: "--target aarch64-apple-darwin"
+ args: "--target aarch64-apple-darwin --features ci"
- platform: "ubuntu-22.04"
- args: ""
+ args: "--features ci"
- platform: "windows-latest"
- args: ""
+ args: "--features ci"
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4
diff --git a/backend/app/config/settings.py b/backend/app/config/settings.py
index 507cba473..bcbade418 100644
--- a/backend/app/config/settings.py
+++ b/backend/app/config/settings.py
@@ -1,3 +1,6 @@
+from platformdirs import user_data_dir
+import os
+
# Model Exports Path
MODEL_EXPORTS_PATH = "app/models/ONNX_Exports"
@@ -20,6 +23,9 @@
TEST_INPUT_PATH = "tests/inputs"
TEST_OUTPUT_PATH = "tests/outputs"
-DATABASE_PATH = "app/database/PictoPy.db"
-THUMBNAIL_IMAGES_PATH = "./images/thumbnails"
+if os.getenv("GITHUB_ACTIONS") == "true":
+ DATABASE_PATH = os.path.join(os.getcwd(), "test_db.sqlite3")
+else:
+ DATABASE_PATH = os.path.join(user_data_dir("PictoPy"), "database", "PictoPy.db")
+THUMBNAIL_IMAGES_PATH = os.path.join(user_data_dir("PictoPy"), "thumbnails")
IMAGES_PATH = "./images"
diff --git a/backend/app/routes/shutdown.py b/backend/app/routes/shutdown.py
new file mode 100644
index 000000000..716a79104
--- /dev/null
+++ b/backend/app/routes/shutdown.py
@@ -0,0 +1,66 @@
+import asyncio
+import os
+import platform
+import signal
+from fastapi import APIRouter
+from pydantic import BaseModel
+from app.logging.setup_logging import get_logger
+
+logger = get_logger(__name__)
+
+router = APIRouter(tags=["Shutdown"])
+
+
+class ShutdownResponse(BaseModel):
+ """Response model for shutdown endpoint."""
+
+ status: str
+ message: str
+
+
+async def _delayed_shutdown(delay: float = 0.5):
+ """
+ Shutdown the server after a short delay to allow the response to be sent.
+
+ Args:
+ delay: Seconds to wait before signaling shutdown
+ """
+ await asyncio.sleep(delay)
+ logger.info("Backend shutdown initiated, exiting process...")
+
+ if platform.system() == "Windows":
+ # Windows: SIGTERM doesn't work reliably with uvicorn subprocesses
+ os._exit(0)
+ else:
+ # Unix (Linux/macOS): SIGTERM allows cleanup handlers to run
+ os.kill(os.getpid(), signal.SIGTERM)
+
+
+@router.post("/shutdown", response_model=ShutdownResponse)
+async def shutdown():
+ """
+ Gracefully shutdown the PictoPy backend.
+
+ This endpoint schedules backend server termination after response is sent.
+ The frontend is responsible for shutting down the sync service separately.
+
+ Returns:
+ ShutdownResponse with status and message
+ """
+ logger.info("Shutdown request received for PictoPy backend")
+
+ # Define callback to handle potential exceptions in the background task
+ def _handle_shutdown_exception(task: asyncio.Task):
+ try:
+ task.result()
+ except Exception as e:
+ logger.error(f"Shutdown task failed: {e}")
+
+ # Schedule backend shutdown after response is sent
+ shutdown_task = asyncio.create_task(_delayed_shutdown())
+ shutdown_task.add_done_callback(_handle_shutdown_exception)
+
+ return ShutdownResponse(
+ status="shutting_down",
+ message="PictoPy backend shutdown initiated.",
+ )
diff --git a/backend/main.py b/backend/main.py
index db591cd97..ba3bb913a 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -6,6 +6,7 @@
import os
import json
+from app.config.settings import DATABASE_PATH, THUMBNAIL_IMAGES_PATH
from uvicorn import Config, Server
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
@@ -25,6 +26,7 @@
from app.routes.images import router as images_router
from app.routes.face_clusters import router as face_clusters_router
from app.routes.user_preferences import router as user_preferences_router
+from app.routes.shutdown import router as shutdown_router
from fastapi.openapi.utils import get_openapi
from app.logging.setup_logging import (
configure_uvicorn_logging,
@@ -38,6 +40,12 @@
# Configure Uvicorn logging to use our custom formatter
configure_uvicorn_logging("backend")
+path = os.path.dirname(DATABASE_PATH)
+os.makedirs(path, exist_ok=True)
+
+thumbnail_path = os.path.dirname(THUMBNAIL_IMAGES_PATH)
+os.makedirs(thumbnail_path, exist_ok=True)
+
@asynccontextmanager
async def lifespan(app: FastAPI):
@@ -130,6 +138,7 @@ async def root():
app.include_router(
user_preferences_router, prefix="/user-preferences", tags=["User Preferences"]
)
+app.include_router(shutdown_router, tags=["Shutdown"])
# Entry point for running with: python3 main.py
@@ -138,7 +147,6 @@ async def root():
logger = get_logger(__name__)
logger.info("Starting PictoPy backend server...")
- # Create a simple config with log_config=None to disable Uvicorn's default logging
config = Config(
app=app,
host="localhost",
diff --git a/backend/requirements.txt b/backend/requirements.txt
index b848d7ad6..743538462 100644
--- a/backend/requirements.txt
+++ b/backend/requirements.txt
@@ -71,3 +71,4 @@ ruff>=0.0.241
psutil>=5.9.5
pytest-asyncio>=1.0.0
setuptools==66.1.1
+platformdirs==4.5.1
diff --git a/docs/backend/backend_python/openapi.json b/docs/backend/backend_python/openapi.json
index fbf40091b..39ce577cc 100644
--- a/docs/backend/backend_python/openapi.json
+++ b/docs/backend/backend_python/openapi.json
@@ -1117,14 +1117,9 @@
"in": "query",
"required": false,
"schema": {
- "allOf": [
- {
- "$ref": "#/components/schemas/InputType"
- }
- ],
+ "$ref": "#/components/schemas/InputType",
"description": "Choose input type: 'path' or 'base64'",
- "default": "path",
- "title": "Input Type"
+ "default": "path"
},
"description": "Choose input type: 'path' or 'base64'"
}
@@ -1237,7 +1232,7 @@
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/app__schemas__user_preferences__ErrorResponse"
+ "$ref": "#/components/schemas/ErrorResponse"
}
}
}
@@ -1277,7 +1272,7 @@
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/app__schemas__user_preferences__ErrorResponse"
+ "$ref": "#/components/schemas/ErrorResponse"
}
}
}
@@ -1287,7 +1282,7 @@
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/app__schemas__user_preferences__ErrorResponse"
+ "$ref": "#/components/schemas/ErrorResponse"
}
}
}
@@ -1304,6 +1299,29 @@
}
}
}
+ },
+ "/shutdown": {
+ "post": {
+ "tags": [
+ "Shutdown",
+ "Shutdown"
+ ],
+ "summary": "Shutdown",
+ "description": "Gracefully shutdown the PictoPy backend.\n\nThis endpoint schedules backend server termination after response is sent.\nThe frontend is responsible for shutting down the sync service separately.\n\nReturns:\n ShutdownResponse with status and message",
+ "operationId": "shutdown_shutdown_post",
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ShutdownResponse"
+ }
+ }
+ }
+ }
+ }
+ }
}
},
"components": {
@@ -1619,6 +1637,30 @@
],
"title": "DeleteFoldersResponse"
},
+ "ErrorResponse": {
+ "properties": {
+ "success": {
+ "type": "boolean",
+ "title": "Success"
+ },
+ "error": {
+ "type": "string",
+ "title": "Error"
+ },
+ "message": {
+ "type": "string",
+ "title": "Message"
+ }
+ },
+ "type": "object",
+ "required": [
+ "success",
+ "error",
+ "message"
+ ],
+ "title": "ErrorResponse",
+ "description": "Error response model"
+ },
"FaceSearchRequest": {
"properties": {
"path": {
@@ -2204,6 +2246,7 @@
"metadata": {
"anyOf": [
{
+ "additionalProperties": true,
"type": "object"
},
{
@@ -2425,6 +2468,25 @@
],
"title": "RenameClusterResponse"
},
+ "ShutdownResponse": {
+ "properties": {
+ "status": {
+ "type": "string",
+ "title": "Status"
+ },
+ "message": {
+ "type": "string",
+ "title": "Message"
+ }
+ },
+ "type": "object",
+ "required": [
+ "status",
+ "message"
+ ],
+ "title": "ShutdownResponse",
+ "description": "Response model for shutdown endpoint."
+ },
"SuccessResponse": {
"properties": {
"success": {
@@ -2897,30 +2959,6 @@
"error"
],
"title": "ErrorResponse"
- },
- "app__schemas__user_preferences__ErrorResponse": {
- "properties": {
- "success": {
- "type": "boolean",
- "title": "Success"
- },
- "error": {
- "type": "string",
- "title": "Error"
- },
- "message": {
- "type": "string",
- "title": "Message"
- }
- },
- "type": "object",
- "required": [
- "success",
- "error",
- "message"
- ],
- "title": "ErrorResponse",
- "description": "Error response model"
}
}
}
diff --git a/frontend/src-tauri/Cargo.lock b/frontend/src-tauri/Cargo.lock
index b0e9217df..038f82916 100644
--- a/frontend/src-tauri/Cargo.lock
+++ b/frontend/src-tauri/Cargo.lock
@@ -10,9 +10,9 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "aho-corasick"
-version = "1.1.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
@@ -141,9 +141,9 @@ dependencies = [
[[package]]
name = "async-lock"
-version = "3.4.1"
+version = "3.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc"
+checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311"
dependencies = [
"event-listener",
"event-listener-strategy",
@@ -176,7 +176,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -211,7 +211,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -291,22 +291,13 @@ dependencies = [
"generic-array",
]
-[[package]]
-name = "block2"
-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.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
dependencies = [
- "objc2 0.6.3",
+ "objc2",
]
[[package]]
@@ -345,9 +336,9 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.19.0"
+version = "3.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
+checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
[[package]]
name = "bytemuck"
@@ -363,9 +354,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
-version = "1.10.1"
+version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
+checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
dependencies = [
"serde",
]
@@ -397,9 +388,9 @@ dependencies = [
[[package]]
name = "camino"
-version = "1.2.1"
+version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609"
+checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48"
dependencies = [
"serde_core",
]
@@ -434,14 +425,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77"
dependencies = [
"serde",
- "toml 0.9.8",
+ "toml 0.9.10+spec-1.1.0",
]
[[package]]
name = "cc"
-version = "1.2.43"
+version = "1.2.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2"
+checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203"
dependencies = [
"find-msvc-tools",
"shlex",
@@ -541,6 +532,16 @@ dependencies = [
"version_check",
]
+[[package]]
+name = "core-foundation"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
[[package]]
name = "core-foundation"
version = "0.10.1"
@@ -564,9 +565,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1"
dependencies = [
"bitflags 2.10.0",
- "core-foundation",
+ "core-foundation 0.10.1",
"core-graphics-types",
- "foreign-types",
+ "foreign-types 0.5.0",
"libc",
]
@@ -577,7 +578,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
dependencies = [
"bitflags 2.10.0",
- "core-foundation",
+ "core-foundation 0.10.1",
"libc",
]
@@ -641,9 +642,9 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
[[package]]
name = "crypto-common"
-version = "0.1.6"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
dependencies = [
"generic-array",
"typenum",
@@ -673,7 +674,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -683,7 +684,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501"
dependencies = [
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -707,7 +708,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -718,7 +719,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -745,7 +746,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -758,7 +759,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustc_version",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -825,9 +826,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"
dependencies = [
"bitflags 2.10.0",
- "block2 0.6.2",
+ "block2",
"libc",
- "objc2 0.6.3",
+ "objc2",
]
[[package]]
@@ -838,7 +839,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -852,9 +853,9 @@ dependencies = [
[[package]]
name = "dlopen2"
-version = "0.8.0"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff"
+checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4"
dependencies = [
"dlopen2_derive",
"libc",
@@ -864,13 +865,13 @@ dependencies = [
[[package]]
name = "dlopen2_derive"
-version = "0.4.1"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4"
+checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -890,9 +891,9 @@ dependencies = [
[[package]]
name = "dtoa"
-version = "1.0.10"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04"
+checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590"
[[package]]
name = "dtoa-short"
@@ -930,7 +931,7 @@ dependencies = [
"cc",
"memchr",
"rustc_version",
- "toml 0.9.8",
+ "toml 0.9.10+spec-1.1.0",
"vswhom",
"winreg",
]
@@ -952,9 +953,9 @@ dependencies = [
[[package]]
name = "endi"
-version = "1.1.0"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf"
+checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"
[[package]]
name = "enumflags2"
@@ -974,7 +975,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -985,9 +986,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "erased-serde"
-version = "0.4.8"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b"
+checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3"
dependencies = [
"serde",
"serde_core",
@@ -1027,9 +1028,9 @@ dependencies = [
[[package]]
name = "exr"
-version = "1.73.0"
+version = "1.74.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0"
+checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be"
dependencies = [
"bit_field",
"half",
@@ -1079,9 +1080,9 @@ dependencies = [
[[package]]
name = "find-msvc-tools"
-version = "0.1.4"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127"
+checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff"
[[package]]
name = "flate2"
@@ -1099,6 +1100,15 @@ 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"
@@ -1106,7 +1116,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
dependencies = [
"foreign-types-macros",
- "foreign-types-shared",
+ "foreign-types-shared 0.3.1",
]
[[package]]
@@ -1117,9 +1127,15 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
+[[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"
@@ -1152,6 +1168,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
dependencies = [
"futures-core",
+ "futures-sink",
]
[[package]]
@@ -1198,7 +1215,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -1340,9 +1357,9 @@ dependencies = [
[[package]]
name = "generic-array"
-version = "0.14.9"
+version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
"typenum",
"version_check",
@@ -1462,7 +1479,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -1541,7 +1558,26 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "h2"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "http",
+ "indexmap 2.13.0",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
]
[[package]]
@@ -1563,9 +1599,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "hashbrown"
-version = "0.16.0"
+version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
+checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
[[package]]
name = "heck"
@@ -1605,12 +1641,11 @@ dependencies = [
[[package]]
name = "http"
-version = "1.3.1"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
+checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
dependencies = [
"bytes",
- "fnv",
"itoa",
]
@@ -1651,14 +1686,15 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
[[package]]
name = "hyper"
-version = "1.7.0"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e"
+checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11"
dependencies = [
"atomic-waker",
"bytes",
"futures-channel",
"futures-core",
+ "h2",
"http",
"http-body",
"httparse",
@@ -1687,11 +1723,27 @@ 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",
+ "hyper-util",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+ "tower-service",
+]
+
[[package]]
name = "hyper-util"
-version = "0.1.17"
+version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8"
+checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f"
dependencies = [
"base64 0.22.1",
"bytes",
@@ -1706,9 +1758,11 @@ dependencies = [
"percent-encoding",
"pin-project-lite",
"socket2",
+ "system-configuration",
"tokio",
"tower-service",
"tracing",
+ "windows-registry",
]
[[package]]
@@ -1747,9 +1801,9 @@ dependencies = [
[[package]]
name = "icu_collections"
-version = "2.1.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f578a71f2bfaf7ceb30b519a645ae48024b45f9eecbe060a31a004d7b4ba9462"
+checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
dependencies = [
"displaydoc",
"potential_utf",
@@ -1760,9 +1814,9 @@ dependencies = [
[[package]]
name = "icu_locale_core"
-version = "2.1.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c219b62bf5a06801012446193fdfcbd7970e876823aba4c62def2ce957dcb44"
+checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
dependencies = [
"displaydoc",
"litemap",
@@ -1773,9 +1827,9 @@ dependencies = [
[[package]]
name = "icu_normalizer"
-version = "2.1.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33747cecc725eebb47ac503fab725e395d50cb7889ae490a1359f130611d4cc5"
+checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
dependencies = [
"icu_collections",
"icu_normalizer_data",
@@ -1787,15 +1841,15 @@ dependencies = [
[[package]]
name = "icu_normalizer_data"
-version = "2.1.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6ce2d23e1b3c45624ba6a23e2c767e01c9680e0c0800b39c7abfff9565175d8"
+checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
[[package]]
name = "icu_properties"
-version = "2.1.0"
+version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d70f9b6574c79f7a83ea5ce72cc88d271a3e77355c5f7748a107e751d8617fb"
+checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"
dependencies = [
"icu_collections",
"icu_locale_core",
@@ -1807,15 +1861,15 @@ dependencies = [
[[package]]
name = "icu_properties_data"
-version = "2.1.0"
+version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17fa55bf868e28e638ed132bcee1e5c21ba2c1e52c15e7c78b781858e7b54342"
+checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"
[[package]]
name = "icu_provider"
-version = "2.1.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f64958e359123591ae1f17a27b5fc9ebdb50c98b04e0401146154de1d8fe3e44"
+checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
dependencies = [
"displaydoc",
"icu_locale_core",
@@ -1884,12 +1938,12 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.12.0"
+version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f"
+checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
dependencies = [
"equivalent",
- "hashbrown 0.16.0",
+ "hashbrown 0.16.1",
"serde",
"serde_core",
]
@@ -1911,9 +1965,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
[[package]]
name = "iri-string"
-version = "0.7.8"
+version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
+checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a"
dependencies = [
"memchr",
"serde",
@@ -1940,9 +1994,9 @@ dependencies = [
[[package]]
name = "itoa"
-version = "1.0.15"
+version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
[[package]]
name = "javascriptcore-rs"
@@ -2000,9 +2054,9 @@ dependencies = [
[[package]]
name = "js-sys"
-version = "0.3.82"
+version = "0.3.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
+checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -2049,7 +2103,7 @@ checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2"
dependencies = [
"cssparser",
"html5ever",
- "indexmap 2.12.0",
+ "indexmap 2.13.0",
"selectors",
]
@@ -2091,9 +2145,9 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.177"
+version = "0.2.179"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
+checksum = "c5a2d376baa530d1238d133232d15e239abad80d05838b4b59354e5268af431f"
[[package]]
name = "libloading"
@@ -2117,13 +2171,13 @@ dependencies = [
[[package]]
name = "libredox"
-version = "0.1.10"
+version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb"
+checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616"
dependencies = [
"bitflags 2.10.0",
"libc",
- "redox_syscall",
+ "redox_syscall 0.7.0",
]
[[package]]
@@ -2149,9 +2203,9 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.28"
+version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
+checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]]
name = "lru-slab"
@@ -2187,7 +2241,7 @@ checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -2235,9 +2289,9 @@ dependencies = [
[[package]]
name = "mio"
-version = "1.1.0"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873"
+checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc"
dependencies = [
"libc",
"wasi 0.11.1+wasi-snapshot-preview1",
@@ -2254,10 +2308,10 @@ dependencies = [
"dpi",
"gtk",
"keyboard-types",
- "objc2 0.6.3",
+ "objc2",
"objc2-app-kit",
"objc2-core-foundation",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
"once_cell",
"png",
"serde",
@@ -2265,6 +2319,23 @@ dependencies = [
"windows-sys 0.60.2",
]
+[[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",
+ "security-framework-sys",
+ "tempfile",
+]
+
[[package]]
name = "ndk"
version = "0.9.0"
@@ -2320,6 +2391,15 @@ version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
+[[package]]
+name = "ntapi"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c70f219e21142367c70c0b30c6a9e3a14d55b4d12a204d897fbec83a0363f081"
+dependencies = [
+ "winapi",
+]
+
[[package]]
name = "num-conv"
version = "0.1.0"
@@ -2354,23 +2434,7 @@ dependencies = [
"proc-macro-crate 3.4.0",
"proc-macro2",
"quote",
- "syn 2.0.108",
-]
-
-[[package]]
-name = "objc-sys"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
-
-[[package]]
-name = "objc2"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
-dependencies = [
- "objc-sys",
- "objc2-encode",
+ "syn 2.0.114",
]
[[package]]
@@ -2390,9 +2454,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
dependencies = [
"bitflags 2.10.0",
- "block2 0.6.2",
+ "block2",
"libc",
- "objc2 0.6.3",
+ "objc2",
"objc2-cloud-kit",
"objc2-core-data",
"objc2-core-foundation",
@@ -2400,8 +2464,8 @@ dependencies = [
"objc2-core-image",
"objc2-core-text",
"objc2-core-video",
- "objc2-foundation 0.3.2",
- "objc2-quartz-core 0.3.2",
+ "objc2-foundation",
+ "objc2-quartz-core",
]
[[package]]
@@ -2411,8 +2475,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"
dependencies = [
"bitflags 2.10.0",
- "objc2 0.6.3",
- "objc2-foundation 0.3.2",
+ "objc2",
+ "objc2-foundation",
]
[[package]]
@@ -2422,8 +2486,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"
dependencies = [
"bitflags 2.10.0",
- "objc2 0.6.3",
- "objc2-foundation 0.3.2",
+ "objc2",
+ "objc2-foundation",
]
[[package]]
@@ -2434,7 +2498,7 @@ checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
dependencies = [
"bitflags 2.10.0",
"dispatch2",
- "objc2 0.6.3",
+ "objc2",
]
[[package]]
@@ -2445,7 +2509,7 @@ checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
dependencies = [
"bitflags 2.10.0",
"dispatch2",
- "objc2 0.6.3",
+ "objc2",
"objc2-core-foundation",
"objc2-io-surface",
]
@@ -2456,8 +2520,8 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"
dependencies = [
- "objc2 0.6.3",
- "objc2-foundation 0.3.2",
+ "objc2",
+ "objc2-foundation",
]
[[package]]
@@ -2467,7 +2531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"
dependencies = [
"bitflags 2.10.0",
- "objc2 0.6.3",
+ "objc2",
"objc2-core-foundation",
"objc2-core-graphics",
]
@@ -2479,7 +2543,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6"
dependencies = [
"bitflags 2.10.0",
- "objc2 0.6.3",
+ "objc2",
"objc2-core-foundation",
"objc2-core-graphics",
"objc2-io-surface",
@@ -2502,26 +2566,24 @@ dependencies = [
[[package]]
name = "objc2-foundation"
-version = "0.2.2"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
+checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
dependencies = [
"bitflags 2.10.0",
- "block2 0.5.1",
+ "block2",
"libc",
- "objc2 0.5.2",
+ "objc2",
+ "objc2-core-foundation",
]
[[package]]
-name = "objc2-foundation"
+name = "objc2-io-kit"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
+checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15"
dependencies = [
- "bitflags 2.10.0",
- "block2 0.6.2",
"libc",
- "objc2 0.6.3",
"objc2-core-foundation",
]
@@ -2532,7 +2594,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
dependencies = [
"bitflags 2.10.0",
- "objc2 0.6.3",
+ "objc2",
"objc2-core-foundation",
]
@@ -2542,22 +2604,10 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586"
dependencies = [
- "objc2 0.6.3",
+ "objc2",
"objc2-core-foundation",
]
-[[package]]
-name = "objc2-metal"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
-dependencies = [
- "bitflags 2.10.0",
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-foundation 0.2.2",
-]
-
[[package]]
name = "objc2-osa-kit"
version = "0.3.2"
@@ -2565,22 +2615,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f112d1746737b0da274ef79a23aac283376f335f4095a083a267a082f21db0c0"
dependencies = [
"bitflags 2.10.0",
- "objc2 0.6.3",
+ "objc2",
"objc2-app-kit",
- "objc2-foundation 0.3.2",
-]
-
-[[package]]
-name = "objc2-quartz-core"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
-dependencies = [
- "bitflags 2.10.0",
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-foundation 0.2.2",
- "objc2-metal",
+ "objc2-foundation",
]
[[package]]
@@ -2590,8 +2627,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"
dependencies = [
"bitflags 2.10.0",
- "objc2 0.6.3",
- "objc2-foundation 0.3.2",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-foundation",
]
[[package]]
@@ -2601,7 +2639,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a"
dependencies = [
"bitflags 2.10.0",
- "objc2 0.6.3",
+ "objc2",
"objc2-core-foundation",
]
@@ -2612,9 +2650,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22"
dependencies = [
"bitflags 2.10.0",
- "objc2 0.6.3",
+ "objc2",
"objc2-core-foundation",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
]
[[package]]
@@ -2624,11 +2662,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f"
dependencies = [
"bitflags 2.10.0",
- "block2 0.6.2",
- "objc2 0.6.3",
+ "block2",
+ "objc2",
"objc2-app-kit",
"objc2-core-foundation",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
"objc2-javascript-core",
"objc2-security",
]
@@ -2641,9 +2679,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "open"
-version = "5.3.2"
+version = "5.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95"
+checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc"
dependencies = [
"dunce",
"is-wsl",
@@ -2651,6 +2689,50 @@ dependencies = [
"pathdiff",
]
+[[package]]
+name = "openssl"
+version = "0.10.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328"
+dependencies = [
+ "bitflags 2.10.0",
+ "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.114",
+]
+
+[[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.111"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
[[package]]
name = "option-ext"
version = "0.2.0"
@@ -2683,8 +2765,8 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b"
dependencies = [
- "objc2 0.6.3",
- "objc2-foundation 0.3.2",
+ "objc2",
+ "objc2-foundation",
"objc2-osa-kit",
"serde",
"serde_json",
@@ -2740,7 +2822,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall",
+ "redox_syscall 0.5.18",
"smallvec",
"windows-link 0.2.1",
]
@@ -2861,7 +2943,7 @@ dependencies = [
"phf_shared 0.11.3",
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -2903,9 +2985,11 @@ dependencies = [
"directories",
"image",
"rand 0.8.5",
+ "reqwest",
"ring 0.16.20",
"serde",
"serde_json",
+ "sysinfo",
"tauri",
"tauri-build",
"tauri-plugin-dialog",
@@ -2957,8 +3041,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07"
dependencies = [
"base64 0.22.1",
- "indexmap 2.12.0",
- "quick-xml 0.38.3",
+ "indexmap 2.13.0",
+ "quick-xml",
"serde",
"time",
]
@@ -3046,7 +3130,7 @@ version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983"
dependencies = [
- "toml_edit 0.23.7",
+ "toml_edit 0.23.10+spec-1.0.0",
]
[[package]]
@@ -3081,9 +3165,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]]
name = "proc-macro2"
-version = "1.0.103"
+version = "1.0.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
+checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
dependencies = [
"unicode-ident",
]
@@ -3099,18 +3183,9 @@ dependencies = [
[[package]]
name = "quick-xml"
-version = "0.37.5"
+version = "0.38.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "quick-xml"
-version = "0.38.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89"
+checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c"
dependencies = [
"memchr",
]
@@ -3172,9 +3247,9 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.41"
+version = "1.0.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1"
+checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
dependencies = [
"proc-macro2",
]
@@ -3330,6 +3405,15 @@ dependencies = [
"bitflags 2.10.0",
]
+[[package]]
+name = "redox_syscall"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27"
+dependencies = [
+ "bitflags 2.10.0",
+]
+
[[package]]
name = "redox_users"
version = "0.4.6"
@@ -3369,7 +3453,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -3403,22 +3487,28 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
[[package]]
name = "reqwest"
-version = "0.12.24"
+version = "0.12.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f"
+checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"
dependencies = [
"base64 0.22.1",
"bytes",
+ "encoding_rs",
+ "futures-channel",
"futures-core",
"futures-util",
+ "h2",
"http",
"http-body",
"http-body-util",
"hyper",
"hyper-rustls",
+ "hyper-tls",
"hyper-util",
"js-sys",
"log",
+ "mime",
+ "native-tls",
"percent-encoding",
"pin-project-lite",
"quinn",
@@ -3429,6 +3519,7 @@ dependencies = [
"serde_urlencoded",
"sync_wrapper",
"tokio",
+ "tokio-native-tls",
"tokio-rustls",
"tokio-util",
"tower",
@@ -3449,17 +3540,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed"
dependencies = [
"ashpd",
- "block2 0.6.2",
+ "block2",
"dispatch2",
"glib-sys",
"gobject-sys",
"gtk-sys",
"js-sys",
"log",
- "objc2 0.6.3",
+ "objc2",
"objc2-app-kit",
"objc2-core-foundation",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
"raw-window-handle",
"wasm-bindgen",
"wasm-bindgen-futures",
@@ -3513,9 +3604,9 @@ dependencies = [
[[package]]
name = "rustix"
-version = "1.1.2"
+version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
+checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
dependencies = [
"bitflags 2.10.0",
"errno",
@@ -3526,9 +3617,9 @@ dependencies = [
[[package]]
name = "rustls"
-version = "0.23.34"
+version = "0.23.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7"
+checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b"
dependencies = [
"once_cell",
"ring 0.17.14",
@@ -3540,9 +3631,9 @@ dependencies = [
[[package]]
name = "rustls-pki-types"
-version = "1.13.0"
+version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a"
+checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282"
dependencies = [
"web-time",
"zeroize",
@@ -3550,9 +3641,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
-version = "0.103.7"
+version = "0.103.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf"
+checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52"
dependencies = [
"ring 0.17.14",
"rustls-pki-types",
@@ -3567,9 +3658,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "ryu"
-version = "1.0.20"
+version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984"
[[package]]
name = "same-file"
@@ -3580,6 +3671,15 @@ dependencies = [
"winapi-util",
]
+[[package]]
+name = "schannel"
+version = "0.1.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
[[package]]
name = "schemars"
version = "0.8.22"
@@ -3609,9 +3709,9 @@ dependencies = [
[[package]]
name = "schemars"
-version = "1.0.4"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0"
+checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2"
dependencies = [
"dyn-clone",
"ref-cast",
@@ -3628,7 +3728,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -3643,6 +3743,29 @@ 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.10.0",
+ "core-foundation 0.9.4",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
[[package]]
name = "selectors"
version = "0.24.0"
@@ -3710,7 +3833,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -3721,20 +3844,20 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
name = "serde_json"
-version = "1.0.145"
+version = "1.0.149"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
+checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
dependencies = [
"itoa",
"memchr",
- "ryu",
"serde",
"serde_core",
+ "zmij",
]
[[package]]
@@ -3745,7 +3868,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -3759,9 +3882,9 @@ dependencies = [
[[package]]
name = "serde_spanned"
-version = "1.0.3"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392"
+checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776"
dependencies = [
"serde_core",
]
@@ -3780,17 +3903,17 @@ dependencies = [
[[package]]
name = "serde_with"
-version = "3.15.1"
+version = "3.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04"
+checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7"
dependencies = [
"base64 0.22.1",
"chrono",
"hex",
"indexmap 1.9.3",
- "indexmap 2.12.0",
+ "indexmap 2.13.0",
"schemars 0.9.0",
- "schemars 1.0.4",
+ "schemars 1.2.0",
"serde_core",
"serde_json",
"serde_with_macros",
@@ -3799,14 +3922,14 @@ dependencies = [
[[package]]
name = "serde_with_macros"
-version = "3.15.1"
+version = "3.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955"
+checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c"
dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -3828,7 +3951,7 @@ checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -3892,18 +4015,19 @@ dependencies = [
[[package]]
name = "signal-hook-registry"
-version = "1.4.6"
+version = "1.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
+checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
dependencies = [
+ "errno",
"libc",
]
[[package]]
name = "simd-adler32"
-version = "0.3.7"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
+checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2"
[[package]]
name = "siphasher"
@@ -3941,24 +4065,24 @@ dependencies = [
[[package]]
name = "softbuffer"
-version = "0.4.6"
+version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08"
+checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3"
dependencies = [
"bytemuck",
- "cfg_aliases",
- "core-graphics",
- "foreign-types",
"js-sys",
- "log",
- "objc2 0.5.2",
- "objc2-foundation 0.2.2",
- "objc2-quartz-core 0.2.2",
+ "ndk",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-foundation",
+ "objc2-quartz-core",
"raw-window-handle",
- "redox_syscall",
+ "redox_syscall 0.5.18",
+ "tracing",
"wasm-bindgen",
"web-sys",
- "windows-sys 0.59.0",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -4066,9 +4190,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.108"
+version = "2.0.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917"
+checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
dependencies = [
"proc-macro2",
"quote",
@@ -4092,7 +4216,42 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "sysinfo"
+version = "0.37.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16607d5caffd1c07ce073528f9ed972d88db15dd44023fa57142963be3feb11f"
+dependencies = [
+ "libc",
+ "memchr",
+ "ntapi",
+ "objc2-core-foundation",
+ "objc2-io-kit",
+ "windows",
+]
+
+[[package]]
+name = "system-configuration"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
+dependencies = [
+ "bitflags 2.10.0",
+ "core-foundation 0.9.4",
+ "system-configuration-sys",
+]
+
+[[package]]
+name = "system-configuration-sys"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
]
[[package]]
@@ -4115,8 +4274,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7"
dependencies = [
"bitflags 2.10.0",
- "block2 0.6.2",
- "core-foundation",
+ "block2",
+ "core-foundation 0.10.1",
"core-graphics",
"crossbeam-channel",
"dispatch",
@@ -4132,9 +4291,9 @@ dependencies = [
"ndk",
"ndk-context",
"ndk-sys",
- "objc2 0.6.3",
+ "objc2",
"objc2-app-kit",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
"once_cell",
"parking_lot",
"raw-window-handle",
@@ -4156,7 +4315,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -4178,9 +4337,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]]
name = "tauri"
-version = "2.9.1"
+version = "2.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9871670c6711f50fddd4e20350be6b9dd6e6c2b5d77d8ee8900eb0d58cd837a"
+checksum = "8a3868da5508446a7cd08956d523ac3edf0a8bc20bf7e4038f9a95c2800d2033"
dependencies = [
"anyhow",
"bytes",
@@ -4199,9 +4358,9 @@ dependencies = [
"log",
"mime",
"muda",
- "objc2 0.6.3",
+ "objc2",
"objc2-app-kit",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
"objc2-ui-kit",
"objc2-web-kit",
"percent-encoding",
@@ -4230,9 +4389,9 @@ dependencies = [
[[package]]
name = "tauri-build"
-version = "2.5.1"
+version = "2.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38"
+checksum = "17fcb8819fd16463512a12f531d44826ce566f486d7ccd211c9c8cebdaec4e08"
dependencies = [
"anyhow",
"cargo_toml",
@@ -4246,15 +4405,15 @@ dependencies = [
"serde_json",
"tauri-utils",
"tauri-winres",
- "toml 0.9.8",
+ "toml 0.9.10+spec-1.1.0",
"walkdir",
]
[[package]]
name = "tauri-codegen"
-version = "2.5.0"
+version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190"
+checksum = "9fa9844cefcf99554a16e0a278156ae73b0d8680bbc0e2ad1e4287aadd8489cf"
dependencies = [
"base64 0.22.1",
"brotli",
@@ -4268,7 +4427,7 @@ dependencies = [
"serde",
"serde_json",
"sha2",
- "syn 2.0.108",
+ "syn 2.0.114",
"tauri-utils",
"thiserror 2.0.17",
"time",
@@ -4279,23 +4438,23 @@ dependencies = [
[[package]]
name = "tauri-macros"
-version = "2.5.0"
+version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f"
+checksum = "3764a12f886d8245e66b7ee9b43ccc47883399be2019a61d80cf0f4117446fde"
dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
"tauri-codegen",
"tauri-utils",
]
[[package]]
name = "tauri-plugin"
-version = "2.5.1"
+version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d"
+checksum = "0e1d0a4860b7ff570c891e1d2a586bf1ede205ff858fbc305e0b5ae5d14c1377"
dependencies = [
"anyhow",
"glob",
@@ -4304,7 +4463,7 @@ dependencies = [
"serde",
"serde_json",
"tauri-utils",
- "toml 0.9.8",
+ "toml 0.9.10+spec-1.1.0",
"walkdir",
]
@@ -4344,7 +4503,7 @@ dependencies = [
"tauri-plugin",
"tauri-utils",
"thiserror 2.0.17",
- "toml 0.9.8",
+ "toml 0.9.10+spec-1.1.0",
"url",
]
@@ -4357,7 +4516,7 @@ dependencies = [
"dunce",
"glob",
"objc2-app-kit",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
"open",
"schemars 0.8.22",
"serde",
@@ -4451,16 +4610,16 @@ dependencies = [
[[package]]
name = "tauri-runtime"
-version = "2.9.1"
+version = "2.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926"
+checksum = "87f766fe9f3d1efc4b59b17e7a891ad5ed195fa8d23582abb02e6c9a01137892"
dependencies = [
"cookie",
"dpi",
"gtk",
"http",
"jni",
- "objc2 0.6.3",
+ "objc2",
"objc2-ui-kit",
"objc2-web-kit",
"raw-window-handle",
@@ -4476,17 +4635,17 @@ dependencies = [
[[package]]
name = "tauri-runtime-wry"
-version = "2.9.1"
+version = "2.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93"
+checksum = "187a3f26f681bdf028f796ccf57cf478c1ee422c50128e5a0a6ebeb3f5910065"
dependencies = [
"gtk",
"http",
"jni",
"log",
- "objc2 0.6.3",
+ "objc2",
"objc2-app-kit",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
"once_cell",
"percent-encoding",
"raw-window-handle",
@@ -4503,9 +4662,9 @@ dependencies = [
[[package]]
name = "tauri-utils"
-version = "2.8.0"
+version = "2.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673"
+checksum = "76a423c51176eb3616ee9b516a9fa67fed5f0e78baaba680e44eb5dd2cc37490"
dependencies = [
"anyhow",
"brotli",
@@ -4532,7 +4691,7 @@ dependencies = [
"serde_with",
"swift-rs",
"thiserror 2.0.17",
- "toml 0.9.8",
+ "toml 0.9.10+spec-1.1.0",
"url",
"urlpattern",
"uuid",
@@ -4541,19 +4700,20 @@ dependencies = [
[[package]]
name = "tauri-winres"
-version = "0.3.3"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074"
+checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0"
dependencies = [
+ "dunce",
"embed-resource",
- "toml 0.9.8",
+ "toml 0.9.10+spec-1.1.0",
]
[[package]]
name = "tempfile"
-version = "3.23.0"
+version = "3.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
+checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c"
dependencies = [
"fastrand",
"getrandom 0.3.4",
@@ -4599,7 +4759,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -4610,7 +4770,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -4682,9 +4842,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.48.0"
+version = "1.49.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408"
+checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86"
dependencies = [
"bytes",
"libc",
@@ -4705,7 +4865,17 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
+]
+
+[[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]]
@@ -4720,9 +4890,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.16"
+version = "0.7.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
+checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
dependencies = [
"bytes",
"futures-core",
@@ -4745,17 +4915,17 @@ dependencies = [
[[package]]
name = "toml"
-version = "0.9.8"
+version = "0.9.10+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8"
+checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48"
dependencies = [
- "indexmap 2.12.0",
+ "indexmap 2.13.0",
"serde_core",
- "serde_spanned 1.0.3",
- "toml_datetime 0.7.3",
+ "serde_spanned 1.0.4",
+ "toml_datetime 0.7.5+spec-1.1.0",
"toml_parser",
"toml_writer",
- "winnow 0.7.13",
+ "winnow 0.7.14",
]
[[package]]
@@ -4769,9 +4939,9 @@ dependencies = [
[[package]]
name = "toml_datetime"
-version = "0.7.3"
+version = "0.7.5+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533"
+checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
dependencies = [
"serde_core",
]
@@ -4782,7 +4952,7 @@ version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
- "indexmap 2.12.0",
+ "indexmap 2.13.0",
"toml_datetime 0.6.3",
"winnow 0.5.40",
]
@@ -4793,7 +4963,7 @@ version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
dependencies = [
- "indexmap 2.12.0",
+ "indexmap 2.13.0",
"serde",
"serde_spanned 0.6.9",
"toml_datetime 0.6.3",
@@ -4802,30 +4972,30 @@ dependencies = [
[[package]]
name = "toml_edit"
-version = "0.23.7"
+version = "0.23.10+spec-1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d"
+checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269"
dependencies = [
- "indexmap 2.12.0",
- "toml_datetime 0.7.3",
+ "indexmap 2.13.0",
+ "toml_datetime 0.7.5+spec-1.1.0",
"toml_parser",
- "winnow 0.7.13",
+ "winnow 0.7.14",
]
[[package]]
name = "toml_parser"
-version = "1.0.4"
+version = "1.0.6+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e"
+checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"
dependencies = [
- "winnow 0.7.13",
+ "winnow 0.7.14",
]
[[package]]
name = "toml_writer"
-version = "1.0.4"
+version = "1.0.6+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2"
+checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607"
[[package]]
name = "tower"
@@ -4844,9 +5014,9 @@ dependencies = [
[[package]]
name = "tower-http"
-version = "0.6.6"
+version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
+checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
dependencies = [
"bitflags 2.10.0",
"bytes",
@@ -4874,9 +5044,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
[[package]]
name = "tracing"
-version = "0.1.41"
+version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
+checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [
"pin-project-lite",
"tracing-attributes",
@@ -4885,39 +5055,39 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.30"
+version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
+checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
name = "tracing-core"
-version = "0.1.34"
+version = "0.1.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
+checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
dependencies = [
"once_cell",
]
[[package]]
name = "tray-icon"
-version = "0.21.2"
+version = "0.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b"
+checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c"
dependencies = [
"crossbeam-channel",
"dirs",
"libappindicator",
"muda",
- "objc2 0.6.3",
+ "objc2",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-core-graphics",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
"once_cell",
"png",
"serde",
@@ -4997,9 +5167,9 @@ dependencies = [
[[package]]
name = "unicode-ident"
-version = "1.0.20"
+version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06"
+checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "unicode-segmentation"
@@ -5021,14 +5191,15 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "url"
-version = "2.5.7"
+version = "2.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
+checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
"serde",
+ "serde_derive",
]
[[package]]
@@ -5057,21 +5228,27 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
-version = "1.18.1"
+version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2"
+checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a"
dependencies = [
"getrandom 0.3.4",
"js-sys",
- "serde",
+ "serde_core",
"wasm-bindgen",
]
+[[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"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b"
+checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e"
[[package]]
name = "version_check"
@@ -5141,9 +5318,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen"
-version = "0.2.105"
+version = "0.2.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60"
+checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd"
dependencies = [
"cfg-if",
"once_cell",
@@ -5154,9 +5331,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.55"
+version = "0.4.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0"
+checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c"
dependencies = [
"cfg-if",
"js-sys",
@@ -5167,9 +5344,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.105"
+version = "0.2.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2"
+checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -5177,22 +5354,22 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.105"
+version = "0.2.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc"
+checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.105"
+version = "0.2.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76"
+checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4"
dependencies = [
"unicode-ident",
]
@@ -5212,9 +5389,9 @@ dependencies = [
[[package]]
name = "wayland-backend"
-version = "0.3.11"
+version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35"
+checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9"
dependencies = [
"cc",
"downcast-rs",
@@ -5226,9 +5403,9 @@ dependencies = [
[[package]]
name = "wayland-client"
-version = "0.31.11"
+version = "0.31.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d"
+checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec"
dependencies = [
"bitflags 2.10.0",
"rustix",
@@ -5238,9 +5415,9 @@ dependencies = [
[[package]]
name = "wayland-protocols"
-version = "0.32.9"
+version = "0.32.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901"
+checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3"
dependencies = [
"bitflags 2.10.0",
"wayland-backend",
@@ -5250,20 +5427,20 @@ dependencies = [
[[package]]
name = "wayland-scanner"
-version = "0.31.7"
+version = "0.31.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3"
+checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3"
dependencies = [
"proc-macro2",
- "quick-xml 0.37.5",
+ "quick-xml",
"quote",
]
[[package]]
name = "wayland-sys"
-version = "0.31.7"
+version = "0.31.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142"
+checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd"
dependencies = [
"dlib",
"log",
@@ -5272,9 +5449,9 @@ dependencies = [
[[package]]
name = "web-sys"
-version = "0.3.82"
+version = "0.3.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1"
+checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -5336,18 +5513,18 @@ dependencies = [
[[package]]
name = "webpki-roots"
-version = "1.0.3"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8"
+checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c"
dependencies = [
"rustls-pki-types",
]
[[package]]
name = "webview2-com"
-version = "0.38.0"
+version = "0.38.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4"
+checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a"
dependencies = [
"webview2-com-macros",
"webview2-com-sys",
@@ -5359,20 +5536,20 @@ dependencies = [
[[package]]
name = "webview2-com-macros"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431"
+checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
name = "webview2-com-sys"
-version = "0.38.0"
+version = "0.38.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c"
+checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c"
dependencies = [
"thiserror 2.0.17",
"windows",
@@ -5381,9 +5558,9 @@ dependencies = [
[[package]]
name = "weezl"
-version = "0.1.10"
+version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3"
+checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
[[package]]
name = "winapi"
@@ -5422,10 +5599,10 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c"
dependencies = [
- "objc2 0.6.3",
+ "objc2",
"objc2-app-kit",
"objc2-core-foundation",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
"raw-window-handle",
"windows-sys 0.59.0",
"windows-version",
@@ -5498,7 +5675,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -5509,7 +5686,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -5534,6 +5711,17 @@ dependencies = [
"windows-link 0.1.3",
]
+[[package]]
+name = "windows-registry"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720"
+dependencies = [
+ "windows-link 0.2.1",
+ "windows-result 0.4.1",
+ "windows-strings 0.5.1",
+]
+
[[package]]
name = "windows-result"
version = "0.3.4"
@@ -5830,9 +6018,9 @@ dependencies = [
[[package]]
name = "winnow"
-version = "0.7.13"
+version = "0.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf"
+checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829"
dependencies = [
"memchr",
]
@@ -5866,7 +6054,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2"
dependencies = [
"base64 0.22.1",
- "block2 0.6.2",
+ "block2",
"cookie",
"crossbeam-channel",
"dirs",
@@ -5881,10 +6069,10 @@ dependencies = [
"kuchikiki",
"libc",
"ndk",
- "objc2 0.6.3",
+ "objc2",
"objc2-app-kit",
"objc2-core-foundation",
- "objc2-foundation 0.3.2",
+ "objc2-foundation",
"objc2-ui-kit",
"objc2-web-kit",
"once_cell",
@@ -5954,7 +6142,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
"synstructure",
]
@@ -5987,7 +6175,7 @@ dependencies = [
"uds_windows",
"uuid",
"windows-sys 0.61.2",
- "winnow 0.7.13",
+ "winnow 0.7.14",
"zbus_macros",
"zbus_names",
"zvariant",
@@ -6002,7 +6190,7 @@ dependencies = [
"proc-macro-crate 3.4.0",
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
"zbus_names",
"zvariant",
"zvariant_utils",
@@ -6016,28 +6204,28 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97"
dependencies = [
"serde",
"static_assertions",
- "winnow 0.7.13",
+ "winnow 0.7.14",
"zvariant",
]
[[package]]
name = "zerocopy"
-version = "0.8.27"
+version = "0.8.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c"
+checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.8.27"
+version = "0.8.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
+checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -6057,7 +6245,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
"synstructure",
]
@@ -6097,7 +6285,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
]
[[package]]
@@ -6108,10 +6296,16 @@ checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1"
dependencies = [
"arbitrary",
"crc32fast",
- "indexmap 2.12.0",
+ "indexmap 2.13.0",
"memchr",
]
+[[package]]
+name = "zmij"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fc5a66a20078bf1251bde995aa2fdcc4b800c70b5d92dd2c62abc5c60f679f8"
+
[[package]]
name = "zune-inflate"
version = "0.2.54"
@@ -6131,7 +6325,7 @@ dependencies = [
"enumflags2",
"serde",
"url",
- "winnow 0.7.13",
+ "winnow 0.7.14",
"zvariant_derive",
"zvariant_utils",
]
@@ -6145,7 +6339,7 @@ dependencies = [
"proc-macro-crate 3.4.0",
"proc-macro2",
"quote",
- "syn 2.0.108",
+ "syn 2.0.114",
"zvariant_utils",
]
@@ -6158,6 +6352,6 @@ dependencies = [
"proc-macro2",
"quote",
"serde",
- "syn 2.0.108",
- "winnow 0.7.13",
+ "syn 2.0.114",
+ "winnow 0.7.14",
]
diff --git a/frontend/src-tauri/Cargo.toml b/frontend/src-tauri/Cargo.toml
index 27a402134..c16753a36 100644
--- a/frontend/src-tauri/Cargo.toml
+++ b/frontend/src-tauri/Cargo.toml
@@ -12,7 +12,9 @@ tauri-build = { version = "2.0.6", features = [] }
[dependencies]
tauri = { version = "2.9.1", features = ["protocol-asset", "devtools"] }
+reqwest = { version = "0.12", features = ["blocking"] }
walkdir = "2.3"
+sysinfo = "0.37.2"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1"
anyhow = "1.0"
@@ -39,5 +41,6 @@ tauri-plugin-opener = "2.5.2"
[features]
# This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!!
custom-protocol = ["tauri/custom-protocol"]
+ci = []
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
diff --git a/frontend/src-tauri/capabilities/migrated.json b/frontend/src-tauri/capabilities/migrated.json
index cd84f5574..297b9f7be 100644
--- a/frontend/src-tauri/capabilities/migrated.json
+++ b/frontend/src-tauri/capabilities/migrated.json
@@ -88,50 +88,6 @@
"shell:default",
"dialog:default",
"dialog:default",
- {
- "identifier": "shell:allow-spawn",
- "allow": [
- {
- "name": "StartBackendUnix",
- "cmd": "bash",
- "args": ["-c", "./PictoPy_Server"],
- "sidecar": false
- }
- ]
- },
- {
- "identifier": "shell:allow-spawn",
- "allow": [
- {
- "name": "StartBackendWindows",
- "cmd": "powershell",
- "args": ["./PictoPy_Server"],
- "sidecar": false
- }
- ]
- },
- {
- "identifier": "shell:allow-spawn",
- "allow": [
- {
- "name": "StartSyncServiceUnix",
- "cmd": "bash",
- "args": ["-c", "./PictoPy_Sync"],
- "sidecar": false
- }
- ]
- },
- {
- "identifier": "shell:allow-spawn",
- "allow": [
- {
- "name": "StartSyncServiceWindows",
- "cmd": "powershell",
- "args": ["./PictoPy_Sync"],
- "sidecar": false
- }
- ]
- },
"shell:default",
"fs:default",
"dialog:default",
diff --git a/frontend/src-tauri/src/main.rs b/frontend/src-tauri/src/main.rs
index 316c1c03e..5b7aa6acc 100644
--- a/frontend/src-tauri/src/main.rs
+++ b/frontend/src-tauri/src/main.rs
@@ -3,8 +3,190 @@
mod services;
+use sysinfo::System;
use tauri::path::BaseDirectory;
-use tauri::Manager;
+use tauri::{Manager, Window, WindowEvent};
+use tauri_plugin_shell::ShellExt;
+
+const ENDPOINTS: [(&str, &str, &str); 2] = [
+ (
+ "BACKEND",
+ "http://localhost:52123/shutdown",
+ "http://localhost:52123/health",
+ ),
+ (
+ "SYNC",
+ "http://localhost:52124/shutdown",
+ "http://localhost:52124/health",
+ ),
+];
+
+#[cfg(feature = "ci")]
+fn is_process_alive() -> bool {
+ use reqwest::blocking::Client;
+
+ let client = match Client::builder().build() {
+ Ok(c) => c,
+ Err(_) => return false,
+ };
+
+ for (name, _, health) in &ENDPOINTS {
+ match client.get(*health).send() {
+ Ok(resp) if resp.status().is_success() => {
+ println!("[{}] Health check OK", name)
+ }
+ _ => {
+ return false;
+ }
+ }
+ }
+ true
+}
+
+fn on_window_event(window: &Window, event: &WindowEvent) {
+ if !matches!(event, WindowEvent::CloseRequested { .. }) {
+ return;
+ }
+
+ let _ = kill_process_tree();
+ window.app_handle().exit(0);
+}
+
+#[cfg(unix)]
+fn kill_process(process: &sysinfo::Process) {
+ use sysinfo::Signal;
+ let _ = process.kill_with(Signal::Term);
+}
+
+#[cfg(windows)]
+pub fn kill_process(_process: &sysinfo::Process) -> Result<(), String> {
+ use reqwest::blocking::Client;
+
+ let client = Client::builder().build().map_err(|e| e.to_string())?;
+
+ for (name, url, _) in &ENDPOINTS {
+ match client.post(*url).send() {
+ Ok(resp) => {
+ let status = resp.status();
+
+ if status.is_success() {
+ println!("[{}] Shutdown OK ({})", name, status);
+ }
+ }
+ Err(_err) => {}
+ }
+ }
+
+ Ok(())
+}
+
+fn kill_process_tree() -> Result<(), String> {
+ let mut system = System::new_all();
+ system.refresh_all();
+
+ let target_names = [
+ "PictoPy_Server",
+ "PictoPy_Sync",
+ "PictoPy_Server.exe",
+ "PictoPy_Sync.exe",
+ ];
+
+ for process in system.processes().values() {
+ let name = process.name().to_string_lossy();
+
+ if target_names.iter().any(|t| name.eq_ignore_ascii_case(t)) {
+ let _ = kill_process(process);
+ }
+ }
+
+ Ok(())
+}
+
+#[cfg(feature = "ci")]
+fn prod(app: &tauri::AppHandle, resource_path: &std::path::Path) -> Result<(), String> {
+ println!("`ci` feature enabled");
+ let backend_path = resource_path.join("backend");
+ let backend_executable = backend_path.join("PictoPy_Server");
+
+ let sync_path = resource_path.join("sync-microservice");
+ let sync_executable = sync_path.join("PictoPy_Sync");
+
+ if is_process_alive() {
+ return Ok(());
+ }
+
+ let (mut backend_rx, backend_child) = app
+ .shell()
+ .command(&backend_executable)
+ .current_dir(&backend_path)
+ .spawn()
+ .map_err(|e| format!("Failed to spawn backend: {:?}", e))?;
+
+ println!("Backend spawned with PID {}", backend_child.pid());
+
+ let (mut sync_rx, sync_child) = app
+ .shell()
+ .command(&sync_executable)
+ .current_dir(&sync_path)
+ .spawn()
+ .map_err(|e| format!("Failed to spawn sync: {:?}", e))?;
+
+ println!("Sync spawned with PID {}", sync_child.pid());
+
+ use tauri_plugin_shell::process::CommandEvent;
+ tauri::async_runtime::spawn(async move {
+ while let Some(event) = backend_rx.recv().await {
+ match event {
+ CommandEvent::Stdout(line) => {
+ println!("[SERVER STDOUT] {}", String::from_utf8_lossy(&line));
+ }
+ CommandEvent::Stderr(line) => {
+ println!("[SERVER STDERR] {}", String::from_utf8_lossy(&line));
+ }
+ CommandEvent::Error(err) => {
+ println!("[SERVER ERROR] {}", err);
+ }
+ CommandEvent::Terminated(payload) => {
+ println!(
+ "[SERVER EXIT] code={:?}, signal={:?}",
+ payload.code, payload.signal
+ );
+ }
+ _ => {}
+ }
+ }
+ });
+
+ tauri::async_runtime::spawn(async move {
+ while let Some(event) = sync_rx.recv().await {
+ match event {
+ CommandEvent::Stdout(line) => {
+ println!("[SYNC STDOUT] {}", String::from_utf8_lossy(&line));
+ }
+ CommandEvent::Stderr(line) => {
+ println!("[SYNC STDERR] {}", String::from_utf8_lossy(&line));
+ }
+ CommandEvent::Error(err) => {
+ println!("[SYNC ERROR] {}", err);
+ }
+ CommandEvent::Terminated(payload) => {
+ println!(
+ "[SYNC EXIT] code={:?}, signal={:?}",
+ payload.code, payload.signal
+ );
+ }
+ _ => {}
+ }
+ }
+ });
+
+ Ok(())
+}
+
+#[cfg(not(feature = "ci"))]
+fn prod(_app: &tauri::AppHandle, _resource_path: &std::path::Path) -> Result<(), String> {
+ Ok(())
+}
fn main() {
tauri::Builder::default()
@@ -16,15 +198,16 @@ fn main() {
.plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_process::init())
.setup(|app| {
- let resource_path = app
- .path()
- .resolve("resources/backend", BaseDirectory::Resource)?;
+ let resource_path = app.path().resolve("resources", BaseDirectory::Resource)?;
println!("Resource path: {:?}", resource_path);
+
+ prod(app.handle(), &resource_path)?;
Ok(())
})
.invoke_handler(tauri::generate_handler![
services::get_resources_folder_path,
])
+ .on_window_event(on_window_event)
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
index e01868d7c..fe8ce665f 100644
--- a/frontend/src/main.tsx
+++ b/frontend/src/main.tsx
@@ -2,29 +2,10 @@ import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import BrowserWarning from './components/BrowserWarning';
-import { isProd } from './utils/isProd';
-import { startServer } from './utils/serverUtils';
import { isTauriEnvironment } from './utils/tauriUtils';
import { store } from './app/store';
import { Provider } from 'react-redux';
-//Listen for window close event and stop server.
-const onCloseListener = async () => {
- if (!isTauriEnvironment()) {
- console.log('Window close listener is only available in Tauri environment');
- return;
- }
-
- try {
- const { getCurrentWindow } = await import('@tauri-apps/api/window');
- await getCurrentWindow().onCloseRequested(async () => {
- // code to stop the server
- });
- } catch (error) {
- console.error('Error setting up close listener:', error);
- }
-};
-
const Main = () => {
// Show browser warning if not running in Tauri environment
if (!isTauriEnvironment()) {
@@ -43,9 +24,3 @@ ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
,
);
-
-if (isProd() && isTauriEnvironment()) {
- onCloseListener();
- console.log('Starting PictoPy Server');
- startServer();
-}
diff --git a/frontend/src/utils/serverUtils.ts b/frontend/src/utils/serverUtils.ts
deleted file mode 100644
index 75bb09bc8..000000000
--- a/frontend/src/utils/serverUtils.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { Command } from '@tauri-apps/plugin-shell';
-import { invoke } from '@tauri-apps/api/core';
-import { BACKEND_URL, SYNC_MICROSERVICE_URL } from '@/config/Backend.ts';
-const isWindows = () => navigator.platform.startsWith('Win');
-
-const isServerRunning = async (): Promise => {
- try {
- const response = await fetch(BACKEND_URL + '/health');
- if (response.ok) {
- console.log('Server is Running!');
- return true;
- } else {
- return false;
- }
- } catch (error) {
- console.error('Error checking server status:', error);
- return false;
- }
-};
-
-const isSyncServiceRunning = async (): Promise => {
- try {
- const response = await fetch(SYNC_MICROSERVICE_URL + '/health');
- if (response.ok) {
- console.log('Sync Service is Running!');
- return true;
- } else {
- return false;
- }
- } catch (error) {
- console.error('Error checking sync service status:', error);
- return false;
- }
-};
-
-export const startServer = async () => {
- try {
- console.log('Starting services!');
-
- const resourcesFolderPath: string = await invoke(
- 'get_resources_folder_path',
- );
-
- // Start backend server
- if (!(await isServerRunning())) {
- const backendCommand = Command.create(
- isWindows() ? 'StartBackendWindows' : 'StartBackendUnix',
- '',
- { cwd: resourcesFolderPath + '/backend' },
- );
-
- const backendChild = await backendCommand.spawn();
- backendCommand.stderr.on('data', (line) =>
- console.error('Backend Error:', line),
- );
- console.log('Backend server started with PID:', backendChild.pid);
- }
-
- // Start sync service
- if (!(await isSyncServiceRunning())) {
- const syncCommand = Command.create(
- isWindows() ? 'StartSyncServiceWindows' : 'StartSyncServiceUnix',
- '',
- { cwd: resourcesFolderPath + '/sync-microservice' },
- );
-
- const syncChild = await syncCommand.spawn();
- syncCommand.stderr.on('data', (line) =>
- console.error('Sync Service Error:', line),
- );
- console.log('Sync service started with PID:', syncChild.pid);
- }
- } catch (error) {
- console.error('Error starting services:', error);
- }
-};
diff --git a/sync-microservice/app/config/settings.py b/sync-microservice/app/config/settings.py
index af3c04c56..b9e2053a3 100644
--- a/sync-microservice/app/config/settings.py
+++ b/sync-microservice/app/config/settings.py
@@ -1,3 +1,6 @@
+from platformdirs import user_data_dir
+import os
+
# Model Exports Path
MODEL_EXPORTS_PATH = "app/models/ONNX_Exports"
PRIMARY_BACKEND_URL = "http://localhost:52123"
@@ -19,6 +22,9 @@
TEST_INPUT_PATH = "tests/inputs"
TEST_OUTPUT_PATH = "tests/outputs"
# Point to the main PictoPy database
-DATABASE_PATH = "../backend/app/database/PictoPy.db"
+if os.getenv("GITHUB_ACTIONS") == "true":
+ DATABASE_PATH = os.path.join(os.getcwd(), "test_db.sqlite3")
+else:
+ DATABASE_PATH = os.path.join(user_data_dir("PictoPy"), "database", "PictoPy.db")
THUMBNAIL_IMAGES_PATH = "./images/thumbnails"
IMAGES_PATH = "./images"
diff --git a/sync-microservice/app/routes/shutdown.py b/sync-microservice/app/routes/shutdown.py
new file mode 100644
index 000000000..9e31ee42d
--- /dev/null
+++ b/sync-microservice/app/routes/shutdown.py
@@ -0,0 +1,75 @@
+import asyncio
+import os
+import platform
+import signal
+from fastapi import APIRouter
+from pydantic import BaseModel
+from app.utils.watcher import watcher_util_stop_folder_watcher
+from app.logging.setup_logging import get_sync_logger
+
+logger = get_sync_logger(__name__)
+
+router = APIRouter(tags=["Shutdown"])
+
+
+class ShutdownResponse(BaseModel):
+ """Response model for shutdown endpoint."""
+
+ status: str
+ message: str
+
+
+async def _delayed_shutdown(delay: float = 0.1):
+ """
+ Shutdown the server after a short delay to allow the response to be sent.
+
+ Args:
+ delay: Seconds to wait before signaling shutdown (kept minimal)
+ """
+ await asyncio.sleep(delay)
+ logger.info("Exiting sync microservice...")
+
+ if platform.system() == "Windows":
+ # Windows: SIGTERM doesn't work reliably with uvicorn subprocesses
+ os._exit(0)
+ else:
+ # Unix (Linux/macOS): SIGTERM allows cleanup handlers to run
+ os.kill(os.getpid(), signal.SIGTERM)
+
+
+@router.post("/shutdown", response_model=ShutdownResponse)
+async def shutdown():
+ """
+ Gracefully shutdown the sync microservice.
+
+ This endpoint:
+ 1. Stops the folder watcher
+ 2. Schedules server termination after response is sent
+ 3. Returns confirmation to the caller
+
+ Returns:
+ ShutdownResponse with status and message
+ """
+ logger.info("Shutdown request received for sync microservice")
+
+ try:
+ # Stop the folder watcher first
+ watcher_util_stop_folder_watcher()
+ except Exception as e:
+ logger.error(f"Error stopping folder watcher: {e}")
+
+ # Define callback to handle potential exceptions in the background task
+ def _handle_shutdown_exception(task: asyncio.Task):
+ try:
+ task.result()
+ except Exception as e:
+ logger.error(f"Sync shutdown task failed: {e}")
+
+ # Schedule shutdown after response is sent
+ shutdown_task = asyncio.create_task(_delayed_shutdown())
+ shutdown_task.add_done_callback(_handle_shutdown_exception)
+
+ return ShutdownResponse(
+ status="shutting_down",
+ message="Sync microservice shutdown initiated. Watcher stopped.",
+ )
diff --git a/sync-microservice/main.py b/sync-microservice/main.py
index 52927d8df..b1c21b707 100644
--- a/sync-microservice/main.py
+++ b/sync-microservice/main.py
@@ -1,8 +1,10 @@
import logging
+import os
+from app.config.settings import DATABASE_PATH
from fastapi import FastAPI
from uvicorn import Config, Server
from app.core.lifespan import lifespan
-from app.routes import health, watcher, folders
+from app.routes import health, watcher, folders, shutdown
from fastapi.middleware.cors import CORSMiddleware
from app.logging.setup_logging import (
get_sync_logger,
@@ -17,6 +19,8 @@
# Configure Uvicorn logging to use our custom formatter
configure_uvicorn_logging("sync-microservice")
+path = os.path.dirname(DATABASE_PATH)
+os.makedirs(path, exist_ok=True)
# Use the sync-specific logger for this module
logger = get_sync_logger(__name__)
@@ -40,11 +44,11 @@
app.include_router(health.router, tags=["Health"])
app.include_router(watcher.router, prefix="/watcher", tags=["Watcher"])
app.include_router(folders.router, prefix="/folders", tags=["Folders"])
+app.include_router(shutdown.router, tags=["Shutdown"])
if __name__ == "__main__":
logger.info("Starting PictoPy Sync Microservice")
- # Create config with log_config=None to disable Uvicorn's default logging
config = Config(
app=app,
host="localhost",
diff --git a/sync-microservice/requirements.txt b/sync-microservice/requirements.txt
index 857a60b2f..d0ee661d3 100644
--- a/sync-microservice/requirements.txt
+++ b/sync-microservice/requirements.txt
@@ -36,4 +36,5 @@ urllib3==2.5.0
uvicorn==0.35.0
watchfiles==1.1.0
websockets==15.0.1
-loguru==0.7.3
\ No newline at end of file
+loguru==0.7.3
+platformdirs==4.5.1