Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
entity_cache / lib / entity_cache / entity_cache.rb
Size: Mime:
class EntityCache
  configure :entity_cache

  dependency :clock, Clock::UTC
  dependency :logger, Telemetry::Logger
  dependency :persistent_store, Storage::Persistent
  dependency :temporary_store, Storage::Temporary

  setting :write_behind_delay

  def self.build(subject, persistent_store: nil)
    instance = new

    Clock::UTC.configure instance
    Telemetry::Logger.configure instance

    Storage::Temporary.configure instance, subject
    Storage::Persistent.configure instance, subject, implementation: persistent_store

    instance
  end

  def get(id, include: nil)
    logger.opt_trace "Reading cache (ID: #{id.inspect}, Include: #{include.inspect})"

    record = temporary_store.get id
    record ||= restore id

    if record
      logger.opt_debug "Cache hit (ID: #{id.inspect}, Include: #{include.inspect}, Entity Class: #{record.entity.class.name}, Version: #{record.version.inspect}, Time: #{record.time})"
    else
      logger.opt_debug "Cache miss (ID: #{id.inspect}, Include: #{include.inspect})"
    end

    record ||= Record::NoStream
    record.destructure include
  end

  def put(id, entity, version, persistent_version, persistent_time, time: nil)
    time ||= clock.iso8601

    logger.opt_trace "Writing cache (ID: #{id}, Entity Class: #{entity.class.name}, Version: #{version.inspect}, Time: #{time}, Persistent Version: #{persistent_version.inspect}, Persistent Time: #{persistent_time})"

    record = Record.new id, entity, version, time, persistent_version, persistent_time

    put_record record

    logger.opt_debug "Cache written (ID: #{id}, Entity Class: #{record.entity.class.name}, Version: #{record.version.inspect}, Time: #{record.time}, Persistent Version: #{persistent_version.inspect}, Persistent Time: #{persistent_time})"

    record
  end

  def put_record(record)
    temporary_store.put record

    return if write_behind_delay.nil?

    if record.age >= write_behind_delay
      persistent_store.put record.id, record.entity, record.version
    end
  end

  def restore(id)
    entity, persistent_version, persistent_time = persistent_store.get id

    return nil if entity.nil?

    version = persistent_version
    time = persistent_time

    put id, entity, version, persistent_version, persistent_time, time: time
  end
end