From 1c836afc02374d00657f26ee03a4854102c70390 Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Thu, 30 Jul 2026 14:36:20 +0200 Subject: [PATCH] chore(release): bump workspace version to 0.22.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Windows-installer patch release. 0.22.1 and 0.22.2 shipped without the web console in them at all — confirmed from the tag builds' own logs, where the console build step is `skipped` on a cache hit and the job is still green — which also removed the only code that stopped bun before the installer replaced it, hence the "DeleteFile failed; code 5" dialog. Both fixed here, along with updates no longer disabling an operator's plugin runner. Lock touched for the 30 workspace members only. `base64` stays at 0.22.1 and the eight gtk-rs crates stay at 0.22.0 — they share our version space and a blanket sed would move them to versions that do not exist. Diff is versions-only, 30 insertions and 30 deletions; `cargo metadata --locked` resolves; `cargo fmt --all --check` clean in both the main and the packaging/windows/drivers workspaces. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 60 ++++++++++++++++++++-------------------- Cargo.toml | 2 +- docs/releases/v0.22.3.md | 27 ++++++++++++++++++ 3 files changed, 58 insertions(+), 31 deletions(-) create mode 100644 docs/releases/v0.22.3.md diff --git a/Cargo.lock b/Cargo.lock index 32452bb6..7567b9ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -947,7 +947,7 @@ dependencies = [ [[package]] name = "cursor-probe" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "pf-capture", @@ -1036,7 +1036,7 @@ dependencies = [ [[package]] name = "display-disturb" -version = "0.22.2" +version = "0.22.3" dependencies = [ "windows 0.62.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2221,7 +2221,7 @@ dependencies = [ [[package]] name = "latency-probe" -version = "0.22.2" +version = "0.22.3" [[package]] name = "lazy_static" @@ -2326,7 +2326,7 @@ dependencies = [ [[package]] name = "libvpl-sys" -version = "0.22.2" +version = "0.22.3" dependencies = [ "bindgen", "cmake", @@ -2361,7 +2361,7 @@ checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "loss-harness" -version = "0.22.2" +version = "0.22.3" dependencies = [ "punktfunk-core", ] @@ -2850,7 +2850,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pf-capture" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "ashpd", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "pf-client-core" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "ash", @@ -2896,7 +2896,7 @@ dependencies = [ [[package]] name = "pf-clipboard" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "ashpd", @@ -2914,7 +2914,7 @@ dependencies = [ [[package]] name = "pf-console-ui" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "ash", @@ -2935,7 +2935,7 @@ dependencies = [ [[package]] name = "pf-encode" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "ash", @@ -2959,7 +2959,7 @@ dependencies = [ [[package]] name = "pf-ffvk" -version = "0.22.2" +version = "0.22.3" dependencies = [ "ash", "bindgen", @@ -2968,7 +2968,7 @@ dependencies = [ [[package]] name = "pf-frame" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "libc", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "pf-gpu" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "pf-host-config", @@ -2994,11 +2994,11 @@ dependencies = [ [[package]] name = "pf-host-config" -version = "0.22.2" +version = "0.22.3" [[package]] name = "pf-inject" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "ashpd", @@ -3027,14 +3027,14 @@ dependencies = [ [[package]] name = "pf-paths" -version = "0.22.2" +version = "0.22.3" dependencies = [ "tracing", ] [[package]] name = "pf-presenter" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "ash", @@ -3049,7 +3049,7 @@ dependencies = [ [[package]] name = "pf-vdisplay" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "ashpd", @@ -3082,7 +3082,7 @@ dependencies = [ [[package]] name = "pf-win-display" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "pf-paths", @@ -3094,7 +3094,7 @@ dependencies = [ [[package]] name = "pf-zerocopy" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "ash", @@ -3302,7 +3302,7 @@ dependencies = [ [[package]] name = "punktfunk-cli" -version = "0.22.2" +version = "0.22.3" dependencies = [ "pf-client-core", "punktfunk-core", @@ -3313,7 +3313,7 @@ dependencies = [ [[package]] name = "punktfunk-client-android" -version = "0.22.2" +version = "0.22.3" dependencies = [ "android_logger", "jni", @@ -3329,7 +3329,7 @@ dependencies = [ [[package]] name = "punktfunk-client-linux" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "async-channel", @@ -3346,7 +3346,7 @@ dependencies = [ [[package]] name = "punktfunk-client-session" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "pf-client-core", @@ -3361,7 +3361,7 @@ dependencies = [ [[package]] name = "punktfunk-client-windows" -version = "0.22.2" +version = "0.22.3" dependencies = [ "async-channel", "ffmpeg-next", @@ -3381,7 +3381,7 @@ dependencies = [ [[package]] name = "punktfunk-core" -version = "0.22.2" +version = "0.22.3" dependencies = [ "aes-gcm", "bytes", @@ -3413,7 +3413,7 @@ dependencies = [ [[package]] name = "punktfunk-host" -version = "0.22.2" +version = "0.22.3" dependencies = [ "aes", "aes-gcm", @@ -3497,7 +3497,7 @@ dependencies = [ [[package]] name = "punktfunk-probe" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "mdns-sd", @@ -3511,7 +3511,7 @@ dependencies = [ [[package]] name = "punktfunk-tray" -version = "0.22.2" +version = "0.22.3" dependencies = [ "anyhow", "ksni", @@ -3534,7 +3534,7 @@ checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" [[package]] name = "pyrowave-sys" -version = "0.22.2" +version = "0.22.3" dependencies = [ "bindgen", "cmake", diff --git a/Cargo.toml b/Cargo.toml index 3a658265..2bf10132 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -51,7 +51,7 @@ exclude = [ ndk = { path = "clients/android/native/vendor/ndk" } [workspace.package] -version = "0.22.2" +version = "0.22.3" edition = "2021" rust-version = "1.82" license = "MIT OR Apache-2.0" diff --git a/docs/releases/v0.22.3.md b/docs/releases/v0.22.3.md new file mode 100644 index 00000000..06c90e53 --- /dev/null +++ b/docs/releases/v0.22.3.md @@ -0,0 +1,27 @@ +Wire-compatible with 0.21.x and 0.22.x — nothing about streaming changed, and everything already paired keeps working. This release is almost entirely about the Windows installer; the apps on your phone, tablet, Mac and TV are unchanged, as are Linux hosts. + +**If you stream to a Windows PC, update that PC.** The 0.22.1 and 0.22.2 installers were built without the web console in them at all — not broken, absent. If the tray menu on your PC says "Open web console (not responding)" and the page never loads no matter what you try, that is this, and reinstalling those versions could never have fixed it. + +## Fixed + +- **The web console is in the installer again.** On 0.22.1 and 0.22.2 the Windows installer shipped with the console missing entirely: the files it runs from were never included, so the PC had nothing to start and nothing to open. The host itself was fine the whole time — streaming, pairing and controllers all worked — but the settings page you reach in a browser simply was not there. The tray reported it as "not responding", which was true and also the only clue you got, and because every reinstall produced the same installer, uninstalling and reinstalling made no difference. Updating to 0.22.3 restores it; you don't need to touch your settings, your password, or your paired devices. + +- **Updating no longer stops on a "DeleteFile failed; code 5" error.** Partway through an update, the installer could stop on a dialog complaining that it could not replace `bun\bun.exe`, offering only Try again, Skip, or Cancel — and Try again usually failed the same way. Windows refuses to replace a program while it is running, and the pieces of Punktfunk that were still running weren't the ones the installer knew how to stop. It now shuts all of them down, waits for them to actually exit rather than assuming, and if something still holds the file it finishes the install and puts the new copy in place on your next restart instead of leaving you stuck at a dialog. + +- **Updating no longer switches your plugins off.** If you had enabled the script and plugin runner, every update quietly disabled it again, so plugins stopped running until you noticed and re-enabled them by hand. Updates now leave it exactly as you had it — on if it was on, and still off by default for everyone who has never turned it on. + +## Improved + +- **You can save or share the host's log from the console.** The Logs page has two new buttons: one downloads what you're looking at as a timestamped `.log` file, the other hands it to your phone or tablet's share sheet, or copies it to the clipboard on a desktop. Handy when someone asks you for a log — the file carries full dates and times, so it still makes sense once it leaves your browser. Whatever level filter and search you have applied is what you get, and it saves everything that matches rather than just the part on screen. + +- **Televisions that struggle with the startup speed test can be told to ease off.** Two seconds into a session Punktfunk briefly bursts traffic to measure how much room your network really has. On some TVs that burst is enough to disturb the very link it is measuring — one LG set showed no video for fourteen seconds when it went badly. The burst's size can now be capped, so a device that already limits its own speed test can keep ours in line with it. Nothing changes unless a device asks for it. + +## Under the hood (for developers) + +- The console's absence was one CI variable in the wrong place. `windows-host.yml` exported `WEB_OUTPUT_DIR` on the last line of "Build + smoke-boot web console (bun)", and `be2fabcf` had just put that step behind `if: steps.webconsole.outputs.cache-hit != 'true'`. So the first build after the cache was populated — and every build after it with `web/**` and `sdk/**` unchanged — skipped the step, left the variable unset, and `pack-host-installer.ps1` reads an unset `WEB_OUTPUT_DIR` as "omit the console", announcing it in a single `Write-Host` before packing happily. Confirmed from the job logs rather than inferred: on both the v0.22.1 (run 14235) and v0.22.2 (run 14272) tag builds, step 12 is `skipped` and the job is green. `BUN_EXE` and `SCRIPTING_BUNDLE` are exported from unconditional steps, which is why those installers still carried bun and the plugin runner but no `{app}\web`. +- Downstream, `web setup` bailed at `web launcher missing: {app}\web\web-run.cmd` before registering anything, so there was no `PunktfunkWeb` task, no listener on 47992, and no firewall rule — and Inno ignores `[Run]` exit codes, so the failure left no trace in the install at all. `WEB_OUTPUT_DIR` now comes from its own unconditional step that throws when `web\.output\server\index.mjs` is absent, and a new pre-pack step asserts all five payloads (console, bun, plugin runner, FFmpeg DLLs, VB-CABLE) so a missing input fails the build rather than silently redefining the installer. The shape is borrowed from the packer's existing VB-CABLE check. FFmpeg was the most dangerous of the silent ones: an `amf-qsv` host link-imports avcodec, so an installer without those DLLs ships a host that cannot start at all. +- The same cache-hit build is why `bun.exe` locked. It ships under `WithWeb` **or** `WithScripting`, but the installer's pre-copy stop was `#ifdef WithWeb` — so a console-less installer shipped bun while the only code that stopped bun was compiled out. `StopBunRuntimes` replaces `StopWebConsole` behind the same `WithWeb || WithScripting` gate the payload uses, and covers what the old routine structurally could not: neither bun runs under the host service (both are Task Scheduler tasks — `PunktfunkWeb` as SYSTEM, `PunktfunkScripting` as LocalService), and the runner listens on no port, so a task-name-plus-port sweep could never see it. It now disables both tasks before stopping them — they carry restart-on-failure at 10× and 999× a minute, and the web task also has a logon trigger, so a force-kill alone invited a respawn into the middle of a copy that takes over a minute at `lzma2/max` — kills any bun whose image lives under the install dir (by path, so an unrelated bun survives), and polls until they are gone, since `Stop-ScheduledTask` returns on request and `Stop-Process` is `TerminateProcess`. `bun.exe` also gained `restartreplace`, so a survivor defers to reboot instead of dead-ending the install. +- Disabling a task is not free: unlike a stopped one it does not return at the next boot, so an aborted install would have taken the console down permanently. Two restores cover it — a last-in-`[Run]` entry for the normal flow and `DeinitializeSetup`, which Inno calls even on user cancel — both re-enabling only what was enabled before the copy. That is also the plugin-runner fix: the scripting `[Run]` entry re-registers its task and then unconditionally disables it, correct on a first install and wrong on every upgrade since. +- `PUNKTFUNK_ABR_PROBE_KBPS` sets the startup capacity probe's burst target for embedders. Unset, zero or unparseable keeps the 2 Gbps default, so existing sessions are unchanged; `PUNKTFUNK_ABR_PROBE=0` remains a poor substitute because it pins the climb ceiling at the negotiated ~20 Mbps. +- The console's log export serializes the filters' full result rather than the rendered tail — the 1000-row cap is a DOM budget and has no business truncating a file destined for a bug report — and stamps each line with a local ISO 8601 timestamp plus numeric offset. Web Share level 2 is probed at runtime after mount (SSR has no `navigator`, and guessing there would mismatch on hydration), falling back to the clipboard, and the button is omitted only where neither exists. +- No wire, ABI or driver-protocol changes: wire protocol 2, C ABI 13, Windows virtual-gamepad channel 3, virtual-display driver protocol 6 — identical to 0.22.0, 0.22.1 and 0.22.2.