react-native-stallion 2.4.0-alpha.5 → 2.4.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +178 -32
  2. package/android/src/main/cpp/CMakeLists.txt +4 -0
  3. package/android/src/main/java/com/stallion/StallionModule.java +15 -5
  4. package/android/src/main/java/com/stallion/networkmanager/StallionApiConstants.java +22 -1
  5. package/android/src/main/java/com/stallion/networkmanager/StallionSyncHandler.java +1 -1
  6. package/android/src/main/java/com/stallion/storage/StallionConfig.java +24 -1
  7. package/android/src/main/java/com/stallion/storage/StallionConfigConstants.java +1 -0
  8. package/android/src/main/java/com/stallion/utils/StallionApiBaseUrl.java +59 -0
  9. package/android/src/main/java/com/stallion/utils/StallionTokenRegion.java +51 -0
  10. package/ios/main/Stallion.swift +14 -1
  11. package/ios/main/StallionApiBaseUrl.swift +51 -0
  12. package/ios/main/StallionConfig.h +2 -0
  13. package/ios/main/StallionConfig.m +15 -1
  14. package/ios/main/StallionConfigConstants.h +1 -0
  15. package/ios/main/StallionConfigConstants.m +1 -0
  16. package/ios/main/StallionConstants.swift +10 -1
  17. package/ios/main/StallionObjConstants.h +1 -0
  18. package/ios/main/StallionObjConstants.m +4 -0
  19. package/ios/main/StallionTokenRegion.swift +44 -0
  20. package/package.json +1 -1
  21. package/src/main/components/modules/listing/components/SlotView.js.map +1 -1
  22. package/src/main/constants/apiConstants.js +5 -1
  23. package/src/main/constants/apiConstants.js.map +1 -1
  24. package/src/main/state/actionCreators/useConfigActions.js +3 -0
  25. package/src/main/state/actionCreators/useConfigActions.js.map +1 -1
  26. package/src/main/state/useStallionEvents.js +2 -0
  27. package/src/main/state/useStallionEvents.js.map +1 -1
  28. package/src/main/utils/getApiBaseUrl.js +46 -0
  29. package/src/main/utils/getApiBaseUrl.js.map +1 -0
  30. package/src/main/utils/parseTokenRegion.js +40 -0
  31. package/src/main/utils/parseTokenRegion.js.map +1 -0
  32. package/src/main/utils/useApiClient.js +10 -4
  33. package/src/main/utils/useApiClient.js.map +1 -1
  34. package/src/types/config.types.js.map +1 -1
  35. package/types/__tests__/parseTokenRegion.test.d.ts +2 -0
  36. package/types/__tests__/parseTokenRegion.test.d.ts.map +1 -0
  37. package/types/main/constants/apiConstants.d.ts +2 -1
  38. package/types/main/constants/apiConstants.d.ts.map +1 -1
  39. package/types/main/state/actionCreators/useConfigActions.d.ts.map +1 -1
  40. package/types/main/state/useStallionEvents.d.ts.map +1 -1
  41. package/types/main/utils/getApiBaseUrl.d.ts +18 -0
  42. package/types/main/utils/getApiBaseUrl.d.ts.map +1 -0
  43. package/types/main/utils/parseTokenRegion.d.ts +11 -0
  44. package/types/main/utils/parseTokenRegion.d.ts.map +1 -0
  45. package/types/main/utils/useApiClient.d.ts.map +1 -1
  46. package/types/types/config.types.d.ts +1 -0
  47. package/types/types/config.types.d.ts.map +1 -1
  48. package/types/types/utils.types.d.ts +1 -0
  49. package/types/types/utils.types.d.ts.map +1 -1
