refresh method

Future<AuthTokenModel> refresh(
  1. AuthTokenModel? token,
  2. Dio httpClient
)

Matches Fresh's refreshToken callback signature.

Implementation

Future<AuthTokenModel> refresh(AuthTokenModel? token, Dio httpClient) async {
  try {
    if (token == null || token.isEmpty || token.refreshToken.isEmpty) {
      throw RevokeTokenException();
    }

    final Response<dynamic> response = await httpClient.post('/api/token/refresh', data: <String, dynamic>{'refresh_token': token.refreshToken});

    final dynamic data = response.data;

    if (data is! Map<String, dynamic>) {
      _logger.warn(
        '[Fresh] Refresh response not a JSON object',
        extras: <String, Object?>{'endpoint': '/api/token/refresh', 'status': response.statusCode ?? -1},
        escalate: true,
      );

      throw RevokeTokenException();
    }

    final AuthTokenModel? newToken = AuthTokenModel.tryFromJson(data, convert: true);

    if (newToken == null || newToken.isEmpty) {
      _logger.warn(
        '[Fresh] Failed to parse refresh token response',
        extras: <String, Object?>{'endpoint': '/api/token/refresh', 'status': response.statusCode ?? -1},
        escalate: true,
      );

      throw RevokeTokenException();
    }

    return newToken;
  } on RevokeTokenException {
    // Already logged above (parse failure) — just propagate.
    rethrow;
  } catch (e, st) {
    _logger.warn(
      '[Fresh] Refresh token failed (revoking)',
      error: e,
      stackTrace: st,
      extras: const <String, Object?>{'endpoint': '/api/token/refresh'},
      escalate: true,
    );
    throw RevokeTokenException();
  }
}