| 245 | } |
| 246 | |
| 247 | function handleControlMessage(msg: ServerMessage): void { |
| 248 | switch (msg.type) { |
| 249 | case 'connected': |
| 250 | // Session established — nothing extra needed |
| 251 | break |
| 252 | |
| 253 | case 'pong': |
| 254 | latencyEl.textContent = `${Date.now() - lastPingSent}ms` |
| 255 | break |
| 256 | |
| 257 | case 'error': |
| 258 | term.writeln(`\r\n\x1b[31m[error] ${msg.message}\x1b[0m`) |
| 259 | break |
| 260 | |
| 261 | case 'exit': |
| 262 | term.writeln( |
| 263 | `\r\n\x1b[33m[session ended — exit code ${msg.exitCode ?? 0}]\x1b[0m`, |
| 264 | ) |
| 265 | break |
| 266 | } |
| 267 | } |
| 268 | |
| 269 | function onDisconnect(): void { |
| 270 | connected = false |