react-native-bspatch 1.1.2 → 1.1.4
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/README.md +145 -42
- package/android/src/main/java/vn/reactnativebspatch/BsPatchModule.kt +117 -17
- package/cpp/CMakeLists.txt +9 -1
- package/cpp/bsdiff/bspatch.c +14 -3
- package/cpp/bsdiff/bspatch_wrapper.c +124 -40
- package/ios/RNBsPatch.mm +142 -1
- package/lib/commonjs/NativeBsPatch.js.map +1 -1
- package/lib/commonjs/ota/OtaProvider.js +61 -12
- package/lib/commonjs/ota/OtaProvider.js.map +1 -1
- package/lib/commonjs/ota/otaCore.js +43 -20
- package/lib/commonjs/ota/otaCore.js.map +1 -1
- package/lib/commonjs/ota/otaMetadata.js +41 -5
- package/lib/commonjs/ota/otaMetadata.js.map +1 -1
- package/lib/commonjs/ota/storage/CustomStorage.js +23 -3
- package/lib/commonjs/ota/storage/CustomStorage.js.map +1 -1
- package/lib/commonjs/ota/storage/GitHubRawStorage.js +3 -0
- package/lib/commonjs/ota/storage/GitHubRawStorage.js.map +1 -1
- package/lib/commonjs/ota/storage/GitHubReleaseStorage.js +3 -0
- package/lib/commonjs/ota/storage/GitHubReleaseStorage.js.map +1 -1
- package/lib/module/NativeBsPatch.js.map +1 -1
- package/lib/module/ota/OtaProvider.js +61 -12
- package/lib/module/ota/OtaProvider.js.map +1 -1
- package/lib/module/ota/otaCore.js +43 -20
- package/lib/module/ota/otaCore.js.map +1 -1
- package/lib/module/ota/otaMetadata.js +38 -3
- package/lib/module/ota/otaMetadata.js.map +1 -1
- package/lib/module/ota/storage/CustomStorage.js +23 -3
- package/lib/module/ota/storage/CustomStorage.js.map +1 -1
- package/lib/module/ota/storage/GitHubRawStorage.js +3 -0
- package/lib/module/ota/storage/GitHubRawStorage.js.map +1 -1
- package/lib/module/ota/storage/GitHubReleaseStorage.js +3 -0
- package/lib/module/ota/storage/GitHubReleaseStorage.js.map +1 -1
- package/lib/typescript/NativeBsPatch.d.ts +11 -0
- package/lib/typescript/NativeBsPatch.d.ts.map +1 -1
- package/lib/typescript/ota/OtaProvider.d.ts.map +1 -1
- package/lib/typescript/ota/otaCore.d.ts +3 -1
- package/lib/typescript/ota/otaCore.d.ts.map +1 -1
- package/lib/typescript/ota/otaMetadata.d.ts +6 -0
- package/lib/typescript/ota/otaMetadata.d.ts.map +1 -1
- package/lib/typescript/ota/storage/CustomStorage.d.ts.map +1 -1
- package/lib/typescript/ota/storage/GitHubRawStorage.d.ts.map +1 -1
- package/lib/typescript/ota/storage/GitHubReleaseStorage.d.ts.map +1 -1
- package/lib/typescript/ota/types.d.ts +6 -2
- package/lib/typescript/ota/types.d.ts.map +1 -1
- package/package.json +3 -1
- package/react-native-bspatch.podspec +6 -1
- package/src/NativeBsPatch.ts +17 -0
- package/src/ota/OtaProvider.tsx +80 -23
- package/src/ota/otaCore.ts +54 -24
- package/src/ota/otaMetadata.ts +46 -4
- package/src/ota/storage/CustomStorage.ts +26 -3
- package/src/ota/storage/GitHubRawStorage.ts +5 -0
- package/src/ota/storage/GitHubReleaseStorage.ts +5 -0
- package/src/ota/types.ts +6 -2
- package/tools/build_ota.sh +366 -18
- package/tools/bump_version.js +133 -0
- package/tools/generate_keys.js +75 -0
- package/tools/setup_project.js +69 -4
- package/tools/update_registry.js +51 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","ReactNativeBlobUtil","tokenCache","Map","CustomStorageProvider","getEndpoint","config","key","fallback","customServer","endpoints","getAccessToken","Error","baseUrl","username","password","cacheKey","now","Date","cached","get","expiresAt","token","loginPath","loginUrl","endsWith","res","fetch","JSON","stringify","json","parse","data","accessTokenInfo","accessToken","set","error","message","fetchManifest","bundledPatches","channel","baseFolder","registryPath","normalizedBaseUrl","slice","genLinkPath","genLinkUrl","encodeURIComponent","linkRes","Authorization","linkJson","registryUrl","registryRes","respInfo","status","registry","appGroup","apps","
|
|
1
|
+
{"version":3,"names":["Platform","ReactNativeBlobUtil","tokenCache","Map","registryCache","CustomStorageProvider","getEndpoint","config","key","fallback","customServer","endpoints","getAccessToken","Error","baseUrl","username","password","cacheKey","now","Date","cached","get","expiresAt","token","loginPath","loginUrl","endsWith","res","fetch","JSON","stringify","json","parse","data","accessTokenInfo","accessToken","set","error","message","fetchManifest","bundledPatches","channel","baseFolder","registryPath","regCacheKey","appVersion","cachedReg","normalizedBaseUrl","slice","genLinkPath","genLinkUrl","encodeURIComponent","linkRes","Authorization","linkJson","registryUrl","reqHeaders","etag","registryRes","respInfo","status","patches","headers","registry","appGroup","apps","flavorGroup","flavors","toLowerCase","length","matchedPatches","filter","p","platform","OS","console","warn","getUpdateFileUrl","filename","useMinio","remotePath","downloadPath","getAssetUrl","hash","ext"],"sourceRoot":"../../../../src","sources":["ota/storage/CustomStorage.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -47,6 +47,9 @@ export class GitHubRawStorageProvider {
|
|
|
47
47
|
throw new Error(`Registry fetch failed with status ${res.respInfo.status}`);
|
|
48
48
|
}
|
|
49
49
|
const registry = typeof res.data === 'string' ? JSON.parse(res.data) : res.data;
|
|
50
|
+
if (!config.appVersion) {
|
|
51
|
+
throw new Error('[GitHubRawStorage] config.appVersion is required to query OTA registry');
|
|
52
|
+
}
|
|
50
53
|
const appGroup = registry?.apps?.[config.appVersion];
|
|
51
54
|
const flavorGroup = appGroup?.flavors?.[channelName];
|
|
52
55
|
if (!flavorGroup?.patches?.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","ReactNativeBlobUtil","NO_CACHE_HEADERS","bustCache","url","Date","now","normalizeChannel","channel","lower","toLowerCase","GitHubRawStorageProvider","fetchManifest","config","customServer","bundledPatches","baseUrl","baseFolder","channelName","normalizedBaseUrl","endsWith","slice","registryUrl","res","fetch","respInfo","status","Error","registry","data","JSON","parse","
|
|
1
|
+
{"version":3,"names":["Platform","ReactNativeBlobUtil","NO_CACHE_HEADERS","bustCache","url","Date","now","normalizeChannel","channel","lower","toLowerCase","GitHubRawStorageProvider","fetchManifest","config","customServer","bundledPatches","baseUrl","baseFolder","channelName","normalizedBaseUrl","endsWith","slice","registryUrl","res","fetch","respInfo","status","Error","registry","data","JSON","parse","appVersion","appGroup","apps","flavorGroup","flavors","patches","length","filter","p","platform","OS","error","console","warn","message","getUpdateFileUrl","filename","getAssetUrl","hash","ext"],"sourceRoot":"../../../../src","sources":["ota/storage/GitHubRawStorage.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -54,6 +54,9 @@ export class GitHubReleaseStorageProvider {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// Structured: apps["1.0.0"].channels["production"].patches[]
|
|
57
|
+
if (!config.appVersion) {
|
|
58
|
+
throw new Error('[GitHubReleaseStorage] config.appVersion is required to query OTA registry');
|
|
59
|
+
}
|
|
57
60
|
const appGroup = registry?.apps?.[config.appVersion];
|
|
58
61
|
const channelGroup = appGroup?.channels?.[config.githubRelease.repo] // use repo as channel fallback
|
|
59
62
|
?? appGroup?.channels?.production ?? appGroup?.flavors?.production;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","ReactNativeBlobUtil","GitHubReleaseStorageProvider","getRawRegistryUrl","config","repo","tag","registryPath","githubRelease","getAssetDownloadUrl","filename","authHeaders","token","Authorization","fetchManifest","bundledPatches","url","res","fetch","respInfo","status","Error","registry","data","JSON","parse","stringify","Array","isArray","filter","p","platform","OS","
|
|
1
|
+
{"version":3,"names":["Platform","ReactNativeBlobUtil","GitHubReleaseStorageProvider","getRawRegistryUrl","config","repo","tag","registryPath","githubRelease","getAssetDownloadUrl","filename","authHeaders","token","Authorization","fetchManifest","bundledPatches","url","res","fetch","respInfo","status","Error","registry","data","JSON","parse","stringify","Array","isArray","filter","p","platform","OS","appVersion","appGroup","apps","channelGroup","channels","production","flavors","patches","length","error","console","warn","message","getUpdateFileUrl","getAssetUrl","hash","ext","assetBaseUrl"],"sourceRoot":"../../../../src","sources":["ota/storage/GitHubReleaseStorage.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -33,6 +33,17 @@ export interface Spec extends TurboModule {
|
|
|
33
33
|
* Log a message to the native console (NSLog on iOS)
|
|
34
34
|
*/
|
|
35
35
|
logNative(message: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Verify HMAC-SHA256 signature natively with streaming file I/O
|
|
38
|
+
* @param filePath Absolute path to the file to verify
|
|
39
|
+
* @param signature Base64-encoded expected signature
|
|
40
|
+
* @param publicKey Base64-encoded secret key
|
|
41
|
+
*/
|
|
42
|
+
verifySignature(filePath: string, signature: string, publicKey: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Returns the native app version (versionName on Android, CFBundleShortVersionString on iOS)
|
|
45
|
+
*/
|
|
46
|
+
getAppVersion(): Promise<string>;
|
|
36
47
|
}
|
|
37
48
|
declare const _default: Spec;
|
|
38
49
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeBsPatch.d.ts","sourceRoot":"","sources":["../../src/NativeBsPatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC;;;;;;OAMG;IACH,UAAU,CACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;;;OAIG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,uBAAuB,CACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;;;OAIG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvE;;OAEG;IACH,aAAa,IAAI,IAAI,CAAC;IAEtB;;OAEG;IACH,YAAY,IAAI,IAAI,CAAC;IAErB;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;;AAED,wBAAiE"}
|
|
1
|
+
{"version":3,"file":"NativeBsPatch.d.ts","sourceRoot":"","sources":["../../src/NativeBsPatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC;;;;;;OAMG;IACH,UAAU,CACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;;;OAIG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,uBAAuB,CACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;;;OAIG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvE;;OAEG;IACH,aAAa,IAAI,IAAI,CAAC;IAEtB;;OAEG;IACH,YAAY,IAAI,IAAI,CAAC;IAErB;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC;;;;;OAKG;IACH,eAAe,CACb,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAClC;;AAED,wBAAiE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OtaProvider.d.ts","sourceRoot":"","sources":["../../../src/ota/OtaProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAgBf,OAAO,EACL,SAAS,EAGT,QAAQ,EAGT,MAAM,SAAS,CAAC;AAIjB,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,MAAM,EACN,WAAW,EACX,cAAqB,GACtB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,
|
|
1
|
+
{"version":3,"file":"OtaProvider.d.ts","sourceRoot":"","sources":["../../../src/ota/OtaProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAgBf,OAAO,EACL,SAAS,EAGT,QAAQ,EAGT,MAAM,SAAS,CAAC;AAIjB,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,MAAM,EACN,WAAW,EACX,cAAqB,GACtB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,qBAiaA;AAED,wBAAgB,MAAM,aAMrB"}
|
|
@@ -105,5 +105,7 @@ export declare const getLocalPatchPath: (patch: OtaPatch, docDir: string) => str
|
|
|
105
105
|
*
|
|
106
106
|
* On failure → fallback to full bundle download if URL available.
|
|
107
107
|
*/
|
|
108
|
-
export declare const applyOtaPatchInternal: (patch: OtaPatch, config: OtaConfig, onStatus: (status: OtaStatus, message: string, metrics?: OtaMetrics) => void, onProgress: (percent: number) => void
|
|
108
|
+
export declare const applyOtaPatchInternal: (patch: OtaPatch, config: OtaConfig, onStatus: (status: OtaStatus, message: string, metrics?: OtaMetrics) => void, onProgress: (percent: number) => void, options?: {
|
|
109
|
+
autoReload?: boolean;
|
|
110
|
+
}) => Promise<void>;
|
|
109
111
|
//# sourceMappingURL=otaCore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otaCore.d.ts","sourceRoot":"","sources":["../../../src/ota/otaCore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH,OAAO,EACH,SAAS,EAGT,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,QAAQ,EAEhB,MAAM,SAAS,CAAC;AAuBjB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,OAUhD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GACnB,MAAM,MAAM,EACZ,eAAe,MAAM,KACtB,OAAO,CAAC,OAAO,CAQjB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,eAAe,GACxB,UAAU,MAAM,EAChB,YAAY,MAAM,EAClB,YAAY,MAAM,KACnB,OAAO,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"otaCore.d.ts","sourceRoot":"","sources":["../../../src/ota/otaCore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH,OAAO,EACH,SAAS,EAGT,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,QAAQ,EAEhB,MAAM,SAAS,CAAC;AAuBjB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,OAUhD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GACnB,MAAM,MAAM,EACZ,eAAe,MAAM,KACtB,OAAO,CAAC,OAAO,CAQjB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,eAAe,GACxB,UAAU,MAAM,EAChB,YAAY,MAAM,EAClB,YAAY,MAAM,KACnB,OAAO,CAAC,OAAO,CA+BjB,CAAC;AA0FF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GACzB,QAAQ,SAAS,KAClB,OAAO,CAAC,QAAQ,EAAE,CAWpB,CAAC;AAyLF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,KAAK,MAAM,KAAG,MACvB,CAAC;AAExC;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,QAAQ,EAAE,QAAQ,MAAM,KAAG,MACzB,CAAC;AAI5C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,qBAAqB,GAC9B,OAAO,QAAQ,EACf,QAAQ,SAAS,EACjB,UAAU,CACN,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,UAAU,KACnB,IAAI,EACT,YAAY,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACrC,UAAS;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAyB,kBA2e3D,CAAC"}
|
|
@@ -27,9 +27,15 @@ export declare const MAX_VERSION_HISTORY = 3;
|
|
|
27
27
|
* @returns Updated metadata object.
|
|
28
28
|
*/
|
|
29
29
|
export declare const registerNewVersion: (metadata: OtaMetadata, newVersion: number) => OtaMetadata;
|
|
30
|
+
/**
|
|
31
|
+
* Scans the OTA directory and removes old version directories and leftover temporary files
|
|
32
|
+
* that are no longer referenced in the active metadata.
|
|
33
|
+
*/
|
|
34
|
+
export declare const cleanupOldVersions: (metadata: OtaMetadata, baseVersion: number) => Promise<void>;
|
|
30
35
|
/**
|
|
31
36
|
* Marks the current session as healthy, indicating a successful boot.
|
|
32
37
|
* This prevents the native bridge from rolling back the version on the next launch.
|
|
38
|
+
* Also cleans up obsolete version directories from disk.
|
|
33
39
|
*
|
|
34
40
|
* @param defaultVersion - Base version for metadata lookup fallback.
|
|
35
41
|
* @returns The updated metadata.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otaMetadata.d.ts","sourceRoot":"","sources":["../../../src/ota/otaMetadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQtC;;GAEG;AACH,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,IAAI,CAIjD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACrB,gBAAgB,MAAM,KACvB,OAAO,CAAC,WAAW,CAmBrB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,WAAW,KAAG,OAAO,CAAC,IAAI,CAoBtE,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAC3B,UAAU,WAAW,EACrB,YAAY,MAAM,KACnB,WAiBF,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"otaMetadata.d.ts","sourceRoot":"","sources":["../../../src/ota/otaMetadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQtC;;GAEG;AACH,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,IAAI,CAIjD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACrB,gBAAgB,MAAM,KACvB,OAAO,CAAC,WAAW,CAmBrB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,WAAW,KAAG,OAAO,CAAC,IAAI,CAoBtE,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAC3B,UAAU,WAAW,EACrB,YAAY,MAAM,KACnB,WAiBF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC3B,UAAU,WAAW,EACrB,aAAa,MAAM,KACpB,OAAO,CAAC,IAAI,CAgCd,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GACpB,gBAAgB,MAAM,KACvB,OAAO,CAAC,WAAW,CAarB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GACtB,SAAS,MAAM,EACf,aAAa,MAAM,KACpB,MAAM,GAAG,IAUX,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomStorage.d.ts","sourceRoot":"","sources":["../../../../src/ota/storage/CustomStorage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"CustomStorage.d.ts","sourceRoot":"","sources":["../../../../src/ota/storage/CustomStorage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAiBxE;;GAEG;AACH,qBAAa,qBAAsB,YAAW,kBAAkB;IAC9D,OAAO,CAAC,WAAW;YAIL,cAAc;IAqCtB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAuDrD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBtE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CAsBjF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubRawStorage.d.ts","sourceRoot":"","sources":["../../../../src/ota/storage/GitHubRawStorage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AA8BxE,qBAAa,wBAAyB,YAAW,kBAAkB;IACzD,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"GitHubRawStorage.d.ts","sourceRoot":"","sources":["../../../../src/ota/storage/GitHubRawStorage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AA8BxE,qBAAa,wBAAyB,YAAW,kBAAkB;IACzD,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAwDrD,gBAAgB,CAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,GAClB,OAAO,CAAC,MAAM,CAAC;IAkBZ,WAAW,CACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,GAClB,OAAO,CAAC,MAAM,CAAC;CAWrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubReleaseStorage.d.ts","sourceRoot":"","sources":["../../../../src/ota/storage/GitHubReleaseStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAExE,qBAAa,4BAA6B,YAAW,kBAAkB;IACnE,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,WAAW;IAKb,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"GitHubReleaseStorage.d.ts","sourceRoot":"","sources":["../../../../src/ota/storage/GitHubReleaseStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAExE,qBAAa,4BAA6B,YAAW,kBAAkB;IACnE,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,WAAW;IAKb,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAqDrD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAKtE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CAanF"}
|
|
@@ -104,8 +104,8 @@ export type OtaNetworkStrategy = {
|
|
|
104
104
|
wifiOnly?: boolean;
|
|
105
105
|
};
|
|
106
106
|
export type OtaConfig = {
|
|
107
|
-
/** Current app versionName (e.g. "1.0.0") */
|
|
108
|
-
appVersion
|
|
107
|
+
/** Current app versionName (e.g. "1.0.0"). If omitted, auto-detected from native app. */
|
|
108
|
+
appVersion?: string;
|
|
109
109
|
/** Initial version baked into the APK (usually 1) */
|
|
110
110
|
baseAppVersion: number;
|
|
111
111
|
/** Default patches if manifest fetch fails */
|
|
@@ -192,9 +192,13 @@ export type OtaState = {
|
|
|
192
192
|
pendingCount: number;
|
|
193
193
|
isChecking: boolean;
|
|
194
194
|
metrics: OtaMetrics | null;
|
|
195
|
+
/** True if a background update has been downloaded and prepared silently */
|
|
196
|
+
isUpdateReady: boolean;
|
|
195
197
|
applyUpdate: () => Promise<void>;
|
|
196
198
|
resetToFactory: () => Promise<void>;
|
|
197
199
|
markAsHealthy: () => Promise<void>;
|
|
198
200
|
checkUpdate: () => Promise<void>;
|
|
201
|
+
/** Reload the React Native JS bundle immediately to apply downloaded update */
|
|
202
|
+
reloadBundle: () => void;
|
|
199
203
|
};
|
|
200
204
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ota/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ota/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-bspatch",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "Premium OTA Update Solution for React Native using TurboModules and bsdiff",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -62,6 +62,8 @@
|
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"setup": "node ./tools/setup_project.js",
|
|
65
|
+
"bump-version": "node ./tools/bump_version.js",
|
|
66
|
+
"generate-keys": "node ./tools/generate_keys.js",
|
|
65
67
|
"typecheck": "tsc --noEmit",
|
|
66
68
|
"prepare": "bob build"
|
|
67
69
|
},
|
|
@@ -22,6 +22,10 @@ Pod::Spec.new do |s|
|
|
|
22
22
|
|
|
23
23
|
s.dependency "SSZipArchive"
|
|
24
24
|
|
|
25
|
+
s.pod_target_xcconfig = {
|
|
26
|
+
'OTHER_CFLAGS' => '$(inherited) -O3 -flto'
|
|
27
|
+
}
|
|
28
|
+
|
|
25
29
|
# Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
|
|
26
30
|
if respond_to?(:install_modules_dependencies, true)
|
|
27
31
|
install_modules_dependencies(s)
|
|
@@ -33,7 +37,8 @@ Pod::Spec.new do |s|
|
|
|
33
37
|
s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
|
|
34
38
|
s.pod_target_xcconfig = {
|
|
35
39
|
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
|
|
36
|
-
"
|
|
40
|
+
"OTHER_CFLAGS" => "$(inherited) -O3 -flto",
|
|
41
|
+
"OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -O3 -flto",
|
|
37
42
|
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
|
|
38
43
|
}
|
|
39
44
|
s.dependency "React-Codegen"
|
package/src/NativeBsPatch.ts
CHANGED
|
@@ -47,6 +47,23 @@ export interface Spec extends TurboModule {
|
|
|
47
47
|
* Log a message to the native console (NSLog on iOS)
|
|
48
48
|
*/
|
|
49
49
|
logNative(message: string): void;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Verify HMAC-SHA256 signature natively with streaming file I/O
|
|
53
|
+
* @param filePath Absolute path to the file to verify
|
|
54
|
+
* @param signature Base64-encoded expected signature
|
|
55
|
+
* @param publicKey Base64-encoded secret key
|
|
56
|
+
*/
|
|
57
|
+
verifySignature(
|
|
58
|
+
filePath: string,
|
|
59
|
+
signature: string,
|
|
60
|
+
publicKey: string,
|
|
61
|
+
): Promise<boolean>;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Returns the native app version (versionName on Android, CFBundleShortVersionString on iOS)
|
|
65
|
+
*/
|
|
66
|
+
getAppVersion(): Promise<string>;
|
|
50
67
|
}
|
|
51
68
|
|
|
52
69
|
export default TurboModuleRegistry.getEnforcing<Spec>('BsPatch');
|
package/src/ota/OtaProvider.tsx
CHANGED
|
@@ -59,9 +59,11 @@ export function OtaProvider({
|
|
|
59
59
|
const [metrics, setMetrics] = useState<OtaMetrics | null>(null);
|
|
60
60
|
const [patches, setPatches] = useState<OtaPatch[]>([]);
|
|
61
61
|
const [isInitialized, setIsInitialized] = useState<boolean>(false);
|
|
62
|
+
const [isUpdateReady, setIsUpdateReady] = useState<boolean>(false);
|
|
62
63
|
|
|
63
64
|
const appState = useRef(AppState.currentState);
|
|
64
65
|
const isCheckingRef = useRef(false);
|
|
66
|
+
const pendingReloadRef = useRef(false);
|
|
65
67
|
const bootstrapDone = useRef(false);
|
|
66
68
|
const progressRef = useRef(0);
|
|
67
69
|
const isDebugUpdateEnabled = !__DEV__ || config.allowDebugUpdates === true;
|
|
@@ -74,6 +76,22 @@ export function OtaProvider({
|
|
|
74
76
|
setProgress(nextProgress);
|
|
75
77
|
}, []);
|
|
76
78
|
|
|
79
|
+
const getEffectiveConfig = useCallback(async (): Promise<OtaConfig> => {
|
|
80
|
+
if (config.appVersion) return config;
|
|
81
|
+
try {
|
|
82
|
+
const nativeVer = await NativeBsPatch.getAppVersion();
|
|
83
|
+
if (!nativeVer) {
|
|
84
|
+
throw new Error('Native appVersion is empty');
|
|
85
|
+
}
|
|
86
|
+
return { ...config, appVersion: nativeVer };
|
|
87
|
+
} catch (e) {
|
|
88
|
+
throw new Error(
|
|
89
|
+
`[OtaProvider] Failed to auto-detect appVersion from native: ${(e as Error).message}. ` +
|
|
90
|
+
`Please set versionName (Android) / CFBundleShortVersionString (iOS), or provide config.appVersion explicitly.`
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
}, [config]);
|
|
94
|
+
|
|
77
95
|
/**
|
|
78
96
|
* Core apply update logic — separated so it can be mapped to button clicks
|
|
79
97
|
* OR called automatically by checkUpdates()
|
|
@@ -95,12 +113,13 @@ export function OtaProvider({
|
|
|
95
113
|
}
|
|
96
114
|
|
|
97
115
|
try {
|
|
116
|
+
const effectiveConfig = await getEffectiveConfig();
|
|
98
117
|
setStatus(OtaStatus.DOWNLOADING);
|
|
99
118
|
progressRef.current = 0;
|
|
100
119
|
setProgress(0);
|
|
101
120
|
await applyOtaPatchInternal(
|
|
102
121
|
directPatch,
|
|
103
|
-
|
|
122
|
+
effectiveConfig,
|
|
104
123
|
(s: OtaStatus, msg: string, m?: OtaMetrics) => {
|
|
105
124
|
setMessage(msg);
|
|
106
125
|
setStatus(s);
|
|
@@ -120,7 +139,7 @@ export function OtaProvider({
|
|
|
120
139
|
setMessage(`Update failed: ${(error as Error).message}`);
|
|
121
140
|
}
|
|
122
141
|
},
|
|
123
|
-
[
|
|
142
|
+
[getEffectiveConfig, setProgressIfChanged],
|
|
124
143
|
);
|
|
125
144
|
|
|
126
145
|
/**
|
|
@@ -142,6 +161,48 @@ export function OtaProvider({
|
|
|
142
161
|
patches,
|
|
143
162
|
]);
|
|
144
163
|
|
|
164
|
+
const downloadBackgroundUpdate = useCallback(
|
|
165
|
+
async (
|
|
166
|
+
patchList: OtaPatch[],
|
|
167
|
+
localV: number,
|
|
168
|
+
targetV: number,
|
|
169
|
+
) => {
|
|
170
|
+
const directPatch = patchList.find(
|
|
171
|
+
p => p.fromVersion === localV &&
|
|
172
|
+
p.toVersion === targetV &&
|
|
173
|
+
p.platform === Platform.OS,
|
|
174
|
+
);
|
|
175
|
+
if (!directPatch) return;
|
|
176
|
+
|
|
177
|
+
try {
|
|
178
|
+
const effectiveConfig = await getEffectiveConfig();
|
|
179
|
+
await applyOtaPatchInternal(
|
|
180
|
+
directPatch,
|
|
181
|
+
effectiveConfig,
|
|
182
|
+
(s: OtaStatus, msg: string, m?: OtaMetrics) => {
|
|
183
|
+
if (s === OtaStatus.SUCCESS) {
|
|
184
|
+
setIsUpdateReady(true);
|
|
185
|
+
pendingReloadRef.current = true;
|
|
186
|
+
setStatus(OtaStatus.UP_TO_DATE);
|
|
187
|
+
setMessage(`Update V${targetV} ready for next launch`);
|
|
188
|
+
if (m) {
|
|
189
|
+
setMetrics(m);
|
|
190
|
+
initOtaAssetResolver(targetV);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
() => {}, // silent: background doesn't spam progress
|
|
195
|
+
{ autoReload: false }, // Do NOT reload immediately
|
|
196
|
+
);
|
|
197
|
+
} catch (e) {
|
|
198
|
+
if (__DEV__) {
|
|
199
|
+
console.warn('[OtaProvider] Silent background update failed:', e);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
[getEffectiveConfig],
|
|
204
|
+
);
|
|
205
|
+
|
|
145
206
|
/**
|
|
146
207
|
* Check for updates from the manifest.
|
|
147
208
|
* Uses a ref to guard against concurrent calls (avoids stale closure).
|
|
@@ -160,11 +221,12 @@ export function OtaProvider({
|
|
|
160
221
|
setStatus(OtaStatus.CHECKING);
|
|
161
222
|
setMessage('Checking for updates...');
|
|
162
223
|
|
|
163
|
-
const
|
|
224
|
+
const effectiveConfig = await getEffectiveConfig();
|
|
225
|
+
const log = createOtaLogger(effectiveConfig.onEvent);
|
|
164
226
|
log.emit(OtaEvent.CHECK_UPDATE);
|
|
165
227
|
|
|
166
228
|
try {
|
|
167
|
-
const remotePatches = await fetchOtaManifest(
|
|
229
|
+
const remotePatches = await fetchOtaManifest(effectiveConfig);
|
|
168
230
|
const metadata = await loadMetadata(config.baseAppVersion);
|
|
169
231
|
const localV = metadata.currentVersion;
|
|
170
232
|
console.log('[OtaProvider] checkUpdates | localV:', localV, 'remotePatches count:', remotePatches.length);
|
|
@@ -210,24 +272,7 @@ export function OtaProvider({
|
|
|
210
272
|
isCheckingRef.current = false;
|
|
211
273
|
setIsChecking(false);
|
|
212
274
|
}
|
|
213
|
-
}, [config, executeApplyUpdate, isDebugUpdateEnabled]);
|
|
214
|
-
|
|
215
|
-
const downloadBackgroundUpdate = async (
|
|
216
|
-
patchList: OtaPatch[],
|
|
217
|
-
localV: number,
|
|
218
|
-
targetV: number,
|
|
219
|
-
) => {
|
|
220
|
-
const directPatch = patchList.find(
|
|
221
|
-
p => p.fromVersion === localV && p.toVersion === targetV,
|
|
222
|
-
);
|
|
223
|
-
if (!directPatch) return;
|
|
224
|
-
|
|
225
|
-
console.warn(
|
|
226
|
-
'[OtaProvider] BACKGROUND_DOWNLOAD mode is not yet implemented. ' +
|
|
227
|
-
'Patches were found but no download occurred. ' +
|
|
228
|
-
'Use MANUAL or ON_APP_START mode for now.',
|
|
229
|
-
);
|
|
230
|
-
};
|
|
275
|
+
}, [config, executeApplyUpdate, isDebugUpdateEnabled, downloadBackgroundUpdate, getEffectiveConfig]);
|
|
231
276
|
|
|
232
277
|
/**
|
|
233
278
|
* Bootstrap: runs once on mount.
|
|
@@ -301,12 +346,22 @@ export function OtaProvider({
|
|
|
301
346
|
}, []);
|
|
302
347
|
|
|
303
348
|
/**
|
|
304
|
-
* AppState listener for ON_APP_FOREGROUND mode
|
|
349
|
+
* AppState listener for ON_APP_FOREGROUND mode and silent background reload
|
|
305
350
|
*/
|
|
306
351
|
useEffect(() => {
|
|
307
352
|
const subscription = AppState.addEventListener(
|
|
308
353
|
'change',
|
|
309
354
|
(nextAppState: AppStateStatus) => {
|
|
355
|
+
// When going into background: if update is downloaded and ready, reload bundle silently
|
|
356
|
+
if (
|
|
357
|
+
appState.current === 'active' &&
|
|
358
|
+
nextAppState.match(/inactive|background/) &&
|
|
359
|
+
pendingReloadRef.current
|
|
360
|
+
) {
|
|
361
|
+
pendingReloadRef.current = false;
|
|
362
|
+
NativeBsPatch.reloadBundle();
|
|
363
|
+
}
|
|
364
|
+
|
|
310
365
|
if (
|
|
311
366
|
appState.current.match(/inactive|background/) &&
|
|
312
367
|
nextAppState === 'active' &&
|
|
@@ -363,10 +418,12 @@ export function OtaProvider({
|
|
|
363
418
|
pendingCount,
|
|
364
419
|
isChecking,
|
|
365
420
|
metrics,
|
|
421
|
+
isUpdateReady,
|
|
366
422
|
applyUpdate,
|
|
367
423
|
resetToFactory,
|
|
368
424
|
markAsHealthy,
|
|
369
425
|
checkUpdate: checkUpdates,
|
|
426
|
+
reloadBundle: () => NativeBsPatch.reloadBundle(),
|
|
370
427
|
};
|
|
371
428
|
|
|
372
429
|
// Logic to determine if we should block the UI
|
package/src/ota/otaCore.ts
CHANGED
|
@@ -129,18 +129,21 @@ export const verifySignature = async (
|
|
|
129
129
|
): Promise<boolean> => {
|
|
130
130
|
if (!signature || !publicKey) return true; // Skip if not configured
|
|
131
131
|
try {
|
|
132
|
-
//
|
|
133
|
-
|
|
132
|
+
// Fast-path: use Native streaming HMAC-SHA256 (avoids Base64 conversion and JS thread blocking)
|
|
133
|
+
if (typeof NativeBsPatch.verifySignature === 'function') {
|
|
134
|
+
const isValid = await NativeBsPatch.verifySignature(filePath, signature, publicKey);
|
|
135
|
+
if (!isValid && __DEV__) {
|
|
136
|
+
console.warn('[otaCore] Signature mismatch');
|
|
137
|
+
}
|
|
138
|
+
return isValid;
|
|
139
|
+
}
|
|
134
140
|
|
|
135
|
-
//
|
|
141
|
+
// Fallback to JS CryptoJS if native module is running an older binary
|
|
142
|
+
const fileData = await ReactNativeBlobUtil.fs.readFile(filePath, 'base64');
|
|
136
143
|
const fileWords = CryptoJS.enc.Base64.parse(fileData);
|
|
137
144
|
const keyWords = CryptoJS.enc.Base64.parse(publicKey);
|
|
138
145
|
const signatureWords = CryptoJS.enc.Base64.parse(signature);
|
|
139
|
-
|
|
140
|
-
// Compute HMAC
|
|
141
146
|
const hmac = CryptoJS.HmacSHA256(fileWords, keyWords);
|
|
142
|
-
|
|
143
|
-
// Compare computed HMAC with provided signature
|
|
144
147
|
const isValid = hmac.toString(CryptoJS.enc.Base64) === signatureWords.toString(CryptoJS.enc.Base64);
|
|
145
148
|
|
|
146
149
|
if (!isValid && __DEV__) {
|
|
@@ -507,6 +510,7 @@ export const applyOtaPatchInternal = async (
|
|
|
507
510
|
metrics?: OtaMetrics,
|
|
508
511
|
) => void,
|
|
509
512
|
onProgress: (percent: number) => void,
|
|
513
|
+
options: { autoReload?: boolean } = { autoReload: true },
|
|
510
514
|
) => {
|
|
511
515
|
if (__DEV__ && config.allowDebugUpdates !== true) {
|
|
512
516
|
onStatus(
|
|
@@ -531,13 +535,26 @@ export const applyOtaPatchInternal = async (
|
|
|
531
535
|
try {
|
|
532
536
|
// ── Step 1: Version Compatibility ──
|
|
533
537
|
if (patch.minAppVersion) {
|
|
534
|
-
|
|
538
|
+
let currentAppVer = config.appVersion;
|
|
539
|
+
if (!currentAppVer && typeof NativeBsPatch.getAppVersion === 'function') {
|
|
540
|
+
try {
|
|
541
|
+
currentAppVer = await NativeBsPatch.getAppVersion();
|
|
542
|
+
} catch {
|
|
543
|
+
currentAppVer = undefined;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
if (!currentAppVer) {
|
|
547
|
+
throw new Error(
|
|
548
|
+
`[otaCore] Cannot verify minAppVersion: Native App Version could not be determined.`,
|
|
549
|
+
);
|
|
550
|
+
}
|
|
551
|
+
if (!semverGte(currentAppVer, patch.minAppVersion)) {
|
|
535
552
|
log.emit(OtaEvent.VERSION_INCOMPATIBLE, {
|
|
536
|
-
message: `App ${
|
|
553
|
+
message: `App ${currentAppVer} < required ${patch.minAppVersion}`,
|
|
537
554
|
version: patch.toVersion,
|
|
538
555
|
});
|
|
539
556
|
throw new Error(
|
|
540
|
-
`Native app ${
|
|
557
|
+
`Native app ${currentAppVer} is too old. Update to ${patch.minAppVersion}+ first.`,
|
|
541
558
|
);
|
|
542
559
|
}
|
|
543
560
|
}
|
|
@@ -848,17 +865,23 @@ export const applyOtaPatchInternal = async (
|
|
|
848
865
|
});
|
|
849
866
|
|
|
850
867
|
// ── Step 11: Reload ──
|
|
851
|
-
//
|
|
852
|
-
// and JS will NOT run again before restart. Native OtaBundleResolver sets
|
|
853
|
-
// lastLaunchSuccessful=false before loading the new bundle. Without this call,
|
|
854
|
-
// the next cold boot sees false → rollback to previous version.
|
|
868
|
+
// Mark healthy BEFORE reload — reloadBundle() calls Runtime.exit(0)
|
|
855
869
|
NativeBsPatch.markAsHealthy();
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
870
|
+
|
|
871
|
+
if (options.autoReload !== false) {
|
|
872
|
+
if (__DEV__) {
|
|
873
|
+
console.log(
|
|
874
|
+
`[otaCore] V${patch.toVersion} marked healthy — reloading.`,
|
|
875
|
+
);
|
|
876
|
+
}
|
|
877
|
+
NativeBsPatch.reloadBundle();
|
|
878
|
+
} else {
|
|
879
|
+
if (__DEV__) {
|
|
880
|
+
console.log(
|
|
881
|
+
`[otaCore] V${patch.toVersion} prepared silently in background — will apply on next launch.`,
|
|
882
|
+
);
|
|
883
|
+
}
|
|
860
884
|
}
|
|
861
|
-
NativeBsPatch.reloadBundle();
|
|
862
885
|
} catch (error) {
|
|
863
886
|
if (__DEV__) {
|
|
864
887
|
console.error('[otaCore] Pipeline failed:', error);
|
|
@@ -952,11 +975,18 @@ export const applyOtaPatchInternal = async (
|
|
|
952
975
|
);
|
|
953
976
|
}
|
|
954
977
|
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
978
|
+
if (options.autoReload !== false) {
|
|
979
|
+
onStatus(
|
|
980
|
+
OtaStatus.SUCCESS,
|
|
981
|
+
`Fallback successful! Reloading...`,
|
|
982
|
+
);
|
|
983
|
+
NativeBsPatch.reloadBundle();
|
|
984
|
+
} else {
|
|
985
|
+
onStatus(
|
|
986
|
+
OtaStatus.SUCCESS,
|
|
987
|
+
`Fallback bundle prepared silently in background.`,
|
|
988
|
+
);
|
|
989
|
+
}
|
|
960
990
|
return;
|
|
961
991
|
} catch (fallbackError) {
|
|
962
992
|
if (__DEV__) {
|