Sha256: 9489ce2095b343e7ee406ea18ceb6a5ce007a9652e6cf3c7f376b1c4e88f563c

Contents?: true

Size: 1.96 KB

Versions: 24

Compression:

Stored size: 1.96 KB

Contents

# frozen_string_literal: true

# :markup: markdown

require "action_dispatch/middleware/session/abstract_store"

module ActionDispatch
  module Session
    # # Action Dispatch Session CacheStore
    #
    # A session store that uses an ActiveSupport::Cache::Store to store the
    # sessions. This store is most useful if you don't store critical data in your
    # sessions and you don't need them to live for extended periods of time.
    #
    # #### Options
    # *   `cache`         - The cache to use. If it is not specified, `Rails.cache`
    #     will be used.
    # *   `expire_after`  - The length of time a session will be stored before
    #     automatically expiring. By default, the `:expires_in` option of the cache
    #     is used.
    #
    class CacheStore < AbstractSecureStore
      def initialize(app, options = {})
        @cache = options[:cache] || Rails.cache
        options[:expire_after] ||= @cache.options[:expires_in]
        super
      end

      # Get a session from the cache.
      def find_session(env, sid)
        unless sid && (session = get_session_with_fallback(sid))
          sid, session = generate_sid, {}
        end
        [sid, session]
      end

      # Set a session in the cache.
      def write_session(env, sid, session, options)
        key = cache_key(sid.private_id)
        if session
          @cache.write(key, session, expires_in: options[:expire_after])
        else
          @cache.delete(key)
        end
        sid
      end

      # Remove a session from the cache.
      def delete_session(env, sid, options)
        @cache.delete(cache_key(sid.private_id))
        @cache.delete(cache_key(sid.public_id))
        generate_sid
      end

      private
        # Turn the session id into a cache key.
        def cache_key(id)
          "_session_id:#{id}"
        end

        def get_session_with_fallback(sid)
          @cache.read(cache_key(sid.private_id)) || @cache.read(cache_key(sid.public_id))
        end
    end
  end
end

Version data entries

24 entries across 24 versions & 2 rubygems

Version Path
actionpack-8.0.2 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-8.0.1 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-8.0.0.1 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-7.2.2.1 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-8.0.0 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-7.2.2 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-8.0.0.rc2 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-7.2.1.2 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-8.0.0.rc1 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-7.2.1.1 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-8.0.0.beta1 lib/action_dispatch/middleware/session/cache_store.rb
omg-actionpack-8.0.0.alpha9 lib/action_dispatch/middleware/session/cache_store.rb
omg-actionpack-8.0.0.alpha8 lib/action_dispatch/middleware/session/cache_store.rb
omg-actionpack-8.0.0.alpha7 lib/action_dispatch/middleware/session/cache_store.rb
omg-actionpack-8.0.0.alpha4 lib/action_dispatch/middleware/session/cache_store.rb
omg-actionpack-8.0.0.alpha3 lib/action_dispatch/middleware/session/cache_store.rb
omg-actionpack-8.0.0.alpha2 lib/action_dispatch/middleware/session/cache_store.rb
omg-actionpack-8.0.0.alpha1 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-7.2.1 lib/action_dispatch/middleware/session/cache_store.rb
actionpack-7.2.0 lib/action_dispatch/middleware/session/cache_store.rb