Commit | Line | Data |
---|---|---|
a29d9d6b | 1 | const url = require('url'); |
1d184b4c | 2 | |
2807f530 | 3 | // Node version in Ubuntu 16.04 does not know about URL class |
98db2082 BA |
4 | function getJsonFromUrl(url) |
5 | { | |
5bd05dba BA |
6 | const query = url.substr(2); //starts with "/?" |
7 | let result = {}; | |
8 | query.split("&").forEach((part) => { | |
9 | const item = part.split("="); | |
10 | result[item[0]] = decodeURIComponent(item[1]); | |
11 | }); | |
12 | return result; | |
2807f530 BA |
13 | } |
14 | ||
1d184b4c | 15 | module.exports = function(wss) { |
5bd05dba BA |
16 | let clients = {}; //associative array sid --> socket |
17 | wss.on("connection", (socket, req) => { | |
18 | const query = getJsonFromUrl(req.url); | |
19 | const sid = query["sid"]; | |
d4036efe | 20 | // TODO: later, allow duplicate connections (shouldn't be much more complicated) |
5bd05dba BA |
21 | if (!!clients[sid]) |
22 | return socket.send(JSON.stringify({code:"duplicate"})); | |
23 | clients[sid] = socket; | |
24 | // Notify room: | |
5a3da968 BA |
25 | Object.keys(clients).forEach(k => { |
26 | if (k != sid) | |
27 | clients[k].send(JSON.stringify({code:"connect",sid:sid})); | |
28 | }); | |
29 | socket.on("message", objtxt => { | |
5bd05dba | 30 | let obj = JSON.parse(objtxt); |
5a3da968 | 31 | if (!!obj.target && !clients[obj.target]) |
b4d619d1 | 32 | return; //receiver not connected, nothing we can do |
5a3da968 | 33 | //console.log(obj.code); |
5bd05dba BA |
34 | switch (obj.code) |
35 | { | |
81d9ce72 BA |
36 | case "pollclients": |
37 | socket.send(JSON.stringify({code:"pollclients", | |
38 | sockIds:Object.keys(clients).filter(k => k != sid)})); | |
5a3da968 BA |
39 | break; |
40 | case "askidentity": | |
81d9ce72 BA |
41 | clients[obj.target].send( |
42 | JSON.stringify({code:"askidentity",from:sid})); | |
43 | break; | |
dd75774d | 44 | case "askchallenge": |
81d9ce72 | 45 | clients[obj.target].send( |
dd75774d | 46 | JSON.stringify({code:"askchallenge",from:sid})); |
81d9ce72 BA |
47 | break; |
48 | case "askgame": | |
49 | clients[obj.target].send( | |
50 | JSON.stringify({code:"askgame",from:sid})); | |
5a3da968 BA |
51 | break; |
52 | case "identity": | |
81d9ce72 BA |
53 | clients[obj.target].send( |
54 | JSON.stringify({code:"identity",user:obj.user})); | |
4d64881e | 55 | break; |
5bd05dba BA |
56 | case "refusechallenge": |
57 | clients[obj.target].send( | |
58 | JSON.stringify({code:"refusechallenge", cid:obj.cid, from:sid})); | |
59 | break; | |
98f48579 BA |
60 | case "deletechallenge": |
61 | clients[obj.target].send( | |
62 | JSON.stringify({code:"deletechallenge", cid:obj.cid, from:sid})); | |
63 | break; | |
a6bddfc6 BA |
64 | case "newgame": |
65 | clients[obj.target].send(JSON.stringify( | |
5bd05dba | 66 | {code:"newgame", gameInfo:obj.gameInfo, cid:obj.cid})); |
a6bddfc6 | 67 | break; |
42c15a75 BA |
68 | case "challenge": |
69 | clients[obj.target].send(JSON.stringify( | |
70 | {code:"challenge", chall:obj.chall, from:sid})); | |
71 | break; | |
dd75774d | 72 | case "game": |
42c15a75 BA |
73 | clients[obj.target].send(JSON.stringify( |
74 | {code:"game", game:obj.game, from:sid})); | |
4d64881e | 75 | break; |
5bd05dba | 76 | case "newchat": |
5a3da968 | 77 | clients[obj.target].send(JSON.stringify({code:"newchat",msg:obj.msg})); |
5bd05dba | 78 | break; |
5bd05dba BA |
79 | // TODO: WebRTC instead in this case (most demanding?) |
80 | case "newmove": | |
5a3da968 | 81 | clients[obj.target].send(JSON.stringify({code:"newmove",move:obj.move})); |
5bd05dba | 82 | break; |
5bd05dba | 83 | case "ping": |
a36a09c0 BA |
84 | // If this code is reached, then obj.target is connected |
85 | socket.send(JSON.stringify({code:"pong"})); | |
5bd05dba BA |
86 | break; |
87 | case "lastate": | |
5a3da968 BA |
88 | const oppId = obj.target; |
89 | obj.oppid = sid; //I'm the opponent of my opponent(s) | |
4d64881e | 90 | clients[oppId].send(JSON.stringify(obj)); |
5bd05dba | 91 | break; |
5bd05dba | 92 | case "resign": |
5a3da968 | 93 | clients[obj.target].send(JSON.stringify({code:"resign"})); |
5bd05dba | 94 | break; |
b988c726 BA |
95 | case "abort": |
96 | clients[obj.target].send(JSON.stringify({code:"abort",msg:obj.msg})); | |
97 | break; | |
2cc10cdb BA |
98 | case "drawoffer": |
99 | clients[obj.target].send(JSON.stringify({code:"drawoffer"})); | |
100 | break; | |
101 | case "draw": | |
102 | clients[obj.target].send(JSON.stringify({code:"draw"})); | |
103 | break; | |
5bd05dba BA |
104 | } |
105 | }); | |
106 | socket.on("close", () => { | |
107 | delete clients[sid]; | |
b4d619d1 BA |
108 | // Notify every other connected client |
109 | Object.keys(clients).forEach( k => { | |
4d64881e | 110 | clients[k].send(JSON.stringify({code:"disconnect",sid:sid})); |
b4d619d1 | 111 | }); |
5bd05dba BA |
112 | }); |
113 | }); | |
1d184b4c | 114 | } |