mongo_session_store 2.0.0 → 3.0.0.beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/.gitignore +8 -0
 - data/.rspec +1 -0
 - data/.rubocop.yml +43 -0
 - data/.travis.yml +37 -0
 - data/CHANGELOG.md +49 -0
 - data/Dangerfile +1 -0
 - data/Gemfile +3 -0
 - data/LICENSE +23 -0
 - data/README.md +106 -43
 - data/Rakefile +90 -0
 - data/gemfiles/rails-4.0-mongo.gemfile +9 -0
 - data/gemfiles/rails-4.0-mongoid.gemfile +9 -0
 - data/gemfiles/rails-4.1-mongo.gemfile +9 -0
 - data/gemfiles/rails-4.1-mongoid.gemfile +9 -0
 - data/gemfiles/rails-4.2-mongo.gemfile +9 -0
 - data/gemfiles/rails-4.2-mongoid.gemfile +9 -0
 - data/lib/mongo_session_store.rb +27 -1
 - data/lib/mongo_session_store/mongo_store.rb +102 -0
 - data/lib/mongo_session_store/mongo_store_base.rb +65 -0
 - data/lib/mongo_session_store/mongoid_store.rb +52 -0
 - data/lib/mongo_session_store/version.rb +3 -0
 - data/mongo_session_store.gemspec +25 -0
 - data/perf/benchmark.rb +101 -0
 - data/spec/.rubocop.yml +4 -0
 - data/spec/integrations/devise_spec.rb +109 -0
 - data/spec/lib/mongo_session_store/mongo_store/session_spec.rb +247 -0
 - data/spec/lib/mongo_session_store/mongo_store_base_spec.rb +269 -0
 - data/spec/lib/mongo_session_store/mongo_store_spec.rb +13 -0
 - data/spec/lib/mongo_session_store/mongoid_store/session_spec.rb +82 -0
 - data/spec/lib/mongo_session_store/mongoid_store_spec.rb +13 -0
 - data/spec/lib/mongo_session_store_spec.rb +64 -0
 - data/spec/rails_helper.rb +19 -0
 - data/spec/spec_helper.rb +53 -0
 - data/spec/support/apps/rails_4.0_app/Rakefile +6 -0
 - data/spec/support/apps/rails_4.0_app/app/controllers/application_controller.rb +5 -0
 - data/spec/support/apps/rails_4.0_app/app/controllers/home_controller.rb +4 -0
 - data/spec/support/apps/rails_4.0_app/app/models/user.rb +5 -0
 - data/spec/support/apps/rails_4.0_app/app/views/home/index.html.erb +10 -0
 - data/spec/support/apps/rails_4.0_app/app/views/layouts/application.html.erb +17 -0
 - data/spec/support/apps/rails_4.0_app/bin/bundle +3 -0
 - data/spec/support/apps/rails_4.0_app/bin/rails +4 -0
 - data/spec/support/apps/rails_4.0_app/bin/rake +4 -0
 - data/spec/support/apps/rails_4.0_app/config.ru +4 -0
 - data/spec/support/apps/rails_4.0_app/config/application.rb +11 -0
 - data/spec/support/apps/rails_4.0_app/config/boot.rb +4 -0
 - data/spec/support/apps/rails_4.0_app/config/database.yml +11 -0
 - data/spec/support/apps/rails_4.0_app/config/environment.rb +5 -0
 - data/spec/support/apps/rails_4.0_app/config/environments/development.rb +12 -0
 - data/spec/support/apps/rails_4.0_app/config/environments/test.rb +19 -0
 - data/spec/support/apps/rails_4.0_app/config/initializers/devise.rb +254 -0
 - data/spec/support/apps/rails_4.0_app/config/initializers/secret_token.rb +12 -0
 - data/spec/support/apps/rails_4.0_app/config/initializers/session_store.rb +1 -0
 - data/spec/support/apps/rails_4.0_app/config/locales/devise.en.yml +59 -0
 - data/spec/support/apps/rails_4.0_app/config/locales/en.yml +23 -0
 - data/spec/support/apps/rails_4.0_app/config/mongo.yml +11 -0
 - data/spec/support/apps/rails_4.0_app/config/mongoid.yml +13 -0
 - data/spec/support/apps/rails_4.0_app/config/routes.rb +4 -0
 - data/spec/support/apps/rails_4.0_app/db/migrate/20140301171212_add_devise_users.rb +11 -0
 - data/spec/support/apps/rails_4.0_app/db/schema.rb +25 -0
 - data/spec/support/apps/rails_4.0_app/db/seeds.rb +7 -0
 - data/spec/support/apps/rails_4.0_app/lib/assets/.keep +0 -0
 - data/spec/support/apps/rails_4.0_app/lib/tasks/.keep +0 -0
 - data/spec/support/apps/rails_4.0_app/log/.keep +0 -0
 - data/spec/support/apps/rails_4.0_app/public/404.html +58 -0
 - data/spec/support/apps/rails_4.0_app/public/422.html +58 -0
 - data/spec/support/apps/rails_4.0_app/public/500.html +57 -0
 - data/spec/support/apps/rails_4.0_app/public/favicon.ico +0 -0
 - data/spec/support/apps/rails_4.0_app/public/robots.txt +5 -0
 - data/spec/support/apps/rails_4.1_app/Rakefile +3 -0
 - data/spec/support/apps/rails_4.1_app/app/controllers/application_controller.rb +5 -0
 - data/spec/support/apps/rails_4.1_app/app/controllers/home_controller.rb +4 -0
 - data/spec/support/apps/rails_4.1_app/app/models/user.rb +5 -0
 - data/spec/support/apps/rails_4.1_app/app/views/home/index.html.erb +10 -0
 - data/spec/support/apps/rails_4.1_app/app/views/layouts/application.html.erb +17 -0
 - data/spec/support/apps/rails_4.1_app/bin/bundle +3 -0
 - data/spec/support/apps/rails_4.1_app/bin/rails +4 -0
 - data/spec/support/apps/rails_4.1_app/bin/rake +4 -0
 - data/spec/support/apps/rails_4.1_app/config.ru +2 -0
 - data/spec/support/apps/rails_4.1_app/config/application.rb +11 -0
 - data/spec/support/apps/rails_4.1_app/config/boot.rb +4 -0
 - data/spec/support/apps/rails_4.1_app/config/database.yml +11 -0
 - data/spec/support/apps/rails_4.1_app/config/environment.rb +5 -0
 - data/spec/support/apps/rails_4.1_app/config/environments/development.rb +12 -0
 - data/spec/support/apps/rails_4.1_app/config/environments/test.rb +19 -0
 - data/spec/support/apps/rails_4.1_app/config/initializers/devise.rb +254 -0
 - data/spec/support/apps/rails_4.1_app/config/initializers/session_store.rb +1 -0
 - data/spec/support/apps/rails_4.1_app/config/locales/devise.en.yml +59 -0
 - data/spec/support/apps/rails_4.1_app/config/locales/en.yml +23 -0
 - data/spec/support/apps/rails_4.1_app/config/mongo.yml +11 -0
 - data/spec/support/apps/rails_4.1_app/config/mongoid.yml +13 -0
 - data/spec/support/apps/rails_4.1_app/config/routes.rb +4 -0
 - data/spec/support/apps/rails_4.1_app/config/secrets.yml +22 -0
 - data/spec/support/apps/rails_4.1_app/db/migrate/20140301171212_add_devise_users.rb +11 -0
 - data/spec/support/apps/rails_4.1_app/db/schema.rb +25 -0
 - data/spec/support/apps/rails_4.1_app/db/seeds.rb +7 -0
 - data/spec/support/apps/rails_4.1_app/lib/assets/.keep +0 -0
 - data/spec/support/apps/rails_4.1_app/lib/tasks/.keep +0 -0
 - data/spec/support/apps/rails_4.1_app/log/.keep +0 -0
 - data/spec/support/apps/rails_4.1_app/public/404.html +67 -0
 - data/spec/support/apps/rails_4.1_app/public/422.html +67 -0
 - data/spec/support/apps/rails_4.1_app/public/500.html +66 -0
 - data/spec/support/apps/rails_4.1_app/public/favicon.ico +0 -0
 - data/spec/support/apps/rails_4.1_app/public/robots.txt +5 -0
 - data/spec/support/apps/rails_4.2_app/Rakefile +2 -0
 - data/spec/support/apps/rails_4.2_app/app/controllers/application_controller.rb +5 -0
 - data/spec/support/apps/rails_4.2_app/app/controllers/home_controller.rb +4 -0
 - data/spec/support/apps/rails_4.2_app/app/models/user.rb +5 -0
 - data/spec/support/apps/rails_4.2_app/app/views/home/index.html.erb +10 -0
 - data/spec/support/apps/rails_4.2_app/app/views/layouts/application.html.erb +15 -0
 - data/spec/support/apps/rails_4.2_app/bin/bundle +3 -0
 - data/spec/support/apps/rails_4.2_app/bin/rails +8 -0
 - data/spec/support/apps/rails_4.2_app/bin/rake +4 -0
 - data/spec/support/apps/rails_4.2_app/config.ru +4 -0
 - data/spec/support/apps/rails_4.2_app/config/application.rb +11 -0
 - data/spec/support/apps/rails_4.2_app/config/boot.rb +3 -0
 - data/spec/support/apps/rails_4.2_app/config/database.yml +11 -0
 - data/spec/support/apps/rails_4.2_app/config/environment.rb +5 -0
 - data/spec/support/apps/rails_4.2_app/config/environments/development.rb +12 -0
 - data/spec/support/apps/rails_4.2_app/config/environments/test.rb +19 -0
 - data/spec/support/apps/rails_4.2_app/config/initializers/devise.rb +254 -0
 - data/spec/support/apps/rails_4.2_app/config/initializers/session_store.rb +1 -0
 - data/spec/support/apps/rails_4.2_app/config/locales/en.yml +23 -0
 - data/spec/support/apps/rails_4.2_app/config/mongo.yml +11 -0
 - data/spec/support/apps/rails_4.2_app/config/mongoid.yml +13 -0
 - data/spec/support/apps/rails_4.2_app/config/routes.rb +4 -0
 - data/spec/support/apps/rails_4.2_app/config/secrets.yml +22 -0
 - data/spec/support/apps/rails_4.2_app/db/migrate/20140301171212_add_devise_users.rb +11 -0
 - data/spec/support/apps/rails_4.2_app/db/schema.rb +25 -0
 - data/spec/support/apps/rails_4.2_app/db/seeds.rb +7 -0
 - data/spec/support/helpers/session_id_helper.rb +5 -0
 - data/spec/support/helpers/test_database_helper.rb +22 -0
 - metadata +360 -92
 - data/lib/mongo_session_store/mongo_mapper.rb +0 -60
 - data/lib/mongo_session_store/mongoid.rb +0 -59
 
    
        data/lib/mongo_session_store.rb
    CHANGED
    
    | 
         @@ -1 +1,27 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            module MongoSessionStore
         
     | 
