@@ -49,11 +49,11 @@ let startup = { | |||
onComponentsReady: async function () { | |||
skins.init(); | |||
factions.init(); | |||
await clientConfig.init(); | |||
server.init(this.onServerReady.bind(this)); | |||
}, | |||
onServerReady: async function () { | |||
await server.init(); | |||
await leaderboard.init(); | |||
atlas.init(); | |||
@@ -332,12 +332,6 @@ | |||
"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", | |||
"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" | |||
}, | |||
"asap": { | |||
"version": "2.0.6", | |||
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", | |||
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", | |||
"optional": true | |||
}, | |||
"asn1": { | |||
"version": "0.2.4", | |||
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", | |||
@@ -538,11 +532,6 @@ | |||
"source-map": "~0.6.0" | |||
} | |||
}, | |||
"clone": { | |||
"version": "2.1.2", | |||
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", | |||
"integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" | |||
}, | |||
"code-point-at": { | |||
"version": "1.1.0", | |||
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", | |||
@@ -844,15 +833,6 @@ | |||
"ansi-colors": "^4.1.1" | |||
} | |||
}, | |||
"errno": { | |||
"version": "0.1.7", | |||
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", | |||
"integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", | |||
"optional": true, | |||
"requires": { | |||
"prr": "~1.0.1" | |||
} | |||
}, | |||
"escape-html": { | |||
"version": "1.0.3", | |||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", | |||
@@ -1304,11 +1284,6 @@ | |||
"rimraf": "2" | |||
} | |||
}, | |||
"function-bind": { | |||
"version": "1.1.1", | |||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", | |||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" | |||
}, | |||
"functional-red-black-tree": { | |||
"version": "1.0.1", | |||
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", | |||
@@ -1471,6 +1446,7 @@ | |||
"version": "4.2.3", | |||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", | |||
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", | |||
"dev": true, | |||
"optional": true | |||
}, | |||
"gtoken": { | |||
@@ -1505,14 +1481,6 @@ | |||
"har-schema": "^2.0.0" | |||
} | |||
}, | |||
"has": { | |||
"version": "1.0.3", | |||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", | |||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", | |||
"requires": { | |||
"function-bind": "^1.1.1" | |||
} | |||
}, | |||
"has-binary2": { | |||
"version": "1.0.3", | |||
"resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", | |||
@@ -1662,11 +1630,6 @@ | |||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", | |||
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" | |||
}, | |||
"is": { | |||
"version": "3.3.0", | |||
"resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", | |||
"integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==" | |||
}, | |||
"is-extglob": { | |||
"version": "2.1.1", | |||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", | |||
@@ -1800,40 +1763,6 @@ | |||
"safe-buffer": "^5.0.1" | |||
} | |||
}, | |||
"less": { | |||
"version": "3.9.0", | |||
"resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", | |||
"integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", | |||
"requires": { | |||
"clone": "^2.1.2", | |||
"errno": "^0.1.1", | |||
"graceful-fs": "^4.1.2", | |||
"image-size": "~0.5.0", | |||
"mime": "^1.4.1", | |||
"mkdirp": "^0.5.0", | |||
"promise": "^7.1.1", | |||
"request": "^2.83.0", | |||
"source-map": "~0.6.0" | |||
}, | |||
"dependencies": { | |||
"image-size": { | |||
"version": "0.5.5", | |||
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", | |||
"integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", | |||
"optional": true | |||
} | |||
} | |||
}, | |||
"less-middleware": { | |||
"version": "3.1.0", | |||
"resolved": "https://registry.npmjs.org/less-middleware/-/less-middleware-3.1.0.tgz", | |||
"integrity": "sha512-1FcTlNE73AVTNwcBykDbCnDPgKZT4VuCZxtlst/i4nB93Y/NsVQsZopK78zfDcT/2lsjBa5xZI8g4SFUhJqsJg==", | |||
"requires": { | |||
"less": "~3.9.0", | |||
"mkdirp": "~0.5.1", | |||
"node.extend": "~2.0.2" | |||
} | |||
}, | |||
"levn": { | |||
"version": "0.4.1", | |||
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", | |||
@@ -1910,7 +1839,8 @@ | |||
"minimist": { | |||
"version": "1.2.5", | |||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | |||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" | |||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", | |||
"dev": true | |||
}, | |||
"minipass": { | |||
"version": "2.9.0", | |||
@@ -1935,6 +1865,7 @@ | |||
"version": "0.5.4", | |||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", | |||
"integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", | |||
"dev": true, | |||
"requires": { | |||
"minimist": "^1.2.5" | |||
} | |||
@@ -2090,15 +2021,6 @@ | |||
} | |||
} | |||
}, | |||
"node.extend": { | |||
"version": "2.0.2", | |||
"resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", | |||
"integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", | |||
"requires": { | |||
"has": "^1.0.3", | |||
"is": "^3.2.1" | |||
} | |||
}, | |||
"nopt": { | |||
"version": "3.0.6", | |||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", | |||
@@ -2301,15 +2223,6 @@ | |||
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", | |||
"dev": true | |||
}, | |||
"promise": { | |||
"version": "7.3.1", | |||
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", | |||
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", | |||
"optional": true, | |||
"requires": { | |||
"asap": "~2.0.3" | |||
} | |||
}, | |||
"proxy-addr": { | |||
"version": "2.0.6", | |||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", | |||
@@ -2319,12 +2232,6 @@ | |||
"ipaddr.js": "1.9.1" | |||
} | |||
}, | |||
"prr": { | |||
"version": "1.0.1", | |||
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", | |||
"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", | |||
"optional": true | |||
}, | |||
"psl": { | |||
"version": "1.8.0", | |||
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", | |||
@@ -10,7 +10,6 @@ | |||
"express-minify": "^1.0.0", | |||
"google-spreadsheet": "^3.1.15", | |||
"image-size": "^0.9.2", | |||
"less-middleware": "^3.1.0", | |||
"rethinkdbdash": "^2.3.31", | |||
"socket.io": "^2.4.1", | |||
"universal-analytics": "^0.4.23" | |||
@@ -1,14 +1,95 @@ | |||
let compression = require('compression'); | |||
let minify = require('express-minify'); | |||
let config = require('./config/serverConfig'); | |||
let router = require('./security/router'); | |||
let rest = require('./security/rest'); | |||
//Imports | |||
const http = require('http'); | |||
module.exports = { | |||
init: function (callback) { | |||
let app = require('express')(); | |||
let server = require('http').createServer(app); | |||
let socketServer = require('socket.io')(server, { | |||
const socketIo = require('socket.io'); | |||
const express = require('express'); | |||
const compression = require('compression'); | |||
const minify = require('express-minify'); | |||
const router = require('./security/router'); | |||
const rest = require('./security/rest'); | |||
const { | |||
port = 4000, | |||
startupMessage = 'Server: Ready' | |||
} = require('./config/serverConfig'); | |||
//Methods | |||
const listeners = { | |||
onConnection: function (socket) { | |||
socket.on('handshake', listeners.onHandshake.bind(null, socket)); | |||
socket.on('disconnect', listeners.onDisconnect.bind(null, socket)); | |||
socket.on('request', listeners.onRequest.bind(null, socket)); | |||
socket.emit('handshake'); | |||
}, | |||
onHandshake: function (socket) { | |||
cons.onHandshake(socket); | |||
}, | |||
onDisconnect: function (socket) { | |||
cons.onDisconnect(socket); | |||
}, | |||
onRequest: function (socket, msg, callback) { | |||
msg.callback = callback; | |||
if (!msg.data) | |||
msg.data = {}; | |||
if (msg.cpn) { | |||
if (!router.allowedCpn(msg)) | |||
return; | |||
cons.route(socket, msg); | |||
} else if (msg.threadModule) { | |||
if (!router.allowedGlobalCall(msg.threadModule, msg.method)) | |||
return; | |||
cons.route(socket, msg); | |||
} else { | |||
if (!router.allowedGlobal(msg)) | |||
return; | |||
msg.socket = socket; | |||
global[msg.module][msg.method](msg); | |||
} | |||
} | |||
}; | |||
const requests = { | |||
root: function (req, res) { | |||
res.sendFile('index.html'); | |||
}, | |||
default: function (req, res) { | |||
let root = req.url.split('/')[1]; | |||
let file = req.params[0]; | |||
file = file.replace('/' + root + '/', ''); | |||
const validModPatterns = ['.png', '/ui/', '/clientComponents/', '/audio/']; | |||
const validRequest = ( | |||
root !== 'server' || | |||
( | |||
file.includes('mods/') && | |||
validModPatterns.some(v => file.includes(v)) | |||
) | |||
); | |||
if (!validRequest) | |||
return null; | |||
res.sendFile(file, { | |||
root: '../' + root | |||
}); | |||
} | |||
}; | |||
const init = async () => { | |||
return new Promise(resolve => { | |||
const app = express(); | |||
const server = http.createServer(app); | |||
const socketServer = socketIo(server, { | |||
transports: ['websocket'] | |||
}); | |||
@@ -28,93 +109,22 @@ module.exports = { | |||
next(); | |||
}); | |||
let lessMiddleware = require('less-middleware'); | |||
app.use(lessMiddleware('../', { | |||
render: { | |||
strictMath: true | |||
} | |||
})); | |||
rest.init(app); | |||
app.get('/', this.requests.root.bind(this)); | |||
app.get(/^(.*)$/, this.requests.default.bind(this)); | |||
app.get('/', requests.root); | |||
app.get(/^(.*)$/, requests.default); | |||
socketServer.on('connection', this.listeners.onConnection.bind(this)); | |||
socketServer.on('connection', listeners.onConnection); | |||
let port = config.port || 4000; | |||
server.listen(port, function () { | |||
let message = config.startupMessage || 'Server: Ready'; | |||
_.log(message); | |||
_.log(startupMessage); | |||
callback(); | |||
resolve(); | |||
}); | |||
}, | |||
listeners: { | |||
onConnection: function (socket) { | |||
socket.on('handshake', this.listeners.onHandshake.bind(this, socket)); | |||
socket.on('disconnect', this.listeners.onDisconnect.bind(this, socket)); | |||
socket.on('request', this.listeners.onRequest.bind(this, socket)); | |||
socket.emit('handshake'); | |||
}, | |||
onHandshake: function (socket) { | |||
cons.onHandshake(socket); | |||
}, | |||
onDisconnect: function (socket) { | |||
cons.onDisconnect(socket); | |||
}, | |||
onRequest: function (socket, msg, callback) { | |||
msg.callback = callback; | |||
if (!msg.data) | |||
msg.data = {}; | |||
if (msg.cpn) { | |||
if (!router.allowedCpn(msg)) | |||
return; | |||
cons.route(socket, msg); | |||
} else if (msg.threadModule) { | |||
if (!router.allowedGlobalCall(msg.threadModule, msg.method)) | |||
return; | |||
cons.route(socket, msg); | |||
} else { | |||
if (!router.allowedGlobal(msg)) | |||
return; | |||
msg.socket = socket; | |||
global[msg.module][msg.method](msg); | |||
} | |||
} | |||
}, | |||
requests: { | |||
root: function (req, res) { | |||
res.sendFile('index.html'); | |||
}, | |||
default: function (req, res) { | |||
let root = req.url.split('/')[1]; | |||
let file = req.params[0]; | |||
file = file.replace('/' + root + '/', ''); | |||
const validModPatterns = ['.png', '/ui/', '/clientComponents/', '/audio/']; | |||
const validRequest = ( | |||
root !== 'server' || | |||
( | |||
file.includes('mods/') && | |||
validModPatterns.some(v => file.includes(v)) | |||
) | |||
); | |||
if (!validRequest) | |||
return null; | |||
res.sendFile(file, { | |||
root: '../' + root | |||
}); | |||
} | |||
} | |||
}); | |||
}; | |||
//Exports | |||
module.exports = { | |||
init | |||
}; |
@@ -0,0 +1,9 @@ | |||
//Events | |||
const onGetConnection = () => { | |||
}; | |||
//Exports | |||
module.exports = { | |||
onGetConnection | |||
}; |