refreshSession method

  1. @override
Future<Either<Failure, AuthenticationData>> refreshSession()
override

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",
      ),
    );
  });
}