| 
      
 2 
     | 
    
         
            +
              def self.collection_name
         
     | 
| 
      
 3 
     | 
    
         
            +
                @collection_name
         
     | 
| 
      
 4 
     | 
    
         
            +
              end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              def self.collection_name=(name)
         
     | 
| 
      
 7 
     | 
    
         
            +
                @collection_name = name
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                if defined?(MongoidStore::Session)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  MongoidStore::Session.store_in \
         
     | 
| 
      
 11 
     | 
    
         
            +
                    :collection => MongoSessionStore.collection_name
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                MongoStore::Session.reset_collection if defined?(MongoStore::Session)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                @collection_name
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            if defined?(Mongoid)
         
     | 
| 
      
 21 
     | 
    
         
            +
              require "mongo_session_store/mongoid_store"
         
     | 
| 
      
 22 
     | 
    
         
            +
            elsif defined?(Mongo)
         
     | 
| 
      
 23 
     | 
    
         
            +
              require "mongo_session_store/mongo_store"
         
     | 
| 
      
 24 
     | 
    
         
            +
            end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            # Default collection name for all the stores.
         
     | 
| 
      
 27 
     | 
    
         
            +
            MongoSessionStore.collection_name = "sessions"
         
     | 
| 
         @@ -0,0 +1,102 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "mongo_session_store/mongo_store_base"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActionDispatch
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Session
         
     | 
