-
Notifications
You must be signed in to change notification settings - Fork 1
/
start-socket.js
108 lines (89 loc) · 2.49 KB
/
start-socket.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
/* global module require __dirname setInterval */
const https = require('https');
const fs = require('fs');
const ws = require('ws');
const chokidar = require('chokidar');
const config = require('./web/config');
const noOperation = () => {};
module.exports = portNumber => {
const clients = [];
let server;
let wss;
// Check if configured with SSL
if (config.sslCertificatePath) {
server = https.createServer(
{
key: fs.readFileSync(`${config.sslCertificatePath}/privkey.pem`),
cert: fs.readFileSync(`${config.sslCertificatePath}/fullchain.pem`)
}
);
wss = new ws.Server({
server,
perMessageDeflate: false
});
server.listen(portNumber);
} else {
wss = new ws.Server({
perMessageDeflate: false,
port: portNumber
});
}
// Listen to new socket connections
wss.on(
'connection',
ws => {
ws.isAlive = true;
ws.on(
'pong',
() => {
ws.isAlive = true;
}
);
// Add the client to collection
clients.push(ws);
ws.on(
'error',
() => {}
);
ws.on(
'close',
() => {
const currentClient = clients.filter(c => c === ws)[0];
// Remove the client from collection
clients.splice(clients.indexOf(currentClient), 1);
}
);
}
);
const pingInterval = setInterval(
() => {
clients
.forEach(
ws => {
if (!ws.isAlive) {
return ws.terminate();
}
ws.isAlive = false;
ws.ping(noOperation);
return true;
}
);
},
30000
);
// Set up a watcher on the data directory
chokidar
.watch(
config.dataDirectoryPath,
{ persistent: true }
)
.on(
'all',
event => {
clients.forEach(
s => { s.send(JSON.stringify({ message: 'UPDATE' })); }
);
}
);
console.log(config.appName, 'socket server started on', portNumber);
};