@sigx/lynx-updates 0.6.1 → 0.7.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 +162 -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 +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/updates.d.ts +20 -11
- package/dist/updates.d.ts.map +1 -1
- package/dist/updates.js +22 -13
- 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 defineUpdates() 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,4 +1,4 @@
|
|
|
1
|
-
export { Updates } from './updates.js';
|
|
1
|
+
export { defineUpdates, Updates } from './updates.js';
|
|
2
2
|
export { useUpdates } from './use-updates.js';
|
|
3
3
|
export { StaticManifestProvider, validateUpdatesManifest, 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';
|
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,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACH,sBAAsB,EACtB,uBAAuB,EACvB,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 { Updates } from './updates.js';
|
|
1
|
+
export { defineUpdates, 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,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACH,sBAAsB,EACtB,uBAAuB,GAI1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACH,YAAY,GAef,MAAM,YAAY,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -179,7 +179,7 @@ export interface UpdatesConfig {
|
|
|
179
179
|
honorMandatory?: boolean;
|
|
180
180
|
/**
|
|
181
181
|
* true (default): `markReady()` is called automatically shortly after
|
|
182
|
-
* `
|
|
182
|
+
* `defineUpdates()` — "JS booted" is the health bar for rollback. Set false
|
|
183
183
|
* to gate on your own signal (first screen rendered, critical fetch OK)
|
|
184
184
|
* and call `Updates.markReady()` yourself.
|
|
185
185
|
*/
|
package/dist/updates.d.ts
CHANGED
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Public
|
|
3
|
-
*
|
|
2
|
+
* Public API — `defineUpdates()` (the boot-time declaration, in the
|
|
3
|
+
* `defineApp`/`defineRoutes` family) and the `Updates` runtime object (a
|
|
4
|
+
* thin facade over the controller, the store and the native module, in the
|
|
5
|
+
* `Haptics`/`Storage` native-module family). See the package README.
|
|
4
6
|
*/
|
|
5
7
|
import type { CurrentUpdateInfo, UpdateCheckResult, UpdateManifest, UpdatesConfig, UpdatesEvent, UpdatesState } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Declare the OTA update behavior for this app. Call once in `main.tsx`
|
|
10
|
+
* before `defineApp` — idempotent and synchronous; re-declaring updates the
|
|
11
|
+
* config but never re-runs the boot work (markReady / launch check).
|
|
12
|
+
* Kicks off the configured mode's automatic behavior on a deferred task
|
|
13
|
+
* (never blocks first paint). No-ops gracefully (with one warning) when the
|
|
14
|
+
* native module is absent (web preview, tests).
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* defineUpdates({ provider: { url: 'https://cdn.example.com/updates.json' } });
|
|
19
|
+
* defineApp(<App />).mount(null);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function defineUpdates(config: UpdatesConfig): void;
|
|
6
23
|
export declare const Updates: {
|
|
7
|
-
/**
|
|
8
|
-
* Configure the updates client. Idempotent and synchronous; must run
|
|
9
|
-
* before any other call — typically in `main.tsx` before `defineApp`.
|
|
10
|
-
* Kicks off the configured mode's automatic behavior on a deferred task
|
|
11
|
-
* (never blocks first paint). No-ops gracefully (with one warning) when
|
|
12
|
-
* the native module is absent (web preview, tests).
|
|
13
|
-
*/
|
|
14
|
-
readonly configure: (config: UpdatesConfig) => void;
|
|
15
24
|
/** Ask the provider for the best available update. Works in every mode. */
|
|
16
25
|
readonly checkForUpdate: () => Promise<UpdateCheckResult>;
|
|
17
26
|
/**
|
|
@@ -27,7 +36,7 @@ export declare const Updates: {
|
|
|
27
36
|
readonly apply: () => Promise<void>;
|
|
28
37
|
/**
|
|
29
38
|
* Health signal: commits the pending update so native stops counting
|
|
30
|
-
* launch attempts against it. Called automatically after
|
|
39
|
+
* launch attempts against it. Called automatically after defineUpdates()
|
|
31
40
|
* unless `autoMarkReady: false`. Safe to call repeatedly.
|
|
32
41
|
*/
|
|
33
42
|
readonly markReady: () => Promise<void>;
|
package/dist/updates.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../src/updates.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../src/updates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACR,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACf,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAEzD;AAED,eAAO,MAAM,OAAO;IAChB,2EAA2E;aAC3E,cAAc,QAAI,OAAO,CAAC,iBAAiB,CAAC;IAI5C;;;OAGG;aACH,QAAQ,cAAY,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC;IAIlD;;;;OAIG;aACH,KAAK,QAAI,OAAO,CAAC,IAAI,CAAC;IAItB;;;;OAIG;aACH,SAAS,QAAI,OAAO,CAAC,IAAI,CAAC;IAI1B,uEAAuE;aACvE,mBAAmB,QAAI,OAAO,CAAC,iBAAiB,CAAC;IAIjD,0EAA0E;aAC1E,YAAY,QAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,6EAA6E;aAC7E,QAAQ,QAAI,YAAY;IAIxB,uEAAuE;aACvE,WAAW,OAAK,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,KAAG,MAAM,IAAI;IAI1D,sEAAsE;aACtE,WAAW,QAAI,OAAO;CAGhB,CAAC"}
|