|
@@ -1,94 +1,128 @@
|
|
|
const express = require('express');
|
|
|
const http = require('http');
|
|
|
const https = require('https');
|
|
|
-const fs = require('fs');
|
|
|
|
|
|
const config = require('../config');
|
|
|
const WebSocketServer = require('./services/webSocketServer');
|
|
|
-const logger = require('./services/logger');
|
|
|
-const realm = require('./services/realm');
|
|
|
-const { startMessagesExpiration } = require('./services/messagesExpire');
|
|
|
-const api = require('./api');
|
|
|
-const messageHandler = require('./messageHandler');
|
|
|
+const Realm = require('./models/realm');
|
|
|
+
|
|
|
+const init = ({ app, server, options }) => {
|
|
|
+ const config = options;
|
|
|
+ const realm = new Realm();
|
|
|
+ const messageHandler = require('./messageHandler')({ realm });
|
|
|
+ const api = require('./api')({ config, realm, messageHandler });
|
|
|
+ const { startMessagesExpiration } = require('./services/messagesExpire')({ realm, config });
|
|
|
+
|
|
|
+ app.use(options.path, api);
|
|
|
+
|
|
|
+ const wss = new WebSocketServer({
|
|
|
+ server,
|
|
|
+ realm,
|
|
|
+ config: {
|
|
|
+ ...config,
|
|
|
+ path: app.mountpath
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
-process.on('uncaughtException', (e) => {
|
|
|
- logger.error('Error: ' + e);
|
|
|
-});
|
|
|
+ wss.on('connection', client => {
|
|
|
+ const messageQueue = realm.getMessageQueueById(client.getId());
|
|
|
|
|
|
-// parse config
|
|
|
-let path = config.get('path');
|
|
|
+ if (messageQueue) {
|
|
|
+ let message;
|
|
|
+ while (message = messageQueue.readMessage()) {
|
|
|
+ messageHandler(client, message);
|
|
|
+ }
|
|
|
+ realm.clearMessageQueue(client.getId());
|
|
|
+ }
|
|
|
|
|
|
-if (path[0] !== '/') {
|
|
|
- path = '/' + path;
|
|
|
-}
|
|
|
+ app.emit('connection', client);
|
|
|
+ });
|
|
|
|
|
|
-if (path[path.length - 1] !== '/') {
|
|
|
- path += '/';
|
|
|
-}
|
|
|
+ wss.on('message', (client, message) => {
|
|
|
+ app.emit('message', client, message);
|
|
|
+ messageHandler(client, message);
|
|
|
+ });
|
|
|
|
|
|
-const app = express();
|
|
|
+ wss.on('close', client => {
|
|
|
+ app.emit('disconnect', client);
|
|
|
+ });
|
|
|
|
|
|
-if (config.get('proxied')) {
|
|
|
- app.set('trust proxy', config.get('proxied'));
|
|
|
-}
|
|
|
+ wss.on('error', error => {
|
|
|
+ app.emit('error', error);
|
|
|
+ });
|
|
|
|
|
|
-let server;
|
|
|
+ startMessagesExpiration();
|
|
|
+};
|
|
|
|
|
|
-if (config.get('ssl.key_path') && config.get('ssl.cert_path')) {
|
|
|
- const keyPath = config.get('ssl.key_path');
|
|
|
- const certPath = config.get('ssl.cert_path');
|
|
|
+function ExpressPeerServer (server, options) {
|
|
|
+ const app = express();
|
|
|
|
|
|
- const opts = {
|
|
|
- key: fs.readFileSync(path.resolve(keyPath)),
|
|
|
- cert: fs.readFileSync(path.resolve(certPath))
|
|
|
+ options = {
|
|
|
+ ...config,
|
|
|
+ ...options
|
|
|
};
|
|
|
|
|
|
- server = https.createServer(opts, app);
|
|
|
-} else {
|
|
|
- server = http.createServer(app);
|
|
|
+ if (options.proxied) {
|
|
|
+ app.set('trust proxy', options.proxied);
|
|
|
+ }
|
|
|
+
|
|
|
+ app.on('mount', () => {
|
|
|
+ if (!server) {
|
|
|
+ throw new Error('Server is not passed to constructor - ' +
|
|
|
+ 'can\'t start PeerServer');
|
|
|
+ }
|
|
|
+
|
|
|
+ init({ app, server, options });
|
|
|
+ });
|
|
|
+
|
|
|
+ return app;
|
|
|
}
|
|
|
|
|
|
-app.use(path, api);
|
|
|
+function PeerServer (options = {}, callback) {
|
|
|
+ const app = express();
|
|
|
|
|
|
-const wss = new WebSocketServer(server, app.mountpath);
|
|
|
+ options = {
|
|
|
+ ...config,
|
|
|
+ ...options
|
|
|
+ };
|
|
|
|
|
|
-wss.on('connection', client => {
|
|
|
- const messageQueue = realm.getMessageQueueById(client.getId());
|
|
|
+ let path = options.path;
|
|
|
+ const port = options.port;
|
|
|
|
|
|
- if (messageQueue) {
|
|
|
- let message;
|
|
|
- while (message = messageQueue.readMessage()) {
|
|
|
- messageHandler(client, message);
|
|
|
- }
|
|
|
- realm.clearMessageQueue(client.getId());
|
|
|
- }
|
|
|
+ delete options.path;
|
|
|
|
|
|
- logger.info(`client ${client.getId()} was connected`);
|
|
|
-});
|
|
|
+ if (path[0] !== '/') {
|
|
|
+ path = '/' + path;
|
|
|
+ }
|
|
|
|
|
|
-wss.on('message', (client, message) => {
|
|
|
- messageHandler(client, message);
|
|
|
-});
|
|
|
+ if (path[path.length - 1] !== '/') {
|
|
|
+ path += '/';
|
|
|
+ }
|
|
|
|
|
|
-wss.on('close', client => {
|
|
|
- logger.info(`client ${client.getId()} was disconnected`);
|
|
|
-});
|
|
|
+ let server;
|
|
|
|
|
|
-wss.on('error', error => {
|
|
|
- logger.error(error);
|
|
|
-});
|
|
|
+ if (options.ssl && options.ssl.key && options.ssl.cert) {
|
|
|
+ server = https.createServer(options.ssl, app);
|
|
|
+ delete options.ssl;
|
|
|
+ } else {
|
|
|
+ server = http.createServer(app);
|
|
|
+ }
|
|
|
|
|
|
-const port = config.get('port');
|
|
|
-const host = config.get('host');
|
|
|
+ const peerjs = ExpressPeerServer(server, options);
|
|
|
+ app.use(path, peerjs);
|
|
|
|
|
|
-server.listen(port, host, () => {
|
|
|
- const host = server.address().address;
|
|
|
- const port = server.address().port;
|
|
|
+ if (callback) {
|
|
|
+ server.listen(port, () => {
|
|
|
+ callback(server);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ server.listen(port);
|
|
|
+ }
|
|
|
|
|
|
- logger.info(
|
|
|
- 'Started PeerServer on %s, port: %s',
|
|
|
- host, port
|
|
|
- );
|
|
|
+ return peerjs;
|
|
|
+}
|
|
|
|
|
|
- startMessagesExpiration();
|
|
|
-});
|
|
|
+exports = module.exports = {
|
|
|
+ ExpressPeerServer: ExpressPeerServer,
|
|
|
+ PeerServer: PeerServer
|
|
|
+};
|