Sha256: b7b3f6c03b7c63d8533fcddfab40503b3acde629f307ec5fc4fb50cf55b16bd2

Contents?: true

Size: 907 Bytes

Versions: 1

Compression:

Stored size: 907 Bytes

Contents

require 'thread'
require 'timeout'

class Freddy
  class SyncResponseContainer
    def initialize
      @mutex = Mutex.new
    end

    def call(response, delivery)
      @response = response
      @delivery = delivery
      @mutex.synchronize { @waiting.wakeup }
    end

    def on_timeout(&block)
      @on_timeout = block
    end

    def wait_for_response(timeout)
      @mutex.synchronize do
        @waiting = Thread.current
        @mutex.sleep(timeout)
      end

      if !defined?(@response)
        @on_timeout.call
        raise TimeoutError.new(
          error: 'RequestTimeout',
          message: 'Timed out waiting for response'
        )
      elsif @response.nil?
        raise StandardError, 'unexpected nil value for response'
      elsif !@delivery || @delivery.type == 'error'
        raise InvalidRequestError.new(@response)
      else
        @response
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
freddy-0.5.3 lib/freddy/sync_response_container.rb