Torsten Schulz (local) 8b9947cc03 Implement session replacement and WebSocket keepalive features
Enhanced the session management by allowing a reconnect with the same username to replace the existing session, sending a logout message to the previous session. Introduced WebSocket keepalive functionality using Ping/Pong messages to detect stale connections. Updated documentation to reflect these changes and improve user experience during reconnections.
2026-03-05 08:03:15 +01:00

yourchat2

Rust-basierter Chat-Service/Daemon zur Entlastung des Backends von YourPart3. Die Kommunikation erfolgt ueber WebSocket (Frontend) und optional TCP/Unix-Socket (Bridge/Backend).

Features

  • Asynchroner WebSocket-Server fuer MultiChatDialog (Standard 0.0.0.0:1235)
  • Zusaetzlicher TCP-Server fuer chatTcpBridge.js (Standard 127.0.0.1:1236)
  • Optional zusaetzlicher Unix Domain Socket
  • In-Memory-Room-Management
  • Token-basierte Session-Absicherung pro Verbindung
  • Username-Pruefung (3-32 Zeichen, [a-zA-Z0-9_])
  • Reconnect-freundlich: bestehende Session wird bei erneutem init mit gleichem Namen ersetzt
  • WebSocket Keepalive via Ping/Pong zur Erkennung verwaister Verbindungen
  • Optionale Allowlist fuer User via CHAT_ALLOWED_USERS
  • Optionale DB-basierte User-Pruefung via Postgres (CHAT_DB_URL)
  • Kompatible Antworttypen fuer die bestehende chatTcpBridge.js

Start

cd ~/Programs/yourchat2
cargo run --release

Der Server lauscht danach standardmaessig auf:

  • ws://0.0.0.0:1235 (Frontend MultiChatDialog)
  • tcp://127.0.0.1:1236 (Backend-Bridge)

Konfiguration (Umgebungsvariablen)

  • CHAT_WS_ADDR (default: 0.0.0.0:1235)
  • CHAT_TCP_ADDR (default: 127.0.0.1:1236)
  • CHAT_UNIX_SOCKET (optional, z. B. /run/yourchat2/yourchat2.sock)
  • CHAT_WS_TLS (optional, true fuer direktes WSS auf CHAT_WS_ADDR)
  • CHAT_TLS_CERT_PATH (Pfad zum PEM-Zertifikat fuer WSS)
  • CHAT_TLS_KEY_PATH (Pfad zum PEM-Private-Key fuer WSS)
  • CHAT_ALLOWED_USERS (optional, CSV-Liste erlaubter Usernamen, z. B. alice,bob,carol)
  • CHAT_DB_URL (optional, PostgreSQL-Connection-String fuer Community-/Chat-User-Checks)
  • SECRET_KEY (benoetigt fuer Entschluesselung verschluesselter Birthdate-Werte aus der DB)

Beispiel:

CHAT_WS_ADDR=0.0.0.0:1235 CHAT_TCP_ADDR=127.0.0.1:1236 CHAT_UNIX_SOCKET=/tmp/yourchat2.sock cargo run --release

Protokoll (Kurzfassung)

Alle Requests/Responses sind JSON-Objekte.

  • WebSocket: ein JSON pro Frame (Text)
  • TCP/Unix-Socket: newline-delimited JSON

Eingehende Commands

  • {"type":"init","name":"alice","room":"lobby"}
  • {"type":"join","room":"sports","token":"..."}
  • {"type":"message","message":"Hi","token":"..."}
  • {"type":"scream","message":"Hallo alle","token":"..."}
  • {"type":"do","message":"winkt","token":"..."}
  • {"type":"dice","message":"1d6","token":"..."}
  • {"type":"roll","value":4,"token":"..."}
  • {"type":"color","value":"#33aaee","token":"..."}
  • {"type":"rooms","token":"..."}
  • {"type":"userlist","token":"..."}
  • {"type":"start_dice_game","rounds":3,"token":"..."}
  • {"type":"end_dice_game","token":"..."}
  • {"type":"reload_rooms","token":"..."}
  • {"type":"ping"}

Zusatz: Bei {"type":"message", ...} werden Slash-Commands erkannt:

  • /join <room> [password]
  • /color <hex>
  • /dice [expr] oder /roll [expr]
  • /start_dice_game <runden 1..10>
  • /end_dice_game
  • /reload_rooms
  • /do <aktion>
  • /scream <text>
  • /rooms und /userlist

Wenn CHAT_DB_URL gesetzt ist, prueft init den User gegen community."user". Falls fuer den Community-User noch kein Eintrag in chat."user" existiert, wird er automatisch angelegt. Farbe und Rechte werden aus der DB geladen. Fuer Alterspruefungen in Raeumen wird community.user_param.value (birthdate) per AES-256-ECB mit einem via scrypt aus SECRET_KEY abgeleiteten Schluessel entschluesselt (kompatibel zur Alt-App).

Wichtige Antworten

  • Token: {"type":1,"message":"<token>"}
  • Roomliste: {"type":3,"message":[{"name":"lobby","users":2}]}
  • Room betreten: {"type":5,"message":"room_entered","to":"lobby"}
  • Farbaenderung: {"type":5,"message":"color_changed","userName":"alice","color":"#33aaee"}
  • Normale Message: {"type":"message","userName":"alice","message":"Hi","color":"#33aaee"}
  • Scream: {"type":6,"userName":"alice","message":"Hallo alle","color":"#33aaee"}

Integration mit YourPart3

In YourPart3/backend/config/chatBridge.json sollte stehen:

{
  "host": "127.0.0.1",
  "port": 1236
}

Dann verbindet sich die bestehende Bridge (chatTcpBridge.js) direkt mit yourchat2.

Raeume per CLI pruefen

Die Raumdefinitionen kommen aus chat.room (bei gesetztem CHAT_DB_URL). Ohne DB-Verbindung gibt es einen Fallback mit lobby.

Pruefen auf Kommandozeile:

cd /home/tsschulz/Programs/yourchat2
CHAT_DB_URL='postgres://user:pass@host:5432/dbname' ./target/release/yourchat2 --list-rooms

Wenn der Service ueber systemd laeuft und die Variablen in /etc/yourchat2/yourchat2.env stehen:

sudo -u tsschulz bash -lc 'set -a; source /etc/yourchat2/yourchat2.env; set +a; /usr/local/bin/yourchat2 --list-rooms'

Systemd (optional)

Es liegt eine Produktions-nahe Unit-Datei yourchat2.service im Projekt. Zusaetzlich gibt es ein Installationsskript install-systemd.sh, das:

  • Release-Binary baut
  • Binary nach /usr/local/bin/yourchat2 installiert
  • Unit nach /etc/systemd/system/yourchat2.service installiert
  • Arbeitsverzeichnis /var/lib/yourchat2 erstellt
  • Environment-Datei unter /etc/yourchat2/yourchat2.env anlegt (falls nicht vorhanden)
  • Service aktiviert und startet
  • Standard-Config aus config/yourchat2.env.example nach /etc/yourchat2/yourchat2.env uebernimmt (falls noch nicht vorhanden)

Installation:

cd /home/tsschulz/Programs/yourchat2
sudo ./install-systemd.sh

Danach Konfiguration ueber:

  • /etc/yourchat2/yourchat2.env

Wichtige Variablen fuer produktiven Betrieb:

  • CHAT_DB_URL
  • SECRET_KEY

Standard-Config-Template im Projekt:

  • config/yourchat2.env.example
Description
No description provided
Readme 275 KiB
Languages
Rust 98.1%
Shell 1.9%