overleaf/services/real-time/app/js/SessionSockets.js
Jakob Ackermann 537e97be73 [misc] OError.tag all the errors in async contexts
See the docs of OError.tag:
https://github.com/overleaf/o-error#long-stack-traces-with-oerrortag
(currently at 221dd902e7bfa0ee92de1ea5a3cbf3152c3ceeb4)

I am tagging all errors at each async hop. Most of the controller code
 will only ever see already tagged errors -- or new errors created in
 our app code. They should have enough info that we do not need to tag
 them again.
2020-08-24 10:12:06 +01:00

35 lines
1 KiB
JavaScript

const OError = require('@overleaf/o-error')
const { EventEmitter } = require('events')
module.exports = function (io, sessionStore, cookieParser, cookieName) {
const missingSessionError = new Error('could not look up session by key')
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
}