From f9d8b0cc83d5cc4d9a64bf0d475a01aac5f5c978 Mon Sep 17 00:00:00 2001 From: Akshay Ayyanchira Date: Fri, 7 Mar 2025 15:53:38 -0800 Subject: [PATCH] [MOB-10947] - Adding RetryPolicy on TS and Android RN app should be able to pass RetryPolicy in configuration. iOS part is still pending. --- .../com/iterable/reactnative/Serialization.java | 13 +++++++++++++ example/src/hooks/useIterableApp.tsx | 8 +++++++- src/core/classes/IterableConfig.ts | 9 ++++++++- src/core/enums/IterableRetryBackoffType.ts | 7 +++++++ src/core/enums/index.ts | 1 + src/core/types/IterableRetryPolicy.ts | 17 +++++++++++++++++ src/core/types/index.ts | 1 + src/index.tsx | 3 ++- 8 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 src/core/enums/IterableRetryBackoffType.ts create mode 100644 src/core/types/IterableRetryPolicy.ts diff --git a/android/src/main/java/com/iterable/reactnative/Serialization.java b/android/src/main/java/com/iterable/reactnative/Serialization.java index 707488797..2ef322057 100644 --- a/android/src/main/java/com/iterable/reactnative/Serialization.java +++ b/android/src/main/java/com/iterable/reactnative/Serialization.java @@ -24,6 +24,7 @@ import com.iterable.iterableapi.IterableInboxSession; import com.iterable.iterableapi.IterableLogger; import com.iterable.iterableapi.RNIterableInternal; +import com.iterable.iterableapi.RetryPolicy; import org.json.JSONArray; import org.json.JSONException; @@ -217,6 +218,18 @@ static IterableConfig.Builder getConfigFromReadableMap(ReadableMap iterableConte configBuilder.setDataRegion(iterableDataRegion); } + if (iterableContextJSON.has("retryPolicy")) { + JSONObject retryPolicyJson = iterableContextJSON.getJSONObject("retryPolicy"); + int maxRetry = retryPolicyJson.getInt("maxRetry"); + long retryInterval = retryPolicyJson.getLong("retryInterval"); + String retryBackoff = retryPolicyJson.getString("retryBackoff"); + RetryPolicy.Type retryPolicyType = RetryPolicy.Type.LINEAR; + if (retryBackoff.equals("EXPONENTIAL")) { + retryPolicyType = RetryPolicy.Type.EXPONENTIAL; + } + configBuilder.setAuthRetryPolicy(new RetryPolicy(maxRetry, retryInterval, retryPolicyType)); + } + return configBuilder; } catch (JSONException e) { e.printStackTrace(); diff --git a/example/src/hooks/useIterableApp.tsx b/example/src/hooks/useIterableApp.tsx index 79d4f6645..e037fccd0 100644 --- a/example/src/hooks/useIterableApp.tsx +++ b/example/src/hooks/useIterableApp.tsx @@ -18,7 +18,7 @@ import { import { Route } from '../constants/routes'; import type { RootStackParamList } from '../types/navigation'; -import type { IterableAuthFailure } from '../../../src/core'; +import { type IterableAuthFailure, IterableRetryBackoffType } from '../../../src/core'; type Navigation = StackNavigationProp; @@ -148,6 +148,12 @@ export const IterableAppProvider: FunctionComponent< config.logLevel = IterableLogLevel.debug; + config.retryPolicy = { + maxRetry: 5, + retryInterval: 10, + retryBackoff: IterableRetryBackoffType.LINEAR + } + config.inAppHandler = () => IterableInAppShowResponse.show; config.authHandler = () => { diff --git a/src/core/classes/IterableConfig.ts b/src/core/classes/IterableConfig.ts index 89241a2db..488839701 100644 --- a/src/core/classes/IterableConfig.ts +++ b/src/core/classes/IterableConfig.ts @@ -4,10 +4,10 @@ import { IterableLogLevel, IterablePushPlatform, } from '../enums'; +import type { IterableRetryPolicy, IterableAuthFailure } from '../types'; import { IterableAction } from './IterableAction'; import type { IterableActionContext } from './IterableActionContext'; import type { IterableAuthResponse } from './IterableAuthResponse'; -import type { IterableAuthFailure } from '../types/IterableAuthFailure'; /** * An IterableConfig object sets various properties of the SDK. * @@ -302,6 +302,12 @@ export class IterableConfig { */ encryptionEnforced = false; + /** + * Configuration for JWT refresh retry behavior. + * If not specified, the SDK will use default retry behavior. + */ + retryPolicy?: IterableRetryPolicy; + /** * Converts the IterableConfig instance to a dictionary object. * @@ -350,6 +356,7 @@ export class IterableConfig { dataRegion: this.dataRegion, pushPlatform: this.pushPlatform, encryptionEnforced: this.encryptionEnforced, + retryPolicy: this.retryPolicy, }; } } diff --git a/src/core/enums/IterableRetryBackoffType.ts b/src/core/enums/IterableRetryBackoffType.ts new file mode 100644 index 000000000..cde2635bc --- /dev/null +++ b/src/core/enums/IterableRetryBackoffType.ts @@ -0,0 +1,7 @@ +/** + * Enum representing the type of backoff pattern to apply between retry attempts. + */ +export enum IterableRetryBackoffType { + LINEAR = 'LINEAR', + EXPONENTIAL = 'EXPONENTIAL', +} \ No newline at end of file diff --git a/src/core/enums/index.ts b/src/core/enums/index.ts index e95b5350c..ab6ceecd0 100644 --- a/src/core/enums/index.ts +++ b/src/core/enums/index.ts @@ -4,3 +4,4 @@ export * from './IterableDataRegion'; export * from './IterableEventName'; export * from './IterableLogLevel'; export * from './IterablePushPlatform'; +export * from './IterableRetryBackoffType'; \ No newline at end of file diff --git a/src/core/types/IterableRetryPolicy.ts b/src/core/types/IterableRetryPolicy.ts new file mode 100644 index 000000000..f302ccd69 --- /dev/null +++ b/src/core/types/IterableRetryPolicy.ts @@ -0,0 +1,17 @@ +import { IterableRetryBackoffType } from '../enums/IterableRetryBackoffType'; + +/** + * Configuration class for JWT refresh retry behavior. + * Maps to the native RetryPolicy class in Android/iOS SDKs. + */ +export interface IterableRetryPolicy { + /** Number of consecutive JWT refresh retries the SDK should attempt */ + maxRetry: number; + /** + * Duration between JWT refresh retries in seconds + * (starting point for retry backoff) + */ + retryInterval: number; + /** The backoff pattern to apply between retry attempts */ + retryBackoff: IterableRetryBackoffType; +} \ No newline at end of file diff --git a/src/core/types/index.ts b/src/core/types/index.ts index 59d81ce03..91c7d4850 100644 --- a/src/core/types/index.ts +++ b/src/core/types/index.ts @@ -1,2 +1,3 @@ export * from './IterableEdgeInsetDetails'; export * from './IterableAuthFailure'; +export * from './IterableRetryPolicy'; diff --git a/src/index.tsx b/src/index.tsx index 885cd74bd..7d6275710 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -18,13 +18,14 @@ export { IterableEventName, IterableLogLevel, IterablePushPlatform, + IterableRetryBackoffType, } from './core/enums'; export { useAppStateListener, useDeviceOrientation, type IterableDeviceOrientation, } from './core/hooks'; -export { type IterableEdgeInsetDetails } from './core/types'; +export type { IterableEdgeInsetDetails, IterableRetryPolicy, IterableAuthFailure } from './core/types'; export { IterableHtmlInAppContent, IterableInAppCloseSource,