checkExpiry method
Future<void>
checkExpiry(
- RequestOptions opts,
- 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"));
}
}
}
}