| 
      
 5 
     | 
    
         
            +
                class MongoStore < MongoStoreBase
         
     | 
| 
      
 6 
     | 
    
         
            +
                  class Session
         
     | 
| 
      
 7 
     | 
    
         
            +
                    class << self
         
     | 
| 
      
 8 
     | 
    
         
            +
                      attr_writer :database
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                      def load(options = {})
         
     | 
| 
      
 11 
     | 
    
         
            +
                        options[:data] = options["data"] if options["data"]
         
     | 
| 
      
 12 
     | 
    
         
            +
                        options[:data] =
         
     | 
| 
      
 13 
     | 
    
         
            +
                          if options[:data]
         
     | 
| 
      
 14 
     | 
    
         
            +
                            unpack(options[:data])
         
     | 
| 
      
 15 
     | 
    
         
            +
                          else
         
     | 
| 
      
 16 
     | 
    
         
            +
                            {}
         
     | 
| 
      
 17 
     | 
    
         
            +
                          end
         
     | 
| 
      
 18 
     | 
    
         
            +
                        new(options)
         
     | 
| 
      
 19 
     | 
    
         
            +
                      end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                      def where(query = {})
         
     | 
| 
      
 22 
     | 
    
         
            +
                        collection.find(query).map { |doc| load(doc) }
         
     | 
