betajs/betajs-server

View on GitHub
src/sessions/persistent.js

Summary

Maintainability
A
1 hr
Test Coverage
Scoped.define("module:Sessions.PersistentSessionModel", [      
        "data:Modelling.Model"
    ], function (Model, scoped) {
    return Model.extend({scoped: scoped}, {}, function (inherited) {
        return {
                    
            _initializeScheme: function () {
                var scheme = inherited._initializeScheme.call(this);
                scheme.token = {
                    type: "string",
                    index: true
                };
                scheme.created = {
                    type: "date",
                    index: true
                };
                return scheme;
            }
    
        };
    });
});            


Scoped.define("module:Sessions.PersistentSessionManagerHelper", [      
         "base:Class",
         "module:Sessions.PersistentSessionModel",
         "base:Objs",
         "base:Types",
         "data:Stores.MemoryStore",
         "data:Modelling.Table",
         "base:Timers.Timer",
         "base:Time"
     ], function (Class, PersistentSessionModel, Objs, Types, MemoryStore, Table, Timer, Time, scoped) {
     return Class.extend({scoped: scoped}, function (inherited) {
         return {
    
            _persistent_session_model: PersistentSessionModel,
        
            constructor: function (manager, options) {
                inherited.constructor.call(this);
                this.__manager = manager;
                options = Objs.tree_extend({
                    invalidation: {
                        // All times are in milliseconds; null to disable
                        // hard timeout to remove sessions
                        session_timeout: 1000 * 60 * 60 * 24 * 365,
                        // invalidate; null to disable
                        timer: 1000 * 60 * 60 * 24
                    }
                }, options);
                this.__options = options;
                this.__store = options.store ? options.store : this._auto_destroy(new MemoryStore());
                this._persistent_session_model = options.persistent_session_model || this._persistent_session_model;
                if (Types.is_string(this._persistent_session_model))
                    this._persistent_session_model = Scoped.getGlobal(this._persistent_session_model);
                if (options.invalidation.timer) {
                    this.__timer = this._auto_destroy(new Timer({
                        fire : this.invalidate,
                        context : this,
                        delay : options.invalidation.timer
                    }));
                }
                if (!this._persistent_session_model.table)
                    this._persistent_session_model.table = this._auto_destroy(new Table(this.__store, this._persistent_session_model));
                this.__table = this._persistent_session_model.table;
                manager.table = this.__table;
                manager.store = this.__store;
            },
            
            __lookup_session: function (token) {
                return this.__table.findBy({token: token}).mapCallback(function (err, model) {
                    return model && !err ? this.__manager.new_session(token, { model: model }) : null;
                }, this);
            },
            
            __add_session: function (session) {
                var session_options = session.options();
                if (!session_options.model) {
                    session_options.model = this.__table.newModel({
                        token: session.cid(),
                        created: Time.now()
                    });
                    session_options.model.save();
                }
                session.model = session_options.model;
                session.model.session = session;
            },
            
            options: function () {
                return this.__options;
            },
            
            invalidate: function () {
                if (this.__options.invalidation.session_timeout) {
                    var time = Time.now() - this.__options.invalidation.session_timeout;
                    this.__table.allBy({"created" : {"$lt": time}}).success(function (iter) {
                        while (iter.hasNext()) {
                            var model = iter.next();
                            if (model.session)
                                this.__manager.delete_session(model.session);
                            model.remove();
                        }
                    }, this);
                }
            }
    
         };
     });
});