135 lines
2.8 KiB
JavaScript
135 lines
2.8 KiB
JavaScript
const express = require('express');
|
|
const http = require('http');
|
|
const https = require('https');
|
|
|
|
const defaultConfig = require('../config');
|
|
const WebSocketServer = require('./services/webSocketServer');
|
|
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, messageHandler });
|
|
const checkBrokenConnections = require('./services/checkBrokenConnections')({
|
|
realm, config, onClose: (client) => {
|
|
app.emit('disconnect', client);
|
|
}
|
|
});
|
|
|
|
app.use(options.path, api);
|
|
|
|
const wss = new WebSocketServer({
|
|
server,
|
|
realm,
|
|
config: {
|
|
...config,
|
|
}
|
|
});
|
|
|
|
wss.on('connection', client => {
|
|
const messageQueue = realm.getMessageQueueById(client.getId());
|
|
|
|
if (messageQueue) {
|
|
let message;
|
|
// eslint-disable-next-line no-cond-assign
|
|
while (message = messageQueue.readMessage()) {
|
|
messageHandler(client, message);
|
|
}
|
|
realm.clearMessageQueue(client.getId());
|
|
}
|
|
|
|
app.emit('connection', client);
|
|
});
|
|
|
|
wss.on('message', (client, message) => {
|
|
app.emit('message', client, message);
|
|
messageHandler(client, message);
|
|
});
|
|
|
|
wss.on('close', client => {
|
|
app.emit('disconnect', client);
|
|
});
|
|
|
|
wss.on('error', error => {
|
|
app.emit('error', error);
|
|
});
|
|
|
|
startMessagesExpiration();
|
|
|
|
checkBrokenConnections.start();
|
|
};
|
|
|
|
function ExpressPeerServer(server, options) {
|
|
const app = express();
|
|
|
|
options = {
|
|
...defaultConfig,
|
|
...options
|
|
};
|
|
|
|
if (options.proxied) {
|
|
app.set('trust proxy', options.proxied === 'false' ? false : 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;
|
|
}
|
|
|
|
function PeerServer(options = {}, callback) {
|
|
const app = express();
|
|
|
|
options = {
|
|
...defaultConfig,
|
|
...options
|
|
};
|
|
|
|
let path = options.path;
|
|
const port = options.port;
|
|
|
|
if (path[0] !== '/') {
|
|
path = '/' + path;
|
|
}
|
|
|
|
if (path[path.length - 1] !== '/') {
|
|
path += '/';
|
|
}
|
|
|
|
let server;
|
|
|
|
if (options.ssl && options.ssl.key && options.ssl.cert) {
|
|
server = https.createServer(options.ssl, app);
|
|
delete options.ssl;
|
|
} else {
|
|
server = http.createServer(app);
|
|
}
|
|
|
|
const peerjs = ExpressPeerServer(server, options);
|
|
app.use(peerjs);
|
|
|
|
if (callback) {
|
|
server.listen(port, () => {
|
|
callback(server);
|
|
});
|
|
} else {
|
|
server.listen(port);
|
|
}
|
|
|
|
return peerjs;
|
|
}
|
|
|
|
exports = module.exports = {
|
|
ExpressPeerServer: ExpressPeerServer,
|
|
PeerServer: PeerServer
|
|
};
|