| 
      
 23 
     | 
    
         
            +
                      end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                      def database
         
     | 
| 
      
 26 
     | 
    
         
            +
                        return @database if @database
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                        raise NoMongoClientError, "MongoStore needs a database, e.g. "\
         
     | 
| 
      
 29 
     | 
    
         
            +
                          "MongoStore::Session.database = Mongo::Client.new("\
         
     | 
| 
      
 30 
     | 
    
         
            +
                          "[\"127.0.0.1:27017\"], database: \"my_app_development\")"
         
     | 
| 
      
 31 
     | 
    
         
            +
                      end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                      def collection
         
     | 
| 
      
 34 
     | 
    
         
            +
                        @collection ||= database[MongoSessionStore.collection_name]
         
     | 
| 
      
 35 
     | 
    
         
            +
                      end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                      def reset_collection
         
     | 
| 
      
 38 
     | 
    
         
            +
                        @collection = nil
         
     | 
| 
      
 39 
     | 
    
         
            +
                      end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                      private
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                      def unpack(packed)
         
     | 
| 
      
 44 
     | 
    
         
            +
                        return unless packed
         
     | 
| 
      
 45 
     | 
    
         
            +
                        data = packed.respond_to?(:data) ? packed.data : packed.to_s
         
     | 
| 
      
 46 
     | 
    
         
            +
                        Marshal.load(StringIO.new(data))
         
     | 
| 
      
 47 
     | 
    
         
            +
                      end
         
     | 
| 
      
 48 
     | 
    
         
            +
                    end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                    class NoMongoClientError < StandardError; end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                    attr_accessor :_id, :data, :created_at, :updated_at
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                    def initialize(options = {})
         
     | 
| 
      
 55 
     | 
    
         
            +
                      @_id        = options[:_id]
         
     | 
| 
      
 56 
     | 
    
         
            +
                      @data       = options[:data]
         
     | 
| 
      
 57 
     | 
    
         
            +
                      @created_at = options[:created_at]
         
     | 
| 
      
 58 
     | 
    
         
            +
                      @updated_at = options[:updated_at]
         
     | 
| 
      
 59 
     | 
    
         
            +
                    end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                    def save
         
     | 
| 
      
 62 
     | 
    
         
            +
                      @created_at ||= Time.now.utc
         
     | 
| 
      
 63 
     | 
    
         
            +
                      @updated_at = Time.now.utc
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                      scope.replace_one(attributes_for_save, :upsert => true)
         
     | 
| 
      
 66 
     | 
    
         
            +
                    end
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                    def destroy
         
     | 
| 
      
 69 
     | 
    
         
            +
                      scope.delete_one
         
     | 
| 
      
 70 
     | 
    
         
            +
                    end
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                    private
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                    def collection
         
     | 
| 
      
 75 
     | 
    
         
            +
                      self.class.collection
         
     | 
| 
      
 76 
     | 
    
         
            +
                    end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                    def attributes_for_save
         
     | 
