Class: Smplkit::Config::ConfigClient

Inherits:
Object
  • Object
show all
Defined in:
lib/smplkit/config/client.rb

Overview

Synchronous config runtime namespace.

Obtained via Smplkit::Client#config. Exposes typed accessors (get_string, get_number, get_boolean, get_json) and runtime control (refresh, on_change).

Instance Method Summary collapse

Constructor Details

#initialize(parent, manage:, metrics:) ⇒ ConfigClient

Returns a new instance of ConfigClient.



69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/smplkit/config/client.rb', line 69

def initialize(parent, manage:, metrics:)
  @parent = parent
  @manage = manage
  @metrics = metrics
  @environment = parent._environment
  @service = parent._service

  @snapshots = {}
  @raw_chains = {}
  @global_listeners = []
  @key_listeners = Hash.new { |h, k| h[k] = [] }
  @connected = false
  @lock = Mutex.new
end

Instance Method Details

#_closeObject



152
153
154
# File 'lib/smplkit/config/client.rb', line 152

def _close
  # No durable resources; symmetry stub.
end

#_resolve_now(config_key) ⇒ Object



148
149
150
# File 'lib/smplkit/config/client.rb', line 148

def _resolve_now(config_key)
  resolve(config_key)
end

#get(config_key, model_class = nil) ⇒ Object



94
95
96
97
98
99
100
101
# File 'lib/smplkit/config/client.rb', line 94

def get(config_key, model_class = nil)
  start unless @connected

  snapshot = resolve(config_key)
  return snapshot if model_class.nil?

  model_class.new(snapshot)
end

#get_boolean(item_key, default: nil, config: nil) ⇒ Object



115
116
117
# File 'lib/smplkit/config/client.rb', line 115

def get_boolean(item_key, default: nil, config: nil)
  typed_get(item_key, default, config) { |v| !!v }
end

#get_json(item_key, default: nil, config: nil) ⇒ Object



119
120
121
# File 'lib/smplkit/config/client.rb', line 119

def get_json(item_key, default: nil, config: nil)
  typed_get(item_key, default, config) { |v| v }
end

#get_number(item_key, default: nil, config: nil) ⇒ Object



107
108
109
110
111
112
113
# File 'lib/smplkit/config/client.rb', line 107

def get_number(item_key, default: nil, config: nil)
  typed_get(item_key, default, config) do |v|
    v.is_a?(Numeric) ? v : Float(v)
  rescue StandardError
    default
  end
end

#get_string(item_key, default: nil, config: nil) ⇒ Object



103
104
105
# File 'lib/smplkit/config/client.rb', line 103

def get_string(item_key, default: nil, config: nil)
  typed_get(item_key, default, config) { |v| v.is_a?(String) ? v : v.to_s }
end

#live(config_key) ⇒ Object



123
124
125
126
127
# File 'lib/smplkit/config/client.rb', line 123

def live(config_key)
  start unless @connected

  LiveConfigProxy.new(self, config_key)
end

#on_change(config_key = nil, &block) ⇒ Object

Raises:

  • (ArgumentError)


129
130
131
132
133
134
135
136
137
138
# File 'lib/smplkit/config/client.rb', line 129

def on_change(config_key = nil, &block)
  raise ArgumentError, "on_change requires a block" unless block

  if config_key.nil?
    @global_listeners << block
  else
    @key_listeners[config_key] << block
  end
  block
end

#refreshObject



140
141
142
143
144
145
146
# File 'lib/smplkit/config/client.rb', line 140

def refresh
  @lock.synchronize do
    @snapshots.clear
    @raw_chains.clear
  end
  fire_change_listeners_all("manual")
end

#startObject



84
85
86
87
88
89
90
91
92
# File 'lib/smplkit/config/client.rb', line 84

def start
  return if @connected

  @environment = @parent._environment
  @ws_manager = @parent._ensure_ws
  @ws_manager.on("config_changed") { |data| handle_config_changed(data) }
  @ws_manager.on("config_deleted") { |data| handle_config_deleted(data) }
  @connected = true
end