1 //const url = require('url');
2 const Variants
= require("./variants");
4 function getJsonFromUrl(url
) {
5 var query
= url
.substr(2); //starts with "/?"
7 query
.split("&").forEach(function(part
) {
8 var item
= part
.split("=");
9 result
[item
[0]] = decodeURIComponent(item
[1]);
14 module
.exports = function(wss
) {
16 let clients
= { "index": {} };
17 let games
= {}; //pending games (player sid)
18 for (const v
of Variants
)
21 wss
.on("connection", (socket
, req
) => {
22 //const params = new URL("http://localhost" + req.url).searchParams;
23 var query
= getJsonFromUrl(req
.url
);
24 const sid
= query
["sid"]; //params.get("sid");
25 const page
= query
["page"]; //params.get("page");
26 clients
[page
][sid
] = socket
;
31 for (const v
of Variants
)
32 countings
[v
.name
] = Object
.keys(clients
[v
.name
]).length
;
33 socket
.send(JSON
.stringify({code:"counts",counts:countings
}));
37 // Send to every client connected on index an update message for counts
38 Object
.keys(clients
["index"]).forEach( k
=> {
39 clients
["index"][k
].send(JSON
.stringify({code:"increase",vname:page
}));
41 // Also notify potential opponents: hit all clients which check if sid corresponds
42 Object
.keys(clients
[page
]).forEach( k
=> {
43 clients
[page
][k
].send(JSON
.stringify({code:"connect",id:sid
}));
45 socket
.on("message", objtxt
=> {
46 let obj
= JSON
.parse(objtxt
);
50 clients
[page
][obj
.oppid
].send(JSON
.stringify({code:"newmove",move:obj
.move}));
53 if (!!clients
[page
][obj
.oppid
])
54 socket
.send(JSON
.stringify({code:"pong"}));
60 const oppId
= games
[page
]["id"];
61 const fen
= games
[page
]["fen"];
63 const mycolor
= Math
.random() < 0.5 ? 'w' : 'b';
64 socket
.send(JSON
.stringify({code:"newgame",fen:fen
,oppid:oppId
,color:mycolor
}));
65 clients
[page
][oppId
].send(JSON
.stringify({code:"newgame",fen:fen
,oppid:sid
,color:mycolor
=="w"?"b":"w"}));
68 games
[page
] = {id:sid
, fen:obj
.fen
}; //wait for opponent
71 clients
[page
][obj
.oppid
].send(JSON
.stringify({code:"resign"}));
76 socket
.on("close", () => {
77 delete clients
[page
][sid
];
78 // Remove potential pending game
79 if (!!games
[page
] && games
[page
]["id"] == sid
)
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
}));
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
}));