6dbb24a27b01456c0536939663f44133cdd25254
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 // TODO: adjust with readyState? (+ setTimeout()?) + send opponent (re)disconnect
51 // https://github.com/websockets/ws/blob/master/lib/websocket.js line 313
52 if (!!clients
[page
][obj
.oppid
])
53 clients
[page
][obj
.oppid
].send(JSON
.stringify({code:"newmove",move:obj
.move}));
56 if (!!clients
[page
][obj
.oppid
])
57 socket
.send(JSON
.stringify({code:"pong"}));
63 const oppId
= games
[page
]["id"];
64 const fen
= games
[page
]["fen"];
66 const mycolor
= Math
.random() < 0.5 ? 'w' : 'b';
67 socket
.send(JSON
.stringify({code:"newgame",fen:fen
,oppid:oppId
,color:mycolor
}));
68 // TODO: check readyState, potential setTimeout()? + send opponent (re)disconnect
69 clients
[page
][oppId
].send(JSON
.stringify({code:"newgame",fen:fen
,oppid:sid
,color:mycolor
=="w"?"b":"w"}));
72 games
[page
] = {id:sid
, fen:obj
.fen
}; //wait for opponent
75 clients
[page
][obj
.oppid
].send(JSON
.stringify({code:"resign"}));
80 socket
.on("close", () => {
81 delete clients
[page
][sid
];
82 // Remove potential pending game
83 if (!!games
[page
] && games
[page
]["id"] == sid
)
87 // Send to every client connected on index an update message for counts
88 Object
.keys(clients
["index"]).forEach( k
=> {
89 clients
["index"][k
].send(JSON
.stringify({code:"decrease",vname:page
}));
92 // Also notify potential opponents: hit all clients which check if sid corresponds
93 Object
.keys(clients
[page
]).forEach( k
=> {
94 clients
[page
][k
].send(JSON
.stringify({code:"disconnect",id:sid
}));