decentralised sync engine
1import type { ShardMessage } from "@/lib/types/messages"; 2import { rawDataToString } from "@/lib/utils"; 3import { validateNewMessage } from "@/lib/validators"; 4import type { RawData } from "ws"; 5import WebSocket from "ws"; 6 7const wss = new WebSocket.Server({ port: 8080 }); 8 9const messages: ShardMessage[] = []; 10const clients = new Set<WebSocket>(); 11 12wss.on("connection", (ws) => { 13 clients.add(ws); 14 15 ws.send( 16 JSON.stringify({ 17 type: "shard/history", 18 messages: messages, 19 }), 20 ); 21 22 ws.on("message", (data: RawData) => { 23 const jsonText = rawDataToString(data); 24 const jsonData: unknown = JSON.parse(jsonText); 25 26 const shardMessage = validateNewMessage(jsonData); 27 if (!shardMessage) return; 28 29 messages.push(shardMessage); 30 31 clients.forEach((client) => { 32 if (client.readyState === WebSocket.OPEN) { 33 client.send(JSON.stringify(shardMessage)); 34 } 35 }); 36 }); 37 38 ws.on("close", () => { 39 clients.delete(ws); 40 }); 41}); 42 43console.log("Server running on ws://localhost:8080");