@dreesq/serpent
Version:
An express wrapper for developing fast web applications
95 lines (76 loc) • 2.47 kB
JavaScript
const io = require('socket.io');
const {SERVER_LISTENING} = require('../constants');
const fs = require('fs');
const util = require('util');
const path = require('path');
const {d} = require('../utils');
/**
* Promisify functions
*/
const readFile = util.promisify(fs.readFile);
/**
* Socket server instance
* @type {boolean}
*/
let sio = false;
/**
* Socket server plugin
* @param context
*/
exports.init = context => {
const {events, config, auth} = context.plugins;
/**
* After http server started listening
*/
events.on(SERVER_LISTENING, async () => {
const {server} = context;
const ssl = config.get('server.ssl');
if (ssl) {
const appPath = path.dirname(require.main.filename);
const key = await readFile(path.join(appPath, ssl.key));
const cert = await readFile(path.join(appPath, ssl.cert));
sio = io(server, {cert, key});
} else {
sio = io(server);
}
const {i18n} = context.plugins;
const locale = config.get('plugins.i18n.defaultLocale', 'en');
const translator = i18n.translator(locale);
/**
* On new socket connection
*/
sio.on('connection', socket => {
socket.user = false;
socket.on('login', async token => {
try {
d(`(ws:${socket.id}) Trying to authenticate.`);
socket.user = await auth.getUser(token, translator.translate);
d(`(ws:${socket.id}) Authenticated user:`, socket.user);
socket.join(`user-${socket.user._id}`);
socket.emit('login', 1);
} catch(e) {
d(`(ws:${socket.id}) login error`, e.stack);
socket.emit('login', 0);
}
});
socket.on('logout', () => {
if (!socket.user) {
return;
}
d(`(ws:${socket.id}) Logging out.`);
socket.leave(`user-${socket.user._id}`);
socket.emit('logout', 1);
delete socket.user;
d(`(ws:${socket.id}) Logged out.`);
});
});
});
};
exports.build = req => {
if (req.user) {
req.user.emit = (event, data) => {
sio.in(`user-${req.user._id}`).emit(event, data);
};
}
return sio;
};