Erweiterung des Websocket-Servers um Applikationen

Eine Websocket-Applikation erstellen

Um eine Websocket-Applikation zu erstellen, muss eine Klasse erstellt werden, die von der Klasse Ego_WebsocketApplication (lib/websockets/applications/Ego_WebsocketApplication.php) erbt. In dieser Klasse müssen die Methoden onConnect, onDisconnect und onMessage definiert werden. Das könnte wie folgt aussehen:

<?php require_once 'websockets/applications/Ego_WebsocketApplication.php'; class TestApplication extends Ego_WebsocketApplication { /** @var Ego_WebsocketClient[] */ private array $clients = []; /** * @param Ego_WebsocketClient $client * * @return void */ public function onConnect(Ego_WebsocketClient $client): void { $this->clients[$client->getClientId()] = $client; } /** * @param Ego_WebsocketClient $client * * @return void */ public function onDisconnect(Ego_WebsocketClient $client): void { unset($this->clients[$client->getClientId()]); } /** * @param string $data * @param Ego_WebsocketClient $client * * @return void */ public function onMessage(string $data, Ego_WebsocketClient $client): void { $decodedData = $this->decodeData($data); if ($decodedData['action'] && method_exists($this, $decodedData['action'])) { call_user_func([$this, $decodedData['action']], $decodedData['data'], $client); } } }

Den Server um Applikationen erweitern

Um dem Websocket-Server eine Applikation hinzuzufügen, muss unter var/lib/websockets eine applications.php hinterlegt werden. In dieser Datei muss es eine Funktion mit dem Namen get_websocket_applications geben. Diese liefert ein Array mit allen Applikationen, die dem Server hinzugefügt werden sollen. Der Array-Schlüssel, der hier verwendet wird, wird später auch verwendet um die Applikation anzusprechen. Die Datei kann dann folgendermaßen aussehen:

<?php require_once 'applications/TestApplication.php'; function get_websocket_applications() { return ['test_application' => TestApplication::getInstance()]; }

Eine Websocket-Applikation ansprechen

Eine Websocket-Applikation kann über die Javascript Websocket-API angesprochen werden. Dieser Aufruf könnte wie folgt aussehen:

let webSocket = new WebSocket(`wss://${host}/ws/${application}?${user_id}`); webSocket.addEventListener('open', () => {console.log('Websocket-Verbinding geöffnet')}); webSocket.addEventListener('message', event => {console.log('Nachricht vom Websocket-Server:', event.data)}); webSocket.addEventListener('close', () => {console.log('Websocket-Verbindung geschlossen')}); webSocket.addEventListener('error', () => {console.log('Fehler bei der Websocket-Verbindung')});

Bei application handelt es sich um den Schlüssel der Applikation, mit der man sich verbinden möchte. Dieser entspricht dem Array-Schlüssel, der beim registrieren der Applikation verwendet wurde (In diesem Beispiel test_application).

Bei user_id handelt es sich um eine eindeutige Kennung des aktuellen Clients. Es ist empfohlen (aber nicht zwingend erforderlich) hier die user_id des angemeldeten CMS-Benutzers zu verwenden.