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");