/
localserver.js
82 lines (71 loc) · 2.07 KB
/
localserver.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
process.title = 'petbot_local';
var config = require('../common/config');
var client = require('socket.io-client');
var _ = require('underscore');
var T = require('tbone').tbone;
var tbone = T;
var servers = tbone.collections.base.make({
lookupById: true
});
var localServer = tbone.make();
T('servers', servers);
localServer('drive', function () {
var driving = _.filter(_.pluck(T('servers') || {}, 'drive'), function (drive) {
return drive && (!!drive.right || !!drive.forward);
});
return driving.length === 0 ? {} : driving[0];
});
localServer('awake', function () {
return _.keys(T('servers')).length > 0;
});
var nextId = 1;
var socket = client.connect(config.HOST, { transports: ['xhr-polling'] });
socket.on('connect', function() {
var me = tbone.make();
me('id', nextId++);
servers.add(me);
console.log('connected to remote server');
socket.emit('clientId', {id: config.DEVICE_ID});
// Expect the server to say "keepDriving" every ~500 ms.
var driveTimeout;
function stopDrivingAfterTimeout() {
if (driveTimeout) {
clearTimeout(driveTimeout);
}
driveTimeout = setTimeout(function () {
me('drive', {});
}, 1000);
}
socket.on('drive', function(data) {
me('drive', data);
stopDrivingAfterTimeout();
});
socket.on('keepDriving', function () {
stopDrivingAfterTimeout();
});
T(function () {
if (!socket.disconnected) {
socket.emit('pins', localServer('pins'));
}
});
T(function () {
if (!socket.disconnected) {
socket.emit('drive', localServer('drive'));
}
});
socket.on('disconnect', function() {
console.log('disconnected from remote server');
servers.remove(me);
});
});
require('./' + process.env.LOCAL_SERVER + '.js')(localServer);
// Gracefully shutdown on SIGHUP
process.on('SIGHUP', function () {
try {
socket.disconnect(function() {
process.exit(0);
});
} catch(e) {
process.exit(0);
}
});