react-native-stallion 1.1.2 → 2.0.0-alpha.2

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 (296) hide show
  1. package/android/src/main/java/com/stallion/Stallion.java +153 -9
  2. package/android/src/main/java/com/stallion/StallionModule.java +128 -167
  3. package/android/src/main/java/com/stallion/events/StallionEventConstants.java +22 -0
  4. package/android/src/main/java/com/stallion/events/StallionEventManager.java +160 -0
  5. package/android/src/main/java/com/stallion/networkmanager/StallionApiConstants.java +28 -0
  6. package/android/src/main/java/com/stallion/networkmanager/StallionApiManager.java +96 -0
  7. package/android/src/main/java/com/stallion/networkmanager/StallionDownloadCallback.java +7 -0
  8. package/android/src/main/java/com/stallion/networkmanager/StallionFileDownloader.java +224 -0
  9. package/android/src/main/java/com/stallion/networkmanager/StallionStageManager.java +77 -0
  10. package/android/src/main/java/com/stallion/networkmanager/StallionSyncHandler.java +183 -0
  11. package/android/src/main/java/com/stallion/storage/StallionConfig.java +120 -0
  12. package/android/src/main/java/com/stallion/storage/StallionConfigConstants.java +24 -0
  13. package/android/src/main/java/com/stallion/storage/StallionMeta.java +206 -0
  14. package/android/src/main/java/com/stallion/storage/StallionMetaConstants.java +30 -0
  15. package/android/src/main/java/com/stallion/storage/StallionStateManager.java +110 -0
  16. package/android/src/main/java/com/stallion/{StallionDefaultErrorActivity.java → utils/StallionErrorActivity.java} +11 -10
  17. package/android/src/main/java/com/stallion/utils/StallionExceptionHandler.java +102 -0
  18. package/android/src/main/java/com/stallion/utils/StallionFileManager.java +205 -0
  19. package/android/src/main/java/com/stallion/utils/StallionSlotManager.java +110 -0
  20. package/ios/main/Stallion-Bridging-Header.h +6 -1
  21. package/ios/main/Stallion.m +28 -9
  22. package/ios/main/Stallion.swift +132 -50
  23. package/ios/main/StallionConfig.h +24 -0
  24. package/ios/main/StallionConfig.m +62 -0
  25. package/ios/main/StallionConfigConstants.h +32 -0
  26. package/ios/main/StallionConfigConstants.m +32 -0
  27. package/ios/main/StallionConstants.swift +53 -10
  28. package/ios/main/StallionEventHandler.h +23 -0
  29. package/ios/main/StallionEventHandler.m +138 -0
  30. package/ios/main/StallionExceptionHandler.h +18 -0
  31. package/ios/main/StallionExceptionHandler.m +94 -0
  32. package/ios/main/StallionFileDownloader.swift +147 -0
  33. package/ios/main/StallionFileManager.h +20 -0
  34. package/ios/main/StallionFileManager.m +126 -0
  35. package/ios/main/StallionMeta.h +29 -0
  36. package/ios/main/StallionMeta.m +98 -0
  37. package/ios/main/StallionMetaConstants.h +28 -0
  38. package/ios/main/StallionMetaConstants.m +42 -0
  39. package/ios/main/StallionModule.m +137 -20
  40. package/ios/main/StallionObjConstants.h +47 -0
  41. package/ios/main/StallionObjConstants.m +128 -0
  42. package/ios/main/StallionSlotManager.h +21 -0
  43. package/ios/main/StallionSlotManager.m +114 -0
  44. package/ios/main/StallionStageManager.swift +84 -0
  45. package/ios/main/StallionStateManager.h +31 -0
  46. package/ios/main/StallionStateManager.m +87 -0
  47. package/ios/main/StallionSyncHandler.swift +212 -0
  48. package/package.json +6 -2
  49. package/src/index.js +5 -15
  50. package/src/index.js.map +1 -1
  51. package/src/main/components/common/ButtonFullWidth/styles.js +2 -2
  52. package/src/main/components/common/ButtonFullWidth/styles.js.map +1 -1
  53. package/src/main/components/common/Footer/index.js +24 -31
  54. package/src/main/components/common/Footer/index.js.map +1 -1
  55. package/src/main/components/common/Footer/styles.js +34 -33
  56. package/src/main/components/common/Footer/styles.js.map +1 -1
  57. package/src/main/components/common/Header/index.js +14 -17
  58. package/src/main/components/common/Header/index.js.map +1 -1
  59. package/src/main/components/common/Header/styles.js +10 -5
  60. package/src/main/components/common/Header/styles.js.map +1 -1
  61. package/src/main/components/common/Spinner/index.js +3 -1
  62. package/src/main/components/common/Spinner/index.js.map +1 -1
  63. package/src/main/components/modules/listing/components/BucketCard.js +3 -3
  64. package/src/main/components/modules/listing/components/BucketCard.js.map +1 -1
  65. package/src/main/components/modules/listing/components/BundleCard.js +9 -5
  66. package/src/main/components/modules/listing/components/BundleCard.js.map +1 -1
  67. package/src/main/components/modules/listing/components/BundleCardInfoSection.js +21 -12
  68. package/src/main/components/modules/listing/components/BundleCardInfoSection.js.map +1 -1
  69. package/src/main/components/modules/listing/components/CardDescriptionContent.js +3 -2
  70. package/src/main/components/modules/listing/components/CardDescriptionContent.js.map +1 -1
  71. package/src/main/components/modules/listing/components/ConfigView.js +19 -0
  72. package/src/main/components/modules/listing/components/ConfigView.js.map +1 -0
  73. package/src/main/components/modules/listing/components/MetaCard.js +38 -0
  74. package/src/main/components/modules/listing/components/MetaCard.js.map +1 -0
  75. package/src/main/components/modules/listing/components/SlotView.js +84 -0
  76. package/src/main/components/modules/listing/components/SlotView.js.map +1 -0
  77. package/src/main/components/modules/listing/components/styles/index.js +31 -10
  78. package/src/main/components/modules/listing/components/styles/index.js.map +1 -1
  79. package/src/main/components/modules/listing/hooks/useListing.js +5 -4
  80. package/src/main/components/modules/listing/hooks/useListing.js.map +1 -1
  81. package/src/main/components/modules/listing/index.js +12 -4
  82. package/src/main/components/modules/listing/index.js.map +1 -1
  83. package/src/main/components/modules/login/index.js +42 -38
  84. package/src/main/components/modules/login/index.js.map +1 -1
  85. package/src/main/components/modules/login/styles/index.js +21 -7
  86. package/src/main/components/modules/login/styles/index.js.map +1 -1
  87. package/src/main/components/modules/modal/StallionModal.js +28 -31
  88. package/src/main/components/modules/modal/StallionModal.js.map +1 -1
  89. package/src/main/components/modules/modal/hooks/useStallionModal.js +16 -52
  90. package/src/main/components/modules/modal/hooks/useStallionModal.js.map +1 -1
  91. package/src/main/components/modules/prod/index.js +3 -0
  92. package/src/main/components/modules/prod/index.js.map +1 -0
  93. package/src/main/components/modules/prod/prod.js +35 -0
  94. package/src/main/components/modules/prod/prod.js.map +1 -0
  95. package/src/main/components/modules/prod/styles/index.js +23 -0
  96. package/src/main/components/modules/prod/styles/index.js.map +1 -0
  97. package/src/main/constants/apiConstants.js +4 -2
  98. package/src/main/constants/apiConstants.js.map +1 -1
  99. package/src/main/constants/appConstants.js +43 -7
  100. package/src/main/constants/appConstants.js.map +1 -1
  101. package/src/main/constants/colors.js +8 -6
  102. package/src/main/constants/colors.js.map +1 -1
  103. package/src/main/state/actionCreators/useBucketActions.js +10 -13
  104. package/src/main/state/actionCreators/useBucketActions.js.map +1 -1
  105. package/src/main/state/actionCreators/useBundleActions.js +14 -17
  106. package/src/main/state/actionCreators/useBundleActions.js.map +1 -1
  107. package/src/main/state/actionCreators/useConfigActions.js +20 -0
  108. package/src/main/state/actionCreators/useConfigActions.js.map +1 -0
  109. package/src/main/state/actionCreators/useDownloadActions.js +20 -42
  110. package/src/main/state/actionCreators/useDownloadActions.js.map +1 -1
  111. package/src/main/state/actionCreators/useMetaActions.js +6 -5
  112. package/src/main/state/actionCreators/useMetaActions.js.map +1 -1
  113. package/src/main/state/actionCreators/useUpdateMetaActions.js +77 -0
  114. package/src/main/state/actionCreators/useUpdateMetaActions.js.map +1 -0
  115. package/src/main/state/actionCreators/useUserActions.js +25 -85
  116. package/src/main/state/actionCreators/useUserActions.js.map +1 -1
  117. package/src/main/state/actions/configActions.js +8 -0
  118. package/src/main/state/actions/configActions.js.map +1 -0
  119. package/src/main/state/actions/userActions.js +3 -15
  120. package/src/main/state/actions/userActions.js.map +1 -1
  121. package/src/main/state/index.js +30 -13
  122. package/src/main/state/index.js.map +1 -1
  123. package/src/main/state/reducers/configReducer.js +19 -0
  124. package/src/main/state/reducers/configReducer.js.map +1 -0
  125. package/src/main/state/reducers/updateMetaReducer.js +36 -0
  126. package/src/main/state/reducers/updateMetaReducer.js.map +1 -0
  127. package/src/main/state/reducers/userReducer.js +3 -37
  128. package/src/main/state/reducers/userReducer.js.map +1 -1
  129. package/src/main/state/useStallionEvents.js +102 -0
  130. package/src/main/state/useStallionEvents.js.map +1 -0
  131. package/src/main/utils/ErrorBoundary.js +19 -16
  132. package/src/main/utils/ErrorBoundary.js.map +1 -1
  133. package/src/main/utils/StallionEventEmitter.js +20 -0
  134. package/src/main/utils/StallionEventEmitter.js.map +1 -0
  135. package/src/main/utils/StallionNativeUtils.js +35 -0
  136. package/src/main/utils/StallionNativeUtils.js.map +1 -0
  137. package/src/main/utils/debounce.js +16 -0
  138. package/src/main/utils/debounce.js.map +1 -0
  139. package/src/main/utils/useApiClient.js +28 -0
  140. package/src/main/utils/useApiClient.js.map +1 -0
  141. package/src/main/utils/useStallionModal.js +4 -3
  142. package/src/main/utils/useStallionModal.js.map +1 -1
  143. package/src/main/utils/useStallionUpdate.js +14 -0
  144. package/src/main/utils/useStallionUpdate.js.map +1 -0
  145. package/src/main/utils/withStallion.js +1 -4
  146. package/src/main/utils/withStallion.js.map +1 -1
  147. package/src/types/config.types.js +5 -0
  148. package/src/types/config.types.js.map +1 -0
  149. package/src/types/meta.types.js +11 -0
  150. package/src/types/meta.types.js.map +1 -1
  151. package/src/types/updateMeta.types.js +7 -0
  152. package/src/types/updateMeta.types.js.map +1 -0
  153. package/src/types/user.types.js +1 -2
  154. package/src/types/user.types.js.map +1 -1
  155. package/types/index.d.ts +3 -0
  156. package/types/index.d.ts.map +1 -1
  157. package/types/main/components/common/Footer/index.d.ts +1 -4
  158. package/types/main/components/common/Footer/index.d.ts.map +1 -1
  159. package/types/main/components/common/Footer/styles.d.ts +30 -29
  160. package/types/main/components/common/Footer/styles.d.ts.map +1 -1
  161. package/types/main/components/common/Header/index.d.ts +0 -2
  162. package/types/main/components/common/Header/index.d.ts.map +1 -1
  163. package/types/main/components/common/Header/styles.d.ts +6 -1
  164. package/types/main/components/common/Header/styles.d.ts.map +1 -1
  165. package/types/main/components/common/Spinner/index.d.ts.map +1 -1
  166. package/types/main/components/modules/listing/components/BucketCard.d.ts.map +1 -1
  167. package/types/main/components/modules/listing/components/BundleCard.d.ts.map +1 -1
  168. package/types/main/components/modules/listing/components/BundleCardInfoSection.d.ts +2 -0
  169. package/types/main/components/modules/listing/components/BundleCardInfoSection.d.ts.map +1 -1
  170. package/types/main/components/modules/listing/components/CardDescriptionContent.d.ts.map +1 -1
  171. package/types/main/components/modules/listing/components/ConfigView.d.ts +8 -0
  172. package/types/main/components/modules/listing/components/ConfigView.d.ts.map +1 -0
  173. package/types/main/components/modules/listing/components/MetaCard.d.ts +8 -0
  174. package/types/main/components/modules/listing/components/MetaCard.d.ts.map +1 -0
  175. package/types/main/components/modules/listing/components/SlotView.d.ts +5 -0
  176. package/types/main/components/modules/listing/components/SlotView.d.ts.map +1 -0
  177. package/types/main/components/modules/listing/components/styles/index.d.ts +26 -5
  178. package/types/main/components/modules/listing/components/styles/index.d.ts.map +1 -1
  179. package/types/main/components/modules/listing/hooks/useListing.d.ts +2 -0
  180. package/types/main/components/modules/listing/hooks/useListing.d.ts.map +1 -1
  181. package/types/main/components/modules/listing/index.d.ts.map +1 -1
  182. package/types/main/components/modules/login/index.d.ts.map +1 -1
  183. package/types/main/components/modules/login/styles/index.d.ts +17 -3
  184. package/types/main/components/modules/login/styles/index.d.ts.map +1 -1
  185. package/types/main/components/modules/modal/StallionModal.d.ts.map +1 -1
  186. package/types/main/components/modules/modal/hooks/useStallionModal.d.ts +2 -11
  187. package/types/main/components/modules/modal/hooks/useStallionModal.d.ts.map +1 -1
  188. package/types/main/components/modules/prod/index.d.ts +3 -0
  189. package/types/main/components/modules/prod/index.d.ts.map +1 -0
  190. package/types/main/components/modules/prod/prod.d.ts +4 -0
  191. package/types/main/components/modules/prod/prod.d.ts.map +1 -0
  192. package/types/main/components/modules/prod/styles/index.d.ts +19 -0
  193. package/types/main/components/modules/prod/styles/index.d.ts.map +1 -0
  194. package/types/main/constants/apiConstants.d.ts +5 -3
  195. package/types/main/constants/apiConstants.d.ts.map +1 -1
  196. package/types/main/constants/appConstants.d.ts +40 -7
  197. package/types/main/constants/appConstants.d.ts.map +1 -1
  198. package/types/main/constants/colors.d.ts +2 -0
  199. package/types/main/constants/colors.d.ts.map +1 -1
  200. package/types/main/index.d.ts +1 -1
  201. package/types/main/state/actionCreators/useBucketActions.d.ts +2 -1
  202. package/types/main/state/actionCreators/useBucketActions.d.ts.map +1 -1
  203. package/types/main/state/actionCreators/useBundleActions.d.ts +2 -1
  204. package/types/main/state/actionCreators/useBundleActions.d.ts.map +1 -1
  205. package/types/main/state/actionCreators/useConfigActions.d.ts +7 -0
  206. package/types/main/state/actionCreators/useConfigActions.d.ts.map +1 -0
  207. package/types/main/state/actionCreators/useDownloadActions.d.ts +5 -2
  208. package/types/main/state/actionCreators/useDownloadActions.d.ts.map +1 -1
  209. package/types/main/state/actionCreators/useMetaActions.d.ts +1 -1
  210. package/types/main/state/actionCreators/useMetaActions.d.ts.map +1 -1
  211. package/types/main/state/actionCreators/useUpdateMetaActions.d.ts +8 -0
  212. package/types/main/state/actionCreators/useUpdateMetaActions.d.ts.map +1 -0
  213. package/types/main/state/actionCreators/useUserActions.d.ts +5 -7
  214. package/types/main/state/actionCreators/useUserActions.d.ts.map +1 -1
  215. package/types/main/state/actions/configActions.d.ts +3 -0
  216. package/types/main/state/actions/configActions.d.ts.map +1 -0
  217. package/types/main/state/actions/userActions.d.ts +2 -4
  218. package/types/main/state/actions/userActions.d.ts.map +1 -1
  219. package/types/main/state/index.d.ts.map +1 -1
  220. package/types/main/state/reducers/configReducer.d.ts +4 -0
  221. package/types/main/state/reducers/configReducer.d.ts.map +1 -0
  222. package/types/main/state/reducers/updateMetaReducer.d.ts +10 -0
  223. package/types/main/state/reducers/updateMetaReducer.d.ts.map +1 -0
  224. package/types/main/state/reducers/userReducer.d.ts.map +1 -1
  225. package/types/main/state/useStallionEvents.d.ts +12 -0
  226. package/types/main/state/useStallionEvents.d.ts.map +1 -0
  227. package/types/main/utils/ErrorBoundary.d.ts +1 -1
  228. package/types/main/utils/ErrorBoundary.d.ts.map +1 -1
  229. package/types/main/utils/StallionEventEmitter.d.ts +11 -0
  230. package/types/main/utils/StallionEventEmitter.d.ts.map +1 -0
  231. package/types/main/utils/StallionNativeUtils.d.ts +11 -0
  232. package/types/main/utils/StallionNativeUtils.d.ts.map +1 -0
  233. package/types/main/utils/debounce.d.ts +3 -0
  234. package/types/main/utils/debounce.d.ts.map +1 -0
  235. package/types/main/utils/useApiClient.d.ts +8 -0
  236. package/types/main/utils/useApiClient.d.ts.map +1 -0
  237. package/types/main/utils/useStallionUpdate.d.ts +3 -0
  238. package/types/main/utils/useStallionUpdate.d.ts.map +1 -0
  239. package/types/main/utils/withStallion.d.ts +1 -2
  240. package/types/main/utils/withStallion.d.ts.map +1 -1
  241. package/types/types/config.types.d.ts +16 -0
  242. package/types/types/config.types.d.ts.map +1 -0
  243. package/types/types/globalProvider.types.d.ts +10 -10
  244. package/types/types/globalProvider.types.d.ts.map +1 -1
  245. package/types/types/meta.types.d.ts +18 -3
  246. package/types/types/meta.types.d.ts.map +1 -1
  247. package/types/types/updateMeta.types.d.ts +37 -0
  248. package/types/types/updateMeta.types.d.ts.map +1 -0
  249. package/types/types/user.types.d.ts +5 -20
  250. package/types/types/user.types.d.ts.map +1 -1
  251. package/types/types/utils.types.d.ts +15 -11
  252. package/types/types/utils.types.d.ts.map +1 -1
  253. package/android/src/main/java/com/stallion/StallionConstants.java +0 -37
  254. package/android/src/main/java/com/stallion/StallionErrorBoundary.java +0 -49
  255. package/android/src/main/java/com/stallion/StallionStorage.java +0 -54
  256. package/android/src/main/java/com/stallion/StallionZip.java +0 -127
  257. package/ios/main/StallionDownloader.swift +0 -124
  258. package/ios/main/StallionErrorBoundary.h +0 -17
  259. package/ios/main/StallionErrorBoundary.m +0 -62
  260. package/ios/main/StallionUtil.swift +0 -29
  261. package/src/main/components/common/ProfileOverlay/index.js +0 -39
  262. package/src/main/components/common/ProfileOverlay/index.js.map +0 -1
  263. package/src/main/components/common/ProfileOverlay/styles.js +0 -39
  264. package/src/main/components/common/ProfileOverlay/styles.js.map +0 -1
  265. package/src/main/components/modules/login/components/Email.js +0 -41
  266. package/src/main/components/modules/login/components/Email.js.map +0 -1
  267. package/src/main/components/modules/login/components/Otp.js +0 -45
  268. package/src/main/components/modules/login/components/Otp.js.map +0 -1
  269. package/src/main/components/modules/login/components/styles/index.js +0 -28
  270. package/src/main/components/modules/login/components/styles/index.js.map +0 -1
  271. package/src/main/components/modules/login/hooks/useLoginFlow.js +0 -60
  272. package/src/main/components/modules/login/hooks/useLoginFlow.js.map +0 -1
  273. package/src/main/utils/SharedDataManager.js +0 -34
  274. package/src/main/utils/SharedDataManager.js.map +0 -1
  275. package/src/main/utils/StallionNaitveUtils.js +0 -7
  276. package/src/main/utils/StallionNaitveUtils.js.map +0 -1
  277. package/src/main/utils/apiUtils.js +0 -16
  278. package/src/main/utils/apiUtils.js.map +0 -1
  279. package/types/main/components/common/ProfileOverlay/index.d.ts +0 -10
  280. package/types/main/components/common/ProfileOverlay/index.d.ts.map +0 -1
  281. package/types/main/components/common/ProfileOverlay/styles.d.ts +0 -36
  282. package/types/main/components/common/ProfileOverlay/styles.d.ts.map +0 -1
  283. package/types/main/components/modules/login/components/Email.d.ts +0 -13
  284. package/types/main/components/modules/login/components/Email.d.ts.map +0 -1
  285. package/types/main/components/modules/login/components/Otp.d.ts +0 -12
  286. package/types/main/components/modules/login/components/Otp.d.ts.map +0 -1
  287. package/types/main/components/modules/login/components/styles/index.d.ts +0 -25
  288. package/types/main/components/modules/login/components/styles/index.d.ts.map +0 -1
  289. package/types/main/components/modules/login/hooks/useLoginFlow.d.ts +0 -18
  290. package/types/main/components/modules/login/hooks/useLoginFlow.d.ts.map +0 -1
  291. package/types/main/utils/SharedDataManager.d.ts +0 -18
  292. package/types/main/utils/SharedDataManager.d.ts.map +0 -1
  293. package/types/main/utils/StallionNaitveUtils.d.ts +0 -7
  294. package/types/main/utils/StallionNaitveUtils.d.ts.map +0 -1
  295. package/types/main/utils/apiUtils.d.ts +0 -7
  296. package/types/main/utils/apiUtils.d.ts.map +0 -1
