From 504a703e11dc2616313bd1675e428f19df3360e9 Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Tue, 24 Sep 2024 16:48:08 -0500 Subject: [PATCH] fixup! Update IAM manager & backend service with retry logic, optional headers --- .../internal/InAppMessagesManager.kt | 3 +- .../internal/backend/IInAppBackendService.kt | 2 +- .../backend/impl/InAppBackendService.kt | 61 +++++++++---------- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt index 690db44366..80b4071daa 100644 --- a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt +++ b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt @@ -4,6 +4,7 @@ import android.app.AlertDialog import com.onesignal.common.AndroidUtils import com.onesignal.common.IDManager import com.onesignal.common.JSONUtils +import com.onesignal.common.consistency.IamFetchReadyCondition import com.onesignal.common.consistency.models.IConsistencyManager import com.onesignal.common.events.EventProducer import com.onesignal.common.exceptions.BackendException @@ -240,7 +241,7 @@ internal class InAppMessagesManager( } // called when a new push subscription is added, or the app id is updated, or a new session starts - private suspend fun fetchMessages(rywToken: String) { + private suspend fun fetchMessages(rywToken: String?) { // We only want to fetch IAMs if we know the app is in the // foreground, as we don't want to do this for background // events (such as push received), wasting resources for diff --git a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/backend/IInAppBackendService.kt b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/backend/IInAppBackendService.kt index da093595e1..85db9f6896 100644 --- a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/backend/IInAppBackendService.kt +++ b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/backend/IInAppBackendService.kt @@ -21,7 +21,7 @@ internal interface IInAppBackendService { suspend fun listInAppMessages( appId: String, subscriptionId: String, - rywToken: String, + rywToken: String?, sessionDurationProvider: () -> Long, ): List? diff --git a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/backend/impl/InAppBackendService.kt b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/backend/impl/InAppBackendService.kt index 78312fef8d..ad260cc5ef 100644 --- a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/backend/impl/InAppBackendService.kt +++ b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/backend/impl/InAppBackendService.kt @@ -25,7 +25,7 @@ internal class InAppBackendService( override suspend fun listInAppMessages( appId: String, subscriptionId: String, - rywToken: String, + rywToken: String?, sessionDurationProvider: () -> Long, ): List? { val baseUrl = "apps/$appId/subscriptions/$subscriptionId/iams" @@ -202,44 +202,41 @@ internal class InAppBackendService( private suspend fun attemptFetchWithRetries( baseUrl: String, - rywToken: String, + rywToken: String?, sessionDurationProvider: () -> Long, ): List? { var attempts = 1 var retryLimit: Int? = null // Retry limit will be determined dynamically - // We use RYW_TOKEN_NOT_PROVIDED to designate the backend not returning a RYW token - if (rywToken != ConsistencyManager.RYW_TOKEN_NOT_PROVIDED) { - while (retryLimit == null || attempts <= retryLimit + 1) { - val retryCount = if (attempts > 1) attempts - 1 else null - val values = - OptionalHeaders( - rywToken = rywToken, - sessionDuration = sessionDurationProvider(), - retryCount = retryCount, - ) - val response = _httpClient.get(baseUrl, values) - - if (response.isSuccess) { - val jsonResponse = response.payload?.let { JSONObject(it) } - return jsonResponse?.let { hydrateInAppMessages(it) } - } else if (response.statusCode == 425 || response.statusCode == 429) { - // Dynamically update the retry limit from response - retryLimit = response.retryLimit ?: retryLimit - - // Apply the Retry-After delay if present, otherwise proceed without delay - val retryAfter = response.retryAfterSeconds - if (retryAfter != null) { - delay(retryAfter * 1_000L) - } - } else if (response.statusCode in 500..599) { - return null - } else { - return null + while (retryLimit == null || attempts <= retryLimit + 1) { + val retryCount = if (attempts > 1) attempts - 1 else null + val values = + OptionalHeaders( + rywToken = rywToken, + sessionDuration = sessionDurationProvider(), + retryCount = retryCount, + ) + val response = _httpClient.get(baseUrl, values) + + if (response.isSuccess) { + val jsonResponse = response.payload?.let { JSONObject(it) } + return jsonResponse?.let { hydrateInAppMessages(it) } + } else if (response.statusCode == 425 || response.statusCode == 429) { + // Dynamically update the retry limit from response + retryLimit = response.retryLimit ?: retryLimit + + // Apply the Retry-After delay if present, otherwise proceed without delay + val retryAfter = response.retryAfterSeconds + if (retryAfter != null) { + delay(retryAfter * 1_000L) } - - attempts++ + } else if (response.statusCode in 500..599) { + return null + } else { + return null } + + attempts++ } // Final attempt without the RYW token if retries fail