Sha256: 4a27ae37dfe7565ef07fa3d46c902df93f3fa8f7d9ca2baa823dd701b7266639

Contents?: true

Size: 1.88 KB

Versions: 24

Compression:

Stored size: 1.88 KB

Contents

# frozen_string_literal: true

module HTTPX
  class Timers
    def initialize
      @intervals = []
    end

    def after(interval_in_secs, &blk)
      return unless interval_in_secs

      # I'm assuming here that most requests will have the same
      # request timeout, as in most cases they share common set of
      # options. A user setting different request timeouts for 100s of
      # requests will already have a hard time dealing with that.
      unless (interval = @intervals.find { |t| t == interval_in_secs })
        interval = Interval.new(interval_in_secs)
        @intervals << interval
        @intervals.sort!
      end

      interval << blk
    end

    def wait_interval
      return if @intervals.empty?

      @next_interval_at = Utils.now

      @intervals.first.interval
    end

    def fire(error = nil)
      raise error if error && error.timeout != @intervals.first
      return if @intervals.empty? || !@next_interval_at

      elapsed_time = Utils.elapsed_time(@next_interval_at)

      @intervals.delete_if { |interval| interval.elapse(elapsed_time) <= 0 }

      @next_interval_at = nil if @intervals.empty?
    end

    def cancel
      @next_interval_at = nil
      @intervals.clear
    end

    class Interval
      include Comparable

      attr_reader :interval

      def initialize(interval)
        @interval = interval
        @callbacks = []
      end

      def <=>(other)
        @interval <=> other.interval
      end

      def ==(other)
        return @interval == other if other.is_a?(Numeric)

        @interval == other.to_f # rubocop:disable Lint/FloatComparison
      end

      def to_f
        Float(@interval)
      end

      def <<(callback)
        @callbacks << callback
      end

      def elapse(elapsed)
        @interval -= elapsed

        @callbacks.each(&:call) if @interval <= 0

        @interval
      end
    end
    private_constant :Interval
  end
end

Version data entries

24 entries across 24 versions & 1 rubygems

Version Path
httpx-1.0.2 lib/httpx/timers.rb
httpx-0.24.7 lib/httpx/timers.rb
httpx-1.0.1 lib/httpx/timers.rb
httpx-1.0.0 lib/httpx/timers.rb
httpx-0.24.6 lib/httpx/timers.rb
httpx-0.24.5 lib/httpx/timers.rb
httpx-0.24.4 lib/httpx/timers.rb
httpx-0.24.3 lib/httpx/timers.rb
httpx-0.24.2 lib/httpx/timers.rb
httpx-0.24.1 lib/httpx/timers.rb
httpx-0.24.0 lib/httpx/timers.rb
httpx-0.23.4 lib/httpx/timers.rb
httpx-0.23.3 lib/httpx/timers.rb
httpx-0.23.2 lib/httpx/timers.rb
httpx-0.23.1 lib/httpx/timers.rb
httpx-0.23.0 lib/httpx/timers.rb
httpx-0.22.5 lib/httpx/timers.rb
httpx-0.22.4 lib/httpx/timers.rb
httpx-0.22.3 lib/httpx/timers.rb
httpx-0.22.2 lib/httpx/timers.rb