Skip to content

Commit 1107ded

Browse files
Retry track event requests
1 parent 8fa51ac commit 1107ded

File tree

4 files changed

+111
-16
lines changed

4 files changed

+111
-16
lines changed

swift-sdk/Internal/NetworkHelper.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,14 @@ struct NetworkHelper {
8383
switch result {
8484
case let .success(value):
8585
#if NETWORK_DEBUG
86-
print("request with requestId: \(requestId) successfully sent")
86+
print("request with id: \(requestId) successfully sent, response:")
87+
print(value)
8788
#endif
8889
fulfill.resolve(with: value)
8990
case let .failure(error):
9091
#if NETWORK_DEBUG
9192
print("request with id: \(requestId) errored")
93+
print(error)
9294
#endif
9395
fulfill.reject(with: error)
9496
}

swift-sdk/Internal/OnlineRequestProcessor.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ struct OnlineRequestProcessor: RequestProcessorProtocol {
119119
applyCallbacks(successHandler: onSuccess,
120120
andFailureHandler: onFailure,
121121
withIdentifier: "trackEvent",
122-
forResult: apiClient.track(event: event, dataFields: dataFields))
122+
forRequest: { apiClient.track(event: event, dataFields: dataFields) } )
123123
}
124124

125125
@discardableResult
@@ -258,6 +258,17 @@ struct OnlineRequestProcessor: RequestProcessorProtocol {
258258
withIdentifier: "disableDevice",
259259
forResult: apiClient.disableDevice(forAllUsers: allUsers, hexToken: hexToken))
260260
}
261+
262+
private func applyCallbacks(successHandler onSuccess: OnSuccessHandler? = nil,
263+
andFailureHandler onFailure: OnFailureHandler? = nil,
264+
withIdentifier identifier: String,
265+
forRequest request: @escaping () -> Pending<SendRequestValue, SendRequestError>) -> Pending<SendRequestValue, SendRequestError> {
266+
RequestProcessorUtil.apply(successHandler: onSuccess,
267+
andFailureHandler: onFailure,
268+
andAuthManager: authManager,
269+
forRequest: request,
270+
withIdentifier: identifier)
271+
}
261272

262273
private func applyCallbacks(successHandler onSuccess: OnSuccessHandler? = nil,
263274
andFailureHandler onFailure: OnFailureHandler? = nil,

swift-sdk/Internal/RequestProcessorUtil.swift

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,31 @@
55
import Foundation
66

77
struct RequestProcessorUtil {
8+
@discardableResult
9+
static func apply(successHandler onSuccess: OnSuccessHandler? = nil,
10+
andFailureHandler onFailure: OnFailureHandler? = nil,
11+
andAuthManager authManager: IterableAuthManagerProtocol? = nil,
12+
forRequest requestProvider: @escaping () -> Pending<SendRequestValue, SendRequestError>,
13+
withIdentifier identifier: String) -> Pending<SendRequestValue, SendRequestError> {
14+
let result = Fulfill<SendRequestValue, SendRequestError>()
15+
requestProvider().onSuccess { json in
16+
reportSuccess(result: result, value: json, successHandler: onSuccess, identifier: identifier)
17+
}
18+
.onError { error in
19+
requestProvider().onSuccess { json in
20+
reportSuccess(result: result, value: json, successHandler: onSuccess, identifier: identifier)
21+
}.onError { error in
22+
if let onFailure = onFailure {
23+
onFailure(error.reason, error.data)
24+
} else {
25+
defaultOnFailure(identifier)(error.reason, error.data)
26+
}
27+
result.reject(with: error)
28+
}
29+
}
30+
return result
31+
}
32+
833
@discardableResult
934
static func apply(successHandler onSuccess: OnSuccessHandler? = nil,
1035
andFailureHandler onFailure: OnFailureHandler? = nil,
@@ -34,26 +59,38 @@ struct RequestProcessorUtil {
3459
return result
3560
}
3661

37-
private static func defaultOnSuccess(_ identifier: String) -> OnSuccessHandler {
38-
{ data in
39-
if let data = data {
40-
ITBInfo("\(identifier) succeeded, got response: \(data)")
62+
private static func reportSuccess(result: Fulfill<SendRequestValue, SendRequestError>,
63+
value: SendRequestValue,
64+
successHandler onSuccess: OnSuccessHandler?,
65+
identifier: String) {
66+
if let onSuccess = onSuccess {
67+
onSuccess(value)
4168
} else {
42-
ITBInfo("\(identifier) succeeded.")
69+
Self.defaultOnSuccess(identifier)(value)
4370
}
71+
result.resolve(with: value)
72+
}
73+
74+
private static func defaultOnSuccess(_ identifier: String) -> OnSuccessHandler {
75+
{ data in
76+
if let data = data {
77+
ITBInfo("\(identifier) succeeded, got response: \(data)")
78+
} else {
79+
ITBInfo("\(identifier) succeeded.")
80+
}
4481
}
4582
}
4683

4784
private static func defaultOnFailure(_ identifier: String) -> OnFailureHandler {
48-
{ reason, data in
49-
var toLog = "\(identifier) failed:"
50-
if let reason = reason {
51-
toLog += ", \(reason)"
52-
}
53-
if let data = data {
54-
toLog += ", got response \(String(data: data, encoding: .utf8) ?? "nil")"
55-
}
56-
ITBError(toLog)
85+
{ reason, data in
86+
var toLog = "\(identifier) failed:"
87+
if let reason = reason {
88+
toLog += ", \(reason)"
89+
}
90+
if let data = data {
91+
toLog += ", got response \(String(data: data, encoding: .utf8) ?? "nil")"
92+
}
93+
ITBError(toLog)
5794
}
5895
}
5996
}

tests/unit-tests/AuthTests.swift

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,51 @@ class AuthTests: XCTestCase {
753753
wait(for: [condition1], timeout: testExpectationTimeoutForInverted)
754754
}
755755

756+
func testRetryJwtFailure() throws {
757+
let expectation1 = expectation(description: "called track request")
758+
expectation1.expectedFulfillmentCount = 2
759+
let expectation2 = expectation(description: "pass in second attempt")
760+
761+
let config = IterableConfig()
762+
let authDelegate = createStockAuthDelegate()
763+
config.authDelegate = authDelegate
764+
765+
var callNumber = 0
766+
let networkSession = MockNetworkSession()
767+
networkSession.responseCallback = { url in
768+
if url.absoluteString.contains("track") {
769+
callNumber += 1
770+
if callNumber == 1 {
771+
return MockNetworkSession.MockResponse(statusCode: 401,
772+
data: [JsonKey.Response.iterableCode: JsonValue.Code.invalidJwtPayload].toJsonData())
773+
} else {
774+
return MockNetworkSession.MockResponse()
775+
}
776+
} else {
777+
return MockNetworkSession.MockResponse()
778+
}
779+
}
780+
networkSession.requestCallback = { request in
781+
if request.url?.absoluteString.contains("track") == true {
782+
expectation1.fulfill()
783+
}
784+
}
785+
786+
let api = InternalIterableAPI.initializeForTesting(
787+
config: config,
788+
networkSession: networkSession
789+
)
790+
api.userId = "some-user-id"
791+
api.track("some-event").onSuccess { _ in
792+
print("success")
793+
expectation2.fulfill()
794+
}.onError { error in
795+
print("error, \(error)")
796+
XCTFail()
797+
}
798+
wait(for: [expectation1, expectation2], timeout: testExpectationTimeout)
799+
}
800+
756801
// MARK: - Private
757802

758803
class DefaultAuthDelegate: IterableAuthDelegate {

0 commit comments

Comments
 (0)