@hot-updater/react-native 0.25.6 → 0.25.8
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/BundleFileStorageService.kt +1 -1
- package/android/src/main/java/com/hotupdater/HotUpdaterImpl.kt +6 -11
- package/android/src/newarch/HotUpdater.kt +106 -0
- package/android/src/newarch/HotUpdaterModule.kt +1 -2
- package/android/src/newarch/ReactHostHolder.kt +40 -0
- package/android/src/newarch/ReactIntegrationManager.kt +118 -51
- package/android/src/{main/java/com/hotupdater → oldarch}/HotUpdater.kt +15 -14
- package/android/src/oldarch/HotUpdaterModule.kt +1 -2
- package/android/src/oldarch/ReactIntegrationManager.kt +60 -27
- package/ios/HotUpdater/Internal/BundleFileStorageService.swift +9 -8
- package/ios/HotUpdater/Internal/HotUpdater.mm +18 -24
- package/ios/HotUpdater/Internal/HotUpdaterImpl.swift +3 -2
- package/ios/HotUpdater/Public/HotUpdater.h +13 -0
- package/lib/commonjs/index.js +0 -8
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/native.js +1 -1
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/store.js +5 -0
- package/lib/commonjs/store.js.map +1 -1
- package/lib/module/index.js +0 -8
- package/lib/module/index.js.map +1 -1
- package/lib/module/native.js +1 -1
- package/lib/module/native.js.map +1 -1
- package/lib/module/store.js +5 -0
- package/lib/module/store.js.map +1 -1
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/native.d.ts.map +1 -1
- package/lib/typescript/commonjs/store.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/native.d.ts.map +1 -1
- package/lib/typescript/module/store.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/index.ts +0 -6
- package/src/native.ts +2 -1
- package/src/store.ts +6 -0
|
@@ -158,7 +158,7 @@ class BundleFileStorageService(
|
|
|
158
158
|
// Read metadata without validation to get stored isolationKey
|
|
159
159
|
val jsonString = metadataFile.readText()
|
|
160
160
|
val json = org.json.JSONObject(jsonString)
|
|
161
|
-
val storedIsolationKey = json.
|
|
161
|
+
val storedIsolationKey = if (json.has("isolationKey")) json.getString("isolationKey") else null
|
|
162
162
|
|
|
163
163
|
if (storedIsolationKey != null && storedIsolationKey != isolationKey) {
|
|
164
164
|
// isolationKey changed - migration needed
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
package com.hotupdater
|
|
2
2
|
|
|
3
|
-
import android.app.Activity
|
|
4
3
|
import android.content.Context
|
|
5
4
|
import android.util.Log
|
|
6
5
|
import kotlinx.coroutines.Dispatchers
|
|
@@ -276,20 +275,16 @@ class HotUpdaterImpl {
|
|
|
276
275
|
|
|
277
276
|
/**
|
|
278
277
|
* Reloads the React Native application
|
|
279
|
-
* @param
|
|
278
|
+
* @param reactContext The original context (preferably ReactApplicationContext to get current activity)
|
|
280
279
|
*/
|
|
281
|
-
suspend fun reload(
|
|
282
|
-
val reactIntegrationManager = ReactIntegrationManager(
|
|
283
|
-
val
|
|
280
|
+
suspend fun reload(reactContext: Context) {
|
|
281
|
+
val reactIntegrationManager = ReactIntegrationManager(reactContext)
|
|
282
|
+
val bundleURL = getJSBundleFile()
|
|
284
283
|
|
|
285
284
|
try {
|
|
286
|
-
val reactApplication = reactIntegrationManager.getReactApplication(application)
|
|
287
|
-
val bundleURL = getJSBundleFile()
|
|
288
|
-
|
|
289
|
-
// Perform reload (suspends until safe to reload on new arch)
|
|
290
285
|
withContext(Dispatchers.Main) {
|
|
291
|
-
reactIntegrationManager.setJSBundle(
|
|
292
|
-
reactIntegrationManager.reload(
|
|
286
|
+
reactIntegrationManager.setJSBundle(bundleURL)
|
|
287
|
+
reactIntegrationManager.reload()
|
|
293
288
|
}
|
|
294
289
|
} catch (e: Exception) {
|
|
295
290
|
Log.e("HotUpdaterImpl", "Failed to reload application", e)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
package com.hotupdater
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import com.facebook.react.ReactHost
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Main React Native package for HotUpdater
|
|
8
|
+
* Provides static utility methods and a default singleton instance
|
|
9
|
+
*/
|
|
10
|
+
class HotUpdater {
|
|
11
|
+
companion object {
|
|
12
|
+
@Volatile
|
|
13
|
+
private var instance: HotUpdaterImpl? = null
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Gets or creates the singleton instance
|
|
17
|
+
* Thread-safe double-checked locking
|
|
18
|
+
* @param context Application context
|
|
19
|
+
* @return The singleton HotUpdaterImpl instance
|
|
20
|
+
*/
|
|
21
|
+
fun getInstance(context: Context): HotUpdaterImpl =
|
|
22
|
+
instance ?: synchronized(this) {
|
|
23
|
+
instance ?: HotUpdaterImpl(context.applicationContext).also {
|
|
24
|
+
instance = it
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Gets the JS bundle file path using the default singleton instance
|
|
30
|
+
* @param context Application context
|
|
31
|
+
* @return The path to the bundle file
|
|
32
|
+
*/
|
|
33
|
+
fun getJSBundleFile(context: Context): String = getInstance(context).getJSBundleFile()
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Updates the bundle using the default singleton instance
|
|
37
|
+
* @param context Application context
|
|
38
|
+
* @param bundleId ID of the bundle to update
|
|
39
|
+
* @param fileUrl URL of the bundle file to download (or null to reset)
|
|
40
|
+
* @param fileHash Combined hash string for verification (sig:<signature> or <hex_hash>)
|
|
41
|
+
* @param progressCallback Callback for download progress updates
|
|
42
|
+
* @throws HotUpdaterException if the update fails
|
|
43
|
+
*/
|
|
44
|
+
suspend fun updateBundle(
|
|
45
|
+
context: Context,
|
|
46
|
+
bundleId: String,
|
|
47
|
+
fileUrl: String?,
|
|
48
|
+
fileHash: String?,
|
|
49
|
+
progressCallback: (Double) -> Unit,
|
|
50
|
+
) {
|
|
51
|
+
getInstance(context).updateBundle(bundleId, fileUrl, fileHash, progressCallback)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Reloads the React Native application using the default singleton instance
|
|
56
|
+
* @param context Context (preferably ReactApplicationContext)
|
|
57
|
+
*/
|
|
58
|
+
suspend fun reload(context: Context) {
|
|
59
|
+
getInstance(context).reload(context)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Gets the app version - delegates to HotUpdaterImpl static method
|
|
64
|
+
* @param context Application context
|
|
65
|
+
* @return App version name or null if not available
|
|
66
|
+
*/
|
|
67
|
+
fun getAppVersion(context: Context): String? = HotUpdaterImpl.getAppVersion(context)
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Gets the minimum bundle ID - delegates to HotUpdaterImpl static method
|
|
71
|
+
* @return The minimum bundle ID string
|
|
72
|
+
*/
|
|
73
|
+
fun getMinBundleId(): String = HotUpdaterImpl.getMinBundleId()
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Gets the current fingerprint hash - delegates to HotUpdaterImpl static method
|
|
77
|
+
* @param context Application context
|
|
78
|
+
* @return The fingerprint hash or null if not set
|
|
79
|
+
*/
|
|
80
|
+
fun getFingerprintHash(context: Context): String? = HotUpdaterImpl.getFingerprintHash(context)
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Gets the current update channel - delegates to HotUpdaterImpl static method
|
|
84
|
+
* @param context Application context
|
|
85
|
+
* @return The channel name or null if not set
|
|
86
|
+
*/
|
|
87
|
+
fun getChannel(context: Context): String = HotUpdaterImpl.getChannel(context)
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Sets the ReactHost for brownfield apps (New Architecture).
|
|
91
|
+
* Sets the ReactHost for brownfield apps that don't have ReactApplication.
|
|
92
|
+
* When set, reload() will use this ReactHost instead of accessing Application.
|
|
93
|
+
* @param reactHost The ReactHost instance
|
|
94
|
+
*/
|
|
95
|
+
fun setReactHost(reactHost: ReactHost) {
|
|
96
|
+
ReactHostHolder.setReactHost(reactHost)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Clears the ReactHost instance (New Architecture).
|
|
101
|
+
*/
|
|
102
|
+
fun clearReactHost() {
|
|
103
|
+
ReactHostHolder.clear()
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -40,8 +40,7 @@ class HotUpdaterModule internal constructor(
|
|
|
40
40
|
moduleScope.launch {
|
|
41
41
|
try {
|
|
42
42
|
val impl = getInstance()
|
|
43
|
-
|
|
44
|
-
impl.reload(currentActivity)
|
|
43
|
+
impl.reload(mReactApplicationContext)
|
|
45
44
|
promise.resolve(null)
|
|
46
45
|
} catch (e: Exception) {
|
|
47
46
|
Log.d("HotUpdater", "Failed to reload", e)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
package com.hotupdater
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.ReactHost
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Singleton holder for ReactHost (for brownfield apps in new architecture)
|
|
7
|
+
* Use HotUpdater.setReactHost() to set the ReactHost instance
|
|
8
|
+
*/
|
|
9
|
+
object ReactHostHolder {
|
|
10
|
+
@Volatile
|
|
11
|
+
private var reactHost: ReactHost? = null
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Sets the ReactHost for brownfield apps
|
|
15
|
+
* @param host The ReactHost instance
|
|
16
|
+
*/
|
|
17
|
+
@JvmStatic
|
|
18
|
+
fun setReactHost(host: ReactHost) {
|
|
19
|
+
synchronized(this) {
|
|
20
|
+
reactHost = host
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Gets the ReactHost
|
|
26
|
+
* @return The ReactHost instance or null if not set
|
|
27
|
+
*/
|
|
28
|
+
@JvmStatic
|
|
29
|
+
fun getReactHost(): ReactHost? = reactHost
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Clears the ReactHost instance
|
|
33
|
+
*/
|
|
34
|
+
@JvmStatic
|
|
35
|
+
fun clear() {
|
|
36
|
+
synchronized(this) {
|
|
37
|
+
reactHost = null
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -6,6 +6,7 @@ import com.facebook.react.ReactApplication
|
|
|
6
6
|
import com.facebook.react.ReactHost
|
|
7
7
|
import com.facebook.react.ReactInstanceEventListener
|
|
8
8
|
import com.facebook.react.bridge.JSBundleLoader
|
|
9
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
9
10
|
import com.facebook.react.bridge.ReactContext
|
|
10
11
|
import com.facebook.react.common.LifecycleState
|
|
11
12
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
|
@@ -13,16 +14,18 @@ import java.lang.reflect.Field
|
|
|
13
14
|
import kotlin.coroutines.resume
|
|
14
15
|
|
|
15
16
|
class ReactIntegrationManager(
|
|
16
|
-
context: Context,
|
|
17
|
+
private val context: Context,
|
|
17
18
|
) : ReactIntegrationManagerBase(context) {
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Sets the JS bundle using ReactHost directly
|
|
21
|
+
* @param reactHost The ReactHost instance
|
|
22
|
+
* @param bundleURL The bundle URL to set
|
|
23
|
+
*/
|
|
24
|
+
private fun setJSBundleInternal(
|
|
25
|
+
reactHost: ReactHost,
|
|
20
26
|
bundleURL: String,
|
|
21
27
|
) {
|
|
22
28
|
try {
|
|
23
|
-
val reactHost = application.reactHost
|
|
24
|
-
check(reactHost != null)
|
|
25
|
-
|
|
26
29
|
// Try both Java and Kotlin field names for compatibility
|
|
27
30
|
val reactHostDelegateField =
|
|
28
31
|
try {
|
|
@@ -36,68 +39,132 @@ class ReactIntegrationManager(
|
|
|
36
39
|
}
|
|
37
40
|
|
|
38
41
|
reactHostDelegateField.isAccessible = true
|
|
39
|
-
val reactHostDelegate =
|
|
40
|
-
reactHostDelegateField.get(
|
|
41
|
-
reactHost,
|
|
42
|
-
)
|
|
42
|
+
val reactHostDelegate = reactHostDelegateField.get(reactHost)
|
|
43
43
|
val jsBundleLoaderField = reactHostDelegate::class.java.getDeclaredField("jsBundleLoader")
|
|
44
44
|
jsBundleLoaderField.isAccessible = true
|
|
45
45
|
jsBundleLoaderField.set(reactHostDelegate, getJSBundlerLoader(bundleURL))
|
|
46
46
|
} catch (e: Exception) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
47
|
+
Log.d("HotUpdater", "Failed to setJSBundle with ReactHost: ${e.message}")
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Reload the React Native application using ReactHost directly.
|
|
53
|
+
* @param reactHost The ReactHost instance
|
|
54
|
+
*/
|
|
55
|
+
private suspend fun reloadInternal(reactHost: ReactHost) {
|
|
56
|
+
try {
|
|
57
|
+
// Ensure initialized; if not, start and wait
|
|
58
|
+
waitForReactContextInitialized(reactHost)
|
|
59
|
+
|
|
60
|
+
val activity = reactHost.currentReactContext?.currentActivity
|
|
61
|
+
if (reactHost.lifecycleState != LifecycleState.RESUMED && activity != null) {
|
|
62
|
+
reactHost.onHostResume(activity)
|
|
63
|
+
}
|
|
64
|
+
reactHost.reload("Requested by HotUpdater")
|
|
65
|
+
} catch (e: Exception) {
|
|
66
|
+
Log.d("HotUpdater", "Failed to reload with ReactHost: ${e.message}")
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private fun getReactApplication(): ReactApplication? {
|
|
71
|
+
if (context is ReactApplicationContext) {
|
|
72
|
+
val activity = context.currentActivity
|
|
73
|
+
val application = activity?.application
|
|
74
|
+
if (application is ReactApplication) {
|
|
75
|
+
return application
|
|
63
76
|
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return null
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Sets the JS bundle.
|
|
84
|
+
* Priority: ReactHostHolder (if set) > application.reactHost > reactNativeHost
|
|
85
|
+
* @param bundleURL The bundle URL to set
|
|
86
|
+
*/
|
|
87
|
+
public fun setJSBundle(bundleURL: String) {
|
|
88
|
+
try {
|
|
89
|
+
// 1. First, check if ReactHost was set via HotUpdater.setReactHost()
|
|
90
|
+
val configuredHost = ReactHostHolder.getReactHost()
|
|
91
|
+
if (configuredHost != null) {
|
|
92
|
+
setJSBundleInternal(configuredHost, bundleURL)
|
|
93
|
+
return
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// 2. Try to get ReactApplication from context
|
|
97
|
+
val application = getReactApplication()
|
|
98
|
+
if (application == null) {
|
|
99
|
+
Log.d("HotUpdater", "No ReactHost set and application is not ReactApplication")
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// 3. Try application's ReactHost (new architecture)
|
|
104
|
+
val reactHost = application.reactHost
|
|
105
|
+
if (reactHost != null) {
|
|
106
|
+
setJSBundleInternal(reactHost, bundleURL)
|
|
107
|
+
return
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// 4. Fallback to old architecture (reactNativeHost)
|
|
111
|
+
@Suppress("DEPRECATION")
|
|
112
|
+
val instanceManager = application.reactNativeHost.reactInstanceManager
|
|
113
|
+
val bundleLoader: JSBundleLoader? = this.getJSBundlerLoader(bundleURL)
|
|
114
|
+
val bundleLoaderField: Field =
|
|
115
|
+
instanceManager::class.java.getDeclaredField("mBundleLoader")
|
|
116
|
+
bundleLoaderField.isAccessible = true
|
|
117
|
+
|
|
118
|
+
if (bundleLoader != null) {
|
|
119
|
+
bundleLoaderField.set(instanceManager, bundleLoader)
|
|
120
|
+
} else {
|
|
121
|
+
bundleLoaderField.set(instanceManager, null)
|
|
122
|
+
}
|
|
123
|
+
} catch (e: Exception) {
|
|
64
124
|
Log.d("HotUpdater", "Failed to setJSBundle: ${e.message}")
|
|
65
125
|
}
|
|
66
126
|
}
|
|
67
127
|
|
|
68
128
|
/**
|
|
69
|
-
* Reload the React Native application
|
|
70
|
-
*
|
|
129
|
+
* Reload the React Native application.
|
|
130
|
+
* Priority: ReactHostHolder (if set) > application.reactHost > reactNativeHost
|
|
71
131
|
*/
|
|
72
|
-
public suspend fun reload(
|
|
132
|
+
public suspend fun reload() {
|
|
73
133
|
try {
|
|
134
|
+
// 1. First, check if ReactHost was set via HotUpdater.setReactHost()
|
|
135
|
+
val configuredHost = ReactHostHolder.getReactHost()
|
|
136
|
+
if (configuredHost != null) {
|
|
137
|
+
reloadInternal(configuredHost)
|
|
138
|
+
return
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// 2. Try to get ReactApplication from context
|
|
142
|
+
val application = getReactApplication()
|
|
143
|
+
if (application == null) {
|
|
144
|
+
Log.d("HotUpdater", "No ReactHost set and application is not ReactApplication")
|
|
145
|
+
return
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// 3. Try application's ReactHost (new architecture)
|
|
74
149
|
val reactHost = application.reactHost
|
|
75
150
|
if (reactHost != null) {
|
|
76
|
-
|
|
77
|
-
|
|
151
|
+
reloadInternal(reactHost)
|
|
152
|
+
return
|
|
153
|
+
}
|
|
78
154
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
155
|
+
// 4. Fallback to old architecture (reactNativeHost)
|
|
156
|
+
@Suppress("DEPRECATION")
|
|
157
|
+
val reactNativeHost = application.reactNativeHost
|
|
158
|
+
try {
|
|
159
|
+
reactNativeHost.reactInstanceManager.recreateReactContextInBackground()
|
|
160
|
+
} catch (e: Exception) {
|
|
161
|
+
val currentActivity = reactNativeHost.reactInstanceManager.currentReactContext?.currentActivity
|
|
162
|
+
if (currentActivity == null) {
|
|
163
|
+
return
|
|
82
164
|
}
|
|
83
|
-
reactHost.reload("Requested by HotUpdater")
|
|
84
|
-
} else {
|
|
85
|
-
// Fallback to old architecture if ReactHost is not available
|
|
86
|
-
@Suppress("DEPRECATION")
|
|
87
|
-
val reactNativeHost = application.reactNativeHost
|
|
88
|
-
try {
|
|
89
|
-
reactNativeHost.reactInstanceManager.recreateReactContextInBackground()
|
|
90
|
-
} catch (e: Exception) {
|
|
91
|
-
val currentActivity = reactNativeHost.reactInstanceManager.currentReactContext?.currentActivity
|
|
92
|
-
if (currentActivity == null) {
|
|
93
|
-
return
|
|
94
|
-
}
|
|
95
165
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
} catch (e: Exception) {
|
|
100
|
-
Log.d("HotUpdater", "Failed to reload: ${e.message}")
|
|
166
|
+
currentActivity.runOnUiThread {
|
|
167
|
+
currentActivity.recreate()
|
|
101
168
|
}
|
|
102
169
|
}
|
|
103
170
|
} catch (e: Exception) {
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
package com.hotupdater
|
|
2
2
|
|
|
3
|
-
import android.app.Activity
|
|
4
3
|
import android.content.Context
|
|
5
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
4
|
|
|
7
5
|
/**
|
|
8
6
|
* Main React Native package for HotUpdater
|
|
@@ -54,11 +52,10 @@ class HotUpdater {
|
|
|
54
52
|
|
|
55
53
|
/**
|
|
56
54
|
* Reloads the React Native application using the default singleton instance
|
|
57
|
-
* @param context
|
|
55
|
+
* @param context Context (preferably ReactApplicationContext)
|
|
58
56
|
*/
|
|
59
57
|
suspend fun reload(context: Context) {
|
|
60
|
-
|
|
61
|
-
getInstance(context).reload(currentActivity)
|
|
58
|
+
getInstance(context).reload(context)
|
|
62
59
|
}
|
|
63
60
|
|
|
64
61
|
/**
|
|
@@ -89,15 +86,19 @@ class HotUpdater {
|
|
|
89
86
|
fun getChannel(context: Context): String = HotUpdaterImpl.getChannel(context)
|
|
90
87
|
|
|
91
88
|
/**
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* @
|
|
89
|
+
* Sets the ReactHost for brownfield apps (Old Architecture - No-op).
|
|
90
|
+
* In old architecture, this is a no-op since ReactHost is not available.
|
|
91
|
+
* @param reactHost The ReactHost instance (accepted as Any for compatibility)
|
|
95
92
|
*/
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
93
|
+
fun setReactHost(reactHost: Any) {
|
|
94
|
+
// No-op for old architecture
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Clears the ReactHost instance (Old Architecture - No-op).
|
|
99
|
+
*/
|
|
100
|
+
fun clearReactHost() {
|
|
101
|
+
// No-op for old architecture
|
|
102
|
+
}
|
|
102
103
|
}
|
|
103
104
|
}
|
|
@@ -43,8 +43,7 @@ class HotUpdaterModule internal constructor(
|
|
|
43
43
|
moduleScope.launch {
|
|
44
44
|
try {
|
|
45
45
|
val impl = getInstance()
|
|
46
|
-
|
|
47
|
-
impl.reload(currentActivity)
|
|
46
|
+
impl.reload(mReactApplicationContext)
|
|
48
47
|
promise.resolve(null)
|
|
49
48
|
} catch (e: Exception) {
|
|
50
49
|
Log.d("HotUpdater", "Failed to reload", e)
|
|
@@ -4,20 +4,43 @@ import android.content.Context
|
|
|
4
4
|
import android.util.Log
|
|
5
5
|
import com.facebook.react.ReactApplication
|
|
6
6
|
import com.facebook.react.ReactInstanceEventListener
|
|
7
|
+
import com.facebook.react.ReactInstanceManager
|
|
7
8
|
import com.facebook.react.bridge.JSBundleLoader
|
|
9
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
8
10
|
import com.facebook.react.bridge.ReactContext
|
|
9
11
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
|
10
12
|
import java.lang.reflect.Field
|
|
11
13
|
import kotlin.coroutines.resume
|
|
12
14
|
|
|
13
15
|
class ReactIntegrationManager(
|
|
14
|
-
context: Context,
|
|
16
|
+
private val context: Context,
|
|
15
17
|
) : ReactIntegrationManagerBase(context) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
private fun getReactApplication(): ReactApplication? {
|
|
19
|
+
// 1. Try to get from ReactApplicationContext's current activity
|
|
20
|
+
if (context is ReactApplicationContext) {
|
|
21
|
+
val activity = context.currentActivity
|
|
22
|
+
val application = activity?.application
|
|
23
|
+
if (application is ReactApplication) {
|
|
24
|
+
return application
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return null
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Sets the JS bundle.
|
|
33
|
+
* Gets ReactApplication from context and uses reactNativeHost.
|
|
34
|
+
* @param bundleURL The bundle URL to set
|
|
35
|
+
*/
|
|
36
|
+
public fun setJSBundle(bundleURL: String) {
|
|
20
37
|
try {
|
|
38
|
+
val application = getReactApplication()
|
|
39
|
+
if (application == null) {
|
|
40
|
+
Log.d("HotUpdater", "Application is not ReactApplication")
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
|
|
21
44
|
val instanceManager = application.reactNativeHost.reactInstanceManager
|
|
22
45
|
val bundleLoader: JSBundleLoader? = this.getJSBundlerLoader(bundleURL)
|
|
23
46
|
val bundleLoaderField: Field =
|
|
@@ -35,52 +58,62 @@ class ReactIntegrationManager(
|
|
|
35
58
|
}
|
|
36
59
|
|
|
37
60
|
/**
|
|
38
|
-
* Reload the React Native application
|
|
39
|
-
*
|
|
61
|
+
* Reload the React Native application.
|
|
62
|
+
* Gets ReactApplication from context and uses reactNativeHost.
|
|
40
63
|
*/
|
|
41
|
-
public suspend fun reload(
|
|
42
|
-
val reactNativeHost = application.reactNativeHost
|
|
64
|
+
public suspend fun reload() {
|
|
43
65
|
try {
|
|
66
|
+
val application = getReactApplication()
|
|
67
|
+
if (application == null) {
|
|
68
|
+
Log.d("HotUpdater", "Application is not ReactApplication")
|
|
69
|
+
return
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
val instanceManager = application.reactNativeHost.reactInstanceManager
|
|
73
|
+
|
|
44
74
|
// Ensure initialized; if not, start and wait
|
|
45
|
-
waitForReactContextInitialized(
|
|
75
|
+
waitForReactContextInitialized(instanceManager)
|
|
46
76
|
|
|
47
|
-
|
|
77
|
+
instanceManager.recreateReactContextInBackground()
|
|
48
78
|
} catch (e: Exception) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
79
|
+
try {
|
|
80
|
+
val application = getReactApplication() ?: return
|
|
81
|
+
val instanceManager = application.reactNativeHost.reactInstanceManager
|
|
82
|
+
val currentActivity = instanceManager.currentReactContext?.currentActivity
|
|
83
|
+
if (currentActivity == null) {
|
|
84
|
+
return
|
|
85
|
+
}
|
|
53
86
|
|
|
54
|
-
|
|
55
|
-
|
|
87
|
+
currentActivity.runOnUiThread {
|
|
88
|
+
currentActivity.recreate()
|
|
89
|
+
}
|
|
90
|
+
} catch (e2: Exception) {
|
|
91
|
+
Log.d("HotUpdater", "Failed to reload: ${e2.message}")
|
|
56
92
|
}
|
|
57
|
-
} catch (e: Exception) {
|
|
58
|
-
Log.d("HotUpdater", "Failed to reload: ${e.message}")
|
|
59
93
|
}
|
|
60
94
|
}
|
|
61
95
|
|
|
62
96
|
/**
|
|
63
|
-
* Waits until ReactContext is initialized.
|
|
97
|
+
* Waits until ReactContext is initialized using ReactInstanceManager.
|
|
98
|
+
* @param instanceManager The ReactInstanceManager instance
|
|
64
99
|
* @return true if ReactContext was already initialized; false if we waited for it.
|
|
65
100
|
*/
|
|
66
|
-
suspend fun waitForReactContextInitialized(
|
|
67
|
-
val reactInstanceManager = application.reactNativeHost.reactInstanceManager
|
|
68
|
-
|
|
101
|
+
suspend fun waitForReactContextInitialized(instanceManager: ReactInstanceManager): Boolean {
|
|
69
102
|
// If already initialized, return immediately and indicate so
|
|
70
|
-
if (
|
|
103
|
+
if (instanceManager.currentReactContext != null) return true
|
|
71
104
|
|
|
72
105
|
// Otherwise, wait for initialization; MainApplication handles starting the instance
|
|
73
106
|
suspendCancellableCoroutine { continuation ->
|
|
74
107
|
val listener =
|
|
75
108
|
object : ReactInstanceEventListener {
|
|
76
109
|
override fun onReactContextInitialized(context: ReactContext) {
|
|
77
|
-
|
|
110
|
+
instanceManager.removeReactInstanceEventListener(this)
|
|
78
111
|
if (continuation.isActive) continuation.resume(Unit)
|
|
79
112
|
}
|
|
80
113
|
}
|
|
81
114
|
|
|
82
|
-
|
|
83
|
-
continuation.invokeOnCancellation {
|
|
115
|
+
instanceManager.addReactInstanceEventListener(listener)
|
|
116
|
+
continuation.invokeOnCancellation { instanceManager.removeReactInstanceEventListener(listener) }
|
|
84
117
|
}
|
|
85
118
|
return false
|
|
86
119
|
}
|
|
@@ -102,8 +102,8 @@ public protocol BundleStorageService {
|
|
|
102
102
|
// Bundle URL operations
|
|
103
103
|
func setBundleURL(localPath: String?) -> Result<Void, Error>
|
|
104
104
|
func getCachedBundleURL() -> URL?
|
|
105
|
-
func getFallbackBundleURL() -> URL? // Synchronous as it's lightweight
|
|
106
|
-
func getBundleURL() -> URL?
|
|
105
|
+
func getFallbackBundleURL(bundle: Bundle) -> URL? // Synchronous as it's lightweight
|
|
106
|
+
func getBundleURL(bundle: Bundle) -> URL?
|
|
107
107
|
|
|
108
108
|
// Bundle update
|
|
109
109
|
func updateBundle(bundleId: String, fileUrl: URL?, fileHash: String?, progressHandler: @escaping (Double) -> Void, completion: @escaping (Result<Bool, Error>) -> Void)
|
|
@@ -588,20 +588,21 @@ class BundleFileStorageService: BundleStorageService {
|
|
|
588
588
|
|
|
589
589
|
/**
|
|
590
590
|
* Gets the URL to the fallback bundle included in the app.
|
|
591
|
+
* @param bundle instance to lookup the JavaScript bundle resource.
|
|
591
592
|
* @return URL to the fallback bundle or nil if not found
|
|
592
593
|
*/
|
|
593
|
-
func getFallbackBundleURL() -> URL? {
|
|
594
|
-
return
|
|
594
|
+
func getFallbackBundleURL(bundle: Bundle) -> URL? {
|
|
595
|
+
return bundle.url(forResource: "main", withExtension: "jsbundle")
|
|
595
596
|
}
|
|
596
597
|
|
|
597
|
-
public func getBundleURL() -> URL? {
|
|
598
|
+
public func getBundleURL(bundle: Bundle) -> URL? {
|
|
598
599
|
// Try to load metadata
|
|
599
600
|
let metadata = loadMetadataOrNull()
|
|
600
601
|
|
|
601
602
|
// If no metadata exists, use legacy behavior (backwards compatible)
|
|
602
603
|
guard let metadata = metadata else {
|
|
603
604
|
let cached = getCachedBundleURL()
|
|
604
|
-
return cached ?? getFallbackBundleURL()
|
|
605
|
+
return cached ?? getFallbackBundleURL(bundle: bundle)
|
|
605
606
|
}
|
|
606
607
|
|
|
607
608
|
// Check if we need to handle crash recovery
|
|
@@ -626,7 +627,7 @@ class BundleFileStorageService: BundleStorageService {
|
|
|
626
627
|
|
|
627
628
|
// Reload metadata after potential rollback
|
|
628
629
|
guard let currentMetadata = loadMetadataOrNull() else {
|
|
629
|
-
return getCachedBundleURL() ?? getFallbackBundleURL()
|
|
630
|
+
return getCachedBundleURL() ?? getFallbackBundleURL(bundle: bundle)
|
|
630
631
|
}
|
|
631
632
|
|
|
632
633
|
// If verification is pending, return staging bundle URL
|
|
@@ -652,7 +653,7 @@ class BundleFileStorageService: BundleStorageService {
|
|
|
652
653
|
}
|
|
653
654
|
|
|
654
655
|
// Fallback to app bundle
|
|
655
|
-
return getFallbackBundleURL()
|
|
656
|
+
return getFallbackBundleURL(bundle: bundle)
|
|
656
657
|
}
|
|
657
658
|
|
|
658
659
|
// MARK: - Bundle Update
|
|
@@ -29,7 +29,6 @@ NSNotificationName const HotUpdaterDownloadDidFinishNotification = @"HotUpdaterD
|
|
|
29
29
|
if (self) {
|
|
30
30
|
observedTasks = [NSMutableSet set];
|
|
31
31
|
|
|
32
|
-
// Start observing notifications needed for cleanup/events
|
|
33
32
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
34
33
|
selector:@selector(handleDownloadProgress:)
|
|
35
34
|
name:HotUpdaterDownloadProgressUpdateNotification
|
|
@@ -178,16 +177,25 @@ RCT_EXPORT_MODULE();
|
|
|
178
177
|
}
|
|
179
178
|
|
|
180
179
|
|
|
181
|
-
// Get bundleURL using singleton
|
|
180
|
+
// Get bundleURL with default bundle using singleton
|
|
182
181
|
+ (NSURL *)bundleURL {
|
|
183
|
-
return [[HotUpdater sharedImpl]
|
|
182
|
+
return [[HotUpdater sharedImpl] bundleURLWithBundle:[NSBundle mainBundle]];
|
|
184
183
|
}
|
|
185
184
|
|
|
186
|
-
// Get bundleURL using
|
|
185
|
+
// Get bundleURL with specific bundle using singleton
|
|
186
|
+
+ (NSURL *)bundleURLWithBundle:(NSBundle *)bundle {
|
|
187
|
+
return [[HotUpdater sharedImpl] bundleURLWithBundle:bundle];
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Get bundleURL with default bundle using instance impl
|
|
187
191
|
- (NSURL *)bundleURL {
|
|
188
|
-
return [[HotUpdater sharedImpl]
|
|
192
|
+
return [[HotUpdater sharedImpl] bundleURLWithBundle:[NSBundle mainBundle]];
|
|
189
193
|
}
|
|
190
194
|
|
|
195
|
+
// Get bundleURL with specific bundle using instance impl
|
|
196
|
+
- (NSURL *)bundleURLWithBundle:(NSBundle *)bundle {
|
|
197
|
+
return [[HotUpdater sharedImpl] bundleURLWithBundle:bundle];
|
|
198
|
+
}
|
|
191
199
|
|
|
192
200
|
#pragma mark - Progress Updates & Event Emitting (Keep in ObjC Wrapper)
|
|
193
201
|
|
|
@@ -200,11 +208,9 @@ RCT_EXPORT_MODULE();
|
|
|
200
208
|
if (progressNum) {
|
|
201
209
|
double progress = [progressNum doubleValue];
|
|
202
210
|
NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970] * 1000;
|
|
203
|
-
// Throttle events
|
|
204
211
|
if ((currentTime - self.lastUpdateTime) >= 100 || progress >= 1.0) {
|
|
205
212
|
self.lastUpdateTime = currentTime;
|
|
206
|
-
|
|
207
|
-
[self sendEventWithName:@"onProgress" body:@{@"progress": @(progress)}];
|
|
213
|
+
[self sendEvent:@"onProgress" body:@{@"progress": @(progress)}];
|
|
208
214
|
}
|
|
209
215
|
}
|
|
210
216
|
}
|
|
@@ -225,19 +231,15 @@ RCT_EXPORT_MODULE();
|
|
|
225
231
|
|
|
226
232
|
- (void)startObserving {
|
|
227
233
|
hasListeners = YES;
|
|
228
|
-
RCTLogInfo(@"[HotUpdater.mm] Start observing JS events.");
|
|
229
|
-
// Observers are added in init now
|
|
230
234
|
}
|
|
231
235
|
|
|
232
236
|
- (void)stopObserving {
|
|
233
237
|
hasListeners = NO;
|
|
234
|
-
RCTLogInfo(@"[HotUpdater.mm] Stop observing JS events.");
|
|
235
|
-
// Observers are removed in invalidate/dealloc
|
|
236
238
|
}
|
|
237
239
|
|
|
238
|
-
- (void)
|
|
240
|
+
- (void)sendEvent:(NSString *)name body:(id)body {
|
|
239
241
|
if (hasListeners) {
|
|
240
|
-
[
|
|
242
|
+
[self sendEventWithName:name body:body];
|
|
241
243
|
}
|
|
242
244
|
}
|
|
243
245
|
|
|
@@ -254,7 +256,7 @@ RCT_EXPORT_MODULE();
|
|
|
254
256
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
255
257
|
@try {
|
|
256
258
|
HotUpdaterImpl *impl = [HotUpdater sharedImpl];
|
|
257
|
-
NSURL *bundleURL = [impl
|
|
259
|
+
NSURL *bundleURL = [impl bundleURLWithBundle:[NSBundle mainBundle]];
|
|
258
260
|
RCTLogInfo(@"[HotUpdater.mm] Reloading with bundle URL: %@", bundleURL);
|
|
259
261
|
if (bundleURL && super.bridge) {
|
|
260
262
|
[super.bridge setValue:bundleURL forKey:@"bundleURL"];
|
|
@@ -320,14 +322,6 @@ RCT_EXPORT_MODULE();
|
|
|
320
322
|
return baseURL ?: @"";
|
|
321
323
|
}
|
|
322
324
|
|
|
323
|
-
- (void)addListener:(NSString *)eventName {
|
|
324
|
-
// No-op for New Architecture - handled by event emitter
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
- (void)removeListeners:(double)count {
|
|
328
|
-
// No-op for New Architecture - handled by event emitter
|
|
329
|
-
}
|
|
330
|
-
|
|
331
325
|
- (facebook::react::ModuleConstants<JS::NativeHotUpdater::Constants::Builder>)constantsToExport {
|
|
332
326
|
return [self getConstants];
|
|
333
327
|
}
|
|
@@ -352,7 +346,7 @@ RCT_EXPORT_METHOD(reload:(RCTPromiseResolveBlock)resolve
|
|
|
352
346
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
353
347
|
@try {
|
|
354
348
|
HotUpdaterImpl *impl = [HotUpdater sharedImpl];
|
|
355
|
-
NSURL *bundleURL = [impl
|
|
349
|
+
NSURL *bundleURL = [impl bundleURLWithBundle:[NSBundle mainBundle]];
|
|
356
350
|
RCTLogInfo(@"[HotUpdater.mm] Reloading with bundle URL: %@", bundleURL);
|
|
357
351
|
if (bundleURL && super.bridge) {
|
|
358
352
|
[super.bridge setValue:bundleURL forKey:@"bundleURL"];
|
|
@@ -106,10 +106,11 @@ import React
|
|
|
106
106
|
|
|
107
107
|
/**
|
|
108
108
|
* Gets the URL to the bundle file.
|
|
109
|
+
* @param bundle instance to lookup the JavaScript bundle resource. Defaults to Bundle.main.
|
|
109
110
|
* @return URL to the bundle or nil
|
|
110
111
|
*/
|
|
111
|
-
public func bundleURL() -> URL? {
|
|
112
|
-
return bundleStorage.getBundleURL()
|
|
112
|
+
public func bundleURL(bundle: Bundle = Bundle.main) -> URL? {
|
|
113
|
+
return bundleStorage.getBundleURL(bundle: bundle)
|
|
113
114
|
}
|
|
114
115
|
|
|
115
116
|
// MARK: - Bundle Update
|
|
@@ -16,12 +16,25 @@
|
|
|
16
16
|
*/
|
|
17
17
|
+ (NSURL *)bundleURL;
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Returns the currently active bundle URL with specific bundle from the default (static) instance.
|
|
21
|
+
* Callable from Objective-C (e.g., AppDelegate).
|
|
22
|
+
* This is implemented in HotUpdater.mm and calls the Swift static method.
|
|
23
|
+
*/
|
|
24
|
+
+ (NSURL *)bundleURLWithBundle:(NSBundle *)bundle NS_SWIFT_NAME(bundleURL(bundle:));
|
|
25
|
+
|
|
19
26
|
/**
|
|
20
27
|
* Returns the bundle URL for this specific instance.
|
|
21
28
|
* @return The bundle URL for this instance
|
|
22
29
|
*/
|
|
23
30
|
- (NSURL *)bundleURL;
|
|
24
31
|
|
|
32
|
+
/**
|
|
33
|
+
* Returns the bundle URL with specific bundle for this specific instance.
|
|
34
|
+
* @return The bundle URL for this instance
|
|
35
|
+
*/
|
|
36
|
+
- (NSURL *)bundleURLWithBundle:(NSBundle *)bundle NS_SWIFT_NAME(bundleURL(bundle:));
|
|
37
|
+
|
|
25
38
|
/**
|
|
26
39
|
* 다운로드 진행 상황 업데이트 시간을 추적하는 속성
|
|
27
40
|
*/
|
package/lib/commonjs/index.js
CHANGED
|
@@ -38,14 +38,6 @@ Object.keys(_store).forEach(function (key) {
|
|
|
38
38
|
});
|
|
39
39
|
var _wrap = require("./wrap.js");
|
|
40
40
|
var _types = require("./types.js");
|
|
41
|
-
(0, _native.addListener)("onProgress", ({
|
|
42
|
-
progress
|
|
43
|
-
}) => {
|
|
44
|
-
_store.hotUpdaterStore.setState({
|
|
45
|
-
progress
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
41
|
/**
|
|
50
42
|
* Register getBaseURL to global objects for use without imports.
|
|
51
43
|
* This is needed for Expo DOM components and Babel plugin generated code.
|
|
@@ -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","
|
|
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","addListener","checkForUpdate","config","mergedConfig","updateBundle","params","getFingerprintHash","getCrashHistory","clearCrashHistory","HotUpdater"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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AMC,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;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;IACIC,cAAc,EAAGC,MAA6B,IAAK;MACjD,MAAMtB,QAAQ,GAAGC,oBAAoB,CAAC,gBAAgB,CAAC;MAEvD,MAAMsB,YAA2C,GAAG;QAClD,GAAGD,MAAM;QACTtB,QAAQ;QACRU,cAAc,EAAE;UACd,GAAGX,YAAY,CAACW,cAAc;UAC9B,GAAGY,MAAM,CAACZ;QACZ,CAAC;QACDC,cAAc,EAAEW,MAAM,CAACX,cAAc,IAAIZ,YAAY,CAACY;MACxD,CAAC;MAED,OAAO,IAAAU,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;MACtCxB,oBAAoB,CAAC,cAAc,CAAC;MACpC,OAAO,IAAAuB,oBAAY,EAACC,MAAM,CAAC;IAC7B,CAAC;IAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,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,GAAA3C,OAAA,CAAA2C,UAAA,GAAG/B,sBAAsB,CAAC,CAAC","ignoreList":[]}
|
package/lib/commonjs/native.js
CHANGED
|
@@ -27,8 +27,8 @@ const NIL_UUID = "00000000-0000-0000-0000-000000000000";
|
|
|
27
27
|
const HotUpdaterConstants = exports.HotUpdaterConstants = {
|
|
28
28
|
HOT_UPDATER_BUNDLE_ID: __HOT_UPDATER_BUNDLE_ID || NIL_UUID
|
|
29
29
|
};
|
|
30
|
+
const eventEmitter = new _reactNative.NativeEventEmitter(_NativeHotUpdater.default);
|
|
30
31
|
const addListener = (eventName, listener) => {
|
|
31
|
-
const eventEmitter = new _reactNative.NativeEventEmitter(_NativeHotUpdater.default);
|
|
32
32
|
const subscription = eventEmitter.addListener(eventName, listener);
|
|
33
33
|
return () => {
|
|
34
34
|
subscription.remove();
|
|
@@ -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","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_error","_NativeHotUpdater","_interopRequireDefault","e","__esModule","default","NIL_UUID","HotUpdaterConstants","exports","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","eventEmitter","NativeEventEmitter","HotUpdaterNative","addListener","eventName","listener","subscription","remove","inflightUpdates","Map","lastInstalledBundleId","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","bundleId","status","currentBundleId","getBundleId","localeCompare","Error","existing","get","targetFileUrl","targetFileHash","undefined","fileHash","promise","ok","delete","set","getAppVersion","constants","getConstants","APP_VERSION","reload","getMinBundleId","MIN_BUNDLE_ID","getChannel","CHANNEL","getFingerprintHash","FINGERPRINT_HASH","notifyAppReady","result","JSON","parse","getCrashHistory","clearCrashHistory","getBaseURL"],"sourceRoot":"../../src","sources":["native.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/commonjs/store.js
CHANGED
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.useHotUpdaterStore = exports.hotUpdaterStore = void 0;
|
|
7
7
|
var _withSelector = _interopRequireDefault(require("use-sync-external-store/shim/with-selector"));
|
|
8
|
+
var _native = require("./native.js");
|
|
8
9
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
10
|
const {
|
|
10
11
|
useSyncExternalStoreWithSelector
|
|
@@ -45,6 +46,10 @@ const createHotUpdaterStore = () => {
|
|
|
45
46
|
listeners.add(listener);
|
|
46
47
|
return () => listeners.delete(listener);
|
|
47
48
|
};
|
|
49
|
+
|
|
50
|
+
// Subscribe to native onProgress events
|
|
51
|
+
// This listener is registered once when the store is created
|
|
52
|
+
(0, _native.addListener)("onProgress", setState);
|
|
48
53
|
return {
|
|
49
54
|
getSnapshot,
|
|
50
55
|
setState,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_withSelector","_interopRequireDefault","require","e","__esModule","default","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","createHotUpdaterStore","state","progress","isUpdateDownloaded","getSnapshot","listeners","Set","emitChange","listener","setState","newState","nextState","subscribe","add","delete","hotUpdaterStore","exports","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;
|
|
1
|
+
{"version":3,"names":["_withSelector","_interopRequireDefault","require","_native","e","__esModule","default","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","createHotUpdaterStore","state","progress","isUpdateDownloaded","getSnapshot","listeners","Set","emitChange","listener","setState","newState","nextState","subscribe","add","delete","addListener","hotUpdaterStore","exports","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAAuC,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAOvC,MAAM;EAAEG;AAAiC,CAAC,GAAGC,qBAA2B;AAExE,MAAMC,qBAAqB,GAAGA,CAAA,KAAM;EAClC,IAAIC,KAAsB,GAAG;IAC3BC,QAAQ,EAAE,CAAC;IACXC,kBAAkB,EAAE;EACtB,CAAC;EAED,MAAMC,WAAW,GAAGA,CAAA,KAAM;IACxB,OAAOH,KAAK;EACd,CAAC;EAED,MAAMI,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;EAEvC,MAAMC,UAAU,GAAGA,CAAA,KAAM;IACvB,KAAK,MAAMC,QAAQ,IAAIH,SAAS,EAAE;MAChCG,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC;EAED,MAAMC,QAAQ,GAAIC,QAAkC,IAAK;IACvD;IACA,MAAMC,SAA0B,GAAG;MACjC,GAAGV,KAAK;MACR,GAAGS;IACL,CAAC;;IAED;IACA;IACA;IACA,IAAI,UAAU,IAAIA,QAAQ,IAAI,OAAOA,QAAQ,CAACR,QAAQ,KAAK,QAAQ,EAAE;MACnES,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACR,QAAQ,IAAI,CAAC;IACvD,CAAC,MAAM,IACL,oBAAoB,IAAIQ,QAAQ,IAChC,OAAOA,QAAQ,CAACP,kBAAkB,KAAK,SAAS,EAChD;MACAQ,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACP,kBAAkB;IAC5D;IAEAF,KAAK,GAAGU,SAAS;IACjBJ,UAAU,CAAC,CAAC;EACd,CAAC;EAED,MAAMK,SAAS,GAAIJ,QAAoB,IAAK;IAC1CH,SAAS,CAACQ,GAAG,CAACL,QAAQ,CAAC;IACvB,OAAO,MAAMH,SAAS,CAACS,MAAM,CAACN,QAAQ,CAAC;EACzC,CAAC;;EAED;EACA;EACA,IAAAO,mBAAW,EAAC,YAAY,EAAEN,QAAQ,CAAC;EAEnC,OAAO;IAAEL,WAAW;IAAEK,QAAQ;IAAEG;EAAU,CAAC;AAC7C,CAAC;AAEM,MAAMI,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAGhB,qBAAqB,CAAC,CAAC;AAE/C,MAAMkB,kBAAkB,GAAGA,CAChCC,QAA0C,GAAIC,QAAQ,IAAKA,QAAa,KACrE;EACH,OAAOtB,gCAAgC,CACrCkB,eAAe,CAACJ,SAAS,EACzBI,eAAe,CAACZ,WAAW,EAC3BY,eAAe,CAACZ,WAAW,EAC3Be,QACF,CAAC;AACH,CAAC;AAACF,OAAA,CAAAC,kBAAA,GAAAA,kBAAA","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -7,14 +7,6 @@ import { hotUpdaterStore } from "./store.js";
|
|
|
7
7
|
import { wrap } from "./wrap.js";
|
|
8
8
|
export * from "./store.js";
|
|
9
9
|
export { extractSignatureFailure, isSignatureVerificationError } from "./types.js";
|
|
10
|
-
addListener("onProgress", ({
|
|
11
|
-
progress
|
|
12
|
-
}) => {
|
|
13
|
-
hotUpdaterStore.setState({
|
|
14
|
-
progress
|
|
15
|
-
});
|
|
16
|
-
});
|
|
17
|
-
|
|
18
10
|
/**
|
|
19
11
|
* Register getBaseURL to global objects for use without imports.
|
|
20
12
|
* This is needed for Expo DOM components and Babel plugin generated code.
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["checkForUpdate","createDefaultResolver","addListener","clearCrashHistory","getAppVersion","getBaseURL","getBundleId","getChannel","getCrashHistory","getFingerprintHash","getMinBundleId","reload","updateBundle","hotUpdaterStore","wrap","extractSignatureFailure","isSignatureVerificationError","
|
|
1
|
+
{"version":3,"names":["checkForUpdate","createDefaultResolver","addListener","clearCrashHistory","getAppVersion","getBaseURL","getBundleId","getChannel","getCrashHistory","getFingerprintHash","getMinBundleId","reload","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","HotUpdater"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIL,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;IACIF,cAAc,EAAGoC,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,OAAOjC,cAAc,CAACqC,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;AACA;AACA;AACA;AACA;AACA;AACA;IACI7B,kBAAkB;IAElB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACID,eAAe;IAEf;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIL;EACF,CAAC;AACH;AAEA,OAAO,MAAMoC,UAAU,GAAGjB,sBAAsB,CAAC,CAAC","ignoreList":[]}
|
package/lib/module/native.js
CHANGED
|
@@ -8,8 +8,8 @@ const NIL_UUID = "00000000-0000-0000-0000-000000000000";
|
|
|
8
8
|
export const HotUpdaterConstants = {
|
|
9
9
|
HOT_UPDATER_BUNDLE_ID: __HOT_UPDATER_BUNDLE_ID || NIL_UUID
|
|
10
10
|
};
|
|
11
|
+
const eventEmitter = new NativeEventEmitter(HotUpdaterNative);
|
|
11
12
|
export const addListener = (eventName, listener) => {
|
|
12
|
-
const eventEmitter = new NativeEventEmitter(HotUpdaterNative);
|
|
13
13
|
const subscription = eventEmitter.addListener(eventName, listener);
|
|
14
14
|
return () => {
|
|
15
15
|
subscription.remove();
|
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","addListener","eventName","listener","
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","HotUpdaterErrorCode","isHotUpdaterError","HotUpdaterNative","NIL_UUID","HotUpdaterConstants","HOT_UPDATER_BUNDLE_ID","__HOT_UPDATER_BUNDLE_ID","eventEmitter","addListener","eventName","listener","subscription","remove","inflightUpdates","Map","lastInstalledBundleId","updateBundle","paramsOrBundleId","fileUrl","updateBundleId","bundleId","status","currentBundleId","getBundleId","localeCompare","Error","existing","get","targetFileUrl","targetFileHash","undefined","fileHash","promise","ok","delete","set","getAppVersion","constants","getConstants","APP_VERSION","reload","getMinBundleId","MIN_BUNDLE_ID","getChannel","CHANNEL","getFingerprintHash","FINGERPRINT_HASH","notifyAppReady","result","JSON","parse","getCrashHistory","clearCrashHistory","getBaseURL"],"sourceRoot":"../../src","sources":["native.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/store.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import useSyncExternalStoreExports from "use-sync-external-store/shim/with-selector";
|
|
4
|
+
import { addListener } from "./native.js";
|
|
4
5
|
const {
|
|
5
6
|
useSyncExternalStoreWithSelector
|
|
6
7
|
} = useSyncExternalStoreExports;
|
|
@@ -40,6 +41,10 @@ const createHotUpdaterStore = () => {
|
|
|
40
41
|
listeners.add(listener);
|
|
41
42
|
return () => listeners.delete(listener);
|
|
42
43
|
};
|
|
44
|
+
|
|
45
|
+
// Subscribe to native onProgress events
|
|
46
|
+
// This listener is registered once when the store is created
|
|
47
|
+
addListener("onProgress", setState);
|
|
43
48
|
return {
|
|
44
49
|
getSnapshot,
|
|
45
50
|
setState,
|
package/lib/module/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useSyncExternalStoreExports","useSyncExternalStoreWithSelector","createHotUpdaterStore","state","progress","isUpdateDownloaded","getSnapshot","listeners","Set","emitChange","listener","setState","newState","nextState","subscribe","add","delete","hotUpdaterStore","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;AAAA,OAAOA,2BAA2B,MAAM,4CAA4C;
|
|
1
|
+
{"version":3,"names":["useSyncExternalStoreExports","addListener","useSyncExternalStoreWithSelector","createHotUpdaterStore","state","progress","isUpdateDownloaded","getSnapshot","listeners","Set","emitChange","listener","setState","newState","nextState","subscribe","add","delete","hotUpdaterStore","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;AAAA,OAAOA,2BAA2B,MAAM,4CAA4C;AACpF,SAASC,WAAW,QAAQ,aAAU;AAOtC,MAAM;EAAEC;AAAiC,CAAC,GAAGF,2BAA2B;AAExE,MAAMG,qBAAqB,GAAGA,CAAA,KAAM;EAClC,IAAIC,KAAsB,GAAG;IAC3BC,QAAQ,EAAE,CAAC;IACXC,kBAAkB,EAAE;EACtB,CAAC;EAED,MAAMC,WAAW,GAAGA,CAAA,KAAM;IACxB,OAAOH,KAAK;EACd,CAAC;EAED,MAAMI,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;EAEvC,MAAMC,UAAU,GAAGA,CAAA,KAAM;IACvB,KAAK,MAAMC,QAAQ,IAAIH,SAAS,EAAE;MAChCG,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC;EAED,MAAMC,QAAQ,GAAIC,QAAkC,IAAK;IACvD;IACA,MAAMC,SAA0B,GAAG;MACjC,GAAGV,KAAK;MACR,GAAGS;IACL,CAAC;;IAED;IACA;IACA;IACA,IAAI,UAAU,IAAIA,QAAQ,IAAI,OAAOA,QAAQ,CAACR,QAAQ,KAAK,QAAQ,EAAE;MACnES,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACR,QAAQ,IAAI,CAAC;IACvD,CAAC,MAAM,IACL,oBAAoB,IAAIQ,QAAQ,IAChC,OAAOA,QAAQ,CAACP,kBAAkB,KAAK,SAAS,EAChD;MACAQ,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACP,kBAAkB;IAC5D;IAEAF,KAAK,GAAGU,SAAS;IACjBJ,UAAU,CAAC,CAAC;EACd,CAAC;EAED,MAAMK,SAAS,GAAIJ,QAAoB,IAAK;IAC1CH,SAAS,CAACQ,GAAG,CAACL,QAAQ,CAAC;IACvB,OAAO,MAAMH,SAAS,CAACS,MAAM,CAACN,QAAQ,CAAC;EACzC,CAAC;;EAED;EACA;EACAV,WAAW,CAAC,YAAY,EAAEW,QAAQ,CAAC;EAEnC,OAAO;IAAEL,WAAW;IAAEK,QAAQ;IAAEG;EAAU,CAAC;AAC7C,CAAC;AAED,OAAO,MAAMG,eAAe,GAAGf,qBAAqB,CAAC,CAAC;AAEtD,OAAO,MAAMgB,kBAAkB,GAAGA,CAChCC,QAA0C,GAAIC,QAAQ,IAAKA,QAAa,KACrE;EACH,OAAOnB,gCAAgC,CACrCgB,eAAe,CAACH,SAAS,EACzBG,eAAe,CAACX,WAAW,EAC3BW,eAAe,CAACX,WAAW,EAC3Ba,QACF,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -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,EAWL,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,KAAK,iBAAiB,EAAkC,MAAM,QAAQ,CAAC;AAEhF,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACtE,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;
|
|
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,EAWL,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,KAAK,iBAAiB,EAAkC,MAAM,QAAQ,CAAC;AAEhF,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACtE,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;AAsU1E,eAAO,MAAM,UAAU;IAtQnB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;oBACa,iBAAiB;IAuCjC;;OAEG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;;;;;;;;;;;OAYG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;6BACsB,qBAAqB;IAgB9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;2BACoB,YAAY;IAKnC;;;;;;;;;;OAUG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;;;;;;;;OAWG;;CAK2C,CAAC"}
|
|
@@ -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;AAMlD,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,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;AAMlD,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAEF,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;CACtB,CAAC;AAOF;;;;;;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;AAgEpB;;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;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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAyDF,eAAO,MAAM,eAAe;;yBAnCE,OAAO,CAAC,eAAe,CAAC;0BAuBvB,MAAM,IAAI;CAYa,CAAC;AAEvD,eAAO,MAAM,kBAAkB,GAAI,CAAC,GAAG,eAAe,EACpD,WAAU,CAAC,QAAQ,EAAE,eAAe,KAAK,CAA+B,MAQzE,CAAC"}
|
|
@@ -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,EAWL,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,KAAK,iBAAiB,EAAkC,MAAM,QAAQ,CAAC;AAEhF,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACtE,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;
|
|
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,EAWL,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,KAAK,iBAAiB,EAAkC,MAAM,QAAQ,CAAC;AAEhF,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACtE,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;AAsU1E,eAAO,MAAM,UAAU;IAtQnB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;oBACa,iBAAiB;IAuCjC;;OAEG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;;;;;;;;;;;OAYG;;IAGH;;;;;;;;;;;;;;;;OAgBG;;IAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;6BACsB,qBAAqB;IAgB9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;2BACoB,YAAY;IAKnC;;;;;;;;;;OAUG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;;;;;;;;OAWG;;CAK2C,CAAC"}
|
|
@@ -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;AAMlD,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,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;AAMlD,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAEF,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;CACtB,CAAC;AAOF;;;;;;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;AAgEpB;;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;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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAyDF,eAAO,MAAM,eAAe;;yBAnCE,OAAO,CAAC,eAAe,CAAC;0BAuBvB,MAAM,IAAI;CAYa,CAAC;AAEvD,eAAO,MAAM,kBAAkB,GAAI,CAAC,GAAG,eAAe,EACpD,WAAU,CAAC,QAAQ,EAAE,eAAe,KAAK,CAA+B,MAQzE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/react-native",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.8",
|
|
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.25.
|
|
123
|
+
"hot-updater": "0.25.8"
|
|
124
124
|
},
|
|
125
125
|
"dependencies": {
|
|
126
126
|
"use-sync-external-store": "1.5.0",
|
|
127
|
-
"@hot-updater/cli-tools": "0.25.
|
|
128
|
-
"@hot-updater/core": "0.25.
|
|
129
|
-
"@hot-updater/
|
|
130
|
-
"@hot-updater/
|
|
127
|
+
"@hot-updater/cli-tools": "0.25.8",
|
|
128
|
+
"@hot-updater/core": "0.25.8",
|
|
129
|
+
"@hot-updater/plugin-core": "0.25.8",
|
|
130
|
+
"@hot-updater/js": "0.25.8"
|
|
131
131
|
},
|
|
132
132
|
"scripts": {
|
|
133
133
|
"build": "bob build && tsc -p plugin/tsconfig.build.json",
|
package/src/index.ts
CHANGED
|
@@ -34,12 +34,6 @@ export {
|
|
|
34
34
|
} from "./types";
|
|
35
35
|
export type { HotUpdaterOptions, RunUpdateProcessResponse } from "./wrap";
|
|
36
36
|
|
|
37
|
-
addListener("onProgress", ({ progress }) => {
|
|
38
|
-
hotUpdaterStore.setState({
|
|
39
|
-
progress,
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
|
|
43
37
|
/**
|
|
44
38
|
* Register getBaseURL to global objects for use without imports.
|
|
45
39
|
* This is needed for Expo DOM components and Babel plugin generated code.
|
package/src/native.ts
CHANGED
|
@@ -21,11 +21,12 @@ export type HotUpdaterEvent = {
|
|
|
21
21
|
};
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
+
const eventEmitter = new NativeEventEmitter(HotUpdaterNative);
|
|
25
|
+
|
|
24
26
|
export const addListener = <T extends keyof HotUpdaterEvent>(
|
|
25
27
|
eventName: T,
|
|
26
28
|
listener: (event: HotUpdaterEvent[T]) => void,
|
|
27
29
|
) => {
|
|
28
|
-
const eventEmitter = new NativeEventEmitter(HotUpdaterNative);
|
|
29
30
|
const subscription = eventEmitter.addListener(eventName, listener);
|
|
30
31
|
|
|
31
32
|
return () => {
|
package/src/store.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import useSyncExternalStoreExports from "use-sync-external-store/shim/with-selector";
|
|
2
|
+
import { addListener } from "./native";
|
|
3
|
+
|
|
2
4
|
export type HotUpdaterState = {
|
|
3
5
|
progress: number;
|
|
4
6
|
isUpdateDownloaded: boolean;
|
|
@@ -52,6 +54,10 @@ const createHotUpdaterStore = () => {
|
|
|
52
54
|
return () => listeners.delete(listener);
|
|
53
55
|
};
|
|
54
56
|
|
|
57
|
+
// Subscribe to native onProgress events
|
|
58
|
+
// This listener is registered once when the store is created
|
|
59
|
+
addListener("onProgress", setState);
|
|
60
|
+
|
|
55
61
|
return { getSnapshot, setState, subscribe };
|
|
56
62
|
};
|
|
57
63
|
|