Sha256: 712dc5896a48bf982de309ddc44c21dc2154f1a2e74544b88db3674e52ffae0c

Contents?: true

Size: 1.58 KB

Versions: 5

Compression:

Stored size: 1.58 KB

Contents

# ai_client/retry_middleware.rb

class AiClient

  # AiClient.use(
  #   AiClient::RetryMiddleware.new(
  #     max_retries:  5,
  #     base_delay:   2,
  #     max_delay:    30
  #   )
  # )
  #
  class RetryMiddleware

    # Initializes a new instance of RetryMiddleware.
    #
    # @param max_retries [Integer] The maximum number of retries to attempt (default: 3).
    # @param base_delay [Integer] The base delay in seconds before retrying (default: 2).
    # @param max_delay [Integer] The maximum delay in seconds between retries (default: 16).
    #
    def initialize(max_retries: 3, base_delay: 2, max_delay: 16)
      @max_retries  = max_retries
      @base_delay   = base_delay
      @max_delay    = max_delay
    end

    # Calls the next middleware, retrying on specific errors.
    #
    # @param client [AiClient] The client instance that invokes the middleware.
    # @param next_middleware [Proc] The next middleware in the chain to call.
    # @param args [Array] Any additional arguments to pass to the next middleware.
    #
    # @raise [StandardError] Reraise the error if max retries are exceeded.
    #
    def call(client, next_middleware, *args)
      retries = 0
      begin
        next_middleware.call
      rescue OmniAI::RateLimitError, OmniAI::NetworkError => e
        if retries < @max_retries
          retries += 1
          delay = [@base_delay * (2 ** (retries - 1)), @max_delay].min
          client.logger.warn("Retrying in #{delay} seconds due to error: #{e.message}")
          sleep(delay)
          retry
        else
          raise
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
ai_client-0.4.1 lib/ai_client/retry_middleware.rb
ai_client-0.4.0 lib/ai_client/retry_middleware.rb
ai_client-0.3.1 lib/ai_client/retry_middleware.rb
ai_client-0.3.0 lib/ai_client/retry_middleware.rb
ai_client-0.2.5 lib/ai_client/retry_middleware.rb