Sha256: a2e691c8a0cbe906e5f3337a7d14513995a31e7ce5715927a27fe795494a24bb

Contents?: true

Size: 1.51 KB

Versions: 10

Compression:

Stored size: 1.51 KB

Contents

# frozen_string_literal: true

#
# The TTL store is a data structure which keeps data by a key, and with a time-to-live.
# It is specifically designed for data which is static, i.e. for a certain key in a
# sufficiently large span, the value will be the same.
#
# Because of that, synchronizations around reads do not exist, while write synchronizations
# will be short-circuited by a read.
#
class Rodauth::OAuth::TtlStore
  DEFAULT_TTL = 60 * 60 * 24 # default TTL is one day

  def initialize
    @store_mutex = Mutex.new
    @store = {}
  end

  def [](key)
    lookup(key, now)
  end

  def set(key, &block)
    @store_mutex.synchronize do
      # short circuit
      return @store[key][:payload] if @store[key] && @store[key][:ttl] < now
    end

    payload, ttl = block.call

    @store_mutex.synchronize do
      # given that the block call triggers network, and two requests for the same key be processed
      # at the same time, this ensures the first one wins.
      return @store[key][:payload] if @store[key] && @store[key][:ttl] < now

      @store[key] = { payload: payload, ttl: (ttl || (now + DEFAULT_TTL)) }
    end
    @store[key][:payload]
  end

  def uncache(key)
    @store_mutex.synchronize do
      @store.delete(key)
    end
  end

  private

  def now
    Process.clock_gettime(Process::CLOCK_MONOTONIC)
  end

  # do not use directly!
  def lookup(key, ttl)
    return unless @store.key?(key)

    value = @store[key]

    return if value.empty?

    return unless value[:ttl] > ttl

    value[:payload]
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
rodauth-oauth-1.0.0.pre.beta1 lib/rodauth/oauth/ttl_store.rb
rodauth-oauth-0.10.4 lib/rodauth/oauth/ttl_store.rb
rodauth-oauth-0.10.3 lib/rodauth/oauth/ttl_store.rb
rodauth-oauth-0.10.2 lib/rodauth/oauth/ttl_store.rb
rodauth-oauth-0.10.1 lib/rodauth/oauth/ttl_store.rb
rodauth-oauth-0.10.0 lib/rodauth/oauth/ttl_store.rb
rodauth-oauth-0.9.3 lib/rodauth/oauth/ttl_store.rb
rodauth-oauth-0.9.2 lib/rodauth/oauth/ttl_store.rb
rodauth-oauth-0.9.1 lib/rodauth/oauth/ttl_store.rb
rodauth-oauth-0.9.0 lib/rodauth/oauth/ttl_store.rb