Class: ResponseBank::DeferredStore
- Inherits:
-
Object
- Object
- ResponseBank::DeferredStore
- Defined in:
- lib/response_bank/deferred_store.rb
Defined Under Namespace
Classes: InvalidContextError, StateError
Constant Summary collapse
- ENV_KEY =
'response_bank.deferred_store'- LOCK_OWNED_ENV_KEY =
'response_bank.fill_lock_owned'- TERMINAL_STATES =
%i[aborted completing consumed].freeze
- PRIVATE_CACHE_DIRECTIVES =
%w[private no-store].freeze
Class Method Summary collapse
- .arm_from_middleware(env, status:, headers:) ⇒ Object
- .create(env, timestamp:) ⇒ Object
- .from_env(env) ⇒ Object
Instance Method Summary collapse
- #abort ⇒ Object
-
#complete(body:, headers: nil) ⇒ Object
bodyandheadersmust describe the complete shared cache representation, not a partial response or bytes personalized for the live client. -
#complete_spliced(body:, compression_level:, slot: nil, headers: nil) ⇒ Object
bodymust be a complete Brotli stream that is already safe for shared caching. -
#initialize(env, timestamp:) ⇒ DeferredStore
constructor
A new instance of DeferredStore.
Constructor Details
#initialize(env, timestamp:) ⇒ DeferredStore
Returns a new instance of DeferredStore.
51 52 53 54 55 56 57 58 |
# File 'lib/response_bank/deferred_store.rb', line 51 def initialize(env, timestamp:) @env = env @timestamp = @cache_key = env.fetch('cacheable.key') @owns_lock = env.fetch(LOCK_OWNED_ENV_KEY) == true @mutex = Mutex.new @state = :requested end |
Class Method Details
.arm_from_middleware(env, status:, headers:) ⇒ Object
28 29 30 |
# File 'lib/response_bank/deferred_store.rb', line 28 def arm_from_middleware(env, status:, headers:) from_env(env)&.__send__(:arm, status: status, headers: headers) end |
.create(env, timestamp:) ⇒ Object
17 18 19 20 21 22 |
# File 'lib/response_bank/deferred_store.rb', line 17 def create(env, timestamp:) validate_context!(env) raise InvalidContextError, 'a deferred store is already registered for this request' if env.key?(ENV_KEY) new(env, timestamp: ).tap { |store| env[ENV_KEY] = store } end |
.from_env(env) ⇒ Object
24 25 26 |
# File 'lib/response_bank/deferred_store.rb', line 24 def from_env(env) env[ENV_KEY] end |
Instance Method Details
#abort ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/response_bank/deferred_store.rb', line 92 def abort transitioned, release_lock = @mutex.synchronize do if TERMINAL_STATES.include?(@state) [false, false] else @state = :aborted [true, @owns_lock] end end release_owned_lock if release_lock transitioned end |
#complete(body:, headers: nil) ⇒ Object
body and headers must describe the complete shared cache representation,
not a partial response or bytes personalized for the live client.
62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/response_bank/deferred_store.rb', line 62 def complete(body:, headers: nil) complete_with(headers) do |status, cached_headers, before_write| CacheWriter.store( @env, status: status, headers: cached_headers, body: body, timestamp: @timestamp, before_write: before_write, ) end end |
#complete_spliced(body:, compression_level:, slot: nil, headers: nil) ⇒ Object
body must be a complete Brotli stream that is already safe for shared
caching. If present, slot describes its neutral replacement slot.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/response_bank/deferred_store.rb', line 77 def complete_spliced(body:, compression_level:, slot: nil, headers: nil) complete_with(headers) do |status, cached_headers, before_write| CacheWriter.store_spliced( @env, status: status, headers: cached_headers, body: body, compression_level: compression_level, slot: slot, timestamp: @timestamp, before_write: before_write, ) end end |