refresh method
- AuthTokenModel? token,
- 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();
}
}