820a88c790e7d30427b720aea3fd11fcc5655e75
[vchess.git] / sockets.js
1 const url = require('url');
2 const Variants = require("./variants");
3
4 module.exports = function(wss) {
5
6 let clients = { "index": {} };
7 let games = {}; //pending games (player sid)
8 for (const v of Variants)
9 clients[v.name] = {};
10
11 wss.on("connection", (socket, req) => {
12 const params = new URL("http://localhost" + req.url).searchParams;
13 const sid = params.get("sid");
14 const page = params.get("page");
15 clients[page][sid] = socket;
16 if (page == "index")
17 {
18 // Send counting info
19 const countings = {};
20 for (const v of Variants)
21 countings[v.name] = Object.keys(clients[v.name]).length;
22 socket.send(JSON.stringify({code:"counts",counts:countings}));
23 }
24 else
25 {
26 // Send to every client connected on index an update message for counts
27 Object.keys(clients["index"]).forEach( k => {
28 clients["index"][k].send(JSON.stringify({code:"increase",vname:page}));
29 });
30 // Also notify potential opponents: hit all clients which check if sid corresponds
31 Object.keys(clients[page]).forEach( k => {
32 clients[page][k].send(JSON.stringify({code:"connect",id:sid}));
33 });
34 socket.on("message", objtxt => {
35 let obj = JSON.parse(objtxt);
36 switch (obj.code)
37 {
38 case "newmove":
39 if (!!clients[page][obj.oppid])
40 clients[page][obj.oppid].send(JSON.stringify({code:"newmove",move:obj.move}));
41 break;
42 case "ping":
43 if (!!clients[page][obj.oppid])
44 socket.send(JSON.stringify({code:"pong"}));
45 break;
46 case "lastate":
47 if (!!clients[page][obj.oppid])
48 {
49 const oppId = obj.oppid;
50 obj.oppid = sid; //I'm oppid for my opponent
51 clients[page][oppId].send(JSON.stringify(obj));
52 }
53 break;
54 case "newgame":
55 if (!!games[page])
56 {
57 // Start a new game
58 const oppId = games[page]["id"];
59 const fen = games[page]["fen"];
60 delete games[page];
61 const mycolor = Math.random() < 0.5 ? 'w' : 'b';
62 socket.send(JSON.stringify({code:"newgame",fen:fen,oppid:oppId,color:mycolor}));
63 if (!!clients[page][oppId])
64 clients[page][oppId].send(JSON.stringify({code:"newgame",fen:fen,oppid:sid,color:mycolor=="w"?"b":"w"}));
65 }
66 else
67 games[page] = {id:sid, fen:obj.fen}; //wait for opponent
68 break;
69 case "resign":
70 if (!!clients[page][obj.oppid])
71 clients[page][obj.oppid].send(JSON.stringify({code:"resign"}));
72 break;
73 }
74 });
75 }
76 socket.on("close", () => {
77 delete clients[page][sid];
78 // Remove potential pending game
79 if (!!games[page] && games[page]["id"] == sid)
80 delete games[page];
81 if (page != "index")
82 {
83 // Send to every client connected on index an update message for counts
84 Object.keys(clients["index"]).forEach( k => {
85 clients["index"][k].send(JSON.stringify({code:"decrease",vname:page}));
86 });
87 }
88 // Also notify potential opponents: hit all clients which check if sid corresponds
89 Object.keys(clients[page]).forEach( k => {
90 clients[page][k].send(JSON.stringify({code:"disconnect",id:sid}));
91 });
92 });
93 });
94 }