@hot-updater/react-native 0.23.0 → 0.24.0

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 (91) hide show
  1. package/android/src/main/java/com/hotupdater/BundleFileStorageService.kt +393 -49
  2. package/android/src/main/java/com/hotupdater/BundleMetadata.kt +204 -0
  3. package/android/src/main/java/com/hotupdater/HotUpdater.kt +48 -36
  4. package/android/src/main/java/com/hotupdater/HotUpdaterException.kt +134 -0
  5. package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +168 -95
  6. package/android/src/main/java/com/hotupdater/OkHttpDownloadService.kt +15 -3
  7. package/android/src/main/java/com/hotupdater/SignatureVerifier.kt +17 -12
  8. package/android/src/newarch/HotUpdaterModule.kt +88 -23
  9. package/android/src/oldarch/HotUpdaterModule.kt +89 -22
  10. package/android/src/oldarch/HotUpdaterSpec.kt +6 -0
  11. package/ios/HotUpdater/Internal/BundleFileStorageService.swift +401 -77
  12. package/ios/HotUpdater/Internal/BundleMetadata.swift +177 -0
  13. package/ios/HotUpdater/Internal/HotUpdater.mm +213 -47
  14. package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +96 -25
  15. package/ios/HotUpdater/Internal/SignatureVerifier.swift +35 -29
  16. package/ios/HotUpdater/Internal/URLSessionDownloadService.swift +2 -2
  17. package/ios/HotUpdater/Public/HotUpdater.h +8 -2
  18. package/lib/commonjs/checkForUpdate.js +31 -28
  19. package/lib/commonjs/checkForUpdate.js.map +1 -1
  20. package/lib/commonjs/error.js +45 -1
  21. package/lib/commonjs/error.js.map +1 -1
  22. package/lib/commonjs/fetchUpdateInfo.js +7 -45
  23. package/lib/commonjs/fetchUpdateInfo.js.map +1 -1
  24. package/lib/commonjs/index.js +237 -208
  25. package/lib/commonjs/index.js.map +1 -1
  26. package/lib/commonjs/native.js +103 -3
  27. package/lib/commonjs/native.js.map +1 -1
  28. package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
  29. package/lib/commonjs/wrap.js +39 -1
  30. package/lib/commonjs/wrap.js.map +1 -1
  31. package/lib/module/checkForUpdate.js +32 -26
  32. package/lib/module/checkForUpdate.js.map +1 -1
  33. package/lib/module/error.js +45 -0
  34. package/lib/module/error.js.map +1 -1
  35. package/lib/module/fetchUpdateInfo.js +7 -45
  36. package/lib/module/fetchUpdateInfo.js.map +1 -1
  37. package/lib/module/index.js +238 -203
  38. package/lib/module/index.js.map +1 -1
  39. package/lib/module/native.js +87 -2
  40. package/lib/module/native.js.map +1 -1
  41. package/lib/module/specs/NativeHotUpdater.js.map +1 -1
  42. package/lib/module/wrap.js +40 -2
  43. package/lib/module/wrap.js.map +1 -1
  44. package/lib/typescript/commonjs/checkForUpdate.d.ts +11 -13
  45. package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
  46. package/lib/typescript/commonjs/error.d.ts +120 -0
  47. package/lib/typescript/commonjs/error.d.ts.map +1 -1
  48. package/lib/typescript/commonjs/fetchUpdateInfo.d.ts +3 -5
  49. package/lib/typescript/commonjs/fetchUpdateInfo.d.ts.map +1 -1
  50. package/lib/typescript/commonjs/index.d.ts +35 -41
  51. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  52. package/lib/typescript/commonjs/native.d.ts +58 -2
  53. package/lib/typescript/commonjs/native.d.ts.map +1 -1
  54. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +62 -0
  55. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
  56. package/lib/typescript/commonjs/wrap.d.ts +76 -5
  57. package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
  58. package/lib/typescript/module/checkForUpdate.d.ts +11 -13
  59. package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
  60. package/lib/typescript/module/error.d.ts +120 -0
  61. package/lib/typescript/module/error.d.ts.map +1 -1
  62. package/lib/typescript/module/fetchUpdateInfo.d.ts +3 -5
  63. package/lib/typescript/module/fetchUpdateInfo.d.ts.map +1 -1
  64. package/lib/typescript/module/index.d.ts +35 -41
  65. package/lib/typescript/module/index.d.ts.map +1 -1
  66. package/lib/typescript/module/native.d.ts +58 -2
  67. package/lib/typescript/module/native.d.ts.map +1 -1
  68. package/lib/typescript/module/specs/NativeHotUpdater.d.ts +62 -0
  69. package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
  70. package/lib/typescript/module/wrap.d.ts +76 -5
  71. package/lib/typescript/module/wrap.d.ts.map +1 -1
  72. package/package.json +8 -7
  73. package/plugin/build/withHotUpdater.js +55 -4
  74. package/src/checkForUpdate.ts +51 -40
  75. package/src/error.ts +153 -0
  76. package/src/fetchUpdateInfo.ts +10 -58
  77. package/src/index.ts +283 -206
  78. package/src/native.ts +88 -2
  79. package/src/specs/NativeHotUpdater.ts +63 -0
  80. package/src/wrap.tsx +131 -9
  81. package/android/src/main/java/com/hotupdater/HotUpdaterFactory.kt +0 -52
  82. package/ios/HotUpdater/Internal/HotUpdaterFactory.swift +0 -24
  83. package/lib/commonjs/runUpdateProcess.js +0 -69
  84. package/lib/commonjs/runUpdateProcess.js.map +0 -1
  85. package/lib/module/runUpdateProcess.js +0 -64
  86. package/lib/module/runUpdateProcess.js.map +0 -1
  87. package/lib/typescript/commonjs/runUpdateProcess.d.ts +0 -49
  88. package/lib/typescript/commonjs/runUpdateProcess.d.ts.map +0 -1
  89. package/lib/typescript/module/runUpdateProcess.d.ts +0 -49
  90. package/lib/typescript/module/runUpdateProcess.d.ts.map +0 -1
  91. package/src/runUpdateProcess.ts +0 -80
