module Aws::RefreshingCredentials

def credentials

Returns:
  • (Credentials) -
def credentials
  refresh_if_near_expiration!
  @credentials
end

def initialize(options = {})

def initialize(options = {})
  @mutex = Mutex.new
  @before_refresh = options.delete(:before_refresh) if Hash === options
  @before_refresh.call(self) if @before_refresh
  refresh
end

def near_expiration?(expiration_length)

def near_expiration?(expiration_length)
  if @expiration
    # Are we within expiration?
    (Time.now.to_i + expiration_length) > @expiration.to_i
  else
    true
  end
end

def refresh!

Returns:
  • (void) -
def refresh!
  @mutex.synchronize do
    @before_refresh.call(self) if @before_refresh
    refresh
  end
end

def refresh_if_near_expiration!

but attempt a refresh in the background.
Otherwise, if we're approaching expiration, use the existing credentials
If we are near to expiration, block while getting new credentials.
Refreshes credentials asynchronously and synchronously.
def refresh_if_near_expiration!
  # Note: This check is an optimization. Rather than acquire the mutex on every #refresh_if_near_expiration
  # call, we check before doing so, and then we check within the mutex to avoid a race condition.
  # See issue: https://github.com/aws/aws-sdk-ruby/issues/2641 for more info.
  if near_expiration?(SYNC_EXPIRATION_LENGTH)
    @mutex.synchronize do
      if near_expiration?(SYNC_EXPIRATION_LENGTH)
        @before_refresh.call(self) if @before_refresh
        refresh
      end
    end
  elsif @async_refresh && near_expiration?(ASYNC_EXPIRATION_LENGTH)
    unless @mutex.locked?
      Thread.new do
        @mutex.synchronize do
          if near_expiration?(ASYNC_EXPIRATION_LENGTH)
            @before_refresh.call(self) if @before_refresh
            refresh
          end
        end
      end
    end
  end
end