// panes/websocket.js — /ws/echo console. import { registerPane } from '../app.js'; const TPL = `
WebSocket
Connect to /ws/echo.
idle

    
`; let ws = null; function setState(host, state, klass) { host.querySelector('#ws-state').textContent = state; const p = host.querySelector('#ws-pill'); p.classList.remove('ok', 'err', 'warn', 'info'); if (klass) p.classList.add(klass); } function append(host, line) { const pre = host.querySelector('#ws-log'); pre.textContent += line + '\n'; pre.scrollTop = pre.scrollHeight; } function connect(host) { if (ws && ws.readyState <= 1) return; const proto = location.protocol === 'https:' ? 'wss:' : 'ws:'; const url = `${proto}//${location.host}/ws/echo`; ws = new WebSocket(url); setState(host, 'connecting…', 'warn'); ws.onopen = () => { setState(host, 'connected', 'ok'); append(host, `< connected ${url}`); }; ws.onclose = () => { setState(host, 'disconnected', 'err'); append(host, '< closed'); }; ws.onerror = () => append(host, '! error'); ws.onmessage = (e) => append(host, '< ' + e.data); } registerPane('websocket', { label: 'WebSocket', init(host) { host.innerHTML = TPL; host.querySelector('#ws-connect').addEventListener('click', () => connect(host)); host.querySelector('#ws-disconnect').addEventListener('click', () => ws && ws.close()); host.querySelector('#ws-form').addEventListener('submit', (e) => { e.preventDefault(); const v = host.querySelector('#ws-input').value; if (!v) return; if (!ws || ws.readyState !== 1) { append(host, '! not connected'); return; } ws.send(v); append(host, '> ' + v); host.querySelector('#ws-input').value = ''; }); }, });