executeTokenRefresh method

Future<void> executeTokenRefresh()

Executes the token refresh request to the configured endpoint.

Uses a separate Dio instance to avoid interceptor loops. On success, stores the new tokens via authorize. On failure, handles the exception and rethrows.

Throws DioException if the refresh request fails.

Implementation

Future<void> executeTokenRefresh() async {
  final newDioClient = Dio(
    BaseOptions()
      ..baseUrl = options.baseUrl
      ..contentType = Headers.jsonContentType,
  );

  if (loggingOptions.logNetworkTraffic) {
    newDioClient.interceptors.add(
      PrettyDioLogger(
        responseBody: loggingOptions.responseBody,
        requestBody: loggingOptions.requestBody,
        requestHeader: loggingOptions.requestHeader,
        request: loggingOptions.request,
        responseHeader: loggingOptions.responseHeader,
        compact: loggingOptions.compact,
        error: loggingOptions.error,
      ),
    );
  }

  if (options.overrideBadCertificate && !kIsWeb) {
    (dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () {
      final client = HttpClient();

      client.badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;

      return client;
    };
  }

  final currentJwt = await jwt;
  final currentRefreshToken = await refreshToken;

  try {
    final response = await newDioClient.post(
      authOptions.refreshTokenEndpoint,
      options: Options(
        headers:
            authOptions.refreshTokenHeadersBuilder?.call(
              currentJwt ?? '',
              currentRefreshToken ?? '',
            ) ??
            {RestApiClientKeys.authorization: 'Bearer $currentJwt'},
      ),
      data:
          authOptions.refreshTokenBodyBuilder?.call(
            currentJwt ?? '',
            currentRefreshToken ?? '',
          ) ??
          {authOptions.refreshTokenParameterName: currentRefreshToken},
    );

    final resolvedJwt = authOptions.resolveJwt!(response);
    final resolvedRefreshToken = authOptions.resolveRefreshToken!(response);

    await authorize(jwt: resolvedJwt, refreshToken: resolvedRefreshToken);
  } on DioException catch (error) {
    await exceptionHandler.handle(error);

    rethrow;
  }
}