react-native-bspatch 1.1.4 → 2.0.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/README.md +22 -32
- package/android/src/main/java/vn/reactnativebspatch/BsPatchModule.kt +15 -102
- package/android/src/main/java/vn/reactnativebspatch/OtaBundleResolver.kt +21 -1
- package/cpp/bsdiff/bspatch.c +1 -0
- package/ios/OtaBundleResolver.swift +16 -1
- package/ios/RNBsPatch.mm +61 -154
- package/lib/commonjs/NativeBsPatch.js.map +1 -1
- package/lib/commonjs/index.js +4 -4
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/ota/OtaProvider.js +26 -22
- package/lib/commonjs/ota/OtaProvider.js.map +1 -1
- package/lib/commonjs/ota/otaAssetResolver.js +8 -2
- package/lib/commonjs/ota/otaAssetResolver.js.map +1 -1
- package/lib/commonjs/ota/otaCore.js +89 -141
- package/lib/commonjs/ota/otaCore.js.map +1 -1
- package/lib/commonjs/ota/otaLogger.js +0 -2
- package/lib/commonjs/ota/otaLogger.js.map +1 -1
- package/lib/commonjs/ota/otaMetadata.js +18 -7
- package/lib/commonjs/ota/otaMetadata.js.map +1 -1
- package/lib/commonjs/ota/storage/GitHubRawStorage.js +3 -1
- package/lib/commonjs/ota/storage/GitHubRawStorage.js.map +1 -1
- package/lib/commonjs/ota/types.js +1 -10
- package/lib/commonjs/ota/types.js.map +1 -1
- package/lib/module/NativeBsPatch.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/ota/OtaProvider.js +26 -22
- package/lib/module/ota/OtaProvider.js.map +1 -1
- package/lib/module/ota/otaAssetResolver.js +8 -2
- package/lib/module/ota/otaAssetResolver.js.map +1 -1
- package/lib/module/ota/otaCore.js +88 -139
- package/lib/module/ota/otaCore.js.map +1 -1
- package/lib/module/ota/otaLogger.js +0 -2
- package/lib/module/ota/otaLogger.js.map +1 -1
- package/lib/module/ota/otaMetadata.js +18 -7
- package/lib/module/ota/otaMetadata.js.map +1 -1
- package/lib/module/ota/storage/GitHubRawStorage.js +3 -1
- package/lib/module/ota/storage/GitHubRawStorage.js.map +1 -1
- package/lib/module/ota/types.js +0 -9
- package/lib/module/ota/types.js.map +1 -1
- package/lib/typescript/NativeBsPatch.d.ts +3 -15
- package/lib/typescript/NativeBsPatch.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/ota/OtaProvider.d.ts.map +1 -1
- package/lib/typescript/ota/otaAssetResolver.d.ts.map +1 -1
- package/lib/typescript/ota/otaCore.d.ts +5 -42
- package/lib/typescript/ota/otaCore.d.ts.map +1 -1
- package/lib/typescript/ota/otaLogger.d.ts +1 -3
- package/lib/typescript/ota/otaLogger.d.ts.map +1 -1
- package/lib/typescript/ota/otaMetadata.d.ts +2 -2
- package/lib/typescript/ota/otaMetadata.d.ts.map +1 -1
- package/lib/typescript/ota/types.d.ts +18 -54
- package/lib/typescript/ota/types.d.ts.map +1 -1
- package/package.json +3 -6
- package/react-native-bspatch.podspec +0 -1
- package/src/NativeBsPatch.ts +3 -16
- package/src/index.ts +1 -1
- package/src/ota/OtaProvider.tsx +24 -23
- package/src/ota/otaAssetResolver.ts +5 -2
- package/src/ota/otaCore.ts +118 -176
- package/src/ota/otaLogger.ts +0 -2
- package/src/ota/otaMetadata.ts +18 -8
- package/src/ota/storage/GitHubRawStorage.ts +1 -1
- package/src/ota/types.ts +18 -57
- package/tools/build_ota.sh +101 -174
- package/tools/setup_project.js +33 -14
- package/tools/update_registry.js +24 -28
- package/tools/{upload_ota_custom.sh → upload_ota.sh} +33 -114
- package/lib/commonjs/crypto-js.d.js +0 -2
- package/lib/commonjs/crypto-js.d.js.map +0 -1
- package/lib/commonjs/ota/storage/CustomStorage.js +0 -160
- package/lib/commonjs/ota/storage/CustomStorage.js.map +0 -1
- package/lib/commonjs/ota/storage/GitHubReleaseStorage.js +0 -99
- package/lib/commonjs/ota/storage/GitHubReleaseStorage.js.map +0 -1
- package/lib/module/crypto-js.d.js +0 -2
- package/lib/module/crypto-js.d.js.map +0 -1
- package/lib/module/ota/storage/CustomStorage.js +0 -154
- package/lib/module/ota/storage/CustomStorage.js.map +0 -1
- package/lib/module/ota/storage/GitHubReleaseStorage.js +0 -93
- package/lib/module/ota/storage/GitHubReleaseStorage.js.map +0 -1
- package/lib/typescript/ota/storage/CustomStorage.d.ts +0 -12
- package/lib/typescript/ota/storage/CustomStorage.d.ts.map +0 -1
- package/lib/typescript/ota/storage/GitHubReleaseStorage.d.ts +0 -20
- package/lib/typescript/ota/storage/GitHubReleaseStorage.d.ts.map +0 -1
- package/src/crypto-js.d.ts +0 -1
- package/src/ota/storage/CustomStorage.ts +0 -166
- package/src/ota/storage/GitHubReleaseStorage.ts +0 -103
- package/tools/bsdiff +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","ReactNativeBlobUtil","OTA_DIR","fs","dirs","DocumentDir","METADATA_PATH","saveLock","Promise","resolve","ensureOtaDir","exists","mkdir","loadMetadata","defaultVersion","
|
|
1
|
+
{"version":3,"names":["Platform","ReactNativeBlobUtil","OTA_DIR","fs","dirs","DocumentDir","METADATA_PATH","METADATA_TMP_PATH","saveLock","Promise","resolve","ensureOtaDir","exists","mkdir","loadMetadata","defaultVersion","path","JSON","parse","readFile","e","console","warn","currentVersion","previousVersions","rollbackCount","lastLaunchSuccessful","saveMetadata","metadata","prevLock","settleFn","writeFile","stringify","unlink","mv","error","Error","message","MAX_VERSION_HISTORY","registerNewVersion","newVersion","appVersion","versions","uniquePrevious","Array","from","Set","filter","v","slice","cleanupOldVersions","baseVersion","items","ls","retainedVersions","item","versionMatch","match","ver","parseInt","has","dirPath","catch","__DEV__","log","endsWith","markHealthy","updated","getBundlePath","version","filename","select","android","ios","default"],"sourceRoot":"../../../src","sources":["ota/otaMetadata.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -42,7 +42,9 @@ export class GitHubRawStorageProvider {
|
|
|
42
42
|
// Cache-bust: registry is mutable; must always fetch the latest version
|
|
43
43
|
const registryUrl = bustCache(`${normalizedBaseUrl}/${baseFolder}/ota_registry.json`);
|
|
44
44
|
try {
|
|
45
|
-
const res = await ReactNativeBlobUtil.
|
|
45
|
+
const res = await ReactNativeBlobUtil.config({
|
|
46
|
+
timeout: 15000
|
|
47
|
+
}).fetch('GET', registryUrl, NO_CACHE_HEADERS);
|
|
46
48
|
if (res.respInfo.status !== 200) {
|
|
47
49
|
throw new Error(`Registry fetch failed with status ${res.respInfo.status}`);
|
|
48
50
|
}
|
|
@@ -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","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":";;AAAA,SAASA,QAAQ,QAAQ,cAAc;AACvC,OAAOC,mBAAmB,MAAM,wBAAwB;AAGxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAMC,gBAAgB,GAAG;EAAE,eAAe,EAAE;AAAW,CAAC;;AAExD;AACA,MAAMC,SAAS,GAAIC,GAAW,IAC1B,GAAGA,GAAG,OAAOC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE;AAE7B,MAAMC,gBAAgB,GAAIC,OAAe,IAAa;EAClD,MAAMC,KAAK,GAAGD,OAAO,CAACE,WAAW,CAAC,CAAC;EACnC,IAAID,KAAK,KAAK,KAAK,EAAE,OAAO,aAAa;EACzC,IAAIA,KAAK,KAAK,MAAM,EAAE,OAAO,YAAY;EACzC,OAAOA,KAAK;AAChB,CAAC;AAED,OAAO,MAAME,wBAAwB,CAA+B;EAChE,MAAMC,aAAaA,CAACC,MAAiB,EAAuB;IACxD,IAAI,CAACA,MAAM,CAACC,YAAY,EAAE,OAAOD,MAAM,CAACE,cAAc,IAAI,EAAE;IAE5D,MAAM;MAAEC,OAAO;MAAER,OAAO;MAAES,UAAU,GAAG;IAAM,CAAC,GAAGJ,MAAM,CAACC,YAAY;IACpE,MAAMI,WAAW,GAAGX,gBAAgB,CAACC,OAAO,CAAC;IAC7C,MAAMW,iBAAiB,GAAGH,OAAO,CAACI,QAAQ,CAAC,GAAG,CAAC,GACzCJ,OAAO,CAACK,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACpBL,OAAO;IACb;IACA,MAAMM,WAAW,GAAGnB,SAAS,CACzB,GAAGgB,iBAAiB,IAAIF,UAAU,oBACtC,CAAC;IAED,IAAI;MACA,MAAMM,GAAG,GAAG,MAAMtB,mBAAmB,
|
|
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","timeout","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":[]}
|
package/lib/module/ota/types.js
CHANGED
|
@@ -11,15 +11,6 @@ export let OtaUpdateMode = /*#__PURE__*/function (OtaUpdateMode) {
|
|
|
11
11
|
OtaUpdateMode["BACKGROUND_DOWNLOAD"] = "BACKGROUND_DOWNLOAD";
|
|
12
12
|
return OtaUpdateMode;
|
|
13
13
|
}({});
|
|
14
|
-
export let OtaStorageType = /*#__PURE__*/function (OtaStorageType) {
|
|
15
|
-
/** Custom storage server (primary) */
|
|
16
|
-
OtaStorageType["CUSTOM"] = "CUSTOM";
|
|
17
|
-
/** GitHub Releases — public or token-authenticated */
|
|
18
|
-
OtaStorageType["GITHUB"] = "GITHUB";
|
|
19
|
-
/** GitHub Raw repository storage */
|
|
20
|
-
OtaStorageType["GITHUB_RAW"] = "GITHUB_RAW";
|
|
21
|
-
return OtaStorageType;
|
|
22
|
-
}({});
|
|
23
14
|
|
|
24
15
|
/**
|
|
25
16
|
* A single content-addressed asset from the OTA asset store.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["OtaUpdateMode","
|
|
1
|
+
{"version":3,"names":["OtaUpdateMode","OtaStatus"],"sourceRoot":"../../../src","sources":["ota/types.ts"],"mappings":";;AAAA;AACA;AACA;;AAqBA,WAAYA,aAAa,0BAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAA,OAAbA,aAAa;AAAA;;AA4CzB;AACA;AACA;;AAsFA,WAAYC,SAAS,0BAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAATA,SAAS;EAAA,OAATA,SAAS;AAAA","ignoreList":[]}
|
|
@@ -8,19 +8,7 @@ export interface Spec extends TurboModule {
|
|
|
8
8
|
* @param callback Promise-like callback receiving true if successful, or false on error.
|
|
9
9
|
*/
|
|
10
10
|
applyPatch(oldPath: string, newPath: string, patchPath: string): Promise<boolean>;
|
|
11
|
-
/**
|
|
12
|
-
* Unzip a file to a target directory
|
|
13
|
-
* @param source The absolute path to the zip file
|
|
14
|
-
* @param targetDir The absolute path to the destination directory
|
|
15
|
-
*/
|
|
16
|
-
unzip(source: string, targetDir: string): Promise<boolean>;
|
|
17
11
|
extractBundleFromAssets(assetName: string, destPath: string): Promise<boolean>;
|
|
18
|
-
/**
|
|
19
|
-
* Decompress a gzip file to the destination path.
|
|
20
|
-
* @param sourcePath Absolute path to the .gz file
|
|
21
|
-
* @param destPath Absolute path to write the decompressed output
|
|
22
|
-
*/
|
|
23
|
-
decompressGzip(sourcePath: string, destPath: string): Promise<boolean>;
|
|
24
12
|
/**
|
|
25
13
|
* Mark the current boot as healthy to prevent rollback
|
|
26
14
|
*/
|
|
@@ -34,10 +22,10 @@ export interface Spec extends TurboModule {
|
|
|
34
22
|
*/
|
|
35
23
|
logNative(message: string): void;
|
|
36
24
|
/**
|
|
37
|
-
* Verify
|
|
25
|
+
* Verify an RSA/ECDSA SHA-256 signature natively with streaming file I/O
|
|
38
26
|
* @param filePath Absolute path to the file to verify
|
|
39
|
-
* @param signature Base64-encoded
|
|
40
|
-
* @param publicKey
|
|
27
|
+
* @param signature Base64-encoded signature
|
|
28
|
+
* @param publicKey SPKI public key (PEM or base64)
|
|
41
29
|
*/
|
|
42
30
|
verifySignature(filePath: string, signature: string, publicKey: string): Promise<boolean>;
|
|
43
31
|
/**
|
|
@@ -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
|
|
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,uBAAuB,CACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;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"}
|
|
@@ -5,7 +5,7 @@ export * from './ota/otaLogger';
|
|
|
5
5
|
export * from './ota/OtaProvider';
|
|
6
6
|
export * from './ota/types';
|
|
7
7
|
export { initOtaAssetResolver, resetOtaAssetResolver } from './ota/otaAssetResolver';
|
|
8
|
-
export {
|
|
8
|
+
export { GitHubRawStorageProvider } from './ota/storage/GitHubRawStorage';
|
|
9
9
|
declare const _default: {
|
|
10
10
|
applyPatch: typeof applyPatch;
|
|
11
11
|
reloadBundle: typeof reloadBundle;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CACxB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CACxB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;;;;;;AAE1E,wBAIE"}
|
|
@@ -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,qBAkaA;AAED,wBAAgB,MAAM,aAMrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otaAssetResolver.d.ts","sourceRoot":"","sources":["../../../src/ota/otaAssetResolver.ts"],"names":[],"mappings":"AAmCA;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,IAAI,CAsCxE,CAAC;
|
|
1
|
+
{"version":3,"file":"otaAssetResolver.d.ts","sourceRoot":"","sources":["../../../src/ota/otaAssetResolver.ts"],"names":[],"mappings":"AAmCA;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,IAAI,CAsCxE,CAAC;AAuGF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,QAAO,IAMxC,CAAC"}
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
* Responsibilities:
|
|
5
5
|
* - Download patches with retry
|
|
6
6
|
* - Verify integrity (SHA-256 hash)
|
|
7
|
-
* - Verify security (
|
|
8
|
-
* - Handle gzip decompression
|
|
7
|
+
* - Verify security (RSA/ECDSA signature)
|
|
9
8
|
* - Apply binary patch (bsdiff)
|
|
10
9
|
* - Atomic bundle swap
|
|
11
10
|
* - Full bundle fallback on failure
|
|
@@ -33,27 +32,6 @@ export declare const semverGte: (a: string, b: string) => boolean;
|
|
|
33
32
|
* @returns `true` if hash matches or `expectedHash` is undefined, `false` otherwise
|
|
34
33
|
*/
|
|
35
34
|
export declare const verifyHash: (path: string, expectedHash?: string) => Promise<boolean>;
|
|
36
|
-
/**
|
|
37
|
-
* Verify HMAC-SHA256 signature of a file.
|
|
38
|
-
*
|
|
39
|
-
* Uses CryptoJS to verify that the signature matches the file content
|
|
40
|
-
* using the provided HMAC key.
|
|
41
|
-
*
|
|
42
|
-
* @param filePath - Path to the file to verify
|
|
43
|
-
* @param signature - Base64-encoded HMAC signature to verify against
|
|
44
|
-
* @param publicKey - Base64-encoded HMAC key
|
|
45
|
-
* @returns true if signature is valid, false otherwise
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* // Server-side (Node.js) - generate signature:
|
|
49
|
-
* const crypto = require('crypto');
|
|
50
|
-
* const key = crypto.randomBytes(32).toString('base64');
|
|
51
|
-
* const fileBuffer = fs.readFileSync('bundle.patch');
|
|
52
|
-
* const signature = crypto.createHmac('sha256', Buffer.from(key, 'base64'))
|
|
53
|
-
* .update(fileBuffer)
|
|
54
|
-
* .digest('base64');
|
|
55
|
-
*/
|
|
56
|
-
export declare const verifySignature: (filePath: string, signature?: string, publicKey?: string) => Promise<boolean>;
|
|
57
35
|
/**
|
|
58
36
|
* Fetches the list of available OTA patches from the remote manifest.
|
|
59
37
|
*
|
|
@@ -87,25 +65,10 @@ export declare const getLocalAssetPath: (hash: string, ext: string) => string;
|
|
|
87
65
|
* @returns Absolute path to the patch file
|
|
88
66
|
*/
|
|
89
67
|
export declare const getLocalPatchPath: (patch: OtaPatch, docDir: string) => string;
|
|
90
|
-
/**
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
* Pipeline:
|
|
94
|
-
* 1. Version compatibility check
|
|
95
|
-
* 2. Download patch (with retry)
|
|
96
|
-
* 3. Decompress (if .gz)
|
|
97
|
-
* 4. Security signature check
|
|
98
|
-
* 5. Resolve source bundle
|
|
99
|
-
* 6. Verify source hash
|
|
100
|
-
* 7. Apply binary patch
|
|
101
|
-
* 8. Verify result hash
|
|
102
|
-
* 9. Atomic commit (mv)
|
|
103
|
-
* 10. Update metadata
|
|
104
|
-
* 11. Reload bundle
|
|
105
|
-
*
|
|
106
|
-
* On failure → fallback to full bundle download if URL available.
|
|
107
|
-
*/
|
|
108
|
-
export declare const applyOtaPatchInternal: (patch: OtaPatch, config: OtaConfig, onStatus: (status: OtaStatus, message: string, metrics?: OtaMetrics) => void, onProgress: (percent: number) => void, options?: {
|
|
68
|
+
/** Runs the pipeline below; rejects if another update is already running. */
|
|
69
|
+
export declare const applyOtaPatchInternal: typeof runUpdatePipeline;
|
|
70
|
+
declare const runUpdatePipeline: (patch: OtaPatch, config: OtaConfig, onStatus: (status: OtaStatus, message: string, metrics?: OtaMetrics) => void, onProgress: (percent: number) => void, options?: {
|
|
109
71
|
autoReload?: boolean;
|
|
110
72
|
}) => Promise<void>;
|
|
73
|
+
export {};
|
|
111
74
|
//# sourceMappingURL=otaCore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otaCore.d.ts","sourceRoot":"","sources":["../../../src/ota/otaCore.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"otaCore.d.ts","sourceRoot":"","sources":["../../../src/ota/otaCore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH,OAAO,EACH,SAAS,EAET,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,QAAQ,EAEhB,MAAM,SAAS,CAAC;AAcjB;;;;;;;;;;;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;AAwFF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GACzB,QAAQ,SAAS,KAClB,OAAO,CAAC,QAAQ,EAAE,CAWpB,CAAC;AAiMF;;;;;;;;;;;;;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,MACL,CAAC;AAuBhE,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,EAAE,OAAO,iBAU1C,CAAC;AAEF,QAAA,MAAM,iBAAiB,GACnB,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,kBAoe3D,CAAC"}
|
|
@@ -20,9 +20,7 @@ export declare enum OtaEvent {
|
|
|
20
20
|
MARK_HEALTHY = "mark_healthy",
|
|
21
21
|
RESET_FACTORY = "reset_factory",
|
|
22
22
|
VERSION_INCOMPATIBLE = "version_incompatible",
|
|
23
|
-
SIGNATURE_INVALID = "signature_invalid"
|
|
24
|
-
DECOMPRESS_START = "decompress_start",
|
|
25
|
-
DECOMPRESS_SUCCESS = "decompress_success"
|
|
23
|
+
SIGNATURE_INVALID = "signature_invalid"
|
|
26
24
|
}
|
|
27
25
|
export type OtaLogEntry = {
|
|
28
26
|
event: OtaEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otaLogger.d.ts","sourceRoot":"","sources":["../../../src/ota/otaLogger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,oBAAY,QAAQ;IAClB,YAAY,iBAAiB;IAC7B,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,aAAa,kBAAkB;IAC/B,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;IAC/B,UAAU,eAAe;IACzB,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,aAAa,kBAAkB;IAC/B,QAAQ,aAAa;IACrB,oBAAoB,yBAAyB;IAC7C,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;IAC/B,oBAAoB,yBAAyB;IAC7C,iBAAiB,sBAAsB;
|
|
1
|
+
{"version":3,"file":"otaLogger.d.ts","sourceRoot":"","sources":["../../../src/ota/otaLogger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,oBAAY,QAAQ;IAClB,YAAY,iBAAiB;IAC7B,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,aAAa,kBAAkB;IAC/B,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;IAC/B,UAAU,eAAe;IACzB,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;IAC3C,aAAa,kBAAkB;IAC/B,QAAQ,aAAa;IACrB,oBAAoB,yBAAyB;IAC7C,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;IAC/B,oBAAoB,yBAAyB;IAC7C,iBAAiB,sBAAsB;CACxC;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,UAAU,gBAAgB;kBAE/C,QAAQ,YACL,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,WAAW,CAAC;CAsBrD,CAAC"}
|
|
@@ -26,7 +26,7 @@ export declare const MAX_VERSION_HISTORY = 3;
|
|
|
26
26
|
* @param newVersion - The newly applied OTA version.
|
|
27
27
|
* @returns Updated metadata object.
|
|
28
28
|
*/
|
|
29
|
-
export declare const registerNewVersion: (metadata: OtaMetadata, newVersion: number) => OtaMetadata;
|
|
29
|
+
export declare const registerNewVersion: (metadata: OtaMetadata, newVersion: number, appVersion?: string) => OtaMetadata;
|
|
30
30
|
/**
|
|
31
31
|
* Scans the OTA directory and removes old version directories and leftover temporary files
|
|
32
32
|
* that are no longer referenced in the active metadata.
|
|
@@ -40,7 +40,7 @@ export declare const cleanupOldVersions: (metadata: OtaMetadata, baseVersion: nu
|
|
|
40
40
|
* @param defaultVersion - Base version for metadata lookup fallback.
|
|
41
41
|
* @returns The updated metadata.
|
|
42
42
|
*/
|
|
43
|
-
export declare const markHealthy: (defaultVersion: number) => Promise<OtaMetadata>;
|
|
43
|
+
export declare const markHealthy: (defaultVersion: number, appVersion?: string) => Promise<OtaMetadata>;
|
|
44
44
|
/**
|
|
45
45
|
* Resolves the absolute path to the JS bundle for a specific version.
|
|
46
46
|
*
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"otaMetadata.d.ts","sourceRoot":"","sources":["../../../src/ota/otaMetadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAStC;;GAEG;AACH,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,IAAI,CAIjD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACrB,gBAAgB,MAAM,KACvB,OAAO,CAAC,WAAW,CAkBrB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,WAAW,KAAG,OAAO,CAAC,IAAI,CAyBtE,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAC3B,UAAU,WAAW,EACrB,YAAY,MAAM,EAClB,aAAa,MAAM,KACpB,WAkBF,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,EACtB,aAAa,MAAM,KACpB,OAAO,CAAC,WAAW,CAerB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GACtB,SAAS,MAAM,EACf,aAAa,MAAM,KACpB,MAAM,GAAG,IAUX,CAAC"}
|
|
@@ -22,14 +22,6 @@ export declare enum OtaUpdateMode {
|
|
|
22
22
|
ON_APP_FOREGROUND = "ON_APP_FOREGROUND",
|
|
23
23
|
BACKGROUND_DOWNLOAD = "BACKGROUND_DOWNLOAD"
|
|
24
24
|
}
|
|
25
|
-
export declare enum OtaStorageType {
|
|
26
|
-
/** Custom storage server (primary) */
|
|
27
|
-
CUSTOM = "CUSTOM",
|
|
28
|
-
/** GitHub Releases — public or token-authenticated */
|
|
29
|
-
GITHUB = "GITHUB",
|
|
30
|
-
/** GitHub Raw repository storage */
|
|
31
|
-
GITHUB_RAW = "GITHUB_RAW"
|
|
32
|
-
}
|
|
33
25
|
export type OtaPatch = {
|
|
34
26
|
/** Unique ID: `v{from}-to-v{to}` */
|
|
35
27
|
id: string;
|
|
@@ -53,10 +45,10 @@ export type OtaPatch = {
|
|
|
53
45
|
minAppVersion?: string;
|
|
54
46
|
/** URL for full bundle download (fallback when patch fails) */
|
|
55
47
|
fullBundleUrl?: string;
|
|
56
|
-
/**
|
|
57
|
-
compressed?: boolean;
|
|
58
|
-
/** HMAC-SHA256 signature for security verification */
|
|
48
|
+
/** RSA/ECDSA SHA-256 signature (base64) of the patch file */
|
|
59
49
|
signature?: string;
|
|
50
|
+
/** RSA/ECDSA SHA-256 signature (base64) of the resulting bundle */
|
|
51
|
+
bundleSignature?: string;
|
|
60
52
|
/** Whether this update is mandatory */
|
|
61
53
|
mandatory?: boolean;
|
|
62
54
|
/** URL to the asset manifest JSON for this version */
|
|
@@ -90,6 +82,10 @@ export type OtaMetadata = {
|
|
|
90
82
|
previousVersions: number[];
|
|
91
83
|
rollbackCount: number;
|
|
92
84
|
lastLaunchSuccessful: boolean;
|
|
85
|
+
/** Native app version the OTA bundles were built for; native resolver drops OTA state when it changes */
|
|
86
|
+
appVersion?: string;
|
|
87
|
+
/** Versions that crashed on boot and were rolled back; never re-applied */
|
|
88
|
+
failedVersions?: number[];
|
|
93
89
|
};
|
|
94
90
|
export type OtaMetrics = {
|
|
95
91
|
patchSizeKB: number;
|
|
@@ -121,55 +117,23 @@ export type OtaConfig = {
|
|
|
121
117
|
network?: OtaNetworkStrategy;
|
|
122
118
|
/** Telemetry: structured event callback for analytics */
|
|
123
119
|
onEvent?: OtaEventCallback;
|
|
124
|
-
/**
|
|
120
|
+
/**
|
|
121
|
+
* SPKI public key (PEM or base64) for RSA/ECDSA signature verification.
|
|
122
|
+
* When set, patches and bundles without a valid signature are rejected.
|
|
123
|
+
*/
|
|
125
124
|
publicKey?: string;
|
|
126
|
-
/**
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
githubRelease?: {
|
|
132
|
-
/** Owner / repo in the format "owner/repo" */
|
|
133
|
-
repo: string;
|
|
134
|
-
/** Tag name of the release to fetch updates from */
|
|
135
|
-
tag: string;
|
|
136
|
-
/**
|
|
137
|
-
* Path inside the release where ota_registry.json lives.
|
|
138
|
-
* If your release contains the file at root, set to "ota_registry.json".
|
|
139
|
-
* If it's inside a folder "ota/", set to "ota/ota_registry.json".
|
|
140
|
-
*/
|
|
141
|
-
registryPath?: string;
|
|
142
|
-
/**
|
|
143
|
-
* Optional GitHub personal access token for private repos or higher rate limits.
|
|
144
|
-
* For public repos this is optional.
|
|
145
|
-
*/
|
|
146
|
-
token?: string;
|
|
147
|
-
/**
|
|
148
|
-
* Asset base URL for content-addressed assets.
|
|
149
|
-
* Supports CDN URLs (jsDelivr, GitHub raw) or a custom base.
|
|
150
|
-
* Example: "https://cdn.jsdelivr.net/gh/owner/repo@tag/assets"
|
|
151
|
-
*/
|
|
152
|
-
assetBaseUrl?: string;
|
|
153
|
-
};
|
|
154
|
-
/** Custom storage server configuration */
|
|
125
|
+
/**
|
|
126
|
+
* Static storage layout read by the default provider: `${baseUrl}/${baseFolder}/...`.
|
|
127
|
+
* Any static host/CDN serving the same layout works (e.g. a public bucket).
|
|
128
|
+
* Read-only and public: never put upload credentials here, they ship inside the app.
|
|
129
|
+
*/
|
|
155
130
|
customServer?: {
|
|
131
|
+
/** e.g. https://raw.githubusercontent.com/<owner>/<repo>/<branch> */
|
|
156
132
|
baseUrl: string;
|
|
157
|
-
username: string;
|
|
158
|
-
password: string;
|
|
159
133
|
channel: string;
|
|
160
134
|
baseFolder?: string;
|
|
161
|
-
useMinio?: boolean;
|
|
162
|
-
/** Override default API endpoints for non-standard servers */
|
|
163
|
-
endpoints?: {
|
|
164
|
-
/** Auth login endpoint (default: /public/authen/login) */
|
|
165
|
-
login?: string;
|
|
166
|
-
/** Generate download link endpoint (default: /api/minio/gen-download-link) */
|
|
167
|
-
genDownloadLink?: string;
|
|
168
|
-
/** Direct file download endpoint (default: /files/downloadStreamFile) */
|
|
169
|
-
downloadFile?: string;
|
|
170
|
-
};
|
|
171
135
|
};
|
|
172
|
-
/** Storage provider instance (optional, defaults to
|
|
136
|
+
/** Storage provider instance (optional, defaults to GitHubRawStorageProvider) */
|
|
173
137
|
storage?: OtaStorageProvider;
|
|
174
138
|
};
|
|
175
139
|
export declare enum OtaStatus {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ota/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IAC/B;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEtD;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvE;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9E;AAED,oBAAY,aAAa;IACrB,MAAM,WAAW;IACjB,YAAY,iBAAiB;IAC7B,iBAAiB,sBAAsB;IACvC,mBAAmB,wBAAwB;CAC9C;AAED,
|
|
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": "
|
|
3
|
+
"version": "2.0.0",
|
|
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",
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"LICENSE",
|
|
20
20
|
"!**/__tests__",
|
|
21
21
|
"!**/__fixtures__",
|
|
22
|
-
"!**/__mocks__"
|
|
22
|
+
"!**/__mocks__",
|
|
23
|
+
"!tools/bsdiff"
|
|
23
24
|
],
|
|
24
25
|
"keywords": [
|
|
25
26
|
"react-native",
|
|
@@ -41,9 +42,6 @@
|
|
|
41
42
|
"react-native": "*",
|
|
42
43
|
"react-native-blob-util": "*"
|
|
43
44
|
},
|
|
44
|
-
"dependencies": {
|
|
45
|
-
"crypto-js": "^4.2.0"
|
|
46
|
-
},
|
|
47
45
|
"repository": {
|
|
48
46
|
"type": "git",
|
|
49
47
|
"url": "git+https://github.com/BuiHung1612/react-native-bspatch.git"
|
|
@@ -68,7 +66,6 @@
|
|
|
68
66
|
"prepare": "bob build"
|
|
69
67
|
},
|
|
70
68
|
"devDependencies": {
|
|
71
|
-
"@types/crypto-js": "^4.2.2",
|
|
72
69
|
"@types/react": "^19.2.0",
|
|
73
70
|
"react-native-builder-bob": "^0.43.0",
|
|
74
71
|
"typescript": "^5.0.0"
|
package/src/NativeBsPatch.ts
CHANGED
|
@@ -15,24 +15,11 @@ export interface Spec extends TurboModule {
|
|
|
15
15
|
patchPath: string,
|
|
16
16
|
): Promise<boolean>;
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
* Unzip a file to a target directory
|
|
20
|
-
* @param source The absolute path to the zip file
|
|
21
|
-
* @param targetDir The absolute path to the destination directory
|
|
22
|
-
*/
|
|
23
|
-
unzip(source: string, targetDir: string): Promise<boolean>;
|
|
24
18
|
extractBundleFromAssets(
|
|
25
19
|
assetName: string,
|
|
26
20
|
destPath: string,
|
|
27
21
|
): Promise<boolean>;
|
|
28
22
|
|
|
29
|
-
/**
|
|
30
|
-
* Decompress a gzip file to the destination path.
|
|
31
|
-
* @param sourcePath Absolute path to the .gz file
|
|
32
|
-
* @param destPath Absolute path to write the decompressed output
|
|
33
|
-
*/
|
|
34
|
-
decompressGzip(sourcePath: string, destPath: string): Promise<boolean>;
|
|
35
|
-
|
|
36
23
|
/**
|
|
37
24
|
* Mark the current boot as healthy to prevent rollback
|
|
38
25
|
*/
|
|
@@ -49,10 +36,10 @@ export interface Spec extends TurboModule {
|
|
|
49
36
|
logNative(message: string): void;
|
|
50
37
|
|
|
51
38
|
/**
|
|
52
|
-
* Verify
|
|
39
|
+
* Verify an RSA/ECDSA SHA-256 signature natively with streaming file I/O
|
|
53
40
|
* @param filePath Absolute path to the file to verify
|
|
54
|
-
* @param signature Base64-encoded
|
|
55
|
-
* @param publicKey
|
|
41
|
+
* @param signature Base64-encoded signature
|
|
42
|
+
* @param publicKey SPKI public key (PEM or base64)
|
|
56
43
|
*/
|
|
57
44
|
verifySignature(
|
|
58
45
|
filePath: string,
|
package/src/index.ts
CHANGED
|
@@ -20,7 +20,7 @@ export * from './ota/otaLogger';
|
|
|
20
20
|
export * from './ota/OtaProvider';
|
|
21
21
|
export * from './ota/types';
|
|
22
22
|
export { initOtaAssetResolver, resetOtaAssetResolver } from './ota/otaAssetResolver';
|
|
23
|
-
export {
|
|
23
|
+
export { GitHubRawStorageProvider } from './ota/storage/GitHubRawStorage';
|
|
24
24
|
|
|
25
25
|
export default {
|
|
26
26
|
applyPatch,
|
package/src/ota/OtaProvider.tsx
CHANGED
|
@@ -102,7 +102,7 @@ export function OtaProvider({
|
|
|
102
102
|
const directPatch = patchList.find(
|
|
103
103
|
p => p.fromVersion === currentVer &&
|
|
104
104
|
p.toVersion === targetVer &&
|
|
105
|
-
p.platform === Platform.OS,
|
|
105
|
+
(!p.platform || p.platform === Platform.OS),
|
|
106
106
|
);
|
|
107
107
|
|
|
108
108
|
if (!directPatch) {
|
|
@@ -170,7 +170,7 @@ export function OtaProvider({
|
|
|
170
170
|
const directPatch = patchList.find(
|
|
171
171
|
p => p.fromVersion === localV &&
|
|
172
172
|
p.toVersion === targetV &&
|
|
173
|
-
p.platform === Platform.OS,
|
|
173
|
+
(!p.platform || p.platform === Platform.OS),
|
|
174
174
|
);
|
|
175
175
|
if (!directPatch) return;
|
|
176
176
|
|
|
@@ -221,17 +221,19 @@ export function OtaProvider({
|
|
|
221
221
|
setStatus(OtaStatus.CHECKING);
|
|
222
222
|
setMessage('Checking for updates...');
|
|
223
223
|
|
|
224
|
-
const effectiveConfig = await getEffectiveConfig();
|
|
225
|
-
const log = createOtaLogger(effectiveConfig.onEvent);
|
|
226
|
-
log.emit(OtaEvent.CHECK_UPDATE);
|
|
227
|
-
|
|
228
224
|
try {
|
|
225
|
+
const effectiveConfig = await getEffectiveConfig();
|
|
226
|
+
createOtaLogger(effectiveConfig.onEvent).emit(OtaEvent.CHECK_UPDATE);
|
|
229
227
|
const remotePatches = await fetchOtaManifest(effectiveConfig);
|
|
230
228
|
const metadata = await loadMetadata(config.baseAppVersion);
|
|
231
229
|
const localV = metadata.currentVersion;
|
|
232
230
|
console.log('[OtaProvider] checkUpdates | localV:', localV, 'remotePatches count:', remotePatches.length);
|
|
233
231
|
|
|
234
|
-
|
|
232
|
+
// Skip versions that crashed on boot and were rolled back by the native resolver
|
|
233
|
+
const failed = metadata.failedVersions ?? [];
|
|
234
|
+
const platformPatches = remotePatches.filter(
|
|
235
|
+
p => (!p.platform || p.platform === Platform.OS) && !failed.includes(p.toVersion),
|
|
236
|
+
);
|
|
235
237
|
console.log('[OtaProvider] platformPatches count:', platformPatches.length);
|
|
236
238
|
|
|
237
239
|
const maxV =
|
|
@@ -310,20 +312,6 @@ export function OtaProvider({
|
|
|
310
312
|
// We just mark bootstrap as done
|
|
311
313
|
bootstrapDone.current = true;
|
|
312
314
|
|
|
313
|
-
// Always mark as healthy after a successful JS bootstrap.
|
|
314
|
-
//
|
|
315
|
-
// The native OtaBundleResolver uses its own baseVersion (DEFAULT_BASE_VERSION=1),
|
|
316
|
-
// independent of the JS-side config.baseAppVersion. It marks
|
|
317
|
-
// lastLaunchSuccessful=false before loading ANY OTA bundle (even when
|
|
318
|
-
// JS baseAppVersion has been bumped to match currentVersion). If we only
|
|
319
|
-
// call markAsHealthy when currentVersion > JS baseAppVersion, we miss this
|
|
320
|
-
// case and the native layer will rollback on the very next cold boot.
|
|
321
|
-
//
|
|
322
|
-
// markAsHealthy() is safe to call unconditionally — it's a no-op when
|
|
323
|
-
// the metadata already has lastLaunchSuccessful=true.
|
|
324
|
-
console.log(`[OtaProvider] Marking V${metadata.currentVersion} as healthy`);
|
|
325
|
-
await markAsHealthy();
|
|
326
|
-
|
|
327
315
|
// Mode-based auto-check
|
|
328
316
|
const mode = config.updateMode ?? OtaUpdateMode.MANUAL;
|
|
329
317
|
if (
|
|
@@ -355,7 +343,8 @@ export function OtaProvider({
|
|
|
355
343
|
// When going into background: if update is downloaded and ready, reload bundle silently
|
|
356
344
|
if (
|
|
357
345
|
appState.current === 'active' &&
|
|
358
|
-
|
|
346
|
+
// Not 'inactive': iOS fires it for Control Center, calls, Face ID prompts
|
|
347
|
+
nextAppState === 'background' &&
|
|
359
348
|
pendingReloadRef.current
|
|
360
349
|
) {
|
|
361
350
|
pendingReloadRef.current = false;
|
|
@@ -384,7 +373,8 @@ export function OtaProvider({
|
|
|
384
373
|
const markAsHealthy = async () => {
|
|
385
374
|
const log = createOtaLogger(config.onEvent);
|
|
386
375
|
log.emit(OtaEvent.MARK_HEALTHY);
|
|
387
|
-
await
|
|
376
|
+
const { appVersion } = await getEffectiveConfig().catch(() => config);
|
|
377
|
+
await markHealthy(config.baseAppVersion, appVersion);
|
|
388
378
|
NativeBsPatch.markAsHealthy();
|
|
389
379
|
};
|
|
390
380
|
|
|
@@ -440,6 +430,17 @@ export function OtaProvider({
|
|
|
440
430
|
);
|
|
441
431
|
}, [useLoadingView, isInitialized, config.updateMode, status]);
|
|
442
432
|
|
|
433
|
+
// Mark healthy only after the app's own tree has committed its first render.
|
|
434
|
+
// This effect runs after all child effects, so a bundle that throws while
|
|
435
|
+
// rendering never gets here and the native resolver rolls it back next boot.
|
|
436
|
+
const healthyMarkedRef = useRef(false);
|
|
437
|
+
useEffect(() => {
|
|
438
|
+
if (isBlocking || !isInitialized || healthyMarkedRef.current) return;
|
|
439
|
+
healthyMarkedRef.current = true;
|
|
440
|
+
markAsHealthy().catch(e => console.warn('[OtaProvider] markAsHealthy failed:', e));
|
|
441
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
442
|
+
}, [isBlocking, isInitialized]);
|
|
443
|
+
|
|
443
444
|
return (
|
|
444
445
|
<OtaContext.Provider value={value}>
|
|
445
446
|
{!isBlocking ? (
|
|
@@ -150,8 +150,11 @@ const patchAssetResolver = (): void => {
|
|
|
150
150
|
log(`REDIRECTED (BASE): ${uri} -> (MainBundle: ${finalUri})`);
|
|
151
151
|
return { ...res, uri: finalUri };
|
|
152
152
|
} else {
|
|
153
|
-
// Android:
|
|
154
|
-
|
|
153
|
+
// Android: with a file-based bundle RN points at ota/vN/drawable-*/x.png,
|
|
154
|
+
// which doesn't exist. Base assets live in the APK as drawable/raw
|
|
155
|
+
// resources, addressed by name (originalPath: "drawable-mdpi/name.png").
|
|
156
|
+
const resName = found.originalPath.split('/').pop()!.replace(/\.[^.]+$/, '');
|
|
157
|
+
return { ...res, uri: resName };
|
|
155
158
|
}
|
|
156
159
|
}
|
|
157
160
|
|