Class: ViewComponentReducible::Adapter::Redis

Inherits:
Base
  • Object
show all
Defined in:
lib/view_component_reducible/adapter/redis.rb

Overview

Redis adapter storing envelope outside of the session.

Constant Summary collapse

DEFAULT_TTL =
900
DEFAULT_NAMESPACE =
'vcr'

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(secret:, redis: nil, redis_url: nil, redis_ttl: DEFAULT_TTL, redis_namespace: DEFAULT_NAMESPACE) ⇒ Redis

Returns a new instance of Redis.

Parameters:

  • secret (String)
  • redis (Object, nil) (defaults to: nil)
  • redis_url (String, nil) (defaults to: nil)
  • redis_ttl (Integer, nil) (defaults to: DEFAULT_TTL)
  • redis_namespace (String, nil) (defaults to: DEFAULT_NAMESPACE)


24
25
26
27
28
29
# File 'lib/view_component_reducible/adapter/redis.rb', line 24

def initialize(secret:, redis: nil, redis_url: nil, redis_ttl: DEFAULT_TTL, redis_namespace: DEFAULT_NAMESPACE)
  super(secret:)
  @redis = redis || build_client(redis_url)
  @redis_ttl = redis_ttl
  @redis_namespace = redis_namespace
end

Class Method Details

.state_param_nameObject



15
16
17
# File 'lib/view_component_reducible/adapter/redis.rb', line 15

def self.state_param_name
  'vcr_state_key'
end

Instance Method Details

#dump(envelope, request:) ⇒ String

Parameters:

  • envelope (Hash)
  • request (ActionDispatch::Request)

Returns:

  • (String)


39
40
41
42
43
44
# File 'lib/view_component_reducible/adapter/redis.rb', line 39

def dump(envelope, request:)
  _ = request
  key = SecureRandom.hex(16)
  write(key, JSON.generate(envelope))
  verifier.generate({ 'k' => key })
end

#load(request:) ⇒ Hash

Parameters:

  • request (ActionDispatch::Request)

Returns:

  • (Hash)

Raises:

  • (KeyError)


48
49
50
51
52
53
54
55
56
# File 'lib/view_component_reducible/adapter/redis.rb', line 48

def load(request:)
  signed = request.params.fetch(self.class.state_param_name)
  payload = verifier.verify(signed)
  key = payload.fetch('k')
  raw = @redis.get(redis_key(key))
  raise KeyError, "Missing envelope for #{key}" if raw.nil?

  JSON.parse(raw)
end

#verifierActiveSupport::MessageVerifier

Returns:

  • (ActiveSupport::MessageVerifier)


32
33
34
# File 'lib/view_component_reducible/adapter/redis.rb', line 32

def verifier
  @verifier ||= ActiveSupport::MessageVerifier.new(@secret, digest: 'SHA256', serializer: JSON)
end