class NxtHttpClient::FireCallbacks

Attributes

registry[R]

Public Class Methods

new() click to toggle source
# File lib/nxt_http_client/fire_callbacks.rb, line 3
def initialize
  @registry = build_registry
end

Public Instance Methods

any_after_callbacks?() click to toggle source
# File lib/nxt_http_client/fire_callbacks.rb, line 33
def any_after_callbacks?
  registry.resolve(:after).any?
end
clear(*kinds) click to toggle source
# File lib/nxt_http_client/fire_callbacks.rb, line 7
def clear(*kinds)
  Array(kinds).each { |kind| registry.register!(kind, []) }
end
register(kind, callback) click to toggle source
# File lib/nxt_http_client/fire_callbacks.rb, line 11
def register(kind, callback)
  registry.resolve!(kind) << callback
end
run(target, kind, *args) click to toggle source
# File lib/nxt_http_client/fire_callbacks.rb, line 15
def run(target, kind, *args)
  registry.resolve!(kind).each do |callback|
    run_callback(target, callback, *args)
  end
end
run_after(target:, request:, response:, result:, error:) click to toggle source
# File lib/nxt_http_client/fire_callbacks.rb, line 27
def run_after(target:, request:, response:, result:, error:)
  registry.resolve!(:after).inject(result) do |_, callback|
    run_callback(target, callback, *[target, request, response, result, error])
  end
end
run_around(target:, request:, response_handler:, fire:) click to toggle source
# File lib/nxt_http_client/fire_callbacks.rb, line 37
def run_around(target:, request:, response_handler:, fire:)
  around_callbacks = registry.resolve!(:around)
  return fire.call unless around_callbacks.any?

  args = *[target, request, response_handler]
  callback_chain = around_callbacks.reverse.inject(fire) do |previous, callback|
    -> { target.instance_exec(*args, previous, &callback) }
  end

  callback_chain.call
end
run_before(target:, request:, response_handler:) click to toggle source
# File lib/nxt_http_client/fire_callbacks.rb, line 21
def run_before(target:, request:, response_handler:)
  registry.resolve!(:before).each do |callback|
    run_callback(target, callback, *[target, request, response_handler])
  end
end

Private Instance Methods

build_registry() click to toggle source
# File lib/nxt_http_client/fire_callbacks.rb, line 58
def build_registry
  NxtRegistry::Registry.new(:callbacks) do
    register(:before, [])
    register(:around, [])
    register(:after, [])
  end
end
run_callback(target, callback, *args) click to toggle source
# File lib/nxt_http_client/fire_callbacks.rb, line 53
def run_callback(target, callback, *args)
  args = args.take(callback.arity)
  target.instance_exec(*args, &callback)
end