refreshSession method

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

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>(
        () {
          final Uri uri = config.refreshTokenAPIendpoint!(session.id, JWT.parse(session.token));
          return Request(
            config.refreshTokenMethod ?? "POST",
            uri,
          )
            ..headers.addAll({
              AuthHttpClientKeys.noAuthenticateOverride: "true",
            })
            ..body = jsonEncode(config.customRefreshTokenRequestBodyMapper?.call(
                  session.refreshToken!,
                  session.token,
                  session.deviceInfo,
                ) ??
                {
                  "refreshToken": session.refreshToken,
                  "deviceInfo": session.deviceInfo?.toMap(),
                });
        },
        onResponse: (response, left, right) async {
          final tokens = await config.customRefreshTokenResponseParser?.call(
                jsonDecode(response.body),
              ) ??
              _defaultRefreshTokenResponseParser(response.body);

          // store the new session
          await storeAuthDataSession(session.copyWith(
            token: tokens[AuthSharedPrefKeys.TOKEN_KEY],
            refreshToken: tokens[AuthSharedPrefKeys.REFRESH_KEY],
          ));

          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 || !tokens.containsKey(AuthSharedPrefKeys.TOKEN_KEY)) {
          throw Exception("config.customRefreshTokenCallback were not able to provide auth tokens");
        }
        return right(
          session.copyWith(
            token: tokens[AuthSharedPrefKeys.TOKEN_KEY],
            refreshToken: tokens[AuthSharedPrefKeys.REFRESH_KEY],
          ),
        );
      });
    }
    return left<Failure, AuthenticationData>(
      UnknownFailure(
        message:
            "Cannot refresh authentication since no 'config.refreshTokenAPIendpoint' nor 'config.customRefreshTokenCallback' defined",
      ),
    );
  });
}