@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.
- package/android/src/main/java/com/hotupdater/HotUpdater.kt +1 -1
- package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +6 -6
- package/android/src/newarch/HotUpdaterModule.kt +11 -5
- package/android/src/newarch/ReactIntegrationManager.kt +40 -2
- package/android/src/oldarch/HotUpdaterModule.kt +11 -5
- package/android/src/oldarch/HotUpdaterSpec.kt +1 -1
- package/android/src/oldarch/ReactIntegrationManager.kt +36 -2
- package/ios/HotUpdater/Internal/HotUpdater.mm +18 -15
- package/lib/commonjs/index.js +21 -3
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/native.js +34 -15
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/runUpdateProcess.js +2 -2
- package/lib/commonjs/runUpdateProcess.js.map +1 -1
- package/lib/commonjs/store.js +13 -2
- package/lib/commonjs/store.js.map +1 -1
- package/lib/commonjs/wrap.js +1 -1
- package/lib/commonjs/wrap.js.map +1 -1
- package/lib/module/checkForUpdate.js.map +1 -1
- package/lib/module/index.js +21 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/native.js +32 -14
- package/lib/module/native.js.map +1 -1
- package/lib/module/runUpdateProcess.js +2 -2
- package/lib/module/runUpdateProcess.js.map +1 -1
- package/lib/module/store.js +13 -2
- package/lib/module/store.js.map +1 -1
- package/lib/module/wrap.js +2 -3
- package/lib/module/wrap.js.map +1 -1
- package/lib/typescript/commonjs/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +23 -5
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/native.d.ts +1 -1
- package/lib/typescript/commonjs/native.d.ts.map +1 -1
- package/lib/typescript/commonjs/runUpdateProcess.d.ts +1 -1
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +1 -1
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/commonjs/store.d.ts +1 -1
- package/lib/typescript/commonjs/store.d.ts.map +1 -1
- package/lib/typescript/commonjs/wrap.d.ts.map +1 -1
- package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +23 -5
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/native.d.ts +1 -1
- package/lib/typescript/module/native.d.ts.map +1 -1
- package/lib/typescript/module/runUpdateProcess.d.ts +1 -1
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts +1 -1
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/module/store.d.ts +1 -1
- package/lib/typescript/module/store.d.ts.map +1 -1
- package/lib/typescript/module/wrap.d.ts.map +1 -1
- package/package.json +5 -5
- package/plugin/build/withHotUpdater.js +0 -1
- package/src/checkForUpdate.ts +1 -1
- package/src/index.ts +22 -5
- package/src/native.ts +38 -14
- package/src/runUpdateProcess.ts +2 -2
- package/src/specs/NativeHotUpdater.ts +1 -1
- package/src/store.ts +18 -3
- 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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
|
@@ -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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
195
|
-
|
|
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
|
-
|
|
198
|
-
|
|
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
|
package/lib/commonjs/index.js
CHANGED
|
@@ -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;
|
|
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":[]}
|
package/lib/commonjs/native.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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","
|
|
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;
|
|
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":[]}
|
package/lib/commonjs/store.js
CHANGED
|
@@ -12,7 +12,7 @@ const {
|
|
|
12
12
|
const createHotUpdaterStore = () => {
|
|
13
13
|
let state = {
|
|
14
14
|
progress: 0,
|
|
15
|
-
|
|
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
|
-
|
|
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","
|
|
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":[]}
|
package/lib/commonjs/wrap.js
CHANGED
|
@@ -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,
|
package/lib/commonjs/wrap.js.map
CHANGED
|
@@ -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":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;
|
|
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,
|
|
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":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -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
|
*/
|