class Flipper::Adapters::Sync::IntervalSynchronizer

Internal: Wraps a Synchronizer instance and only invokes it every N milliseconds.

Constants

DEFAULT_INTERVAL_MS

Private: Number of milliseconds between syncs (default: 10 seconds).

Attributes

interval[R]

Public: The number of milliseconds between invocations of the wrapped synchronizer.

Public Class Methods

new(synchronizer, interval: nil) click to toggle source

Public: Initializes a new interval synchronizer.

synchronizer - The Synchronizer to call when the interval has passed. interval - The Integer number of milliseconds between invocations of

the wrapped synchronizer.
# File lib/flipper/adapters/sync/interval_synchronizer.rb, line 24
def initialize(synchronizer, interval: nil)
  @synchronizer = synchronizer
  @interval = interval || DEFAULT_INTERVAL_MS
  # TODO: add jitter to this so all processes booting at the same time
  # don't phone home at the same time.
  @last_sync_at = 0
end
now_ms() click to toggle source

Private

# File lib/flipper/adapters/sync/interval_synchronizer.rb, line 11
def self.now_ms
  Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
end

Public Instance Methods

call() click to toggle source
# File lib/flipper/adapters/sync/interval_synchronizer.rb, line 32
def call
  return unless time_to_sync?

  @last_sync_at = now_ms
  @synchronizer.call

  nil
end

Private Instance Methods

now_ms() click to toggle source
# File lib/flipper/adapters/sync/interval_synchronizer.rb, line 47
def now_ms
  self.class.now_ms
end
time_to_sync?() click to toggle source
# File lib/flipper/adapters/sync/interval_synchronizer.rb, line 43
def time_to_sync?
  (now_ms - @last_sync_at) >= @interval
end