Phase 0: monorepo skeleton (hub, live-map, api, packages, infra, CI)

This commit is contained in:
Mavis
2026-06-02 15:47:28 +00:00
commit 7b19c54943
59 changed files with 2391 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
/**
* WebSocket fan-out for /api/v1/live.
*
* Phase 0 just keeps a Set of connected clients and broadcasts any
* LiveMessage we get. Clients should handle `ping` as a heartbeat.
*
* Phase 1 will wire this to a Redis pubsub channel so multiple API
* instances can share the fan-out load.
*/
import type { LiveMessage } from '@kerbal-rt/shared-types';
import type { WebSocket } from 'ws';
const clients = new Set<WebSocket>();
function send(ws: WebSocket, msg: LiveMessage): void {
if (ws.readyState === 1 /* OPEN */) {
ws.send(JSON.stringify(msg));
}
}
export const handleLiveSocket = {
onOpen(ws: WebSocket): void {
clients.add(ws);
},
onMessage(_evt: { data: unknown }, _ws: WebSocket): void {
// Phase 0: clients are read-only, ignore incoming.
// Phase 2: accept subscriptions like { type: 'subscribe', vesselId: '...' }
},
onClose(ws: WebSocket): void {
clients.delete(ws);
},
broadcast(msg: LiveMessage): void {
for (const ws of clients) send(ws, msg);
},
};