const OError = require('@overleaf/o-error') const { EventEmitter } = require('events') const { MissingSessionError } = require('./Errors') module.exports = function (io, sessionStore, cookieParser, cookieName) { const missingSessionError = new MissingSessionError() const sessionSockets = new EventEmitter() function next(error, socket, session) { sessionSockets.emit('connection', error, socket, session) } io.on('connection', function (socket) { const req = socket.handshake cookieParser(req, {}, function () { const sessionId = req.signedCookies && req.signedCookies[cookieName] if (!sessionId) { return next(missingSessionError, socket) } sessionStore.get(sessionId, function (error, session) { if (error) { OError.tag(error, 'error getting session from sessionStore', { sessionId }) return next(error, socket) } if (!session) { return next(missingSessionError, socket) } next(null, socket, session) }) }) }) return sessionSockets }