|
|
// ===========================================
// REQUARKS WIKI - WebSocket Server
// 1.0.0
// Licensed under AGPLv3
// ===========================================
global.ROOTPATH = __dirname;
// ----------------------------------------
// Load Winston
// ----------------------------------------
var _isDebug = process.env.NODE_ENV === 'development';
global.winston = require('winston'); winston.remove(winston.transports.Console) winston.add(winston.transports.Console, { level: (_isDebug) ? 'info' : 'warn', prettyPrint: true, colorize: true, silent: false, timestamp: true });
// ----------------------------------------
// Fetch internal handshake key
// ----------------------------------------
if(!process.argv[2] || process.argv[2].length !== 40) { winston.error('[WS] Illegal process start. Missing handshake key.'); process.exit(1); } global.internalAuth = require('./lib/internalAuth').init(process.argv[2]);;
// ----------------------------------------
// Load global modules
// ----------------------------------------
winston.info('[WS] WS Server is initializing...');
var appconfig = require('./models/config')('./config.yml'); let lcdata = require('./models/localdata').init(appconfig, 'ws');
global.entries = require('./models/entries').init(appconfig); global.mark = require('./models/markdown'); global.search = require('./models/search').init(appconfig);
// ----------------------------------------
// Load local modules
// ----------------------------------------
var _ = require('lodash'); var express = require('express'); var path = require('path'); var http = require('http'); var socketio = require('socket.io'); var moment = require('moment');
// ----------------------------------------
// Define Express App
// ----------------------------------------
global.app = express();
// ----------------------------------------
// Controllers
// ----------------------------------------
app.get('/', function(req, res){ res.send('Requarks Wiki WebSocket server'); });
// ----------------------------------------
// Start WebSocket server
// ----------------------------------------
winston.info('[SERVER] Starting WebSocket server on port ' + appconfig.wsPort + '...');
app.set('port', appconfig.wsPort); var server = http.Server(app); var io = socketio(server);
server.on('error', (error) => { if (error.syscall !== 'listen') { throw error; }
switch (error.code) { case 'EACCES': console.error('Listening on port ' + appconfig.port + ' requires elevated privileges!'); process.exit(1); break; case 'EADDRINUSE': console.error('Port ' + appconfig.port + ' is already in use!'); process.exit(1); break; default: throw error; } });
server.listen(appconfig.wsPort, () => { winston.info('[WS] WebSocket server started successfully! [RUNNING]'); });
io.on('connection', (socket) => {
//-----------------------------------------
// SEARCH
//-----------------------------------------
socket.on('searchAdd', (data) => { if(internalAuth.validateKey(data.auth)) { search.add(data.content); } });
socket.on('searchDel', (data, cb) => { if(internalAuth.validateKey(data.auth)) { search.delete(data.entryPath); } });
socket.on('search', (data, cb) => { search.find(data.terms).then((results) => { cb(results); }); });
//-----------------------------------------
// UPLOADS
//-----------------------------------------
socket.on('uploadsSetFolders', (data, cb) => { if(internalAuth.validateKey(data.auth)) { lcdata.setUploadsFolders(data.content); } });
socket.on('uploadsGetFolders', (data, cb) => { cb(lcdata.getUploadsFolders()); });
socket.on('uploadsSetFiles', (data, cb) => { if(internalAuth.validateKey(data.auth)) { lcdata.setUploadsFiles(data.content); } });
socket.on('uploadsGetImages', (data, cb) => { cb(lcdata.getUploadsFiles('image', data.folder)); });
});
// ----------------------------------------
// Shutdown gracefully
// ----------------------------------------
process.on('disconnect', () => { winston.warn('[WS] Lost connection to main server. Exiting... [' + moment().toISOString() + ']'); server.close(); process.exit(); });
process.on('exit', () => { server.stop(); });
|