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"})); | |
92a523d1 | 23 | clients[sid] = {sock: socket, page: query["page"]}; |
5c8e044f | 24 | const notifyRoom = (page,code,obj) => { |
92a523d1 BA |
25 | Object.keys(clients).forEach(k => { |
26 | if (k != sid && clients[k].page == page) | |
5c8e044f BA |
27 | { |
28 | clients[k].sock.send(JSON.stringify(Object.assign( | |
29 | {code:code}, obj))); | |
30 | } | |
92a523d1 BA |
31 | }); |
32 | }; | |
5c8e044f | 33 | notifyRoom(query["page"],"connect",{sid:sid}); |
5a3da968 | 34 | socket.on("message", objtxt => { |
5bd05dba | 35 | let obj = JSON.parse(objtxt); |
5a3da968 | 36 | if (!!obj.target && !clients[obj.target]) |
b4d619d1 | 37 | return; //receiver not connected, nothing we can do |
5bd05dba BA |
38 | switch (obj.code) |
39 | { | |
81d9ce72 | 40 | case "pollclients": |
f41ce580 | 41 | const curPage = clients[sid].page; |
81d9ce72 | 42 | socket.send(JSON.stringify({code:"pollclients", |
92a523d1 | 43 | sockIds: Object.keys(clients).filter(k => |
f41ce580 | 44 | k != sid && clients[k].page == curPage)})); |
92a523d1 BA |
45 | break; |
46 | case "pagechange": | |
5c8e044f | 47 | notifyRoom(clients[sid].page, "disconnect", {sid:sid}); |
92a523d1 | 48 | clients[sid].page = obj.page; |
5c8e044f | 49 | notifyRoom(obj.page, "connect", {sid:sid}); |
5a3da968 BA |
50 | break; |
51 | case "askidentity": | |
f41ce580 BA |
52 | clients[obj.target].sock.send(JSON.stringify( |
53 | {code:"askidentity",from:sid})); | |
81d9ce72 | 54 | break; |
dd75774d | 55 | case "askchallenge": |
f41ce580 BA |
56 | clients[obj.target].sock.send(JSON.stringify( |
57 | {code:"askchallenge",from:sid})); | |
81d9ce72 BA |
58 | break; |
59 | case "askgame": | |
f41ce580 BA |
60 | clients[obj.target].sock.send(JSON.stringify( |
61 | {code:"askgame",from:sid})); | |
5a3da968 BA |
62 | break; |
63 | case "identity": | |
f41ce580 BA |
64 | clients[obj.target].sock.send(JSON.stringify( |
65 | {code:"identity",user:obj.user})); | |
4d64881e | 66 | break; |
5bd05dba | 67 | case "refusechallenge": |
f41ce580 BA |
68 | clients[obj.target].sock.send(JSON.stringify( |
69 | {code:"refusechallenge", cid:obj.cid, from:sid})); | |
5bd05dba | 70 | break; |
98f48579 | 71 | case "deletechallenge": |
f41ce580 BA |
72 | clients[obj.target].sock.send(JSON.stringify( |
73 | {code:"deletechallenge", cid:obj.cid, from:sid})); | |
98f48579 | 74 | break; |
a6bddfc6 | 75 | case "newgame": |
92a523d1 | 76 | clients[obj.target].sock.send(JSON.stringify( |
5bd05dba | 77 | {code:"newgame", gameInfo:obj.gameInfo, cid:obj.cid})); |
a6bddfc6 | 78 | break; |
42c15a75 | 79 | case "challenge": |
92a523d1 | 80 | clients[obj.target].sock.send(JSON.stringify( |
42c15a75 BA |
81 | {code:"challenge", chall:obj.chall, from:sid})); |
82 | break; | |
dd75774d | 83 | case "game": |
92a523d1 | 84 | clients[obj.target].sock.send(JSON.stringify( |
42c15a75 | 85 | {code:"game", game:obj.game, from:sid})); |
4d64881e | 86 | break; |
5bd05dba | 87 | case "newchat": |
5c8e044f BA |
88 | notifyRoom(query["page"], "newchat", |
89 | {msg:obj.msg, name:obj.name, sid:sid}) | |
5bd05dba | 90 | break; |
5bd05dba BA |
91 | // TODO: WebRTC instead in this case (most demanding?) |
92 | case "newmove": | |
f41ce580 BA |
93 | clients[obj.target].sock.send(JSON.stringify( |
94 | {code:"newmove",move:obj.move})); | |
5bd05dba BA |
95 | break; |
96 | case "lastate": | |
f41ce580 BA |
97 | clients[obj.target].sock.send(JSON.stringify( |
98 | {code:"lastate", state:obj.state})); | |
5bd05dba | 99 | break; |
5bd05dba | 100 | case "resign": |
f41ce580 BA |
101 | clients[obj.target].sock.send(JSON.stringify( |
102 | {code:"resign"})); | |
5bd05dba | 103 | break; |
b988c726 | 104 | case "abort": |
f41ce580 BA |
105 | clients[obj.target].sock.send(JSON.stringify( |
106 | {code:"abort",msg:obj.msg})); | |
b988c726 | 107 | break; |
2cc10cdb | 108 | case "drawoffer": |
f41ce580 BA |
109 | clients[obj.target].sock.send(JSON.stringify( |
110 | {code:"drawoffer"})); | |
2cc10cdb BA |
111 | break; |
112 | case "draw": | |
f41ce580 BA |
113 | clients[obj.target].sock.send(JSON.stringify( |
114 | {code:"draw"})); | |
2cc10cdb | 115 | break; |
5bd05dba BA |
116 | } |
117 | }); | |
118 | socket.on("close", () => { | |
92a523d1 | 119 | const page = clients[sid].page; |
5bd05dba | 120 | delete clients[sid]; |
92a523d1 | 121 | notifyRoom(page, "disconnect"); |
5bd05dba BA |
122 | }); |
123 | }); | |
1d184b4c | 124 | } |