Skip to content

Commit 4bd7f14

Browse files
committed
Fixes realted to authRetry
updates related to retrymechanism from the apply function Set authtoken=null scenario to better manage API retries
1 parent 2218703 commit 4bd7f14

File tree

3 files changed

+23
-15
lines changed

3 files changed

+23
-15
lines changed

swift-sdk/Internal/AuthManager.swift

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150,23 +150,21 @@ class AuthManager: IterableAuthManagerProtocol {
150150

151151
pendingAuth = false
152152

153-
guard retrievedAuthToken != nil else {
154-
delegate?.onTokenRegistrationFailed("auth token was nil, scheduling auth token retrieval in 10 seconds")
153+
if retrievedAuthToken != nil {
154+
let isRefreshQueued = queueAuthTokenExpirationRefresh(retrievedAuthToken, onSuccess: onSuccess)
155+
if !isRefreshQueued {
156+
onSuccess?(authToken)
157+
}
158+
} else {
159+
delegate?.onTokenRegistrationFailed("auth token was nil, scheduling auth token retrieval in \(getNextRetryInterval()) seconds")
155160

156161
/// by default, schedule a refresh for 10s
157162
scheduleAuthTokenRefreshTimer(interval: getNextRetryInterval(), successCallback: onSuccess)
158-
159-
return
160163
}
161164

162165
authToken = retrievedAuthToken
163166

164167
storeAuthToken()
165-
166-
let isRefreshQueued = queueAuthTokenExpirationRefresh(authToken, onSuccess: onSuccess)
167-
if !isRefreshQueued {
168-
onSuccess?(authToken)
169-
}
170168
}
171169

172170
private func queueAuthTokenExpirationRefresh(_ authToken: String?, onSuccess: AuthTokenRetrievalHandler? = nil) -> Bool {

swift-sdk/Internal/OfflineRequestProcessor.swift

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ struct OfflineRequestProcessor: RequestProcessorProtocol {
319319
return RequestCreator(auth: authProvider.auth, deviceMetadata: deviceMetadata)
320320
}
321321

322-
private func sendIterableRequest(requestGenerator: (RequestCreator) -> Result<IterableRequest, IterableError>,
322+
private func sendIterableRequest(requestGenerator: @escaping (RequestCreator) -> Result<IterableRequest, IterableError>,
323323
successHandler onSuccess: OnSuccessHandler?,
324324
failureHandler onFailure: OnFailureHandler?,
325325
identifier: String) -> Pending<SendRequestValue, SendRequestError> {
@@ -343,11 +343,24 @@ struct OfflineRequestProcessor: RequestProcessorProtocol {
343343
SendRequestError.from(error: error)
344344
}.flatMap { taskId -> Pending<SendRequestValue, SendRequestError> in
345345
let pendingTask = notificationListener.futureFromTask(withTaskId: taskId)
346-
return RequestProcessorUtil.apply(successHandler: onSuccess,
346+
let result = RequestProcessorUtil.apply(successHandler: onSuccess,
347347
andFailureHandler: onFailure,
348348
andAuthManager: authManager,
349349
toResult: pendingTask,
350350
withIdentifier: identifier)
351+
result.onError { error in
352+
if error.httpStatusCode == 401, RequestProcessorUtil.matchesJWTErrorCode(error.iterableCode) {
353+
authManager?.setIsLastAuthTokenValid(false)
354+
let retryInterval = authManager?.getNextRetryInterval() ?? 1
355+
DispatchQueue.main.async {
356+
authManager?.scheduleAuthTokenRefreshTimer(interval: retryInterval, isScheduledRefresh: false, successCallback: { _ in
357+
_ = sendIterableRequest(requestGenerator: requestGenerator, successHandler: onSuccess, failureHandler: onFailure, identifier: identifier)
358+
})
359+
}
360+
361+
}
362+
}
363+
return result
351364
}
352365
}
353366

swift-sdk/Internal/RequestProcessorUtil.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ struct RequestProcessorUtil {
5353
}.onError { error in
5454
if error.httpStatusCode == 401, matchesJWTErrorCode(error.iterableCode) {
5555
ITBError(error.reason)
56-
authManager?.setIsLastAuthTokenValid(false)
57-
let retryInterval = authManager?.getNextRetryInterval() ?? 1
58-
authManager?.scheduleAuthTokenRefreshTimer(interval: retryInterval, isScheduledRefresh: false, successCallback: nil)
5956
} else if error.httpStatusCode == 401, error.iterableCode == JsonValue.Code.badApiKey {
6057
ITBError(error.reason)
6158
}
@@ -126,7 +123,7 @@ struct RequestProcessorUtil {
126123
}
127124
}
128125

129-
private static func matchesJWTErrorCode(_ errorCode: String?) -> Bool {
126+
public static func matchesJWTErrorCode(_ errorCode: String?) -> Bool {
130127
return errorCode == JsonValue.Code.invalidJwtPayload || errorCode == JsonValue.Code.badAuthorizationHeader || errorCode == JsonValue.Code.jwtUserIdentifiersMismatched
131128
}
132129
}

0 commit comments

Comments
 (0)