forked from unom/punktfunk
Version currency for the SCM plumbing behind `punktfunk-host service` (the
dispatcher, control handler and ServiceManager install) and the tray's
unprivileged QUERY_STATUS probe. No code changed in either crate.
The payoff is dependency unification, not the API. `windows-service 0.7` was the
ONLY crate in the workspace still pulling `windows-sys 0.52`, so it alone kept a
fourth windows-sys major compiling. It resolves to 0.8.1, which moves to
`windows-sys 0.61` — a version the tree already builds — and the duplicate
disappears:
cargo tree -d --target x86_64-pc-windows-msvc | grep '^windows-sys v'
before: 0.45.0, 0.52.0, 0.59.0, 0.61.2
after: 0.45.0, 0.59.0, 0.61.2
Note 0.8.0 would NOT have been enough — it lands on windows-sys 0.59. 0.8.1 is
the release that reaches 0.61, hence the `"0.8"` caret plus the comment pinning
the reasoning to the manifest.
The 0.7 -> 0.8 delta is tiny and touches nothing this tree calls: `ServiceAccess`
gains READ_CONTROL / WRITE_DAC / WRITE_OWNER (additive), and `Service::raw_handle`
changes return type from `Security::SC_HANDLE` to `Services::SC_HANDLE` as a
consequence of the windows-sys bump — we never call it. `ScHandle` is crate-private
upstream. No enum gained variants, and the service control handler's match already
ends in a `_ =>` arm, so the `#[non_exhaustive]` types stay safe.
What remains duplicated (deliberately out of scope here): windows-sys 0.45 via
`jni`, and 0.59 via `punktfunk-core` + `if-addrs`.
70 lines
3.3 KiB
TOML
70 lines
3.3 KiB
TOML
[package]
|
|
name = "punktfunk-tray"
|
|
description = "System-tray status icon for the punktfunk streaming host (Windows notification area / Linux StatusNotifierItem)"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
rust-version.workspace = true
|
|
license.workspace = true
|
|
authors.workspace = true
|
|
repository.workspace = true
|
|
|
|
[[bin]]
|
|
name = "punktfunk-tray"
|
|
path = "src/main.rs"
|
|
|
|
# Deliberately does NOT depend on punktfunk-host: the tray needs only the service name, the mgmt
|
|
# port, and the summary JSON shape — a dependency would drag the whole host (FFmpeg, PipeWire, …)
|
|
# into a 2 MB helper and make it un-buildable standalone. Non-Windows/non-Linux targets build a
|
|
# stub main (same pattern as the platform-gated clients).
|
|
[dependencies]
|
|
anyhow = "1"
|
|
|
|
[target.'cfg(any(windows, target_os = "linux"))'.dependencies]
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
# Loopback HTTPS poll of GET /api/v1/local/summary. Same sync ureq + rustls stack and
|
|
# custom-verifier pattern as the Linux client's library fetch (crates/pf-client-core/src/library.rs),
|
|
# on the same aws-lc-rs backend as the rest of the tree (the agent pins the provider explicitly).
|
|
# ⚠ `rustls-no-provider`, NEVER the default `rustls` feature — that one pulls `_ring`.
|
|
ureq = { version = "3", default-features = false, features = [
|
|
"rustls-no-provider",
|
|
"rustls-webpki-roots",
|
|
] }
|
|
rustls = { version = "0.23", default-features = false, features = ["aws_lc_rs", "prefer-post-quantum", "logging", "std", "tls12"] }
|
|
# The one shared cert-fingerprint pin verifier (`punktfunk_core::tls::PinVerify`) + fingerprint
|
|
# hash, instead of the tray hand-rolling its own copy on a trust boundary. The light `tls` feature
|
|
# is rustls + sha2 only (no QUIC runtime / tokio), so this stays a lean helper — much smaller than
|
|
# the host dependency ruled out above, though rustls's aws-lc-rs backend does mean a C compiler.
|
|
punktfunk-core = { path = "../punktfunk-core", default-features = false, features = ["tls", "ureq-tls"] }
|
|
|
|
[target.'cfg(windows)'.dependencies]
|
|
# SCM QUERY_STATUS works unprivileged — the service-state probe. Same crate the host service uses,
|
|
# and it must stay in lockstep with it — see the windows-sys note on the host's declaration.
|
|
windows-service = "0.8"
|
|
windows = { version = "0.62", features = [
|
|
"Win32_Foundation",
|
|
"Win32_Graphics_Gdi",
|
|
"Win32_Security", # CreateMutexW's SECURITY_ATTRIBUTES parameter type
|
|
"Win32_System_LibraryLoader",
|
|
"Win32_System_Registry", # AppsUseLightTheme — glyph color must match the themed menu
|
|
"Win32_System_Threading",
|
|
"Win32_UI_HiDpi",
|
|
"Win32_UI_Shell",
|
|
"Win32_UI_WindowsAndMessaging",
|
|
] }
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
# StatusNotifierItem (pure Rust, zbus — the same zbus the host already pulls via ashpd). The tray
|
|
# is a plain-threads poller, so the blocking API over the small async-io executor (`blocking`
|
|
# alone is just the wrapper — zbus still needs an executor; no tokio runtime in a tray icon).
|
|
ksni = { version = "0.3", default-features = false, features = ["async-io", "blocking"] }
|
|
libc = "0.2"
|
|
|
|
# Build-time icon embedding (exe icon + the status-variant tray icons), host-gated like the
|
|
# Windows client's build.rs — cross-builds from Linux CI runners skip it.
|
|
[target.'cfg(windows)'.build-dependencies]
|
|
winresource = "0.1"
|
|
|
|
[lints]
|
|
workspace = true
|