Dart client: cleanup make refresh token a free function to make the intent clearer.

This commit is contained in:
Sebastian Jeltsch 2026-03-26 12:27:24 +01:00
parent 3b96652888
commit 970c9e0cbd
2 changed files with 21 additions and 13 deletions

View file

@ -356,7 +356,8 @@ class RecordApi {
final refreshToken = _client._tokenState._shouldRefresh();
if (refreshToken != null) {
_client._tokenState = await _client._refreshTokensImpl(refreshToken);
_client._tokenState =
await _refreshTokensImpl(_client._transport, refreshToken);
}
final uri = _client._baseUrl.replace(
@ -539,7 +540,7 @@ class Client {
Future<void> refreshAuthToken() async {
final refreshToken = _tokenState._shouldRefresh();
if (refreshToken != null) {
_tokenState = await _refreshTokensImpl(refreshToken);
_tokenState = await _refreshTokensImpl(_transport, refreshToken);
}
}
@ -552,7 +553,7 @@ class Client {
}) async {
final refreshToken = _tokenState._shouldRefresh();
if (refreshToken != null) {
_tokenState = await _refreshTokensImpl(refreshToken);
_tokenState = await _refreshTokensImpl(_transport, refreshToken);
}
final response = await _transport.fetch(
@ -590,19 +591,24 @@ class Client {
return state;
}
}
Future<_TokenState> _refreshTokensImpl(String refreshToken) async {
final response = await _transport.fetch('${_authApi}/refresh',
method: Method.post,
headers: _tokenState.headers,
body: jsonEncode({
'refresh_token': refreshToken,
}));
Future<_TokenState> _refreshTokensImpl(
Transport transport,
String refreshToken,
) async {
// NOTE: We cannot use `Client.fetch`, which may refresh tokens to prevent a loop.
final response = await transport.fetch('${_authApi}/refresh',
method: Method.post,
body: jsonEncode({
'refresh_token': refreshToken,
}));
final tokens = Tokens.fromJson(jsonDecode(response.body));
assert(tokens.refresh == refreshToken);
return _updateTokens(tokens);
if (response.statusCode != 200) {
throw HttpException(response.statusCode, response.body);
}
return _TokenState.build(Tokens.fromJson(jsonDecode(response.body)));
}
Map<String, String> _buildHeaders(Tokens? tokens) {

View file

@ -262,6 +262,8 @@ Future<void> main() async {
await client.logout();
expect(client.tokens(), isNull);
await client.refreshAuthToken();
// We need to wait a little to push the expiry time in seconds to avoid just getting the same token minted again.
await Future.delayed(Duration(milliseconds: 1500));