@hot-updater/react-native 0.26.2 → 0.27.1
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/AndroidManifest.xml +10 -0
- package/android/src/main/AndroidManifestNew.xml +10 -0
- package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +52 -5
- package/android/src/main/java/com/hotupdater/HotUpdaterRestartActivity.kt +64 -0
- package/android/src/newarch/HotUpdaterModule.kt +13 -0
- package/android/src/oldarch/HotUpdaterModule.kt +14 -0
- package/android/src/oldarch/HotUpdaterSpec.kt +2 -0
- package/ios/HotUpdater/Internal/HotUpdater.mm +10 -0
- package/lib/commonjs/index.js +11 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/native.js +87 -2
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/specs/NativeHotUpdater.js.map +1 -1
- package/lib/module/index.js +12 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/native.js +86 -2
- package/lib/module/native.js.map +1 -1
- package/lib/module/specs/NativeHotUpdater.js.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +13 -2
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/native.d.ts +48 -1
- package/lib/typescript/commonjs/native.d.ts.map +1 -1
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts +6 -0
- package/lib/typescript/commonjs/specs/NativeHotUpdater.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +13 -2
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/native.d.ts +48 -1
- package/lib/typescript/module/native.d.ts.map +1 -1
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts +6 -0
- package/lib/typescript/module/specs/NativeHotUpdater.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/index.ts +20 -1
- package/src/native.ts +111 -2
- package/src/specs/NativeHotUpdater.ts +6 -0
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
2
|
package="com.hotupdater">
|
|
3
|
+
<application>
|
|
4
|
+
<activity
|
|
5
|
+
android:name="com.hotupdater.HotUpdaterRestartActivity"
|
|
6
|
+
android:excludeFromRecents="true"
|
|
7
|
+
android:exported="false"
|
|
8
|
+
android:launchMode="singleTask"
|
|
9
|
+
android:noHistory="true"
|
|
10
|
+
android:process=":hotupdater_restart"
|
|
11
|
+
android:theme="@android:style/Theme.NoDisplay" />
|
|
12
|
+
</application>
|
|
3
13
|
</manifest>
|
|
@@ -1,2 +1,12 @@
|
|
|
1
1
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
2
|
+
<application>
|
|
3
|
+
<activity
|
|
4
|
+
android:name="com.hotupdater.HotUpdaterRestartActivity"
|
|
5
|
+
android:excludeFromRecents="true"
|
|
6
|
+
android:exported="false"
|
|
7
|
+
android:launchMode="singleTask"
|
|
8
|
+
android:noHistory="true"
|
|
9
|
+
android:process=":hotupdater_restart"
|
|
10
|
+
android:theme="@android:style/Theme.NoDisplay" />
|
|
11
|
+
</application>
|
|
2
12
|
</manifest>
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
package com.hotupdater
|
|
2
2
|
|
|
3
|
+
import android.app.ActivityOptions
|
|
3
4
|
import android.content.Context
|
|
5
|
+
import android.content.Intent
|
|
6
|
+
import android.os.Process
|
|
4
7
|
import android.util.Log
|
|
5
8
|
import kotlinx.coroutines.Dispatchers
|
|
6
9
|
import kotlinx.coroutines.withContext
|
|
@@ -295,19 +298,63 @@ class HotUpdaterImpl {
|
|
|
295
298
|
* @param reactContext The original context (preferably ReactApplicationContext to get current activity)
|
|
296
299
|
*/
|
|
297
300
|
suspend fun reload(reactContext: Context) {
|
|
298
|
-
val reactIntegrationManager = ReactIntegrationManager(reactContext)
|
|
299
|
-
val bundleURL = getJSBundleFile()
|
|
300
|
-
|
|
301
301
|
try {
|
|
302
302
|
withContext(Dispatchers.Main) {
|
|
303
|
-
|
|
304
|
-
reactIntegrationManager.reload()
|
|
303
|
+
performReactReload(reactContext)
|
|
305
304
|
}
|
|
306
305
|
} catch (e: Exception) {
|
|
307
306
|
Log.e("HotUpdaterImpl", "Failed to reload application", e)
|
|
308
307
|
}
|
|
309
308
|
}
|
|
310
309
|
|
|
310
|
+
suspend fun reloadProcess(reactContext: Context) {
|
|
311
|
+
try {
|
|
312
|
+
withContext(Dispatchers.Main) {
|
|
313
|
+
if (!restartApplication(reactContext)) {
|
|
314
|
+
Log.w(TAG, "Falling back to in-process reload because process restart could not be started")
|
|
315
|
+
performReactReload(reactContext)
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
} catch (e: Exception) {
|
|
319
|
+
Log.e("HotUpdaterImpl", "Failed to restart application process", e)
|
|
320
|
+
throw e
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
private suspend fun performReactReload(reactContext: Context) {
|
|
325
|
+
val reactIntegrationManager = ReactIntegrationManager(reactContext)
|
|
326
|
+
val bundleURL = getJSBundleFile()
|
|
327
|
+
reactIntegrationManager.setJSBundle(bundleURL)
|
|
328
|
+
reactIntegrationManager.reload()
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Use a cold restart in release builds so bundle application does not depend on RN reload timing.
|
|
332
|
+
private fun restartApplication(reactContext: Context): Boolean {
|
|
333
|
+
val currentActivity =
|
|
334
|
+
(reactContext as? com.facebook.react.bridge.ReactApplicationContext)?.currentActivity
|
|
335
|
+
if (currentActivity == null) {
|
|
336
|
+
Log.w(TAG, "Cannot restart app: current activity unavailable")
|
|
337
|
+
return false
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return try {
|
|
341
|
+
val restartIntent =
|
|
342
|
+
Intent(currentActivity, HotUpdaterRestartActivity::class.java).apply {
|
|
343
|
+
addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
|
|
344
|
+
putExtra(HotUpdaterRestartActivity.EXTRA_PACKAGE_NAME, currentActivity.packageName)
|
|
345
|
+
putExtra(HotUpdaterRestartActivity.EXTRA_TARGET_PID, Process.myPid())
|
|
346
|
+
}
|
|
347
|
+
val options = ActivityOptions.makeCustomAnimation(currentActivity, 0, 0)
|
|
348
|
+
currentActivity.startActivity(restartIntent, options.toBundle())
|
|
349
|
+
|
|
350
|
+
Log.i(TAG, "Started restart trampoline to apply update bundle")
|
|
351
|
+
return true
|
|
352
|
+
} catch (e: Exception) {
|
|
353
|
+
Log.w(TAG, "Failed to start restart trampoline", e)
|
|
354
|
+
false
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
311
358
|
/**
|
|
312
359
|
* Notifies the system that the app has successfully started with the given bundle.
|
|
313
360
|
* If the bundle matches the staging bundle, it promotes to stable.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
package com.hotupdater
|
|
2
|
+
|
|
3
|
+
import android.app.Activity
|
|
4
|
+
import android.app.ActivityOptions
|
|
5
|
+
import android.content.Intent
|
|
6
|
+
import android.os.Bundle
|
|
7
|
+
import android.os.Handler
|
|
8
|
+
import android.os.Looper
|
|
9
|
+
import android.os.Process
|
|
10
|
+
import android.util.Log
|
|
11
|
+
|
|
12
|
+
class HotUpdaterRestartActivity : Activity() {
|
|
13
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
14
|
+
super.onCreate(savedInstanceState)
|
|
15
|
+
|
|
16
|
+
val targetPid = intent.getIntExtra(EXTRA_TARGET_PID, -1)
|
|
17
|
+
val packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME) ?: this.packageName
|
|
18
|
+
val launchIntent = getRestartIntent(packageName)
|
|
19
|
+
|
|
20
|
+
if (launchIntent == null) {
|
|
21
|
+
Log.e(TAG, "Cannot relaunch app: launch intent not found for $packageName")
|
|
22
|
+
finishWithoutAnimation()
|
|
23
|
+
killCurrentProcess()
|
|
24
|
+
return
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (targetPid > 0) {
|
|
28
|
+
Process.killProcess(targetPid)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
val options = ActivityOptions.makeCustomAnimation(this, 0, 0)
|
|
32
|
+
startActivity(launchIntent, options.toBundle())
|
|
33
|
+
finishWithoutAnimation()
|
|
34
|
+
|
|
35
|
+
// Keep the trampoline alive just long enough to let Android settle the relaunch,
|
|
36
|
+
// then tear down the helper process as well.
|
|
37
|
+
Handler(Looper.getMainLooper()).postDelayed({ killCurrentProcess() }, PROCESS_KILL_DELAY_MS)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private fun finishWithoutAnimation() {
|
|
41
|
+
finish()
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private fun getRestartIntent(packageName: String): Intent? {
|
|
45
|
+
val launchIntent = packageManager.getLaunchIntentForPackage(packageName) ?: return null
|
|
46
|
+
val component = launchIntent.component ?: return null
|
|
47
|
+
|
|
48
|
+
return Intent.makeRestartActivityTask(component).apply {
|
|
49
|
+
`package` = packageName
|
|
50
|
+
addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private fun killCurrentProcess() {
|
|
55
|
+
Process.killProcess(Process.myPid())
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
companion object {
|
|
59
|
+
private const val TAG = "HotUpdaterRestart"
|
|
60
|
+
private const val PROCESS_KILL_DELAY_MS = 100L
|
|
61
|
+
const val EXTRA_PACKAGE_NAME = "hot_updater.package_name"
|
|
62
|
+
const val EXTRA_TARGET_PID = "hot_updater.target_pid"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -49,6 +49,19 @@ class HotUpdaterModule internal constructor(
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
override fun reloadProcess(promise: Promise) {
|
|
53
|
+
moduleScope.launch {
|
|
54
|
+
try {
|
|
55
|
+
val impl = getInstance()
|
|
56
|
+
impl.reloadProcess(mReactApplicationContext)
|
|
57
|
+
promise.resolve(null)
|
|
58
|
+
} catch (e: Exception) {
|
|
59
|
+
Log.d("HotUpdater", "Failed to restart process", e)
|
|
60
|
+
promise.reject("reloadProcess", e)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
52
65
|
override fun updateBundle(
|
|
53
66
|
params: ReadableMap,
|
|
54
67
|
promise: Promise,
|
|
@@ -52,6 +52,20 @@ class HotUpdaterModule internal constructor(
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
@ReactMethod
|
|
56
|
+
override fun reloadProcess(promise: Promise) {
|
|
57
|
+
moduleScope.launch {
|
|
58
|
+
try {
|
|
59
|
+
val impl = getInstance()
|
|
60
|
+
impl.reloadProcess(mReactApplicationContext)
|
|
61
|
+
promise.resolve(null)
|
|
62
|
+
} catch (e: Exception) {
|
|
63
|
+
Log.d("HotUpdater", "Failed to restart process", e)
|
|
64
|
+
promise.reject("reloadProcess", e)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
55
69
|
@ReactMethod
|
|
56
70
|
override fun updateBundle(
|
|
57
71
|
params: ReadableMap,
|
|
@@ -273,6 +273,11 @@ RCT_EXPORT_MODULE();
|
|
|
273
273
|
});
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
+
- (void)reloadProcess:(RCTPromiseResolveBlock)resolve
|
|
277
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
278
|
+
[self reload:resolve reject:reject];
|
|
279
|
+
}
|
|
280
|
+
|
|
276
281
|
- (void)updateBundle:(JS::NativeHotUpdater::UpdateBundleParams &)params
|
|
277
282
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
278
283
|
reject:(RCTPromiseRejectBlock)reject {
|
|
@@ -373,6 +378,11 @@ RCT_EXPORT_METHOD(reload:(RCTPromiseResolveBlock)resolve
|
|
|
373
378
|
});
|
|
374
379
|
}
|
|
375
380
|
|
|
381
|
+
RCT_EXPORT_METHOD(reloadProcess:(RCTPromiseResolveBlock)resolve
|
|
382
|
+
reject:(RCTPromiseRejectBlock)reject) {
|
|
383
|
+
[self reload:resolve reject:reject];
|
|
384
|
+
}
|
|
385
|
+
|
|
376
386
|
RCT_EXPORT_METHOD(updateBundle:(NSDictionary *)params
|
|
377
387
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
378
388
|
reject:(RCTPromiseRejectBlock)reject) {
|
package/lib/commonjs/index.js
CHANGED
|
@@ -128,6 +128,17 @@ function createHotUpdaterClient() {
|
|
|
128
128
|
* Reloads the app.
|
|
129
129
|
*/
|
|
130
130
|
reload: _native.reload,
|
|
131
|
+
/**
|
|
132
|
+
* Configures how `HotUpdater.reload()` behaves.
|
|
133
|
+
*
|
|
134
|
+
* This can be called unconditionally on both platforms.
|
|
135
|
+
* The default is `processRestart`.
|
|
136
|
+
*
|
|
137
|
+
* - `reload`: built-in React Native reload on both platforms
|
|
138
|
+
* - `processRestart`: Android process restart, iOS behaves like normal reload
|
|
139
|
+
* - `custom`: run a custom JS handler on both platforms
|
|
140
|
+
*/
|
|
141
|
+
setReloadBehavior: _native.setReloadBehavior,
|
|
131
142
|
/**
|
|
132
143
|
* Returns whether an update has finished downloading in this app session.
|
|
133
144
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_checkForUpdate","require","_DefaultResolver","_native","_store","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_wrap","_types","registerGlobalGetBaseURL","fn","getBaseURL","globalThis","HotUpdaterGetBaseURL","global","createHotUpdaterClient","globalConfig","resolver","ensureGlobalResolver","methodName","Error","wrap","options","normalizedOptions","baseURL","rest","createDefaultResolver","requestHeaders","requestTimeout","reload","isUpdateDownloaded","hotUpdaterStore","getSnapshot","getAppVersion","getBundleId","getMinBundleId","getChannel","getDefaultChannel","isChannelSwitched","addListener","checkForUpdate","config","mergedConfig","updateBundle","params","resetChannel","ok","setState","progress","getFingerprintHash","getCrashHistory","clearCrashHistory","HotUpdater"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAKA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;
|
|
1
|
+
{"version":3,"names":["_checkForUpdate","require","_DefaultResolver","_native","_store","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_wrap","_types","registerGlobalGetBaseURL","fn","getBaseURL","globalThis","HotUpdaterGetBaseURL","global","createHotUpdaterClient","globalConfig","resolver","ensureGlobalResolver","methodName","Error","wrap","options","normalizedOptions","baseURL","rest","createDefaultResolver","requestHeaders","requestTimeout","reload","setReloadBehavior","isUpdateDownloaded","hotUpdaterStore","getSnapshot","getAppVersion","getBundleId","getMinBundleId","getChannel","getDefaultChannel","isChannelSwitched","addListener","checkForUpdate","config","mergedConfig","updateBundle","params","resetChannel","ok","setState","progress","getFingerprintHash","getCrashHistory","clearCrashHistory","HotUpdater"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,kBAAkB,EAAEA,CAAA,KAAMC,sBAAe,CAACC,WAAW,CAAC,CAAC,CAACF,kBAAkB;IAE1E;AACJ;AACA;IACIG,aAAa,EAAbA,qBAAa;IAEb;AACJ;AACA;IACIC,WAAW,EAAXA,mBAAW;IAEX;AACJ;AACA;IACIC,cAAc,EAAdA,sBAAc;IAEd;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,UAAU,EAAVA,kBAAU;IAEV;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,iBAAiB,EAAjBA,yBAAiB;IAEjB;AACJ;AACA;AACA;AACA;IACIC,iBAAiB,EAAjBA,yBAAiB;IAEjB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,WAAW,EAAXA,mBAAW;IAEX;AACJ;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;IACIC,cAAc,EAAGC,MAA6B,IAAK;MACjD,MAAMzB,QAAQ,GAAGC,oBAAoB,CAAC,gBAAgB,CAAC;MAEvD,MAAMyB,YAA2C,GAAG;QAClD,GAAGD,MAAM;QACTzB,QAAQ;QACRU,cAAc,EAAE;UACd,GAAGX,YAAY,CAACW,cAAc;UAC9B,GAAGe,MAAM,CAACf;QACZ,CAAC;QACDC,cAAc,EAAEc,MAAM,CAACd,cAAc,IAAIZ,YAAY,CAACY;MACxD,CAAC;MAED,OAAO,IAAAa,8BAAc,EAACE,YAAY,CAAC;IACrC,CAAC;IAED;AACJ;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;IACIC,YAAY,EAAGC,MAAoB,IAAK;MACtC3B,oBAAoB,CAAC,cAAc,CAAC;MACpC,OAAO,IAAA0B,oBAAY,EAACC,MAAM,CAAC;IAC7B,CAAC;IAED;AACJ;AACA;AACA;AACA;IACIC,YAAY,EAAE,MAAAA,CAAA,KAAY;MACxB,MAAMC,EAAE,GAAG,MAAM,IAAAD,oBAAY,EAAC,CAAC;MAC/B,IAAIC,EAAE,EAAE;QACNf,sBAAe,CAACgB,QAAQ,CAAC;UACvBjB,kBAAkB,EAAE,KAAK;UACzBkB,QAAQ,EAAE;QACZ,CAAC,CAAC;MACJ;MACA,OAAOF,EAAE;IACX,CAAC;IAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIG,kBAAkB,EAAlBA,0BAAkB;IAElB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,eAAe,EAAfA,uBAAe;IAEf;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,iBAAiB,EAAjBA;EACF,CAAC;AACH;AAEO,MAAMC,UAAU,GAAAlD,OAAA,CAAAkD,UAAA,GAAGtC,sBAAsB,CAAC,CAAC","ignoreList":[]}
|
package/lib/commonjs/native.js
CHANGED
|
@@ -18,12 +18,36 @@ Object.defineProperty(exports, "isHotUpdaterError", {
|
|
|
18
18
|
}
|
|
19
19
|
});
|
|
20
20
|
exports.resetChannel = exports.reload = exports.notifyAppReady = void 0;
|
|
21
|
+
exports.setReloadBehavior = setReloadBehavior;
|
|
21
22
|
exports.updateBundle = updateBundle;
|
|
22
23
|
var _reactNative = require("react-native");
|
|
23
24
|
var _error = require("./error.js");
|
|
24
25
|
var _NativeHotUpdater = _interopRequireDefault(require("./specs/NativeHotUpdater.js"));
|
|
25
26
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
26
27
|
const NIL_UUID = "00000000-0000-0000-0000-000000000000";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Built-in reload behaviors used by `HotUpdater.reload()`.
|
|
31
|
+
*
|
|
32
|
+
* - `reload`: In-process React Native reload.
|
|
33
|
+
* - `processRestart`: Android-only cold restart. On iOS the same call behaves like `reload`.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Custom reload hook used when `setReloadBehavior("custom", handler)` is configured.
|
|
38
|
+
*
|
|
39
|
+
* This is useful for brownfield apps that need to delegate reload behavior to
|
|
40
|
+
* a host-native container instead of using HotUpdater's built-in reload flow.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Full reload policy accepted by `setReloadBehavior()`.
|
|
45
|
+
*
|
|
46
|
+
* - `reload`: Built-in React reload on both platforms
|
|
47
|
+
* - `processRestart`: Android process restart, iOS behaves like `reload`
|
|
48
|
+
* - `custom`: Run a user-provided JS handler on both platforms
|
|
49
|
+
*/
|
|
50
|
+
|
|
27
51
|
const HotUpdaterConstants = exports.HotUpdaterConstants = {
|
|
28
52
|
HOT_UPDATER_BUNDLE_ID: __HOT_UPDATER_BUNDLE_ID || NIL_UUID
|
|
29
53
|
};
|
|
@@ -69,6 +93,12 @@ class HotUpdaterSessionState {
|
|
|
69
93
|
}
|
|
70
94
|
}
|
|
71
95
|
const sessionState = new HotUpdaterSessionState();
|
|
96
|
+
let reloadBehavior = "processRestart";
|
|
97
|
+
let customReloadHandler = null;
|
|
98
|
+
const getReloadProcess = () => {
|
|
99
|
+
const nativeModule = _NativeHotUpdater.default;
|
|
100
|
+
return typeof nativeModule.reloadProcess === "function" ? nativeModule.reloadProcess.bind(nativeModule) : null;
|
|
101
|
+
};
|
|
72
102
|
const eventEmitter = new _reactNative.NativeEventEmitter(_NativeHotUpdater.default);
|
|
73
103
|
const addListener = (eventName, listener) => {
|
|
74
104
|
const subscription = eventEmitter.addListener(eventName, listener);
|
|
@@ -137,20 +167,75 @@ const getAppVersion = () => {
|
|
|
137
167
|
};
|
|
138
168
|
|
|
139
169
|
/**
|
|
140
|
-
* Reloads the app.
|
|
170
|
+
* Reloads the app using the currently configured reload behavior.
|
|
171
|
+
*
|
|
172
|
+
* Default behavior is `processRestart`.
|
|
173
|
+
* On iOS, `processRestart` behaves like the normal React reload path.
|
|
174
|
+
*
|
|
175
|
+
* When `setReloadBehavior("processRestart")` is used:
|
|
176
|
+
* - Android performs a cold process restart
|
|
177
|
+
* - iOS keeps the same behavior as the normal React reload path
|
|
178
|
+
* - older Android native binaries fall back to `reload()` if `reloadProcess()` is unavailable
|
|
179
|
+
*
|
|
180
|
+
* When `setReloadBehavior("custom", handler)` is used:
|
|
181
|
+
* - both Android and iOS execute the provided handler
|
|
141
182
|
*/
|
|
142
183
|
exports.getAppVersion = getAppVersion;
|
|
143
184
|
const reload = async () => {
|
|
185
|
+
if (reloadBehavior === "custom") {
|
|
186
|
+
if (!customReloadHandler) {
|
|
187
|
+
throw new Error("[HotUpdater] setReloadBehavior('custom') requires a reload handler.");
|
|
188
|
+
}
|
|
189
|
+
await customReloadHandler();
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (_reactNative.Platform.OS === "android" && reloadBehavior === "processRestart") {
|
|
193
|
+
const reloadProcess = getReloadProcess();
|
|
194
|
+
if (reloadProcess) {
|
|
195
|
+
await reloadProcess();
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
144
199
|
await _NativeHotUpdater.default.reload();
|
|
145
200
|
};
|
|
146
201
|
|
|
202
|
+
/**
|
|
203
|
+
* Configures how `HotUpdater.reload()` should behave.
|
|
204
|
+
*
|
|
205
|
+
* This API is available on both Android and iOS so app code can stay symmetric.
|
|
206
|
+
* By default, HotUpdater uses `processRestart`.
|
|
207
|
+
*
|
|
208
|
+
* Supported behaviors:
|
|
209
|
+
* - `reload`: Uses React Native's normal in-process reload flow
|
|
210
|
+
* - `processRestart`: Uses Android process restart when available; iOS keeps the same behavior as `reload`
|
|
211
|
+
* - `custom`: Executes a JS callback on both platforms
|
|
212
|
+
*
|
|
213
|
+
* `custom` is intended for brownfield apps that need host-native coordination.
|
|
214
|
+
*/
|
|
215
|
+
exports.reload = reload;
|
|
216
|
+
function setReloadBehavior(...args) {
|
|
217
|
+
const [behavior, handler] = args;
|
|
218
|
+
if (behavior === "custom") {
|
|
219
|
+
if (typeof handler !== "function") {
|
|
220
|
+
throw new Error("[HotUpdater] setReloadBehavior('custom') requires a reload handler.");
|
|
221
|
+
}
|
|
222
|
+
reloadBehavior = behavior;
|
|
223
|
+
customReloadHandler = handler;
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (handler) {
|
|
227
|
+
throw new Error(`[HotUpdater] setReloadBehavior('${behavior}') does not accept a custom reload handler.`);
|
|
228
|
+
}
|
|
229
|
+
reloadBehavior = behavior;
|
|
230
|
+
customReloadHandler = null;
|
|
231
|
+
}
|
|
232
|
+
|
|
147
233
|
/**
|
|
148
234
|
* Fetches the minimum bundle id, which represents the initial bundle of the app
|
|
149
235
|
* since it is created at build time.
|
|
150
236
|
*
|
|
151
237
|
* @returns {string} Resolves with the minimum bundle id or null if not available.
|
|
152
238
|
*/
|
|
153
|
-
exports.reload = reload;
|
|
154
239
|
const getMinBundleId = () => {
|
|
155
240
|
const constants = _NativeHotUpdater.default.getConstants();
|
|
156
241
|
return constants.MIN_BUNDLE_ID;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_error","_NativeHotUpdater","_interopRequireDefault","e","__esModule","default","NIL_UUID","HotUpdaterConstants","exports","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","HotUpdaterSessionState","inflightUpdates","Map","lastInstalledBundleId","constructor","constants","HotUpdaterNative","getConstants","defaultChannel","DEFAULT_CHANNEL","CHANNEL","currentChannel","getChannel","getDefaultChannel","isChannelSwitched","hasInstalledBundle","bundleId","getInflightUpdate","get","trackInflightUpdate","promise","set","clearInflightUpdate","delete","markBundleInstalled","channel","resetChannelState","clear","sessionState","eventEmitter","NativeEventEmitter","addListener","eventName","listener","subscription","remove","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","status","shouldSkipCurrentBundleIdCheck","localeCompare","getBundleId","Error","existing","targetFileUrl","targetFileHash","undefined","fileHash","targetChannel","ok","getAppVersion","APP_VERSION","reload","getMinBundleId","MIN_BUNDLE_ID","getFingerprintHash","FINGERPRINT_HASH","notifyAppReady","result","JSON","parse","getCrashHistory","clearCrashHistory","getBaseURL","resetChannel"],"sourceRoot":"../../src","sources":["native.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_error","_NativeHotUpdater","_interopRequireDefault","e","__esModule","default","NIL_UUID","HotUpdaterConstants","exports","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","HotUpdaterSessionState","inflightUpdates","Map","lastInstalledBundleId","constructor","constants","HotUpdaterNative","getConstants","defaultChannel","DEFAULT_CHANNEL","CHANNEL","currentChannel","getChannel","getDefaultChannel","isChannelSwitched","hasInstalledBundle","bundleId","getInflightUpdate","get","trackInflightUpdate","promise","set","clearInflightUpdate","delete","markBundleInstalled","channel","resetChannelState","clear","sessionState","reloadBehavior","customReloadHandler","getReloadProcess","nativeModule","reloadProcess","bind","eventEmitter","NativeEventEmitter","addListener","eventName","listener","subscription","remove","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","status","shouldSkipCurrentBundleIdCheck","localeCompare","getBundleId","Error","existing","targetFileUrl","targetFileHash","undefined","fileHash","targetChannel","ok","getAppVersion","APP_VERSION","reload","Platform","OS","setReloadBehavior","args","behavior","handler","getMinBundleId","MIN_BUNDLE_ID","getFingerprintHash","FINGERPRINT_HASH","notifyAppReady","result","JSON","parse","getCrashHistory","clearCrashHistory","getBaseURL","resetChannel"],"sourceRoot":"../../src","sources":["native.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["specs/NativeHotUpdater.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["specs/NativeHotUpdater.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAwHpCC,gCAAmB,CAACC,YAAY,CAAO,YAAY,CAAC","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { checkForUpdate } from "./checkForUpdate.js";
|
|
4
4
|
import { createDefaultResolver } from "./DefaultResolver.js";
|
|
5
|
-
import { addListener, clearCrashHistory, getAppVersion, getBaseURL, getBundleId, getChannel, getCrashHistory, getDefaultChannel, getFingerprintHash, getMinBundleId, isChannelSwitched, reload, resetChannel, updateBundle } from "./native.js";
|
|
5
|
+
import { addListener, clearCrashHistory, getAppVersion, getBaseURL, getBundleId, getChannel, getCrashHistory, getDefaultChannel, getFingerprintHash, getMinBundleId, isChannelSwitched, reload, resetChannel, setReloadBehavior, updateBundle } from "./native.js";
|
|
6
6
|
import { hotUpdaterStore } from "./store.js";
|
|
7
7
|
import { wrap } from "./wrap.js";
|
|
8
8
|
export * from "./store.js";
|
|
@@ -97,6 +97,17 @@ function createHotUpdaterClient() {
|
|
|
97
97
|
* Reloads the app.
|
|
98
98
|
*/
|
|
99
99
|
reload,
|
|
100
|
+
/**
|
|
101
|
+
* Configures how `HotUpdater.reload()` behaves.
|
|
102
|
+
*
|
|
103
|
+
* This can be called unconditionally on both platforms.
|
|
104
|
+
* The default is `processRestart`.
|
|
105
|
+
*
|
|
106
|
+
* - `reload`: built-in React Native reload on both platforms
|
|
107
|
+
* - `processRestart`: Android process restart, iOS behaves like normal reload
|
|
108
|
+
* - `custom`: run a custom JS handler on both platforms
|
|
109
|
+
*/
|
|
110
|
+
setReloadBehavior,
|
|
100
111
|
/**
|
|
101
112
|
* Returns whether an update has finished downloading in this app session.
|
|
102
113
|
*
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["checkForUpdate","createDefaultResolver","addListener","clearCrashHistory","getAppVersion","getBaseURL","getBundleId","getChannel","getCrashHistory","getDefaultChannel","getFingerprintHash","getMinBundleId","isChannelSwitched","reload","resetChannel","updateBundle","hotUpdaterStore","wrap","extractSignatureFailure","isSignatureVerificationError","registerGlobalGetBaseURL","fn","globalThis","HotUpdaterGetBaseURL","global","createHotUpdaterClient","globalConfig","resolver","ensureGlobalResolver","methodName","Error","options","normalizedOptions","baseURL","rest","requestHeaders","requestTimeout","isUpdateDownloaded","getSnapshot","config","mergedConfig","params","ok","setState","progress","HotUpdater"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAEEA,cAAc,QAET,qBAAkB;AACzB,SAASC,qBAAqB,QAAQ,sBAAmB;AACzD,SACEC,WAAW,EACXC,iBAAiB,EACjBC,aAAa,EACbC,UAAU,EACVC,WAAW,EACXC,UAAU,EACVC,eAAe,EACfC,iBAAiB,EACjBC,kBAAkB,EAClBC,cAAc,EACdC,iBAAiB,EACjBC,MAAM,EACNC,YAAY,
|
|
1
|
+
{"version":3,"names":["checkForUpdate","createDefaultResolver","addListener","clearCrashHistory","getAppVersion","getBaseURL","getBundleId","getChannel","getCrashHistory","getDefaultChannel","getFingerprintHash","getMinBundleId","isChannelSwitched","reload","resetChannel","setReloadBehavior","updateBundle","hotUpdaterStore","wrap","extractSignatureFailure","isSignatureVerificationError","registerGlobalGetBaseURL","fn","globalThis","HotUpdaterGetBaseURL","global","createHotUpdaterClient","globalConfig","resolver","ensureGlobalResolver","methodName","Error","options","normalizedOptions","baseURL","rest","requestHeaders","requestTimeout","isUpdateDownloaded","getSnapshot","config","mergedConfig","params","ok","setState","progress","HotUpdater"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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A;IACIK,cAAc;IAEd;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIJ,UAAU;IAEV;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIE,iBAAiB;IAEjB;AACJ;AACA;AACA;AACA;IACIG,iBAAiB;IAEjB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIV,WAAW;IAEX;AACJ;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;IACIF,cAAc,EAAGwC,MAA6B,IAAK;MACjD,MAAMZ,QAAQ,GAAGC,oBAAoB,CAAC,gBAAgB,CAAC;MAEvD,MAAMY,YAA2C,GAAG;QAClD,GAAGD,MAAM;QACTZ,QAAQ;QACRQ,cAAc,EAAE;UACd,GAAGT,YAAY,CAACS,cAAc;UAC9B,GAAGI,MAAM,CAACJ;QACZ,CAAC;QACDC,cAAc,EAAEG,MAAM,CAACH,cAAc,IAAIV,YAAY,CAACU;MACxD,CAAC;MAED,OAAOrC,cAAc,CAACyC,YAAY,CAAC;IACrC,CAAC;IAED;AACJ;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;IACIzB,YAAY,EAAG0B,MAAoB,IAAK;MACtCb,oBAAoB,CAAC,cAAc,CAAC;MACpC,OAAOb,YAAY,CAAC0B,MAAM,CAAC;IAC7B,CAAC;IAED;AACJ;AACA;AACA;AACA;IACI5B,YAAY,EAAE,MAAAA,CAAA,KAAY;MACxB,MAAM6B,EAAE,GAAG,MAAM7B,YAAY,CAAC,CAAC;MAC/B,IAAI6B,EAAE,EAAE;QACN1B,eAAe,CAAC2B,QAAQ,CAAC;UACvBN,kBAAkB,EAAE,KAAK;UACzBO,QAAQ,EAAE;QACZ,CAAC,CAAC;MACJ;MACA,OAAOF,EAAE;IACX,CAAC;IAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIjC,kBAAkB;IAElB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIF,eAAe;IAEf;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIL;EACF,CAAC;AACH;AAEA,OAAO,MAAM2C,UAAU,GAAGpB,sBAAsB,CAAC,CAAC","ignoreList":[]}
|
package/lib/module/native.js
CHANGED
|
@@ -1,10 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { NativeEventEmitter } from "react-native";
|
|
3
|
+
import { NativeEventEmitter, Platform } from "react-native";
|
|
4
4
|
import { HotUpdaterErrorCode, isHotUpdaterError } from "./error.js";
|
|
5
5
|
import HotUpdaterNative from "./specs/NativeHotUpdater.js";
|
|
6
6
|
export { HotUpdaterErrorCode, isHotUpdaterError };
|
|
7
7
|
const NIL_UUID = "00000000-0000-0000-0000-000000000000";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Built-in reload behaviors used by `HotUpdater.reload()`.
|
|
11
|
+
*
|
|
12
|
+
* - `reload`: In-process React Native reload.
|
|
13
|
+
* - `processRestart`: Android-only cold restart. On iOS the same call behaves like `reload`.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Custom reload hook used when `setReloadBehavior("custom", handler)` is configured.
|
|
18
|
+
*
|
|
19
|
+
* This is useful for brownfield apps that need to delegate reload behavior to
|
|
20
|
+
* a host-native container instead of using HotUpdater's built-in reload flow.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Full reload policy accepted by `setReloadBehavior()`.
|
|
25
|
+
*
|
|
26
|
+
* - `reload`: Built-in React reload on both platforms
|
|
27
|
+
* - `processRestart`: Android process restart, iOS behaves like `reload`
|
|
28
|
+
* - `custom`: Run a user-provided JS handler on both platforms
|
|
29
|
+
*/
|
|
30
|
+
|
|
8
31
|
export const HotUpdaterConstants = {
|
|
9
32
|
HOT_UPDATER_BUNDLE_ID: __HOT_UPDATER_BUNDLE_ID || NIL_UUID
|
|
10
33
|
};
|
|
@@ -50,6 +73,12 @@ class HotUpdaterSessionState {
|
|
|
50
73
|
}
|
|
51
74
|
}
|
|
52
75
|
const sessionState = new HotUpdaterSessionState();
|
|
76
|
+
let reloadBehavior = "processRestart";
|
|
77
|
+
let customReloadHandler = null;
|
|
78
|
+
const getReloadProcess = () => {
|
|
79
|
+
const nativeModule = HotUpdaterNative;
|
|
80
|
+
return typeof nativeModule.reloadProcess === "function" ? nativeModule.reloadProcess.bind(nativeModule) : null;
|
|
81
|
+
};
|
|
53
82
|
const eventEmitter = new NativeEventEmitter(HotUpdaterNative);
|
|
54
83
|
export const addListener = (eventName, listener) => {
|
|
55
84
|
const subscription = eventEmitter.addListener(eventName, listener);
|
|
@@ -118,12 +147,67 @@ export const getAppVersion = () => {
|
|
|
118
147
|
};
|
|
119
148
|
|
|
120
149
|
/**
|
|
121
|
-
* Reloads the app.
|
|
150
|
+
* Reloads the app using the currently configured reload behavior.
|
|
151
|
+
*
|
|
152
|
+
* Default behavior is `processRestart`.
|
|
153
|
+
* On iOS, `processRestart` behaves like the normal React reload path.
|
|
154
|
+
*
|
|
155
|
+
* When `setReloadBehavior("processRestart")` is used:
|
|
156
|
+
* - Android performs a cold process restart
|
|
157
|
+
* - iOS keeps the same behavior as the normal React reload path
|
|
158
|
+
* - older Android native binaries fall back to `reload()` if `reloadProcess()` is unavailable
|
|
159
|
+
*
|
|
160
|
+
* When `setReloadBehavior("custom", handler)` is used:
|
|
161
|
+
* - both Android and iOS execute the provided handler
|
|
122
162
|
*/
|
|
123
163
|
export const reload = async () => {
|
|
164
|
+
if (reloadBehavior === "custom") {
|
|
165
|
+
if (!customReloadHandler) {
|
|
166
|
+
throw new Error("[HotUpdater] setReloadBehavior('custom') requires a reload handler.");
|
|
167
|
+
}
|
|
168
|
+
await customReloadHandler();
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (Platform.OS === "android" && reloadBehavior === "processRestart") {
|
|
172
|
+
const reloadProcess = getReloadProcess();
|
|
173
|
+
if (reloadProcess) {
|
|
174
|
+
await reloadProcess();
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
124
178
|
await HotUpdaterNative.reload();
|
|
125
179
|
};
|
|
126
180
|
|
|
181
|
+
/**
|
|
182
|
+
* Configures how `HotUpdater.reload()` should behave.
|
|
183
|
+
*
|
|
184
|
+
* This API is available on both Android and iOS so app code can stay symmetric.
|
|
185
|
+
* By default, HotUpdater uses `processRestart`.
|
|
186
|
+
*
|
|
187
|
+
* Supported behaviors:
|
|
188
|
+
* - `reload`: Uses React Native's normal in-process reload flow
|
|
189
|
+
* - `processRestart`: Uses Android process restart when available; iOS keeps the same behavior as `reload`
|
|
190
|
+
* - `custom`: Executes a JS callback on both platforms
|
|
191
|
+
*
|
|
192
|
+
* `custom` is intended for brownfield apps that need host-native coordination.
|
|
193
|
+
*/
|
|
194
|
+
export function setReloadBehavior(...args) {
|
|
195
|
+
const [behavior, handler] = args;
|
|
196
|
+
if (behavior === "custom") {
|
|
197
|
+
if (typeof handler !== "function") {
|
|
198
|
+
throw new Error("[HotUpdater] setReloadBehavior('custom') requires a reload handler.");
|
|
199
|
+
}
|
|
200
|
+
reloadBehavior = behavior;
|
|
201
|
+
customReloadHandler = handler;
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (handler) {
|
|
205
|
+
throw new Error(`[HotUpdater] setReloadBehavior('${behavior}') does not accept a custom reload handler.`);
|
|
206
|
+
}
|
|
207
|
+
reloadBehavior = behavior;
|
|
208
|
+
customReloadHandler = null;
|
|
209
|
+
}
|
|
210
|
+
|
|
127
211
|
/**
|
|
128
212
|
* Fetches the minimum bundle id, which represents the initial bundle of the app
|
|
129
213
|
* since it is created at build time.
|
package/lib/module/native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeEventEmitter","HotUpdaterErrorCode","isHotUpdaterError","HotUpdaterNative","NIL_UUID","HotUpdaterConstants","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","HotUpdaterSessionState","inflightUpdates","Map","lastInstalledBundleId","constructor","constants","getConstants","defaultChannel","DEFAULT_CHANNEL","CHANNEL","currentChannel","getChannel","getDefaultChannel","isChannelSwitched","hasInstalledBundle","bundleId","getInflightUpdate","get","trackInflightUpdate","promise","set","clearInflightUpdate","delete","markBundleInstalled","channel","resetChannelState","clear","sessionState","eventEmitter","addListener","eventName","listener","subscription","remove","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","status","shouldSkipCurrentBundleIdCheck","localeCompare","getBundleId","Error","existing","targetFileUrl","targetFileHash","undefined","fileHash","targetChannel","ok","getAppVersion","APP_VERSION","reload","getMinBundleId","MIN_BUNDLE_ID","getFingerprintHash","FINGERPRINT_HASH","notifyAppReady","result","JSON","parse","getCrashHistory","clearCrashHistory","getBaseURL","resetChannel"],"sourceRoot":"../../src","sources":["native.ts"],"mappings":";;AACA,SAASA,kBAAkB,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","Platform","HotUpdaterErrorCode","isHotUpdaterError","HotUpdaterNative","NIL_UUID","HotUpdaterConstants","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","HotUpdaterSessionState","inflightUpdates","Map","lastInstalledBundleId","constructor","constants","getConstants","defaultChannel","DEFAULT_CHANNEL","CHANNEL","currentChannel","getChannel","getDefaultChannel","isChannelSwitched","hasInstalledBundle","bundleId","getInflightUpdate","get","trackInflightUpdate","promise","set","clearInflightUpdate","delete","markBundleInstalled","channel","resetChannelState","clear","sessionState","reloadBehavior","customReloadHandler","getReloadProcess","nativeModule","reloadProcess","bind","eventEmitter","addListener","eventName","listener","subscription","remove","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","status","shouldSkipCurrentBundleIdCheck","localeCompare","getBundleId","Error","existing","targetFileUrl","targetFileHash","undefined","fileHash","targetChannel","ok","getAppVersion","APP_VERSION","reload","OS","setReloadBehavior","args","behavior","handler","getMinBundleId","MIN_BUNDLE_ID","getFingerprintHash","FINGERPRINT_HASH","notifyAppReady","result","JSON","parse","getCrashHistory","clearCrashHistory","getBaseURL","resetChannel"],"sourceRoot":"../../src","sources":["native.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["specs/NativeHotUpdater.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["specs/NativeHotUpdater.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAwHlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,YAAY,CAAC","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type CheckForUpdateOptions } from "./checkForUpdate";
|
|
2
|
-
import { type UpdateParams } from "./native";
|
|
2
|
+
import { setReloadBehavior, type UpdateParams } from "./native";
|
|
3
3
|
import { type HotUpdaterOptions } from "./wrap";
|
|
4
|
-
export type { HotUpdaterEvent, NotifyAppReadyResult } from "./native";
|
|
4
|
+
export type { CustomReloadHandler, HotUpdaterEvent, NotifyAppReadyResult, ReloadBehavior, ReloadBehaviorSetting, } from "./native";
|
|
5
5
|
export * from "./store";
|
|
6
6
|
export { extractSignatureFailure, type HotUpdaterResolver, isSignatureVerificationError, type ResolverCheckUpdateParams, type ResolverNotifyAppReadyParams, type SignatureVerificationFailure, } from "./types";
|
|
7
7
|
export type { HotUpdaterOptions, RunUpdateProcessResponse } from "./wrap";
|
|
@@ -35,6 +35,17 @@ export declare const HotUpdater: {
|
|
|
35
35
|
* Reloads the app.
|
|
36
36
|
*/
|
|
37
37
|
reload: () => Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Configures how `HotUpdater.reload()` behaves.
|
|
40
|
+
*
|
|
41
|
+
* This can be called unconditionally on both platforms.
|
|
42
|
+
* The default is `processRestart`.
|
|
43
|
+
*
|
|
44
|
+
* - `reload`: built-in React Native reload on both platforms
|
|
45
|
+
* - `processRestart`: Android process restart, iOS behaves like normal reload
|
|
46
|
+
* - `custom`: run a custom JS handler on both platforms
|
|
47
|
+
*/
|
|
48
|
+
setReloadBehavior: typeof setReloadBehavior;
|
|
38
49
|
/**
|
|
39
50
|
* Returns whether an update has finished downloading in this app session.
|
|
40
51
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAcL,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,KAAK,iBAAiB,EAAkC,MAAM,QAAQ,CAAC;AAEhF,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAcL,iBAAiB,EACjB,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,KAAK,iBAAiB,EAAkC,MAAM,QAAQ,CAAC;AAEhF,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,cAAc,SAAS,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,4BAA4B,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,GAClC,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAwX1E,eAAO,MAAM,UAAU;IAxTnB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;oBACa,iBAAiB;IAuCjC;;OAEG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;;;;;;;;;;;OAYG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;OAIG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;6BACsB,qBAAqB;IAgB9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;2BACoB,YAAY;IAKnC;;;;OAIG;;IAYH;;;;;;;;;;OAUG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;;;;;;;;OAWG;;CAK2C,CAAC"}
|
|
@@ -2,6 +2,28 @@ import type { UpdateStatus } from "@hot-updater/core";
|
|
|
2
2
|
import { HotUpdaterErrorCode, isHotUpdaterError } from "./error";
|
|
3
3
|
import { type UpdateBundleParams } from "./specs/NativeHotUpdater";
|
|
4
4
|
export { HotUpdaterErrorCode, isHotUpdaterError };
|
|
5
|
+
/**
|
|
6
|
+
* Built-in reload behaviors used by `HotUpdater.reload()`.
|
|
7
|
+
*
|
|
8
|
+
* - `reload`: In-process React Native reload.
|
|
9
|
+
* - `processRestart`: Android-only cold restart. On iOS the same call behaves like `reload`.
|
|
10
|
+
*/
|
|
11
|
+
export type ReloadBehavior = "reload" | "processRestart";
|
|
12
|
+
/**
|
|
13
|
+
* Custom reload hook used when `setReloadBehavior("custom", handler)` is configured.
|
|
14
|
+
*
|
|
15
|
+
* This is useful for brownfield apps that need to delegate reload behavior to
|
|
16
|
+
* a host-native container instead of using HotUpdater's built-in reload flow.
|
|
17
|
+
*/
|
|
18
|
+
export type CustomReloadHandler = () => void | Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Full reload policy accepted by `setReloadBehavior()`.
|
|
21
|
+
*
|
|
22
|
+
* - `reload`: Built-in React reload on both platforms
|
|
23
|
+
* - `processRestart`: Android process restart, iOS behaves like `reload`
|
|
24
|
+
* - `custom`: Run a user-provided JS handler on both platforms
|
|
25
|
+
*/
|
|
26
|
+
export type ReloadBehaviorSetting = ReloadBehavior | "custom";
|
|
5
27
|
export declare const HotUpdaterConstants: {
|
|
6
28
|
HOT_UPDATER_BUNDLE_ID: string;
|
|
7
29
|
};
|
|
@@ -32,9 +54,34 @@ export declare function updateBundle(bundleId: string, fileUrl: string | null):
|
|
|
32
54
|
*/
|
|
33
55
|
export declare const getAppVersion: () => string | null;
|
|
34
56
|
/**
|
|
35
|
-
* Reloads the app.
|
|
57
|
+
* Reloads the app using the currently configured reload behavior.
|
|
58
|
+
*
|
|
59
|
+
* Default behavior is `processRestart`.
|
|
60
|
+
* On iOS, `processRestart` behaves like the normal React reload path.
|
|
61
|
+
*
|
|
62
|
+
* When `setReloadBehavior("processRestart")` is used:
|
|
63
|
+
* - Android performs a cold process restart
|
|
64
|
+
* - iOS keeps the same behavior as the normal React reload path
|
|
65
|
+
* - older Android native binaries fall back to `reload()` if `reloadProcess()` is unavailable
|
|
66
|
+
*
|
|
67
|
+
* When `setReloadBehavior("custom", handler)` is used:
|
|
68
|
+
* - both Android and iOS execute the provided handler
|
|
36
69
|
*/
|
|
37
70
|
export declare const reload: () => Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Configures how `HotUpdater.reload()` should behave.
|
|
73
|
+
*
|
|
74
|
+
* This API is available on both Android and iOS so app code can stay symmetric.
|
|
75
|
+
* By default, HotUpdater uses `processRestart`.
|
|
76
|
+
*
|
|
77
|
+
* Supported behaviors:
|
|
78
|
+
* - `reload`: Uses React Native's normal in-process reload flow
|
|
79
|
+
* - `processRestart`: Uses Android process restart when available; iOS keeps the same behavior as `reload`
|
|
80
|
+
* - `custom`: Executes a JS callback on both platforms
|
|
81
|
+
*
|
|
82
|
+
* `custom` is intended for brownfield apps that need host-native coordination.
|
|
83
|
+
*/
|
|
84
|
+
export declare function setReloadBehavior(...args: [behavior: ReloadBehavior] | [behavior: "custom", handler: CustomReloadHandler]): void;
|
|
38
85
|
/**
|
|
39
86
|
* Fetches the minimum bundle id, which represents the initial bundle of the app
|
|
40
87
|
* 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,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAyB,EACvB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,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,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAyB,EACvB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;AAIlD;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,QAAQ,CAAC;AAI9D,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAsEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAIF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,eAAe,EACzD,WAAW,CAAC,EACZ,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,eAO9C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG;IAC9C,MAAM,EAAE,YAAY,CAAC;IACrB,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF;;;;;;GAMG;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;AAuEpB;;GAEG;AACH,eAAO,MAAM,aAAa,QAAO,MAAM,GAAG,IAGzC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM,qBAqBlB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,IAAI,EACH,CAAC,QAAQ,EAAE,cAAc,CAAC,GAC1B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,GACrD,IAAI,CAuBN;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAAO,MAGjC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAO,MAI9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAO,MAE7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAO,MAEpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAO,OAEpC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,QAAO,MAAM,GAAG,IAG9C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,cAAc,QAAO,oBAYjC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAO,MAAM,EAWxC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAAO,OAEpC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,QAAO,MAAM,GAAG,IAMtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,OAAO,CAUpD,CAAC"}
|
|
@@ -16,6 +16,12 @@ export interface UpdateBundleParams {
|
|
|
16
16
|
}
|
|
17
17
|
export interface Spec extends TurboModule {
|
|
18
18
|
reload(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Android process restart path used by `setReloadBehavior("processRestart")`.
|
|
21
|
+
*
|
|
22
|
+
* iOS exposes the same method name for API parity, but it behaves the same as `reload()`.
|
|
23
|
+
*/
|
|
24
|
+
reloadProcess(): Promise<void>;
|
|
19
25
|
/**
|
|
20
26
|
* Downloads and applies a bundle update.
|
|
21
27
|
*
|
|
@@ -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,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;OAQG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3D;;;;;;;;;;OAUG;IACH,cAAc,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAC5C,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;QAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAEF;;;;;OAKG;IACH,eAAe,IAAI,MAAM,EAAE,CAAC;IAE5B;;;;;OAKG;IACH,iBAAiB,IAAI,OAAO,CAAC;IAE7B;;;;OAIG;IACH,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,MAAM,CAAC;IAGzB,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,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC;CACH;;AAED,wBAAoE"}
|
|
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,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;OAQG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB;;;;OAIG;IACH,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3D;;;;;;;;;;OAUG;IACH,cAAc,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAC5C,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;QAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAEF;;;;;OAKG;IACH,eAAe,IAAI,MAAM,EAAE,CAAC;IAE5B;;;;;OAKG;IACH,iBAAiB,IAAI,OAAO,CAAC;IAE7B;;;;OAIG;IACH,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,MAAM,CAAC;IAGzB,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,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC;CACH;;AAED,wBAAoE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type CheckForUpdateOptions } from "./checkForUpdate";
|
|
2
|
-
import { type UpdateParams } from "./native";
|
|
2
|
+
import { setReloadBehavior, type UpdateParams } from "./native";
|
|
3
3
|
import { type HotUpdaterOptions } from "./wrap";
|
|
4
|
-
export type { HotUpdaterEvent, NotifyAppReadyResult } from "./native";
|
|
4
|
+
export type { CustomReloadHandler, HotUpdaterEvent, NotifyAppReadyResult, ReloadBehavior, ReloadBehaviorSetting, } from "./native";
|
|
5
5
|
export * from "./store";
|
|
6
6
|
export { extractSignatureFailure, type HotUpdaterResolver, isSignatureVerificationError, type ResolverCheckUpdateParams, type ResolverNotifyAppReadyParams, type SignatureVerificationFailure, } from "./types";
|
|
7
7
|
export type { HotUpdaterOptions, RunUpdateProcessResponse } from "./wrap";
|
|
@@ -35,6 +35,17 @@ export declare const HotUpdater: {
|
|
|
35
35
|
* Reloads the app.
|
|
36
36
|
*/
|
|
37
37
|
reload: () => Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Configures how `HotUpdater.reload()` behaves.
|
|
40
|
+
*
|
|
41
|
+
* This can be called unconditionally on both platforms.
|
|
42
|
+
* The default is `processRestart`.
|
|
43
|
+
*
|
|
44
|
+
* - `reload`: built-in React Native reload on both platforms
|
|
45
|
+
* - `processRestart`: Android process restart, iOS behaves like normal reload
|
|
46
|
+
* - `custom`: run a custom JS handler on both platforms
|
|
47
|
+
*/
|
|
48
|
+
setReloadBehavior: typeof setReloadBehavior;
|
|
38
49
|
/**
|
|
39
50
|
* Returns whether an update has finished downloading in this app session.
|
|
40
51
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAcL,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,KAAK,iBAAiB,EAAkC,MAAM,QAAQ,CAAC;AAEhF,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAcL,iBAAiB,EACjB,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,KAAK,iBAAiB,EAAkC,MAAM,QAAQ,CAAC;AAEhF,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,cAAc,SAAS,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,4BAA4B,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,GAClC,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAwX1E,eAAO,MAAM,UAAU;IAxTnB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;oBACa,iBAAiB;IAuCjC;;OAEG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;;;;;;;;;;;OAYG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;OAIG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;6BACsB,qBAAqB;IAgB9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;2BACoB,YAAY;IAKnC;;;;OAIG;;IAYH;;;;;;;;;;OAUG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;;;;;;;;OAWG;;CAK2C,CAAC"}
|
|
@@ -2,6 +2,28 @@ import type { UpdateStatus } from "@hot-updater/core";
|
|
|
2
2
|
import { HotUpdaterErrorCode, isHotUpdaterError } from "./error";
|
|
3
3
|
import { type UpdateBundleParams } from "./specs/NativeHotUpdater";
|
|
4
4
|
export { HotUpdaterErrorCode, isHotUpdaterError };
|
|
5
|
+
/**
|
|
6
|
+
* Built-in reload behaviors used by `HotUpdater.reload()`.
|
|
7
|
+
*
|
|
8
|
+
* - `reload`: In-process React Native reload.
|
|
9
|
+
* - `processRestart`: Android-only cold restart. On iOS the same call behaves like `reload`.
|
|
10
|
+
*/
|
|
11
|
+
export type ReloadBehavior = "reload" | "processRestart";
|
|
12
|
+
/**
|
|
13
|
+
* Custom reload hook used when `setReloadBehavior("custom", handler)` is configured.
|
|
14
|
+
*
|
|
15
|
+
* This is useful for brownfield apps that need to delegate reload behavior to
|
|
16
|
+
* a host-native container instead of using HotUpdater's built-in reload flow.
|
|
17
|
+
*/
|
|
18
|
+
export type CustomReloadHandler = () => void | Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Full reload policy accepted by `setReloadBehavior()`.
|
|
21
|
+
*
|
|
22
|
+
* - `reload`: Built-in React reload on both platforms
|
|
23
|
+
* - `processRestart`: Android process restart, iOS behaves like `reload`
|
|
24
|
+
* - `custom`: Run a user-provided JS handler on both platforms
|
|
25
|
+
*/
|
|
26
|
+
export type ReloadBehaviorSetting = ReloadBehavior | "custom";
|
|
5
27
|
export declare const HotUpdaterConstants: {
|
|
6
28
|
HOT_UPDATER_BUNDLE_ID: string;
|
|
7
29
|
};
|
|
@@ -32,9 +54,34 @@ export declare function updateBundle(bundleId: string, fileUrl: string | null):
|
|
|
32
54
|
*/
|
|
33
55
|
export declare const getAppVersion: () => string | null;
|
|
34
56
|
/**
|
|
35
|
-
* Reloads the app.
|
|
57
|
+
* Reloads the app using the currently configured reload behavior.
|
|
58
|
+
*
|
|
59
|
+
* Default behavior is `processRestart`.
|
|
60
|
+
* On iOS, `processRestart` behaves like the normal React reload path.
|
|
61
|
+
*
|
|
62
|
+
* When `setReloadBehavior("processRestart")` is used:
|
|
63
|
+
* - Android performs a cold process restart
|
|
64
|
+
* - iOS keeps the same behavior as the normal React reload path
|
|
65
|
+
* - older Android native binaries fall back to `reload()` if `reloadProcess()` is unavailable
|
|
66
|
+
*
|
|
67
|
+
* When `setReloadBehavior("custom", handler)` is used:
|
|
68
|
+
* - both Android and iOS execute the provided handler
|
|
36
69
|
*/
|
|
37
70
|
export declare const reload: () => Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Configures how `HotUpdater.reload()` should behave.
|
|
73
|
+
*
|
|
74
|
+
* This API is available on both Android and iOS so app code can stay symmetric.
|
|
75
|
+
* By default, HotUpdater uses `processRestart`.
|
|
76
|
+
*
|
|
77
|
+
* Supported behaviors:
|
|
78
|
+
* - `reload`: Uses React Native's normal in-process reload flow
|
|
79
|
+
* - `processRestart`: Uses Android process restart when available; iOS keeps the same behavior as `reload`
|
|
80
|
+
* - `custom`: Executes a JS callback on both platforms
|
|
81
|
+
*
|
|
82
|
+
* `custom` is intended for brownfield apps that need host-native coordination.
|
|
83
|
+
*/
|
|
84
|
+
export declare function setReloadBehavior(...args: [behavior: ReloadBehavior] | [behavior: "custom", handler: CustomReloadHandler]): void;
|
|
38
85
|
/**
|
|
39
86
|
* Fetches the minimum bundle id, which represents the initial bundle of the app
|
|
40
87
|
* 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,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAyB,EACvB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,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,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAyB,EACvB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;AAIlD;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,QAAQ,CAAC;AAI9D,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAsEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAIF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,eAAe,EACzD,WAAW,CAAC,EACZ,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,eAO9C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG;IAC9C,MAAM,EAAE,YAAY,CAAC;IACrB,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF;;;;;;GAMG;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;AAuEpB;;GAEG;AACH,eAAO,MAAM,aAAa,QAAO,MAAM,GAAG,IAGzC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM,qBAqBlB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,IAAI,EACH,CAAC,QAAQ,EAAE,cAAc,CAAC,GAC1B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,GACrD,IAAI,CAuBN;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAAO,MAGjC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAO,MAI9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAO,MAE7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAO,MAEpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAO,OAEpC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,QAAO,MAAM,GAAG,IAG9C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,cAAc,QAAO,oBAYjC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAO,MAAM,EAWxC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAAO,OAEpC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,QAAO,MAAM,GAAG,IAMtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,OAAO,CAUpD,CAAC"}
|
|
@@ -16,6 +16,12 @@ export interface UpdateBundleParams {
|
|
|
16
16
|
}
|
|
17
17
|
export interface Spec extends TurboModule {
|
|
18
18
|
reload(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Android process restart path used by `setReloadBehavior("processRestart")`.
|
|
21
|
+
*
|
|
22
|
+
* iOS exposes the same method name for API parity, but it behaves the same as `reload()`.
|
|
23
|
+
*/
|
|
24
|
+
reloadProcess(): Promise<void>;
|
|
19
25
|
/**
|
|
20
26
|
* Downloads and applies a bundle update.
|
|
21
27
|
*
|
|
@@ -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,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;OAQG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3D;;;;;;;;;;OAUG;IACH,cAAc,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAC5C,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;QAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAEF;;;;;OAKG;IACH,eAAe,IAAI,MAAM,EAAE,CAAC;IAE5B;;;;;OAKG;IACH,iBAAiB,IAAI,OAAO,CAAC;IAE7B;;;;OAIG;IACH,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,MAAM,CAAC;IAGzB,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,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC;CACH;;AAED,wBAAoE"}
|
|
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,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;OAQG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB;;;;OAIG;IACH,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3D;;;;;;;;;;OAUG;IACH,cAAc,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAC5C,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;QAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAEF;;;;;OAKG;IACH,eAAe,IAAI,MAAM,EAAE,CAAC;IAE5B;;;;;OAKG;IACH,iBAAiB,IAAI,OAAO,CAAC;IAE7B;;;;OAIG;IACH,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,MAAM,CAAC;IAGzB,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,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC;CACH;;AAED,wBAAoE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/react-native",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.1",
|
|
4
4
|
"description": "React Native OTA solution for self-hosted",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -120,14 +120,14 @@
|
|
|
120
120
|
"react-native": "0.79.1",
|
|
121
121
|
"react-native-builder-bob": "^0.40.10",
|
|
122
122
|
"typescript": "^5.8.3",
|
|
123
|
-
"hot-updater": "0.
|
|
123
|
+
"hot-updater": "0.27.1"
|
|
124
124
|
},
|
|
125
125
|
"dependencies": {
|
|
126
126
|
"use-sync-external-store": "1.5.0",
|
|
127
|
-
"@hot-updater/cli-tools": "0.
|
|
128
|
-
"@hot-updater/core": "0.
|
|
129
|
-
"@hot-updater/plugin-core": "0.
|
|
130
|
-
"@hot-updater/js": "0.
|
|
127
|
+
"@hot-updater/cli-tools": "0.27.1",
|
|
128
|
+
"@hot-updater/core": "0.27.1",
|
|
129
|
+
"@hot-updater/plugin-core": "0.27.1",
|
|
130
|
+
"@hot-updater/js": "0.27.1"
|
|
131
131
|
},
|
|
132
132
|
"scripts": {
|
|
133
133
|
"build": "bob build && tsc -p plugin/tsconfig.build.json",
|
package/src/index.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
isChannelSwitched,
|
|
19
19
|
reload,
|
|
20
20
|
resetChannel,
|
|
21
|
+
setReloadBehavior,
|
|
21
22
|
type UpdateParams,
|
|
22
23
|
updateBundle,
|
|
23
24
|
} from "./native";
|
|
@@ -25,7 +26,13 @@ import { hotUpdaterStore } from "./store";
|
|
|
25
26
|
import type { HotUpdaterResolver } from "./types";
|
|
26
27
|
import { type HotUpdaterOptions, type InternalWrapOptions, wrap } from "./wrap";
|
|
27
28
|
|
|
28
|
-
export type {
|
|
29
|
+
export type {
|
|
30
|
+
CustomReloadHandler,
|
|
31
|
+
HotUpdaterEvent,
|
|
32
|
+
NotifyAppReadyResult,
|
|
33
|
+
ReloadBehavior,
|
|
34
|
+
ReloadBehaviorSetting,
|
|
35
|
+
} from "./native";
|
|
29
36
|
export * from "./store";
|
|
30
37
|
export {
|
|
31
38
|
extractSignatureFailure,
|
|
@@ -167,6 +174,18 @@ function createHotUpdaterClient() {
|
|
|
167
174
|
*/
|
|
168
175
|
reload,
|
|
169
176
|
|
|
177
|
+
/**
|
|
178
|
+
* Configures how `HotUpdater.reload()` behaves.
|
|
179
|
+
*
|
|
180
|
+
* This can be called unconditionally on both platforms.
|
|
181
|
+
* The default is `processRestart`.
|
|
182
|
+
*
|
|
183
|
+
* - `reload`: built-in React Native reload on both platforms
|
|
184
|
+
* - `processRestart`: Android process restart, iOS behaves like normal reload
|
|
185
|
+
* - `custom`: run a custom JS handler on both platforms
|
|
186
|
+
*/
|
|
187
|
+
setReloadBehavior,
|
|
188
|
+
|
|
170
189
|
/**
|
|
171
190
|
* Returns whether an update has finished downloading in this app session.
|
|
172
191
|
*
|
package/src/native.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { UpdateStatus } from "@hot-updater/core";
|
|
2
|
-
import { NativeEventEmitter } from "react-native";
|
|
2
|
+
import { NativeEventEmitter, Platform } from "react-native";
|
|
3
3
|
import { HotUpdaterErrorCode, isHotUpdaterError } from "./error";
|
|
4
4
|
import HotUpdaterNative, {
|
|
5
5
|
type UpdateBundleParams,
|
|
@@ -9,6 +9,31 @@ export { HotUpdaterErrorCode, isHotUpdaterError };
|
|
|
9
9
|
|
|
10
10
|
const NIL_UUID = "00000000-0000-0000-0000-000000000000";
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Built-in reload behaviors used by `HotUpdater.reload()`.
|
|
14
|
+
*
|
|
15
|
+
* - `reload`: In-process React Native reload.
|
|
16
|
+
* - `processRestart`: Android-only cold restart. On iOS the same call behaves like `reload`.
|
|
17
|
+
*/
|
|
18
|
+
export type ReloadBehavior = "reload" | "processRestart";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Custom reload hook used when `setReloadBehavior("custom", handler)` is configured.
|
|
22
|
+
*
|
|
23
|
+
* This is useful for brownfield apps that need to delegate reload behavior to
|
|
24
|
+
* a host-native container instead of using HotUpdater's built-in reload flow.
|
|
25
|
+
*/
|
|
26
|
+
export type CustomReloadHandler = () => void | Promise<void>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Full reload policy accepted by `setReloadBehavior()`.
|
|
30
|
+
*
|
|
31
|
+
* - `reload`: Built-in React reload on both platforms
|
|
32
|
+
* - `processRestart`: Android process restart, iOS behaves like `reload`
|
|
33
|
+
* - `custom`: Run a user-provided JS handler on both platforms
|
|
34
|
+
*/
|
|
35
|
+
export type ReloadBehaviorSetting = ReloadBehavior | "custom";
|
|
36
|
+
|
|
12
37
|
declare const __HOT_UPDATER_BUNDLE_ID: string | undefined;
|
|
13
38
|
|
|
14
39
|
export const HotUpdaterConstants = {
|
|
@@ -70,6 +95,18 @@ class HotUpdaterSessionState {
|
|
|
70
95
|
}
|
|
71
96
|
|
|
72
97
|
const sessionState = new HotUpdaterSessionState();
|
|
98
|
+
let reloadBehavior: ReloadBehaviorSetting = "processRestart";
|
|
99
|
+
let customReloadHandler: CustomReloadHandler | null = null;
|
|
100
|
+
|
|
101
|
+
const getReloadProcess = (): (() => Promise<void>) | null => {
|
|
102
|
+
const nativeModule = HotUpdaterNative as typeof HotUpdaterNative & {
|
|
103
|
+
reloadProcess?: () => Promise<void>;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
return typeof nativeModule.reloadProcess === "function"
|
|
107
|
+
? nativeModule.reloadProcess.bind(nativeModule)
|
|
108
|
+
: null;
|
|
109
|
+
};
|
|
73
110
|
|
|
74
111
|
export type HotUpdaterEvent = {
|
|
75
112
|
onProgress: {
|
|
@@ -189,12 +226,84 @@ export const getAppVersion = (): string | null => {
|
|
|
189
226
|
};
|
|
190
227
|
|
|
191
228
|
/**
|
|
192
|
-
* Reloads the app.
|
|
229
|
+
* Reloads the app using the currently configured reload behavior.
|
|
230
|
+
*
|
|
231
|
+
* Default behavior is `processRestart`.
|
|
232
|
+
* On iOS, `processRestart` behaves like the normal React reload path.
|
|
233
|
+
*
|
|
234
|
+
* When `setReloadBehavior("processRestart")` is used:
|
|
235
|
+
* - Android performs a cold process restart
|
|
236
|
+
* - iOS keeps the same behavior as the normal React reload path
|
|
237
|
+
* - older Android native binaries fall back to `reload()` if `reloadProcess()` is unavailable
|
|
238
|
+
*
|
|
239
|
+
* When `setReloadBehavior("custom", handler)` is used:
|
|
240
|
+
* - both Android and iOS execute the provided handler
|
|
193
241
|
*/
|
|
194
242
|
export const reload = async () => {
|
|
243
|
+
if (reloadBehavior === "custom") {
|
|
244
|
+
if (!customReloadHandler) {
|
|
245
|
+
throw new Error(
|
|
246
|
+
"[HotUpdater] setReloadBehavior('custom') requires a reload handler.",
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
await customReloadHandler();
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (Platform.OS === "android" && reloadBehavior === "processRestart") {
|
|
255
|
+
const reloadProcess = getReloadProcess();
|
|
256
|
+
if (reloadProcess) {
|
|
257
|
+
await reloadProcess();
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
195
262
|
await HotUpdaterNative.reload();
|
|
196
263
|
};
|
|
197
264
|
|
|
265
|
+
/**
|
|
266
|
+
* Configures how `HotUpdater.reload()` should behave.
|
|
267
|
+
*
|
|
268
|
+
* This API is available on both Android and iOS so app code can stay symmetric.
|
|
269
|
+
* By default, HotUpdater uses `processRestart`.
|
|
270
|
+
*
|
|
271
|
+
* Supported behaviors:
|
|
272
|
+
* - `reload`: Uses React Native's normal in-process reload flow
|
|
273
|
+
* - `processRestart`: Uses Android process restart when available; iOS keeps the same behavior as `reload`
|
|
274
|
+
* - `custom`: Executes a JS callback on both platforms
|
|
275
|
+
*
|
|
276
|
+
* `custom` is intended for brownfield apps that need host-native coordination.
|
|
277
|
+
*/
|
|
278
|
+
export function setReloadBehavior(
|
|
279
|
+
...args:
|
|
280
|
+
| [behavior: ReloadBehavior]
|
|
281
|
+
| [behavior: "custom", handler: CustomReloadHandler]
|
|
282
|
+
): void {
|
|
283
|
+
const [behavior, handler] = args;
|
|
284
|
+
|
|
285
|
+
if (behavior === "custom") {
|
|
286
|
+
if (typeof handler !== "function") {
|
|
287
|
+
throw new Error(
|
|
288
|
+
"[HotUpdater] setReloadBehavior('custom') requires a reload handler.",
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
reloadBehavior = behavior;
|
|
293
|
+
customReloadHandler = handler;
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (handler) {
|
|
298
|
+
throw new Error(
|
|
299
|
+
`[HotUpdater] setReloadBehavior('${behavior}') does not accept a custom reload handler.`,
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
reloadBehavior = behavior;
|
|
304
|
+
customReloadHandler = null;
|
|
305
|
+
}
|
|
306
|
+
|
|
198
307
|
/**
|
|
199
308
|
* Fetches the minimum bundle id, which represents the initial bundle of the app
|
|
200
309
|
* since it is created at build time.
|
|
@@ -20,6 +20,12 @@ export interface UpdateBundleParams {
|
|
|
20
20
|
export interface Spec extends TurboModule {
|
|
21
21
|
// Methods
|
|
22
22
|
reload(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Android process restart path used by `setReloadBehavior("processRestart")`.
|
|
25
|
+
*
|
|
26
|
+
* iOS exposes the same method name for API parity, but it behaves the same as `reload()`.
|
|
27
|
+
*/
|
|
28
|
+
reloadProcess(): Promise<void>;
|
|
23
29
|
/**
|
|
24
30
|
* Downloads and applies a bundle update.
|
|
25
31
|
*
|