Implementation
Future<String?> get authorization => _lock.lock(() async {
var token = _token.value;
if (token == null) return null;
if (!isTokenValid(token)) {
final refresh = refreshToken;
if (refresh == null) {
_token.value = null;
throw TokenException<T>._(token, 'Token expired', false);
}
try {
token = _token.value = await refresh(token);
} catch (e) {
final cleared = errorShouldClearToken?.call(e) ?? false;
if (cleared) _token.value = null;
throw TokenException<T>._(token!, 'Token refresh failed', !cleared, e);
}
}
return authorize(token);
});