Class: Zizq::Configuration

Inherits:
Object
  • Object
show all
Defined in:
lib/zizq/configuration.rb

Overview

Global configuration for the Zizq client.

The configuration stores only client-level concerns: server URL, serialization format, and logger. Worker-specific settings (queues, threads, etc.) are passed directly to the Worker.

See: [‘Zizq::configure]`. See: [`Zizq::configuration]`.

Defined Under Namespace

Classes: FlushingIO, Identity

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeConfiguration

: () -> void



62
63
64
65
66
67
68
69
70
71
72
# File 'lib/zizq/configuration.rb', line 62

def initialize #: () -> void
  @url = "http://localhost:7890"
  @format = :msgpack
  @logger = Logger.new(FlushingIO.new($stdout), level: Logger::INFO)
  @tls = nil
  @worker = nil
  @read_timeout = 30
  @stream_idle_timeout = 30
  @enqueue_middleware = Middleware::Chain.new(Identity.new)
  @dequeue_middleware = Middleware::Chain.new(Zizq::Job)
end

Instance Attribute Details

#dequeue_middlewareObject (readonly)

Middleware chain for dequeue/dispatch. Each middleware receives a ‘Resources::Job` and a chain to continue.



60
61
62
# File 'lib/zizq/configuration.rb', line 60

def dequeue_middleware
  @dequeue_middleware
end

#enqueue_middlewareObject (readonly)

Middleware chain for enqueue. Each middleware receives an ‘EnqueueRequest` and a chain to continue.



56
57
58
# File 'lib/zizq/configuration.rb', line 56

def enqueue_middleware
  @enqueue_middleware
end

#formatObject

Choice of content-type encoding used in communication with the Zizq server.

One of: ‘:json`, `:msgpack` (default)



28
29
30
# File 'lib/zizq/configuration.rb', line 28

def format
  @format
end

#loggerObject

Logger instance to which to write log messages.



31
32
33
# File 'lib/zizq/configuration.rb', line 31

def logger
  @logger
end

#read_timeoutObject

Per-operation socket I/O timeout (seconds) for regular API calls (enqueue, queries, mutations). Each socket read/write is bounded by this value. A request whose handshake or any single read exceeds this raises ‘IO::TimeoutError`.

Default: 30.



39
40
41
# File 'lib/zizq/configuration.rb', line 39

def read_timeout
  @read_timeout
end

#stream_idle_timeoutObject

Per-operation socket I/O timeout (seconds) for the long-lived ‘#take_jobs` stream. The server sends heartbeats every ~3 seconds, so each read returns within that window and keeps the connection alive; the connection only times out if the server falls silent for longer than this. The Worker catches the resulting error and reconnects with backoff.

Should be comfortably above the server’s heartbeat interval to avoid false-positive disconnects.

Default: 30.



52
53
54
# File 'lib/zizq/configuration.rb', line 52

def stream_idle_timeout
  @stream_idle_timeout
end

#urlObject

Base URL of the Zizq server (default: “localhost:7890”).



22
23
24
# File 'lib/zizq/configuration.rb', line 22

def url
  @url
end

Instance Method Details

#dispatcherObject

The job dispatcher. This is the terminal of the dequeue middleware chain. Defaults to ‘Zizq::Job` which finds and executes jobs written by mixing in the `Zizq::Job` module.



144
145
146
# File 'lib/zizq/configuration.rb', line 144

def dispatcher #: () -> Zizq::dispatcher
  @dequeue_middleware.terminal
end

#dispatcher=(dispatcher) ⇒ Object

Set the dispatcher to a custom dispatcher implementation.

A dispatcher is any object that responds to ‘#call` with a `Zizq::Resources::Job` instance and performs that job through some application-specific logic.

This is the terminal of the dequeue middleware chain.

Any errors raised by the dispatcher will result in the normal backoff/retry behaviour. Jobs are acknowledged automatically on success.



158
159
160
# File 'lib/zizq/configuration.rb', line 158

def dispatcher=(dispatcher) #: (Zizq::dispatcher) -> void
  @dequeue_middleware.terminal = dispatcher
end

#ssl_contextObject