@@ -1,27 +1,28 @@
1
- package com.stallion;
1
+ package com.stallion.utils;
2
2
 
3
3
  import android.app.Activity;
4
4
  import android.os.Bundle;
5
- import android.util.Log;
6
5
  import android.widget.Button;
7
6
  import android.widget.TextView;
8
7
 
9
- public class StallionDefaultErrorActivity extends Activity {
10
- private TextView stackTraceView;
11
- private Button continueButton;
8
+ import com.stallion.R;
9
+
10
+ import java.util.Objects;
11
+
12
+ public class StallionErrorActivity extends Activity {
12
13
  @Override
13
14
  protected void onCreate(Bundle savedInstanceState) {
14
15
  super.onCreate(savedInstanceState);
15
- Log.d("StallionDefault", "StallionDefaultErrorActivity");
16
- String receivedStackTrace = getIntent().getExtras().getString("stack_trace_string");
16
+ String receivedStackTrace = Objects.requireNonNull(getIntent().getExtras()).getString("stack_trace_string");
17
17
  String stackTraceString = receivedStackTrace != null ? receivedStackTrace : "null";
18
18
  setContentView(R.layout.stallion_default_error_activity);
19
- stackTraceView = findViewById(R.id.seb_stack_trace_text_view);
19
+ TextView stackTraceView = findViewById(R.id.seb_stack_trace_text_view);
20
20
  stackTraceView.setText(stackTraceString);
21
- continueButton = findViewById(R.id.seb_continue_button);
21
+ Button continueButton = findViewById(R.id.seb_continue_button);
22
22
  continueButton.setOnClickListener(view -> continueExceptionFlow());
23
23
  }
24
24
  private void continueExceptionFlow() {
25
- StallionErrorBoundary.continueExceptionFlow();
25
+ StallionExceptionHandler.continueExceptionFlow();
26
26
  }
27
27
  }
28
+
@@ -0,0 +1,102 @@
1
+ package com.stallion.utils;
2
+
3
+ import android.app.Activity;
4
+ import android.content.Intent;
5
+ import android.util.Log;
6
+
7
+ import com.facebook.react.bridge.ReactApplicationContext;
8
+ import com.stallion.events.StallionEventConstants;
9
+ import com.stallion.events.StallionEventManager;
10
+ import com.stallion.storage.StallionMetaConstants;
11
+ import com.stallion.storage.StallionStateManager;
12
+
13
+ import org.json.JSONObject;
14
+
15
+ public class StallionExceptionHandler {
16
+
17
+ private static Thread.UncaughtExceptionHandler _androidUncaughtExceptionHandler;
18
+ private static Thread _exceptionThread;
19
+ private static Throwable _exceptionThrowable;
20
+ private static Activity _reactActivity;
21
+
22
+ public static void initErrorBoundary(ReactApplicationContext currentContext) {
23
+ _androidUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
24
+ _reactActivity = currentContext.getCurrentActivity();
25
+ Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
26
+ _exceptionThread = thread;
27
+ _exceptionThrowable = throwable;
28
+
29
+ // Safely trim the stack trace string
30
+ String stackTraceString = Log.getStackTraceString(throwable);
31
+ stackTraceString = stackTraceString.length() > 900
32
+ ? stackTraceString.substring(0, 900) + "..."
33
+ : stackTraceString;
34
+
35
+ StallionStateManager stateManager = StallionStateManager.getInstance();
36
+ StallionMetaConstants.SwitchState switchState = stateManager.stallionMeta.getSwitchState();
37
+
38
+ if (switchState == StallionMetaConstants.SwitchState.PROD) {
39
+ handleProdState(stackTraceString, stateManager);
40
+ } else if (switchState == StallionMetaConstants.SwitchState.STAGE) {
41
+ handleStageState(stackTraceString, stateManager);
42
+ } else {
43
+ continueExceptionFlow();
44
+ }
45
+ });
46
+ }
47
+
48
+ private static void emitException(String stackTraceString, String releaseHash, boolean isAutoRollback, boolean isProd) {
49
+ JSONObject syncErrorPayload = new JSONObject();
50
+ try {
51
+ syncErrorPayload.put("meta", stackTraceString);
52
+ syncErrorPayload.put("releaseHash", releaseHash);
53
+ syncErrorPayload.put("isAutoRollback", Boolean.toString(isAutoRollback));
54
+ } catch (Exception ignored) { }
55
+ StallionEventManager.getInstance().sendEvent(
56
+ isProd ?
57
+ StallionEventConstants.NativeProdEventTypes.EXCEPTION_PROD.toString()
58
+ : StallionEventConstants.NativeStageEventTypes.EXCEPTION_STAGE.toString(),
59
+ syncErrorPayload
60
+ );
61
+ }
62
+
63
+ private static void handleProdState(String stackTraceString, StallionStateManager stateManager) {
64
+ boolean isAutoRollback = !stateManager.getIsMounted();
65
+ String currentHash = stateManager.stallionMeta.getHashAtCurrentProdSlot();
66
+
67
+ // Emit exception event
68
+ emitException(stackTraceString, currentHash, isAutoRollback, true);
69
+
70
+ // Perform rollback if auto-rollback is enabled
71
+ if (isAutoRollback) {
72
+ StallionSlotManager.rollbackProd(true, stackTraceString);
73
+ }
74
+
75
+ continueExceptionFlow();
76
+ }
77
+
78
+ private static void handleStageState(String stackTraceString, StallionStateManager stateManager) {
79
+ boolean isAutoRollback = !stateManager.getIsMounted();
80
+ String currentStageHash = stateManager.stallionMeta.getStageNewHash();
81
+
82
+ // Emit exception event
83
+ emitException(stackTraceString, currentStageHash, isAutoRollback, false);
84
+
85
+ StallionSlotManager.rollbackStage();
86
+
87
+ if (_reactActivity != null) {
88
+ Intent errorIntent = new Intent(_reactActivity, StallionErrorActivity.class);
89
+ errorIntent.putExtra("stack_trace_string", stackTraceString);
90
+ _reactActivity.startActivity(errorIntent);
91
+ _reactActivity.finish();
92
+ } else {
93
+ continueExceptionFlow();
94
+ }
95
+ }
96
+
97
+ public static void continueExceptionFlow() {
98
+ if (_androidUncaughtExceptionHandler != null) {
99
+ _androidUncaughtExceptionHandler.uncaughtException(_exceptionThread, _exceptionThrowable);
100
+ }
101
+ }
102
+ }
@@ -0,0 +1,205 @@
1
+ package com.stallion.utils;
2
+
3
+ import android.os.Build;
4
+
5
+ import java.io.BufferedOutputStream;
6
+ import java.io.File;
7
+ import java.io.FileInputStream;
8
+ import java.io.FileOutputStream;
9
+ import java.io.IOException;
10
+ import java.io.InputStream;
11
+ import java.io.OutputStream;
12
+ import java.nio.charset.Charset;
13
+ import java.util.Enumeration;
14
+ import java.util.zip.ZipEntry;
15
+ import java.util.zip.ZipFile;
16
+
17
+ public class StallionFileManager {
18
+
19
+ // Constants
20
+ private static final int BUFFER_SIZE = 4096;
21
+ private static final String CHARSET_UTF_8 = "UTF-8";
22
+ private static final String FILE_NOT_FOUND_ERROR = "File does not exist: ";
23
+ private static final String SECURITY_EXCEPTION_MESSAGE = "Zip Path Traversal Vulnerability: ";
24
+
25
+ /**
26
+ * Unzips a given ZIP file to the specified destination directory.
27
+ *
28
+ * @param zipFilePath The path to the ZIP file.
29
+ * @param destDirectory The destination directory where the contents will be extracted.
30
+ */
31
+ public static void unzipFile(String zipFilePath, String destDirectory) {
32
+ validateFileExists(zipFilePath);
33
+ try (ZipFile zipFile = openZipFile(zipFilePath)) {
34
+ extractZipEntries(zipFile, destDirectory);
35
+ } catch (IOException e) {
36
+ throw new RuntimeException("Error unzipping file: " + e.getMessage(), e);
37
+ }
38
+ }
39
+
40
+ private static void validateFileExists(String filePath) {
41
+ File file = new File(filePath);
42
+ if (!file.exists()) {
43
+ throw new IllegalArgumentException(FILE_NOT_FOUND_ERROR + filePath);
44
+ }
45
+ }
46
+
47
+ private static ZipFile openZipFile(String zipFilePath) throws IOException {
48
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
49
+ return new ZipFile(zipFilePath, Charset.forName(CHARSET_UTF_8));
50
+ } else {
51
+ return new ZipFile(zipFilePath);
52
+ }
53
+ }
54
+
55
+ private static void extractZipEntries(ZipFile zipFile, String destDirectory) throws IOException {
56
+ Enumeration<? extends ZipEntry> entries = zipFile.entries();
57
+ while (entries.hasMoreElements()) {
58
+ extractZipEntry(entries.nextElement(), destDirectory, zipFile);
59
+ }
60
+ }
61
+
62
+ private static void extractZipEntry(ZipEntry entry, String destDirectory, ZipFile zipFile) throws IOException {
63
+ if (entry.isDirectory()) return;
64
+
65
+ File outputFile = new File(destDirectory, entry.getName());
66
+ validateZipEntryPath(outputFile, destDirectory);
67
+ createParentDirectory(outputFile);
68
+
69
+ try (InputStream in = zipFile.getInputStream(entry);
70
+ BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile))) {
71
+ copy(in, out);
72
+ }
73
+ }
74
+
75
+ private static void validateZipEntryPath(File outputFile, String destDirectory) throws IOException {
76
+ String canonicalPath = outputFile.getCanonicalPath();
77
+ String canonicalDestDir = new File(destDirectory).getCanonicalPath() + File.separator;
78
+ if (!canonicalPath.startsWith(canonicalDestDir)) {
79
+ throw new SecurityException(SECURITY_EXCEPTION_MESSAGE + canonicalPath);
80
+ }
81
+ }
82
+
83
+ private static void createParentDirectory(File file) {
84
+ File parentDir = file.getParentFile();
85
+ if (parentDir != null && !parentDir.exists() && !parentDir.mkdirs()) {
86
+ throw new RuntimeException("Failed to create parent directory: " + parentDir);
87
+ }
88
+ }
89
+
90
+ private static long copy(InputStream from, OutputStream to) throws IOException {
91
+ byte[] buffer = new byte[BUFFER_SIZE];
92
+ long total = 0;
93
+ int bytesRead;
94
+ while ((bytesRead = from.read(buffer)) != -1) {
95
+ to.write(buffer, 0, bytesRead);
96
+ total += bytesRead;
97
+ }
98
+ return total;
99
+ }
100
+
101
+ /**
102
+ * Deletes a file or directory silently. If it's a directory, all its contents are deleted recursively.
103
+ *
104
+ * @param file The file or directory to delete.
105
+ */
106
+ public static void deleteFileOrFolderSilently(File file) {
107
+ if(file.exists()) {
108
+ if (file.isDirectory()) {
109
+ File[] files = file.listFiles();
110
+ if (files != null) {
111
+ for (File child : files) {
112
+ deleteFileOrFolderSilently(child);
113
+ }
114
+ }
115
+ }
116
+ if (!file.delete()) {
117
+ throw new RuntimeException("Failed to delete file: " + file.getAbsolutePath());
118
+ }
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Moves a file from one location to another. If the destination file exists, it is replaced.
124
+ *
125
+ * @param fromFile Source file.
126
+ * @param toFile Destination file.
127
+ */
128
+ public static void moveFile(File fromFile, File toFile) {
129
+ if (toFile.exists()) {
130
+ deleteFileOrFolderSilently(toFile);
131
+ }
132
+ if (!toFile.getParentFile().exists() && !toFile.getParentFile().mkdirs()) {
133
+ throw new RuntimeException("Failed to create destination directory: " + toFile.getParent());
134
+ }
135
+ if (!fromFile.renameTo(toFile)) {
136
+ copyFileOrDirectory(fromFile, toFile);
137
+ deleteFileOrFolderSilently(fromFile);
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Copies a file or directory to the specified destination.
143
+ *
144
+ * @param source The source file or directory.
145
+ * @param destination The destination file or directory.
146
+ */
147
+ public static void copyFileOrDirectory(File source, File destination) {
148
+ if (!source.exists()) {
149
+ throw new IllegalArgumentException("Source does not exist: " + source.getAbsolutePath());
150
+ }
151
+
152
+ if (source.isDirectory()) {
153
+ // If the source is a directory, copy recursively
154
+ copyDirectory(source, destination);
155
+ } else {
156
+ // If the source is a file, copy the file
157
+ copyFile(source, destination);
158
+ }
159
+ }
160
+
161
+ /**
162
+ * Recursively copies a directory and its contents to a destination.
163
+ *
164
+ * @param sourceDir The source directory to copy.
165
+ * @param destinationDir The destination directory.
166
+ */
167
+ public static void copyDirectory(File sourceDir, File destinationDir) {
168
+ if (!sourceDir.exists()) {
169
+ throw new IllegalArgumentException("Source directory does not exist: " + sourceDir.getAbsolutePath());
170
+ }
171
+ if (!sourceDir.isDirectory()) {
172
+ throw new IllegalArgumentException("Source is not a directory: " + sourceDir.getAbsolutePath());
173
+ }
174
+
175
+ // Ensure destination directory exists
176
+ if (!destinationDir.exists() && !destinationDir.mkdirs()) {
177
+ throw new RuntimeException("Failed to create destination directory: " + destinationDir.getAbsolutePath());
178
+ }
179
+
180
+ File[] files = sourceDir.listFiles();
181
+ if (files == null) {
182
+ throw new RuntimeException("Failed to list files in directory: " + sourceDir.getAbsolutePath());
183
+ }
184
+
185
+ for (File file : files) {
186
+ File destFile = new File(destinationDir, file.getName());
187
+ if (file.isDirectory()) {
188
+ // Recursively copy subdirectories
189
+ copyDirectory(file, destFile);
190
+ } else {
191
+ // Copy individual files
192
+ copyFile(file, destFile);
193
+ }
194
+ }
195
+ }
196
+
197
+ public static void copyFile(File source, File destination) {
198
+ try (InputStream in = new FileInputStream(source);
199
+ OutputStream out = new FileOutputStream(destination)) {
200
+ copy(in, out);
201
+ } catch (IOException e) {
202
+ throw new RuntimeException("Failed to copy file: " + e.getMessage(), e);
203
+ }
204
+ }
205
+ }
@@ -0,0 +1,110 @@
1
+ package com.stallion.utils;
2
+
3
+ import com.stallion.events.StallionEventManager;
4
+ import com.stallion.storage.StallionConfigConstants;
5
+ import com.stallion.storage.StallionMetaConstants;
6
+ import com.stallion.storage.StallionStateManager;
7
+ import com.stallion.events.StallionEventConstants.NativeProdEventTypes;
8
+
9
+ import org.json.JSONObject;
10
+
11
+ import java.io.File;
12
+
13
+ public class StallionSlotManager {
14
+
15
+ private static final StallionStateManager stateManager = StallionStateManager.getInstance();
16
+ private static final String baseFolderPath = stateManager.getStallionConfig().getFilesDirectory();
17
+
18
+ public static void rollbackProd(boolean isAutoRollback, String errorString) {
19
+ StallionMetaConstants.SlotStates currentProdSlot = stateManager.stallionMeta.getCurrentProdSlot();
20
+ String stableReleaseHash = stateManager.stallionMeta.getProdStableHash();
21
+ String newReleaseHash = stateManager.stallionMeta.getProdNewHash();
22
+
23
+ switch (currentProdSlot) {
24
+ case NEW_SLOT:
25
+ stateManager.stallionMeta.setProdNewHash("");
26
+ if (stableReleaseHash.isEmpty()) {
27
+ stateManager.stallionMeta.setCurrentProdSlot(StallionMetaConstants.SlotStates.DEFAULT_SLOT);
28
+ } else {
29
+ stateManager.stallionMeta.setCurrentProdSlot(StallionMetaConstants.SlotStates.STABLE_SLOT);
30
+ }
31
+ emitRollbackEvent(isAutoRollback, newReleaseHash, errorString);
32
+ stateManager.syncStallionMeta();
33
+ break;
34
+
35
+ case STABLE_SLOT:
36
+ stateManager.stallionMeta.setProdStableHash("");
37
+ stateManager.stallionMeta.setCurrentProdSlot(StallionMetaConstants.SlotStates.DEFAULT_SLOT);
38
+ emitRollbackEvent(isAutoRollback, stableReleaseHash, errorString);
39
+ stateManager.syncStallionMeta();
40
+ break;
41
+
42
+ default:
43
+ // Default slot, no rollback needed
44
+ break;
45
+ }
46
+ }
47
+
48
+ public static void fallbackProd() {
49
+ StallionFileManager.deleteFileOrFolderSilently(new File(baseFolderPath + StallionConfigConstants.PROD_DIRECTORY + StallionConfigConstants.NEW_FOLDER_SLOT));
50
+ StallionFileManager.deleteFileOrFolderSilently(new File(baseFolderPath + StallionConfigConstants.PROD_DIRECTORY + StallionConfigConstants.STABLE_FOLDER_SLOT));
51
+ StallionFileManager.deleteFileOrFolderSilently(new File(baseFolderPath + StallionConfigConstants.PROD_DIRECTORY + StallionConfigConstants.TEMP_FOLDER_SLOT));
52
+ stateManager.clearStallionMeta();
53
+ }
54
+
55
+ public static void rollbackStage() {
56
+ stateManager.stallionMeta.setCurrentStageSlot(StallionMetaConstants.SlotStates.DEFAULT_SLOT);
57
+ stateManager.stallionMeta.setStageNewHash("");
58
+ stateManager.syncStallionMeta();
59
+ }
60
+
61
+ public static void stabilizeProd() {
62
+ try {
63
+ File newSlot = new File(baseFolderPath, StallionConfigConstants.PROD_DIRECTORY + StallionConfigConstants.NEW_FOLDER_SLOT);
64
+ File stableSlot = new File(baseFolderPath, StallionConfigConstants.PROD_DIRECTORY + StallionConfigConstants.STABLE_FOLDER_SLOT);
65
+
66
+ StallionFileManager.copyDirectory(newSlot, stableSlot);
67
+
68
+ String newReleaseHash = stateManager.stallionMeta.getProdNewHash();
69
+ stateManager.stallionMeta.setProdStableHash(newReleaseHash);
70
+ stateManager.syncStallionMeta();
71
+ emitStabilizeEvent(newReleaseHash);
72
+ } catch (Exception ignored) {}
73
+ }
74
+
75
+ private static void emitRollbackEvent(boolean isAutoRollback, String rolledBackReleaseHash, String errorString) {
76
+ try {
77
+ JSONObject eventPayload = new JSONObject();
78
+ eventPayload.put("releaseHash", rolledBackReleaseHash);
79
+ eventPayload.put("meta", errorString);
80
+
81
+ String eventName = isAutoRollback
82
+ ? NativeProdEventTypes.AUTO_ROLLED_BACK_PROD.toString()
83
+ : NativeProdEventTypes.ROLLED_BACK_PROD.toString();
84
+
85
+ if (isAutoRollback) {
86
+ stateManager.stallionMeta.setLastRolledBackHash(rolledBackReleaseHash);
87
+ stateManager.syncStallionMeta();
88
+ }
89
+
90
+ StallionEventManager.getInstance().sendEvent(eventName, eventPayload);
91
+ } catch (Exception e) {
92
+ e.printStackTrace();
93
+ }
94
+ }
95
+
96
+ private static void emitStabilizeEvent(String newReleaseHash) {
97
+ try {
98
+ JSONObject eventPayload = new JSONObject();
99
+ eventPayload.put("releaseHash", newReleaseHash);
100
+
101
+ StallionEventManager.getInstance().sendEvent(
102
+ NativeProdEventTypes.STABILIZED_PROD.toString(),
103
+ eventPayload
104
+ );
105
+ } catch (Exception e) {
106
+ e.printStackTrace();
107
+ }
108
+ }
109
+ }
110
+
@@ -1,4 +1,9 @@
1
1
  #import <React/RCTBridgeModule.h>
2
2
  #import <React/RCTViewManager.h>
3
3
  #import <React/RCTEventEmitter.h>
4
- #import <StallionErrorBoundary.h>
4
+ #import <StallionObjConstants.h>
5
+ #import <StallionStateManager.h>
6
+ #import <StallionEventHandler.h>
7
+ #import <StallionMetaConstants.h>
8
+ #import <StallionSlotManager.h>
9
+ #import <StallionExceptionHandler.h>
@@ -3,15 +3,34 @@
3
3
 
4
4
  @interface RCT_EXTERN_MODULE(Stallion, NSObject)
5
5
 
6
- RCT_EXTERN_METHOD(downloadPackage:(NSDictionary *)bundleInfo
7
- withResolver:(RCTPromiseResolveBlock)resolve
8
- withRejecter:(RCTPromiseRejectBlock)reject
9
- )
10
-
11
- RCT_EXTERN_METHOD(getStallionMeta: (RCTResponseSenderBlock)callback)
12
- RCT_EXTERN_METHOD(getApiKey: (RCTResponseSenderBlock)callback)
13
- RCT_EXTERN_METHOD(setApiKey: (NSString *)apiKey)
14
- RCT_EXTERN_METHOD(toggleStallionSwitch: (BOOL *)isOn)
6
+ RCT_EXTERN_METHOD(onLaunch: (NSString *)launchMessage)
7
+
8
+ RCT_EXTERN_METHOD(sync)
9
+
10
+ RCT_EXTERN_METHOD(downloadStageBundle: (NSDictionary *)bundleInfo
11
+ resolver:(RCTPromiseResolveBlock)resolver
12
+ rejecter:(RCTPromiseRejectBlock)rejecter)
13
+
14
+ RCT_EXTERN_METHOD(getStallionConfig: (RCTPromiseResolveBlock)promise
15
+ rejecter:(RCTPromiseRejectBlock)rejecter)
16
+
17
+ RCT_EXTERN_METHOD(getStallionMeta: (RCTPromiseResolveBlock)promise
18
+ rejecter:(RCTPromiseRejectBlock)rejecter)
19
+
20
+ RCT_EXTERN_METHOD(toggleStallionSwitch: (NSString *)switchState
21
+ resolver:(RCTPromiseResolveBlock)resolver
22
+ rejecter:(RCTPromiseRejectBlock)rejecter)
23
+
24
+ RCT_EXTERN_METHOD(updateSdkToken: (NSString *)newSdkToken
25
+ resolver:(RCTPromiseResolveBlock)resolver
26
+ rejecter:(RCTPromiseRejectBlock)rejecter)
27
+
28
+ RCT_EXTERN_METHOD(popEvents: (RCTPromiseResolveBlock)promise
29
+ rejecter:(RCTPromiseRejectBlock)rejecter)
30
+
31
+ RCT_EXTERN_METHOD(acknowledgeEvents: (NSString *)eventIdsJson
32
+ resolver:(RCTPromiseResolveBlock)resolver
33
+ rejecter:(RCTPromiseRejectBlock)rejecter)
15
34
 
16
35
  + (BOOL)requiresMainQueueSetup
17
36
  {