withAuth function
Implementation
Rester withAuth(Rester rester) {
Future<Response> fn(
Uri url, {
Map<String, String>? headers,
Object? body,
Encoding? encoding,
}) async {
final accessToken = findAccessToken();
if (accessToken != null) {
final authorizedHeaders = {
"Authorization": "Bearer $accessToken",
};
if (headers != null) {
authorizedHeaders.addAll(headers);
}
final response = await rester(
url,
headers: authorizedHeaders,
body: body,
encoding: encoding,
);
if (response.statusCode != 401) {
return response;
}
}
report("Try to refresh ...");
await Future.delayed(const Duration(milliseconds: 1000));
final refreshToken = await findRefreshToken();
if (refreshToken == null) {
return Response(
jsonEncode({
"message": "로그인이 필요합니다.",
}),
404,
);
}
final response = await withRetry(withPostLog(post))(
endpoint("auth/refresh"),
body: jsonEncode({
"refreshToken": refreshToken,
}),
);
switch (response.state) {
case ResterResponseState.success:
saveAccessToken(response.json["accessToken"]);
dispatch(const AuthRefreshResolved());
return fn(url, headers: headers, body: body, encoding: encoding);
case ResterResponseState.failure:
await deleteRefreshToken();
dispatch(AuthRefreshRejected(response.message));
return response;
}
}
return fn;
}