Files
obs-config/webapp/public/js/obs-ws-bootstrap.js
Jakub Zych 059f069ef4 webapp: introduce Laravel app under webapp/ for scene overlays
Replaces the per-scene HTML directories (landing/, loading/, game/,
desktop/, goodbye/, music-box/, music/) with a single Laravel app
serving every overlay over HTTP. Supervisord runs `php artisan serve`
on 127.0.0.1:1118 and the OBS scene JSON now references HTTP routes
instead of file:// URLs.

Highlights:
 - public/css/hud.css consolidates the duplicated HUD chrome,
   scanlines/vignette/flicker, terminal styling, and pulse keyframes
   that were copy-pasted across all seven scenes.
 - Blade partials own hud-strip, crt-overlays, obs-ws-scripts,
   camera-frame, screen-frame; the seven scenes extend a shared
   overlay layout.
 - Artisan commands (`rig:setup`, `rig:telemetry`, `rig:loading`,
   `rig:playlist`, `rig:cmd`) replace the shell scripts that wrote
   per-rig JSON snapshots. TwitchHelix + HardwareSnapshot services
   handle the work the bash + Python helpers used to.
 - ObsWsClient + MusicCommandController kill the 250 ms cmd.js poll
   in the music daemon: POST /cmd/{skip|prev|pause|resume} opens a
   short-lived Pawl WS, authenticates, and broadcasts mpd:cmd.
 - AudioController streams files from the configured music dirs so
   CEF can load tracks under the HTTP origin (Chromium blocks
   HTTP-origin pages from loading file:// media).
 - DataController serves /data/playlist.js (with ETag mtime cache)
   and /cover.jpg (no-store) so the existing overlays' window.__PLAYLIST
   and cover.jpg cache-bust pattern keeps working.

scripts/obs-webapp.supervisord.conf is the supervisord unit; install
to /etc/supervisor.d/obs-webapp.conf.
scripts/rewrite-scene-urls.py is a one-shot tool that rewrites
basic/scenes/Default_Stream_HUD.json from file:// to HTTP URLs.
basic/scenes/Default_Stream_HUD.json.pre-webapp is the rollback
artifact (made with OBS closed; full pre-migration state).

The seven old scene directories, vendor/, and the bash scripts are
still on disk pending visual verification; the next commit will
prune them.
2026-05-21 12:47:10 +02:00

47 lines
1.4 KiB
JavaScript

/* OPHI-118 — OBS WebSocket connection helper with auto-reconnect.
*
* Most overlays connect to OBS WS to receive `mpd:state` events. This
* wraps the connect-then-retry-on-close dance so each page doesn't
* repeat it inline.
*
* OBSWSBootstrap.onState(handler, { onClose, onConnect })
* OBSWSBootstrap.connect({ onConnect, onClose })
*
* Both forms return the underlying OBSWSMini instance via the promise
* resolved by onConnect (or directly from connect()).
*/
(function (root) {
'use strict';
function _connect(opts) {
const { onConnect, onClose } = opts || {};
if (!root.__OBSWS || !root.OBSWSMini) {
onClose && onClose(new Error('vendor/obs-config.js missing'));
return;
}
const obs = new root.OBSWSMini(root.__OBSWS.url, root.__OBSWS.password);
obs.connect().then(() => {
onConnect && onConnect(obs);
}).catch((err) => {
onClose && onClose(err);
setTimeout(() => _connect(opts), 2500);
});
obs.addEventListener('close', () => {
onClose && onClose(new Error('connection closed'));
setTimeout(() => _connect(opts), 2000);
});
}
function onState(handler, opts) {
_connect({
onConnect: (obs) => {
obs.onCustom('mpd:state', handler);
opts?.onConnect && opts.onConnect(obs);
},
onClose: opts?.onClose,
});
}
root.OBSWSBootstrap = { connect: _connect, onState };
})(typeof window !== 'undefined' ? window : globalThis);