Timeout
Timeout consists of two methods:
- timeoutreturns an ever-decreasing number of seconds until this number reaches 0.
- timed_out?checks if no time left.
The handler provides the initial timeout and uses the monotonic time for counting down.
A practical example is limiting the length of all external HTTP calls during request processing. Sample class for making HTTP requests in an application:
class MakeRequest
  include Dry::Effects.Timeout(:http)
  def call(url)
    HTTParty.get(url, timeout: timeout)
  end
end
Handling timeouts:
class WithTimeout
  include Dry::Effects::Handler.Timeout(:http)
  def initialize(app)
    @app = app
  end
  def call(env)
    with_timeout(10.0) { @app.(env) }
  rescue Net::OpenTimeout, Net::ReadTimeout, Net::WriteTimeout
    [504, {}, ["Gateway Timeout"]]
  end
end
The code above guarantees all requests made with MakeRequest during @app.(env) will finish within 10 seconds. If @app doesn't spend much time somewhere else, it gives a reasonably reliable hard limit on request processing.