import type { DesktopCommand, DesktopEvent } from './protocol'; import { DESKTOP_SIDECAR_KIND } from './protocol'; import * as vncManager from './vnc-manager'; import { createSidecarConnector } from '@@/sidecar/connect'; import { getOwnerHomeDir } from '@@/data-path'; import { API_URL } from '@@/officer-url.mjs'; // ── Command handlers ── type ReplyFn = (msg: DesktopEvent) => void; async function handleCommand(cmd: DesktopCommand, reply: ReplyFn) { switch (cmd.type) { case 'ping': reply({ type: 'pong', id: cmd.id }); break; case 'vnc:start': { try { const { port, display } = await vncManager.startSession(cmd.params); reply({ type: 'vnc:started', id: cmd.id, port, display }); } catch (err) { reply({ type: 'vnc:error', id: cmd.id, error: err instanceof Error ? err.message : String(err) }); } break; } case 'vnc:ensure-password': { try { const { password } = await vncManager.ensureVncPassword(getOwnerHomeDir(cmd.email)); reply({ type: 'vnc:password', id: cmd.id, password }); } catch (err) { reply({ type: 'vnc:error', id: cmd.id, error: err instanceof Error ? err.message : String(err) }); } break; } case 'vnc:stop': vncManager.stopSession(cmd.email); reply({ type: 'vnc:stopped', id: cmd.id }); break; default: reply({ type: 'error', id: (cmd as DesktopCommand).id, error: `Unknown command type: ${(cmd as Record).type}`, }); } } // ── Connect to API server ── const connection = createSidecarConnector({ apiUrl: `${API_URL}/api/sidecar/register`, name: 'vnc', handles: [DESKTOP_SIDECAR_KIND], onCommand(cmd, reply) { handleCommand(cmd as DesktopCommand, reply as ReplyFn); }, }); // ── Graceful shutdown ── function shutdown(signal: string) { console.log(`[vnc] ${signal} received, stopping all sessions...`); vncManager.stopAll(); connection.destroy(); process.exit(0); } process.on('SIGTERM', () => shutdown('SIGTERM')); process.on('SIGINT', () => shutdown('SIGINT'));