@sigx/lynx-updates 0.7.0 → 0.8.0
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/LICENSE +21 -21
- package/README.md +199 -162
- package/android/com/sigx/updates/UpdateDownloader.kt +154 -154
- package/android/com/sigx/updates/UpdateStore.kt +367 -367
- package/android/com/sigx/updates/UpdatesActivityHook.kt +25 -25
- package/android/com/sigx/updates/UpdatesBundleResolver.kt +18 -18
- package/android/com/sigx/updates/UpdatesEventBus.kt +54 -54
- package/android/com/sigx/updates/UpdatesLifecyclePublisher.kt +42 -42
- package/android/com/sigx/updates/UpdatesModule.kt +235 -235
- package/dist/controller.js +1 -1
- package/dist/controller.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js +4 -2
- package/dist/native.js.map +1 -1
- package/dist/provider/static-manifest.d.ts +41 -10
- package/dist/provider/static-manifest.d.ts.map +1 -1
- package/dist/provider/static-manifest.js +39 -5
- package/dist/provider/static-manifest.js.map +1 -1
- package/dist/types.d.ts +6 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/updates.d.ts +11 -20
- package/dist/updates.d.ts.map +1 -1
- package/dist/updates.js +13 -22
- package/dist/updates.js.map +1 -1
- package/ios/UpdateDownloader.swift +152 -152
- package/ios/UpdateStore.swift +286 -286
- package/ios/UpdatesBundleResolver.swift +15 -15
- package/ios/UpdatesEventBus.swift +59 -59
- package/ios/UpdatesLifecyclePublisher.swift +48 -48
- package/ios/UpdatesModule.swift +178 -178
- package/package.json +3 -3
- package/signalx-module.json +35 -35
|
@@ -1,235 +1,235 @@
|
|
|
1
|
-
package com.sigx.updates
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import android.os.Handler
|
|
5
|
-
import android.os.Looper
|
|
6
|
-
import android.util.Log
|
|
7
|
-
import com.lynx.jsbridge.LynxMethod
|
|
8
|
-
import com.lynx.jsbridge.LynxModule
|
|
9
|
-
import com.lynx.react.bridge.Callback
|
|
10
|
-
import com.lynx.react.bridge.JavaOnlyMap
|
|
11
|
-
import com.lynx.react.bridge.ReadableMap
|
|
12
|
-
import com.lynx.tasm.TemplateData
|
|
13
|
-
import org.json.JSONObject
|
|
14
|
-
import java.io.File
|
|
15
|
-
import java.util.concurrent.Executors
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* JS bridge for OTA updates.
|
|
19
|
-
* JS usage: NativeModules.Updates.downloadUpdate({...}, callback)
|
|
20
|
-
*
|
|
21
|
-
* Downloads run on a single-thread executor (single-flight is also enforced
|
|
22
|
-
* in [UpdateDownloader]); everything else is cheap file/state work.
|
|
23
|
-
*/
|
|
24
|
-
class UpdatesModule(context: Context) : LynxModule(context) {
|
|
25
|
-
|
|
26
|
-
companion object {
|
|
27
|
-
private const val TAG = "SigxUpdates"
|
|
28
|
-
private val executor = Executors.newSingleThreadExecutor { r ->
|
|
29
|
-
Thread(r, "sigx-updates").apply { isDaemon = true }
|
|
30
|
-
}
|
|
31
|
-
private val mainHandler = Handler(Looper.getMainLooper())
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
private fun error(message: String, code: String? = null): JavaOnlyMap {
|
|
35
|
-
val map = JavaOnlyMap()
|
|
36
|
-
map.putString("error", message)
|
|
37
|
-
if (code != null) map.putString("code", code)
|
|
38
|
-
return map
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
private fun ok(): JavaOnlyMap {
|
|
42
|
-
val map = JavaOnlyMap()
|
|
43
|
-
map.putBoolean("ok", true)
|
|
44
|
-
return map
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
@LynxMethod
|
|
48
|
-
fun getInstalledRuntimeVersion(): String {
|
|
49
|
-
return UpdateStore.installedRuntimeVersion(mContext)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
@LynxMethod
|
|
53
|
-
fun getPlatform(): String = "android"
|
|
54
|
-
|
|
55
|
-
@LynxMethod
|
|
56
|
-
fun getCurrentUpdate(callback: Callback?) {
|
|
57
|
-
try {
|
|
58
|
-
val map = JavaOnlyMap()
|
|
59
|
-
val updateId = UpdateStore.launchedUpdateId
|
|
60
|
-
if (updateId != null) {
|
|
61
|
-
map.putString("updateId", updateId)
|
|
62
|
-
map.putBoolean("isEmbedded", false)
|
|
63
|
-
val metaFile = UpdateStore.updateJsonFile(mContext, updateId)
|
|
64
|
-
if (metaFile.exists()) {
|
|
65
|
-
try {
|
|
66
|
-
val meta = JSONObject(metaFile.readText())
|
|
67
|
-
map.putString("version", meta.optString("version"))
|
|
68
|
-
} catch (_: Exception) { /* metadata is best-effort */ }
|
|
69
|
-
}
|
|
70
|
-
} else {
|
|
71
|
-
map.putBoolean("isEmbedded", true)
|
|
72
|
-
}
|
|
73
|
-
map.putString("runtimeVersion", UpdateStore.installedRuntimeVersion(mContext))
|
|
74
|
-
// Store-shipped app version — providers receive it as
|
|
75
|
-
// UpdateCheckContext.embeddedVersion.
|
|
76
|
-
val versionName = runCatching {
|
|
77
|
-
mContext.packageManager.getPackageInfo(mContext.packageName, 0).versionName
|
|
78
|
-
}.getOrNull()
|
|
79
|
-
map.putString("embeddedVersion", versionName ?: "")
|
|
80
|
-
map.putBoolean("isFirstLaunchAfterUpdate", UpdateStore.isFirstLaunchAfterUpdate)
|
|
81
|
-
map.putBoolean("didRollBack", UpdateStore.didRollBack)
|
|
82
|
-
UpdateStore.rolledBackUpdateId?.let { map.putString("rolledBackUpdateId", it) }
|
|
83
|
-
callback?.invoke(map)
|
|
84
|
-
} catch (e: Exception) {
|
|
85
|
-
callback?.invoke(error(e.message ?: "getCurrentUpdate failed"))
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
@LynxMethod
|
|
90
|
-
fun getState(callback: Callback?) {
|
|
91
|
-
try {
|
|
92
|
-
val state = UpdateStore.readState(mContext)
|
|
93
|
-
val map = JavaOnlyMap()
|
|
94
|
-
if (state != null) {
|
|
95
|
-
map.putString("currentUpdateId", state.currentUpdateId ?: "")
|
|
96
|
-
map.putString("previousUpdateId", state.previousUpdateId ?: "")
|
|
97
|
-
map.putString("pendingUpdateId", state.pendingUpdateId ?: "")
|
|
98
|
-
map.putInt("pendingLaunchAttempts", state.pendingLaunchAttempts)
|
|
99
|
-
map.putInt("maxLaunchAttempts", state.maxLaunchAttempts)
|
|
100
|
-
map.putString("lastRollbackUpdateId", state.lastRollbackUpdateId ?: "")
|
|
101
|
-
map.putString("lastRollbackReason", state.lastRollbackReason ?: "")
|
|
102
|
-
}
|
|
103
|
-
map.putString("runningUpdateId", UpdateStore.launchedUpdateId ?: "")
|
|
104
|
-
callback?.invoke(map)
|
|
105
|
-
} catch (e: Exception) {
|
|
106
|
-
callback?.invoke(error(e.message ?: "getState failed"))
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
@LynxMethod
|
|
111
|
-
fun downloadUpdate(params: ReadableMap?, callback: Callback?) {
|
|
112
|
-
val url = params?.getString("url")
|
|
113
|
-
val sha256 = params?.getString("sha256")
|
|
114
|
-
val updateId = params?.getString("updateId")
|
|
115
|
-
val runtimeVersion = params?.getString("runtimeVersion")
|
|
116
|
-
val manifestJson = try { params?.getString("manifestJson") } catch (_: Exception) { null }
|
|
117
|
-
if (url.isNullOrEmpty() || sha256.isNullOrEmpty() || updateId.isNullOrEmpty()) {
|
|
118
|
-
callback?.invoke(error("url, sha256 and updateId are required"))
|
|
119
|
-
return
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Refuse incompatible bundles at the door — defense in depth on top
|
|
123
|
-
// of the JS-side check.
|
|
124
|
-
val installed = UpdateStore.installedRuntimeVersion(mContext)
|
|
125
|
-
if (!runtimeVersion.isNullOrEmpty() && runtimeVersion != installed) {
|
|
126
|
-
callback?.invoke(error(
|
|
127
|
-
"Update requires runtime $runtimeVersion but binary is $installed",
|
|
128
|
-
"E_RUNTIME_MISMATCH",
|
|
129
|
-
))
|
|
130
|
-
return
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
val headers = mutableMapOf<String, String>()
|
|
134
|
-
try {
|
|
135
|
-
val headerMap = params.getMap("headers")
|
|
136
|
-
if (headerMap != null) {
|
|
137
|
-
val it = headerMap.keySetIterator()
|
|
138
|
-
while (it.hasNextKey()) {
|
|
139
|
-
val key = it.nextKey()
|
|
140
|
-
headerMap.getString(key)?.let { v -> headers[key] = v }
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
} catch (_: Exception) { /* headers optional */ }
|
|
144
|
-
|
|
145
|
-
executor.execute {
|
|
146
|
-
val result = UpdateDownloader.download(
|
|
147
|
-
mContext, url, sha256, updateId, headers, manifestJson ?: "{}")
|
|
148
|
-
if (result == null) {
|
|
149
|
-
callback?.invoke(ok())
|
|
150
|
-
} else {
|
|
151
|
-
val code = when {
|
|
152
|
-
result.startsWith("E_DOWNLOAD_IN_PROGRESS") -> "E_DOWNLOAD_IN_PROGRESS"
|
|
153
|
-
result.startsWith("E_HASH_MISMATCH") -> "hash-mismatch"
|
|
154
|
-
else -> null
|
|
155
|
-
}
|
|
156
|
-
callback?.invoke(error(result, code))
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
@LynxMethod
|
|
162
|
-
fun applyOnNextLaunch(updateId: String?, callback: Callback?) {
|
|
163
|
-
if (updateId.isNullOrEmpty()) {
|
|
164
|
-
callback?.invoke(error("updateId is required"))
|
|
165
|
-
return
|
|
166
|
-
}
|
|
167
|
-
val result = UpdateStore.stagePending(mContext, updateId)
|
|
168
|
-
callback?.invoke(if (result == null) ok() else error(result))
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
@LynxMethod
|
|
172
|
-
fun applyNow(updateId: String?, callback: Callback?) {
|
|
173
|
-
if (updateId.isNullOrEmpty()) {
|
|
174
|
-
callback?.invoke(error("updateId is required"))
|
|
175
|
-
return
|
|
176
|
-
}
|
|
177
|
-
val bundle = UpdateStore.bundleFile(mContext, updateId)
|
|
178
|
-
if (!bundle.exists()) {
|
|
179
|
-
callback?.invoke(error("Update $updateId is not on disk"))
|
|
180
|
-
return
|
|
181
|
-
}
|
|
182
|
-
val view = UpdateStore.currentView()
|
|
183
|
-
if (view == null) {
|
|
184
|
-
callback?.invoke(error("No LynxView attached — cannot reload in place", "E_NO_VIEW"))
|
|
185
|
-
return
|
|
186
|
-
}
|
|
187
|
-
// Stage first so a crash mid-reload still gets crash-guarded rollback
|
|
188
|
-
// (the reload bypasses the startup resolver).
|
|
189
|
-
UpdateStore.stagePending(mContext, updateId)
|
|
190
|
-
UpdateStore.recordReloadAttempt(mContext, updateId)
|
|
191
|
-
mainHandler.post {
|
|
192
|
-
try {
|
|
193
|
-
val bytes = File(bundle.absolutePath).readBytes()
|
|
194
|
-
view.reloadAndInit()
|
|
195
|
-
view.renderTemplateWithBaseUrl(bytes, TemplateData.empty(), "file://${bundle.absolutePath}")
|
|
196
|
-
// JS context is replaced — the callback never reaches the old
|
|
197
|
-
// context on success, which is the documented contract.
|
|
198
|
-
} catch (e: Exception) {
|
|
199
|
-
Log.e(TAG, "applyNow reload failed: ${e.message}")
|
|
200
|
-
callback?.invoke(error(e.message ?: "Reload failed", "apply-failed"))
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
@LynxMethod
|
|
206
|
-
fun markReady(callback: Callback?) {
|
|
207
|
-
try {
|
|
208
|
-
UpdateStore.markReady(mContext)
|
|
209
|
-
callback?.invoke(ok())
|
|
210
|
-
} catch (e: Exception) {
|
|
211
|
-
callback?.invoke(error(e.message ?: "markReady failed"))
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
@LynxMethod
|
|
216
|
-
fun setRollbackOptions(params: ReadableMap?, callback: Callback?) {
|
|
217
|
-
try {
|
|
218
|
-
val max = params?.getInt("maxFailedLaunches") ?: 2
|
|
219
|
-
UpdateStore.setMaxLaunchAttempts(mContext, max)
|
|
220
|
-
callback?.invoke(ok())
|
|
221
|
-
} catch (e: Exception) {
|
|
222
|
-
callback?.invoke(error(e.message ?: "setRollbackOptions failed"))
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
@LynxMethod
|
|
227
|
-
fun clearUpdates(callback: Callback?) {
|
|
228
|
-
try {
|
|
229
|
-
UpdateStore.clearAll(mContext)
|
|
230
|
-
callback?.invoke(ok())
|
|
231
|
-
} catch (e: Exception) {
|
|
232
|
-
callback?.invoke(error(e.message ?: "clearUpdates failed"))
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
1
|
+
package com.sigx.updates
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.os.Handler
|
|
5
|
+
import android.os.Looper
|
|
6
|
+
import android.util.Log
|
|
7
|
+
import com.lynx.jsbridge.LynxMethod
|
|
8
|
+
import com.lynx.jsbridge.LynxModule
|
|
9
|
+
import com.lynx.react.bridge.Callback
|
|
10
|
+
import com.lynx.react.bridge.JavaOnlyMap
|
|
11
|
+
import com.lynx.react.bridge.ReadableMap
|
|
12
|
+
import com.lynx.tasm.TemplateData
|
|
13
|
+
import org.json.JSONObject
|
|
14
|
+
import java.io.File
|
|
15
|
+
import java.util.concurrent.Executors
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* JS bridge for OTA updates.
|
|
19
|
+
* JS usage: NativeModules.Updates.downloadUpdate({...}, callback)
|
|
20
|
+
*
|
|
21
|
+
* Downloads run on a single-thread executor (single-flight is also enforced
|
|
22
|
+
* in [UpdateDownloader]); everything else is cheap file/state work.
|
|
23
|
+
*/
|
|
24
|
+
class UpdatesModule(context: Context) : LynxModule(context) {
|
|
25
|
+
|
|
26
|
+
companion object {
|
|
27
|
+
private const val TAG = "SigxUpdates"
|
|
28
|
+
private val executor = Executors.newSingleThreadExecutor { r ->
|
|
29
|
+
Thread(r, "sigx-updates").apply { isDaemon = true }
|
|
30
|
+
}
|
|
31
|
+
private val mainHandler = Handler(Looper.getMainLooper())
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
private fun error(message: String, code: String? = null): JavaOnlyMap {
|
|
35
|
+
val map = JavaOnlyMap()
|
|
36
|
+
map.putString("error", message)
|
|
37
|
+
if (code != null) map.putString("code", code)
|
|
38
|
+
return map
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private fun ok(): JavaOnlyMap {
|
|
42
|
+
val map = JavaOnlyMap()
|
|
43
|
+
map.putBoolean("ok", true)
|
|
44
|
+
return map
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@LynxMethod
|
|
48
|
+
fun getInstalledRuntimeVersion(): String {
|
|
49
|
+
return UpdateStore.installedRuntimeVersion(mContext)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@LynxMethod
|
|
53
|
+
fun getPlatform(): String = "android"
|
|
54
|
+
|
|
55
|
+
@LynxMethod
|
|
56
|
+
fun getCurrentUpdate(callback: Callback?) {
|
|
57
|
+
try {
|
|
58
|
+
val map = JavaOnlyMap()
|
|
59
|
+
val updateId = UpdateStore.launchedUpdateId
|
|
60
|
+
if (updateId != null) {
|
|
61
|
+
map.putString("updateId", updateId)
|
|
62
|
+
map.putBoolean("isEmbedded", false)
|
|
63
|
+
val metaFile = UpdateStore.updateJsonFile(mContext, updateId)
|
|
64
|
+
if (metaFile.exists()) {
|
|
65
|
+
try {
|
|
66
|
+
val meta = JSONObject(metaFile.readText())
|
|
67
|
+
map.putString("version", meta.optString("version"))
|
|
68
|
+
} catch (_: Exception) { /* metadata is best-effort */ }
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
map.putBoolean("isEmbedded", true)
|
|
72
|
+
}
|
|
73
|
+
map.putString("runtimeVersion", UpdateStore.installedRuntimeVersion(mContext))
|
|
74
|
+
// Store-shipped app version — providers receive it as
|
|
75
|
+
// UpdateCheckContext.embeddedVersion.
|
|
76
|
+
val versionName = runCatching {
|
|
77
|
+
mContext.packageManager.getPackageInfo(mContext.packageName, 0).versionName
|
|
78
|
+
}.getOrNull()
|
|
79
|
+
map.putString("embeddedVersion", versionName ?: "")
|
|
80
|
+
map.putBoolean("isFirstLaunchAfterUpdate", UpdateStore.isFirstLaunchAfterUpdate)
|
|
81
|
+
map.putBoolean("didRollBack", UpdateStore.didRollBack)
|
|
82
|
+
UpdateStore.rolledBackUpdateId?.let { map.putString("rolledBackUpdateId", it) }
|
|
83
|
+
callback?.invoke(map)
|
|
84
|
+
} catch (e: Exception) {
|
|
85
|
+
callback?.invoke(error(e.message ?: "getCurrentUpdate failed"))
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
@LynxMethod
|
|
90
|
+
fun getState(callback: Callback?) {
|
|
91
|
+
try {
|
|
92
|
+
val state = UpdateStore.readState(mContext)
|
|
93
|
+
val map = JavaOnlyMap()
|
|
94
|
+
if (state != null) {
|
|
95
|
+
map.putString("currentUpdateId", state.currentUpdateId ?: "")
|
|
96
|
+
map.putString("previousUpdateId", state.previousUpdateId ?: "")
|
|
97
|
+
map.putString("pendingUpdateId", state.pendingUpdateId ?: "")
|
|
98
|
+
map.putInt("pendingLaunchAttempts", state.pendingLaunchAttempts)
|
|
99
|
+
map.putInt("maxLaunchAttempts", state.maxLaunchAttempts)
|
|
100
|
+
map.putString("lastRollbackUpdateId", state.lastRollbackUpdateId ?: "")
|
|
101
|
+
map.putString("lastRollbackReason", state.lastRollbackReason ?: "")
|
|
102
|
+
}
|
|
103
|
+
map.putString("runningUpdateId", UpdateStore.launchedUpdateId ?: "")
|
|
104
|
+
callback?.invoke(map)
|
|
105
|
+
} catch (e: Exception) {
|
|
106
|
+
callback?.invoke(error(e.message ?: "getState failed"))
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@LynxMethod
|
|
111
|
+
fun downloadUpdate(params: ReadableMap?, callback: Callback?) {
|
|
112
|
+
val url = params?.getString("url")
|
|
113
|
+
val sha256 = params?.getString("sha256")
|
|
114
|
+
val updateId = params?.getString("updateId")
|
|
115
|
+
val runtimeVersion = params?.getString("runtimeVersion")
|
|
116
|
+
val manifestJson = try { params?.getString("manifestJson") } catch (_: Exception) { null }
|
|
117
|
+
if (url.isNullOrEmpty() || sha256.isNullOrEmpty() || updateId.isNullOrEmpty()) {
|
|
118
|
+
callback?.invoke(error("url, sha256 and updateId are required"))
|
|
119
|
+
return
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Refuse incompatible bundles at the door — defense in depth on top
|
|
123
|
+
// of the JS-side check.
|
|
124
|
+
val installed = UpdateStore.installedRuntimeVersion(mContext)
|
|
125
|
+
if (!runtimeVersion.isNullOrEmpty() && runtimeVersion != installed) {
|
|
126
|
+
callback?.invoke(error(
|
|
127
|
+
"Update requires runtime $runtimeVersion but binary is $installed",
|
|
128
|
+
"E_RUNTIME_MISMATCH",
|
|
129
|
+
))
|
|
130
|
+
return
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
val headers = mutableMapOf<String, String>()
|
|
134
|
+
try {
|
|
135
|
+
val headerMap = params.getMap("headers")
|
|
136
|
+
if (headerMap != null) {
|
|
137
|
+
val it = headerMap.keySetIterator()
|
|
138
|
+
while (it.hasNextKey()) {
|
|
139
|
+
val key = it.nextKey()
|
|
140
|
+
headerMap.getString(key)?.let { v -> headers[key] = v }
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
} catch (_: Exception) { /* headers optional */ }
|
|
144
|
+
|
|
145
|
+
executor.execute {
|
|
146
|
+
val result = UpdateDownloader.download(
|
|
147
|
+
mContext, url, sha256, updateId, headers, manifestJson ?: "{}")
|
|
148
|
+
if (result == null) {
|
|
149
|
+
callback?.invoke(ok())
|
|
150
|
+
} else {
|
|
151
|
+
val code = when {
|
|
152
|
+
result.startsWith("E_DOWNLOAD_IN_PROGRESS") -> "E_DOWNLOAD_IN_PROGRESS"
|
|
153
|
+
result.startsWith("E_HASH_MISMATCH") -> "hash-mismatch"
|
|
154
|
+
else -> null
|
|
155
|
+
}
|
|
156
|
+
callback?.invoke(error(result, code))
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
@LynxMethod
|
|
162
|
+
fun applyOnNextLaunch(updateId: String?, callback: Callback?) {
|
|
163
|
+
if (updateId.isNullOrEmpty()) {
|
|
164
|
+
callback?.invoke(error("updateId is required"))
|
|
165
|
+
return
|
|
166
|
+
}
|
|
167
|
+
val result = UpdateStore.stagePending(mContext, updateId)
|
|
168
|
+
callback?.invoke(if (result == null) ok() else error(result))
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
@LynxMethod
|
|
172
|
+
fun applyNow(updateId: String?, callback: Callback?) {
|
|
173
|
+
if (updateId.isNullOrEmpty()) {
|
|
174
|
+
callback?.invoke(error("updateId is required"))
|
|
175
|
+
return
|
|
176
|
+
}
|
|
177
|
+
val bundle = UpdateStore.bundleFile(mContext, updateId)
|
|
178
|
+
if (!bundle.exists()) {
|
|
179
|
+
callback?.invoke(error("Update $updateId is not on disk"))
|
|
180
|
+
return
|
|
181
|
+
}
|
|
182
|
+
val view = UpdateStore.currentView()
|
|
183
|
+
if (view == null) {
|
|
184
|
+
callback?.invoke(error("No LynxView attached — cannot reload in place", "E_NO_VIEW"))
|
|
185
|
+
return
|
|
186
|
+
}
|
|
187
|
+
// Stage first so a crash mid-reload still gets crash-guarded rollback
|
|
188
|
+
// (the reload bypasses the startup resolver).
|
|
189
|
+
UpdateStore.stagePending(mContext, updateId)
|
|
190
|
+
UpdateStore.recordReloadAttempt(mContext, updateId)
|
|
191
|
+
mainHandler.post {
|
|
192
|
+
try {
|
|
193
|
+
val bytes = File(bundle.absolutePath).readBytes()
|
|
194
|
+
view.reloadAndInit()
|
|
195
|
+
view.renderTemplateWithBaseUrl(bytes, TemplateData.empty(), "file://${bundle.absolutePath}")
|
|
196
|
+
// JS context is replaced — the callback never reaches the old
|
|
197
|
+
// context on success, which is the documented contract.
|
|
198
|
+
} catch (e: Exception) {
|
|
199
|
+
Log.e(TAG, "applyNow reload failed: ${e.message}")
|
|
200
|
+
callback?.invoke(error(e.message ?: "Reload failed", "apply-failed"))
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
@LynxMethod
|
|
206
|
+
fun markReady(callback: Callback?) {
|
|
207
|
+
try {
|
|
208
|
+
UpdateStore.markReady(mContext)
|
|
209
|
+
callback?.invoke(ok())
|
|
210
|
+
} catch (e: Exception) {
|
|
211
|
+
callback?.invoke(error(e.message ?: "markReady failed"))
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
@LynxMethod
|
|
216
|
+
fun setRollbackOptions(params: ReadableMap?, callback: Callback?) {
|
|
217
|
+
try {
|
|
218
|
+
val max = params?.getInt("maxFailedLaunches") ?: 2
|
|
219
|
+
UpdateStore.setMaxLaunchAttempts(mContext, max)
|
|
220
|
+
callback?.invoke(ok())
|
|
221
|
+
} catch (e: Exception) {
|
|
222
|
+
callback?.invoke(error(e.message ?: "setRollbackOptions failed"))
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
@LynxMethod
|
|
227
|
+
fun clearUpdates(callback: Callback?) {
|
|
228
|
+
try {
|
|
229
|
+
UpdateStore.clearAll(mContext)
|
|
230
|
+
callback?.invoke(ok())
|
|
231
|
+
} catch (e: Exception) {
|
|
232
|
+
callback?.invoke(error(e.message ?: "clearUpdates failed"))
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
package/dist/controller.js
CHANGED
|
@@ -27,7 +27,7 @@ let downloadInFlightId = null;
|
|
|
27
27
|
let bootstrapScheduled = false;
|
|
28
28
|
function requireConfig() {
|
|
29
29
|
if (!config) {
|
|
30
|
-
throw new UpdatesError('not-configured', 'Call
|
|
30
|
+
throw new UpdatesError('not-configured', 'Call Updates.configure() before using the Updates API');
|
|
31
31
|
}
|
|
32
32
|
return config;
|
|
33
33
|
}
|
package/dist/controller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACH,YAAY,EACZ,gBAAgB,EAChB,0BAA0B,EAC1B,WAAW,EACX,cAAc,EACd,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,wBAAwB,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EACH,YAAY,GAOf,MAAM,YAAY,CAAC;AAEpB,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AAWpC,IAAI,MAAM,GAAiC,IAAI,CAAC;AAChD,IAAI,iBAAiB,GAAwB,IAAI,CAAC;AAClD,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAC9B,IAAI,aAAa,GAAsC,IAAI,CAAC;AAC5D,IAAI,gBAAgB,GAAyB,IAAI,CAAC;AAClD,IAAI,kBAAkB,GAAkB,IAAI,CAAC;AAC7C,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAE/B,SAAS,aAAa;IAClB,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { Updates } from './updates.js';
|
|
2
2
|
export { useUpdates } from './use-updates.js';
|
|
3
|
-
export { StaticManifestProvider, validateUpdatesManifest, type StaticManifestDocument, type StaticManifestEntry, type StaticManifestProviderOptions, } from './provider/static-manifest.js';
|
|
3
|
+
export { StaticManifestProvider, validateUpdatesManifest, type ManifestEndpoint, type StaticManifestDocument, type StaticManifestEntry, type StaticManifestProviderOptions, } from './provider/static-manifest.js';
|
|
4
4
|
export { UpdatesError, type UpdatesErrorCode, type CurrentUpdateInfo, type DownloadProgress, type DownloadSpec, type UpdateCheckContext, type UpdateCheckResult, type UpdateManifest, type UpdateMode, type UpdatePlatform, type UpdateProvider, type UpdatesConfig, type UpdatesEvent, type UpdatesState, type UpdateStatus, } from './types.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACH,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,GACrC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACH,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,GACpB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { Updates } from './updates.js';
|
|
2
2
|
export { useUpdates } from './use-updates.js';
|
|
3
3
|
export { StaticManifestProvider, validateUpdatesManifest, } from './provider/static-manifest.js';
|
|
4
4
|
export { UpdatesError, } from './types.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACH,sBAAsB,EACtB,uBAAuB,GAK1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACH,YAAY,GAef,MAAM,YAAY,CAAC"}
|
package/dist/native.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAgB,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAWrF,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,qEAAqE;AACrE,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CASnD;AAED,wBAAgB,WAAW,IAAI,SAAS,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAgB,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAWrF,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,qEAAqE;AACrE,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CASnD;AAED,wBAAgB,WAAW,IAAI,SAAS,GAAG,KAAK,CAQ/C;AAyCD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAyBnE;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAChC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,mEAAmE;AACnE,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpE;AAED,yDAAyD;AACzD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrD;AAED,yDAAyD;AACzD,wBAAsB,wBAAwB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvF;AAED,2EAA2E;AAC3E,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIxD"}
|
package/dist/native.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* tests, app built without the package): reads return inert defaults,
|
|
8
8
|
* mutations reject with `native-unavailable`.
|
|
9
9
|
*/
|
|
10
|
-
import { callAsync, callSync, isModuleAvailable } from '@sigx/lynx-core';
|
|
10
|
+
import { callAsync, callSync, isModuleAvailable, Platform } from '@sigx/lynx-core';
|
|
11
11
|
import { UpdatesError } from './types.js';
|
|
12
12
|
const MODULE = 'Updates';
|
|
13
13
|
export function nativeAvailable() {
|
|
@@ -39,7 +39,9 @@ export function getPlatform() {
|
|
|
39
39
|
if (p === 'android' || p === 'ios')
|
|
40
40
|
return p;
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
// Native is authoritative; fall back to core's SystemInfo-based detection
|
|
43
|
+
// (web preview / tests / module absent). 'web' maps to 'android' here.
|
|
44
|
+
return Platform.OS === 'ios' ? 'ios' : 'android';
|
|
43
45
|
}
|
|
44
46
|
const EMBEDDED_INFO = {
|
|
45
47
|
updateId: null,
|
package/dist/native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
|