module Aws::RefreshingCredentials
def credentials
-
(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!
-
(void)
-
def refresh! @mutex.synchronize do @before_refresh.call(self) if @before_refresh refresh end end
def refresh_if_near_expiration!
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