@hot-updater/react-native 0.20.11 → 0.20.13

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 (60) hide show
  1. package/android/src/main/java/com/hotupdater/HotUpdater.kt +1 -1
  2. package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +6 -6
  3. package/android/src/newarch/HotUpdaterModule.kt +11 -5
  4. package/android/src/newarch/ReactIntegrationManager.kt +40 -2
  5. package/android/src/oldarch/HotUpdaterModule.kt +11 -5
  6. package/android/src/oldarch/HotUpdaterSpec.kt +1 -1
  7. package/android/src/oldarch/ReactIntegrationManager.kt +36 -2
  8. package/ios/HotUpdater/Internal/HotUpdater.mm +18 -15
  9. package/lib/commonjs/index.js +21 -3
  10. package/lib/commonjs/index.js.map +1 -1
  11. package/lib/commonjs/native.js +34 -15
  12. package/lib/commonjs/native.js.map +1 -1
  13. package/lib/commonjs/runUpdateProcess.js +2 -2
  14. package/lib/commonjs/runUpdateProcess.js.map +1 -1
  15. package/lib/commonjs/store.js +13 -2
  16. package/lib/commonjs/store.js.map +1 -1
  17. package/lib/commonjs/wrap.js +1 -1
  18. package/lib/commonjs/wrap.js.map +1 -1
  19. package/lib/module/checkForUpdate.js.map +1 -1
  20. package/lib/module/index.js +21 -3
  21. package/lib/module/index.js.map +1 -1
  22. package/lib/module/native.js +32 -14
  23. package/lib/module/native.js.map +1 -1
  24. package/lib/module/runUpdateProcess.js +2 -2
  25. package/lib/module/runUpdateProcess.js.map +1 -1
  26. package/lib/module/store.js +13 -2
  27. package/lib/module/store.js.map +1 -1
  28. package/lib/module/wrap.js +2 -3
  29. package/lib/module/wrap.js.map +1 -1
  30. package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
  31. package/lib/typescript/commonjs/index.d.ts +23 -5
  32. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  33. package/lib/typescript/commonjs/native.d.ts +1 -1
  34. package/lib/typescript/commonjs/native.d.ts.map +1 -1
  35. package/lib/typescript/commonjs/runUpdateProcess.d.ts +1 -1
  36. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +1 -1
  37. package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
  38. package/lib/typescript/commonjs/store.d.ts +1 -1
  39. package/lib/typescript/commonjs/store.d.ts.map +1 -1
  40. package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
  41. package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
  42. package/lib/typescript/module/index.d.ts +23 -5
  43. package/lib/typescript/module/index.d.ts.map +1 -1
  44. package/lib/typescript/module/native.d.ts +1 -1
  45. package/lib/typescript/module/native.d.ts.map +1 -1
  46. package/lib/typescript/module/runUpdateProcess.d.ts +1 -1
  47. package/lib/typescript/module/specs/NativeHotUpdater.d.ts +1 -1
  48. package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
  49. package/lib/typescript/module/store.d.ts +1 -1
  50. package/lib/typescript/module/store.d.ts.map +1 -1
  51. package/lib/typescript/module/wrap.d.ts.map +1 -1
  52. package/package.json +5 -5
  53. package/plugin/build/withHotUpdater.js +0 -1
  54. package/src/checkForUpdate.ts +1 -1
  55. package/src/index.ts +22 -5
  56. package/src/native.ts +38 -14
  57. package/src/runUpdateProcess.ts +2 -2
  58. package/src/specs/NativeHotUpdater.ts +1 -1
  59. package/src/store.ts +18 -3
  60. package/src/wrap.tsx +2 -3
