connect-orientdb
Version:
OrientDB session store for Connect
128 lines (96 loc) • 4.38 kB
text/coffeescript
# connect-orientdb
# Copyright(c) 2012 Federico Fissore <federico@fissore.org>
# MIT Licensed
orient = require "orientdb"
TEN_MINUTES = 10 * 60 * 1000
TWO_HOURS = 2 * 60 * 60 * 1000
default_options =
server:
host: "localhost"
port: 2424
db:
user_name: "admin"
user_password: "admin"
database: "sessions"
class_name: "Session"
reap_interval: TEN_MINUTES
module.exports = (connect) ->
class OrientDBStore extends connect.session.Store
constructor: (options, callback) ->
callback = callback or ->
options = options or {}
options.server = options.server or {}
options.db = options.db or {}
options.server.host = options.server.host or default_options.server.host
options.server.port = options.server.port or default_options.server.port
options.db.user_name = options.db.user_name or default_options.db.user_name
options.db.user_password = options.db.user_password or default_options.db.user_password
options.reap_interval = options.reap_interval or default_options.reap_interval
server = new orient.Server options.server
= new orient.Db (options.database || default_options.database), server, options.db
= options.class_name or default_options.class_name
setup_schema @, (err) =>
return callback(err) if err?
if options.reap_interval > 0
setInterval(, options.reap_interval)
callback(null, @)
setup_schema = (self, callback) ->
self.db.open (err) =>
return callback(err) if err?
cluster = self.db.getClusterByClass self.class_name
return callback() if cluster?
self.db.createClass self.class_name, (err) =>
return callback(err) if err?
self.db.command "CREATE PROPERTY #{self.class_name}.sid STRING", (err) =>
return callback(err) if err?
self.db.command "ALTER PROPERTY #{self.class_name}.sid MANDATORY true", (err) =>
return callback(err) if err?
self.db.command "ALTER PROPERTY #{self.class_name}.sid NOTNULL true", (err) =>
return callback(err) if err?
self.db.command "CREATE INDEX #{self.class_name}.sid UNIQUE", (err) =>
return callback(err) if err?
self.db.reload(callback)
load_session_doc = (self, sid, callback) ->
self.db.command "SELECT FROM index:#{self.class_name}.sid WHERE key = '#{sid}'", { fetchPlan: "*:-1" }, (err, results) =>
return callback(err) if err?
if results.length > 0
callback(null, results[0].rid)
else
callback()
get: (sid, callback) ->
load_session_doc @, sid, (err, session_doc) =>
return callback(err) if err?
return callback() if !session_doc
if !session_doc.expires or new Date() < session_doc.expires
callback(null, session_doc.session)
else
set: (sid, session, callback) ->
load_session_doc @, sid, (err, session_doc) =>
session_doc = session_doc || {}
session_doc["@class"] = session_doc["@class"] or
session_doc.sid = sid
session_doc["@version"] = -1
if session.cookie && session.cookie._expires
session_doc.expires = new Date(session.cookie._expires)
else if session.cookie? and typeof session.cookie.maxAge is "number"
session_doc.expires = new Date(+new Date() + session.cookie.maxAge)
else
session_doc.expires = new Date(+new Date() + (TWO_HOURS))
session_doc.session = JSON.parse(JSON.stringify(session))
.save session_doc, (err, session_doc) ->
return callback(err) if err?
callback(null, session_doc.session)
destroy: (sid, callback) ->
load_session_doc @, sid, (err, session_doc) =>
.delete session_doc, callback
length: (callback) ->
clusterName = .getClusterByClass().name
.countRecordsInCluster clusterName, callback
clear: (callback) ->
.command "DELETE FROM #{@class_name}", callback
close: (callback) ->
.close callback
reap_expired: (callback) =>
.command "DELETE FROM #{@class_name} WHERE expires < #{new Date().getTime()}", callback
return OrientDBStore