module Altaire::Gateway

Public Class Methods

provide(subject, queue: "provider", interruptable: false, &block) click to toggle source
# File lib/altaire/gateway.rb, line 18
def self.provide (subject, queue: "provider", interruptable: false, &block)
  NATS.subscribe subject, queue: queue do |msg, reply|
    msg = JSON.parse(msg)
    thread = Thread.new do
      NATS.publish reply, { result: block.(msg) }.to_json
    rescue => e
      NATS.publish reply, { error: e.message }.to_json
    ensure
      @requests.delete(msg["id"])
    end
    @requests[msg["id"]] = thread if interruptable
  end
end
start(urls, &block) click to toggle source
# File lib/altaire/gateway.rb, line 7
def self.start (urls, &block)
  NATS.start servers: [urls].flatten do
    @requests = {}
    NATS.subscribe "meta.cancel" do |msg|
      @requests[msg.to_i].raise(Interrupt, "Cancelled by gateway")
    rescue Exception
    end
    block.(self)
  end
end