mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-22 06:25:41 +00:00
ff456dd823
Moves analysis_cache + analysis_runtime out of the top crate into a new
psysonic-analysis crate, plus the runtime user-agent facade into
psysonic-core. The audio↔analysis dependency cycle is broken via a
PlaybackQueryHandle port registered as Tauri State.
crates/psysonic-analysis/ new lib crate
src/analysis_cache/{mod,store,compute} unchanged behaviour
src/analysis_runtime.rs + enqueue_analysis_seed (was
in lib_commands/cache/offline)
crates/psysonic-core/src/
user_agent.rs subsonic_wire_user_agent +
runtime/default helpers
(was in top lib.rs)
ports.rs PlaybackQueryHandle: closure
wrapper, not Arc<dyn Trait>,
so existing State<AudioEngine>
callsites stay unchanged
The shell setup hook registers the real PlaybackQueryHandle once the
AppHandle is available; the closure captures it and re-resolves
AudioEngine via try_state at each call.
Top crate keeps `crate::analysis_cache`, `crate::analysis_runtime`,
`crate::subsonic_wire_user_agent`, and `crate::submit_analysis_cpu_seed`
working via re-exports — no audio/lib_commands callsite needed editing.
Behaviour preserving. Cargo check + clippy --workspace clean (only
pre-existing warnings carry over).
27 lines
1015 B
Rust
27 lines
1015 B
Rust
//! Process-global outbound User-Agent for Rust-side HTTP.
|
|
//!
|
|
//! Initialised to `psysonic/<version>` (workspace package version) and then
|
|
//! overridden from the main WebView's `navigator.userAgent` once the frontend
|
|
//! reports it during startup. Every Rust HTTP client (`reqwest::Client`,
|
|
//! handcrafted `header::USER_AGENT`) reads the current value via
|
|
//! [`subsonic_wire_user_agent`] so a single switch keeps server-side
|
|
//! request-fingerprints consistent.
|
|
|
|
use std::sync::{OnceLock, RwLock};
|
|
|
|
pub fn default_subsonic_wire_user_agent() -> String {
|
|
format!("psysonic/{}", env!("CARGO_PKG_VERSION"))
|
|
}
|
|
|
|
pub fn runtime_subsonic_wire_user_agent() -> &'static RwLock<String> {
|
|
static UA: OnceLock<RwLock<String>> = OnceLock::new();
|
|
UA.get_or_init(|| RwLock::new(default_subsonic_wire_user_agent()))
|
|
}
|
|
|
|
pub fn subsonic_wire_user_agent() -> String {
|
|
runtime_subsonic_wire_user_agent()
|
|
.read()
|
|
.map(|ua| ua.clone())
|
|
.unwrap_or_else(|_| default_subsonic_wire_user_agent())
|
|
}
|