request method

  1. @override
Stream<Response> request(
  1. Request request, [
  2. NextLink? forward
])

A function called when a request reaches this Link

Implementation

@override
Stream<Response> request(Request request, [NextLink? forward]) async* {
  final currentToken = await token;
  final tokenHeaders = currentToken != null
      ? _tokenHeader(currentToken)
      : const <String, String>{};

  final updatedRequest = request.updateContextEntry<HttpLinkHeaders>(
    (headers) => HttpLinkHeaders(
      headers: {
        ...headers?.headers ?? <String, String>{},
      }..addAll(tokenHeaders),
    ),
  );

  if (forward != null) {
    await for (final result in forward(updatedRequest)) {
      final nextToken = await token;
      if (nextToken != null && _shouldRefresh(result)) {
        try {
          final refreshedToken = await _refreshToken(
            nextToken,
            http.Client(),
          );
          await setToken(refreshedToken);
          final tokenHeaders = _tokenHeader(refreshedToken);
          yield* forward(
            request.updateContextEntry<HttpLinkHeaders>(
              (headers) => HttpLinkHeaders(
                headers: {
                  ...headers?.headers ?? <String, String>{},
                }..addAll(tokenHeaders),
              ),
            ),
          );
        } on RevokeTokenException catch (_) {
          unawaited(revokeToken());
          yield result;
        }
      } else {
        yield result;
      }
    }
  }
}