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.
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(Standard0.0.0.0:1235) - Zusaetzlicher TCP-Server fuer
chatTcpBridge.js(Standard127.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
initmit 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(FrontendMultiChatDialog)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,truefuer direktes WSS aufCHAT_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>/roomsund/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/yourchat2installiert - Unit nach
/etc/systemd/system/yourchat2.serviceinstalliert - Arbeitsverzeichnis
/var/lib/yourchat2erstellt - Environment-Datei unter
/etc/yourchat2/yourchat2.envanlegt (falls nicht vorhanden) - Service aktiviert und startet
- Standard-Config aus
config/yourchat2.env.examplenach/etc/yourchat2/yourchat2.envuebernimmt (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_URLSECRET_KEY
Standard-Config-Template im Projekt:
config/yourchat2.env.example