92 lines
2.3 KiB
JavaScript
92 lines
2.3 KiB
JavaScript
module.exports = function(session) {
|
|
const Store = session.Store
|
|
|
|
const defer = (cb, ...args) => {
|
|
if (typeof cb != 'function') return
|
|
setImmediate(cb, ...args)
|
|
}
|
|
|
|
class ExtendedMap extends Map {
|
|
set(key, value, maxAge) {
|
|
const cached = super.get(key)
|
|
if (cached && cached.timer) clearTimeout(cached.timer)
|
|
const timer = maxAge ? setTimeout(super.delete.bind(this, key), maxAge) : null
|
|
return super.set(key, {timer, value})
|
|
}
|
|
|
|
get(key) {
|
|
const cached = super.get(key)
|
|
return cached && cached.value
|
|
}
|
|
|
|
delete(key) {
|
|
const cached = super.get(key)
|
|
if (cached && cached.timer) clearTimeout(cached.timer)
|
|
return super.delete(key)
|
|
}
|
|
}
|
|
|
|
class MemoryStore extends Store {
|
|
constructor(options = {}) {
|
|
super(options)
|
|
this.sessions = new ExtendedMap()
|
|
this.ttl = options.ttl
|
|
}
|
|
|
|
get(sid, callback) {
|
|
let session = this.sessions.get(sid)
|
|
defer(callback, null, session)
|
|
}
|
|
|
|
set(sid, session, callback) {
|
|
let ttl = this._getTTL(session)
|
|
if (ttl > 0) {
|
|
this.sessions.set(sid, session, ttl)
|
|
} else {
|
|
this.sessions.delete(sid)
|
|
}
|
|
defer(callback, null)
|
|
}
|
|
|
|
touch(sid, session, callback) {
|
|
let ttl = this._getTTL(session)
|
|
let stored = this.sessions.get(sid)
|
|
stored.cookie = session.cookie
|
|
this.sessions.set(sid, stored, ttl)
|
|
defer(callback, null)
|
|
}
|
|
|
|
destroy(sid, callback) {
|
|
this.sessions.delete(sid)
|
|
defer(callback, null)
|
|
}
|
|
|
|
clear(callback) {
|
|
this.sessions.clear()
|
|
defer(callback, null)
|
|
}
|
|
|
|
length(callback) {
|
|
let len = this.sessions.size
|
|
defer(callback, null, len)
|
|
}
|
|
|
|
ids(callback) {
|
|
let keys = Array.from(this.sessions.keys())
|
|
defer(callback, null, keys)
|
|
}
|
|
|
|
all(callback) {
|
|
let sessions = Array.from(this.sessions.values())
|
|
defer(callback, null, sessions)
|
|
}
|
|
|
|
_getTTL(session) {
|
|
if (typeof this.ttl == 'number') return this.ttl
|
|
let maxAge = (session && session.cookie) ? session.cookie.maxAge : null
|
|
return (typeof maxAge == 'number') ? maxAge : 86400000
|
|
}
|
|
}
|
|
|
|
return MemoryStore
|
|
} |