| 
      
 79 
     | 
    
         
            +
                      {
         
     | 
| 
      
 80 
     | 
    
         
            +
                        :data => pack(data),
         
     | 
| 
      
 81 
     | 
    
         
            +
                        :created_at => created_at,
         
     | 
| 
      
 82 
     | 
    
         
            +
                        :updated_at => updated_at
         
     | 
| 
      
 83 
     | 
    
         
            +
                      }
         
     | 
| 
      
 84 
     | 
    
         
            +
                    end
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                    def scope
         
     | 
| 
      
 87 
     | 
    
         
            +
                      collection.find(:_id => _id)
         
     | 
| 
      
 88 
     | 
    
         
            +
                    end
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                    def pack(data)
         
     | 
| 
      
 91 
     | 
    
         
            +
                      BSON::Binary.new(Marshal.dump(data || {}), :generic)
         
     | 
| 
      
 92 
     | 
    
         
            +
                    end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
                    def unpack(packed)
         
     | 
| 
      
 95 
     | 
    
         
            +
                      self.class.unpack(packed)
         
     | 
| 
      
 96 
     | 
    
         
            +
                    end
         
     | 
| 
      
 97 
     | 
    
         
            +
                  end
         
     | 
| 
      
 98 
     | 
    
         
            +
                end
         
     | 
| 
      
 99 
     | 
    
         
            +
              end
         
     | 
| 
      
 100 
     | 
    
         
            +
            end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
            MongoStore = ActionDispatch::Session::MongoStore
         
     | 
| 
         @@ -0,0 +1,65 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "action_dispatch/middleware/session/abstract_store"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActionDispatch
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Session
         
     | 
| 
      
 5 
     | 
    
         
            +
                class MongoStoreBase < AbstractStore
         
     | 
| 
      
 6 
     | 
    
         
            +
                  SESSION_RECORD_KEY = "rack.session.record".freeze
         
     | 
| 
      
 7 
     | 
    
         
            +
                  ENV_SESSION_OPTIONS_KEY = Rack::Session::Abstract::ENV_SESSION_OPTIONS_KEY
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  def self.session_class
         
     | 
| 
      
 10 
     | 
    
         
            +
                    self::Session
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  private
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  def session_class
         
     | 
| 
      
 16 
     | 
    
         
            +
                    self.class.session_class
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  def get_session(env, sid)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    id, record = find_or_initialize_session(sid)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    env[SESSION_RECORD_KEY] = record
         
     | 
| 
      
 22 
     | 
    
         
            +
                    [id, record.data]
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  def set_session(env, sid, session_data, _options = {})
         
     | 
| 
      
 26 
     | 
    
         
            +
                    id, record = get_session_record(env, sid)
         
     | 
| 
      
 27 
     | 
    
         
            +
                    record.data = session_data
         
     | 
| 
      
 28 
     | 
    
         
            +
                    yield if block_given?
         
     | 
| 
      
 29 
     | 
    
         
            +
                    # Rack spec dictates that set_session should return true or false
         
     | 
| 
      
 30 
     | 
    
         
            +
                    # depending on whether or not the session was saved or not.
         
     | 
| 
      
 31 
     | 
    
         
            +
                    # However, ActionPack seems to want a session id instead.
         
     | 
| 
      
 32 
     | 
    
         
            +
                    record.save ? id : false
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  def find_or_initialize_session(id)
         
     | 
| 
      
 36 
     | 
    
         
            +
                    existing_session = (id && session_class.where(:_id => id).first)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    session = existing_session if existing_session
         
     | 
| 
      
 38 
     | 
    
         
            +
                    session ||= session_class.new(:_id => generate_sid)
         
     | 
| 
      
 39 
     | 
    
         
            +
                    [session._id, session]
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  def get_session_record(env, sid)
         
     | 
| 
      
 43 
     | 
    
         
            +
                    if env[ENV_SESSION_OPTIONS_KEY][:id].nil? || !env[SESSION_RECORD_KEY]
         
     | 
| 
      
 44 
     | 
    
         
            +
                      sid, env[SESSION_RECORD_KEY] = find_or_initialize_session(sid)
         
     | 
| 
      
 45 
     | 
    
         
            +
                    end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                    [sid, env[SESSION_RECORD_KEY]]
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                  def destroy_session(env, _session_id, options)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    destroy(env)
         
     | 
