@hot-updater/react-native 0.20.10 → 0.20.12
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 +3 -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/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 +3 -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/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 +5 -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/wrap.d.ts.map +1 -1
- package/lib/typescript/module/checkForUpdate.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +5 -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/wrap.d.ts.map +1 -1
- package/package.json +5 -5
- package/plugin/build/withHotUpdater.js +6 -4
- package/src/checkForUpdate.ts +1 -1
- package/src/index.ts +4 -5
- package/src/native.ts +38 -14
- package/src/runUpdateProcess.ts +2 -2
- package/src/specs/NativeHotUpdater.ts +1 -1
- 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
|
@@ -134,7 +134,7 @@ const HotUpdater = exports.HotUpdater = {
|
|
|
134
134
|
*
|
|
135
135
|
* await HotUpdater.updateBundle(updateInfo.id, updateInfo.fileUrl);
|
|
136
136
|
* if (updateInfo.shouldForceUpdate) {
|
|
137
|
-
* HotUpdater.reload();
|
|
137
|
+
* await HotUpdater.reload();
|
|
138
138
|
* }
|
|
139
139
|
* ```
|
|
140
140
|
*/
|
|
@@ -165,7 +165,7 @@ const HotUpdater = exports.HotUpdater = {
|
|
|
165
165
|
* });
|
|
166
166
|
*
|
|
167
167
|
* if(result.status !== "UP_TO_DATE" && result.shouldForceUpdate) {
|
|
168
|
-
* HotUpdater.reload();
|
|
168
|
+
* await HotUpdater.reload();
|
|
169
169
|
* }
|
|
170
170
|
* ```
|
|
171
171
|
*
|
|
@@ -201,7 +201,7 @@ const HotUpdater = exports.HotUpdater = {
|
|
|
201
201
|
* fileUrl: updateInfo.fileUrl
|
|
202
202
|
* });
|
|
203
203
|
* if (updateInfo.shouldForceUpdate) {
|
|
204
|
-
* HotUpdater.reload();
|
|
204
|
+
* await HotUpdater.reload();
|
|
205
205
|
* }
|
|
206
206
|
* ```
|
|
207
207
|
*/
|
|
@@ -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","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;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":[]}
|
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/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
|
@@ -110,7 +110,7 @@ export const HotUpdater = {
|
|
|
110
110
|
*
|
|
111
111
|
* await HotUpdater.updateBundle(updateInfo.id, updateInfo.fileUrl);
|
|
112
112
|
* if (updateInfo.shouldForceUpdate) {
|
|
113
|
-
* HotUpdater.reload();
|
|
113
|
+
* await HotUpdater.reload();
|
|
114
114
|
* }
|
|
115
115
|
* ```
|
|
116
116
|
*/
|
|
@@ -141,7 +141,7 @@ export const HotUpdater = {
|
|
|
141
141
|
* });
|
|
142
142
|
*
|
|
143
143
|
* if(result.status !== "UP_TO_DATE" && result.shouldForceUpdate) {
|
|
144
|
-
* HotUpdater.reload();
|
|
144
|
+
* await HotUpdater.reload();
|
|
145
145
|
* }
|
|
146
146
|
* ```
|
|
147
147
|
*
|
|
@@ -177,7 +177,7 @@ export const HotUpdater = {
|
|
|
177
177
|
* fileUrl: updateInfo.fileUrl
|
|
178
178
|
* });
|
|
179
179
|
* if (updateInfo.shouldForceUpdate) {
|
|
180
|
-
* HotUpdater.reload();
|
|
180
|
+
* await HotUpdater.reload();
|
|
181
181
|
* }
|
|
182
182
|
* ```
|
|
183
183
|
*/
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["checkForUpdate","addListener","getAppVersion","getBundleId","getChannel","getFingerprintHash","getMinBundleId","reload","updateBundle","runUpdateProcess","hotUpdaterStore","wrap","progress","setState","HotUpdater","getUpdateSource"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,cAAc,QAAQ,qBAAkB;AACjD,SACEC,WAAW,EACXC,aAAa,EACbC,WAAW,EACXC,UAAU,EACVC,kBAAkB,EAClBC,cAAc,EACdC,MAAM,EACNC,YAAY,QACP,aAAU;AACjB,SAASC,gBAAgB,QAAQ,uBAAoB;AACrD,SAASC,eAAe,QAAQ,YAAS;AACzC,SAASC,IAAI,QAAQ,WAAQ;
|
|
1
|
+
{"version":3,"names":["checkForUpdate","addListener","getAppVersion","getBundleId","getChannel","getFingerprintHash","getMinBundleId","reload","updateBundle","runUpdateProcess","hotUpdaterStore","wrap","progress","setState","HotUpdater","getUpdateSource"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,cAAc,QAAQ,qBAAkB;AACjD,SACEC,WAAW,EACXC,aAAa,EACbC,WAAW,EACXC,UAAU,EACVC,kBAAkB,EAClBC,cAAc,EACdC,MAAM,EACNC,YAAY,QACP,aAAU;AACjB,SAASC,gBAAgB,QAAQ,uBAAoB;AACrD,SAASC,eAAe,QAAQ,YAAS;AACzC,SAASC,IAAI,QAAQ,WAAQ;AAG7B,cAAc,YAAS;AAGvBV,WAAW,CAAC,YAAY,EAAE,CAAC;EAAEW;AAAS,CAAC,KAAK;EAC1CF,eAAe,CAACG,QAAQ,CAAC;IACvBD;EACF,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,MAAME,UAAU,GAAG;EACxB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEH,IAAI;EACJ;AACF;AACA;EACEJ,MAAM;EACN;AACF;AACA;EACEL,aAAa;EACb;AACF;AACA;EACEC,WAAW;EACX;AACF;AACA;EACEG,cAAc;EACd;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEF,UAAU;EACV;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEH,WAAW;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;EACED,cAAc;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;EACES,gBAAgB;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;EACED,YAAY;EACZ;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEH;AACF,CAAC;AAED,SAASU,eAAe,QAAQ,qBAAkB","ignoreList":[]}
|
package/lib/module/native.js
CHANGED
|
@@ -13,6 +13,10 @@ export const addListener = (eventName, listener) => {
|
|
|
13
13
|
subscription.remove();
|
|
14
14
|
};
|
|
15
15
|
};
|
|
16
|
+
// In-flight update deduplication by bundleId (session-scoped).
|
|
17
|
+
const inflightUpdates = new Map();
|
|
18
|
+
// Tracks the last successfully installed bundleId for this session.
|
|
19
|
+
let lastInstalledBundleId = null;
|
|
16
20
|
|
|
17
21
|
/**
|
|
18
22
|
* Downloads files and applies them to the app.
|
|
@@ -28,22 +32,38 @@ export const addListener = (eventName, listener) => {
|
|
|
28
32
|
export async function updateBundle(paramsOrBundleId, fileUrl) {
|
|
29
33
|
const updateBundleId = typeof paramsOrBundleId === "string" ? paramsOrBundleId : paramsOrBundleId.bundleId;
|
|
30
34
|
const status = typeof paramsOrBundleId === "string" ? "UPDATE" : paramsOrBundleId.status;
|
|
35
|
+
|
|
36
|
+
// If we have already installed this bundle in this session, skip re-download.
|
|
37
|
+
if (status === "UPDATE" && lastInstalledBundleId === updateBundleId) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
31
40
|
const currentBundleId = getBundleId();
|
|
32
41
|
|
|
33
42
|
// updateBundleId <= currentBundleId
|
|
34
43
|
if (status === "UPDATE" && updateBundleId.localeCompare(currentBundleId) <= 0) {
|
|
35
44
|
throw new Error("Update bundle id is the same as the current bundle id. Preventing infinite update loop.");
|
|
36
45
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
|
|
47
|
+
// In-flight guard: return the same promise if the same bundle is already updating.
|
|
48
|
+
const existing = inflightUpdates.get(updateBundleId);
|
|
49
|
+
if (existing) return existing;
|
|
50
|
+
const targetFileUrl = typeof paramsOrBundleId === "string" ? fileUrl ?? null : paramsOrBundleId.fileUrl;
|
|
51
|
+
const promise = (async () => {
|
|
52
|
+
try {
|
|
53
|
+
const ok = await HotUpdaterNative.updateBundle({
|
|
54
|
+
bundleId: updateBundleId,
|
|
55
|
+
fileUrl: targetFileUrl
|
|
56
|
+
});
|
|
57
|
+
if (ok) {
|
|
58
|
+
lastInstalledBundleId = updateBundleId;
|
|
59
|
+
}
|
|
60
|
+
return ok;
|
|
61
|
+
} finally {
|
|
62
|
+
inflightUpdates.delete(updateBundleId);
|
|
63
|
+
}
|
|
64
|
+
})();
|
|
65
|
+
inflightUpdates.set(updateBundleId, promise);
|
|
66
|
+
return promise;
|
|
47
67
|
}
|
|
48
68
|
|
|
49
69
|
/**
|
|
@@ -57,10 +77,8 @@ export const getAppVersion = () => {
|
|
|
57
77
|
/**
|
|
58
78
|
* Reloads the app.
|
|
59
79
|
*/
|
|
60
|
-
export const reload = () => {
|
|
61
|
-
|
|
62
|
-
HotUpdaterNative.reload();
|
|
63
|
-
});
|
|
80
|
+
export const reload = async () => {
|
|
81
|
+
await HotUpdaterNative.reload();
|
|
64
82
|
};
|
|
65
83
|
|
|
66
84
|
/**
|
package/lib/module/native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeEventEmitter","HotUpdaterNative","NIL_UUID","HotUpdaterConstants","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","addListener","eventName","listener","eventEmitter","subscription","remove","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","bundleId","status","currentBundleId","getBundleId","localeCompare","Error","getAppVersion","constants","getConstants","APP_VERSION","reload","
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","HotUpdaterNative","NIL_UUID","HotUpdaterConstants","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","addListener","eventName","listener","eventEmitter","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":[]}
|
|
@@ -28,7 +28,7 @@ import { getBundleId, reload } from "./native.js";
|
|
|
28
28
|
* });
|
|
29
29
|
*
|
|
30
30
|
* if(result.status !== "UP_TO_DATE" && result.shouldForceUpdate) {
|
|
31
|
-
* HotUpdater.reload();
|
|
31
|
+
* await HotUpdater.reload();
|
|
32
32
|
* }
|
|
33
33
|
* ```
|
|
34
34
|
*
|
|
@@ -49,7 +49,7 @@ export const runUpdateProcess = async ({
|
|
|
49
49
|
}
|
|
50
50
|
const isUpdated = await updateInfo.updateBundle();
|
|
51
51
|
if (isUpdated && updateInfo.shouldForceUpdate && reloadOnForceUpdate) {
|
|
52
|
-
reload();
|
|
52
|
+
await reload();
|
|
53
53
|
}
|
|
54
54
|
if (!isUpdated) {
|
|
55
55
|
throw new Error("New update was found but failed to download the bundle.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["checkForUpdate","getBundleId","reload","runUpdateProcess","reloadOnForceUpdate","checkForUpdateOptions","updateInfo","status","shouldForceUpdate","message","id","isUpdated","updateBundle","Error"],"sourceRoot":"../../src","sources":["runUpdateProcess.ts"],"mappings":";;AAAA,SAAqCA,cAAc,QAAQ,qBAAkB;AAC7E,SAASC,WAAW,EAAEC,MAAM,QAAQ,aAAU;AAkB9C;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;AACA,OAAO,MAAMC,gBAAgB,GAAG,MAAAA,CAAO;EACrCC,mBAAmB,GAAG,IAAI;EAC1B,GAAGC;AACoB,CAAC,KAAwC;EAChE,MAAMC,UAAU,GAAG,MAAMN,cAAc,CAACK,qBAAqB,CAAC;EAC9D,IAAI,CAACC,UAAU,EAAE;IACf,OAAO;MACLC,MAAM,EAAE,YAAY;MACpBC,iBAAiB,EAAE,KAAK;MACxBC,OAAO,EAAE,IAAI;MACbC,EAAE,EAAET,WAAW,CAAC;IAClB,CAAC;EACH;EAEA,MAAMU,SAAS,GAAG,MAAML,UAAU,CAACM,YAAY,CAAC,CAAC;EACjD,IAAID,SAAS,IAAIL,UAAU,CAACE,iBAAiB,IAAIJ,mBAAmB,EAAE;
|
|
1
|
+
{"version":3,"names":["checkForUpdate","getBundleId","reload","runUpdateProcess","reloadOnForceUpdate","checkForUpdateOptions","updateInfo","status","shouldForceUpdate","message","id","isUpdated","updateBundle","Error"],"sourceRoot":"../../src","sources":["runUpdateProcess.ts"],"mappings":";;AAAA,SAAqCA,cAAc,QAAQ,qBAAkB;AAC7E,SAASC,WAAW,EAAEC,MAAM,QAAQ,aAAU;AAkB9C;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;AACA,OAAO,MAAMC,gBAAgB,GAAG,MAAAA,CAAO;EACrCC,mBAAmB,GAAG,IAAI;EAC1B,GAAGC;AACoB,CAAC,KAAwC;EAChE,MAAMC,UAAU,GAAG,MAAMN,cAAc,CAACK,qBAAqB,CAAC;EAC9D,IAAI,CAACC,UAAU,EAAE;IACf,OAAO;MACLC,MAAM,EAAE,YAAY;MACpBC,iBAAiB,EAAE,KAAK;MACxBC,OAAO,EAAE,IAAI;MACbC,EAAE,EAAET,WAAW,CAAC;IAClB,CAAC;EACH;EAEA,MAAMU,SAAS,GAAG,MAAML,UAAU,CAACM,YAAY,CAAC,CAAC;EACjD,IAAID,SAAS,IAAIL,UAAU,CAACE,iBAAiB,IAAIJ,mBAAmB,EAAE;IACpE,MAAMF,MAAM,CAAC,CAAC;EAChB;EAEA,IAAI,CAACS,SAAS,EAAE;IACd,MAAM,IAAIE,KAAK,CAAC,yDAAyD,CAAC;EAC5E;EACA,OAAO;IACLN,MAAM,EAAED,UAAU,CAACC,MAAM;IACzBC,iBAAiB,EAAEF,UAAU,CAACE,iBAAiB;IAC/CE,EAAE,EAAEJ,UAAU,CAACI,EAAE;IACjBD,OAAO,EAAEH,UAAU,CAACG;EACtB,CAAC;AACH,CAAC","ignoreList":[]}
|
package/lib/module/wrap.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import React from "react";
|
|
4
|
-
import { useEffect, useLayoutEffect, useState } from "react";
|
|
3
|
+
import React, { useEffect, useLayoutEffect, useState } from "react";
|
|
5
4
|
import { checkForUpdate } from "./checkForUpdate.js";
|
|
6
5
|
import { useEventCallback } from "./hooks/useEventCallback.js";
|
|
7
6
|
import { getBundleId, reload } from "./native.js";
|
|
@@ -56,7 +55,7 @@ export function wrap(options) {
|
|
|
56
55
|
throw new Error("New update was found but failed to download the bundle.");
|
|
57
56
|
}
|
|
58
57
|
if (reloadOnForceUpdate) {
|
|
59
|
-
reload();
|
|
58
|
+
await reload();
|
|
60
59
|
}
|
|
61
60
|
restOptions.onUpdateProcessCompleted?.({
|
|
62
61
|
id: updateInfo.id,
|
package/lib/module/wrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useLayoutEffect","useState","checkForUpdate","useEventCallback","getBundleId","reload","useHotUpdaterStore","jsx","_jsx","wrap","options","reloadOnForceUpdate","restOptions","WrappedComponent","HotUpdaterHOC","props","progress","state","message","setMessage","updateStatus","setUpdateStatus","initHotUpdater","updateInfo","source","requestHeaders","onError","onUpdateProcessCompleted","status","shouldForceUpdate","id","updateBundle","catch","error","isSuccess","Error","onProgress","fallbackComponent","Fallback"],"sourceRoot":"../../src","sources":["wrap.tsx"],"mappings":";;AAAA,OAAOA,KAAK,
|
|
1
|
+
{"version":3,"names":["React","useEffect","useLayoutEffect","useState","checkForUpdate","useEventCallback","getBundleId","reload","useHotUpdaterStore","jsx","_jsx","wrap","options","reloadOnForceUpdate","restOptions","WrappedComponent","HotUpdaterHOC","props","progress","state","message","setMessage","updateStatus","setUpdateStatus","initHotUpdater","updateInfo","source","requestHeaders","onError","onUpdateProcessCompleted","status","shouldForceUpdate","id","updateBundle","catch","error","isSuccess","Error","onProgress","fallbackComponent","Fallback"],"sourceRoot":"../../src","sources":["wrap.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkForUpdate.d.ts","sourceRoot":"","sources":["../../../src/checkForUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,
|
|
1
|
+
{"version":3,"file":"checkForUpdate.d.ts","sourceRoot":"","sources":["../../../src/checkForUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAUvE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG;IACjD;;;OAGG;IACH,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC,CAAC;AAEF,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAsDtC;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,cAAc,EAAE,YAAY,GAAG,aAAa,CAAC;CAC9C;AAED,eAAO,MAAM,eAAe,GACzB,SAAS,MAAM,EAAE,SAAS,sBAAsB,MAChD,QAAQ,kBAAkB,WAc1B,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { checkForUpdate } from "./checkForUpdate";
|
|
2
2
|
import { updateBundle } from "./native";
|
|
3
3
|
import { wrap } from "./wrap";
|
|
4
|
-
export type { HotUpdaterOptions } from "./wrap";
|
|
5
4
|
export type { HotUpdaterEvent } from "./native";
|
|
6
5
|
export * from "./store";
|
|
6
|
+
export type { HotUpdaterOptions } from "./wrap";
|
|
7
7
|
export declare const HotUpdater: {
|
|
8
8
|
/**
|
|
9
9
|
* `HotUpdater.wrap` checks for updates at the entry point, and if there is a bundle to update, it downloads the bundle and applies the update strategy.
|
|
@@ -31,7 +31,7 @@ export declare const HotUpdater: {
|
|
|
31
31
|
/**
|
|
32
32
|
* Reloads the app.
|
|
33
33
|
*/
|
|
34
|
-
reload: () => void
|
|
34
|
+
reload: () => Promise<void>;
|
|
35
35
|
/**
|
|
36
36
|
* Fetches the current app version.
|
|
37
37
|
*/
|
|
@@ -101,7 +101,7 @@ export declare const HotUpdater: {
|
|
|
101
101
|
*
|
|
102
102
|
* await HotUpdater.updateBundle(updateInfo.id, updateInfo.fileUrl);
|
|
103
103
|
* if (updateInfo.shouldForceUpdate) {
|
|
104
|
-
* HotUpdater.reload();
|
|
104
|
+
* await HotUpdater.reload();
|
|
105
105
|
* }
|
|
106
106
|
* ```
|
|
107
107
|
*/
|
|
@@ -132,7 +132,7 @@ export declare const HotUpdater: {
|
|
|
132
132
|
* });
|
|
133
133
|
*
|
|
134
134
|
* if(result.status !== "UP_TO_DATE" && result.shouldForceUpdate) {
|
|
135
|
-
* HotUpdater.reload();
|
|
135
|
+
* await HotUpdater.reload();
|
|
136
136
|
* }
|
|
137
137
|
* ```
|
|
138
138
|
*
|
|
@@ -168,7 +168,7 @@ export declare const HotUpdater: {
|
|
|
168
168
|
* fileUrl: updateInfo.fileUrl
|
|
169
169
|
* });
|
|
170
170
|
* if (updateInfo.shouldForceUpdate) {
|
|
171
|
-
* HotUpdater.reload();
|
|
171
|
+
* await HotUpdater.reload();
|
|
172
172
|
* }
|
|
173
173
|
* ```
|
|
174
174
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAQL,YAAY,EACb,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAQL,YAAY,EACb,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,cAAc,SAAS,CAAC;AACxB,YAAY,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAQhD,eAAO,MAAM,UAAU;IACrB;;;;;;;;;;;;;;;;;;;;;OAqBG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;;;;;;;;;;;OAYG;;IAEH;;;;;;;;;;;;;;;;OAgBG;;IAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;;IAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;;IAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;;IAEH;;;;;;;;;;OAUG;;CAEJ,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -30,7 +30,7 @@ export declare const getAppVersion: () => string | null;
|
|
|
30
30
|
/**
|
|
31
31
|
* Reloads the app.
|
|
32
32
|
*/
|
|
33
|
-
export declare const reload: () => void
|
|
33
|
+
export declare const reload: () => Promise<void>;
|
|
34
34
|
/**
|
|
35
35
|
* Fetches the minimum bundle id, which represents the initial bundle of the app
|
|
36
36
|
* since it is created at build time.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../src/native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAyB,EACvB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAMlC,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,eAAe,EACzD,WAAW,CAAC,EACZ,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,eAQ9C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG;IAC9C,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../src/native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAyB,EACvB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAMlC,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,eAAe,EACzD,WAAW,CAAC,EACZ,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,eAQ9C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG;IAC9C,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAOF;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAC3E;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,OAAO,CAAC,CAAC;AA0DpB;;GAEG;AACH,eAAO,MAAM,aAAa,QAAO,MAAM,GAAG,IAGzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,qBAElB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAAO,MAGjC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAO,MAI9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAO,MAG7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,QAAO,MAAM,GAAG,IAG9C,CAAC"}
|
|
@@ -4,7 +4,7 @@ export interface UpdateBundleParams {
|
|
|
4
4
|
fileUrl: string | null;
|
|
5
5
|
}
|
|
6
6
|
export interface Spec extends TurboModule {
|
|
7
|
-
reload(): void
|
|
7
|
+
reload(): Promise<void>;
|
|
8
8
|
updateBundle(params: UpdateBundleParams): Promise<boolean>;
|
|
9
9
|
addListener(eventName: string): void;
|
|
10
10
|
removeListeners(count: number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeHotUpdater.d.ts","sourceRoot":"","sources":["../../../../src/specs/NativeHotUpdater.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,MAAM,IAAI,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeHotUpdater.d.ts","sourceRoot":"","sources":["../../../../src/specs/NativeHotUpdater.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAG3D,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC;CACH;;AAED,wBAAoE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../src/wrap.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../src/wrap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,KAAK,qBAAqB,EAAkB,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAGnE,KAAK,YAAY,GACb,kBAAkB,GAClB,UAAU,GACV,0BAA0B,CAAC;AAE/B,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;IAC9D;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;QAC1D,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,GAAG,OAAO,KAAK,IAAI,CAAC;IAC7D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,CAAC,QAAQ,EAAE,wBAAwB,KAAK,IAAI,CAAC;CACzE;AAED,wBAAgB,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,mBAAmB,GAAG,MAAM,EACnE,OAAO,EAAE,iBAAiB,GACzB,CAAC,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAuGtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkForUpdate.d.ts","sourceRoot":"","sources":["../../../src/checkForUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,
|
|
1
|
+
{"version":3,"file":"checkForUpdate.d.ts","sourceRoot":"","sources":["../../../src/checkForUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAUvE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG;IACjD;;;OAGG;IACH,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC,CAAC;AAEF,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAsDtC;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,cAAc,EAAE,YAAY,GAAG,aAAa,CAAC;CAC9C;AAED,eAAO,MAAM,eAAe,GACzB,SAAS,MAAM,EAAE,SAAS,sBAAsB,MAChD,QAAQ,kBAAkB,WAc1B,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { checkForUpdate } from "./checkForUpdate";
|
|
2
2
|
import { updateBundle } from "./native";
|
|
3
3
|
import { wrap } from "./wrap";
|
|
4
|
-
export type { HotUpdaterOptions } from "./wrap";
|
|
5
4
|
export type { HotUpdaterEvent } from "./native";
|
|
6
5
|
export * from "./store";
|
|
6
|
+
export type { HotUpdaterOptions } from "./wrap";
|
|
7
7
|
export declare const HotUpdater: {
|
|
8
8
|
/**
|
|
9
9
|
* `HotUpdater.wrap` checks for updates at the entry point, and if there is a bundle to update, it downloads the bundle and applies the update strategy.
|
|
@@ -31,7 +31,7 @@ export declare const HotUpdater: {
|
|
|
31
31
|
/**
|
|
32
32
|
* Reloads the app.
|
|
33
33
|
*/
|
|
34
|
-
reload: () => void
|
|
34
|
+
reload: () => Promise<void>;
|
|
35
35
|
/**
|
|
36
36
|
* Fetches the current app version.
|
|
37
37
|
*/
|
|
@@ -101,7 +101,7 @@ export declare const HotUpdater: {
|
|
|
101
101
|
*
|
|
102
102
|
* await HotUpdater.updateBundle(updateInfo.id, updateInfo.fileUrl);
|
|
103
103
|
* if (updateInfo.shouldForceUpdate) {
|
|
104
|
-
* HotUpdater.reload();
|
|
104
|
+
* await HotUpdater.reload();
|
|
105
105
|
* }
|
|
106
106
|
* ```
|
|
107
107
|
*/
|
|
@@ -132,7 +132,7 @@ export declare const HotUpdater: {
|
|
|
132
132
|
* });
|
|
133
133
|
*
|
|
134
134
|
* if(result.status !== "UP_TO_DATE" && result.shouldForceUpdate) {
|
|
135
|
-
* HotUpdater.reload();
|
|
135
|
+
* await HotUpdater.reload();
|
|
136
136
|
* }
|
|
137
137
|
* ```
|
|
138
138
|
*
|
|
@@ -168,7 +168,7 @@ export declare const HotUpdater: {
|
|
|
168
168
|
* fileUrl: updateInfo.fileUrl
|
|
169
169
|
* });
|
|
170
170
|
* if (updateInfo.shouldForceUpdate) {
|
|
171
|
-
* HotUpdater.reload();
|
|
171
|
+
* await HotUpdater.reload();
|
|
172
172
|
* }
|
|
173
173
|
* ```
|
|
174
174
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAQL,YAAY,EACb,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAQL,YAAY,EACb,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,cAAc,SAAS,CAAC;AACxB,YAAY,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAQhD,eAAO,MAAM,UAAU;IACrB;;;;;;;;;;;;;;;;;;;;;OAqBG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;;;;;;;;;;;OAYG;;IAEH;;;;;;;;;;;;;;;;OAgBG;;IAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;;IAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;;IAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;;IAEH;;;;;;;;;;OAUG;;CAEJ,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -30,7 +30,7 @@ export declare const getAppVersion: () => string | null;
|
|
|
30
30
|
/**
|
|
31
31
|
* Reloads the app.
|
|
32
32
|
*/
|
|
33
|
-
export declare const reload: () => void
|
|
33
|
+
export declare const reload: () => Promise<void>;
|
|
34
34
|
/**
|
|
35
35
|
* Fetches the minimum bundle id, which represents the initial bundle of the app
|
|
36
36
|
* since it is created at build time.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../src/native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAyB,EACvB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAMlC,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,eAAe,EACzD,WAAW,CAAC,EACZ,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,eAQ9C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG;IAC9C,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../src/native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAyB,EACvB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAMlC,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,eAAe,EACzD,WAAW,CAAC,EACZ,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,eAQ9C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG;IAC9C,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAOF;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAC3E;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,OAAO,CAAC,CAAC;AA0DpB;;GAEG;AACH,eAAO,MAAM,aAAa,QAAO,MAAM,GAAG,IAGzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,qBAElB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAAO,MAGjC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAO,MAI9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAO,MAG7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,QAAO,MAAM,GAAG,IAG9C,CAAC"}
|
|
@@ -4,7 +4,7 @@ export interface UpdateBundleParams {
|
|
|
4
4
|
fileUrl: string | null;
|
|
5
5
|
}
|
|
6
6
|
export interface Spec extends TurboModule {
|
|
7
|
-
reload(): void
|
|
7
|
+
reload(): Promise<void>;
|
|
8
8
|
updateBundle(params: UpdateBundleParams): Promise<boolean>;
|
|
9
9
|
addListener(eventName: string): void;
|
|
10
10
|
removeListeners(count: number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeHotUpdater.d.ts","sourceRoot":"","sources":["../../../../src/specs/NativeHotUpdater.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,MAAM,IAAI,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeHotUpdater.d.ts","sourceRoot":"","sources":["../../../../src/specs/NativeHotUpdater.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAG3D,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC;CACH;;AAED,wBAAoE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../src/wrap.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../src/wrap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,KAAK,qBAAqB,EAAkB,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAGnE,KAAK,YAAY,GACb,kBAAkB,GAClB,UAAU,GACV,0BAA0B,CAAC;AAE/B,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;IAC9D;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;QAC1D,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,GAAG,OAAO,KAAK,IAAI,CAAC;IAC7D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,CAAC,QAAQ,EAAE,wBAAwB,KAAK,IAAI,CAAC;CACzE;AAED,wBAAgB,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,mBAAmB,GAAG,MAAM,EACnE,OAAO,EAAE,iBAAiB,GACzB,CAAC,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAuGtE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/react-native",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.12",
|
|
4
4
|
"description": "React Native OTA solution for self-hosted",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -119,13 +119,13 @@
|
|
|
119
119
|
"react-native": "0.79.1",
|
|
120
120
|
"react-native-builder-bob": "^0.40.10",
|
|
121
121
|
"typescript": "^5.8.3",
|
|
122
|
-
"hot-updater": "0.20.
|
|
122
|
+
"hot-updater": "0.20.12"
|
|
123
123
|
},
|
|
124
124
|
"dependencies": {
|
|
125
125
|
"use-sync-external-store": "1.5.0",
|
|
126
|
-
"@hot-updater/core": "0.20.
|
|
127
|
-
"@hot-updater/
|
|
128
|
-
"@hot-updater/
|
|
126
|
+
"@hot-updater/core": "0.20.12",
|
|
127
|
+
"@hot-updater/js": "0.20.12",
|
|
128
|
+
"@hot-updater/plugin-core": "0.20.12"
|
|
129
129
|
},
|
|
130
130
|
"scripts": {
|
|
131
131
|
"build": "bob build && tsc -p plugin/tsconfig.json",
|
|
@@ -51,9 +51,12 @@ var getFingerprint = function () { return __awaiter(void 0, void 0, void 0, func
|
|
|
51
51
|
if (fingerprintCache) {
|
|
52
52
|
return [2 /*return*/, fingerprintCache];
|
|
53
53
|
}
|
|
54
|
-
return [4 /*yield*/, (0, hot_updater_1.
|
|
54
|
+
return [4 /*yield*/, (0, hot_updater_1.generateFingerprints)()];
|
|
55
55
|
case 1:
|
|
56
56
|
fingerprintCache = _a.sent();
|
|
57
|
+
return [4 /*yield*/, (0, hot_updater_1.createFingerprintJSON)(fingerprintCache)];
|
|
58
|
+
case 2:
|
|
59
|
+
_a.sent();
|
|
57
60
|
return [2 /*return*/, fingerprintCache];
|
|
58
61
|
}
|
|
59
62
|
});
|
|
@@ -138,7 +141,6 @@ var withHotUpdaterNativeCode = function (config) {
|
|
|
138
141
|
var javaImportAnchor = "import com.facebook.react.ReactApplication;";
|
|
139
142
|
var javaReactNativeHostAnchor = "new DefaultReactNativeHost"; // Part of the instantiation
|
|
140
143
|
var javaMethodCheck = "HotUpdater.Companion.getJSBundleFile"; // Unique part of the method body
|
|
141
|
-
var javaMethodSignature = "protected String getJSBundleFile()";
|
|
142
144
|
// Regex to find an existing getJSBundleFile override (non-greedy)
|
|
143
145
|
var javaExistingMethodRegex = /^\s*@Override\s+protected String getJSBundleFile\(\)\s*\{[\s\S]*?^\s*\}/gm;
|
|
144
146
|
var javaHermesBlockEndAnchor = "return BuildConfig.IS_HERMES_ENABLED;\n }"; // End of the isHermesEnabled method block
|
|
@@ -223,7 +225,7 @@ var withHotUpdaterConfigAsync = function (props) { return function (config) {
|
|
|
223
225
|
if (!(config.updateStrategy !== "appVersion")) return [3 /*break*/, 3];
|
|
224
226
|
return [4 /*yield*/, getFingerprint()];
|
|
225
227
|
case 2:
|
|
226
|
-
fingerprint =
|
|
228
|
+
fingerprint = _a.sent();
|
|
227
229
|
fingerprintHash = fingerprint.ios.hash;
|
|
228
230
|
_a.label = 3;
|
|
229
231
|
case 3:
|
|
@@ -248,7 +250,7 @@ var withHotUpdaterConfigAsync = function (props) { return function (config) {
|
|
|
248
250
|
if (!(config.updateStrategy !== "appVersion")) return [3 /*break*/, 3];
|
|
249
251
|
return [4 /*yield*/, getFingerprint()];
|
|
250
252
|
case 2:
|
|
251
|
-
fingerprint =
|
|
253
|
+
fingerprint = _a.sent();
|
|
252
254
|
fingerprintHash = fingerprint.android.hash;
|
|
253
255
|
_a.label = 3;
|
|
254
256
|
case 3:
|
package/src/checkForUpdate.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AppUpdateInfo, UpdateBundleParams } from "@hot-updater/core";
|
|
2
2
|
import { Platform } from "react-native";
|
|
3
3
|
import { HotUpdaterError } from "./error";
|
|
4
|
-
import { type UpdateSource
|
|
4
|
+
import { fetchUpdateInfo, type UpdateSource } from "./fetchUpdateInfo";
|
|
5
5
|
import {
|
|
6
6
|
getAppVersion,
|
|
7
7
|
getBundleId,
|
package/src/index.ts
CHANGED
|
@@ -13,10 +13,9 @@ import { runUpdateProcess } from "./runUpdateProcess";
|
|
|
13
13
|
import { hotUpdaterStore } from "./store";
|
|
14
14
|
import { wrap } from "./wrap";
|
|
15
15
|
|
|
16
|
-
export type { HotUpdaterOptions } from "./wrap";
|
|
17
16
|
export type { HotUpdaterEvent } from "./native";
|
|
18
|
-
|
|
19
17
|
export * from "./store";
|
|
18
|
+
export type { HotUpdaterOptions } from "./wrap";
|
|
20
19
|
|
|
21
20
|
addListener("onProgress", ({ progress }) => {
|
|
22
21
|
hotUpdaterStore.setState({
|
|
@@ -121,7 +120,7 @@ export const HotUpdater = {
|
|
|
121
120
|
*
|
|
122
121
|
* await HotUpdater.updateBundle(updateInfo.id, updateInfo.fileUrl);
|
|
123
122
|
* if (updateInfo.shouldForceUpdate) {
|
|
124
|
-
* HotUpdater.reload();
|
|
123
|
+
* await HotUpdater.reload();
|
|
125
124
|
* }
|
|
126
125
|
* ```
|
|
127
126
|
*/
|
|
@@ -152,7 +151,7 @@ export const HotUpdater = {
|
|
|
152
151
|
* });
|
|
153
152
|
*
|
|
154
153
|
* if(result.status !== "UP_TO_DATE" && result.shouldForceUpdate) {
|
|
155
|
-
* HotUpdater.reload();
|
|
154
|
+
* await HotUpdater.reload();
|
|
156
155
|
* }
|
|
157
156
|
* ```
|
|
158
157
|
*
|
|
@@ -188,7 +187,7 @@ export const HotUpdater = {
|
|
|
188
187
|
* fileUrl: updateInfo.fileUrl
|
|
189
188
|
* });
|
|
190
189
|
* if (updateInfo.shouldForceUpdate) {
|
|
191
|
-
* HotUpdater.reload();
|
|
190
|
+
* await HotUpdater.reload();
|
|
192
191
|
* }
|
|
193
192
|
* ```
|
|
194
193
|
*/
|
package/src/native.ts
CHANGED
|
@@ -34,6 +34,11 @@ export type UpdateParams = UpdateBundleParams & {
|
|
|
34
34
|
status: UpdateStatus;
|
|
35
35
|
};
|
|
36
36
|
|
|
37
|
+
// In-flight update deduplication by bundleId (session-scoped).
|
|
38
|
+
const inflightUpdates = new Map<string, Promise<boolean>>();
|
|
39
|
+
// Tracks the last successfully installed bundleId for this session.
|
|
40
|
+
let lastInstalledBundleId: string | null = null;
|
|
41
|
+
|
|
37
42
|
/**
|
|
38
43
|
* Downloads files and applies them to the app.
|
|
39
44
|
*
|
|
@@ -60,6 +65,11 @@ export async function updateBundle(
|
|
|
60
65
|
const status =
|
|
61
66
|
typeof paramsOrBundleId === "string" ? "UPDATE" : paramsOrBundleId.status;
|
|
62
67
|
|
|
68
|
+
// If we have already installed this bundle in this session, skip re-download.
|
|
69
|
+
if (status === "UPDATE" && lastInstalledBundleId === updateBundleId) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
|
|
63
73
|
const currentBundleId = getBundleId();
|
|
64
74
|
|
|
65
75
|
// updateBundleId <= currentBundleId
|
|
@@ -72,16 +82,32 @@ export async function updateBundle(
|
|
|
72
82
|
);
|
|
73
83
|
}
|
|
74
84
|
|
|
75
|
-
if
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
// In-flight guard: return the same promise if the same bundle is already updating.
|
|
86
|
+
const existing = inflightUpdates.get(updateBundleId);
|
|
87
|
+
if (existing) return existing;
|
|
88
|
+
|
|
89
|
+
const targetFileUrl =
|
|
90
|
+
typeof paramsOrBundleId === "string"
|
|
91
|
+
? (fileUrl ?? null)
|
|
92
|
+
: paramsOrBundleId.fileUrl;
|
|
93
|
+
|
|
94
|
+
const promise = (async () => {
|
|
95
|
+
try {
|
|
96
|
+
const ok = await HotUpdaterNative.updateBundle({
|
|
97
|
+
bundleId: updateBundleId,
|
|
98
|
+
fileUrl: targetFileUrl,
|
|
99
|
+
});
|
|
100
|
+
if (ok) {
|
|
101
|
+
lastInstalledBundleId = updateBundleId;
|
|
102
|
+
}
|
|
103
|
+
return ok;
|
|
104
|
+
} finally {
|
|
105
|
+
inflightUpdates.delete(updateBundleId);
|
|
106
|
+
}
|
|
107
|
+
})();
|
|
108
|
+
|
|
109
|
+
inflightUpdates.set(updateBundleId, promise);
|
|
110
|
+
return promise;
|
|
85
111
|
}
|
|
86
112
|
|
|
87
113
|
/**
|
|
@@ -95,10 +121,8 @@ export const getAppVersion = (): string | null => {
|
|
|
95
121
|
/**
|
|
96
122
|
* Reloads the app.
|
|
97
123
|
*/
|
|
98
|
-
export const reload = () => {
|
|
99
|
-
|
|
100
|
-
HotUpdaterNative.reload();
|
|
101
|
-
});
|
|
124
|
+
export const reload = async () => {
|
|
125
|
+
await HotUpdaterNative.reload();
|
|
102
126
|
};
|
|
103
127
|
|
|
104
128
|
/**
|
package/src/runUpdateProcess.ts
CHANGED
|
@@ -43,7 +43,7 @@ export interface RunUpdateProcessOptions extends CheckForUpdateOptions {
|
|
|
43
43
|
* });
|
|
44
44
|
*
|
|
45
45
|
* if(result.status !== "UP_TO_DATE" && result.shouldForceUpdate) {
|
|
46
|
-
* HotUpdater.reload();
|
|
46
|
+
* await HotUpdater.reload();
|
|
47
47
|
* }
|
|
48
48
|
* ```
|
|
49
49
|
*
|
|
@@ -65,7 +65,7 @@ export const runUpdateProcess = async ({
|
|
|
65
65
|
|
|
66
66
|
const isUpdated = await updateInfo.updateBundle();
|
|
67
67
|
if (isUpdated && updateInfo.shouldForceUpdate && reloadOnForceUpdate) {
|
|
68
|
-
reload();
|
|
68
|
+
await reload();
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
if (!isUpdated) {
|
package/src/wrap.tsx
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { useEffect, useLayoutEffect, useState } from "react";
|
|
1
|
+
import React, { useEffect, useLayoutEffect, useState } from "react";
|
|
3
2
|
import { type CheckForUpdateOptions, checkForUpdate } from "./checkForUpdate";
|
|
4
3
|
import type { HotUpdaterError } from "./error";
|
|
5
4
|
import { useEventCallback } from "./hooks/useEventCallback";
|
|
@@ -117,7 +116,7 @@ export function wrap<P extends React.JSX.IntrinsicAttributes = object>(
|
|
|
117
116
|
}
|
|
118
117
|
|
|
119
118
|
if (reloadOnForceUpdate) {
|
|
120
|
-
reload();
|
|
119
|
+
await reload();
|
|
121
120
|
}
|
|
122
121
|
|
|
123
122
|
restOptions.onUpdateProcessCompleted?.({
|