forked from troutowicz/geoshare
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathserver.js
124 lines (105 loc) · 2.37 KB
/
server.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
'use strict';
import config from 'config';
import Hapi from 'hapi';
import Redis from 'redis';
import * as services from './lib/services';
import SocketIO from 'socket.io';
import {
getBroadcasts,
getData,
emitBroadcasts
} from './lib/meerkat';
const server = new Hapi.Server();
const client = Redis.createClient();
server.app.client = client;
export default (options) => {
server.connection({
host: config.get('Web.host'),
port: config.get('Web.port'),
});
server.register(
[
{
register: require('good'),
options: {
reporters: [
{
reporter: require('good-console'),
events: { log: '*' },
},
],
},
},
{
register: require('hapi-shutdown'),
options: {
serverSpindownTime: 10000,
},
},
],
err => {
if (err) {
throw err;
}
}
);
server.route({
method: 'GET',
path: '/public/{path*}',
handler: {
directory: {
path: 'build/public',
listing: false,
},
},
});
server.route({
method: 'GET',
path: '/',
config: {
handler: services.index,
},
});
if (options.broadcastsRoute) {
server.route({
method: 'GET',
path: '/broadcasts',
handler: (request, reply) => {
getData(client, (err, data) => {
reply(err || data);
});
},
});
}
function broadcastPolling(io) {
getData(client, (err, data) => {
if (!err) {
emitBroadcasts(io, data);
}
});
setTimeout(() => {
broadcastPolling(io);
}, options.pollingTime);
}
server.start(() => {
server.log('info', `Server running at: ${server.info.uri}`);
const io = SocketIO.listen(server.listener);
server.app.options = options;
server.app.io = io;
io.on('connection', socket => {
server.log('info', 'Client connected to local socket');
socket.join('realtime');
io.to('realtime').emit('data:add', getBroadcasts(), true);
socket.on('flow:pause', (callback) => {
socket.leave('realtime');
return callback();
});
socket.on('flow:start', (callback) => {
socket.join('realtime');
return callback();
});
socket.on('disconnect', () => socket.leave('realtime'));
});
broadcastPolling(io);
});
};