| 
      
 52 
     | 
    
         
            +
                    generate_sid unless options[:drop]
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  def destroy(env)
         
     | 
| 
      
 56 
     | 
    
         
            +
                    sid = current_session_id(env)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    return unless sid
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                    _, record = get_session_record(env, sid)
         
     | 
| 
      
 60 
     | 
    
         
            +
                    record.destroy
         
     | 
| 
      
 61 
     | 
    
         
            +
                    env[SESSION_RECORD_KEY] = nil
         
     | 
| 
      
 62 
     | 
    
         
            +
                  end
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
      
 65 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,52 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "mongo_session_store/mongo_store_base"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActionDispatch
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Session
         
     | 
| 
      
 5 
     | 
    
         
            +
                class MongoidStore < MongoStoreBase
         
     | 
| 
      
 6 
     | 
    
         
            +
                  class Session
         
     | 
| 
      
 7 
     | 
    
         
            +
                    include Mongoid::Document
         
     | 
| 
      
 8 
     | 
    
         
            +
                    include Mongoid::Timestamps
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                    attr_writer :data
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                    store_in :collection => MongoSessionStore.collection_name
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                    field :_data, :type => BSON::Binary, :default => -> { pack({}) }
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                    def self.pack(data)
         
     | 
| 
      
 17 
     | 
    
         
            +
                      BSON::Binary.new(Marshal.dump(data), :generic)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                    def data
         
     | 
| 
      
 21 
     | 
    
         
            +
                      @data ||= unpack(_data)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                    def reload
         
     | 
| 
      
 25 
     | 
    
         
            +
                      @data = nil
         
     | 
| 
      
 26 
     | 
    
         
            +
                      super
         
     | 
| 
      
 27 
     | 
    
         
            +
                    end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                    private
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                    before_save do
         
     | 
| 
      
 32 
     | 
    
         
            +
                      self._data = pack(data)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                    def pack(data)
         
     | 
| 
      
 36 
     | 
    
         
            +
                      self.class.pack(data)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                    def unpack(packed)
         
     | 
| 
      
 40 
     | 
    
         
            +
                      return unless packed
         
     | 
| 
      
 41 
     | 
    
         
            +
                      if packed.respond_to? :data
         
     | 
| 
      
 42 
     | 
    
         
            +
                        Marshal.load(packed.data)
         
     | 
| 
      
 43 
     | 
    
         
            +
                      else
         
     | 
| 
      
 44 
     | 
    
         
            +
                        Marshal.load(packed.to_s)
         
     | 
| 
      
 45 
     | 
    
         
            +
                      end
         
     | 
| 
      
 46 
     | 
    
         
            +
                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
              end
         
     | 
| 
      
 50 
     | 
    
         
            +
            end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            MongoidStore = ActionDispatch::Session::MongoidStore
         
     | 
| 
         @@ -0,0 +1,25 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.expand_path("../lib/mongo_session_store/version", __FILE__)
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Gem::Specification.new do |s|
         
     | 
| 
      
 4 
     | 
    
         
            +
              s.name = "mongo_session_store"
         
     | 
| 
      
 5 
     | 
    
         
            +
              s.version = MongoSessionStore::VERSION
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              s.authors          = ["Tom de Bruijn", "Brian Hempel", "Nicolas M\303\251rouze", "Tony Pitale", "Chris Brickley"]
         
     | 
| 
      
 8 
     | 
    
         
            +
              s.email            = ["tom@tomdebruijn.com"]
         
     | 
| 
      
 9 
     | 
    
         
            +
              s.files            = `git ls-files`.split("\n")
         
     | 
| 
      
 10 
     | 
    
         
            +
              s.test_files       = `git ls-files -- {spec,perf}/*`.split("\n")
         
     | 
| 
      
 11 
     | 
    
         
            +
              s.homepage         = "http://github.com/mongoid/mongo_session_store"
         
     | 
| 
      
 12 
     | 
    
         
            +
              s.license          = "MIT"
         
     | 
| 
      
 13 
     | 
    
         
            +
              s.require_paths    = ["lib"]
         
     | 
| 
      
 14 
     | 
    
         
            +
              s.summary          = "Rails session stores for Mongoid, or any other ODM. Rails 4 compatible."
         
     | 
