Module: JetstreamBridge::ConsumerModeResolver

Defined in:
lib/jetstream_bridge/core/consumer_mode_resolver.rb

Constant Summary collapse

VALID_MODES =
[:pull, :push].freeze

Class Method Summary collapse

Class Method Details

.app_specific(app_name) ⇒ Object



42
43
44
45
46
47
# File 'lib/jetstream_bridge/core/consumer_mode_resolver.rb', line 42

def app_specific(app_name)
  key = "CONSUMER_MODE_#{app_name.to_s.upcase}"
  return nil unless ENV.key?(key)

  normalize(ENV.fetch(key, nil))
end

.env_for(app_name) ⇒ Object



26
27
28
# File 'lib/jetstream_bridge/core/consumer_mode_resolver.rb', line 26

def env_for(app_name)
  from_map(app_name) || app_specific(app_name) || shared
end

.from_map(app_name) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/jetstream_bridge/core/consumer_mode_resolver.rb', line 30

def from_map(app_name)
  env_map = ENV.fetch('CONSUMER_MODES', nil)
  return nil if env_map.to_s.strip.empty?

  pairs = env_map.split(',').each_with_object({}) do |pair, memo|
    key, mode = pair.split(':', 2).map { |p| p&.strip }
    memo[key] = mode if key && mode
  end

  normalize(pairs[app_name.to_s]) if pairs.key?(app_name.to_s)
end

.normalize(mode) ⇒ Object

Raises:

  • (ArgumentError)


55
56
57
58
59
60
61
62
# File 'lib/jetstream_bridge/core/consumer_mode_resolver.rb', line 55

def normalize(mode)
  return nil if mode.nil? || mode.to_s.strip.empty?

  m = mode.to_s.downcase.to_sym
  return m if VALID_MODES.include?(m)

  raise ArgumentError, "Invalid consumer mode #{mode.inspect}. Use :pull or :push."
end

.resolve(app_name:, override: nil, fallback: :pull) ⇒ Object

Resolve consumer mode for a given app.

Priority: 1) explicit override (symbol/string) 2) env map CONSUMER_MODES=“app:mode,…” 3) per-app env CONSUMER_MODE_<APP_NAME> 4) shared env CONSUMER_MODE 5) fallback (default :pull)



17
18
19
20
21
22
23
24
# File 'lib/jetstream_bridge/core/consumer_mode_resolver.rb', line 17

def resolve(app_name:, override: nil, fallback: :pull)
  return normalize(override) if override

  from_env = env_for(app_name)
  return from_env if from_env

  normalize(fallback)
end

.sharedObject



49
50
51
52
53
# File 'lib/jetstream_bridge/core/consumer_mode_resolver.rb', line 49

def shared
  return nil unless ENV['CONSUMER_MODE']

  normalize(ENV.fetch('CONSUMER_MODE', nil))
end