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,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.resetOtaAssetResolver = exports.initOtaAssetResolver = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
var _reactNativeBlobUtil = _interopRequireDefault(require("react-native-blob-util"));
|
|
9
|
+
var _NativeBsPatch = _interopRequireDefault(require("../NativeBsPatch"));
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
const ASSET_STORE_DIR = `${_reactNativeBlobUtil.default.fs.dirs.DocumentDir}/ota/assets`;
|
|
12
|
+
let assetManifest = null;
|
|
13
|
+
let assetMap = new Map();
|
|
14
|
+
let assetList = [];
|
|
15
|
+
let isPatched = false;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Internal logger with native bridge integration.
|
|
19
|
+
*/
|
|
20
|
+
const log = msg => {
|
|
21
|
+
const formatted = `[otaAssetResolver] ${msg}`;
|
|
22
|
+
console.log(formatted);
|
|
23
|
+
if (_NativeBsPatch.default?.logNative) {
|
|
24
|
+
_NativeBsPatch.default.logNative(formatted);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Initializes the OTA asset resolver for a specific version.
|
|
30
|
+
* Loads the asset manifest and prepares an O(1) lookup map for intercepted image requests.
|
|
31
|
+
*
|
|
32
|
+
* @param version - The OTA version number to load assets from.
|
|
33
|
+
*/
|
|
34
|
+
const initOtaAssetResolver = async version => {
|
|
35
|
+
const otaDir = `${_reactNativeBlobUtil.default.fs.dirs.DocumentDir}/ota`;
|
|
36
|
+
const versionDir = `${otaDir}/v${version}`;
|
|
37
|
+
const manifestPath = `${versionDir}/asset-manifest-v${version}.json`;
|
|
38
|
+
try {
|
|
39
|
+
if (await _reactNativeBlobUtil.default.fs.exists(manifestPath)) {
|
|
40
|
+
const content = await _reactNativeBlobUtil.default.fs.readFile(manifestPath, 'utf8');
|
|
41
|
+
assetManifest = JSON.parse(content);
|
|
42
|
+
|
|
43
|
+
// Pre-compute normalized paths for O(1) lookup to prevent JS thread blocking during render
|
|
44
|
+
const map = new Map();
|
|
45
|
+
const list = assetManifest.assets || [];
|
|
46
|
+
list.forEach(a => {
|
|
47
|
+
const normPath = a.originalPath.toLowerCase().replace(/\//g, '_').replace(/^(assets_)+/, '');
|
|
48
|
+
a._normPath = normPath; // cache for fast fallback
|
|
49
|
+
map.set(normPath, a);
|
|
50
|
+
});
|
|
51
|
+
assetMap = map;
|
|
52
|
+
assetList = list;
|
|
53
|
+
log(`Initialized version ${version} (${list.length} assets, mapped for O(1) lookup)`);
|
|
54
|
+
patchAssetResolver();
|
|
55
|
+
} else {
|
|
56
|
+
log(`Manifest NOT found at: ${manifestPath}`);
|
|
57
|
+
}
|
|
58
|
+
} catch (e) {
|
|
59
|
+
log(`Failed to load manifest: ${e.message}`);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Patches React Native's Image.resolveAssetSource to intercept and redirect
|
|
65
|
+
* asset requests to the locally downloaded OTA asset store.
|
|
66
|
+
*/
|
|
67
|
+
exports.initOtaAssetResolver = initOtaAssetResolver;
|
|
68
|
+
const patchAssetResolver = () => {
|
|
69
|
+
if (isPatched) return;
|
|
70
|
+
isPatched = true;
|
|
71
|
+
const resolveAssetSource = _reactNative.Image.resolveAssetSource;
|
|
72
|
+
if (resolveAssetSource && typeof resolveAssetSource.setCustomSourceTransformer === 'function') {
|
|
73
|
+
resolveAssetSource.setCustomSourceTransformer(resolver => {
|
|
74
|
+
// Get the default resolution result
|
|
75
|
+
const res = resolver.defaultAsset();
|
|
76
|
+
if (!res || !assetManifest) return res;
|
|
77
|
+
const uri = res.uri;
|
|
78
|
+
|
|
79
|
+
// Skip remote or data URIs
|
|
80
|
+
// Note: We DO NOT skip 'file://' because local bundles use it for relative asset resolution.
|
|
81
|
+
if (!uri || uri.startsWith('http') || uri.startsWith('data')) {
|
|
82
|
+
return res;
|
|
83
|
+
}
|
|
84
|
+
const normUri = uri.toLowerCase().replace(/\//g, '_').replace(/^(assets_)+/, '');
|
|
85
|
+
|
|
86
|
+
// 1. Fast O(1) Map lookup
|
|
87
|
+
let found = assetMap.get(normUri);
|
|
88
|
+
|
|
89
|
+
// 2. Fallback O(N) fuzzy matching (without regex overhead)
|
|
90
|
+
if (!found) {
|
|
91
|
+
found = assetList.find(a => {
|
|
92
|
+
return a._normPath.endsWith(normUri) || normUri.endsWith(a._normPath);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (found) {
|
|
96
|
+
if (found.isBase) {
|
|
97
|
+
if (_reactNative.Platform.OS === 'ios') {
|
|
98
|
+
// iOS: OTA bundle generates wrong relative paths for base assets, redirect to MainBundleDir
|
|
99
|
+
const finalUri = `file://${_reactNativeBlobUtil.default.fs.dirs.MainBundleDir}/${found.originalPath}`;
|
|
100
|
+
log(`REDIRECTED (BASE): ${uri} -> (MainBundle: ${finalUri})`);
|
|
101
|
+
return {
|
|
102
|
+
...res,
|
|
103
|
+
uri: finalUri
|
|
104
|
+
};
|
|
105
|
+
} else {
|
|
106
|
+
// Android: let the default responder load it from apk assets (res.uri is correct)
|
|
107
|
+
return res;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const localPath = `${ASSET_STORE_DIR}/${found.hash}.${found.ext}`;
|
|
111
|
+
// iOS & Android: requires file:// prefix for absolute filesystem paths
|
|
112
|
+
const finalUri = `file://${localPath}`;
|
|
113
|
+
log(`REDIRECTED: ${uri} -> ${found.hash} (Local: ${finalUri})`);
|
|
114
|
+
return {
|
|
115
|
+
...res,
|
|
116
|
+
uri: finalUri
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Diagnostic logging for missed assets that appear to be internal resources
|
|
121
|
+
if (uri.includes('assets')) {
|
|
122
|
+
log(`MISS: ${uri} (Not found in manifest)`);
|
|
123
|
+
}
|
|
124
|
+
return res;
|
|
125
|
+
});
|
|
126
|
+
log('Successfully attached CustomSourceTransformer.');
|
|
127
|
+
} else {
|
|
128
|
+
log('ERROR: setCustomSourceTransformer is not available in this React Native version.');
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Resets the OTA asset resolver state.
|
|
134
|
+
* Call this before a major app upgrade or when unmounting the OTA context.
|
|
135
|
+
* Clears cached manifest data and resets the transformer patch guard so
|
|
136
|
+
* `initOtaAssetResolver` can re-patch cleanly on next call.
|
|
137
|
+
*/
|
|
138
|
+
const resetOtaAssetResolver = () => {
|
|
139
|
+
assetManifest = null;
|
|
140
|
+
assetMap = new Map();
|
|
141
|
+
assetList = [];
|
|
142
|
+
isPatched = false;
|
|
143
|
+
};
|
|
144
|
+
exports.resetOtaAssetResolver = resetOtaAssetResolver;
|
|
145
|
+
//# sourceMappingURL=otaAssetResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_reactNativeBlobUtil","_interopRequireDefault","_NativeBsPatch","e","__esModule","default","ASSET_STORE_DIR","ReactNativeBlobUtil","fs","dirs","DocumentDir","assetManifest","assetMap","Map","assetList","isPatched","log","msg","formatted","console","NativeBsPatch","logNative","initOtaAssetResolver","version","otaDir","versionDir","manifestPath","exists","content","readFile","JSON","parse","map","list","assets","forEach","a","normPath","originalPath","toLowerCase","replace","_normPath","set","length","patchAssetResolver","message","exports","resolveAssetSource","Image","setCustomSourceTransformer","resolver","res","defaultAsset","uri","startsWith","normUri","found","get","find","endsWith","isBase","Platform","OS","finalUri","MainBundleDir","localPath","hash","ext","includes","resetOtaAssetResolver"],"sourceRoot":"../../../src","sources":["ota/otaAssetResolver.ts"],"mappings":"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","ignoreList":[]}
|