| 
      
 15 
     | 
    
         
            +
              s.required_ruby_version = ">= 1.9"
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              s.add_dependency "actionpack", "~> 4.0"
         
     | 
| 
      
 18 
     | 
    
         
            +
              s.add_dependency "mongo", "~> 2.0"
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              s.add_development_dependency "rspec-rails", "~> 3"
         
     | 
| 
      
 21 
     | 
    
         
            +
              s.add_development_dependency "pry", "~> 0.10"
         
     | 
| 
      
 22 
     | 
    
         
            +
              s.add_development_dependency "rake", "~> 11"
         
     | 
| 
      
 23 
     | 
    
         
            +
              s.add_development_dependency "rubocop", "0.45.0"
         
     | 
| 
      
 24 
     | 
    
         
            +
              s.add_development_dependency "mongoid-danger", "~> 0.1.0"
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
    
        data/perf/benchmark.rb
    ADDED
    
    | 
         @@ -0,0 +1,101 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "rubygems"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "bundler/setup"
         
     | 
| 
      
 3 
     | 
    
         
            +
            require "benchmark"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "action_dispatch"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require "mongoid"
         
     | 
| 
      
 6 
     | 
    
         
            +
            require "mongo_session_store"
         
     | 
| 
      
 7 
     | 
    
         
            +
            require "mongo_session_store/mongoid_store"
         
     | 
| 
      
 8 
     | 
    
         
            +
            require "mongo_session_store/mongo_store"
         
     | 
| 
      
 9 
     | 
    
         
            +
            require File.expand_path("../../lib/mongo_session_store", __FILE__)
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            Mongo::Logger.logger.level = Logger::FATAL
         
     | 
| 
      
 12 
     | 
    
         
            +
            Mongoid.logger.level = Logger::FATAL
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            RUNS = 2000
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            def benchmark(test_name)
         
     | 
| 
      
 17 
     | 
    
         
            +
              time = Benchmark.realtime do
         
     | 
| 
      
 18 
     | 
    
         
            +
                RUNS.times do
         
     | 
| 
      
 19 
     | 
    
         
            +
                  yield
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
              puts "#{(time / RUNS * 100_000).round / 100.0}ms per #{test_name}"
         
     | 
| 
      
 23 
     | 
    
         
            +
            end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            def benchmark_store(store)
         
     | 
| 
      
 26 
     | 
    
         
            +
              collection = store.class.session_class.collection
         
     | 
| 
      
 27 
     | 
    
         
            +
              collection.drop
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              large_session = {
         
     | 
| 
      
 30 
     | 
    
         
            +
                :something => "not nothing",
         
     | 
| 
      
 31 
     | 
    
         
            +
                :left => "not right",
         
     | 
| 
      
 32 
     | 
    
         
            +
                :welcome => "not despised",
         
     | 
| 
      
 33 
     | 
    
         
            +
                :visits => [
         
     | 
| 
      
 34 
     | 
    
         
            +
                  "http://www.google.com",
         
     | 
| 
      
 35 
     | 
    
         
            +
                  "localhost:3000",
         
     | 
| 
      
 36 
     | 
    
         
            +
                  "http://localhost:3000/increment_session",
         
     | 
| 
      
 37 
     | 
    
         
            +
                  "http://www.iso.org/iso/country_codes/iso_3166_code_lists/iso-3166-1_decoding_table.htm",
         
     | 
| 
      
 38 
     | 
    
         
            +
                  "http://www.geonames.org/search.html?q=2303+australia&country="
         
     | 
| 
      
 39 
     | 
    
         
            +
                ],
         
     | 
| 
      
 40 
     | 
    
         
            +
                :one_k_of_data => "a" * 1024,
         
     | 
| 
      
 41 
     | 
    
         
            +
                :another_k => "b" * 1024,
         
     | 
| 
      
 42 
     | 
    
         
            +
                :more_data => [5] * 500,
         
     | 
| 
      
 43 
     | 
    
         
            +
                :too_much_data_for_a_cookie => "c" * 8000,
         
     | 
| 
      
 44 
     | 
    
         
            +
                :a_bunch_of_floats_in_embedded_docs => [:float_a => 3.141, :float_b => -1.1] * 100
         
     | 
| 
      
 45 
     | 
    
         
            +
              }
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
              ids = []
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
              env = {
         
     | 
| 
      
 50 
     | 
    
         
            +
                "rack.session" => large_session,
         
     | 
| 
      
 51 
     | 
    
         
            +
                "rack.session.options" => { :id => store.send(:generate_sid) }
         
     | 
| 
      
 52 
     | 
    
         
            +
              }
         
     | 
