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

      var dataRefresh = {"refreshToken": rt};
      //check enc
      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};
      }

      var response = await dio2.request(
        appUrl + "/services/auth",
        data: dataRefresh,
        options: Options(method: "PATCH", headers: headers),
      );
      // print(response.requestOptions);
      // print(response);

      //check enc
      if (commonEncMode) {
        var ct = chiperType.fromJson(response.data);
        // print(ct.cipherText);

        var decrypt = await payloadEnc.decryptData(ct.cipherText!, keySet!);
        var jsondecode = json.decode(decrypt);

        response.data = jsondecode;
      }

      var res = RefreshTokenResponse.fromJson(response.data);
      //set new token & expiry
      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");
      handler.next(opts);
    } on DioError catch (e) {
      var title = e.response!.data["errors"]![0];
      // print("ERROR--CHECK--EXPIRY");
      if (title["code"] == "IVREF") {
        var evtCb = this.opts!.options?.eventCallback;
        evtCb({"name": "invalid_refresh_token"});
      }
      // print(e.message);
      handler.reject(e);
    } catch (e) {
      // print(e);
    }
  } else {
    // print("NO NEED REFRESH");
    handler.next(opts);
  }
}