# @abdulive/overlay-server Der einzige Server, der von außen erreichbar ist. Liefert die Seiten aus [`overlay-web`](../overlay-web/README.md) aus, hält den Ereignisstrom dorthin offen und bringt Einrichtung und OAuth-Rückruf unter dieselbe Adresse. ``` / Übersicht mit den Adressen für OBS Passwort /setup Einrichtung: Twitch-Apps, Tokens Passwort /callback OAuth-Rückruf von Twitch offen, `state` schützt /alerts … die Browser-Sources Schlüssel in der URL /events der Ereignisstrom dahinter Schlüssel in der URL ``` ## Server-Sent Events statt WebSocket [`chat-control.md`](../../docs/projects/chat-control.md) skizziert einen WS-Kanal. Es sind SSE geworden, aus drei Gründen: 1. Node bringt einen WebSocket-*Client* mit, aber keinen Server. Den müsste man selbst schreiben, inklusive Handshake und Rahmenformat - in einem Projekt ohne Abhängigkeiten heißt das: selbst pflegen. 2. `EventSource` verbindet sich von allein neu. Die tote Browser-Source nach einem Neustart ist der häufigste Fehler bei solchen Overlays, und hier löst ihn der Browser. 3. Die Richtung stimmt. Das Overlay hört nur zu; es sendet nie. Drei Dinge halten die Verbindung ehrlich: - **Herzschlag alle 15 s**, als echtes Ereignis und nicht als SSE-Kommentar - ein Kommentar hält die Verbindung offen, ist im Browser aber unsichtbar. - **Wachhund im Client**: 45 s ohne Nachricht heißt neu verbinden. OBS hält eine tote Verbindung erstaunlich lange für lebendig. - **Schnappschuss beim Verbinden**: der letzte Stream-Zustand und die letzten Chatnachrichten, damit die Quelle nach dem Neuverbinden nicht leer im Bild steht. ## Zugang Siehe [ADR-0008](../../docs/decisions/ADR-0008-geteilter-betrieb.md). - **Passwort** für alles, was ein Mensch bedient. Setzen mit `abdulive web:passwort`, nie über das Netz - ein Dienst, bei dem man das Passwort über die offene Weboberfläche setzen kann, hat kein Passwort. - **Schlüssel in der Adresse** für die Browser-Sources. Eine Browser-Source kann kein Formular ausfüllen. Der Schlüssel darf nur lesen und lässt sich auf der Übersichtsseite neu würfeln. Ohne `publicUrl` bindet der Server weiter auf `127.0.0.1` und verhält sich wie vorher.