Skip to content

Instantly share code, notes, and snippets.

@donpark
Created May 17, 2011 21:34
Show Gist options
  • Save donpark/977453 to your computer and use it in GitHub Desktop.
Save donpark/977453 to your computer and use it in GitHub Desktop.
Mongoose-based node.js connect session store implementation in CoffeeScript
mongoose = require('mongoose')
mongeese = new mongoose.Mongoose()
mongeese[key] = value for key, value of mongoose when not mongeese[key]? and mongoose.hasOwnProperty(key)
Schema = mongeese.Schema
SessionSchema = new Schema({
sid: { type: String, required: true, unique: true }
data: { type: String, default: '{}' }
expires: { type: Date, index: true }
})
Session = mongoose.model('Session', SessionSchema)
defaultCallback = (err) ->
class SessionStore extends require('connect').session.Store
constructor: (options) ->
mongoose.connect options.url
setInterval (-> Session.remove { expires: { '$lte': new Date() }}, defaultCallback), 60000
get: (sid, cb = defaultCallback) ->
Session.findOne { sid: sid }, (err, session) ->
if session?
try
cb null, JSON.parse session.data
catch err
cb err
else
cb err, session
set: (sid, data, cb = defaultCallback) ->
try
Session.update { sid: sid }, {
sid: sid
data: JSON.stringify data
expires: if data?.cookie?.expires? then data.cookie.expires else null
}, { upsert: true }, cb
catch err
cb err
destroy: (sid, cb = defaultCallback) ->
Session.remove { sid: sid }, cb
all: (cb = defaultCallback) ->
Session.find { expires: { '$gte': new Date() } }, [ 'sid' ], (err, sessions) ->
if sessions?
cb null, (session.sid for session in sessions)
else
cb err
clear: (cb = defaultCallback) ->
Session.drop cb
length: (cb = defaultCallback) ->
Session.count {}, cb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment