2026-03-17 12:38:30 +01:00
|
|
|
const { WebSocketServer } = require("ws");
|
2026-03-22 14:56:05 +01:00
|
|
|
const url = require("url");
|
|
|
|
|
const config = require("./config");
|
|
|
|
|
const watcher = require("./watcher");
|
2026-03-07 09:51:37 +01:00
|
|
|
|
|
|
|
|
function setupWebSocket(server) {
|
2026-03-17 12:38:30 +01:00
|
|
|
const wss = new WebSocketServer({ server, path: "/ws" });
|
2026-03-07 09:51:37 +01:00
|
|
|
|
2026-03-30 21:05:47 +02:00
|
|
|
// Plugin-registered message handlers: type -> handler(msg, ws)
|
|
|
|
|
wss.messageHandlers = new Map();
|
|
|
|
|
|
2026-03-22 14:56:05 +01:00
|
|
|
wss.on("connection", (ws, req) => {
|
|
|
|
|
const params = new url.URL(req.url, "http://localhost").searchParams;
|
|
|
|
|
const vaultId = params.get("vault");
|
2026-03-07 09:51:37 +01:00
|
|
|
|
2026-03-22 14:56:05 +01:00
|
|
|
if (!vaultId || !config.getVaultPath(vaultId)) {
|
|
|
|
|
ws.close(4001, "Invalid or missing vault ID");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const vaultPath = config.getVaultPath(vaultId);
|
|
|
|
|
console.log(`[ws] Client connected to vault: ${vaultId}`);
|
|
|
|
|
|
|
|
|
|
// Start watching this vault (no-op if already watching)
|
|
|
|
|
watcher.startWatching(vaultId, vaultPath);
|
|
|
|
|
|
|
|
|
|
// Per-client listener that forwards events over WebSocket
|
|
|
|
|
const listener = (event) => {
|
|
|
|
|
if (ws.readyState === ws.OPEN) {
|
|
|
|
|
ws.send(JSON.stringify(event));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
watcher.addListener(vaultId, listener);
|
2026-03-07 09:51:37 +01:00
|
|
|
|
2026-03-30 21:05:47 +02:00
|
|
|
// Dispatch incoming messages to registered handlers
|
|
|
|
|
ws.on("message", (data) => {
|
|
|
|
|
try {
|
|
|
|
|
const msg = JSON.parse(data);
|
|
|
|
|
const handler = wss.messageHandlers.get(msg.type);
|
|
|
|
|
|
|
|
|
|
if (handler) {
|
|
|
|
|
handler(msg, ws);
|
|
|
|
|
}
|
|
|
|
|
} catch {}
|
|
|
|
|
});
|
|
|
|
|
|
2026-03-17 12:38:30 +01:00
|
|
|
ws.on("close", () => {
|
2026-03-22 14:56:05 +01:00
|
|
|
console.log(`[ws] Client disconnected from vault: ${vaultId}`);
|
|
|
|
|
watcher.removeListener(vaultId, listener);
|
2026-03-07 09:51:37 +01:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return wss;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = { setupWebSocket };
|