package/README.md CHANGED
@@ -1,76 +1,222 @@
1
1
  [![stallionBanner](https://assets.stalliontech.io/stallion_logo.png)](https://stalliontech.io/)
2
2
 
3
- ### 👉 [Sign up with Stallion](https://console.stalliontech.io/) to start shipping OTA updates today
4
-
5
- # Stallion – React Native OTA Updates Made Simple
3
+ # React Native Stallion Best CodePush Alternative & Expo Updates Replacement
6
4
 
7
5
  [![npm Version](https://img.shields.io/npm/v/react-native-stallion.svg)](https://www.npmjs.com/package/react-native-stallion)
8
6
  [![License](https://img.shields.io/npm/l/react-native-stallion.svg)](https://www.npmjs.com/package/react-native-stallion)
9
7
 
10
- **Stallion** is a **fully managed OTA update and testing framework for React Native apps**, built to streamline how developers test and deploy JavaScript bundle updates. With Stallion, you can publish updates instantly without rebuilding your native app or going through app store approvals.
8
+ **React Native Stallion** is the modern **CodePush alternative** and **App Center replacement** for React Native apps. Ship app updates instantly with **98% smaller patches**—no App Store delays. The best **Expo Updates alternative** with advanced OTA controls, patch-based updates, and enterprise-grade security.
9
+
10
+ 👉 **[Sign up with Stallion](https://console.stalliontech.io/)** to start shipping OTA updates today
11
11
 
12
12
  ---
13
13
 
14
- ## 🚀 Why Use Stallion?
14
+ ## Why Choose React Native Stallion?
15
15
 
16
- - **Built-in Testing Framework** to validate updates before production
17
- - 🔁 **Switch Between App Versions** without rebuilding native code
18
- - 📦 **Publish Bundles Instantly** using Stallion CLI
19
- - 📲 **Apply Updates In-App** using the Stallion SDK
20
- - 🔄 **Manual + Automatic Rollbacks** with real-time rollback insights
21
- - 📊 **Detailed Analytics** for update adoption and performance tracking
22
- - 🏷️ **Extensive Free Plan** for indie devs and small teams
23
- - **Production-Ready** and trusted by teams shipping millions of updates
16
+ React Native Stallion is the **best CodePush alternative** for teams that need modern OTA update capabilities:
17
+
18
+ - **98% Smaller Patch Updates** Binary-safe differential updates, not full bundles
19
+ - **Automatic Rollback & Crash Recovery** Instant rollback on crashes or failures
20
+ - **Enterprise-Grade Security** Cryptographic bundle signing with customer keys
21
+ - **Zero App Store Delays** Ship JavaScript updates instantly, no review needed
22
+ - **CodePush Compatible** Easy migration from CodePush or App Center
23
+ - **Advanced Analytics** Release-wise adoption and failure tracking
24
+ - **On-Premise Option** – Self-hosted deployment for enterprise security
25
+ - **Free Tier Available** – Perfect for indie devs and small teams
24
26
 
25
27
  ---
26
28
 
27
- ## 📦 SDK Installation
29
+ ## Quick Start
28
30
 
29
- ### Using npm
31
+ ### Installation
30
32
 
31
33
  ```bash
32
- npm install --save react-native-stallion
34
+ npm install react-native-stallion@latest
35
+ ```
36
+
37
+ ### Basic Usage
38
+
39
+ ```javascript
40
+ import { useStallionUpdate, restart } from 'react-native-stallion'
41
+
42
+ const UpdateModal = () => {
43
+ const { isRestartRequired, newReleaseBundle } = useStallionUpdate()
44
+
45
+ if (!isRestartRequired) return null
46
+
47
+ return (
48
+ <Modal visible>
49
+ <Text>{newReleaseBundle?.releaseNote || 'Update ready!'}</Text>
50
+ <Button onPress={restart} title="Restart App" />
51
+ </Modal>
52
+ )
53
+ }
33
54
  ```
34
55
 
35
- ### Using yarn
56
+ ---
57
+
58
+ ## Key Features
59
+
60
+ ### Patch Updates (98% Smaller)
61
+
62
+ React Native Stallion uses **binary-safe differential updates** instead of full bundles. Ship only what changed—tiny patches that are cryptographically verified and applied atomically.
63
+
64
+ - **Differential/Patch Updates** – Binary-safe diffs, 98% smaller than full bundles
65
+ - **Bandwidth Efficiency** – Minimal data transfer for faster installs
66
+ - **Instant Updates** – Users never notice the update process
67
+
68
+ ### Automatic Rollback & Crash Recovery
69
+
70
+ Protect your users with automatic rollback capabilities:
71
+
72
+ - **Automatic Rollback** – Instant rollback on crashes or failures
73
+ - **Crash Loop Prevention** – Prevents bad updates from breaking your app
74
+ - **Manual Rollback** – Device-level revert for installed updates
75
+ - **Rollback Analytics** – Track rollback rates and reasons
76
+
77
+ ### Enterprise Security
78
+
79
+ Enterprise-grade security features for production apps:
80
+
81
+ - **Bundle Signing** – Cryptographic verification with customer-managed keys
82
+ - **Integrity Verification** – SHA-256 checksums for tamper-proof updates
83
+ - **On-Premise Hosting** – Deploy behind your firewall with full control
84
+ - **GDPR & Regional Compliance** – Data residency options
85
+
86
+ ### Advanced OTA Controls
87
+
88
+ Granular control over update deployment:
89
+
90
+ - **Mandatory & Optional Updates** – CodePush-style update flows
91
+ - **Phased Rollout** – Gradual deployment with percentage controls
92
+ - **Custom Update UI** – Build custom modals, banners, or prompts
93
+ - **Update Strategy Control** – Granular install strategies
94
+ - **Background Updates** – Automatic checks when app moves to foreground
95
+
96
+ ---
97
+
98
+ ## 🔧 Installation & Setup
99
+
100
+ ### Step 1: Install the Package
36
101
 
37
102
  ```bash
38
- yarn add react-native-stallion
103
+ npm install react-native-stallion@latest
104
+ # or
105
+ yarn add react-native-stallion@latest
106
+ ```
107
+
108
+ ### Step 2: Native Integration
109
+
110
+ For complete setup instructions, native integration steps, and environment configurations, visit:
111
+
112
+ **📚 [Full Installation Guide](https://learn.stalliontech.io/docs/sdk/installation)**
113
+
114
+ ### Step 3: Configure Stallion
115
+
116
+ ```javascript
117
+ import { withStallion } from 'react-native-stallion'
118
+
119
+ export default withStallion(RootComponent);
39
120
  ```
40
121
 
41
122
  ---
42
123
 
43
- ## 📚 Full Installation Guide
124
+ ## Documentation & Resources
125
+
126
+ ### Complete Documentation
127
+
128
+ - **[Full Documentation](https://learn.stalliontech.io)** – Complete API reference and guides
129
+ - **[SDK Installation](https://learn.stalliontech.io/docs/sdk/installation)** – Step-by-step setup
130
+ - **[Bundle Signing](https://learn.stalliontech.io/docs/bundle-signing)** – Security best practices
131
+ - **[Custom Update UI](https://learn.stalliontech.io/blogs/react-native-over-the-air-updates-with-custom-ui)** – Build custom flows
132
+ - **[CI/CD Integration](https://learn.stalliontech.io/docs/release-automation)** – Automate deployments
133
+
134
+ ### Migration Guides
135
+
136
+ - **[CodePush Migration](https://learn.stalliontech.io/docs/migrating-from-codepush)** – Migrate from CodePush
137
+ - **[App Center Migration](https://stalliontech.io/app-center-alternative)** – Replace App Center
138
+ - **[Expo Updates Migration](https://stalliontech.io/expo-eas-update)** – Switch from Expo Updates
139
+
140
+ ---
141
+
142
+ ## Use Cases
143
+
144
+ ### CodePush Alternative
145
+
146
+ React Native Stallion is the **best CodePush alternative** for teams migrating from deprecated CodePush or App Center:
147
+
148
+ - ✅ CodePush-compatible API
149
+ - ✅ Patch updates (CodePush doesn't support)
150
+ - ✅ Active development and support
151
+ - ✅ Modern features and security
152
+
153
+ ### Expo Updates Replacement
154
+
155
+ The best **Expo Updates alternative** with more features:
156
+
157
+ - ✅ Patch updates (98% smaller)
158
+ - ✅ Advanced OTA controls
159
+ - ✅ More affordable pricing
160
+ - ✅ Works with Expo SDK 52+ and bare React Native
161
+
162
+ ### Enterprise OTA Updates
163
+
164
+ Enterprise-grade OTA update solution:
165
+
166
+ - ✅ On-premise hosting
167
+ - ✅ SOC 2 compliant
168
+ - ✅ Bundle signing with customer keys
169
+ - ✅ Regional compliance options
170
+
171
+ ---
172
+
173
+ ## Security Features
44
174
 
45
- For complete setup instructions, native integration steps, and environment configurations, visit:
46
- **https://learn.stalliontech.io/docs/sdk/installation**
175
+ - **Cryptographic Bundle Signing** Customer-managed keys for tamper-proof updates
176
+ - **SHA-256 Integrity Verification** – Automatic checksum validation
177
+ - **Automatic Crash Detection** – Instant rollback on crashes
178
+ - **On-Premise Deployment** – Full infrastructure control
179
+ - **Audit Logging** – Complete audit trails for compliance
47
180
 
48
181
  ---
49
182
 
50
- ## 📖 Documentation
183
+ ## Enterprise & On-Premise
184
+
185
+ ### On-Premise Hosting
186
+
187
+ Take full control with self-hosted deployment:
188
+
189
+ - **Enterprise-Grade Security** – Behind your firewall
190
+ - **Complete Infrastructure Control** – Your data centers
191
+ - **Regional Compliance** – GDPR & data residency
192
+ - **Seamless CI/CD** – REST APIs and webhooks
193
+ - **Zero Vendor Lock-in** – Full access to logs and metrics
51
194
 
52
- For all usage instructions, advanced features, API references, and best practices:
53
- **https://learn.stalliontech.io**
195
+ **[Contact sales for on-premise hosting](https://stalliontech.io/)**
54
196
 
55
197
  ---
56
198
 
57
- ## 🙌 Contributing
199
+ ## Contributing
58
200
 
59
- Please see the [CONTRIBUTING.md](./CONTRIBUTING.md) file to get started with contributing to the codebase.
201
+ We welcome contributions! Please see the [CONTRIBUTING.md](./CONTRIBUTING.md) file to get started.
60
202
 
61
203
  ---
62
204
 
63
- ## 🐛 Open Issues
205
+ ## Issues & Support
64
206
 
65
- Explore [open issues](https://github.com/stallion-tech/react-native-stallion/issues) to see ongoing discussions or report bugs.
207
+ - **[Open Issues](https://github.com/stallion-tech/react-native-stallion/issues)** Report bugs or request features
208
+ - **[Documentation](https://learn.stalliontech.io)** – Complete guides and API reference
209
+ - **[Contact Support](https://stalliontech.io/)** – Get help from our team
66
210
 
67
211
  ---
68
212
 
69
- ## 🤝 Code of Conduct
213
+ ## 🔗 Links
70
214
 
71
- We ask all contributors to follow our [Code of Conduct](./CODE_OF_CONDUCT.md).
215
+ - **Website:** [https://stalliontech.io](https://stalliontech.io)
216
+ - **Documentation:** [https://learn.stalliontech.io](https://learn.stalliontech.io)
217
+ - **Console:** [https://console.stalliontech.io](https://console.stalliontech.io)
218
+ - **NPM Package:** [https://www.npmjs.com/package/react-native-stallion](https://www.npmjs.com/package/react-native-stallion)
72
219
 
73
220
  ---
74
221
 
75
- > **Stallion is the fastest, safest way to manage React Native OTA updates—built for modern teams.**
76
- > Learn more at: **https://stalliontech.io**
222
+ > **React Native Stallion** The fastest, safest way to manage React Native OTA updates. The best **CodePush alternative** and **Expo Updates replacement** with patch-based updates, enterprise security, and 98% smaller deployments.
@@ -64,3 +64,7 @@ target_include_directories(
64
64
  set_target_properties(stallion-crash PROPERTIES
65
65
  LINK_FLAGS "-Wl,-z,max-page-size=16384"
66
66
  )
67
+
68
+ set_target_properties(stallion-bspatch PROPERTIES
69
+ LINK_FLAGS "-Wl,-z,max-page-size=16384"
70
+ )
@@ -61,11 +61,21 @@ public class StallionModule extends ReactContextBaseJavaModule implements Lifecy
61
61
 
62
62
  @ReactMethod
63
63
  public void onLaunch(String launchData) {
64
- // try {
65
- // JSONObject launchDataJson = new JSONObject(launchData);
66
- // } catch (Exception e) {
67
- // e.printStackTrace();
68
- // }
64
+ try {
65
+ String customBaseUrl = null;
66
+ if (launchData != null && !launchData.isEmpty()) {
67
+ JSONObject launchDataJson = new JSONObject(launchData);
68
+ if (launchDataJson.has("baseUrl") && !launchDataJson.isNull("baseUrl")) {
69
+ String baseUrl = launchDataJson.optString("baseUrl", "");
70
+ if (!baseUrl.isEmpty()) {
71
+ customBaseUrl = baseUrl;
72
+ }
73
+ }
74
+ }
75
+ com.stallion.utils.StallionApiBaseUrl.set(customBaseUrl);
76
+ } catch (Exception e) {
77
+ e.printStackTrace();
78
+ }
69
79
  stallionStateManager.setIsMounted(true);
70
80
  DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitter = getReactApplicationContext().getJSModule(
71
81
  DeviceEventManagerModule.RCTDeviceEventEmitter.class
@@ -22,7 +22,28 @@ public class StallionApiConstants {
22
22
  public static final String STALLION_SDK_TOKEN_KEY = "x-sdk-pin-access-token";
23
23
  public static final String STALLION_DEVICE_ID_KEY = "uid";
24
24
 
25
+ /** Legacy global API host; used only to detect implicit defaults in prefs. */
26
+ public static final String LEGACY_DEFAULT_STALLION_API_BASE = "https://api.stalliontech.io";
25
27
 
26
- public static final String STALLION_API_BASE = "https://api.stalliontech.io";
28
+ public static final String REGIONAL_API_BASE_AP = "https://api-ap.stalliontech.io";
29
+ public static final String REGIONAL_API_BASE_US = "https://api-us.stalliontech.io";
30
+
31
+ /** @deprecated Use LEGACY_DEFAULT_STALLION_API_BASE or getStallionApiBase() */
32
+ @Deprecated
33
+ public static final String DEFAULT_STALLION_API_BASE = LEGACY_DEFAULT_STALLION_API_BASE;
34
+
35
+ /**
36
+ * Gets the API base URL from config or returns default
37
+ * @return String - The base URL to use
38
+ */
39
+ public static String getStallionApiBase() {
40
+ return com.stallion.utils.StallionApiBaseUrl.get();
41
+ }
42
+
43
+ // Keep old constant for backward compatibility, but mark as deprecated
44
+ /** @deprecated Use getStallionApiBase() instead */
45
+ @Deprecated
46
+ public static final String STALLION_API_BASE = DEFAULT_STALLION_API_BASE;
47
+
27
48
  public static final String STALLION_INFO_API_PATH = "/api/v1/promoted/get-update-meta";
28
49
  }
@@ -50,7 +50,7 @@ public class StallionSyncHandler {
50
50
 
51
51
  // Make API call using StallionApiManager
52
52
  JSONObject releaseMeta = StallionApiManager.post(
53
- StallionApiConstants.STALLION_API_BASE + StallionApiConstants.STALLION_INFO_API_PATH,
53
+ StallionApiConstants.getStallionApiBase() + StallionApiConstants.STALLION_INFO_API_PATH,
54
54
  requestPayload.toString()
55
55
  );
56
56
 
@@ -11,6 +11,9 @@ import org.json.JSONObject;
11
11
 
12
12
  import java.util.UUID;
13
13
 
14
+ import com.stallion.storage.StallionConfigConstants;
15
+ import com.stallion.utils.StallionApiBaseUrl;
16
+
14
17
  public class StallionConfig {
15
18
  private String uid;
16
19
  private final String projectId;
@@ -22,7 +25,7 @@ public class StallionConfig {
22
25
  private String lastDownloadingUrl;
23
26
  private String lastUnverifiedHash;
24
27
  private final String publicSigningKey;
25
-
28
+ private String baseUrl;
26
29
 
27
30
  public StallionConfig(Context context, SharedPreferences sharedPreferences) {
28
31
  this.sharedPreferences = sharedPreferences;
@@ -77,6 +80,8 @@ public class StallionConfig {
77
80
  this.filesDirectory = context.getFilesDir().getAbsolutePath();
78
81
  this.lastDownloadingUrl = sharedPreferences.getString(StallionConfigConstants.LAST_DOWNLOADING_URL_IDENTIFIER, "");
79
82
  this.lastUnverifiedHash = sharedPreferences.getString(StallionConfigConstants.LAST_UNVERIFIED_HASH, "");
83
+ String storedBaseUrl = sharedPreferences.getString(StallionConfigConstants.BASE_URL_IDENTIFIER, "");
84
+ this.baseUrl = storedBaseUrl != null ? storedBaseUrl : "";
80
85
  }
81
86
 
82
87
  public String getLastDownloadingUrl() {
@@ -143,6 +148,23 @@ public class StallionConfig {
143
148
  return this.publicSigningKey;
144
149
  }
145
150
 
151
+ public String getBaseUrl() {
152
+ return this.baseUrl;
153
+ }
154
+
155
+ public void setBaseUrl(String baseUrl) {
156
+ if (baseUrl == null || baseUrl.isEmpty()) {
157
+ this.baseUrl = "";
158
+ sharedPreferences.edit().remove(StallionConfigConstants.BASE_URL_IDENTIFIER).apply();
159
+ return;
160
+ }
161
+ this.baseUrl = baseUrl;
162
+ sharedPreferences
163
+ .edit()
164
+ .putString(StallionConfigConstants.BASE_URL_IDENTIFIER, this.baseUrl)
165
+ .apply();
166
+ }
167
+
146
168
  public JSONObject toJSON() {
147
169
  JSONObject configJson = new JSONObject();
148
170
  try {
@@ -151,6 +173,7 @@ public class StallionConfig {
151
173
  configJson.put("appToken", this.appToken);
152
174
  configJson.put("sdkToken", this.sdkToken);
153
175
  configJson.put("appVersion", this.appVersion);
176
+ configJson.put("baseUrl", StallionApiBaseUrl.get());
154
177
  return configJson;
155
178
  } catch (JSONException ignored) {
156
179
  return new JSONObject();
@@ -12,6 +12,7 @@ public class StallionConfigConstants {
12
12
  public static final String API_KEY_IDENTIFIER = "x-sdk-access-token";
13
13
  public static final String LAST_DOWNLOADING_URL_IDENTIFIER = "StallionLastDownloadingUrl";
14
14
  public static final String LAST_UNVERIFIED_HASH = "LastUnverifiedHash";
15
+ public static final String BASE_URL_IDENTIFIER = "StallionBaseUrl";
15
16
 
16
17
  public static final String PROD_DIRECTORY = "/StallionProd";
17
18
  public static final String STAGE_DIRECTORY = "/StallionStage";
@@ -0,0 +1,59 @@
1
+ package com.stallion.utils;
2
+
3
+ import com.stallion.storage.StallionConfig;
4
+ import com.stallion.storage.StallionStateManager;
5
+ import com.stallion.networkmanager.StallionApiConstants;
6
+
7
+ public class StallionApiBaseUrl {
8
+
9
+ /**
10
+ * Gets the API base URL: custom baseUrl if set, else regional URL from app token.
11
+ * @return String - The base URL to use
12
+ */
13
+ public static String get() {
14
+ try {
15
+ StallionStateManager stateManager = StallionStateManager.getInstance();
16
+ if (stateManager != null && stateManager.getStallionConfig() != null) {
17
+ return resolve(stateManager.getStallionConfig());
18
+ }
19
+ } catch (Exception e) {
20
+ // Fallback to regional default on any error
21
+ }
22
+ return StallionApiConstants.REGIONAL_API_BASE_AP;
23
+ }
24
+
25
+ static String resolve(StallionConfig config) {
26
+ String stored = config.getBaseUrl();
27
+ if (stored != null && !stored.isEmpty()) {
28
+ return stored;
29
+ }
30
+
31
+ String region = StallionTokenRegion.parseTokenRegion(config.getAppToken());
32
+ if (region == null) {
33
+ region = StallionTokenRegion.defaultRegion();
34
+ }
35
+ return regionalBaseUrl(region);
36
+ }
37
+
38
+ static String regionalBaseUrl(String region) {
39
+ if ("us".equals(region)) {
40
+ return StallionApiConstants.REGIONAL_API_BASE_US;
41
+ }
42
+ return StallionApiConstants.REGIONAL_API_BASE_AP;
43
+ }
44
+
45
+ /**
46
+ * Sets a custom base URL, or clears it when null/empty.
47
+ * @param baseUrl - The custom base URL to set, or null/empty to clear
48
+ */
49
+ public static void set(String baseUrl) {
50
+ try {
51
+ StallionStateManager stateManager = StallionStateManager.getInstance();
52
+ if (stateManager != null && stateManager.getStallionConfig() != null) {
53
+ stateManager.getStallionConfig().setBaseUrl(baseUrl);
54
+ }
55
+ } catch (Exception e) {
56
+ // Silently fail
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,51 @@
1
+ package com.stallion.utils;
2
+
3
+ import java.util.Arrays;
4
+ import java.util.HashSet;
5
+ import java.util.Locale;
6
+ import java.util.Set;
7
+
8
+ public final class StallionTokenRegion {
9
+
10
+ private static final Set<String> VALID_REGIONS = new HashSet<>(Arrays.asList("ap", "us"));
11
+
12
+ private StallionTokenRegion() {}
13
+
14
+ /**
15
+ * Parses the region prefix from a Stallion token.
16
+ * Returns "ap", "us", or null. Null means legacy unprefixed token; caller should default to "ap".
17
+ */
18
+ public static String parseTokenRegion(String token) {
19
+ if (token == null) {
20
+ return null;
21
+ }
22
+ token = token.trim();
23
+ if (token.isEmpty()) {
24
+ return null;
25
+ }
26
+
27
+ // App token: spb_<region>_<44-char nanoid> → 49 chars
28
+ if (token.startsWith("spb_") && token.length() == 49 && token.charAt(6) == '_') {
29
+ return extractRegion(token);
30
+ }
31
+
32
+ // CI token: stl_<region>_<36-char nanoid> → 43 chars
33
+ if (token.startsWith("stl_") && token.length() == 43 && token.charAt(6) == '_') {
34
+ return extractRegion(token);
35
+ }
36
+
37
+ return null;
38
+ }
39
+
40
+ public static String defaultRegion() {
41
+ return "ap";
42
+ }
43
+
44
+ private static String extractRegion(String token) {
45
+ String code = token.substring(4, 6).toLowerCase(Locale.ROOT);
46
+ if (!code.matches("[a-z]{2}")) {
47
+ return null;
48
+ }
49
+ return VALID_REGIONS.contains(code) ? code : null;
50
+ }
51
+ }
@@ -28,6 +28,17 @@ class Stallion: RCTEventEmitter {
28
28
  }
29
29
 
30
30
  @objc func onLaunch(_ launchData: String) {
31
+ var customBaseUrl = ""
32
+ if !launchData.isEmpty,
33
+ let data = launchData.data(using: .utf8),
34
+ let params = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],
35
+ params.keys.contains("baseUrl"),
36
+ let baseUrl = params["baseUrl"] as? String,
37
+ !baseUrl.isEmpty {
38
+ customBaseUrl = baseUrl
39
+ }
40
+ StallionApiBaseUrl.set(customBaseUrl)
41
+
31
42
  stallionStateManager.isMounted = true
32
43
  checkPendingDownloads()
33
44
  let currentReleaseHash = stallionStateManager.stallionMeta.getHashAtCurrentProdSlot()
@@ -61,7 +72,9 @@ class Stallion: RCTEventEmitter {
61
72
  @objc func getStallionConfig(_ promise: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) {
62
73
  do {
63
74
  if let config = stallionStateManager.stallionConfig {
64
- let configJsonData = try JSONSerialization.data(withJSONObject: config.toDictionary(), options: [])
75
+ var configDict = config.toDictionary() as? [String: Any] ?? [:]
76
+ configDict["baseUrl"] = StallionApiBaseUrl.get()
77
+ let configJsonData = try JSONSerialization.data(withJSONObject: configDict, options: [])
65
78
  if let configJsonString = String(data: configJsonData, encoding: .utf8) {
66
79
  promise(configJsonString)
67
80
  } else {
@@ -0,0 +1,51 @@
1
+ //
2
+ // StallionApiBaseUrl.swift
3
+ // react-native-stallion
4
+ //
5
+ // Created for centralized base URL management
6
+ //
7
+
8
+ import Foundation
9
+
10
+ class StallionApiBaseUrl {
11
+ /**
12
+ * Gets the API base URL: custom baseUrl if set, else regional URL from app token.
13
+ */
14
+ static func get() -> String {
15
+ guard let stateManager = StallionStateManager.sharedInstance() else {
16
+ return StallionConstants.REGIONAL_API_BASE_AP
17
+ }
18
+
19
+ return resolve(config: stateManager.stallionConfig)
20
+ }
21
+
22
+ static func resolve(config: StallionConfig) -> String {
23
+ let stored = config.baseUrl ?? ""
24
+ if !stored.isEmpty {
25
+ return stored
26
+ }
27
+
28
+ var region = StallionTokenRegion.parseTokenRegion(config.appToken)
29
+ if region == nil {
30
+ region = StallionTokenRegion.defaultRegion()
31
+ }
32
+ return regionalBaseUrl(region!)
33
+ }
34
+
35
+ static func regionalBaseUrl(_ region: String) -> String {
36
+ if region == "us" {
37
+ return StallionConstants.REGIONAL_API_BASE_US
38
+ }
39
+ return StallionConstants.REGIONAL_API_BASE_AP
40
+ }
41
+
42
+ /**
43
+ * Sets a custom base URL, or clears it when empty.
44
+ */
45
+ static func set(_ baseUrl: String) {
46
+ guard let stateManager = StallionStateManager.sharedInstance() else {
47
+ return
48
+ }
49
+ stateManager.stallionConfig.updateBaseUrl(baseUrl)
50
+ }
51
+ }
@@ -17,11 +17,13 @@
17
17
  @property (nonatomic, copy, readonly) NSString *filesDirectory;
18
18
  @property (nonatomic, copy, readonly) NSString *publicSigningKey;
19
19
  @property (nonatomic, copy) NSString *lastUnverifiedHash;
20
+ @property (nonatomic, copy) NSString *baseUrl;
20
21
 
21
22
  - (instancetype)initWithDefaults:(NSUserDefaults *)defaults;
22
23
 
23
24
  - (void)updateSdkToken:(NSString *)newSdkToken;
24
25
  - (void)updateLastUnverifiedHash:(NSString *)newUnverifiedHash;
26
+ - (void)updateBaseUrl:(NSString *)newBaseUrl;
25
27
  - (NSDictionary *)toDictionary;
26
28
 
27
29
  @end
@@ -7,6 +7,7 @@
7
7
 
8
8
  #import "StallionConfig.h"
9
9
  #import "StallionConfigConstants.h"
10
+ #import "StallionObjConstants.h"
10
11
 
11
12
  @implementation StallionConfig
12
13
 
@@ -20,6 +21,7 @@
20
21
  _filesDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject ?: @"";
21
22
  _publicSigningKey = [[NSBundle mainBundle] objectForInfoDictionaryKey:STALLION_PUBLIC_SIGNING_KEY_IDENTIFIER] ?: @"";
22
23
  _lastUnverifiedHash = [defaults stringForKey:LAST_UNVERIFIED_KEY_IDENTIFIER] ?: @"";
24
+ _baseUrl = [defaults stringForKey:BASE_URL_IDENTIFIER] ?: @"";
23
25
 
24
26
  NSString *cachedUid = [defaults stringForKey:UNIQUE_ID_IDENTIFIER];
25
27
  if (cachedUid && ![cachedUid isEqualToString:@""]) {
@@ -51,6 +53,17 @@
51
53
  [[NSUserDefaults standardUserDefaults] synchronize];
52
54
  }
53
55
 
56
+ - (void)updateBaseUrl:(NSString *)newBaseUrl {
57
+ if (newBaseUrl == nil || [newBaseUrl length] == 0) {
58
+ _baseUrl = @"";
59
+ [[NSUserDefaults standardUserDefaults] removeObjectForKey:BASE_URL_IDENTIFIER];
60
+ } else {
61
+ _baseUrl = newBaseUrl;
62
+ [[NSUserDefaults standardUserDefaults] setObject:_baseUrl forKey:BASE_URL_IDENTIFIER];
63
+ }
64
+ [[NSUserDefaults standardUserDefaults] synchronize];
65
+ }
66
+
54
67
  - (NSDictionary *)toDictionary {
55
68
  @try {
56
69
  return @{
@@ -58,7 +71,8 @@
58
71
  @"projectId": self.projectId ?: @"",
59
72
  @"appToken": self.appToken ?: @"",
60
73
  @"sdkToken": self.sdkToken ?: @"",
61
- @"appVersion": self.appVersion ?: @""
74
+ @"appVersion": self.appVersion ?: @"",
75
+ @"baseUrl": self.baseUrl ?: @""
62
76
  };
63
77
  } @catch (NSException *exception) {
64
78
  NSLog(@"Error in toDictionary: %@", exception.reason);
@@ -32,5 +32,6 @@ extern NSString *const STALLION_META_IDENTIFIER;
32
32
  extern NSString *const STALLION_PUBLIC_SIGNING_KEY_IDENTIFIER;
33
33
 
34
34
  extern NSString *const LAST_UNVERIFIED_KEY_IDENTIFIER;
35
+ extern NSString *const BASE_URL_IDENTIFIER;
35
36
 
36
37
  @end
@@ -32,5 +32,6 @@ NSString *const UNZIP_FOLDER_NAME = @"/build";
32
32
  NSString *const STALLION_PUBLIC_SIGNING_KEY_IDENTIFIER = @"StallionPublicSigningKey";
33
33
 
34
34
  NSString *const LAST_UNVERIFIED_KEY_IDENTIFIER = @"LastUnverifiedHash";
35
+ NSString *const BASE_URL_IDENTIFIER = @"StallionBaseUrl";
35
36
 
36
37
  @end
@@ -45,7 +45,16 @@ class StallionConstants {
45
45
 
46
46
  static let CURRENT_PROD_SLOT_KEY = "stallionProdCurrentSlot"
47
47
  static let CURRENT_STAGE_SLOT_KEY = "stallionStageCurrentSlot"
48
- static let STALLION_API_BASE = "https://api.stalliontech.io"
48
+ // Use utility for base URL (returns custom or default)
49
+ static var STALLION_API_BASE: String {
50
+ return StallionApiBaseUrl.get()
51
+ }
52
+ /// Legacy global API host; used only to detect implicit defaults in prefs.
53
+ static let LEGACY_DEFAULT_STALLION_API_BASE = "https://api.stalliontech.io"
54
+ static let REGIONAL_API_BASE_AP = "https://api-ap.stalliontech.io"
55
+ static let REGIONAL_API_BASE_US = "https://api-us.stalliontech.io"
56
+ /// @deprecated Use LEGACY_DEFAULT_STALLION_API_BASE or StallionApiBaseUrl.get()
57
+ static let DEFAULT_STALLION_API_BASE = LEGACY_DEFAULT_STALLION_API_BASE
49
58
  static let STALLION_INFO_API_PATH = "/api/v1/promoted/get-update-meta"
50
59
  static let STALLION_PROJECT_ID_IDENTIFIER = "StallionProjectId"
51
60
  static let STALLION_APP_TOKEN_IDENTIFIER = "StallionAppToken"
@@ -45,5 +45,6 @@
45
45
  @property (class, nonatomic, readonly) NSString *last_rolled_back_release_hash_key;
46
46
  @property (class, nonatomic, readonly) NSString *auto_rolled_back_prod_event;
47
47
  @property (class, nonatomic, readonly) NSString *is_auto_rollback_key;
48
+ @property (class, nonatomic, readonly) NSString *default_stallion_api_base;
48
49
 
49
50
  @end
@@ -129,4 +129,8 @@
129
129
  return @"LAST_ROLLED_BACK_RELEASE_HASH";
130
130
  }
131
131
 
132
+ + (NSString *)default_stallion_api_base {
133
+ return @"https://api.stalliontech.io";
134
+ }
135
+
132
136
  @end
@@ -0,0 +1,44 @@
1
+ //
2
+ // StallionTokenRegion.swift
3
+ // react-native-stallion
4
+ //
5
+
6
+ import Foundation
7
+
8
+ enum StallionTokenRegion {
9
+ private static let validRegions: Set<String> = ["ap", "us"]
10
+
11
+ /// Parses the region prefix from a Stallion token.
12
+ /// Returns "ap", "us", or nil. Nil means legacy unprefixed token; caller should default to "ap".
13
+ static func parseTokenRegion(_ token: String?) -> String? {
14
+ guard let token = token?.trimmingCharacters(in: .whitespacesAndNewlines), !token.isEmpty else {
15
+ return nil
16
+ }
17
+
18
+ // App token: spb_<region>_<44-char nanoid> → 49 chars
19
+ if token.hasPrefix("spb_"), token.count == 49, token[token.index(token.startIndex, offsetBy: 6)] == "_" {
20
+ return extractRegion(from: token)
21
+ }
22
+
23
+ // CI token: stl_<region>_<36-char nanoid> → 43 chars
24
+ if token.hasPrefix("stl_"), token.count == 43, token[token.index(token.startIndex, offsetBy: 6)] == "_" {
25
+ return extractRegion(from: token)
26
+ }
27
+
28
+ return nil
29
+ }
30
+
31
+ static func defaultRegion() -> String {
32
+ return "ap"
33
+ }
34
+
35
+ private static func extractRegion(from token: String) -> String? {
36
+ let start = token.index(token.startIndex, offsetBy: 4)
37
+ let end = token.index(token.startIndex, offsetBy: 6)
38
+ let code = String(token[start..<end]).lowercased()
39
+ guard code.range(of: "^[a-z]{2}$", options: .regularExpression) != nil else {
40
+ return nil
41
+ }
42
+ return validRegions.contains(code) ? code : nil
43
+ }
44
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-stallion",
3
- "version": "2.4.0-alpha.5",
3
+ "version": "2.4.0-alpha.7",
4
4
  "description": "Offical React Native SDK for Stallion",
5
5
  "main": "index",
6
6
  "types": "types/index.d.ts",
@@ -1 +1 @@
1
- {"version":3,"names":["StyleSheet","View","React","SLOT_STATES","NATIVE_CONSTANTS","STD_MARGIN","COLORS","getSlotColor","slot","DEFAULT_FOLDER_SLOT","STABLE_FOLDER_SLOT","NEW_FOLDER_SLOT","indigo","TEMP_FOLDER_SLOT","green","StallionSlot","_ref","isActive","createElement","style","styles","slotItem","backgroundColor","borderWidth","SlotView","props","currentSlot","tempHash","stableHash","newHash","activeSlot","parentContainer","rowContainer","hash","DEFAULT","STABLE","NEW","create","justifyContent","alignItems","flexDirection","width","paddingRight","paddingVertical","white","flex","height","marginLeft","borderRadius"],"sourceRoot":"../../../../../../../src","sources":["main/components/modules/listing/components/SlotView.tsx"],"mappings":"AAAA,SAASA,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,OAAOC,KAAK,MAAM,OAAO;AACzB,SAEEC,WAAW,QACN,iCAAiC;AACxC,SACEC,gBAAgB,EAChBC,UAAU,QACL,oCAAoC;AAC3C,SAASC,MAAM,QAAQ,8BAA8B;AAcrD,SAASC,YAAYA,CAACC,IAAc,EAAU;EAC5C,QAAQA,IAAI;IACV,KAAKJ,gBAAgB,CAACK,mBAAmB;MACvC,OAAO,SAAS;IAClB,KAAKL,gBAAgB,CAACM,kBAAkB;MACtC,OAAO,SAAS;IAClB,KAAKN,gBAAgB,CAACO,eAAe;MACnC,OAAOL,MAAM,CAACM,MAAM;IACtB,KAAKR,gBAAgB,CAACS,gBAAgB;MACpC,OAAOP,MAAM,CAACQ,KAAK;EACvB;AACF;AAEA,MAAMC,YAAqC,GAAGC,IAAA,IAAwB;EAAA,IAAvB;IAAER,IAAI;IAAES;EAAS,CAAC,GAAAD,IAAA;EAC/D,oBACEd,KAAA,CAAAgB,aAAA,CAACjB,IAAI;IACHkB,KAAK,EAAE,CACLC,MAAM,CAACC,QAAQ,EACf;MACEC,eAAe,EAAEf,YAAY,CAACC,IAAI,CAAC;MACnCe,WAAW,EAAEN,QAAQ,GAAG,CAAC,GAAG;IAC9B,CAAC;EACD,CACG,CAAC;AAEZ,CAAC;AAED,MAAMO,QAAqC,GAAIC,KAAK,IAAK;EACvD,MAAM;IAAEC,WAAW;IAAEC,QAAQ;IAAEC,UAAU;IAAEC;EAAQ,CAAC,GAAGJ,KAAK;EAC5D,MAAMK,UAAU,GAAGJ,WAAgC;EACnD,oBACExB,KAAA,CAAAgB,aAAA,CAACjB,IAAI;IAACkB,KAAK,EAAE,CAACC,MAAM,CAACW,eAAe,EAAEX,MAAM,CAACY,YAAY;EAAE,gBACzD9B,KAAA,CAAAgB,aAAA,CAACH,YAAY;IACXP,IAAI,EAAEJ,gBAAgB,CAACK,mBAAoB;IAC3CwB,IAAI,EAAE,EAAG;IACThB,QAAQ,EAAEa,UAAU,KAAK3B,WAAW,CAAC+B;EAAQ,CAC9C,CAAC,EAEDN,UAAU,gBACT1B,KAAA,CAAAgB,aAAA,CAACH,YAAY;IACXP,IAAI,EAAEJ,gBAAgB,CAACM,kBAAmB;IAC1CuB,IAAI,EAAEL,UAAU,IAAI,EAAG;IACvBX,QAAQ,EAAEa,UAAU,KAAK3B,WAAW,CAACgC;EAAO,CAC7C,CAAC,GACA,IAAI,EAEPN,OAAO,gBACN3B,KAAA,CAAAgB,aAAA,CAACH,YAAY;IACXP,IAAI,EAAEJ,gBAAgB,CAACO,eAAgB;IACvCsB,IAAI,EAAEJ,OAAO,IAAI,EAAG;IACpBZ,QAAQ,EAAEa,UAAU,KAAK3B,WAAW,CAACiC;EAAI,CAC1C,CAAC,GACA,IAAI,EAEPT,QAAQ,gBACPzB,KAAA,CAAAgB,aAAA,CAACH,YAAY;IACXP,IAAI,EAAEJ,gBAAgB,CAACS,gBAAiB;IACxCoB,IAAI,EAAEN,QAAQ,IAAI,EAAG;IACrBV,QAAQ,EAAE;EAAM,CACjB,CAAC,GACA,IACA,CAAC;AAEX,CAAC;AAED,MAAMG,MAAM,GAAGpB,UAAU,CAACqC,MAAM,CAAC;EAC/BN,eAAe,EAAE;IACfO,cAAc,EAAE,YAAY;IAC5BC,UAAU,EAAE,QAAQ;IACpBC,aAAa,EAAE,KAAK;IACpBC,KAAK,EAAE,MAAM;IACbC,YAAY,EAAErC,UAAU;IACxBsC,eAAe,EAAEtC,UAAU;IAC3BiB,eAAe,EAAEhB,MAAM,CAACsC;EAC1B,CAAC;EACDZ,YAAY,EAAE;IACZQ,aAAa,EAAE;EACjB,CAAC;EACDnB,QAAQ,EAAE;IACRwB,IAAI,EAAE,CAAC;IACPJ,KAAK,EAAE,MAAM;IACbK,MAAM,EAAEzC,UAAU;IAClB0C,UAAU,EAAE1C,UAAU;IACtB2C,YAAY,EAAE3C,UAAU,GAAG;EAC7B;AACF,CAAC,CAAC;AAEF,eAAemB,QAAQ"}
1
+ {"version":3,"names":["StyleSheet","View","React","SLOT_STATES","NATIVE_CONSTANTS","STD_MARGIN","COLORS","getSlotColor","slot","DEFAULT_FOLDER_SLOT","STABLE_FOLDER_SLOT","NEW_FOLDER_SLOT","indigo","TEMP_FOLDER_SLOT","green","StallionSlot","_ref","isActive","createElement","style","styles","slotItem","backgroundColor","borderWidth","SlotView","props","currentSlot","tempHash","stableHash","newHash","activeSlot","parentContainer","rowContainer","hash","DEFAULT","STABLE","NEW","create","justifyContent","alignItems","flexDirection","width","paddingRight","paddingVertical","white","flex","height","marginLeft","borderRadius"],"sourceRoot":"../../../../../../../src","sources":["main/components/modules/listing/components/SlotView.tsx"],"mappings":"AAAA,SAASA,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,OAAOC,KAAK,MAAM,OAAO;AACzB,SAEEC,WAAW,QACN,iCAAiC;AACxC,SACEC,gBAAgB,EAChBC,UAAU,QACL,oCAAoC;AAC3C,SAASC,MAAM,QAAQ,8BAA8B;AAcrD,SAASC,YAAYA,CAACC,IAAc,EAAU;EAC5C,QAAQA,IAAI;IACV,KAAKJ,gBAAgB,CAACK,mBAAmB;MACvC,OAAO,SAAS;IAClB,KAAKL,gBAAgB,CAACM,kBAAkB;MACtC,OAAO,SAAS;IAClB,KAAKN,gBAAgB,CAACO,eAAe;MACnC,OAAOL,MAAM,CAACM,MAAM;IACtB,KAAKR,gBAAgB,CAACS,gBAAgB;MACpC,OAAOP,MAAM,CAACQ,KAAK;EACvB;AACF;AAEA,MAAMC,YAAqC,GAAGC,IAAA,IAAwB;EAAA,IAAvB;IAAER,IAAI;IAAES;EAAS,CAAC,GAAAD,IAAA;EAC/D,oBACEd,KAAA,CAAAgB,aAAA,CAACjB,IAAI;IACHkB,KAAK,EAAE,CACLC,MAAM,CAACC,QAAQ,EACf;MACEC,eAAe,EAAEf,YAAY,CAACC,IAAI,CAAC;MACnCe,WAAW,EAAEN,QAAQ,GAAG,CAAC,GAAG;IAC9B,CAAC;EACD,CACH,CAAC;AAEN,CAAC;AAED,MAAMO,QAAqC,GAAIC,KAAK,IAAK;EACvD,MAAM;IAAEC,WAAW;IAAEC,QAAQ;IAAEC,UAAU;IAAEC;EAAQ,CAAC,GAAGJ,KAAK;EAC5D,MAAMK,UAAU,GAAGJ,WAAgC;EACnD,oBACExB,KAAA,CAAAgB,aAAA,CAACjB,IAAI;IAACkB,KAAK,EAAE,CAACC,MAAM,CAACW,eAAe,EAAEX,MAAM,CAACY,YAAY;EAAE,gBACzD9B,KAAA,CAAAgB,aAAA,CAACH,YAAY;IACXP,IAAI,EAAEJ,gBAAgB,CAACK,mBAAoB;IAC3CwB,IAAI,EAAE,EAAG;IACThB,QAAQ,EAAEa,UAAU,KAAK3B,WAAW,CAAC+B;EAAQ,CAC9C,CAAC,EAEDN,UAAU,gBACT1B,KAAA,CAAAgB,aAAA,CAACH,YAAY;IACXP,IAAI,EAAEJ,gBAAgB,CAACM,kBAAmB;IAC1CuB,IAAI,EAAEL,UAAU,IAAI,EAAG;IACvBX,QAAQ,EAAEa,UAAU,KAAK3B,WAAW,CAACgC;EAAO,CAC7C,CAAC,GACA,IAAI,EAEPN,OAAO,gBACN3B,KAAA,CAAAgB,aAAA,CAACH,YAAY;IACXP,IAAI,EAAEJ,gBAAgB,CAACO,eAAgB;IACvCsB,IAAI,EAAEJ,OAAO,IAAI,EAAG;IACpBZ,QAAQ,EAAEa,UAAU,KAAK3B,WAAW,CAACiC;EAAI,CAC1C,CAAC,GACA,IAAI,EAEPT,QAAQ,gBACPzB,KAAA,CAAAgB,aAAA,CAACH,YAAY;IACXP,IAAI,EAAEJ,gBAAgB,CAACS,gBAAiB;IACxCoB,IAAI,EAAEN,QAAQ,IAAI,EAAG;IACrBV,QAAQ,EAAE;EAAM,CACjB,CAAC,GACA,IACA,CAAC;AAEX,CAAC;AAED,MAAMG,MAAM,GAAGpB,UAAU,CAACqC,MAAM,CAAC;EAC/BN,eAAe,EAAE;IACfO,cAAc,EAAE,YAAY;IAC5BC,UAAU,EAAE,QAAQ;IACpBC,aAAa,EAAE,KAAK;IACpBC,KAAK,EAAE,MAAM;IACbC,YAAY,EAAErC,UAAU;IACxBsC,eAAe,EAAEtC,UAAU;IAC3BiB,eAAe,EAAEhB,MAAM,CAACsC;EAC1B,CAAC;EACDZ,YAAY,EAAE;IACZQ,aAAa,EAAE;EACjB,CAAC;EACDnB,QAAQ,EAAE;IACRwB,IAAI,EAAE,CAAC;IACPJ,KAAK,EAAE,MAAM;IACbK,MAAM,EAAEzC,UAAU;IAClB0C,UAAU,EAAE1C,UAAU;IACtB2C,YAAY,EAAE3C,UAAU,GAAG;EAC7B;AACF,CAAC,CAAC;AAEF,eAAemB,QAAQ"}
@@ -1,4 +1,8 @@
1
- export const API_BASE_URL = 'https://api.stalliontech.io';
1
+ import { DEFAULT_API_BASE_URL } from '../utils/getApiBaseUrl';
2
+
3
+ // Keep for backward compatibility, but mark as deprecated
4
+ /** @deprecated Use getApiBaseUrl() instead */
5
+ export const API_BASE_URL = DEFAULT_API_BASE_URL;
2
6
  export let API_PATHS = /*#__PURE__*/function (API_PATHS) {
3
7
  API_PATHS["LOGIN"] = "/api/v1/sdk/auth/verify-pin";
4
8
  API_PATHS["VERIFY_OTP"] = "/api/v1/auth/verify-otp";
@@ -1 +1 @@
1
- {"version":3,"names":["API_BASE_URL","API_PATHS","BUNDLE_API_PAGE_SIZE"],"sourceRoot":"../../../../src","sources":["main/constants/apiConstants.ts"],"mappings":"AAAA,OAAO,MAAMA,YAAY,GAAG,6BAA6B;AAEzD,WAAYC,SAAS,0BAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAAA,OAATA,SAAS;AAAA;AAUrB,OAAO,MAAMC,oBAAoB,GAAG,EAAE"}
1
+ {"version":3,"names":["DEFAULT_API_BASE_URL","API_BASE_URL","API_PATHS","BUNDLE_API_PAGE_SIZE"],"sourceRoot":"../../../../src","sources":["main/constants/apiConstants.ts"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,wBAAwB;;AAE7D;AACA;AACA,OAAO,MAAMC,YAAY,GAAGD,oBAAoB;AAEhD,WAAYE,SAAS,0BAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAAA,OAATA,SAAS;AAAA;AAUrB,OAAO,MAAMC,oBAAoB,GAAG,EAAE"}
@@ -1,11 +1,14 @@
1
1
  import { useCallback, useEffect } from 'react';
2
2
  import { getStallionConfigNative } from '../../utils/StallionNativeUtils';
3
+ import { clearApiBaseUrlCache } from '../../utils/getApiBaseUrl';
3
4
  import { setConfig } from '../actions/configActions';
4
5
  const useConfigActions = dispatch => {
5
6
  const refreshConfig = useCallback(async () => {
6
7
  try {
7
8
  const stallionConfig = await getStallionConfigNative();
8
9
  dispatch(setConfig(stallionConfig));
10
+ // Clear base URL cache when config is refreshed to pick up any baseUrl changes
11
+ clearApiBaseUrlCache();
9
12
  } catch (_) {}
10
13
  }, [dispatch]);
11
14
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","getStallionConfigNative","setConfig","useConfigActions","dispatch","refreshConfig","stallionConfig","_"],"sourceRoot":"../../../../../src","sources":["main/state/actionCreators/useConfigActions.ts"],"mappings":"AAAA,SAAgBA,WAAW,EAAEC,SAAS,QAAQ,OAAO;AAErD,SAASC,uBAAuB,QAAQ,iCAAiC;AAGzE,SAASC,SAAS,QAAQ,0BAA0B;AAEpD,MAAMC,gBAAgB,GAAIC,QAAuC,IAAK;EACpE,MAAMC,aAAa,GAAGN,WAAW,CAAC,YAAY;IAC5C,IAAI;MACF,MAAMO,cAAc,GAAG,MAAML,uBAAuB,CAAC,CAAC;MACtDG,QAAQ,CAACF,SAAS,CAACI,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC,OAAOC,CAAC,EAAE,CAAC;EACf,CAAC,EAAE,CAACH,QAAQ,CAAC,CAAC;EAEdJ,SAAS,CAAC,MAAM;IACdK,aAAa,CAAC,CAAC;IACf;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IACLA;EACF,CAAC;AACH,CAAC;AAED,eAAeF,gBAAgB"}
1
+ {"version":3,"names":["useCallback","useEffect","getStallionConfigNative","clearApiBaseUrlCache","setConfig","useConfigActions","dispatch","refreshConfig","stallionConfig","_"],"sourceRoot":"../../../../../src","sources":["main/state/actionCreators/useConfigActions.ts"],"mappings":"AAAA,SAAgBA,WAAW,EAAEC,SAAS,QAAQ,OAAO;AAErD,SAASC,uBAAuB,QAAQ,iCAAiC;AACzE,SAASC,oBAAoB,QAAQ,2BAA2B;AAGhE,SAASC,SAAS,QAAQ,0BAA0B;AAEpD,MAAMC,gBAAgB,GAAIC,QAAuC,IAAK;EACpE,MAAMC,aAAa,GAAGP,WAAW,CAAC,YAAY;IAC5C,IAAI;MACF,MAAMQ,cAAc,GAAG,MAAMN,uBAAuB,CAAC,CAAC;MACtDI,QAAQ,CAACF,SAAS,CAACI,cAAc,CAAC,CAAC;MACnC;MACAL,oBAAoB,CAAC,CAAC;IACxB,CAAC,CAAC,OAAOM,CAAC,EAAE,CAAC;EACf,CAAC,EAAE,CAACH,QAAQ,CAAC,CAAC;EAEdL,SAAS,CAAC,MAAM;IACdM,aAAa,CAAC,CAAC;IACf;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IACLA;EACF,CAAC;AACH,CAAC;AAED,eAAeF,gBAAgB"}
@@ -8,6 +8,7 @@ import StallionNativeModule from '../../StallionNativeModule';
8
8
  import { useApiClient } from '../utils/useApiClient';
9
9
  import { API_PATHS } from '../constants/apiConstants';
10
10
  import debounce from '../utils/debounce';
11
+ import { clearApiBaseUrlCache } from '../utils/getApiBaseUrl';
11
12
  import { UpdateMetaActionKind } from '../../types/updateMeta.types';
12
13
  const REFRESH_META_EVENTS = {
13
14
  [NativeEventTypesProd.DOWNLOAD_COMPLETE_PROD]: true,
@@ -109,6 +110,7 @@ export const useStallionEvents = (refreshMeta, setProgress, configState, updateM
109
110
  console.warn('React Native Stallion: Skipping onLaunchNative due to JS crash');
110
111
  return;
111
112
  }
113
+ clearApiBaseUrlCache();
112
114
  if (stallionInitParams) {
113
115
  try {
114
116
  onLaunchNative(JSON.stringify(stallionInitParams));
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useCallback","useMemo","NativeEventEmitter","NativeEventTypesProd","STALLION_NATIVE_EVENT","NativeEventTypesStage","DEFAULT_STALLION_PARAMS","stallionEventEmitter","acknowledgeEventsNative","onLaunchNative","popEventsNative","hasCrashOccurredCheck","StallionNativeModule","useApiClient","API_PATHS","debounce","UpdateMetaActionKind","REFRESH_META_EVENTS","DOWNLOAD_COMPLETE_PROD","ROLLED_BACK_PROD","AUTO_ROLLED_BACK_PROD","STABILIZED_PROD","DOWNLOAD_COMPLETE_STAGE","DOWNLOAD_ERROR_STAGE","INSTALLED_STAGE","STALLION_EVENT_DEBOUNCE_INTERVAL","processStallionEvent","eventString","JSON","parse","_","useStallionEvents","refreshMeta","setProgress","configState","updateMetaDispatch","stallionInitParams","getData","syncStallionEvents","stallionEvents","projectId","LOG_EVENTS","eventData","then","res","success","eventIds","map","event","eventId","eventIdString","stringify","popEvents","eventsString","eventsArr","length","requestAnimationFrame","popEventsDebounced","eventEmitter","addListener","nativeEventString","eventType","type","DOWNLOAD_STARTED_PROD","SET_PENDING_RELEASE_HASH","payload","releaseHash","emit","DOWNLOAD_PROGRESS_PROD","DOWNLOAD_ERROR_PROD","INSTALLED_PROD","SYNC_ERROR_PROD","EXCEPTION_PROD","DOWNLOAD_PROGRESS_STAGE","progress","Number","removeAllListeners","setTimeout","console","warn","Error"],"sourceRoot":"../../../../src","sources":["main/state/useStallionEvents.ts"],"mappings":"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"}
1
+ {"version":3,"names":["useEffect","useCallback","useMemo","NativeEventEmitter","NativeEventTypesProd","STALLION_NATIVE_EVENT","NativeEventTypesStage","DEFAULT_STALLION_PARAMS","stallionEventEmitter","acknowledgeEventsNative","onLaunchNative","popEventsNative","hasCrashOccurredCheck","StallionNativeModule","useApiClient","API_PATHS","debounce","clearApiBaseUrlCache","UpdateMetaActionKind","REFRESH_META_EVENTS","DOWNLOAD_COMPLETE_PROD","ROLLED_BACK_PROD","AUTO_ROLLED_BACK_PROD","STABILIZED_PROD","DOWNLOAD_COMPLETE_STAGE","DOWNLOAD_ERROR_STAGE","INSTALLED_STAGE","STALLION_EVENT_DEBOUNCE_INTERVAL","processStallionEvent","eventString","JSON","parse","_","useStallionEvents","refreshMeta","setProgress","configState","updateMetaDispatch","stallionInitParams","getData","syncStallionEvents","stallionEvents","projectId","LOG_EVENTS","eventData","then","res","success","eventIds","map","event","eventId","eventIdString","stringify","popEvents","eventsString","eventsArr","length","requestAnimationFrame","popEventsDebounced","eventEmitter","addListener","nativeEventString","eventType","type","DOWNLOAD_STARTED_PROD","SET_PENDING_RELEASE_HASH","payload","releaseHash","emit","DOWNLOAD_PROGRESS_PROD","DOWNLOAD_ERROR_PROD","INSTALLED_PROD","SYNC_ERROR_PROD","EXCEPTION_PROD","DOWNLOAD_PROGRESS_STAGE","progress","Number","removeAllListeners","setTimeout","console","warn","Error"],"sourceRoot":"../../../../src","sources":["main/state/useStallionEvents.ts"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { getStallionConfigNative } from './StallionNativeUtils';
2
+ import { AP_ORIGIN, parseTokenRegion, regionalApiBaseUrl } from './parseTokenRegion';
3
+ export const DEFAULT_API_BASE_URL = AP_ORIGIN;
4
+ export const LEGACY_API_BASE_URL = 'https://api.stalliontech.io';
5
+
6
+ // Cache for base URL
7
+ let cachedBaseUrl = null;
8
+
9
+ /**
10
+ * Gets the API base URL from native config or returns regional default
11
+ * @returns Promise<string> - The base URL to use
12
+ */
13
+ export const getApiBaseUrl = async () => {
14
+ if (cachedBaseUrl) {
15
+ return cachedBaseUrl;
16
+ }
17
+ try {
18
+ const config = await getStallionConfigNative();
19
+ if (config.baseUrl) {
20
+ cachedBaseUrl = config.baseUrl;
21
+ return cachedBaseUrl;
22
+ }
23
+ const region = parseTokenRegion(config.appToken);
24
+ cachedBaseUrl = regionalApiBaseUrl(region);
25
+ return cachedBaseUrl;
26
+ } catch {
27
+ return DEFAULT_API_BASE_URL;
28
+ }
29
+ };
30
+
31
+ /**
32
+ * Gets the API base URL synchronously (returns default if not cached)
33
+ * Use this when you need immediate access and can't await
34
+ * @returns string - The base URL (default if not loaded yet)
35
+ */
36
+ export const getApiBaseUrlSync = () => {
37
+ return cachedBaseUrl || DEFAULT_API_BASE_URL;
38
+ };
39
+
40
+ /**
41
+ * Clears the cached base URL (useful for testing or config changes)
42
+ */
43
+ export const clearApiBaseUrlCache = () => {
44
+ cachedBaseUrl = null;
45
+ };
46
+ //# sourceMappingURL=getApiBaseUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getStallionConfigNative","AP_ORIGIN","parseTokenRegion","regionalApiBaseUrl","DEFAULT_API_BASE_URL","LEGACY_API_BASE_URL","cachedBaseUrl","getApiBaseUrl","config","baseUrl","region","appToken","getApiBaseUrlSync","clearApiBaseUrlCache"],"sourceRoot":"../../../../src","sources":["main/utils/getApiBaseUrl.ts"],"mappings":"AAAA,SAASA,uBAAuB,QAAQ,uBAAuB;AAC/D,SACEC,SAAS,EACTC,gBAAgB,EAChBC,kBAAkB,QACb,oBAAoB;AAE3B,OAAO,MAAMC,oBAAoB,GAAGH,SAAS;AAC7C,OAAO,MAAMI,mBAAmB,GAAG,6BAA6B;;AAEhE;AACA,IAAIC,aAA4B,GAAG,IAAI;;AAEvC;AACA;AACA;AACA;AACA,OAAO,MAAMC,aAAa,GAAG,MAAAA,CAAA,KAA6B;EACxD,IAAID,aAAa,EAAE;IACjB,OAAOA,aAAa;EACtB;EAEA,IAAI;IACF,MAAME,MAAM,GAAG,MAAMR,uBAAuB,CAAC,CAAC;IAC9C,IAAIQ,MAAM,CAACC,OAAO,EAAE;MAClBH,aAAa,GAAGE,MAAM,CAACC,OAAO;MAC9B,OAAOH,aAAa;IACtB;IACA,MAAMI,MAAM,GAAGR,gBAAgB,CAACM,MAAM,CAACG,QAAQ,CAAC;IAChDL,aAAa,GAAGH,kBAAkB,CAACO,MAAM,CAAC;IAC1C,OAAOJ,aAAa;EACtB,CAAC,CAAC,MAAM;IACN,OAAOF,oBAAoB;EAC7B;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMQ,iBAAiB,GAAGA,CAAA,KAAc;EAC7C,OAAON,aAAa,IAAIF,oBAAoB;AAC9C,CAAC;;AAED;AACA;AACA;AACA,OAAO,MAAMS,oBAAoB,GAAGA,CAAA,KAAY;EAC9CP,aAAa,GAAG,IAAI;AACtB,CAAC"}
@@ -0,0 +1,40 @@
1
+ const AP_ORIGIN = 'https://api-ap.stalliontech.io';
2
+ const US_ORIGIN = 'https://api-us.stalliontech.io';
3
+ const VALID_REGIONS = new Set(['ap', 'us']);
4
+ export { AP_ORIGIN, US_ORIGIN, VALID_REGIONS };
5
+
6
+ /**
7
+ * Parse the region prefix from a Stallion token.
8
+ * Returns 'ap' | 'us' | null. Null means legacy unprefixed token; default to 'ap'.
9
+ */
10
+ export function parseTokenRegion(token) {
11
+ if (typeof token !== 'string') {
12
+ return null;
13
+ }
14
+ const trimmed = token.trim();
15
+ if (!trimmed) {
16
+ return null;
17
+ }
18
+
19
+ // App token: spb_<region>_<44-char nanoid> → 49 chars
20
+ if (trimmed.startsWith('spb_') && trimmed.length === 49 && trimmed.charAt(6) === '_') {
21
+ return extractRegion(trimmed);
22
+ }
23
+
24
+ // CI token: stl_<region>_<36-char nanoid> → 43 chars
25
+ if (trimmed.startsWith('stl_') && trimmed.length === 43 && trimmed.charAt(6) === '_') {
26
+ return extractRegion(trimmed);
27
+ }
28
+ return null;
29
+ }
30
+ function extractRegion(token) {
31
+ const code = token.substring(4, 6).toLowerCase();
32
+ if (!/^[a-z]{2}$/.test(code)) {
33
+ return null;
34
+ }
35
+ return VALID_REGIONS.has(code) ? code : null;
36
+ }
37
+ export function regionalApiBaseUrl(region) {
38
+ return region === 'us' ? US_ORIGIN : AP_ORIGIN;
39
+ }
40
+ //# sourceMappingURL=parseTokenRegion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AP_ORIGIN","US_ORIGIN","VALID_REGIONS","Set","parseTokenRegion","token","trimmed","trim","startsWith","length","charAt","extractRegion","code","substring","toLowerCase","test","has","regionalApiBaseUrl","region"],"sourceRoot":"../../../../src","sources":["main/utils/parseTokenRegion.ts"],"mappings":"AAAA,MAAMA,SAAS,GAAG,gCAAgC;AAClD,MAAMC,SAAS,GAAG,gCAAgC;AAElD,MAAMC,aAAa,GAAG,IAAIC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAE3C,SAASH,SAAS,EAAEC,SAAS,EAAEC,aAAa;;AAE5C;AACA;AACA;AACA;AACA,OAAO,SAASE,gBAAgBA,CAACC,KAAc,EAAsB;EACnE,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IAC7B,OAAO,IAAI;EACb;EAEA,MAAMC,OAAO,GAAGD,KAAK,CAACE,IAAI,CAAC,CAAC;EAC5B,IAAI,CAACD,OAAO,EAAE;IACZ,OAAO,IAAI;EACb;;EAEA;EACA,IACEA,OAAO,CAACE,UAAU,CAAC,MAAM,CAAC,IAC1BF,OAAO,CAACG,MAAM,KAAK,EAAE,IACrBH,OAAO,CAACI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EACzB;IACA,OAAOC,aAAa,CAACL,OAAO,CAAC;EAC/B;;EAEA;EACA,IACEA,OAAO,CAACE,UAAU,CAAC,MAAM,CAAC,IAC1BF,OAAO,CAACG,MAAM,KAAK,EAAE,IACrBH,OAAO,CAACI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EACzB;IACA,OAAOC,aAAa,CAACL,OAAO,CAAC;EAC/B;EAEA,OAAO,IAAI;AACb;AAEA,SAASK,aAAaA,CAACN,KAAa,EAAsB;EACxD,MAAMO,IAAI,GAAGP,KAAK,CAACQ,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EAChD,IAAI,CAAC,YAAY,CAACC,IAAI,CAACH,IAAI,CAAC,EAAE;IAC5B,OAAO,IAAI;EACb;EACA,OAAOV,aAAa,CAACc,GAAG,CAACJ,IAAI,CAAC,GAAIA,IAAI,GAAmB,IAAI;AAC/D;AAEA,OAAO,SAASK,kBAAkBA,CAACC,MAAqB,EAAU;EAChE,OAAOA,MAAM,KAAK,IAAI,GAAGjB,SAAS,GAAGD,SAAS;AAChD"}
@@ -1,8 +1,14 @@
1
- import { useCallback } from 'react';
2
- import { API_BASE_URL } from '../constants/apiConstants';
1
+ import { useCallback, useState, useEffect } from 'react';
2
+ import { getApiBaseUrl, DEFAULT_API_BASE_URL } from './getApiBaseUrl';
3
3
  export const useApiClient = (configState, authHandler) => {
4
+ const [baseUrl, setBaseUrl] = useState(DEFAULT_API_BASE_URL);
5
+
6
+ // Load base URL on mount
7
+ useEffect(() => {
8
+ getApiBaseUrl().then(setBaseUrl);
9
+ }, []);
4
10
  const getData = useCallback((apiPath, apiBody) => {
5
- const dataRequest = fetch(API_BASE_URL + apiPath, {
11
+ const dataRequest = fetch(baseUrl + apiPath, {
6
12
  method: 'POST',
7
13
  body: JSON.stringify(apiBody),
8
14
  headers: {
@@ -20,7 +26,7 @@ export const useApiClient = (configState, authHandler) => {
20
26
  return res.json();
21
27
  });
22
28
  } else return dataRequest.then(res => res.json());
23
- }, [configState, authHandler]);
29
+ }, [baseUrl, configState, authHandler]);
24
30
  return {
25
31
  getData
26
32
  };
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","API_BASE_URL","useApiClient","configState","authHandler","getData","apiPath","apiBody","dataRequest","fetch","method","body","JSON","stringify","headers","appToken","sdkToken","then","res","status","json"],"sourceRoot":"../../../../src","sources":["main/utils/useApiClient.ts"],"mappings":"AAAA,SAASA,WAAW,QAAQ,OAAO;AACnC,SAASC,YAAY,QAAmB,2BAA2B;AAKnE,OAAO,MAAMC,YAAY,GAAGA,CAC1BC,WAAgC,EAChCC,WAA0B,KACvB;EACH,MAAMC,OAAO,GAAGL,WAAW,CACzB,CAACM,OAAkB,EAAEC,OAAe,KAAmB;IACrD,MAAMC,WAAW,GAAGC,KAAK,CAACR,YAAY,GAAGK,OAAO,EAAE;MAChDI,MAAM,EAAE,MAAM;MACdC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACN,OAAO,CAAC;MAC7BO,OAAO,EAAE;QACP,QAAQ,EAAE,kBAAkB;QAC5B,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAEX,WAAW,CAACY,QAAQ,IAAI,EAAE;QACzC,wBAAwB,EAAEZ,WAAW,CAACa,QAAQ,IAAI;MACpD;IACF,CAAC,CAAC;IACF,IAAIZ,WAAW,EAAE;MACf,OAAOI,WAAW,CAACS,IAAI,CAAEC,GAAG,IAAK;QAC/B,IAAIA,GAAG,CAACC,MAAM,KAAK,GAAG,EAAE;UACtBf,WAAW,CAAC,IAAI,CAAC;QACnB;QACA,OAAOc,GAAG,CAACE,IAAI,CAAC,CAAC;MACnB,CAAC,CAAC;IACJ,CAAC,MAAM,OAAOZ,WAAW,CAACS,IAAI,CAAEC,GAAG,IAAKA,GAAG,CAACE,IAAI,CAAC,CAAC,CAAC;EACrD,CAAC,EACD,CAACjB,WAAW,EAAEC,WAAW,CAC3B,CAAC;EACD,OAAO;IACLC;EACF,CAAC;AACH,CAAC"}
1
+ {"version":3,"names":["useCallback","useState","useEffect","getApiBaseUrl","DEFAULT_API_BASE_URL","useApiClient","configState","authHandler","baseUrl","setBaseUrl","then","getData","apiPath","apiBody","dataRequest","fetch","method","body","JSON","stringify","headers","appToken","sdkToken","res","status","json"],"sourceRoot":"../../../../src","sources":["main/utils/useApiClient.ts"],"mappings":"AAAA,SAASA,WAAW,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,OAAO;AACxD,SAASC,aAAa,EAAEC,oBAAoB,QAAQ,iBAAiB;AAMrE,OAAO,MAAMC,YAAY,GAAGA,CAC1BC,WAAgC,EAChCC,WAA0B,KACvB;EACH,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGR,QAAQ,CAASG,oBAAoB,CAAC;;EAEpE;EACAF,SAAS,CAAC,MAAM;IACdC,aAAa,CAAC,CAAC,CAACO,IAAI,CAACD,UAAU,CAAC;EAClC,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,OAAO,GAAGX,WAAW,CACzB,CAACY,OAAkB,EAAEC,OAAe,KAAmB;IACrD,MAAMC,WAAW,GAAGC,KAAK,CAACP,OAAO,GAAGI,OAAO,EAAE;MAC3CI,MAAM,EAAE,MAAM;MACdC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACN,OAAO,CAAC;MAC7BO,OAAO,EAAE;QACP,QAAQ,EAAE,kBAAkB;QAC5B,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAEd,WAAW,CAACe,QAAQ,IAAI,EAAE;QACzC,wBAAwB,EAAEf,WAAW,CAACgB,QAAQ,IAAI;MACpD;IACF,CAAC,CAAC;IACF,IAAIf,WAAW,EAAE;MACf,OAAOO,WAAW,CAACJ,IAAI,CAAEa,GAAG,IAAK;QAC/B,IAAIA,GAAG,CAACC,MAAM,KAAK,GAAG,EAAE;UACtBjB,WAAW,CAAC,IAAI,CAAC;QACnB;QACA,OAAOgB,GAAG,CAACE,IAAI,CAAC,CAAC;MACnB,CAAC,CAAC;IACJ,CAAC,MAAM,OAAOX,WAAW,CAACJ,IAAI,CAAEa,GAAG,IAAKA,GAAG,CAACE,IAAI,CAAC,CAAC,CAAC;EACrD,CAAC,EACD,CAACjB,OAAO,EAAEF,WAAW,EAAEC,WAAW,CACpC,CAAC;EACD,OAAO;IACLI;EACF,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"names":["ConfigActionKind"],"sourceRoot":"../../../src","sources":["types/config.types.ts"],"mappings":"AAQA,WAAYA,gBAAgB,0BAAhBA,gBAAgB;EAAhBA,gBAAgB;EAAA,OAAhBA,gBAAgB;AAAA"}
1
+ {"version":3,"names":["ConfigActionKind"],"sourceRoot":"../../../src","sources":["types/config.types.ts"],"mappings":"AASA,WAAYA,gBAAgB,0BAAhBA,gBAAgB;EAAhBA,gBAAgB;EAAA,OAAhBA,gBAAgB;AAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parseTokenRegion.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseTokenRegion.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/parseTokenRegion.test.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
- export declare const API_BASE_URL = "https://api.stalliontech.io";
1
+ /** @deprecated Use getApiBaseUrl() instead */
2
+ export declare const API_BASE_URL = "https://api-ap.stalliontech.io";
2
3
  export declare enum API_PATHS {
3
4
  LOGIN = "/api/v1/sdk/auth/verify-pin",
4
5
  VERIFY_OTP = "/api/v1/auth/verify-otp",
@@ -1 +1 @@
1
- {"version":3,"file":"apiConstants.d.ts","sourceRoot":"","sources":["../../../../src/main/constants/apiConstants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,gCAAgC,CAAC;AAE1D,oBAAY,SAAS;IACnB,KAAK,gCAAgC;IACrC,UAAU,4BAA4B;IACtC,aAAa,6BAA6B;IAC1C,aAAa,wBAAwB;IACrC,sBAAsB,6BAA6B;IACnD,YAAY,6BAA6B;IACzC,UAAU,sCAAsC;IAChD,kBAAkB,mCAAmC;CACtD;AACD,eAAO,MAAM,oBAAoB,KAAK,CAAC"}
1
+ {"version":3,"file":"apiConstants.d.ts","sourceRoot":"","sources":["../../../../src/main/constants/apiConstants.ts"],"names":[],"mappings":"AAGA,8CAA8C;AAC9C,eAAO,MAAM,YAAY,mCAAuB,CAAC;AAEjD,oBAAY,SAAS;IACnB,KAAK,gCAAgC;IACrC,UAAU,4BAA4B;IACtC,aAAa,6BAA6B;IAC1C,aAAa,wBAAwB;IACrC,sBAAsB,6BAA6B;IACnD,YAAY,6BAA6B;IACzC,UAAU,sCAAsC;IAChD,kBAAkB,mCAAmC;CACtD;AACD,eAAO,MAAM,oBAAoB,KAAK,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useConfigActions.d.ts","sourceRoot":"","sources":["../../../../../src/main/state/actionCreators/useConfigActions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAItD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,QAAA,MAAM,gBAAgB,aAAc,MAAM,QAAQ,CAAC,aAAa,CAAC;;CAgBhE,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"useConfigActions.d.ts","sourceRoot":"","sources":["../../../../../src/main/state/actionCreators/useConfigActions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAKtD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,QAAA,MAAM,gBAAgB,aAAc,MAAM,QAAQ,CAAC,aAAa,CAAC;;CAkBhE,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useStallionEvents.d.ts","sourceRoot":"","sources":["../../../../src/main/state/useStallionEvents.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EAEpB,qBAAqB,EAEtB,MAAM,2BAA2B,CAAC;AASnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EACL,iBAAiB,EAElB,MAAM,8BAA8B,CAAC;AActC,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,eAAO,MAAM,iBAAiB,gBACf,MAAM,QAAQ,IAAI,CAAC,6BACL,MAAM,KAAK,IAAI,eAC7B,mBAAmB,sBACZ,MAAM,QAAQ,CAAC,iBAAiB,CAAC,uBAChC,mBAAmB,SAkHzC,CAAC"}
1
+ {"version":3,"file":"useStallionEvents.d.ts","sourceRoot":"","sources":["../../../../src/main/state/useStallionEvents.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EAEpB,qBAAqB,EAEtB,MAAM,2BAA2B,CAAC;AASnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EACL,iBAAiB,EAElB,MAAM,8BAA8B,CAAC;AActC,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,eAAO,MAAM,iBAAiB,gBACf,MAAM,QAAQ,IAAI,CAAC,6BACL,MAAM,KAAK,IAAI,eAC7B,mBAAmB,sBACZ,MAAM,QAAQ,CAAC,iBAAiB,CAAC,uBAChC,mBAAmB,SAmHzC,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare const DEFAULT_API_BASE_URL = "https://api-ap.stalliontech.io";
2
+ export declare const LEGACY_API_BASE_URL = "https://api.stalliontech.io";
3
+ /**
4
+ * Gets the API base URL from native config or returns regional default
5
+ * @returns Promise<string> - The base URL to use
6
+ */
7
+ export declare const getApiBaseUrl: () => Promise<string>;
8
+ /**
9
+ * Gets the API base URL synchronously (returns default if not cached)
10
+ * Use this when you need immediate access and can't await
11
+ * @returns string - The base URL (default if not loaded yet)
12
+ */
13
+ export declare const getApiBaseUrlSync: () => string;
14
+ /**
15
+ * Clears the cached base URL (useful for testing or config changes)
16
+ */
17
+ export declare const clearApiBaseUrlCache: () => void;
18
+ //# sourceMappingURL=getApiBaseUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getApiBaseUrl.d.ts","sourceRoot":"","sources":["../../../../src/main/utils/getApiBaseUrl.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,oBAAoB,mCAAY,CAAC;AAC9C,eAAO,MAAM,mBAAmB,gCAAgC,CAAC;AAKjE;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAa,QAAQ,MAAM,CAiBpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAAO,MAEpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,QAAO,IAEvC,CAAC"}
@@ -0,0 +1,11 @@
1
+ declare const AP_ORIGIN = "https://api-ap.stalliontech.io";
2
+ declare const US_ORIGIN = "https://api-us.stalliontech.io";
3
+ declare const VALID_REGIONS: Set<string>;
4
+ export { AP_ORIGIN, US_ORIGIN, VALID_REGIONS };
5
+ /**
6
+ * Parse the region prefix from a Stallion token.
7
+ * Returns 'ap' | 'us' | null. Null means legacy unprefixed token; default to 'ap'.
8
+ */
9
+ export declare function parseTokenRegion(token: unknown): 'ap' | 'us' | null;
10
+ export declare function regionalApiBaseUrl(region: string | null): string;
11
+ //# sourceMappingURL=parseTokenRegion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseTokenRegion.d.ts","sourceRoot":"","sources":["../../../../src/main/utils/parseTokenRegion.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,SAAS,mCAAmC,CAAC;AACnD,QAAA,MAAM,SAAS,mCAAmC,CAAC;AAEnD,QAAA,MAAM,aAAa,aAAwB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CA6BnE;AAUD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"useApiClient.d.ts","sourceRoot":"","sources":["../../../../src/main/utils/useApiClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,KAAK,YAAY,GAAG,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;AAErD,eAAO,MAAM,YAAY,gBACV,mBAAmB,gBAClB,YAAY;uBAGd,SAAS,WAAW,MAAM,KAAG,QAAQ,GAAG,CAAC;CAyBtD,CAAC"}
1
+ {"version":3,"file":"useApiClient.d.ts","sourceRoot":"","sources":["../../../../src/main/utils/useApiClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,KAAK,YAAY,GAAG,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;AAErD,eAAO,MAAM,YAAY,gBACV,mBAAmB,gBAClB,YAAY;uBAUd,SAAS,WAAW,MAAM,KAAG,QAAQ,GAAG,CAAC;CAyBtD,CAAC"}
@@ -4,6 +4,7 @@ export interface IStallionConfigJson {
4
4
  appToken: string;
5
5
  sdkToken: string;
6
6
  appVersion: string;
7
+ baseUrl?: string;
7
8
  }
8
9
  export declare enum ConfigActionKind {
9
10
  SET_CONFIG = "SET_CONFIG"
@@ -1 +1 @@
1
- {"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,oBAAY,gBAAgB;IAC1B,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,gBAAgB,CAAC,UAAU,CAAC;IAClC,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC"}
1
+ {"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oBAAY,gBAAgB;IAC1B,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,gBAAgB,CAAC,UAAU,CAAC;IAClC,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC"}
@@ -8,6 +8,7 @@ interface IBundleInfo {
8
8
  hash: string;
9
9
  }
10
10
  export interface IStallionInitParams {
11
+ baseUrl?: string;
11
12
  }
12
13
  export type IWithStallion = (BaseComponent: React.ComponentType, initPrams?: IStallionInitParams) => React.ComponentType;
13
14
  export interface IStallionConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.types.d.ts","sourceRoot":"","sources":["../../../src/types/utils.types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;CAAG;AAEvC,MAAM,MAAM,aAAa,GAAG,CAC1B,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,SAAS,CAAC,EAAE,mBAAmB,KAC5B,KAAK,CAAC,aAAa,CAAC;AAEzB,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAC7B,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEvE,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;AAElE,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE1E,MAAM,MAAM,2BAA2B,GAAG,CACxC,WAAW,EAAE,aAAa,KACvB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAAG,CAClC,UAAU,EAAE,WAAW,KACpB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAAG,CAAC,kBAAkB,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzE,MAAM,MAAM,2BAA2B,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sBAAsB,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC"}
1
+ {"version":3,"file":"utils.types.d.ts","sourceRoot":"","sources":["../../../src/types/utils.types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,SAAS,CAAC,EAAE,mBAAmB,KAC5B,KAAK,CAAC,aAAa,CAAC;AAEzB,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAC7B,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEvE,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;AAElE,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE1E,MAAM,MAAM,2BAA2B,GAAG,CACxC,WAAW,EAAE,aAAa,KACvB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAAG,CAClC,UAAU,EAAE,WAAW,KACpB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAAG,CAAC,kBAAkB,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzE,MAAM,MAAM,2BAA2B,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sBAAsB,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC"}