added tls fallback and auto pause in log window
This commit is contained in:
parent
dc8ff7a406
commit
eaa0c2bcbe
|
|
@ -32,8 +32,12 @@
|
||||||
.btn.secondary { background: #1E1E2E; border: 1px solid #333; }
|
.btn.secondary { background: #1E1E2E; border: 1px solid #333; }
|
||||||
.btn.secondary:hover { background: #2A2A3E; }
|
.btn.secondary:hover { background: #2A2A3E; }
|
||||||
|
|
||||||
|
.log-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
|
||||||
|
.log-header h2 { margin-bottom: 0; }
|
||||||
|
.pause-hint { font-size: 11px; color: #FFD60A; display: none; }
|
||||||
|
.pause-hint.visible { display: inline; }
|
||||||
.log-box { background: #080810; border: 1px solid #1E1E2E; border-radius: 6px;
|
.log-box { background: #080810; border: 1px solid #1E1E2E; border-radius: 6px;
|
||||||
height: 300px; overflow-y: auto; padding: 8px; font-size: 11px; line-height: 1.6; }
|
height: 300px; overflow-y: auto; padding: 8px; font-size: 11px; line-height: 1.6; position: relative; }
|
||||||
.log-entry { white-space: pre-wrap; word-break: break-all; }
|
.log-entry { white-space: pre-wrap; word-break: break-all; }
|
||||||
.log-entry.error { color: #FF6B6B; }
|
.log-entry.error { color: #FF6B6B; }
|
||||||
.log-entry.warn { color: #FFD60A; }
|
.log-entry.warn { color: #FFD60A; }
|
||||||
|
|
@ -94,14 +98,38 @@
|
||||||
|
|
||||||
<!-- Verbindungslog -->
|
<!-- Verbindungslog -->
|
||||||
<div class="card" style="margin-top:12px">
|
<div class="card" style="margin-top:12px">
|
||||||
<h2>Verbindungslog</h2>
|
<div class="log-header">
|
||||||
|
<h2>Verbindungslog</h2>
|
||||||
|
<span>
|
||||||
|
<span class="pause-hint" id="pause-hint">Autoscroll pausiert</span>
|
||||||
|
<button class="btn secondary" id="btn-scroll" onclick="resumeScroll()" style="display:none;padding:4px 10px;font-size:11px">Nach unten</button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
<div class="log-box" id="log-box"></div>
|
<div class="log-box" id="log-box"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const logBox = document.getElementById('log-box');
|
const logBox = document.getElementById('log-box');
|
||||||
const chatBox = document.getElementById('chat-box');
|
const chatBox = document.getElementById('chat-box');
|
||||||
|
const pauseHint = document.getElementById('pause-hint');
|
||||||
|
const btnScroll = document.getElementById('btn-scroll');
|
||||||
let ws;
|
let ws;
|
||||||
|
let logAutoScroll = true;
|
||||||
|
|
||||||
|
// Autoscroll pausiert wenn User hochscrollt
|
||||||
|
logBox.addEventListener('scroll', () => {
|
||||||
|
const atBottom = logBox.scrollHeight - logBox.scrollTop - logBox.clientHeight < 30;
|
||||||
|
logAutoScroll = atBottom;
|
||||||
|
pauseHint.classList.toggle('visible', !atBottom);
|
||||||
|
btnScroll.style.display = atBottom ? 'none' : 'inline';
|
||||||
|
});
|
||||||
|
|
||||||
|
function resumeScroll() {
|
||||||
|
logAutoScroll = true;
|
||||||
|
logBox.scrollTop = logBox.scrollHeight;
|
||||||
|
pauseHint.classList.remove('visible');
|
||||||
|
btnScroll.style.display = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
const STATUS_LABELS = {
|
const STATUS_LABELS = {
|
||||||
connected: 'Verbunden',
|
connected: 'Verbunden',
|
||||||
|
|
@ -202,7 +230,7 @@
|
||||||
el.className = `log-entry ${level}`;
|
el.className = `log-entry ${level}`;
|
||||||
el.textContent = `${time} [${source}] ${message}`;
|
el.textContent = `${time} [${source}] ${message}`;
|
||||||
logBox.appendChild(el);
|
logBox.appendChild(el);
|
||||||
logBox.scrollTop = logBox.scrollHeight;
|
if (logAutoScroll) logBox.scrollTop = logBox.scrollHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addChat(type, text, meta) {
|
function addChat(type, text, meta) {
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ const GATEWAY_TOKEN = process.env.ARIA_AUTH_TOKEN || "";
|
||||||
const RVS_HOST = process.env.RVS_HOST || "";
|
const RVS_HOST = process.env.RVS_HOST || "";
|
||||||
const RVS_PORT = process.env.RVS_PORT || "443";
|
const RVS_PORT = process.env.RVS_PORT || "443";
|
||||||
const RVS_TLS = process.env.RVS_TLS || "true";
|
const RVS_TLS = process.env.RVS_TLS || "true";
|
||||||
|
const RVS_TLS_FALLBACK = process.env.RVS_TLS_FALLBACK || "true";
|
||||||
const RVS_TOKEN = process.env.RVS_TOKEN || "";
|
const RVS_TOKEN = process.env.RVS_TOKEN || "";
|
||||||
|
|
||||||
// ── State ───────────────────────────────────────────────
|
// ── State ───────────────────────────────────────────────
|
||||||
|
|
@ -258,7 +259,7 @@ function sendToGateway(text) {
|
||||||
|
|
||||||
// ── RVS Verbindung (optional) ───────────────────────────
|
// ── RVS Verbindung (optional) ───────────────────────────
|
||||||
|
|
||||||
function connectRVS() {
|
function connectRVS(forcePlain) {
|
||||||
if (!RVS_HOST || !RVS_TOKEN) {
|
if (!RVS_HOST || !RVS_TOKEN) {
|
||||||
log("info", "rvs", "Nicht konfiguriert — ueberspringe");
|
log("info", "rvs", "Nicht konfiguriert — ueberspringe");
|
||||||
state.rvs.status = "not_configured";
|
state.rvs.status = "not_configured";
|
||||||
|
|
@ -266,7 +267,9 @@ function connectRVS() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const proto = RVS_TLS === "true" ? "wss" : "ws";
|
// TLS-Logik: wss zuerst, bei Fehler Fallback auf ws (wenn erlaubt)
|
||||||
|
const useTls = RVS_TLS === "true" && !forcePlain;
|
||||||
|
const proto = useTls ? "wss" : "ws";
|
||||||
const url = `${proto}://${RVS_HOST}:${RVS_PORT}?token=${RVS_TOKEN}`;
|
const url = `${proto}://${RVS_HOST}:${RVS_PORT}?token=${RVS_TOKEN}`;
|
||||||
|
|
||||||
state.rvs.status = "connecting";
|
state.rvs.status = "connecting";
|
||||||
|
|
@ -276,7 +279,7 @@ function connectRVS() {
|
||||||
const ws = new WebSocket(url);
|
const ws = new WebSocket(url);
|
||||||
|
|
||||||
ws.on("open", () => {
|
ws.on("open", () => {
|
||||||
log("info", "rvs", "Verbunden");
|
log("info", "rvs", `Verbunden (${proto})`);
|
||||||
state.rvs.status = "connected";
|
state.rvs.status = "connected";
|
||||||
state.rvs.lastError = null;
|
state.rvs.lastError = null;
|
||||||
rvsWs = ws;
|
rvsWs = ws;
|
||||||
|
|
@ -302,13 +305,21 @@ function connectRVS() {
|
||||||
state.rvs.status = "disconnected";
|
state.rvs.status = "disconnected";
|
||||||
rvsWs = null;
|
rvsWs = null;
|
||||||
broadcastState();
|
broadcastState();
|
||||||
setTimeout(connectRVS, 5000);
|
setTimeout(() => connectRVS(), 5000);
|
||||||
});
|
});
|
||||||
|
|
||||||
ws.on("error", (err) => {
|
ws.on("error", (err) => {
|
||||||
log("error", "rvs", `Fehler: ${err.message}`);
|
log("error", "rvs", `Fehler (${proto}): ${err.message}`);
|
||||||
state.rvs.lastError = err.message;
|
state.rvs.lastError = err.message;
|
||||||
broadcastState();
|
broadcastState();
|
||||||
|
|
||||||
|
// TLS Fallback: wenn wss fehlschlaegt und Fallback erlaubt → ws versuchen
|
||||||
|
if (useTls && RVS_TLS_FALLBACK === "true") {
|
||||||
|
log("warn", "rvs", "TLS fehlgeschlagen — Fallback auf ws://");
|
||||||
|
ws.removeAllListeners();
|
||||||
|
try { ws.close(); } catch (_) {}
|
||||||
|
connectRVS(true);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,7 @@ services:
|
||||||
- RVS_HOST=${RVS_HOST:-}
|
- RVS_HOST=${RVS_HOST:-}
|
||||||
- RVS_PORT=${RVS_PORT:-443}
|
- RVS_PORT=${RVS_PORT:-443}
|
||||||
- RVS_TLS=${RVS_TLS:-true}
|
- RVS_TLS=${RVS_TLS:-true}
|
||||||
|
- RVS_TLS_FALLBACK=${RVS_TLS_FALLBACK:-true}
|
||||||
- RVS_TOKEN=${RVS_TOKEN:-}
|
- RVS_TOKEN=${RVS_TOKEN:-}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue