]> Untitled Git - go.git/blob - socket/server.js
Added board state background (#1)
[go.git] / socket / server.js
1 var express = require('express');
2 var app = express();
3 var expressWs = require('express-ws')(app);
4
5 var db = require('./db');
6
7 function sleep(ms) {
8   return new Promise(resolve => setTimeout(resolve, ms));
9 }
10
11 async function pollStatefulChange(ws, session_id) {
12     let conn;
13     try {
14         conn = await db.pool.getConnection();
15         var lastUpdated = 0;
16         while(true) {
17             var res = await conn.query(`
18 select UNIX_TIMESTAMP(MAX(updated_at)) as last_updated
19 from go.state
20 where session_id = ?;
21             `, [session_id]);
22             console.log(res);
23             let updatedAt = res[0].last_updated;
24             if ( updatedAt > lastUpdated) {
25                 console.log("websocket poll: board updated!");
26                 lastUpdated = updatedAt;
27                 res = await db.getBoardState(session_id);
28                 ws.send(JSON.stringify({
29                     "type": "board",
30                     "data": res
31                 }));
32             }
33             await sleep(1000);
34         }
35     } catch(err) {
36         console.log(`websocket poll error: ${err}`);
37     } finally {
38         if (conn) conn.end();
39     } 
40 }
41
42 app.ws('/ws', async function(ws, req) {
43     // poll for stateful change and notify clients to update their boards
44     var session_id = 0;
45     pollStatefulChange(ws, 0);
46
47     ws.on('message', async function(msg) {
48         console.log(`ws message: ${msg}`);
49
50         var parsed = JSON.parse(msg);
51         switch (parsed.type) {
52             case "move":
53                 await db.addMove(
54                     parsed.data.session,
55                     parsed.data.x,
56                     parsed.data.y,
57                     parsed.data.state,
58                     );
59                 // fall through and return new board state
60             case "board":
61                 var res = await db.getBoardState(
62                     parsed.data.session
63                     );
64                 ws.send(JSON.stringify({
65                     "type": "board",
66                     "data": res
67                 }));
68                 break;
69             default:
70                 console.log("ws message: Unknown message type: " + type);
71         }
72     });
73 });
74
75 app.listen(3000);