fetch method

  1. @override
Future<TokenSourceResponse> fetch(
  1. TokenRequestOptions options
)
override

Implementation

@override
Future<TokenSourceResponse> fetch(TokenRequestOptions options) async {
  final existingCompleter = _inflightRequests[options];
  if (existingCompleter != null && existingCompleter.isActive) {
    return existingCompleter.future;
  }

  final completer = existingCompleter ?? ReusableCompleter<TokenSourceResponse>();
  _inflightRequests[options] = completer;
  final resultFuture = completer.future;

  try {
    final cached = await _store.retrieve();
    if (cached != null && cached.options == options && _validator(cached.options, cached.response)) {
      completer.complete(cached.response);
      return resultFuture;
    }

    final response = await _wrapped.fetch(options);
    await _store.store(options, response);
    completer.complete(response);
    return resultFuture;
  } catch (e, stackTrace) {
    completer.completeError(e, stackTrace);
    rethrow;
  } finally {
    _inflightRequests.remove(options);
  }
}