| 
      
 53 
     | 
    
         
            +
              benchmark "session save" do
         
     | 
| 
      
 54 
     | 
    
         
            +
                ids << store.send(
         
     | 
| 
      
 55 
     | 
    
         
            +
                  :set_session,
         
     | 
| 
      
 56 
     | 
    
         
            +
                  env.merge("rack.session.options" => { :id => nil }), nil, env["rack.session"]
         
     | 
| 
      
 57 
     | 
    
         
            +
                )
         
     | 
| 
      
 58 
     | 
    
         
            +
              end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
              ids.shuffle!
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
              benchmark "session load" do
         
     | 
| 
      
 63 
     | 
    
         
            +
                id = ids.pop
         
     | 
| 
      
 64 
     | 
    
         
            +
                local_env = { "rack.request.cookie_hash" => { "_session_id" => id } }
         
     | 
| 
      
 65 
     | 
    
         
            +
                _, data = store.send(:get_session, local_env, id)
         
     | 
| 
      
 66 
     | 
    
         
            +
                if data[:something] != "not nothing" || data[:a_bunch_of_floats_in_embedded_docs][0][:float_a] != 3.141
         
     | 
| 
      
 67 
     | 
    
         
            +
                  puts data
         
     | 
| 
      
 68 
     | 
    
         
            +
                  raise "saved and fetched data do not match!"
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
              end
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
              database = collection.database
         
     | 
| 
      
 73 
     | 
    
         
            +
              stats = database.command(:collstats => collection.name).documents.first
         
     | 
| 
      
 74 
     | 
    
         
            +
              puts "Collection: #{collection.namespace}"
         
     | 
| 
      
 75 
     | 
    
         
            +
              puts "           Total Size: #{stats["size"]}"
         
     | 
| 
      
 76 
     | 
    
         
            +
              puts "         Object count: #{stats["count"]}"
         
     | 
| 
      
 77 
     | 
    
         
            +
              puts "  Average object size: #{stats["avgObjSize"]}"
         
     | 
| 
      
 78 
     | 
    
         
            +
              puts "          Index sizes: #{stats["indexSizes"].inspect}"
         
     | 
| 
      
 79 
     | 
    
         
            +
            end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            MongoSessionStore.collection_name = "session_collection"
         
     | 
| 
      
 82 
     | 
    
         
            +
            MongoStore::Session.database =
         
     | 
| 
      
 83 
     | 
    
         
            +
              Mongo::Client.new(["127.0.0.1:27017"], :database => "mongo_test_database")
         
     | 
| 
      
 84 
     | 
    
         
            +
            Mongoid.configure do |c|
         
     | 
| 
      
 85 
     | 
    
         
            +
              c.load_configuration(
         
     | 
| 
      
 86 
     | 
    
         
            +
                "clients" => {
         
     | 
| 
      
 87 
     | 
    
         
            +
                  "default" => {
         
     | 
| 
      
 88 
     | 
    
         
            +
                    "database" => "mongoid_test_database",
         
     | 
| 
      
 89 
     | 
    
         
            +
                    "hosts" => ["127.0.0.1:27017"]
         
     | 
| 
      
 90 
     | 
    
         
            +
                  }
         
     | 
| 
      
 91 
     | 
    
         
            +
                }
         
     | 
| 
      
 92 
     | 
    
         
            +
              )
         
     | 
| 
      
 93 
     | 
    
         
            +
            end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
            puts "MongoidStore..."
         
     | 
| 
      
 96 
     | 
    
         
            +
            mongoid_store = MongoidStore.new(nil)
         
     | 
| 
      
 97 
     | 
    
         
            +
            benchmark_store(mongoid_store)
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
            puts "MongoStore..."
         
     | 
| 
      
 100 
     | 
    
         
            +
            mongo_store = MongoStore.new(nil)
         
     | 
| 
      
 101 
     | 
    
         
            +
            benchmark_store(mongo_store)
         
     |