Sha256: 12d9ff7bec7e5cce389301cbb2bc860eb004bb0c83d2a3c0c808fc4c34f0e267

Contents?: true

Size: 1.55 KB

Versions: 41

Compression:

Stored size: 1.55 KB

Contents

require 'routemaster/dirty/state'
require 'routemaster/config'
module Routemaster
  module Dirty
    # Service object, filters an event payload, only include events that reflect
    # an entity state that is _more recent_ than previously received events.
    #
    # Can be used to Ignore events received out-of-order (e.g. an `update` event
    # about en entity received after the `delete` event for that same entity),
    # given Routemaster makes no guarantee of in-order delivery of events.
    #
    class Filter
      EXPIRY = 86_400

      # @param redis [Redis, Redis::Namespace] a connection to Redis, used to
      # persists the known state
      def initialize(redis:nil)
        @redis  = redis || Config.drain_redis
        @expiry = Config.cache_expiry
      end

      # Process a payload, and returns part if this payload containing
      # only the latest event for a given entity.
      #
      # Events are skipped if they are older than a previously processed
      # event for the same entity.
      #
      # Order of kept events is not guaranteed to be preserved.
      def run(payload)
        events = {} # url -> event

        payload.each do |event|
          known_state = State.get(@redis, event['url'])

          # skip events older than what we already know
          next if known_state.t > event['t']

          new_state = State.new(event['url'], event['t'])

          next if new_state == known_state
          new_state.save(@redis, @expiry)
          events[event['url']] = event
        end

        events.values
      end
    end
  end
end

Version data entries

41 entries across 41 versions & 1 rubygems

Version Path
routemaster-drain-3.7.1 lib/routemaster/dirty/filter.rb
routemaster-drain-3.7.0 lib/routemaster/dirty/filter.rb
routemaster-drain-3.6.8 lib/routemaster/dirty/filter.rb
routemaster-drain-3.6.7 lib/routemaster/dirty/filter.rb
routemaster-drain-3.6.6 lib/routemaster/dirty/filter.rb
routemaster-drain-3.6.5 lib/routemaster/dirty/filter.rb
routemaster-drain-3.6.4 lib/routemaster/dirty/filter.rb
routemaster-drain-3.6.3 lib/routemaster/dirty/filter.rb
routemaster-drain-3.6.2 lib/routemaster/dirty/filter.rb
routemaster-drain-3.6.1 lib/routemaster/dirty/filter.rb
routemaster-drain-3.6.0 lib/routemaster/dirty/filter.rb
routemaster-drain-3.5.1 lib/routemaster/dirty/filter.rb
routemaster-drain-3.5.0 lib/routemaster/dirty/filter.rb
routemaster-drain-3.4.0 lib/routemaster/dirty/filter.rb
routemaster-drain-3.3.0 lib/routemaster/dirty/filter.rb
routemaster-drain-3.2.0 lib/routemaster/dirty/filter.rb
routemaster-drain-3.1.0 lib/routemaster/dirty/filter.rb
routemaster-drain-3.0.3 lib/routemaster/dirty/filter.rb
routemaster-drain-3.0.2 lib/routemaster/dirty/filter.rb
routemaster-drain-3.0.1 lib/routemaster/dirty/filter.rb