Class: Igniter::Store::HTTPAdapter

Inherits:
Object
  • Object
show all
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

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_addressObject



408
409
410
# File 'lib/igniter/store/http_adapter.rb', line 408

def bind_address
  "#{@host}:#{@port}"
end

#rack_appObject

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

#startObject

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_asyncObject

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

#stopObject



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