Class: Igniter::Store::HTTPAdapter
- Inherits:
-
Object
- Object
- Igniter::Store::HTTPAdapter
- Defined in:
- lib/igniter/store/http_adapter.rb
Overview
HTTP transport adapter for the Igniter Store Open Protocol.
Exposes Protocol::Interpreter over HTTP via a Rack-compatible app. The canonical endpoint is POST /v1/dispatch which accepts and returns a WireEnvelope JSON object.
Usage:
adapter = HTTPAdapter.new(interpreter: interpreter, port: 7300)
adapter.rack_app # → Rack-compatible, mountable in any server
adapter.start # → foreground via Puma (dev dep)
adapter.start_async / adapter.stop
Defined Under Namespace
Modules: ResponseHelper Classes: CompactionActivityHandler, DispatchHandler, EventsRecentHandler, HealthHandler, MetadataHandler, MetricsHandler, ReadyHandler, SseBody, SseEventsHandler, StatusHandler
Instance Method Summary collapse
- #bind_address ⇒ Object
-
#initialize(interpreter:, port: 7300, host: "0.0.0.0", health_provider: nil, status_provider: nil, ready_provider: nil, metrics_provider: nil, events_provider: nil, changefeed_provider: nil) ⇒ HTTPAdapter
constructor
── Adapter ──────────────────────────────────────────────────────────────.
-
#rack_app ⇒ Object
Returns a Rack-compatible app mountable in any Rack server.
-
#start ⇒ Object
Starts the server in the current thread (blocks).
-
#start_async ⇒ Object
Starts in a background thread.
- #stop ⇒ Object
Constructor Details
#initialize(interpreter:, port: 7300, host: "0.0.0.0", health_provider: nil, status_provider: nil, ready_provider: nil, metrics_provider: nil, events_provider: nil, changefeed_provider: nil) ⇒ HTTPAdapter
── Adapter ──────────────────────────────────────────────────────────────
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 |
# File 'lib/igniter/store/http_adapter.rb', line 341 def initialize(interpreter:, port: 7300, host: "0.0.0.0", health_provider: nil, status_provider: nil, ready_provider: nil, metrics_provider: nil, events_provider: nil, changefeed_provider: nil) @interpreter = interpreter @port = port @host = host @health_provider = health_provider @status_provider = status_provider @ready_provider = ready_provider @metrics_provider = metrics_provider @events_provider = events_provider @changefeed_provider = changefeed_provider @puma = nil @thread = nil end |
Instance Method Details
#bind_address ⇒ Object
408 409 410 |
# File 'lib/igniter/store/http_adapter.rb', line 408 def bind_address "#{@host}:#{@port}" end |
#rack_app ⇒ Object
Returns a Rack-compatible app mountable in any Rack server.
359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 |
# File 'lib/igniter/store/http_adapter.rb', line 359 def rack_app interp = @interpreter hp = @health_provider sp = @status_provider rp = @ready_provider mp = @metrics_provider ep = @events_provider cp = @changefeed_provider not_found = ->(env) { body = JSON.generate({ error: "Not found: #{env["REQUEST_METHOD"]} #{env["PATH_INFO"]}" }) [404, { "Content-Type" => "application/json", "Content-Length" => body.bytesize.to_s }, [body]] } Rack::Builder.new do map "/v1/dispatch" do run DispatchHandler.new(interp) end map "/v1/health" do run HealthHandler.new(health_provider: hp) end map "/v1/status" do run StatusHandler.new(interpreter: interp, status_provider: sp) end map "/v1/ready" do run ReadyHandler.new(ready_provider: rp) end map "/v1/metrics" do run MetricsHandler.new(metrics_provider: mp) end # /v1/events/recent must precede /v1/events to avoid prefix shadowing. map "/v1/events/recent" do run EventsRecentHandler.new(events_provider: ep) end map "/v1/events" do run SseEventsHandler.new(changefeed_provider: cp) end map "/v1/metadata" do run MetadataHandler.new(interp) end map "/v1/compaction/activity" do run CompactionActivityHandler.new(interp) end run not_found end end |
#start ⇒ Object
Starts the server in the current thread (blocks). Requires puma.
388 389 390 391 392 393 |
# File 'lib/igniter/store/http_adapter.rb', line 388 def start require "puma" @puma = Puma::Server.new(rack_app) @puma.add_tcp_listener(@host, @port) @puma.run.join end |
#start_async ⇒ Object
Starts in a background thread. Returns self.
396 397 398 399 400 |
# File 'lib/igniter/store/http_adapter.rb', line 396 def start_async @thread = Thread.new { start } sleep 0.05 self end |
#stop ⇒ Object
402 403 404 405 406 |
# File 'lib/igniter/store/http_adapter.rb', line 402 def stop @puma&.stop(true) rescue nil @thread&.join(2) rescue nil self end |