UNPKG

citizen

Version:

Node.js MVC web application framework. Includes routing, serving, caching, session management, and other helpful tools.

108 lines (87 loc) 2.65 kB
// session management // citizen import helpers from './helpers.js' // event hooks import sessionHooks from './hooks/session.js' const create = (request) => { let sessionID = '', started = Date.now(), expires = started + ( CTZN.config.citizen.sessions.lifespan * 60000 ) while ( !CTZN.sessions[sessionID] ) { sessionID = generateSessionID() if ( !CTZN.sessions[sessionID] ) { CTZN.sessions[sessionID] = { properties: { id: sessionID, started: started, expires: expires, cors: request.cors || false, timer: setTimeout( function () { checkExpiration(sessionID) }, CTZN.config.citizen.sessions.lifespan * 60000) }, app: { ctzn_session_id: sessionID } } helpers.log({ label: 'Session started', content: CTZN.sessions[sessionID].properties }) } } return sessionID } const checkExpiration = (sessionID) => { let now = Date.now() if ( CTZN.sessions[sessionID] ) { if ( CTZN.sessions[sessionID].properties.expires < now ) { onEnd(sessionID) } else { CTZN.sessions[sessionID].properties.timer = setTimeout( function () { checkExpiration(sessionID) }, CTZN.sessions[sessionID].properties.expires - now) } } } const end = (session) => { if ( typeof session === 'string' ) { if ( CTZN.sessions[session] ) { clearTimeout(CTZN.sessions[session].properties.timer) onEnd(session) } } else { Object.keys(CTZN.sessions).forEach( item => { if ( CTZN.sessions[item].app[session.key] && CTZN.sessions[item].app[session.key] === session.value ) { clearTimeout(CTZN.sessions[item].properties.timer) onEnd(item) return false } }) } } const onEnd = async (sessionID) => { delete CTZN.sessions[sessionID].properties.timer let expiredSession = helpers.copy(CTZN.sessions[sessionID].app) delete CTZN.sessions[sessionID] try { helpers.log({ label: 'Session ended', content: await sessionHooks.end(expiredSession) }) } catch ( err ) { err.message = 'An error occurred during a session end event' err.session = expiredSession throw err } } const extend = (sessionID) => { if ( CTZN.sessions[sessionID] ) { CTZN.sessions[sessionID].properties.expires = Date.now() + ( CTZN.config.citizen.sessions.lifespan * 60000 ) } } const generateSessionID = () => { return Math.random().toString().replace('0.', '') + Math.random().toString().replace('0.', '') } export default { create, end, extend } export { end }