Build an OpenSSL::SSL::SSLContext from the TLS options, or nil if no TLS options are configured.



185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/zizq/configuration.rb', line 185

def ssl_context #: () -> OpenSSL::SSL::SSLContext?
  tls = @tls
  return nil unless tls
  return nil if tls.to_h.values.all?(&:nil?)

  ctx = OpenSSL::SSL::SSLContext.new

  if (ca = tls.ca)
    store = OpenSSL::X509::Store.new
    store.add_cert(load_cert(ca))
    ctx.cert_store = store
    ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
  end

  if (client_cert = tls.client_cert)
    ctx.cert = load_cert(client_cert)
  end

  if (client_key = tls.client_key)
    ctx.key = load_key(client_key)
  end

  ctx
end

#tlsObject

TLS settings for connecting to the server over HTTPS.

Configure via the ‘c.tls` accessors inside a `Zizq.configure` block:

Zizq.configure do |c|
  c.tls.ca          = "/path/to/server-ca-cert.pem"
  c.tls.client_cert = "/path/to/client-cert.pem"
  c.tls.client_key  = "/path/to/client-key.pem"
end

All values may be PEM-encoded strings or file paths. Set ‘c.tls = nil` to explicitly disable TLS.

Note: Mutual TLS support requires a Zizq Pro license on the server.



90
91
92
# File 'lib/zizq/configuration.rb', line 90

def tls #: () -> TlsConfiguration
  @tls ||= TlsConfiguration.new
end

#tls=(value) ⇒ Object

: ((Hash[Symbol, String?] | TlsConfiguration)?) -> void



94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/zizq/configuration.rb', line 94

def tls=(value) #: ((Hash[Symbol, String?] | TlsConfiguration)?) -> void
  case value
  when nil
    @tls = nil
  when TlsConfiguration
    @tls = value
  when Hash
    @tls = TlsConfiguration.new(**value)
  else
    raise ArgumentError,
      "Zizq.configure: tls= expects a Hash, Zizq::TlsConfiguration, or nil " \
      "(got #{value.class})"
  end
end

#validate!Object

Validates that required configuration is present.

Raises:

  • (ArgumentError)


163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/zizq/configuration.rb', line 163

def validate! #: () -> void
  raise ArgumentError, "Zizq.configure: url is required" if url.empty?

  unless %i[msgpack json].include?(format)
    raise ArgumentError, "Zizq.configure: format must be :msgpack or :json, got #{format.inspect}"
  end

  unless read_timeout.is_a?(Numeric) && read_timeout > 0
    raise ArgumentError, "Zizq.configure: read_timeout must be a positive number, got #{read_timeout.inspect}"
  end

  unless stream_idle_timeout.is_a?(Numeric) && stream_idle_timeout > 0
    raise ArgumentError, "Zizq.configure: stream_idle_timeout must be a positive number, got #{stream_idle_timeout.inspect}"
  end

  tls = @tls
  validate_tls!(tls) if tls
end

#workerObject

Defaults for ‘Zizq::Worker` instances. Apps populate this in their `Zizq.configure` block:

Zizq.configure do |c|
  c.worker.queues = ["emails"]
  c.worker.fiber_count = 25
end

Anything left unset here falls through to the Worker’s hardcoded defaults; anything explicitly passed to ‘Worker.new` (or set via `zizq-worker` CLI flags / env vars) overrides whatever is configured here.



121
122
123
# File 'lib/zizq/configuration.rb', line 121

def worker #: () -> WorkerConfiguration
  @worker ||= WorkerConfiguration.new
end

#worker=(value) ⇒ Object

: ((Hash[Symbol, untyped] | WorkerConfiguration)?) -> void



125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/zizq/configuration.rb', line 125

def worker=(value) #: ((Hash[Symbol, untyped] | WorkerConfiguration)?) -> void
  case value
  when nil
    @worker = nil
  when WorkerConfiguration
    @worker = value
  when Hash
    @worker = WorkerConfiguration.new(**value)
  else
    raise ArgumentError,
      "Zizq.configure: worker= expects a Hash, Zizq::WorkerConfiguration, or nil " \
      "(got #{value.class})"
  end
end