@@ -68,7 +68,7 @@ class HotUpdater {
68
68
  * Reloads the React Native application
69
69
  * @param context Application context
70
70
  */
71
- fun reload(context: Context) {
71
+ suspend fun reload(context: Context) {
72
72
  val currentActivity = getCurrentActivity(context)
73
73
  HotUpdaterFactory.getInstance(context).reload(currentActivity)
74
74
  }
@@ -2,9 +2,9 @@ package com.hotupdater
2
2
 
3
3
  import android.app.Activity
4
4
  import android.content.Context
5
- import android.os.Handler
6
- import android.os.Looper
7
5
  import android.util.Log
6
+ import kotlinx.coroutines.Dispatchers
7
+ import kotlinx.coroutines.withContext
8
8
 
9
9
  /**
10
10
  * Core implementation class for HotUpdater functionality
@@ -198,7 +198,7 @@ class HotUpdaterImpl(
198
198
  * Reloads the React Native application
199
199
  * @param activity Current activity (optional)
200
200
  */
201
- fun reload(activity: Activity? = null) {
201
+ suspend fun reload(activity: Activity? = null) {
202
202
  val reactIntegrationManager = ReactIntegrationManager(context)
203
203
  val application = activity?.application ?: return
204
204
 
@@ -206,9 +206,9 @@ class HotUpdaterImpl(
206
206
  val reactApplication = reactIntegrationManager.getReactApplication(application)
207
207
  val bundleURL = getJSBundleFile()
208
208
 
209
- reactIntegrationManager.setJSBundle(reactApplication, bundleURL)
210
-
211
- Handler(Looper.getMainLooper()).post {
209
+ // Perform reload (suspends until safe to reload on new arch)
210
+ withContext(Dispatchers.Main) {
211
+ reactIntegrationManager.setJSBundle(reactApplication, bundleURL)
212
212
  reactIntegrationManager.reload(reactApplication)
213
213
  }
214
214
  } catch (e: Exception) {
@@ -8,6 +8,8 @@ import com.facebook.react.bridge.ReactApplicationContext
8
8
  import com.facebook.react.bridge.ReadableMap
9
9
  import com.facebook.react.bridge.WritableNativeMap
10
10
  import com.facebook.react.modules.core.DeviceEventManagerModule
11
+ import kotlinx.coroutines.CoroutineScope
12
+ import kotlinx.coroutines.Dispatchers
11
13
  import kotlinx.coroutines.launch
12
14
 
13
15
  class HotUpdaterModule internal constructor(
@@ -17,11 +19,15 @@ class HotUpdaterModule internal constructor(
17
19
 
18
20
  override fun getName(): String = NAME
19
21
 
20
- override fun reload() {
21
- try {
22
- HotUpdater.reload(mReactApplicationContext)
23
- } catch (e: Exception) {
24
- Log.d("HotUpdater", "Failed to reload", e)
22
+ override fun reload(promise: Promise) {
23
+ CoroutineScope(Dispatchers.Main.immediate).launch {
24
+ try {
25
+ HotUpdater.reload(mReactApplicationContext)
26
+ promise.resolve(null)
27
+ } catch (e: Exception) {
28
+ Log.d("HotUpdater", "Failed to reload", e)
29
+ promise.reject("reload", e)
30
+ }
25
31
  }
26
32
  }
27
33
 
@@ -3,9 +3,14 @@ package com.hotupdater
3
3
  import android.content.Context
4
4
  import android.util.Log
5
5
  import com.facebook.react.ReactApplication
6
+ import com.facebook.react.ReactHost
7
+ import com.facebook.react.ReactInstanceEventListener
6
8
  import com.facebook.react.bridge.JSBundleLoader
9
+ import com.facebook.react.bridge.ReactContext
7
10
  import com.facebook.react.common.LifecycleState
11
+ import kotlinx.coroutines.suspendCancellableCoroutine
8
12
  import java.lang.reflect.Field
13
+ import kotlin.coroutines.resume
9
14
 
10
15
  class ReactIntegrationManager(
11
16
  context: Context,
@@ -61,12 +66,16 @@ class ReactIntegrationManager(
61
66
  }
62
67
 
63
68
  /**
64
- * Reload the React Native application.
69
+ * Reload the React Native application, ensuring ReactContext is initialized first.
70
+ * Caller should run this on main thread.
65
71
  */
66
- public fun reload(application: ReactApplication) {
72
+ public suspend fun reload(application: ReactApplication) {
67
73
  try {
68
74
  val reactHost = application.reactHost
69
75
  if (reactHost != null) {
76
+ // Ensure initialized; if not, start and wait
77
+ waitForReactContextInitialized(reactHost)
78
+
70
79
  val activity = reactHost.currentReactContext?.currentActivity
71
80
  if (reactHost.lifecycleState != LifecycleState.RESUMED && activity != null) {
72
81
  reactHost.onHostResume(activity)
@@ -95,4 +104,33 @@ class ReactIntegrationManager(
95
104
  Log.d("HotUpdater", "Failed to reload: ${e.message}")
96
105
  }
97
106
  }
107
+
108
+ /**
109
+ * Waits until ReactContext is initialized.
110
+ * @return true if ReactContext was already initialized; false if we waited for it.
111
+ */
112
+ suspend fun waitForReactContextInitialized(reactHost: ReactHost): Boolean {
113
+ return try {
114
+ // If already initialized, return immediately
115
+ if (reactHost.currentReactContext != null) return true
116
+
117
+ // Wait for initialization; MainApplication handles starting the host
118
+ suspendCancellableCoroutine { continuation ->
119
+ val listener =
120
+ object : ReactInstanceEventListener {
121
+ override fun onReactContextInitialized(context: ReactContext) {
122
+ reactHost.removeReactInstanceEventListener(this)
123
+ if (continuation.isActive) continuation.resume(Unit)
124
+ }
125
+ }
126
+
127
+ reactHost.addReactInstanceEventListener(listener)
128
+ continuation.invokeOnCancellation { reactHost.removeReactInstanceEventListener(listener) }
129
+ }
130
+ false
131
+ } catch (e: Exception) {
132
+ Log.d("HotUpdater", "waitForReactContextInitialized failed: ${e.message}")
133
+ true
134
+ }
135
+ }
98
136
  }
@@ -9,6 +9,8 @@ import com.facebook.react.bridge.ReactMethod
9
9
  import com.facebook.react.bridge.ReadableMap
10
10
  import com.facebook.react.bridge.WritableNativeMap
11
11
  import com.facebook.react.modules.core.DeviceEventManagerModule
12
+ import kotlinx.coroutines.CoroutineScope
13
+ import kotlinx.coroutines.Dispatchers
12
14
  import kotlinx.coroutines.launch
13
15
 
14
16
  class HotUpdaterModule internal constructor(
@@ -19,11 +21,15 @@ class HotUpdaterModule internal constructor(
19
21
  override fun getName(): String = NAME
20
22
 
21
23
  @ReactMethod
22
- override fun reload() {
23
- try {
24
- HotUpdater.reload(mReactApplicationContext)
25
- } catch (e: Exception) {
26
- Log.d("HotUpdater", "Failed to reload", e)
24
+ override fun reload(promise: Promise) {
25
+ CoroutineScope(Dispatchers.Main.immediate).launch {
26
+ try {
27
+ HotUpdater.reload(mReactApplicationContext)
28
+ promise.resolve(null)
29
+ } catch (e: Exception) {
30
+ Log.d("HotUpdater", "Failed to reload", e)
31
+ promise.reject("reload", e)
32
+ }
27
33
  }
28
34
  }
29
35
 
@@ -13,5 +13,5 @@ abstract class HotUpdaterSpec internal constructor(
13
13
  promise: Promise,
14
14
  )
15
15
 
16
- abstract fun reload()
16
+ abstract fun reload(promise: Promise)
17
17
  }
@@ -3,8 +3,12 @@ package com.hotupdater
3
3
  import android.content.Context
4
4
  import android.util.Log
5
5
  import com.facebook.react.ReactApplication
6
+ import com.facebook.react.ReactInstanceEventListener
6
7
  import com.facebook.react.bridge.JSBundleLoader
8
+ import com.facebook.react.bridge.ReactContext
9
+ import kotlinx.coroutines.suspendCancellableCoroutine
7
10
  import java.lang.reflect.Field
11
+ import kotlin.coroutines.resume
8
12
 
9
13
  class ReactIntegrationManager(
10
14
  context: Context,
@@ -31,11 +35,15 @@ class ReactIntegrationManager(
31
35
  }
32
36
 
33
37
  /**
34
- * Reload the React Native application.
38
+ * Reload the React Native application, ensuring ReactContext is initialized first.
39
+ * Caller should run this on main thread.
35
40
  */
36
- public fun reload(application: ReactApplication) {
41
+ public suspend fun reload(application: ReactApplication) {
37
42
  val reactNativeHost = application.reactNativeHost
38
43
  try {
44
+ // Ensure initialized; if not, start and wait
45
+ waitForReactContextInitialized(application)
46
+
39
47
  reactNativeHost.reactInstanceManager.recreateReactContextInBackground()
40
48
  } catch (e: Exception) {
41
49
  val currentActivity = reactNativeHost.reactInstanceManager.currentReactContext?.currentActivity
@@ -50,4 +58,30 @@ class ReactIntegrationManager(
50
58
  Log.d("HotUpdater", "Failed to reload: ${e.message}")
51
59
  }
52
60
  }
61
+
62
+ /**
63
+ * Waits until ReactContext is initialized.
64
+ * @return true if ReactContext was already initialized; false if we waited for it.
65
+ */
66
+ suspend fun waitForReactContextInitialized(application: ReactApplication): Boolean {
67
+ val reactInstanceManager = application.reactNativeHost.reactInstanceManager
68
+
69
+ // If already initialized, return immediately and indicate so
70
+ if (reactInstanceManager.currentReactContext != null) return true
71
+
72
+ // Otherwise, wait for initialization; MainApplication handles starting the instance
73
+ suspendCancellableCoroutine { continuation ->
74
+ val listener =
75
+ object : ReactInstanceEventListener {
76
+ override fun onReactContextInitialized(context: ReactContext) {
77
+ reactInstanceManager.removeReactInstanceEventListener(this)
78
+ if (continuation.isActive) continuation.resume(Unit)
79
+ }
80
+ }
81
+
82
+ reactInstanceManager.addReactInstanceEventListener(listener)
83
+ continuation.invokeOnCancellation { reactInstanceManager.removeReactInstanceEventListener(listener) }
84
+ }
85
+ return false
86
+ }
53
87
  }
@@ -180,24 +180,27 @@ RCT_EXPORT_MODULE();
180
180
  #pragma mark - React Native Exports (Slimmed Down)
181
181
 
182
182
  // Keep reload logic here as it interacts with RN Bridge
183
- RCT_EXPORT_METHOD(reload) {
183
+ RCT_EXPORT_METHOD(reload:(RCTPromiseResolveBlock)resolve
184
+ reject:(RCTPromiseRejectBlock)reject) {
184
185
  RCTLogInfo(@"[HotUpdater.mm] HotUpdater requested a reload");
185
186
  dispatch_async(dispatch_get_main_queue(), ^{
186
- // Get bundleURL using static instance
187
- NSURL *bundleURL = [_hotUpdaterImpl bundleURL];
188
- RCTLogInfo(@"[HotUpdater.mm] Reloading with bundle URL: %@", bundleURL);
189
- if (bundleURL && super.bridge) {
190
- @try {
191
- // This method of setting bundleURL might be outdated depending on RN version.
192
- // Consider alternatives if this doesn't work reliably.
193
- [super.bridge setValue:bundleURL forKey:@"bundleURL"];
194
- } @catch (NSException *exception) {
195
- RCTLogError(@"[HotUpdater.mm] Failed to set bundleURL on bridge: %@", exception);
187
+ @try {
188
+ // Get bundleURL using static instance
189
+ NSURL *bundleURL = [_hotUpdaterImpl bundleURL];
190
+ RCTLogInfo(@"[HotUpdater.mm] Reloading with bundle URL: %@", bundleURL);
191
+ if (bundleURL && super.bridge) {
192
+ // This method of setting bundleURL might be outdated depending on RN version.
193
+ // Consider alternatives if this doesn't work reliably.
194
+ [super.bridge setValue:bundleURL forKey:@"bundleURL"];
195
+ } else if (!super.bridge) {
196
+ RCTLogWarn(@"[HotUpdater.mm] Bridge is nil, cannot set bundleURL for reload.");
196
197
  }
197
- } else if (!super.bridge) {
198
- RCTLogWarn(@"[HotUpdater.mm] Bridge is nil, cannot set bundleURL for reload.");
198
+ RCTTriggerReloadCommandListeners(@"HotUpdater requested a reload");
199
+ resolve(nil);
200
+ } @catch (NSError *error) {
201
+ RCTLogError(@"[HotUpdater.mm] Failed to reload: %@", error);
202
+ reject(@"RELOAD_ERROR", error.description, error);
199
203
  }
200
- RCTTriggerReloadCommandListeners(@"HotUpdater requested a reload");
201
204
  });
202
205
  }
203
206
 
@@ -239,4 +242,4 @@ RCT_EXPORT_METHOD(updateBundle:(NSDictionary *)params
239
242
  #endif
240
243
 
241
244
 
242
- @end
245
+ @end
@@ -65,6 +65,24 @@ const HotUpdater = exports.HotUpdater = {
65
65
  * Reloads the app.
66
66
  */
67
67
  reload: _native.reload,
68
+ /**
69
+ * Returns whether an update has finished downloading in this app session.
70
+ *
71
+ * When it returns true, calling `HotUpdater.reload()` (or restarting the app)
72
+ * will apply the downloaded update bundle.
73
+ *
74
+ * - Derived from `progress` reaching 1.0
75
+ * - Resets to false when a new download starts (progress < 1)
76
+ *
77
+ * @returns {boolean} True if a downloaded update is ready to apply
78
+ * @example
79
+ * ```ts
80
+ * if (HotUpdater.isUpdateDownloaded()) {
81
+ * await HotUpdater.reload();
82
+ * }
83
+ * ```
84
+ */
85
+ isUpdateDownloaded: () => _store.hotUpdaterStore.getSnapshot().isUpdateDownloaded,
68
86
  /**
69
87
  * Fetches the current app version.
70
88
  */
@@ -134,7 +152,7 @@ const HotUpdater = exports.HotUpdater = {
134
152
  *
135
153
  * await HotUpdater.updateBundle(updateInfo.id, updateInfo.fileUrl);
136
154
  * if (updateInfo.shouldForceUpdate) {
137
- * HotUpdater.reload();
155
+ * await HotUpdater.reload();
138
156
  * }
139
157
  * ```
140
158
  */
@@ -165,7 +183,7 @@ const HotUpdater = exports.HotUpdater = {
165
183
  * });
166
184
  *
167
185
  * if(result.status !== "UP_TO_DATE" && result.shouldForceUpdate) {
168
- * HotUpdater.reload();
186
+ * await HotUpdater.reload();
169
187
  * }
170
188
  * ```
171
189
  *
@@ -201,7 +219,7 @@ const HotUpdater = exports.HotUpdater = {
201
219
  * fileUrl: updateInfo.fileUrl
202
220
  * });
203
221
  * if (updateInfo.shouldForceUpdate) {
204
- * HotUpdater.reload();
222
+ * await HotUpdater.reload();
205
223
  * }
206
224
  * ```
207
225
  */
@@ -1 +1 @@
1
- {"version":3,"names":["_checkForUpdate","require","_native","_runUpdateProcess","_store","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_wrap","addListener","progress","hotUpdaterStore","setState","HotUpdater","wrap","reload","getAppVersion","getBundleId","getMinBundleId","getChannel","checkForUpdate","runUpdateProcess","updateBundle","getFingerprintHash"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAUA,IAAAE,iBAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAMAI,MAAA,CAAAC,IAAA,CAAAF,MAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,MAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,MAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AALA,IAAAS,KAAA,GAAAhB,OAAA;AAOA,IAAAiB,mBAAW,EAAC,YAAY,EAAE,CAAC;EAAEC;AAAS,CAAC,KAAK;EAC1CC,sBAAe,CAACC,QAAQ,CAAC;IACvBF;EACF,CAAC,CAAC;AACJ,CAAC,CAAC;AAEK,MAAMG,UAAU,GAAAT,OAAA,CAAAS,UAAA,GAAG;EACxB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,IAAI,EAAJA,UAAI;EACJ;AACF;AACA;EACEC,MAAM,EAANA,cAAM;EACN;AACF;AACA;EACEC,aAAa,EAAbA,qBAAa;EACb;AACF;AACA;EACEC,WAAW,EAAXA,mBAAW;EACX;AACF;AACA;EACEC,cAAc,EAAdA,sBAAc;EACd;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,UAAU,EAAVA,kBAAU;EACV;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEV,WAAW,EAAXA,mBAAW;EACX;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEW,cAAc,EAAdA,8BAAc;EACd;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,gBAAgB,EAAhBA,kCAAgB;EAChB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,YAAY,EAAZA,oBAAY;EACZ;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,kBAAkB,EAAlBA;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_checkForUpdate","require","_native","_runUpdateProcess","_store","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_wrap","addListener","progress","hotUpdaterStore","setState","HotUpdater","wrap","reload","isUpdateDownloaded","getSnapshot","getAppVersion","getBundleId","getMinBundleId","getChannel","checkForUpdate","runUpdateProcess","updateBundle","getFingerprintHash"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAUA,IAAAE,iBAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAIAI,MAAA,CAAAC,IAAA,CAAAF,MAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,MAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,MAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAHA,IAAAS,KAAA,GAAAhB,OAAA;AAMA,IAAAiB,mBAAW,EAAC,YAAY,EAAE,CAAC;EAAEC;AAAS,CAAC,KAAK;EAC1CC,sBAAe,CAACC,QAAQ,CAAC;IACvBF;EACF,CAAC,CAAC;AACJ,CAAC,CAAC;AAEK,MAAMG,UAAU,GAAAT,OAAA,CAAAS,UAAA,GAAG;EACxB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,IAAI,EAAJA,UAAI;EACJ;AACF;AACA;EACEC,MAAM,EAANA,cAAM;EACN;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,kBAAkB,EAAEA,CAAA,KAAML,sBAAe,CAACM,WAAW,CAAC,CAAC,CAACD,kBAAkB;EAC1E;AACF;AACA;EACEE,aAAa,EAAbA,qBAAa;EACb;AACF;AACA;EACEC,WAAW,EAAXA,mBAAW;EACX;AACF;AACA;EACEC,cAAc,EAAdA,sBAAc;EACd;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,UAAU,EAAVA,kBAAU;EACV;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEZ,WAAW,EAAXA,mBAAW;EACX;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEa,cAAc,EAAdA,8BAAc;EACd;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,gBAAgB,EAAhBA,kCAAgB;EAChB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,YAAY,EAAZA,oBAAY;EACZ;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,kBAAkB,EAAlBA;AACF,CAAC","ignoreList":[]}
@@ -19,6 +19,11 @@ const addListener = (eventName, listener) => {
19
19
  subscription.remove();
20
20
  };
21
21
  };
22
+ exports.addListener = addListener;
23
+ // In-flight update deduplication by bundleId (session-scoped).
24
+ const inflightUpdates = new Map();
25
+ // Tracks the last successfully installed bundleId for this session.
26
+ let lastInstalledBundleId = null;
22
27
 
23
28
  /**
24
29
  * Downloads files and applies them to the app.
@@ -30,26 +35,42 @@ const addListener = (eventName, listener) => {
30
35
  /**
31
36
  * @deprecated Use updateBundle(params: UpdateBundleParamsWithStatus) instead
32
37
  */
33
- exports.addListener = addListener;
38
+
34
39
  async function updateBundle(paramsOrBundleId, fileUrl) {
35
40
  const updateBundleId = typeof paramsOrBundleId === "string" ? paramsOrBundleId : paramsOrBundleId.bundleId;
36
41
  const status = typeof paramsOrBundleId === "string" ? "UPDATE" : paramsOrBundleId.status;
42
+
43
+ // If we have already installed this bundle in this session, skip re-download.
44
+ if (status === "UPDATE" && lastInstalledBundleId === updateBundleId) {
45
+ return true;
46
+ }
37
47
  const currentBundleId = getBundleId();
38
48
 
39
49
  // updateBundleId <= currentBundleId
40
50
  if (status === "UPDATE" && updateBundleId.localeCompare(currentBundleId) <= 0) {
41
51
  throw new Error("Update bundle id is the same as the current bundle id. Preventing infinite update loop.");
42
52
  }
43
- if (typeof paramsOrBundleId === "string") {
44
- return _NativeHotUpdater.default.updateBundle({
45
- bundleId: updateBundleId,
46
- fileUrl: fileUrl || null
47
- });
48
- }
49
- return _NativeHotUpdater.default.updateBundle({
50
- bundleId: updateBundleId,
51
- fileUrl: paramsOrBundleId.fileUrl
52
- });
53
+
54
+ // In-flight guard: return the same promise if the same bundle is already updating.
55
+ const existing = inflightUpdates.get(updateBundleId);
56
+ if (existing) return existing;
57
+ const targetFileUrl = typeof paramsOrBundleId === "string" ? fileUrl ?? null : paramsOrBundleId.fileUrl;
58
+ const promise = (async () => {
59
+ try {
60
+ const ok = await _NativeHotUpdater.default.updateBundle({
61
+ bundleId: updateBundleId,
62
+ fileUrl: targetFileUrl
63
+ });
64
+ if (ok) {
65
+ lastInstalledBundleId = updateBundleId;
66
+ }
67
+ return ok;
68
+ } finally {
69
+ inflightUpdates.delete(updateBundleId);
70
+ }
71
+ })();
72
+ inflightUpdates.set(updateBundleId, promise);
73
+ return promise;
53
74
  }
54
75
 
55
76
  /**
@@ -64,10 +85,8 @@ const getAppVersion = () => {
64
85
  * Reloads the app.
65
86
  */
66
87
  exports.getAppVersion = getAppVersion;
67
- const reload = () => {
68
- requestAnimationFrame(() => {
69
- _NativeHotUpdater.default.reload();
70
- });
88
+ const reload = async () => {
89
+ await _NativeHotUpdater.default.reload();
71
90
  };
72
91
 
73
92
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_NativeHotUpdater","_interopRequireDefault","e","__esModule","default","NIL_UUID","HotUpdaterConstants","exports","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","addListener","eventName","listener","eventEmitter","NativeEventEmitter","HotUpdaterNative","subscription","remove","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","bundleId","status","currentBundleId","getBundleId","localeCompare","Error","getAppVersion","constants","getConstants","APP_VERSION","reload","requestAnimationFrame","getMinBundleId","MIN_BUNDLE_ID","getChannel","CHANNEL","getFingerprintHash","FINGERPRINT_HASH"],"sourceRoot":"../../src","sources":["native.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_NativeHotUpdater","_interopRequireDefault","e","__esModule","default","NIL_UUID","HotUpdaterConstants","exports","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","addListener","eventName","listener","eventEmitter","NativeEventEmitter","HotUpdaterNative","subscription","remove","inflightUpdates","Map","lastInstalledBundleId","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","bundleId","status","currentBundleId","getBundleId","localeCompare","Error","existing","get","targetFileUrl","promise","ok","delete","set","getAppVersion","constants","getConstants","APP_VERSION","reload","getMinBundleId","MIN_BUNDLE_ID","getChannel","CHANNEL","getFingerprintHash","FINGERPRINT_HASH"],"sourceRoot":"../../src","sources":["native.ts"],"mappings":"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","ignoreList":[]}
@@ -32,7 +32,7 @@ var _native = require("./native.js");
32
32
  * });
33
33
  *
34
34
  * if(result.status !== "UP_TO_DATE" && result.shouldForceUpdate) {
35
- * HotUpdater.reload();
35
+ * await HotUpdater.reload();
36
36
  * }
37
37
  * ```
38
38
  *
@@ -53,7 +53,7 @@ const runUpdateProcess = async ({
53
53
  }
54
54
  const isUpdated = await updateInfo.updateBundle();
55
55
  if (isUpdated && updateInfo.shouldForceUpdate && reloadOnForceUpdate) {
56
- (0, _native.reload)();
56
+ await (0, _native.reload)();
57
57
  }
58
58
  if (!isUpdated) {
59
59
  throw new Error("New update was found but failed to download the bundle.");
@@ -1 +1 @@
1
- {"version":3,"names":["_checkForUpdate","require","_native","runUpdateProcess","reloadOnForceUpdate","checkForUpdateOptions","updateInfo","checkForUpdate","status","shouldForceUpdate","message","id","getBundleId","isUpdated","updateBundle","reload","Error","exports"],"sourceRoot":"../../src","sources":["runUpdateProcess.ts"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,gBAAgB,GAAG,MAAAA,CAAO;EACrCC,mBAAmB,GAAG,IAAI;EAC1B,GAAGC;AACoB,CAAC,KAAwC;EAChE,MAAMC,UAAU,GAAG,MAAM,IAAAC,8BAAc,EAACF,qBAAqB,CAAC;EAC9D,IAAI,CAACC,UAAU,EAAE;IACf,OAAO;MACLE,MAAM,EAAE,YAAY;MACpBC,iBAAiB,EAAE,KAAK;MACxBC,OAAO,EAAE,IAAI;MACbC,EAAE,EAAE,IAAAC,mBAAW,EAAC;IAClB,CAAC;EACH;EAEA,MAAMC,SAAS,GAAG,MAAMP,UAAU,CAACQ,YAAY,CAAC,CAAC;EACjD,IAAID,SAAS,IAAIP,UAAU,CAACG,iBAAiB,IAAIL,mBAAmB,EAAE;IACpE,IAAAW,cAAM,EAAC,CAAC;EACV;EAEA,IAAI,CAACF,SAAS,EAAE;IACd,MAAM,IAAIG,KAAK,CAAC,yDAAyD,CAAC;EAC5E;EACA,OAAO;IACLR,MAAM,EAAEF,UAAU,CAACE,MAAM;IACzBC,iBAAiB,EAAEH,UAAU,CAACG,iBAAiB;IAC/CE,EAAE,EAAEL,UAAU,CAACK,EAAE;IACjBD,OAAO,EAAEJ,UAAU,CAACI;EACtB,CAAC;AACH,CAAC;AAACO,OAAA,CAAAd,gBAAA,GAAAA,gBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_checkForUpdate","require","_native","runUpdateProcess","reloadOnForceUpdate","checkForUpdateOptions","updateInfo","checkForUpdate","status","shouldForceUpdate","message","id","getBundleId","isUpdated","updateBundle","reload","Error","exports"],"sourceRoot":"../../src","sources":["runUpdateProcess.ts"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,gBAAgB,GAAG,MAAAA,CAAO;EACrCC,mBAAmB,GAAG,IAAI;EAC1B,GAAGC;AACoB,CAAC,KAAwC;EAChE,MAAMC,UAAU,GAAG,MAAM,IAAAC,8BAAc,EAACF,qBAAqB,CAAC;EAC9D,IAAI,CAACC,UAAU,EAAE;IACf,OAAO;MACLE,MAAM,EAAE,YAAY;MACpBC,iBAAiB,EAAE,KAAK;MACxBC,OAAO,EAAE,IAAI;MACbC,EAAE,EAAE,IAAAC,mBAAW,EAAC;IAClB,CAAC;EACH;EAEA,MAAMC,SAAS,GAAG,MAAMP,UAAU,CAACQ,YAAY,CAAC,CAAC;EACjD,IAAID,SAAS,IAAIP,UAAU,CAACG,iBAAiB,IAAIL,mBAAmB,EAAE;IACpE,MAAM,IAAAW,cAAM,EAAC,CAAC;EAChB;EAEA,IAAI,CAACF,SAAS,EAAE;IACd,MAAM,IAAIG,KAAK,CAAC,yDAAyD,CAAC;EAC5E;EACA,OAAO;IACLR,MAAM,EAAEF,UAAU,CAACE,MAAM;IACzBC,iBAAiB,EAAEH,UAAU,CAACG,iBAAiB;IAC/CE,EAAE,EAAEL,UAAU,CAACK,EAAE;IACjBD,OAAO,EAAEJ,UAAU,CAACI;EACtB,CAAC;AACH,CAAC;AAACO,OAAA,CAAAd,gBAAA,GAAAA,gBAAA","ignoreList":[]}
@@ -12,7 +12,7 @@ const {
12
12
  const createHotUpdaterStore = () => {
13
13
  let state = {
14
14
  progress: 0,
15
- isBundleUpdated: false
15
+ isUpdateDownloaded: false
16
16
  };
17
17
  const getSnapshot = () => {
18
18
  return state;
@@ -24,10 +24,21 @@ const createHotUpdaterStore = () => {
24
24
  }
25
25
  };
26
26
  const setState = newState => {
27
- state = {
27
+ // Merge first, then normalize derived fields
28
+ const nextState = {
28
29
  ...state,
29
30
  ...newState
30
31
  };
32
+
33
+ // Derive `isUpdateDownloaded` from `progress` if provided.
34
+ // If `progress` is not provided but `isUpdateDownloaded` is,
35
+ // honor the explicit value.
36
+ if ("progress" in newState && typeof newState.progress === "number") {
37
+ nextState.isUpdateDownloaded = newState.progress >= 1;
38
+ } else if ("isUpdateDownloaded" in newState && typeof newState.isUpdateDownloaded === "boolean") {
39
+ nextState.isUpdateDownloaded = newState.isUpdateDownloaded;
40
+ }
41
+ state = nextState;
31
42
  emitChange();
32
43
  };
33
44
  const subscribe = listener => {
@@ -1 +1 @@
1
- {"version":3,"names":["_withSelector","_interopRequireDefault","require","e","__esModule","default","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","createHotUpdaterStore","state","progress","isBundleUpdated","getSnapshot","listeners","Set","emitChange","listener","setState","newState","subscribe","add","delete","hotUpdaterStore","exports","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAqF,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAMrF,MAAM;EAAEG;AAAiC,CAAC,GAAGC,qBAA2B;AAExE,MAAMC,qBAAqB,GAAGA,CAAA,KAAM;EAClC,IAAIC,KAAsB,GAAG;IAC3BC,QAAQ,EAAE,CAAC;IACXC,eAAe,EAAE;EACnB,CAAC;EAED,MAAMC,WAAW,GAAGA,CAAA,KAAM;IACxB,OAAOH,KAAK;EACd,CAAC;EAED,MAAMI,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;EAEvC,MAAMC,UAAU,GAAGA,CAAA,KAAM;IACvB,KAAK,MAAMC,QAAQ,IAAIH,SAAS,EAAE;MAChCG,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC;EAED,MAAMC,QAAQ,GAAIC,QAAkC,IAAK;IACvDT,KAAK,GAAG;MACN,GAAGA,KAAK;MACR,GAAGS;IACL,CAAC;IACDH,UAAU,CAAC,CAAC;EACd,CAAC;EAED,MAAMI,SAAS,GAAIH,QAAoB,IAAK;IAC1CH,SAAS,CAACO,GAAG,CAACJ,QAAQ,CAAC;IACvB,OAAO,MAAMH,SAAS,CAACQ,MAAM,CAACL,QAAQ,CAAC;EACzC,CAAC;EAED,OAAO;IAAEJ,WAAW;IAAEK,QAAQ;IAAEE;EAAU,CAAC;AAC7C,CAAC;AAEM,MAAMG,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAGd,qBAAqB,CAAC,CAAC;AAE/C,MAAMgB,kBAAkB,GAAGA,CAChCC,QAA0C,GAAIC,QAAQ,IAAKA,QAAa,KACrE;EACH,OAAOpB,gCAAgC,CACrCgB,eAAe,CAACH,SAAS,EACzBG,eAAe,CAACV,WAAW,EAC3BU,eAAe,CAACV,WAAW,EAC3Ba,QACF,CAAC;AACH,CAAC;AAACF,OAAA,CAAAC,kBAAA,GAAAA,kBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_withSelector","_interopRequireDefault","require","e","__esModule","default","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","createHotUpdaterStore","state","progress","isUpdateDownloaded","getSnapshot","listeners","Set","emitChange","listener","setState","newState","nextState","subscribe","add","delete","hotUpdaterStore","exports","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAqF,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAMrF,MAAM;EAAEG;AAAiC,CAAC,GAAGC,qBAA2B;AAExE,MAAMC,qBAAqB,GAAGA,CAAA,KAAM;EAClC,IAAIC,KAAsB,GAAG;IAC3BC,QAAQ,EAAE,CAAC;IACXC,kBAAkB,EAAE;EACtB,CAAC;EAED,MAAMC,WAAW,GAAGA,CAAA,KAAM;IACxB,OAAOH,KAAK;EACd,CAAC;EAED,MAAMI,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;EAEvC,MAAMC,UAAU,GAAGA,CAAA,KAAM;IACvB,KAAK,MAAMC,QAAQ,IAAIH,SAAS,EAAE;MAChCG,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC;EAED,MAAMC,QAAQ,GAAIC,QAAkC,IAAK;IACvD;IACA,MAAMC,SAA0B,GAAG;MACjC,GAAGV,KAAK;MACR,GAAGS;IACL,CAAC;;IAED;IACA;IACA;IACA,IAAI,UAAU,IAAIA,QAAQ,IAAI,OAAOA,QAAQ,CAACR,QAAQ,KAAK,QAAQ,EAAE;MACnES,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACR,QAAQ,IAAI,CAAC;IACvD,CAAC,MAAM,IACL,oBAAoB,IAAIQ,QAAQ,IAChC,OAAOA,QAAQ,CAACP,kBAAkB,KAAK,SAAS,EAChD;MACAQ,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACP,kBAAkB;IAC5D;IAEAF,KAAK,GAAGU,SAAS;IACjBJ,UAAU,CAAC,CAAC;EACd,CAAC;EAED,MAAMK,SAAS,GAAIJ,QAAoB,IAAK;IAC1CH,SAAS,CAACQ,GAAG,CAACL,QAAQ,CAAC;IACvB,OAAO,MAAMH,SAAS,CAACS,MAAM,CAACN,QAAQ,CAAC;EACzC,CAAC;EAED,OAAO;IAAEJ,WAAW;IAAEK,QAAQ;IAAEG;EAAU,CAAC;AAC7C,CAAC;AAEM,MAAMG,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAGf,qBAAqB,CAAC,CAAC;AAE/C,MAAMiB,kBAAkB,GAAGA,CAChCC,QAA0C,GAAIC,QAAQ,IAAKA,QAAa,KACrE;EACH,OAAOrB,gCAAgC,CACrCiB,eAAe,CAACH,SAAS,EACzBG,eAAe,CAACX,WAAW,EAC3BW,eAAe,CAACX,WAAW,EAC3Bc,QACF,CAAC;AACH,CAAC;AAACF,OAAA,CAAAC,kBAAA,GAAAA,kBAAA","ignoreList":[]}
@@ -61,7 +61,7 @@ function wrap(options) {
61
61
  throw new Error("New update was found but failed to download the bundle.");
62
62
  }
63
63
  if (reloadOnForceUpdate) {
64
- (0, _native.reload)();
64
+ await (0, _native.reload)();
65
65
  }
66
66
  restOptions.onUpdateProcessCompleted?.({
67
67
  id: updateInfo.id,
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_checkForUpdate","_useEventCallback","_native","_store","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","wrap","options","reloadOnForceUpdate","restOptions","WrappedComponent","HotUpdaterHOC","props","progress","useHotUpdaterStore","state","message","setMessage","useState","updateStatus","setUpdateStatus","initHotUpdater","useEventCallback","updateInfo","checkForUpdate","source","requestHeaders","onError","onUpdateProcessCompleted","status","shouldForceUpdate","id","getBundleId","updateBundle","catch","error","isSuccess","Error","reload","useEffect","onProgress","useLayoutEffect","fallbackComponent","Fallback","jsx"],"sourceRoot":"../../src","sources":["wrap.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_checkForUpdate","_useEventCallback","_native","_store","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","wrap","options","reloadOnForceUpdate","restOptions","WrappedComponent","HotUpdaterHOC","props","progress","useHotUpdaterStore","state","message","setMessage","useState","updateStatus","setUpdateStatus","initHotUpdater","useEventCallback","updateInfo","checkForUpdate","source","requestHeaders","onError","onUpdateProcessCompleted","status","shouldForceUpdate","id","getBundleId","updateBundle","catch","error","isSuccess","Error","reload","useEffect","onProgress","useLayoutEffect","fallbackComponent","Fallback","jsx"],"sourceRoot":"../../src","sources":["wrap.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","HotUpdaterError","fetchUpdateInfo","getAppVersion","getBundleId","getChannel","getFingerprintHash","getMinBundleId","updateBundle","checkForUpdate","options","__DEV__","includes","OS","onError","currentAppVersion","platform","currentBundleId","minBundleId","channel","fingerprintHash","source","params","bundleId","appVersion","requestHeaders","requestTimeout","then","updateInfo","id","fileUrl","status","getUpdateSource","baseUrl","updateStrategy"],"sourceRoot":"../../src","sources":["checkForUpdate.ts"],"mappings":";;AACA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,eAAe,QAAQ,YAAS;AACzC,SAA4BC,eAAe,QAAQ,sBAAmB;AACtE,SACEC,aAAa,EACbC,WAAW,EACXC,UAAU,EACVC,kBAAkB,EAClBC,cAAc,EACdC,YAAY,QACP,aAAU;AAqBjB,OAAO,eAAeC,cAAcA,CAClCC,OAA8B,EACQ;EACtC,IAAIC,OAAO,EAAE;IACX,OAAO,IAAI;EACb;EAEA,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAACC,QAAQ,CAACZ,QAAQ,CAACa,EAAE,CAAC,EAAE;IAC7CH,OAAO,CAACI,OAAO,GACb,IAAIb,eAAe,CAAC,iDAAiD,CACvE,CAAC;IACD,OAAO,IAAI;EACb;EAEA,MAAMc,iBAAiB,GAAGZ,aAAa,CAAC,CAAC;EACzC,MAAMa,QAAQ,GAAGhB,QAAQ,CAACa,EAAuB;EACjD,MAAMI,eAAe,GAAGb,WAAW,CAAC,CAAC;EACrC,MAAMc,WAAW,GAAGX,cAAc,CAAC,CAAC;EACpC,MAAMY,OAAO,GAAGd,UAAU,CAAC,CAAC;EAE5B,IAAI,CAACU,iBAAiB,EAAE;IACtBL,OAAO,CAACI,OAAO,GAAG,IAAIb,eAAe,CAAC,2BAA2B,CAAC,CAAC;IACnE,OAAO,IAAI;EACb;EAEA,MAAMmB,eAAe,GAAGd,kBAAkB,CAAC,CAAC;EAE5C,OAAOJ,eAAe,CAAC;IACrBmB,MAAM,EAAEX,OAAO,CAACW,MAAM;IACtBC,MAAM,EAAE;MACNC,QAAQ,EAAEN,eAAe;MACzBO,UAAU,EAAET,iBAAiB;MAC7BC,QAAQ;MACRE,WAAW;MACXC,OAAO;MACPC;IACF,CAAC;IACDK,cAAc,EAAEf,OAAO,CAACe,cAAc;IACtCX,OAAO,EAAEJ,OAAO,CAACI,OAAO;IACxBY,cAAc,EAAEhB,OAAO,CAACgB;EAC1B,CAAC,CAAC,CAACC,IAAI,CAAEC,UAAU,IAAK;IACtB,IAAI,CAACA,UAAU,EAAE;MACf,OAAO,IAAI;IACb;IAEA,OAAO;MACL,GAAGA,UAAU;MACbpB,YAAY,EAAE,MAAAA,CAAA,KAAY;QACxB,OAAOA,YAAY,CAAC;UAClBe,QAAQ,EAAEK,UAAU,CAACC,EAAE;UACvBC,OAAO,EAAEF,UAAU,CAACE,OAAO;UAC3BC,MAAM,EAAEH,UAAU,CAACG;QACrB,CAAC,CAAC;MACJ;IACF,CAAC;EACH,CAAC,CAAC;AACJ;AAYA,OAAO,MAAMC,eAAe,GAC1BA,CAACC,OAAe,EAAEvB,OAA+B,KAChDY,MAA0B,IAAK;EAC9B,QAAQZ,OAAO,CAACwB,cAAc;IAC5B,KAAK,aAAa;MAAE;QAClB,IAAI,CAACZ,MAAM,CAACF,eAAe,EAAE;UAC3B,MAAM,IAAInB,eAAe,CAAC,8BAA8B,CAAC;QAC3D;QACA,OAAO,GAAGgC,OAAO,gBAAgBX,MAAM,CAACN,QAAQ,IAAIM,MAAM,CAACF,eAAe,IAAIE,MAAM,CAACH,OAAO,IAAIG,MAAM,CAACJ,WAAW,IAAII,MAAM,CAACC,QAAQ,EAAE;MACzI;IACA,KAAK,YAAY;MAAE;QACjB,OAAO,GAAGU,OAAO,gBAAgBX,MAAM,CAACN,QAAQ,IAAIM,MAAM,CAACE,UAAU,IAAIF,MAAM,CAACH,OAAO,IAAIG,MAAM,CAACJ,WAAW,IAAII,MAAM,CAACC,QAAQ,EAAE;MACpI;IACA;MACE,OAAOU,OAAO;EAClB;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Platform","HotUpdaterError","fetchUpdateInfo","getAppVersion","getBundleId","getChannel","getFingerprintHash","getMinBundleId","updateBundle","checkForUpdate","options","__DEV__","includes","OS","onError","currentAppVersion","platform","currentBundleId","minBundleId","channel","fingerprintHash","source","params","bundleId","appVersion","requestHeaders","requestTimeout","then","updateInfo","id","fileUrl","status","getUpdateSource","baseUrl","updateStrategy"],"sourceRoot":"../../src","sources":["checkForUpdate.ts"],"mappings":";;AACA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,eAAe,QAAQ,YAAS;AACzC,SAASC,eAAe,QAA2B,sBAAmB;AACtE,SACEC,aAAa,EACbC,WAAW,EACXC,UAAU,EACVC,kBAAkB,EAClBC,cAAc,EACdC,YAAY,QACP,aAAU;AAqBjB,OAAO,eAAeC,cAAcA,CAClCC,OAA8B,EACQ;EACtC,IAAIC,OAAO,EAAE;IACX,OAAO,IAAI;EACb;EAEA,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAACC,QAAQ,CAACZ,QAAQ,CAACa,EAAE,CAAC,EAAE;IAC7CH,OAAO,CAACI,OAAO,GACb,IAAIb,eAAe,CAAC,iDAAiD,CACvE,CAAC;IACD,OAAO,IAAI;EACb;EAEA,MAAMc,iBAAiB,GAAGZ,aAAa,CAAC,CAAC;EACzC,MAAMa,QAAQ,GAAGhB,QAAQ,CAACa,EAAuB;EACjD,MAAMI,eAAe,GAAGb,WAAW,CAAC,CAAC;EACrC,MAAMc,WAAW,GAAGX,cAAc,CAAC,CAAC;EACpC,MAAMY,OAAO,GAAGd,UAAU,CAAC,CAAC;EAE5B,IAAI,CAACU,iBAAiB,EAAE;IACtBL,OAAO,CAACI,OAAO,GAAG,IAAIb,eAAe,CAAC,2BAA2B,CAAC,CAAC;IACnE,OAAO,IAAI;EACb;EAEA,MAAMmB,eAAe,GAAGd,kBAAkB,CAAC,CAAC;EAE5C,OAAOJ,eAAe,CAAC;IACrBmB,MAAM,EAAEX,OAAO,CAACW,MAAM;IACtBC,MAAM,EAAE;MACNC,QAAQ,EAAEN,eAAe;MACzBO,UAAU,EAAET,iBAAiB;MAC7BC,QAAQ;MACRE,WAAW;MACXC,OAAO;MACPC;IACF,CAAC;IACDK,cAAc,EAAEf,OAAO,CAACe,cAAc;IACtCX,OAAO,EAAEJ,OAAO,CAACI,OAAO;IACxBY,cAAc,EAAEhB,OAAO,CAACgB;EAC1B,CAAC,CAAC,CAACC,IAAI,CAAEC,UAAU,IAAK;IACtB,IAAI,CAACA,UAAU,EAAE;MACf,OAAO,IAAI;IACb;IAEA,OAAO;MACL,GAAGA,UAAU;MACbpB,YAAY,EAAE,MAAAA,CAAA,KAAY;QACxB,OAAOA,YAAY,CAAC;UAClBe,QAAQ,EAAEK,UAAU,CAACC,EAAE;UACvBC,OAAO,EAAEF,UAAU,CAACE,OAAO;UAC3BC,MAAM,EAAEH,UAAU,CAACG;QACrB,CAAC,CAAC;MACJ;IACF,CAAC;EACH,CAAC,CAAC;AACJ;AAYA,OAAO,MAAMC,eAAe,GAC1BA,CAACC,OAAe,EAAEvB,OAA+B,KAChDY,MAA0B,IAAK;EAC9B,QAAQZ,OAAO,CAACwB,cAAc;IAC5B,KAAK,aAAa;MAAE;QAClB,IAAI,CAACZ,MAAM,CAACF,eAAe,EAAE;UAC3B,MAAM,IAAInB,eAAe,CAAC,8BAA8B,CAAC;QAC3D;QACA,OAAO,GAAGgC,OAAO,gBAAgBX,MAAM,CAACN,QAAQ,IAAIM,MAAM,CAACF,eAAe,IAAIE,MAAM,CAACH,OAAO,IAAIG,MAAM,CAACJ,WAAW,IAAII,MAAM,CAACC,QAAQ,EAAE;MACzI;IACA,KAAK,YAAY;MAAE;QACjB,OAAO,GAAGU,OAAO,gBAAgBX,MAAM,CAACN,QAAQ,IAAIM,MAAM,CAACE,UAAU,IAAIF,MAAM,CAACH,OAAO,IAAIG,MAAM,CAACJ,WAAW,IAAII,MAAM,CAACC,QAAQ,EAAE;MACpI;IACA;MACE,OAAOU,OAAO;EAClB;AACF,CAAC","ignoreList":[]}
@@ -41,6 +41,24 @@ export const HotUpdater = {
41
41
  * Reloads the app.
42
42
  */
43
43
  reload,
44
+ /**
45
+ * Returns whether an update has finished downloading in this app session.
46
+ *
47
+ * When it returns true, calling `HotUpdater.reload()` (or restarting the app)
48
+ * will apply the downloaded update bundle.
49
+ *
50
+ * - Derived from `progress` reaching 1.0
51
+ * - Resets to false when a new download starts (progress < 1)
52
+ *
53
+ * @returns {boolean} True if a downloaded update is ready to apply
54
+ * @example
55
+ * ```ts
56
+ * if (HotUpdater.isUpdateDownloaded()) {
57
+ * await HotUpdater.reload();
58
+ * }
59
+ * ```
60
+ */
61
+ isUpdateDownloaded: () => hotUpdaterStore.getSnapshot().isUpdateDownloaded,
44
62
  /**
45
63
  * Fetches the current app version.
46
64
  */
@@ -110,7 +128,7 @@ export const HotUpdater = {
110
128
  *
111
129
  * await HotUpdater.updateBundle(updateInfo.id, updateInfo.fileUrl);
112
130
  * if (updateInfo.shouldForceUpdate) {
113
- * HotUpdater.reload();
131
+ * await HotUpdater.reload();
114
132
  * }
115
133
  * ```
116
134
  */
@@ -141,7 +159,7 @@ export const HotUpdater = {
141
159
  * });
142
160
  *
143
161
  * if(result.status !== "UP_TO_DATE" && result.shouldForceUpdate) {
144
- * HotUpdater.reload();
162
+ * await HotUpdater.reload();
145
163
  * }
146
164
  * ```
147
165
  *
@@ -177,7 +195,7 @@ export const HotUpdater = {
177
195
  * fileUrl: updateInfo.fileUrl
178
196
  * });
179
197
  * if (updateInfo.shouldForceUpdate) {
180
- * HotUpdater.reload();
198
+ * await HotUpdater.reload();
181
199
  * }
182
200
  * ```
183
201
  */