checkExpiry method

Future<void> checkExpiry(
  1. RequestOptions opts,
  2. RequestInterceptorHandler handler
)

Implementation

Future<void> checkExpiry(
    RequestOptions opts, RequestInterceptorHandler handler) async {
  //get current token expiry
  // print("CHECK EXP");
  var retryCount = 0;
  final maxRetries = 5;

  while (retryCount < maxRetries) {
    try {
      var dio2 = Dio();
      final prefs = await SharedPreferences.getInstance();
      var expCurrent = DateTime.parse(prefs.getString(prefixExpiryToken)!);
      var timenow = DateTime.now();

      // print(expCurrent);
      // print(timenow);

      var gep = timenow.difference(expCurrent).inSeconds;
      // print(gep);
      if (gep > expiryThreshold) {
        // print("Must Reload");
        var rt = prefs.getString(prefixRefreshToken);
        var ua = prefs.getString("ua");
        final info = await PackageInfo.fromPlatform();
        // print(rt);

        Map<String, Object?>? keySet;
        var headers = {
          "User-Agent": ua,
          "x-app-id": info.packageName,
          "accept": defaultType,
          Headers.contentTypeHeader: defaultType
        };

        var dataRefresh = {"refreshToken": rt};
        if (commonEncMode) {
          keySet = await payloadEnc.generateKeyPair();
          var encryptData = await payloadEnc.encryptData(dataRefresh, keySet);
          var newPayload = {"cipherText": encryptData};
          dataRefresh = newPayload;
          final base64Str = buildEncKeyHeader(keySet);
          headers = {...headers, encryptionKeyLabel: base64Str};
        }
        // print("REFRESH TOKEN START");
        var response = await dio2.request(
          appUrl + "/services/auth",
          data: dataRefresh,
          options: Options(method: "PATCH", headers: headers),
        );
        // print("${RefreshTokenResponse.fromJson(response.data)}");
        // print("REFRESH TOKEN END");


        if (commonEncMode) {
          var ct = chiperType.fromJson(response.data);
          var decrypt = await payloadEnc.decryptData(ct.cipherText!, keySet!);
          var jsondecode = json.decode(decrypt);
          response.data = jsondecode;
        }

        var res = RefreshTokenResponse.fromJson(response.data);
        prefs.setString(
            prefixRefreshToken, res.data!.attributes!.refreshToken!);
        prefs.setString(prefixAccessToken, res.data!.attributes!.accessToken!);
        prefs.setString(prefixExpiryToken, res.data!.attributes!.expiry!);

        var atNew = res.data!.attributes!.accessToken!;

        opts.headers.update("Authorization", (value) => "Bearer $atNew");
        return handler.next(opts);
      } else {
        return handler.next(opts);
      }
    } on DioError catch (e) {
      retryCount++;
      // print("RETRY-COUNT: $retryCount");
      if (retryCount == maxRetries) {
        var evtCb = this.opts!.options?.eventCallback;
        // print("ERROR--CHECK--EXPIRY after $maxRetries retries");
        if (evtCb != null) {
          evtCb({"name": "invalid_refresh_token"});
        }
        return handler.reject(e);
      }
      await Future.delayed(Duration(seconds: 1)); // Add delay between retries
    } catch (e) {
      retryCount++;
      if (retryCount == maxRetries) {
        return handler.reject(DioError(
            requestOptions: opts,
            error: "Failed after $maxRetries retries: $e"));
      }
    }
  }
}