-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathserver.js
102 lines (92 loc) · 3.92 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
var fs = require('fs');
var argv = require('minimist')(process.argv.slice(2));
var SocketCluster = require('socketcluster').SocketCluster;
var scHotReboot = require('sc-hot-reboot');
var workerControllerPath = argv.wc || process.env.SOCKETCLUSTER_WORKER_CONTROLLER;
var brokerControllerPath = argv.bc || process.env.SOCKETCLUSTER_BROKER_CONTROLLER;
var initControllerPath = argv.ic || process.env.SOCKETCLUSTER_INIT_CONTROLLER;
var environment = process.env.ENV || 'dev';
var options = {
workers: Number(argv.w) || Number(process.env.SOCKETCLUSTER_WORKERS) || 1,
brokers: Number(argv.b) || Number(process.env.SOCKETCLUSTER_BROKERS) || 1,
port: Number(argv.p) || Number(process.env.SOCKETCLUSTER_PORT) || Number(process.env.PORT) || 8000,
// If your system doesn't support 'uws', you can switch to 'ws' (which is slower but works on older systems).
wsEngine: process.env.SOCKETCLUSTER_WS_ENGINE || 'uws',
appName: argv.n || process.env.SOCKETCLUSTER_APP_NAME || null,
workerController: workerControllerPath || __dirname + '/worker.js',
brokerController: brokerControllerPath || __dirname + '/broker.js',
initController: initControllerPath || null,
socketChannelLimit: Number(process.env.SOCKETCLUSTER_SOCKET_CHANNEL_LIMIT) || 1000,
clusterStateServerHost: argv.cssh || process.env.SCC_STATE_SERVER_HOST || null,
clusterStateServerPort: process.env.SCC_STATE_SERVER_PORT || null,
clusterAuthKey: process.env.SCC_AUTH_KEY || null,
clusterStateServerConnectTimeout: Number(process.env.SCC_STATE_SERVER_CONNECT_TIMEOUT) || null,
clusterStateServerAckTimeout: Number(process.env.SCC_STATE_SERVER_ACK_TIMEOUT) || null,
clusterStateServerReconnectRandomness: Number(process.env.SCC_STATE_SERVER_RECONNECT_RANDOMNESS) || null,
crashWorkerOnError: argv['auto-reboot'] != false,
// If using nodemon, set this to true, and make sure that environment is 'dev'.
killMasterOnSignal: false,
instanceId: 'realm-1',
pubSubBatchDuration: null,
environment: environment
};
var SOCKETCLUSTER_OPTIONS;
if (process.env.SOCKETCLUSTER_OPTIONS) {
SOCKETCLUSTER_OPTIONS = JSON.parse(process.env.SOCKETCLUSTER_OPTIONS);
}
for (var i in SOCKETCLUSTER_OPTIONS) {
if (SOCKETCLUSTER_OPTIONS.hasOwnProperty(i)) {
options[i] = SOCKETCLUSTER_OPTIONS[i];
}
}
var masterControllerPath = argv.mc || process.env.SOCKETCLUSTER_MASTER_CONTROLLER;
var start = function () {
var socketCluster = new SocketCluster(options);
if (masterControllerPath) {
var masterController = require(masterControllerPath);
masterController.run(socketCluster);
}
if (environment == 'dev') {
// This will cause SC workers to reboot when code changes anywhere in the app directory.
// The second options argument here is passed directly to chokidar.
// See https://github.com/paulmillr/chokidar#api for details.
console.log(` !! The sc-hot-reboot plugin is watching for code changes in the ${__dirname} directory`);
scHotReboot.attach(socketCluster, {
cwd: __dirname,
ignored: ['public', 'node_modules', 'README.md', 'Dockerfile', 'server.js', 'broker.js', /[\/\\]\./]
});
}
};
var bootCheckInterval = Number(process.env.SOCKETCLUSTER_BOOT_CHECK_INTERVAL) || 200;
if (workerControllerPath) {
// Detect when Docker volumes are ready.
var startWhenFileIsReady = (filePath) => {
return new Promise((resolve) => {
if (!filePath) {
resolve();
return;
}
var checkIsReady = () => {
fs.exists(filePath, (exists) => {
if (exists) {
resolve();
} else {
setTimeout(checkIsReady, bootCheckInterval);
}
});
};
checkIsReady();
});
};
var filesReadyPromises = [
startWhenFileIsReady(masterControllerPath),
startWhenFileIsReady(workerControllerPath),
startWhenFileIsReady(brokerControllerPath),
startWhenFileIsReady(initControllerPath)
];
Promise.all(filesReadyPromises).then(() => {
start();
});
} else {
start();
}