refreshAccessToken method

  1. @override
Future<void> refreshAccessToken()

Implementation

@override
Future<void> refreshAccessToken() async {
  doRefreshAccessToken() async {
    final refreshToken = _refreshToken;
    if (refreshToken == null) {
      await _clearSession(SessionStateChangeReason.noToken);
      return;
    }

    String? deviceSecret = await _sharedStorage.getDeviceSecret(name);

    final xDeviceInfo = await _getXDeviceInfo();
    final tokenRequest = OIDCTokenRequest(
      grantType: GrantType.refreshToken,
      clientID: clientID,
      refreshToken: refreshToken,
      xDeviceInfo: xDeviceInfo,
      deviceSecret: deviceSecret,
    );
    try {
      final tokenResponse = await _apiClient.sendTokenRequest(tokenRequest);
      await _persistTokenResponse(
          tokenResponse, SessionStateChangeReason.foundToken);
    } catch (e) {
      await _handleInvalidGrantException(e);
      if (e is OAuthException && e.error == "invalid_grant") {
        return;
      }
      rethrow;
    }
  }

  if (_refreshAccessTokenTask != null) {
    return await _refreshAccessTokenTask;
  }
  final newTask = doRefreshAccessToken();
  _refreshAccessTokenTask = newTask;
  try {
    return await newTask;
  } finally {
    if (_refreshAccessTokenTask == newTask) {
      _refreshAccessTokenTask = null;
    }
  }
}