56d21f9445
ci / web (push) Successful in 57s
ci / docs-site (push) Successful in 1m3s
apple / swift (push) Successful in 1m19s
decky / build-publish (push) Successful in 40s
ci / bench (push) Successful in 6m51s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 18s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 17s
docker / build-push (ci, ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 11s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 16s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 15s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 7m6s
deb / build-publish (push) Successful in 9m54s
release / apple (push) Successful in 9m5s
deb / build-publish-host (push) Successful in 9m35s
flatpak / build-publish (push) Failing after 8m19s
android / android (push) Successful in 16m57s
apple / screenshots (push) Successful in 6m29s
arch / build-publish (push) Successful in 17m35s
windows-host / package (push) Successful in 18m46s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Has been cancelled
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Has been cancelled
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Has been cancelled
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Has been cancelled
windows / build (aarch64-pc-windows-msvc) (push) Has been cancelled
windows / build (x86_64-pc-windows-msvc) (push) Has been cancelled
docker / deploy-docs (push) Successful in 26s
ci / rust (push) Successful in 25m24s
Launching from the Decky plugin against a sleeping host fired the Wake-on-LAN packet and dialed immediately — but the dial was a single quinn attempt that gave up after the transport's 8 s idle window, far shorter than a suspend-to-RAM resume. The host woke to find the client already gone (its retransmitted Initials show up host-side as "QUIC accept failed error=timed out"), the stream shortcut exited, and the launch looked cancelled. - punktfunk-core: dial in a loop until the embedder's connect budget is spent — short 3 s attempts keep the Initial cadence dense, so the connect lands within ~a second of the host's network returning. Only silence is retried: pin mismatches, typed rejections, and any real answer surface immediately, and the shutdown flag stops the loop. - decky: stretch the budget to 75 s when a magic packet actually went out (PF_CONNECT_TIMEOUT → --connect-timeout via the wrapper), so the retry window covers the resume; an awake host still connects in <1 s. - host: a clean close before the control handshake is a reachability probe (hosts-page online pips), not a failed session — log it at debug instead of WARN "session ended with error", which buried the real failures in the reporter's log. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
80 lines
4.8 KiB
Bash
Executable File
80 lines
4.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# punktfunk stream runner — the target of the hidden non-Steam shortcut the plugin creates.
|
|
#
|
|
# WHY A WRAPPER SCRIPT (load-bearing, from MoonDeck's hard-won knowledge): the stream client
|
|
# must be a descendant of the process Steam launches via `reaper`, or gamescope never gives
|
|
# its window focus/fullscreen in Gaming Mode (gamescope detects the "current app" by AppID,
|
|
# which only attaches to reaper's descendants — see gamescope#484). So the Decky plugin
|
|
# launches THIS script through SteamClient.Apps.RunGame; the script then execs the flatpak
|
|
# client, which inherits the shortcut's AppID and is focused. Launching the flatpak directly
|
|
# from the (root) Decky backend produces an unfocused, invisible window.
|
|
#
|
|
# Per-session parameters arrive as environment variables, set as the shortcut's Steam launch
|
|
# options by the plugin (SteamClient.Apps.SetAppLaunchOptions), so ONE generic shortcut serves
|
|
# every host (and every pinned game):
|
|
# PF_HOST host[:port] to connect to (required for streaming; optional for browse)
|
|
# PF_LAUNCH library id to launch on connect (optional, e.g. steam:570 — pinned games)
|
|
# PF_BROWSE non-empty = open the gamepad library (optional; --browse instead of --connect)
|
|
# PF_MGMT management-API port for --browse (optional; client defaults to 47990)
|
|
# PF_CONNECT_TIMEOUT connect budget in seconds (optional; the plugin stretches it after
|
|
# firing Wake-on-LAN so the connect survives the host's resume)
|
|
# PF_APPID flatpak app id (default io.unom.Punktfunk)
|
|
# PF_FLATPAK override the flatpak binary path (default: `flatpak` on PATH)
|
|
#
|
|
# Values are plain tokens (the plugin validates launch ids to space/quote-free ASCII before
|
|
# they ever reach Steam launch options). An older flatpak without --launch/--browse ignores
|
|
# the unknown flags harmlessly (hand-scanned argv): PF_LAUNCH degrades to the plain desktop
|
|
# session, PF_BROWSE to the client's hosts page.
|
|
#
|
|
# Runs as the `deck` user (Steam launched it), so the --user flatpak install is visible and
|
|
# WAYLAND_DISPLAY / XDG_RUNTIME_DIR are already correct for gamescope.
|
|
#
|
|
# NO EXEC BIT REQUIRED: the Steam shortcut's exe is `/bin/sh` and this script rides behind
|
|
# `%command%` as an argument (see src/steam.ts). Decky extracts plugin zips without preserving
|
|
# permission bits and ~/homebrew/plugins is root-owned (the unprivileged plugin backend can't
|
|
# chmod), so the launch path must never depend on +x. Keep this script POSIX-sh clean.
|
|
set -u
|
|
|
|
APPID="${PF_APPID:-io.unom.Punktfunk}"
|
|
FLATPAK="${PF_FLATPAK:-flatpak}"
|
|
|
|
# exec so the flatpak client IS the game process — when it exits, Steam ends the "game" and
|
|
# Gaming Mode reclaims focus automatically (no manual refocus needed).
|
|
# --fullscreen: present the stream chrome-less and fullscreen (the client also auto-detects the
|
|
# Deck/gamescope env, and ignores the flag harmlessly on older builds that predate it).
|
|
if [ -n "${PF_BROWSE:-}" ]; then
|
|
# The gamepad UI. BARE `--browse` (no PF_HOST) opens the console home — the self-contained
|
|
# host picker + pairing + settings, gamepad-navigable — which is what the stateless, visible
|
|
# library shortcut launches. `--browse <host>` opens straight into that host's library (the
|
|
# per-host "open on screen" action). A streams a game, session end returns here, B quits.
|
|
if [ -z "${PF_HOST:-}" ]; then
|
|
echo "punktfunkrun: gamepad UI $APPID --browse (console home)" >&2
|
|
exec "$FLATPAK" run --arch=x86_64 "$APPID" --browse --fullscreen
|
|
fi
|
|
echo "punktfunkrun: library $APPID --browse $PF_HOST" >&2
|
|
if [ -n "${PF_MGMT:-}" ]; then
|
|
exec "$FLATPAK" run --arch=x86_64 "$APPID" --browse "$PF_HOST" --mgmt "$PF_MGMT" --fullscreen
|
|
fi
|
|
exec "$FLATPAK" run --arch=x86_64 "$APPID" --browse "$PF_HOST" --fullscreen
|
|
fi
|
|
|
|
# Streaming modes need a host (browse above is the only host-less path).
|
|
if [ -z "${PF_HOST:-}" ]; then
|
|
echo "punktfunkrun: PF_HOST is not set (the plugin sets it as a launch option)" >&2
|
|
exit 2
|
|
fi
|
|
# Trailing args shared by both streaming execs. A stretched connect budget rides along when the
|
|
# plugin set one (it just fired Wake-on-LAN, so the host may still be resuming); an older flatpak
|
|
# without --connect-timeout ignores the flag harmlessly (hand-scanned argv).
|
|
set -- --fullscreen
|
|
if [ -n "${PF_CONNECT_TIMEOUT:-}" ]; then
|
|
set -- --connect-timeout "$PF_CONNECT_TIMEOUT" "$@"
|
|
fi
|
|
if [ -n "${PF_LAUNCH:-}" ]; then
|
|
# A pinned game: the id rides the session Hello and the host launches that title.
|
|
echo "punktfunkrun: streaming $APPID --connect $PF_HOST --launch $PF_LAUNCH" >&2
|
|
exec "$FLATPAK" run --arch=x86_64 "$APPID" --connect "$PF_HOST" --launch "$PF_LAUNCH" "$@"
|
|
fi
|
|
echo "punktfunkrun: streaming $APPID --connect $PF_HOST" >&2
|
|
exec "$FLATPAK" run --arch=x86_64 "$APPID" --connect "$PF_HOST" "$@"
|