refreshSession method
Implementation
@override
Future<Either<Failure, AuthenticationData>> refreshSession() async {
final currentSessionResult = await getAuthenticatedSession();
return currentSessionResult.fold((l) => left(l), (session) async {
if (session == null) {
return left(NoAuthenticatedFailure());
}
if (config.refreshTokenAPIendpoint != null) {
return wrapAndHandleHttpBaseRequest<AuthenticationData>(
() async {
final Uri uri = config.refreshTokenAPIendpoint!(
session.id, JWT.parse(session.token));
return Request(
config.refreshTokenMethod ?? "POST",
uri,
)
..headers.addAll({
AuthHttpClientKeys.noAuthenticateOverride: "true",
AuthHttpClientKeys.refreshTokenRequestHeader: "true"
})
..body = (await config.customRefreshTokenRequestBodyMapper?.call(
session.refreshToken!,
session.token,
session.deviceInfo,
)) ??
jsonEncode({
"refreshToken": session.refreshToken,
"deviceInfo": session.deviceInfo?.toMap(),
});
},
onResponse: (response, left, right) async {
final tokens = await (config.customRefreshTokenResponseParser?.call(
response.body,
) ??
_defaultRefreshTokenResponseParser(response.body));
// store the new session
await storeAuthDataSession(session.copyWith(
token: tokens.token,
refreshToken: tokens.refreshToken,
));
final newSessionResult = await getAuthenticatedSession();
return newSessionResult.fold((l) {
return left(l);
}, (r) {
if (r == null) {
return left(UnknownFailure(
message: "Error while retrieving refreshed session",
));
}
return right(r);
});
},
);
} else if (config.customRefreshTokenCallback != null) {
return handleDefault<AuthenticationData>((left, right) async {
final tokens = await config.customRefreshTokenCallback
?.call(session.token, session.refreshToken, session.deviceInfo);
if (tokens == null) {
throw Exception(
"config.customRefreshTokenCallback were not able to provide auth tokens");
}
return right(
session.copyWith(
token: tokens.token,
refreshToken: tokens.refreshToken,
),
);
});
}
return left<Failure, AuthenticationData>(
UnknownFailure(
message:
"Cannot refresh authentication since no 'config.refreshTokenAPIendpoint' nor 'config.customRefreshTokenCallback' defined",
),
);
});
}