-
Notifications
You must be signed in to change notification settings - Fork 0
/
router.js
67 lines (51 loc) · 1.74 KB
/
router.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
'use strict';
const sprintf = require('sprintf');
const randomString = require('random-string');
const RCB = require('./rcb');
const IO_Router = http => {
const ctx = {
game: null,
state: null,
events: null,
interval: null
};
const newGame = socket => (config, initialState) => {
ctx.game = new RCB(config);
ctx.state = initialState || ctx.game.initialState();
ctx.events = [];
ctx.interval = setInterval(() => compute(socket), ctx.game.COMPUTE_DELAY);
};
const compute = socket => {
ctx.state = ctx.game.compute(ctx.events, ctx.state);
socket.emit('compute', ctx.state);
};
const pushKeyPress = keyCode => {
const filter = val => val.name !== 'keyPress' || val.keyCode !== keyCode;
ctx.events = ctx.events.filter(filter).concat({ name: 'keyPress', keyCode: keyCode });
};
const removeKeyPress = keyCode => {
const filter = val => val.name !== 'keyPress' && val.keyCode !== keyCode;
ctx.events = ctx.events.filter(filter);
};
const init = socket => config => {
newGame(socket)(config);
const stopComputing = () => clearInterval(ctx.interval);
socket.on('disconnect', stopComputing);
/*socket.on('updateConfig', config => {
stopComputing();
newGame(socket)(config, ctx.state);
});*/
socket.on('keysPress', events => {
events.forEach(e => e[0] === 'keydown' ? pushKeyPress(e[1]) : removeKeyPress(e[1]));
});
socket.emit('initialized', {
COMPUTE_DELAY: ctx.game.COMPUTE_DELAY,
socketId: socket.id
});
};
require('socket.io')(http).on('connection', socket => {
socket.id = randomString() + '-' + sprintf('%04d', Math.floor(Math.random() * 1000));
socket.on('init', init(socket));
});
};
module.exports = IO_Router;