@@ -12,6 +12,8 @@ import com.facebook.react.modules.core.DeviceEventManagerModule
12
12
  import kotlinx.coroutines.CoroutineScope
13
13
  import kotlinx.coroutines.Dispatchers
14
14
  import kotlinx.coroutines.launch
15
+ import org.json.JSONArray
16
+ import org.json.JSONObject
15
17
 
16
18
  class HotUpdaterModule internal constructor(
17
19
  context: ReactApplicationContext,
@@ -20,11 +22,18 @@ class HotUpdaterModule internal constructor(
20
22
 
21
23
  override fun getName(): String = NAME
22
24
 
25
+ /**
26
+ * Gets the singleton HotUpdaterImpl instance
27
+ */
28
+ private fun getInstance(): HotUpdaterImpl = HotUpdater.getInstance(mReactApplicationContext)
29
+
23
30
  @ReactMethod
24
31
  override fun reload(promise: Promise) {
25
32
  CoroutineScope(Dispatchers.Main.immediate).launch {
26
33
  try {
27
- HotUpdater.reload(mReactApplicationContext)
34
+ val impl = getInstance()
35
+ val currentActivity = mReactApplicationContext.currentActivity
36
+ impl.reload(currentActivity)
28
37
  promise.resolve(null)
29
38
  } catch (e: Exception) {
30
39
  Log.d("HotUpdater", "Failed to reload", e)
@@ -40,30 +49,54 @@ class HotUpdaterModule internal constructor(
40
49
  ) {
41
50
  (mReactApplicationContext.currentActivity as FragmentActivity?)?.lifecycleScope?.launch {
42
51
  try {
43
- val bundleId = params.getString("bundleId")!!
52
+ // Parameter validation
53
+ if (params == null) {
54
+ promise.reject("UNKNOWN_ERROR", "Missing or invalid parameters for updateBundle")
55
+ return@launch
56
+ }
57
+
58
+ val bundleId = params.getString("bundleId")
59
+ if (bundleId == null || bundleId.isEmpty()) {
60
+ promise.reject("MISSING_BUNDLE_ID", "Missing or empty 'bundleId'")
61
+ return@launch
62
+ }
63
+
44
64
  val fileUrl = params.getString("fileUrl")
45
- val fileHash = params.getString("fileHash")
46
65
 
47
- val isSuccess =
48
- HotUpdater.updateBundle(
49
- mReactApplicationContext,
50
- bundleId,
51
- fileUrl,
52
- fileHash,
53
- ) { progress ->
54
- val progressParams =
55
- WritableNativeMap().apply {
56
- putDouble("progress", progress)
57
- }
58
-
59
- this@HotUpdaterModule
60
- .mReactApplicationContext
61
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
62
- .emit("onProgress", progressParams)
66
+ // Validate fileUrl format if provided
67
+ if (fileUrl != null && fileUrl.isNotEmpty()) {
68
+ try {
69
+ java.net.URL(fileUrl)
70
+ } catch (e: java.net.MalformedURLException) {
71
+ promise.reject("INVALID_FILE_URL", "Invalid 'fileUrl' provided: $fileUrl")
72
+ return@launch
63
73
  }
64
- promise.resolve(isSuccess)
74
+ }
75
+
76
+ val fileHash = params.getString("fileHash")
77
+
78
+ val impl = getInstance()
79
+
80
+ impl.updateBundle(
81
+ bundleId,
82
+ fileUrl,
83
+ fileHash,
84
+ ) { progress ->
85
+ val progressParams =
86
+ WritableNativeMap().apply {
87
+ putDouble("progress", progress)
88
+ }
89
+
90
+ this@HotUpdaterModule
91
+ .mReactApplicationContext
92
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
93
+ .emit("onProgress", progressParams)
94
+ }
95
+ promise.resolve(true)
96
+ } catch (e: HotUpdaterException) {
97
+ promise.reject(e.code, e.message)
65
98
  } catch (e: Exception) {
66
- promise.reject("updateBundle", e)
99
+ promise.reject("UNKNOWN_ERROR", e.message ?: "An unknown error occurred")
67
100
  }
68
101
  }
69
102
  }
@@ -84,13 +117,47 @@ class HotUpdaterModule internal constructor(
84
117
 
85
118
  override fun getConstants(): Map<String, Any?> {
86
119
  val constants: MutableMap<String, Any?> = HashMap()
87
- constants["MIN_BUNDLE_ID"] = HotUpdater.getMinBundleId(mReactApplicationContext)
120
+ constants["MIN_BUNDLE_ID"] = HotUpdater.getMinBundleId()
88
121
  constants["APP_VERSION"] = HotUpdater.getAppVersion(mReactApplicationContext)
89
122
  constants["CHANNEL"] = HotUpdater.getChannel(mReactApplicationContext)
90
123
  constants["FINGERPRINT_HASH"] = HotUpdater.getFingerprintHash(mReactApplicationContext)
91
124
  return constants
92
125
  }
93
126
 
127
+ @ReactMethod(isBlockingSynchronousMethod = true)
128
+ override fun notifyAppReady(params: ReadableMap): String {
129
+ val bundleId = params?.getString("bundleId")
130
+ val result = JSONObject()
131
+
132
+ if (bundleId == null) {
133
+ result.put("status", "STABLE")
134
+ return result.toString()
135
+ }
136
+
137
+ val impl = getInstance()
138
+ val statusMap = impl.notifyAppReady(bundleId)
139
+
140
+ result.put("status", statusMap["status"] as? String ?: "STABLE")
141
+ statusMap["crashedBundleId"]?.let {
142
+ result.put("crashedBundleId", it as String)
143
+ }
144
+
145
+ return result.toString()
146
+ }
147
+
148
+ @ReactMethod(isBlockingSynchronousMethod = true)
149
+ override fun getCrashHistory(): String {
150
+ val impl = getInstance()
151
+ val crashHistory = impl.getCrashHistory()
152
+ return JSONArray(crashHistory).toString()
153
+ }
154
+
155
+ @ReactMethod(isBlockingSynchronousMethod = true)
156
+ override fun clearCrashHistory(): Boolean {
157
+ val impl = getInstance()
158
+ return impl.clearCrashHistory()
159
+ }
160
+
94
161
  companion object {
95
162
  const val NAME = "HotUpdater"
96
163
  }
@@ -14,4 +14,10 @@ abstract class HotUpdaterSpec internal constructor(
14
14
  )
15
15
 
16
16
  abstract fun reload(promise: Promise)
17
+
18
+ abstract fun notifyAppReady(params: ReadableMap): String
19
+
20
+ abstract fun getCrashHistory(): String
21
+
22
+ abstract fun clearCrashHistory(): Boolean
17
23
  }