react-native-bspatch 1.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/LICENSE +21 -0
- package/README.md +471 -0
- package/android/build.gradle +100 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/java/vn/reactnativebspatch/BsPatchModule.kt +139 -0
- package/android/src/main/java/vn/reactnativebspatch/BsPatchPackage.kt +16 -0
- package/android/src/main/java/vn/reactnativebspatch/OtaBundleResolver.kt +227 -0
- package/cpp/CMakeLists.txt +43 -0
- package/cpp/bsdiff/bspatch.c +194 -0
- package/cpp/bsdiff/bspatch.h +41 -0
- package/cpp/bsdiff/bspatch_wrapper.c +150 -0
- package/cpp/bsdiff/bspatch_wrapper.h +6 -0
- package/cpp/bspatch_jni.cpp +41 -0
- package/cpp/bzip2/LICENSE +42 -0
- package/cpp/bzip2/blocksort.c +1094 -0
- package/cpp/bzip2/bzlib.c +1572 -0
- package/cpp/bzip2/bzlib.h +282 -0
- package/cpp/bzip2/bzlib_private.h +509 -0
- package/cpp/bzip2/compress.c +672 -0
- package/cpp/bzip2/crctable.c +104 -0
- package/cpp/bzip2/decompress.c +652 -0
- package/cpp/bzip2/huffman.c +205 -0
- package/cpp/bzip2/randtable.c +84 -0
- package/ios/OtaBundleResolver.swift +241 -0
- package/ios/RNBsPatch.h +8 -0
- package/ios/RNBsPatch.mm +198 -0
- package/lib/commonjs/NativeBsPatch.js +9 -0
- package/lib/commonjs/NativeBsPatch.js.map +1 -0
- package/lib/commonjs/crypto-js.d.js +2 -0
- package/lib/commonjs/crypto-js.d.js.map +1 -0
- package/lib/commonjs/index.js +90 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/ota/OtaProvider.js +306 -0
- package/lib/commonjs/ota/OtaProvider.js.map +1 -0
- package/lib/commonjs/ota/otaAssetResolver.js +145 -0
- package/lib/commonjs/ota/otaAssetResolver.js.map +1 -0
- package/lib/commonjs/ota/otaCore.js +736 -0
- package/lib/commonjs/ota/otaCore.js.map +1 -0
- package/lib/commonjs/ota/otaLogger.js +64 -0
- package/lib/commonjs/ota/otaLogger.js.map +1 -0
- package/lib/commonjs/ota/otaMetadata.js +138 -0
- package/lib/commonjs/ota/otaMetadata.js.map +1 -0
- package/lib/commonjs/ota/storage/CustomStorage.js +140 -0
- package/lib/commonjs/ota/storage/CustomStorage.js.map +1 -0
- package/lib/commonjs/ota/storage/GitHubReleaseStorage.js +96 -0
- package/lib/commonjs/ota/storage/GitHubReleaseStorage.js.map +1 -0
- package/lib/commonjs/ota/types.js +39 -0
- package/lib/commonjs/ota/types.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/module/NativeBsPatch.js +5 -0
- package/lib/module/NativeBsPatch.js.map +1 -0
- package/lib/module/crypto-js.d.js +2 -0
- package/lib/module/crypto-js.d.js.map +1 -0
- package/lib/module/index.js +23 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/ota/OtaProvider.js +299 -0
- package/lib/module/ota/OtaProvider.js.map +1 -0
- package/lib/module/ota/otaAssetResolver.js +138 -0
- package/lib/module/ota/otaAssetResolver.js.map +1 -0
- package/lib/module/ota/otaCore.js +725 -0
- package/lib/module/ota/otaCore.js.map +1 -0
- package/lib/module/ota/otaLogger.js +59 -0
- package/lib/module/ota/otaLogger.js.map +1 -0
- package/lib/module/ota/otaMetadata.js +127 -0
- package/lib/module/ota/otaMetadata.js.map +1 -0
- package/lib/module/ota/storage/CustomStorage.js +134 -0
- package/lib/module/ota/storage/CustomStorage.js.map +1 -0
- package/lib/module/ota/storage/GitHubReleaseStorage.js +90 -0
- package/lib/module/ota/storage/GitHubReleaseStorage.js.map +1 -0
- package/lib/module/ota/types.js +38 -0
- package/lib/module/ota/types.js.map +1 -0
- package/lib/typescript/NativeBsPatch.d.ts +39 -0
- package/lib/typescript/NativeBsPatch.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +15 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/ota/OtaProvider.d.ts +10 -0
- package/lib/typescript/ota/OtaProvider.d.ts.map +1 -0
- package/lib/typescript/ota/otaAssetResolver.d.ts +15 -0
- package/lib/typescript/ota/otaAssetResolver.d.ts.map +1 -0
- package/lib/typescript/ota/otaCore.d.ts +109 -0
- package/lib/typescript/ota/otaCore.d.ts.map +1 -0
- package/lib/typescript/ota/otaLogger.d.ts +44 -0
- package/lib/typescript/ota/otaLogger.d.ts.map +1 -0
- package/lib/typescript/ota/otaMetadata.d.ts +46 -0
- package/lib/typescript/ota/otaMetadata.d.ts.map +1 -0
- package/lib/typescript/ota/storage/CustomStorage.d.ts +12 -0
- package/lib/typescript/ota/storage/CustomStorage.d.ts.map +1 -0
- package/lib/typescript/ota/storage/GitHubReleaseStorage.d.ts +20 -0
- package/lib/typescript/ota/storage/GitHubReleaseStorage.d.ts.map +1 -0
- package/lib/typescript/ota/types.d.ts +191 -0
- package/lib/typescript/ota/types.d.ts.map +1 -0
- package/package.json +89 -0
- package/react-native-bspatch.podspec +46 -0
- package/src/NativeBsPatch.ts +52 -0
- package/src/crypto-js.d.ts +1 -0
- package/src/index.ts +29 -0
- package/src/ota/OtaProvider.tsx +399 -0
- package/src/ota/otaAssetResolver.ts +182 -0
- package/src/ota/otaCore.ts +963 -0
- package/src/ota/otaLogger.ts +72 -0
- package/src/ota/otaMetadata.ts +149 -0
- package/src/ota/storage/CustomStorage.ts +143 -0
- package/src/ota/storage/GitHubReleaseStorage.ts +98 -0
- package/src/ota/types.ts +211 -0
- package/tools/bsdiff +0 -0
- package/tools/bsdiff.c +445 -0
- package/tools/bsdiff.h +45 -0
- package/tools/build_ota.sh +457 -0
- package/tools/setup_project.js +273 -0
- package/tools/update_registry.js +145 -0
- package/tools/upload_ota_custom.sh +138 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Platform","ReactNativeBlobUtil","CryptoJS","NativeBsPatch","createOtaLogger","OtaEvent","ensureOtaDir","getBundlePath","loadMetadata","registerNewVersion","saveMetadata","CustomStorageProvider","GitHubReleaseStorageProvider","OtaStatus","OtaStorageType","OTA_DIR","fs","dirs","DocumentDir","DEFAULT_STORAGE","GITHUB_STORAGE","getStorage","config","storage","storageType","GITHUB","semverGte","a","b","pa","split","map","Number","pb","i","va","vb","verifyHash","path","expectedHash","hash","toLowerCase","verifySignature","filePath","signature","publicKey","fileData","readFile","fileWords","enc","Base64","parse","keyWords","signatureWords","hmac","HmacSHA256","isValid","toString","__DEV__","console","warn","error","decompressGzip","endsWith","decompressedPath","replace","success","Error","downloadWithRetry","url","destPath","onProgress","headers","retryLimit","network","retry","timeout","timeoutMs","taskRef","task","fileCache","followRedirect","fetch","progress","received","total","percent","Math","floor","cancel","e","delay","pow","Promise","resolve","setTimeout","fetchOtaManifest","fetchManifest","message","bundledPatches","ASSET_STORE_DIR","downloadAndSyncAssets","assetManifestUrl","version","log","onStatus","SYNCING_ASSETS","versionDir","manifestPath","exists","mkdir","assets","resp","respInfo","status","manifestData","data","JSON","stringify","writeFile","manifest","filter","isBase","length","processed","downloaded","cached","updateProgress","round","maxConcurrency","index","downloadNext","asset","filename","ext","localPath","assetUrl","getAssetUrl","emit","DOWNLOAD_SUCCESS","initialWorkers","min","workers","Array","fill","all","getLocalAssetPath","getLocalPatchPath","patch","docDir","id","applyOtaPatchInternal","onEvent","totalStart","Date","now","finalBundlePath","toVersion","baseAppVersion","tempBundle","localPatchPath","minAppVersion","appVersion","VERSION_INCOMPATIBLE","downloadMs","patchSizeBytes","fromCache","stat","size","DOWNLOAD_START","DOWNLOADING","dlStart","getUpdateFileUrl","durationMs","sizeKB","dlError","DOWNLOAD_FAIL","actualPatchPath","compressed","DECOMPRESS_START","APPLYING","DECOMPRESS_SUCCESS","sigValid","SIGNATURE_INVALID","manifestUrl","metadata","oldBundlePath","currentVersion","bundleFilename","OS","actualOldPath","otaStoredPath","extractBundleFromAssets","oldStat","patchStat","baseHash","HASH_VERIFY_START","actualSourceHash","srcSize","srcStat","fromVersion","HASH_MISMATCH","expected","actual","HASH_VERIFY_SUCCESS","PATCH_START","applyStart","applyPatch","applyMs","PATCH_FAIL","bundleHash","unlink","mv","newMetadata","totalMs","PATCH_SUCCESS","SUCCESS","patchSizeKB","markAsHealthy","reloadBundle","fullBundleUrl","actualHash","fallbackError","ERROR"],"sourceRoot":"../../../src","sources":["ota/otaCore.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* OTA Structured Event Logger
|
|
5
|
+
*
|
|
6
|
+
* Provides a centralized logging system for all OTA operations.
|
|
7
|
+
* Events can be forwarded to external analytics via the `onEvent` callback in OtaConfig.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import NativeBsPatch from '../NativeBsPatch';
|
|
11
|
+
export let OtaEvent = /*#__PURE__*/function (OtaEvent) {
|
|
12
|
+
OtaEvent["CHECK_UPDATE"] = "check_update";
|
|
13
|
+
OtaEvent["DOWNLOAD_START"] = "download_start";
|
|
14
|
+
OtaEvent["DOWNLOAD_SUCCESS"] = "download_success";
|
|
15
|
+
OtaEvent["DOWNLOAD_FAIL"] = "download_fail";
|
|
16
|
+
OtaEvent["PATCH_START"] = "patch_start";
|
|
17
|
+
OtaEvent["PATCH_SUCCESS"] = "patch_success";
|
|
18
|
+
OtaEvent["PATCH_FAIL"] = "patch_fail";
|
|
19
|
+
OtaEvent["HASH_VERIFY_START"] = "hash_verify_start";
|
|
20
|
+
OtaEvent["HASH_VERIFY_SUCCESS"] = "hash_verify_success";
|
|
21
|
+
OtaEvent["HASH_MISMATCH"] = "hash_mismatch";
|
|
22
|
+
OtaEvent["ROLLBACK"] = "rollback";
|
|
23
|
+
OtaEvent["FALLBACK_FULL_BUNDLE"] = "fallback_full_bundle";
|
|
24
|
+
OtaEvent["MARK_HEALTHY"] = "mark_healthy";
|
|
25
|
+
OtaEvent["RESET_FACTORY"] = "reset_factory";
|
|
26
|
+
OtaEvent["VERSION_INCOMPATIBLE"] = "version_incompatible";
|
|
27
|
+
OtaEvent["SIGNATURE_INVALID"] = "signature_invalid";
|
|
28
|
+
OtaEvent["DECOMPRESS_START"] = "decompress_start";
|
|
29
|
+
OtaEvent["DECOMPRESS_SUCCESS"] = "decompress_success";
|
|
30
|
+
return OtaEvent;
|
|
31
|
+
}({});
|
|
32
|
+
/**
|
|
33
|
+
* Creates an OTA logger instance bound to an optional external callback.
|
|
34
|
+
*/
|
|
35
|
+
export const createOtaLogger = onEvent => {
|
|
36
|
+
const emit = (event, details) => {
|
|
37
|
+
const entry = {
|
|
38
|
+
event,
|
|
39
|
+
timestamp: Date.now(),
|
|
40
|
+
...details
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// Always log to console for debugging
|
|
44
|
+
const logStr = `[OTA:${event}] ${JSON.stringify(entry)}`;
|
|
45
|
+
console.log(logStr);
|
|
46
|
+
|
|
47
|
+
// Also log to native for physical device debugging (visible in Xcode)
|
|
48
|
+
if (NativeBsPatch && NativeBsPatch.logNative) {
|
|
49
|
+
NativeBsPatch.logNative(logStr);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Forward to external analytics if configured
|
|
53
|
+
onEvent?.(entry);
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
emit
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=otaLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeBsPatch","OtaEvent","createOtaLogger","onEvent","emit","event","details","entry","timestamp","Date","now","logStr","JSON","stringify","console","log","logNative"],"sourceRoot":"../../../src","sources":["ota/otaLogger.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,aAAa,MAAM,kBAAkB;AAE5C,WAAYC,QAAQ,0BAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA;AAkCpB;AACA;AACA;AACA,OAAO,MAAMC,eAAe,GAAIC,OAA0B,IAAK;EAC7D,MAAMC,IAAI,GAAGA,CACXC,KAAe,EACfC,OAAkD,KAC/C;IACH,MAAMC,KAAkB,GAAG;MACzBF,KAAK;MACLG,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;MACrB,GAAGJ;IACL,CAAC;;IAED;IACA,MAAMK,MAAM,GAAG,QAAQN,KAAK,KAAKO,IAAI,CAACC,SAAS,CAACN,KAAK,CAAC,EAAE;IACxDO,OAAO,CAACC,GAAG,CAACJ,MAAM,CAAC;;IAEnB;IACA,IAAIX,aAAa,IAAIA,aAAa,CAACgB,SAAS,EAAE;MAC5ChB,aAAa,CAACgB,SAAS,CAACL,MAAM,CAAC;IACjC;;IAEA;IACAR,OAAO,GAAGI,KAAK,CAAC;EAClB,CAAC;EAED,OAAO;IAAEH;EAAK,CAAC;AACjB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Platform } from 'react-native';
|
|
4
|
+
import ReactNativeBlobUtil from 'react-native-blob-util';
|
|
5
|
+
const OTA_DIR = `${ReactNativeBlobUtil.fs.dirs.DocumentDir}/ota`;
|
|
6
|
+
const METADATA_PATH = `${OTA_DIR}/metadata.json`;
|
|
7
|
+
|
|
8
|
+
/** Promise-based lock to prevent concurrent metadata writes (double-tap guard). */
|
|
9
|
+
let saveLock = Promise.resolve();
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Ensures the OTA root directory exists.
|
|
13
|
+
*/
|
|
14
|
+
export const ensureOtaDir = async () => {
|
|
15
|
+
if (!(await ReactNativeBlobUtil.fs.exists(OTA_DIR))) {
|
|
16
|
+
await ReactNativeBlobUtil.fs.mkdir(OTA_DIR);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Loads the current OTA metadata from the local filesystem.
|
|
22
|
+
*
|
|
23
|
+
* @param defaultVersion - The version to return if no metadata exists (usually baseAppVersion).
|
|
24
|
+
* @returns The persisted metadata or a default if loading fails.
|
|
25
|
+
*/
|
|
26
|
+
export const loadMetadata = async defaultVersion => {
|
|
27
|
+
try {
|
|
28
|
+
if (await ReactNativeBlobUtil.fs.exists(METADATA_PATH)) {
|
|
29
|
+
const content = await ReactNativeBlobUtil.fs.readFile(METADATA_PATH, 'utf8');
|
|
30
|
+
return JSON.parse(content);
|
|
31
|
+
}
|
|
32
|
+
} catch (e) {
|
|
33
|
+
console.warn('[otaMetadata] Failed to load metadata:', e);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
currentVersion: defaultVersion,
|
|
37
|
+
previousVersions: [],
|
|
38
|
+
rollbackCount: 0,
|
|
39
|
+
lastLaunchSuccessful: true
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Persists OTA metadata to the local filesystem.
|
|
45
|
+
*
|
|
46
|
+
* @param metadata - The metadata object to save.
|
|
47
|
+
*/
|
|
48
|
+
export const saveMetadata = async metadata => {
|
|
49
|
+
// Wait for any in-flight save to complete before starting our own
|
|
50
|
+
const prevLock = saveLock;
|
|
51
|
+
let settleFn;
|
|
52
|
+
saveLock = new Promise(resolve => {
|
|
53
|
+
settleFn = resolve;
|
|
54
|
+
});
|
|
55
|
+
try {
|
|
56
|
+
await prevLock;
|
|
57
|
+
await ensureOtaDir();
|
|
58
|
+
await ReactNativeBlobUtil.fs.writeFile(METADATA_PATH, JSON.stringify(metadata, null, 2), 'utf8');
|
|
59
|
+
} catch (e) {
|
|
60
|
+
console.error('[otaMetadata] Failed to save metadata:', e);
|
|
61
|
+
throw new Error(`Failed to save metadata: ${e.message}`);
|
|
62
|
+
} finally {
|
|
63
|
+
settleFn();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/** Maximum number of previous versions kept in history for rollback. */
|
|
68
|
+
export const MAX_VERSION_HISTORY = 3;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Rotates OTA versions for auditing and rollback capabilities.
|
|
72
|
+
* Pushes the current version to the history and limits history to MAX_VERSION_HISTORY.
|
|
73
|
+
*
|
|
74
|
+
* @param metadata - Current metadata object.
|
|
75
|
+
* @param newVersion - The newly applied OTA version.
|
|
76
|
+
* @returns Updated metadata object.
|
|
77
|
+
*/
|
|
78
|
+
export const registerNewVersion = (metadata, newVersion) => {
|
|
79
|
+
const versions = [metadata.currentVersion, ...(metadata.previousVersions || [])];
|
|
80
|
+
// Keep internal history unique and capped
|
|
81
|
+
const uniquePrevious = Array.from(new Set(versions)).filter(v => v !== newVersion).slice(0, MAX_VERSION_HISTORY);
|
|
82
|
+
return {
|
|
83
|
+
...metadata,
|
|
84
|
+
currentVersion: newVersion,
|
|
85
|
+
previousVersions: uniquePrevious,
|
|
86
|
+
rollbackCount: 0,
|
|
87
|
+
lastLaunchSuccessful: true // Native layer will set to false on next boot until JS marks healthy
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Marks the current session as healthy, indicating a successful boot.
|
|
93
|
+
* This prevents the native bridge from rolling back the version on the next launch.
|
|
94
|
+
*
|
|
95
|
+
* @param defaultVersion - Base version for metadata lookup fallback.
|
|
96
|
+
* @returns The updated metadata.
|
|
97
|
+
*/
|
|
98
|
+
export const markHealthy = async defaultVersion => {
|
|
99
|
+
const metadata = await loadMetadata(defaultVersion);
|
|
100
|
+
const updated = {
|
|
101
|
+
...metadata,
|
|
102
|
+
lastLaunchSuccessful: true,
|
|
103
|
+
rollbackCount: 0
|
|
104
|
+
};
|
|
105
|
+
await saveMetadata(updated);
|
|
106
|
+
return updated;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Resolves the absolute path to the JS bundle for a specific version.
|
|
111
|
+
*
|
|
112
|
+
* @param version - The OTA version number.
|
|
113
|
+
* @param baseVersion - The app's base version (bundled).
|
|
114
|
+
* @returns Absolute path to the bundle or null if it refers to the base bundle.
|
|
115
|
+
*/
|
|
116
|
+
export const getBundlePath = (version, baseVersion) => {
|
|
117
|
+
if (version === baseVersion) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
const filename = Platform.select({
|
|
121
|
+
android: 'index.android.bundle',
|
|
122
|
+
ios: 'main.jsbundle',
|
|
123
|
+
default: 'index.android.bundle'
|
|
124
|
+
});
|
|
125
|
+
return `${OTA_DIR}/v${version}/${filename}`;
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=otaMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Platform","ReactNativeBlobUtil","OTA_DIR","fs","dirs","DocumentDir","METADATA_PATH","saveLock","Promise","resolve","ensureOtaDir","exists","mkdir","loadMetadata","defaultVersion","content","readFile","JSON","parse","e","console","warn","currentVersion","previousVersions","rollbackCount","lastLaunchSuccessful","saveMetadata","metadata","prevLock","settleFn","writeFile","stringify","error","Error","message","MAX_VERSION_HISTORY","registerNewVersion","newVersion","versions","uniquePrevious","Array","from","Set","filter","v","slice","markHealthy","updated","getBundlePath","version","baseVersion","filename","select","android","ios","default"],"sourceRoot":"../../../src","sources":["ota/otaMetadata.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Platform } from 'react-native';
|
|
4
|
+
import ReactNativeBlobUtil from 'react-native-blob-util';
|
|
5
|
+
/** Cache tokens per server endpoint so switching configs invalidates stale tokens. */
|
|
6
|
+
const tokenCache = new Map();
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Implementation for the custom MinIO-based storage server.
|
|
10
|
+
*/
|
|
11
|
+
export class CustomStorageProvider {
|
|
12
|
+
getEndpoint(config, key, fallback) {
|
|
13
|
+
return config.customServer?.endpoints?.[key] ?? fallback;
|
|
14
|
+
}
|
|
15
|
+
async getAccessToken(config) {
|
|
16
|
+
if (!config.customServer) {
|
|
17
|
+
throw new Error('customServer configuration missing');
|
|
18
|
+
}
|
|
19
|
+
const {
|
|
20
|
+
baseUrl,
|
|
21
|
+
username,
|
|
22
|
+
password
|
|
23
|
+
} = config.customServer;
|
|
24
|
+
const cacheKey = `${baseUrl}|${username}`;
|
|
25
|
+
const now = Date.now();
|
|
26
|
+
const cached = tokenCache.get(cacheKey);
|
|
27
|
+
if (cached && now < cached.expiresAt - 30000) {
|
|
28
|
+
return cached.token;
|
|
29
|
+
}
|
|
30
|
+
const loginPath = this.getEndpoint(config, 'login', 'public/authen/login');
|
|
31
|
+
const loginUrl = baseUrl.endsWith('/') ? `${baseUrl}${loginPath}` : `${baseUrl}/${loginPath}`;
|
|
32
|
+
try {
|
|
33
|
+
const res = await ReactNativeBlobUtil.fetch('POST', loginUrl, {
|
|
34
|
+
'Content-Type': 'application/json; charset=utf-8'
|
|
35
|
+
}, JSON.stringify({
|
|
36
|
+
username,
|
|
37
|
+
password
|
|
38
|
+
}));
|
|
39
|
+
const json = JSON.parse(res.data);
|
|
40
|
+
const token = json.data?.accessTokenInfo?.accessToken;
|
|
41
|
+
if (!token) throw new Error('Login failed: token not found');
|
|
42
|
+
tokenCache.set(cacheKey, {
|
|
43
|
+
token,
|
|
44
|
+
expiresAt: now + 3600000
|
|
45
|
+
}); // 1 hour
|
|
46
|
+
return token;
|
|
47
|
+
} catch (error) {
|
|
48
|
+
throw new Error(`Authentication failed: ${error.message}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async fetchManifest(config) {
|
|
52
|
+
if (!config.customServer) return config.bundledPatches || [];
|
|
53
|
+
const {
|
|
54
|
+
baseUrl,
|
|
55
|
+
channel,
|
|
56
|
+
baseFolder = 'bspatch'
|
|
57
|
+
} = config.customServer;
|
|
58
|
+
const registryPath = `${baseFolder}/ota_registry.json`;
|
|
59
|
+
try {
|
|
60
|
+
const token = await this.getAccessToken(config);
|
|
61
|
+
const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
62
|
+
const genLinkPath = this.getEndpoint(config, 'genDownloadLink', 'api/minio/gen-download-link');
|
|
63
|
+
const genLinkUrl = `${normalizedBaseUrl}/${genLinkPath}?pathFile=${encodeURIComponent(registryPath)}`;
|
|
64
|
+
const linkRes = await ReactNativeBlobUtil.fetch('GET', genLinkUrl, {
|
|
65
|
+
Authorization: `Bearer ${token}`
|
|
66
|
+
});
|
|
67
|
+
const linkJson = JSON.parse(linkRes.data);
|
|
68
|
+
const registryUrl = linkJson.data;
|
|
69
|
+
if (!registryUrl) throw new Error('Failed to generate registry download link');
|
|
70
|
+
const registryRes = await ReactNativeBlobUtil.fetch('GET', registryUrl);
|
|
71
|
+
if (registryRes.respInfo.status !== 200) {
|
|
72
|
+
throw new Error(`Registry fetch failed with status ${registryRes.respInfo.status}`);
|
|
73
|
+
}
|
|
74
|
+
const registry = JSON.parse(registryRes.data);
|
|
75
|
+
const appGroup = registry?.apps?.[config.appVersion];
|
|
76
|
+
const flavorGroup = appGroup?.flavors?.[channel.toLowerCase()];
|
|
77
|
+
if (!flavorGroup || !flavorGroup.patches?.length) {
|
|
78
|
+
return config.bundledPatches || [];
|
|
79
|
+
}
|
|
80
|
+
return (flavorGroup.patches || []).filter(p => p.platform === Platform.OS);
|
|
81
|
+
} catch (error) {
|
|
82
|
+
console.warn('[CustomStorage] Manifest fetch error:', error.message);
|
|
83
|
+
return config.bundledPatches || [];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async getUpdateFileUrl(filename, config) {
|
|
87
|
+
if (!config.customServer) throw new Error('customServer config missing');
|
|
88
|
+
const {
|
|
89
|
+
baseUrl,
|
|
90
|
+
baseFolder = 'bspatch',
|
|
91
|
+
useMinio
|
|
92
|
+
} = config.customServer;
|
|
93
|
+
const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
94
|
+
const channel = config.customServer.channel.toLowerCase();
|
|
95
|
+
const remotePath = `${baseFolder}/${config.appVersion}/${channel}/${filename}`;
|
|
96
|
+
if (useMinio) {
|
|
97
|
+
const token = await this.getAccessToken(config);
|
|
98
|
+
const genLinkPath = this.getEndpoint(config, 'genDownloadLink', 'api/minio/gen-download-link');
|
|
99
|
+
const genLinkUrl = `${normalizedBaseUrl}/${genLinkPath}?pathFile=${encodeURIComponent(remotePath)}`;
|
|
100
|
+
const res = await ReactNativeBlobUtil.fetch('GET', genLinkUrl, {
|
|
101
|
+
Authorization: `Bearer ${token}`
|
|
102
|
+
});
|
|
103
|
+
const json = JSON.parse(res.data);
|
|
104
|
+
if (!json.data) throw new Error(`Failed to generate link for: ${filename}`);
|
|
105
|
+
return json.data;
|
|
106
|
+
}
|
|
107
|
+
const downloadPath = this.getEndpoint(config, 'downloadFile', 'files/downloadStreamFile');
|
|
108
|
+
return `${normalizedBaseUrl}/${downloadPath}?filepath=${encodeURIComponent(remotePath)}`;
|
|
109
|
+
}
|
|
110
|
+
async getAssetUrl(hash, ext, config) {
|
|
111
|
+
if (!config.customServer) return '';
|
|
112
|
+
const {
|
|
113
|
+
baseUrl,
|
|
114
|
+
baseFolder = 'bspatch',
|
|
115
|
+
useMinio
|
|
116
|
+
} = config.customServer;
|
|
117
|
+
const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
118
|
+
const filename = `${hash}.${ext}`;
|
|
119
|
+
const remotePath = `${baseFolder}/assets/${filename}`;
|
|
120
|
+
if (useMinio) {
|
|
121
|
+
const token = await this.getAccessToken(config);
|
|
122
|
+
const genLinkPath = this.getEndpoint(config, 'genDownloadLink', 'api/minio/gen-download-link');
|
|
123
|
+
const genLinkUrl = `${normalizedBaseUrl}/${genLinkPath}?pathFile=${encodeURIComponent(remotePath)}`;
|
|
124
|
+
const res = await ReactNativeBlobUtil.fetch('GET', genLinkUrl, {
|
|
125
|
+
Authorization: `Bearer ${token}`
|
|
126
|
+
});
|
|
127
|
+
const json = JSON.parse(res.data);
|
|
128
|
+
return json.data || '';
|
|
129
|
+
}
|
|
130
|
+
const downloadPath = this.getEndpoint(config, 'downloadFile', 'files/downloadStreamFile');
|
|
131
|
+
return `${normalizedBaseUrl}/${downloadPath}?filepath=${encodeURIComponent(remotePath)}`;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=CustomStorage.js.map
|
|
@@ -0,0 +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","appVersion","flavorGroup","flavors","toLowerCase","patches","length","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":[]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GitHub Releases Storage Provider
|
|
5
|
+
*
|
|
6
|
+
* Reads the OTA registry from a GitHub Release asset and resolves download URLs
|
|
7
|
+
* directly from the release. Supports both public and token-authenticated repos.
|
|
8
|
+
*
|
|
9
|
+
* Registry format:
|
|
10
|
+
* - Expected at: `https://raw.githubusercontent.com/{owner}/{repo}/{tag}/{registryPath}`
|
|
11
|
+
* - Asset download: `https://github.com/{owner}/{repo}/releases/download/{tag}/{filename}`
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { Platform } from 'react-native';
|
|
15
|
+
import ReactNativeBlobUtil from 'react-native-blob-util';
|
|
16
|
+
export class GitHubReleaseStorageProvider {
|
|
17
|
+
getRawRegistryUrl(config) {
|
|
18
|
+
const {
|
|
19
|
+
repo,
|
|
20
|
+
tag,
|
|
21
|
+
registryPath = 'ota_registry.json'
|
|
22
|
+
} = config.githubRelease;
|
|
23
|
+
return `https://raw.githubusercontent.com/${repo}/${tag}/${registryPath}`;
|
|
24
|
+
}
|
|
25
|
+
getAssetDownloadUrl(config, filename) {
|
|
26
|
+
const {
|
|
27
|
+
repo,
|
|
28
|
+
tag
|
|
29
|
+
} = config.githubRelease;
|
|
30
|
+
return `https://github.com/${repo}/releases/download/${tag}/${filename}`;
|
|
31
|
+
}
|
|
32
|
+
authHeaders(token) {
|
|
33
|
+
if (!token) return {};
|
|
34
|
+
return {
|
|
35
|
+
Authorization: `Bearer ${token}`
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async fetchManifest(config) {
|
|
39
|
+
if (!config.githubRelease) return config.bundledPatches || [];
|
|
40
|
+
const {
|
|
41
|
+
token
|
|
42
|
+
} = config.githubRelease;
|
|
43
|
+
const url = this.getRawRegistryUrl(config);
|
|
44
|
+
try {
|
|
45
|
+
const res = await ReactNativeBlobUtil.fetch('GET', url, this.authHeaders(token));
|
|
46
|
+
if (res.respInfo.status !== 200) {
|
|
47
|
+
throw new Error(`Registry fetch failed with status ${res.respInfo.status}`);
|
|
48
|
+
}
|
|
49
|
+
const registry = typeof res.data === 'string' ? JSON.parse(res.data) : JSON.parse(JSON.stringify(res.data));
|
|
50
|
+
|
|
51
|
+
// Support both flat array (legacy) and structured format
|
|
52
|
+
if (Array.isArray(registry)) {
|
|
53
|
+
return registry.filter(p => !p.platform || p.platform === Platform.OS);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Structured: apps["1.0.0"].channels["production"].patches[]
|
|
57
|
+
const appGroup = registry?.apps?.[config.appVersion];
|
|
58
|
+
const channelGroup = appGroup?.channels?.[config.githubRelease.repo] // use repo as channel fallback
|
|
59
|
+
?? appGroup?.channels?.production ?? appGroup?.flavors?.production;
|
|
60
|
+
if (!channelGroup?.patches?.length) {
|
|
61
|
+
return config.bundledPatches || [];
|
|
62
|
+
}
|
|
63
|
+
return channelGroup.patches.filter(p => !p.platform || p.platform === Platform.OS);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.warn('[GitHubStorage] Manifest fetch error:', error.message);
|
|
66
|
+
return config.bundledPatches || [];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async getUpdateFileUrl(filename, config) {
|
|
70
|
+
if (!config.githubRelease) throw new Error('githubRelease config missing');
|
|
71
|
+
return this.getAssetDownloadUrl(config, filename);
|
|
72
|
+
}
|
|
73
|
+
async getAssetUrl(hash, ext, config) {
|
|
74
|
+
if (!config.githubRelease) return '';
|
|
75
|
+
const {
|
|
76
|
+
assetBaseUrl,
|
|
77
|
+
tag,
|
|
78
|
+
repo
|
|
79
|
+
} = config.githubRelease;
|
|
80
|
+
|
|
81
|
+
// If a custom CDN/base is provided, use it
|
|
82
|
+
if (assetBaseUrl) {
|
|
83
|
+
return `${assetBaseUrl}/${hash}.${ext}`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Fallback: serve from GitHub raw with optional token
|
|
87
|
+
return `https://raw.githubusercontent.com/${repo}/${tag}/assets/${hash}.${ext}`;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=GitHubReleaseStorage.js.map
|
|
@@ -0,0 +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","appGroup","apps","appVersion","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":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* OTA Data Types
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export let OtaUpdateMode = /*#__PURE__*/function (OtaUpdateMode) {
|
|
8
|
+
OtaUpdateMode["MANUAL"] = "MANUAL";
|
|
9
|
+
OtaUpdateMode["ON_APP_START"] = "ON_APP_START";
|
|
10
|
+
OtaUpdateMode["ON_APP_FOREGROUND"] = "ON_APP_FOREGROUND";
|
|
11
|
+
OtaUpdateMode["BACKGROUND_DOWNLOAD"] = "BACKGROUND_DOWNLOAD";
|
|
12
|
+
return OtaUpdateMode;
|
|
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
|
+
return OtaStorageType;
|
|
20
|
+
}({});
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* A single content-addressed asset from the OTA asset store.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
export let OtaStatus = /*#__PURE__*/function (OtaStatus) {
|
|
27
|
+
OtaStatus["IDLE"] = "IDLE";
|
|
28
|
+
OtaStatus["CHECKING"] = "CHECKING";
|
|
29
|
+
OtaStatus["UPDATE_AVAILABLE"] = "UPDATE_AVAILABLE";
|
|
30
|
+
OtaStatus["UP_TO_DATE"] = "UP_TO_DATE";
|
|
31
|
+
OtaStatus["DOWNLOADING"] = "DOWNLOADING";
|
|
32
|
+
OtaStatus["APPLYING"] = "APPLYING";
|
|
33
|
+
OtaStatus["SYNCING_ASSETS"] = "SYNCING_ASSETS";
|
|
34
|
+
OtaStatus["SUCCESS"] = "SUCCESS";
|
|
35
|
+
OtaStatus["ERROR"] = "ERROR";
|
|
36
|
+
return OtaStatus;
|
|
37
|
+
}({});
|
|
38
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["OtaUpdateMode","OtaStorageType","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;AAOzB,WAAYC,cAAc,0BAAdA,cAAc;EACtB;EADQA,cAAc;EAGtB;EAHQA,cAAc;EAAA,OAAdA,cAAc;AAAA;;AA0C1B;AACA;AACA;;AA+GA,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":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
/**
|
|
4
|
+
* Apply a bspatch file to an old bundle to generate a new bundle
|
|
5
|
+
* @param oldPath The absolute path to the existing bundle file
|
|
6
|
+
* @param newPath The absolute path where the new bundle should be saved
|
|
7
|
+
* @param patchPath The absolute path to the patch file
|
|
8
|
+
* @param callback Promise-like callback receiving true if successful, or false on error.
|
|
9
|
+
*/
|
|
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
|
+
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
|
+
/**
|
|
25
|
+
* Mark the current boot as healthy to prevent rollback
|
|
26
|
+
*/
|
|
27
|
+
markAsHealthy(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Reload the React Native JS bundle
|
|
30
|
+
*/
|
|
31
|
+
reloadBundle(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Log a message to the native console (NSLog on iOS)
|
|
34
|
+
*/
|
|
35
|
+
logNative(message: string): void;
|
|
36
|
+
}
|
|
37
|
+
declare const _default: Spec;
|
|
38
|
+
export default _default;
|
|
39
|
+
//# sourceMappingURL=NativeBsPatch.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function applyPatch(oldBundlePath: string, newBundlePath: string, patchPath: string): Promise<boolean>;
|
|
2
|
+
export declare function markAsHealthy(): void;
|
|
3
|
+
export declare function reloadBundle(): void;
|
|
4
|
+
export * from './ota/otaLogger';
|
|
5
|
+
export * from './ota/OtaProvider';
|
|
6
|
+
export * from './ota/types';
|
|
7
|
+
export { initOtaAssetResolver, resetOtaAssetResolver } from './ota/otaAssetResolver';
|
|
8
|
+
export { GitHubReleaseStorageProvider } from './ota/storage/GitHubReleaseStorage';
|
|
9
|
+
declare const _default: {
|
|
10
|
+
applyPatch: typeof applyPatch;
|
|
11
|
+
reloadBundle: typeof reloadBundle;
|
|
12
|
+
markAsHealthy: typeof markAsHealthy;
|
|
13
|
+
};
|
|
14
|
+
export default _default;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;;;;;;AAElF,wBAIE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { OtaConfig, OtaState } from './types';
|
|
3
|
+
export declare function OtaProvider({ children, config, loadingView, useLoadingView, }: {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
config: OtaConfig;
|
|
6
|
+
loadingView?: React.ReactNode;
|
|
7
|
+
useLoadingView?: boolean;
|
|
8
|
+
}): React.JSX.Element;
|
|
9
|
+
export declare function useOta(): OtaState;
|
|
10
|
+
//# sourceMappingURL=OtaProvider.d.ts.map
|
|
@@ -0,0 +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,qBAuUA;AAED,wBAAgB,MAAM,aAMrB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initializes the OTA asset resolver for a specific version.
|
|
3
|
+
* Loads the asset manifest and prepares an O(1) lookup map for intercepted image requests.
|
|
4
|
+
*
|
|
5
|
+
* @param version - The OTA version number to load assets from.
|
|
6
|
+
*/
|
|
7
|
+
export declare const initOtaAssetResolver: (version: number) => Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Resets the OTA asset resolver state.
|
|
10
|
+
* Call this before a major app upgrade or when unmounting the OTA context.
|
|
11
|
+
* Clears cached manifest data and resets the transformer patch guard so
|
|
12
|
+
* `initOtaAssetResolver` can re-patch cleanly on next call.
|
|
13
|
+
*/
|
|
14
|
+
export declare const resetOtaAssetResolver: () => void;
|
|
15
|
+
//# sourceMappingURL=otaAssetResolver.d.ts.map
|