@vanikya/ota-react-native 0.1.6 → 0.1.8
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 +82 -7
- package/lib/commonjs/hooks/useOTAUpdate.js +20 -1
- package/lib/commonjs/hooks/useOTAUpdate.js.map +1 -1
- package/lib/commonjs/index.js +1 -1
- package/lib/commonjs/utils/api.js +53 -1
- package/lib/commonjs/utils/api.js.map +1 -1
- package/lib/commonjs/utils/storage.js +125 -15
- package/lib/commonjs/utils/storage.js.map +1 -1
- package/lib/commonjs/utils/verification.js +29 -20
- package/lib/commonjs/utils/verification.js.map +1 -1
- package/lib/module/hooks/useOTAUpdate.js +20 -1
- package/lib/module/hooks/useOTAUpdate.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/utils/api.js +53 -1
- package/lib/module/utils/api.js.map +1 -1
- package/lib/module/utils/storage.js +125 -15
- package/lib/module/utils/storage.js.map +1 -1
- package/lib/module/utils/verification.js +29 -20
- package/lib/module/utils/verification.js.map +1 -1
- package/lib/typescript/hooks/useOTAUpdate.d.ts +3 -0
- package/lib/typescript/hooks/useOTAUpdate.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/utils/api.d.ts +1 -0
- package/lib/typescript/utils/api.d.ts.map +1 -1
- package/lib/typescript/utils/storage.d.ts +15 -0
- package/lib/typescript/utils/storage.d.ts.map +1 -1
- package/lib/typescript/utils/verification.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/hooks/useOTAUpdate.ts +22 -0
- package/src/index.ts +1 -1
- package/src/utils/api.ts +81 -1
- package/src/utils/storage.ts +156 -15
- package/src/utils/verification.ts +35 -23
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> **Beta Notice**: This package is currently in beta. Testing is in progress and APIs may change. Use in production at your own discretion. We welcome feedback and bug reports via [GitHub Issues](https://github.com/vanikya/ota-update/issues).
|
|
4
4
|
|
|
5
|
+
**[Documentation](https://vanikya.github.io/ota-update/)** | **[GitHub](https://github.com/vanikya/ota-update)** | **[npm](https://www.npmjs.com/package/@vanikya/ota-react-native)**
|
|
6
|
+
|
|
5
7
|
React Native SDK for OTA (Over-The-Air) updates. A self-hosted alternative to CodePush and EAS Updates.
|
|
6
8
|
|
|
7
9
|
Works with both **Expo** and **bare React Native** apps.
|
|
@@ -134,18 +136,22 @@ function UpdateChecker() {
|
|
|
134
136
|
```tsx
|
|
135
137
|
const {
|
|
136
138
|
// State
|
|
139
|
+
status, // UpdateStatus - current status
|
|
137
140
|
isChecking, // boolean - checking for updates
|
|
138
141
|
isDownloading, // boolean - downloading update
|
|
139
142
|
isApplying, // boolean - applying update
|
|
140
|
-
downloadProgress, //
|
|
141
|
-
|
|
143
|
+
downloadProgress, // DownloadProgress | null - download progress
|
|
144
|
+
updateInfo, // UpdateInfo | null - available update info
|
|
142
145
|
error, // Error | null - last error
|
|
146
|
+
isDismissed, // boolean - whether user dismissed the update
|
|
143
147
|
|
|
144
148
|
// Actions
|
|
145
149
|
checkForUpdate, // () => Promise<UpdateInfo | null>
|
|
146
150
|
downloadUpdate, // () => Promise<void>
|
|
147
|
-
applyUpdate, // () => Promise<void>
|
|
148
|
-
|
|
151
|
+
applyUpdate, // (restartApp?: boolean) => Promise<void>
|
|
152
|
+
clearPendingUpdate, // () => Promise<void>
|
|
153
|
+
dismissUpdate, // () => void - dismiss update notification
|
|
154
|
+
resetDismiss, // () => void - reset dismiss state
|
|
149
155
|
} = useOTAUpdate();
|
|
150
156
|
```
|
|
151
157
|
|
|
@@ -198,19 +204,52 @@ Handle mandatory updates that can't be skipped:
|
|
|
198
204
|
|
|
199
205
|
```tsx
|
|
200
206
|
function App() {
|
|
201
|
-
const {
|
|
207
|
+
const { updateInfo, downloadAndApply } = useOTAUpdate();
|
|
202
208
|
|
|
203
209
|
useEffect(() => {
|
|
204
|
-
if (
|
|
210
|
+
if (updateInfo?.isMandatory) {
|
|
205
211
|
// Force update for mandatory releases
|
|
206
212
|
downloadAndApply();
|
|
207
213
|
}
|
|
208
|
-
}, [
|
|
214
|
+
}, [updateInfo]);
|
|
209
215
|
|
|
210
216
|
return <YourApp />;
|
|
211
217
|
}
|
|
212
218
|
```
|
|
213
219
|
|
|
220
|
+
## Dismissable Update Banner
|
|
221
|
+
|
|
222
|
+
Allow users to dismiss optional updates:
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
function UpdateBanner() {
|
|
226
|
+
const { updateInfo, isDismissed, dismissUpdate, downloadAndApply, isDownloading } = useOTAUpdate();
|
|
227
|
+
|
|
228
|
+
// Don't show if no update or user dismissed
|
|
229
|
+
if (!updateInfo || isDismissed) {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Force mandatory updates (can't dismiss)
|
|
234
|
+
if (updateInfo.isMandatory) {
|
|
235
|
+
return (
|
|
236
|
+
<View>
|
|
237
|
+
<Text>Required update: v{updateInfo.version}</Text>
|
|
238
|
+
<Button title="Update Now" onPress={downloadAndApply} />
|
|
239
|
+
</View>
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return (
|
|
244
|
+
<View>
|
|
245
|
+
<Text>Update available: v{updateInfo.version}</Text>
|
|
246
|
+
<Button title="Update" onPress={downloadAndApply} disabled={isDownloading} />
|
|
247
|
+
<Button title="Later" onPress={dismissUpdate} />
|
|
248
|
+
</View>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
214
253
|
## Error Handling
|
|
215
254
|
|
|
216
255
|
```tsx
|
|
@@ -264,6 +303,42 @@ When you call `applyUpdate()` or the download completes:
|
|
|
264
303
|
|
|
265
304
|
> **Note**: OTA updates only work on EAS Build apps, not Expo Go, because Expo Go doesn't include the native module.
|
|
266
305
|
|
|
306
|
+
## Version Targeting
|
|
307
|
+
|
|
308
|
+
Target specific native app versions when publishing updates using the CLI:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
# Only send updates to app versions >= 2.0.0
|
|
312
|
+
ota release --app my-app --min-app-version 2.0.0
|
|
313
|
+
|
|
314
|
+
# Only send updates to app versions between 2.0.0 and 2.5.0
|
|
315
|
+
ota release --app my-app --min-app-version 2.0.0 --max-app-version 2.5.0
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
This is useful when:
|
|
319
|
+
- You have breaking changes that only work with newer native builds
|
|
320
|
+
- You want to phase out support for older app versions
|
|
321
|
+
- Different native versions have different API requirements
|
|
322
|
+
|
|
323
|
+
## Recovering from Corrupted Updates
|
|
324
|
+
|
|
325
|
+
If an OTA update becomes corrupted (causing app crashes), you can clear it:
|
|
326
|
+
|
|
327
|
+
```tsx
|
|
328
|
+
import { UpdateStorage } from '@vanikya/ota-react-native';
|
|
329
|
+
|
|
330
|
+
// On app startup, check for and clear corrupted bundles
|
|
331
|
+
async function recoverFromCorruptedUpdate() {
|
|
332
|
+
const storage = new UpdateStorage();
|
|
333
|
+
const wasCorrupted = await storage.clearCorruptedBundle();
|
|
334
|
+
if (wasCorrupted) {
|
|
335
|
+
console.log('Cleared corrupted OTA bundle, app will use built-in bundle');
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
The SDK now validates downloaded bundles to prevent HTML error pages or corrupted files from being saved as bundles.
|
|
341
|
+
|
|
267
342
|
## License
|
|
268
343
|
|
|
269
344
|
MIT
|
|
@@ -32,6 +32,7 @@ function useOTAUpdate(config) {
|
|
|
32
32
|
const [downloadProgress, setDownloadProgress] = (0, _react.useState)(null);
|
|
33
33
|
const [error, setError] = (0, _react.useState)(null);
|
|
34
34
|
const [currentVersion, setCurrentVersion] = (0, _react.useState)(null);
|
|
35
|
+
const [isDismissed, setIsDismissed] = (0, _react.useState)(false);
|
|
35
36
|
const apiClient = (0, _react.useRef)(new _api.OTAApiClient(serverUrl));
|
|
36
37
|
const storage = (0, _react.useRef)(new _storage.UpdateStorage());
|
|
37
38
|
const deviceIdRef = (0, _react.useRef)(null);
|
|
@@ -83,6 +84,11 @@ function useOTAUpdate(config) {
|
|
|
83
84
|
isMandatory: response.release.isMandatory,
|
|
84
85
|
releaseNotes: response.release.releaseNotes
|
|
85
86
|
};
|
|
87
|
+
|
|
88
|
+
// Reset dismiss state if this is a different version than what was previously dismissed
|
|
89
|
+
if (!updateInfo || updateInfo.version !== info.version) {
|
|
90
|
+
setIsDismissed(false);
|
|
91
|
+
}
|
|
86
92
|
setUpdateInfo(info);
|
|
87
93
|
setStatus('available');
|
|
88
94
|
return info;
|
|
@@ -254,6 +260,16 @@ function useOTAUpdate(config) {
|
|
|
254
260
|
setStatus('idle');
|
|
255
261
|
}, []);
|
|
256
262
|
|
|
263
|
+
// Dismiss the update notification (user can hide the banner)
|
|
264
|
+
const dismissUpdate = (0, _react.useCallback)(() => {
|
|
265
|
+
setIsDismissed(true);
|
|
266
|
+
}, []);
|
|
267
|
+
|
|
268
|
+
// Reset dismiss state (useful when a new update is found)
|
|
269
|
+
const resetDismiss = (0, _react.useCallback)(() => {
|
|
270
|
+
setIsDismissed(false);
|
|
271
|
+
}, []);
|
|
272
|
+
|
|
257
273
|
// Check on mount
|
|
258
274
|
(0, _react.useEffect)(() => {
|
|
259
275
|
if (checkOnMount) {
|
|
@@ -280,10 +296,13 @@ function useOTAUpdate(config) {
|
|
|
280
296
|
downloadProgress,
|
|
281
297
|
error,
|
|
282
298
|
currentVersion,
|
|
299
|
+
isDismissed,
|
|
283
300
|
checkForUpdate,
|
|
284
301
|
downloadUpdate,
|
|
285
302
|
applyUpdate,
|
|
286
|
-
clearPendingUpdate
|
|
303
|
+
clearPendingUpdate,
|
|
304
|
+
dismissUpdate,
|
|
305
|
+
resetDismiss
|
|
287
306
|
};
|
|
288
307
|
}
|
|
289
308
|
//# sourceMappingURL=useOTAUpdate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNative","_api","_storage","_verification","getDeviceId","id","Math","random","toString","substring","useOTAUpdate","config","serverUrl","appSlug","channel","appVersion","publicKey","checkOnMount","checkOnForeground","status","setStatus","useState","updateInfo","setUpdateInfo","downloadProgress","setDownloadProgress","error","setError","currentVersion","setCurrentVersion","apiClient","useRef","OTAApiClient","storage","UpdateStorage","deviceIdRef","releaseRef","useEffect","loadCurrentVersion","metadata","current","getMetadata","version","getDeviceIdCached","useCallback","checkForUpdate","deviceId","currentMetadata","response","checkUpdate","platform","Platform","OS","updateAvailable","release","info","releaseId","bundleSize","isMandatory","releaseNotes","err","Error","String","downloadUpdate","downloadedBytes","totalBytes","percentage","reportEvent","eventType","deviceInfo","getDeviceInfo","bundleData","downloadBundle","bundleUrl","byteLength","verification","verifyBundle","bundleHash","bundleSignature","valid","bundlePath","saveBundle","saveMetadata","downloadedAt","Date","now","registered","registerBundleWithNative","__DEV__","console","log","errorMessage","message","applyUpdate","restartApp","clearPendingUpdate","deleteBundle","clearMetadata","clearNativePendingBundle","handleAppStateChange","nextAppState","subscription","AppState","addEventListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useOTAUpdate.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,IAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,aAAA,GAAAJ,OAAA;
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_api","_storage","_verification","getDeviceId","id","Math","random","toString","substring","useOTAUpdate","config","serverUrl","appSlug","channel","appVersion","publicKey","checkOnMount","checkOnForeground","status","setStatus","useState","updateInfo","setUpdateInfo","downloadProgress","setDownloadProgress","error","setError","currentVersion","setCurrentVersion","isDismissed","setIsDismissed","apiClient","useRef","OTAApiClient","storage","UpdateStorage","deviceIdRef","releaseRef","useEffect","loadCurrentVersion","metadata","current","getMetadata","version","getDeviceIdCached","useCallback","checkForUpdate","deviceId","currentMetadata","response","checkUpdate","platform","Platform","OS","updateAvailable","release","info","releaseId","bundleSize","isMandatory","releaseNotes","err","Error","String","downloadUpdate","downloadedBytes","totalBytes","percentage","reportEvent","eventType","deviceInfo","getDeviceInfo","bundleData","downloadBundle","bundleUrl","byteLength","verification","verifyBundle","bundleHash","bundleSignature","valid","bundlePath","saveBundle","saveMetadata","downloadedAt","Date","now","registered","registerBundleWithNative","__DEV__","console","log","errorMessage","message","applyUpdate","restartApp","clearPendingUpdate","deleteBundle","clearMetadata","clearNativePendingBundle","dismissUpdate","resetDismiss","handleAppStateChange","nextAppState","subscription","AppState","addEventListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useOTAUpdate.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -47,7 +47,59 @@ class OTAApiClient {
|
|
|
47
47
|
if (!response.ok) {
|
|
48
48
|
throw new Error(`Failed to download bundle: HTTP ${response.status}`);
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
|
|
51
|
+
// Validate content type if available
|
|
52
|
+
const contentType = response.headers.get('content-type');
|
|
53
|
+
if (contentType && contentType.includes('text/html')) {
|
|
54
|
+
throw new Error('Server returned HTML instead of JavaScript bundle. Check your server configuration.');
|
|
55
|
+
}
|
|
56
|
+
const data = await response.arrayBuffer();
|
|
57
|
+
|
|
58
|
+
// Basic validation: check if content looks like JavaScript
|
|
59
|
+
// JavaScript bundles typically start with specific patterns
|
|
60
|
+
if (!this.isValidJavaScriptBundle(data)) {
|
|
61
|
+
throw new Error('Downloaded content does not appear to be a valid JavaScript bundle');
|
|
62
|
+
}
|
|
63
|
+
return data;
|
|
64
|
+
}
|
|
65
|
+
isValidJavaScriptBundle(data) {
|
|
66
|
+
// Check minimum size (a valid bundle should be at least a few bytes)
|
|
67
|
+
if (data.byteLength < 10) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Read first 1000 bytes as string to check content
|
|
72
|
+
const bytes = new Uint8Array(data, 0, Math.min(1000, data.byteLength));
|
|
73
|
+
let preview = '';
|
|
74
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
75
|
+
preview += String.fromCharCode(bytes[i]);
|
|
76
|
+
}
|
|
77
|
+
const trimmed = preview.trim();
|
|
78
|
+
|
|
79
|
+
// Check for HTML indicators (common error page patterns)
|
|
80
|
+
if (trimmed.startsWith('<!DOCTYPE') || trimmed.startsWith('<!doctype') || trimmed.startsWith('<html') || trimmed.startsWith('<HTML') || trimmed.includes('<head>') || trimmed.includes('<body>')) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// JavaScript bundles typically start with:
|
|
85
|
+
// - var, let, const (variable declarations)
|
|
86
|
+
// - (function or !function (IIFEs)
|
|
87
|
+
// - "use strict"
|
|
88
|
+
// - Object.defineProperty (common in transpiled code)
|
|
89
|
+
// - __d( (Metro bundler format)
|
|
90
|
+
// - Comments: // or /*
|
|
91
|
+
const jsPatterns = [/^var\s/, /^let\s/, /^const\s/, /^\(function/, /^!function/, /^["']use strict["']/, /^Object\.defineProperty/, /^__d\(/, /^\/[/*]/, /^"use strict"/, /^__BUNDLE_START_TIME__/];
|
|
92
|
+
for (const pattern of jsPatterns) {
|
|
93
|
+
if (pattern.test(trimmed)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Also accept if it contains common JS tokens (for minified bundles)
|
|
99
|
+
if (trimmed.includes('function') || trimmed.includes('exports') || trimmed.includes('require(') || trimmed.includes('__d(')) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
51
103
|
}
|
|
52
104
|
}
|
|
53
105
|
exports.OTAApiClient = OTAApiClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","OTAApiClient","constructor","serverUrl","replace","checkUpdate","request","response","fetch","method","headers","body","JSON","stringify","ok","error","json","catch","Error","status","reportEvent","__DEV__","console","warn","downloadBundle","bundleUrl","arrayBuffer","exports","getDeviceInfo","os","Platform","OS","osVersion","Version","toString"],"sourceRoot":"../../../src","sources":["utils/api.ts"],"mappings":";;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAyCO,MAAMC,YAAY,CAAC;EAGxBC,WAAWA,CAACC,SAAiB,EAAE;IAC7B,IAAI,CAACA,SAAS,GAAGA,SAAS,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;EACjD;EAEA,MAAMC,WAAWA,CAACC,OAA2B,EAAgC;IAC3E,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAAC,GAAG,IAAI,CAACL,SAAS,sBAAsB,EAAE;MACpEM,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACP,cAAc,EAAE;MAClB,CAAC;MACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACP,OAAO;IAC9B,CAAC,CAAC;IAEF,IAAI,CAACC,QAAQ,CAACO,EAAE,EAAE;MAChB,MAAMC,KAAK,GAAG,MAAMR,QAAQ,CAACS,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,OAAO;QAAEF,KAAK,EAAE;MAAgB,CAAC,CAAC,CAAC;MAC7E,MAAM,IAAIG,KAAK,CAAEH,KAAK,CAAuBA,KAAK,IAAI,QAAQR,QAAQ,CAACY,MAAM,EAAE,CAAC;IAClF;IAEA,OAAOZ,QAAQ,CAACS,IAAI,CAAC,CAAC;EACxB;EAEA,MAAMI,WAAWA,CAACd,OAA2B,EAAiB;IAC5D,IAAI;MACF,MAAME,KAAK,CAAC,GAAG,IAAI,CAACL,SAAS,sBAAsB,EAAE;QACnDM,MAAM,EAAE,MAAM;QACdC,OAAO,EAAE;UACP,cAAc,EAAE;QAClB,CAAC;QACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACP,OAAO;MAC9B,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOS,KAAK,EAAE;MACd;MACA,IAAIM,OAAO,EAAE;QACXC,OAAO,CAACC,IAAI,CAAC,qCAAqC,EAAER,KAAK,CAAC;MAC5D;IACF;EACF;EAEA,MAAMS,cAAcA,CAACC,SAAiB,EAAwB;IAC5D,MAAMlB,QAAQ,GAAG,MAAMC,KAAK,CAACiB,SAAS,CAAC;IAEvC,IAAI,CAAClB,QAAQ,CAACO,EAAE,EAAE;MAChB,MAAM,IAAII,KAAK,CAAC,mCAAmCX,QAAQ,CAACY,MAAM,EAAE,CAAC;IACvE;IAEA,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","OTAApiClient","constructor","serverUrl","replace","checkUpdate","request","response","fetch","method","headers","body","JSON","stringify","ok","error","json","catch","Error","status","reportEvent","__DEV__","console","warn","downloadBundle","bundleUrl","contentType","get","includes","data","arrayBuffer","isValidJavaScriptBundle","byteLength","bytes","Uint8Array","Math","min","preview","i","length","String","fromCharCode","trimmed","trim","startsWith","jsPatterns","pattern","test","exports","getDeviceInfo","os","Platform","OS","osVersion","Version","toString"],"sourceRoot":"../../../src","sources":["utils/api.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,12 +16,48 @@ function normalizePath(path) {
|
|
|
16
16
|
return path;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
// Convert ArrayBuffer to base64 in chunks to avoid btoa() size limits
|
|
20
|
+
// btoa() can fail for strings > 2MB on some JS engines
|
|
21
|
+
// Chunk size must be multiple of 3 to avoid base64 padding issues between chunks
|
|
22
|
+
function arrayBufferToBase64(buffer) {
|
|
23
|
+
const bytes = new Uint8Array(buffer);
|
|
24
|
+
// 32766 is divisible by 3, so each chunk produces valid base64 without padding (except last)
|
|
25
|
+
const chunkSize = 32766;
|
|
26
|
+
const chunks = [];
|
|
27
|
+
for (let i = 0; i < bytes.length; i += chunkSize) {
|
|
28
|
+
const chunk = bytes.subarray(i, Math.min(i + chunkSize, bytes.length));
|
|
29
|
+
let binary = '';
|
|
30
|
+
for (let j = 0; j < chunk.length; j++) {
|
|
31
|
+
binary += String.fromCharCode(chunk[j]);
|
|
32
|
+
}
|
|
33
|
+
chunks.push(btoa(binary));
|
|
34
|
+
}
|
|
35
|
+
return chunks.join('');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Convert base64 to ArrayBuffer
|
|
39
|
+
function base64ToArrayBuffer(base64) {
|
|
40
|
+
const binary = atob(base64);
|
|
41
|
+
const bytes = new Uint8Array(binary.length);
|
|
42
|
+
for (let i = 0; i < binary.length; i++) {
|
|
43
|
+
bytes[i] = binary.charCodeAt(i);
|
|
44
|
+
}
|
|
45
|
+
return bytes.buffer;
|
|
46
|
+
}
|
|
47
|
+
|
|
19
48
|
// Try to use Expo FileSystem if available
|
|
49
|
+
// Use legacy API to avoid deprecation warnings in expo-file-system v54+
|
|
20
50
|
let ExpoFileSystem = null;
|
|
21
51
|
try {
|
|
22
|
-
|
|
52
|
+
// Try legacy import first (expo-file-system v54+)
|
|
53
|
+
ExpoFileSystem = require('expo-file-system/legacy');
|
|
23
54
|
} catch {
|
|
24
|
-
|
|
55
|
+
try {
|
|
56
|
+
// Fallback to regular import for older versions
|
|
57
|
+
ExpoFileSystem = require('expo-file-system');
|
|
58
|
+
} catch {
|
|
59
|
+
// Expo not available, will use native module
|
|
60
|
+
}
|
|
25
61
|
}
|
|
26
62
|
|
|
27
63
|
// Native module for bare React Native
|
|
@@ -34,13 +70,8 @@ class ExpoStorageAdapter {
|
|
|
34
70
|
}
|
|
35
71
|
async writeFile(path, data) {
|
|
36
72
|
if (data instanceof ArrayBuffer) {
|
|
37
|
-
// Convert ArrayBuffer to base64
|
|
38
|
-
const
|
|
39
|
-
let binary = '';
|
|
40
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
41
|
-
binary += String.fromCharCode(bytes[i]);
|
|
42
|
-
}
|
|
43
|
-
const base64 = btoa(binary);
|
|
73
|
+
// Convert ArrayBuffer to base64 using chunked approach for large bundles
|
|
74
|
+
const base64 = arrayBufferToBase64(data);
|
|
44
75
|
await ExpoFileSystem.writeAsStringAsync(path, base64, {
|
|
45
76
|
encoding: ExpoFileSystem.EncodingType.Base64
|
|
46
77
|
});
|
|
@@ -91,12 +122,8 @@ class NativeStorageAdapter {
|
|
|
91
122
|
throw new Error('OTAUpdate native module not found');
|
|
92
123
|
}
|
|
93
124
|
if (data instanceof ArrayBuffer) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
97
|
-
binary += String.fromCharCode(bytes[i]);
|
|
98
|
-
}
|
|
99
|
-
const base64 = btoa(binary);
|
|
125
|
+
// Convert ArrayBuffer to base64 using chunked approach for large bundles
|
|
126
|
+
const base64 = arrayBufferToBase64(data);
|
|
100
127
|
await OTAUpdateNative.writeFileBase64(path, base64);
|
|
101
128
|
} else {
|
|
102
129
|
await OTAUpdateNative.writeFile(path, data);
|
|
@@ -232,6 +259,89 @@ class UpdateStorage {
|
|
|
232
259
|
// In a more advanced implementation, we might keep a few for rollback
|
|
233
260
|
}
|
|
234
261
|
|
|
262
|
+
/**
|
|
263
|
+
* Validate that a stored bundle is a valid JavaScript file.
|
|
264
|
+
* This helps detect corrupted downloads (e.g., HTML error pages saved as bundles).
|
|
265
|
+
*
|
|
266
|
+
* @param releaseId The release ID to validate
|
|
267
|
+
* @returns true if bundle is valid JavaScript, false otherwise
|
|
268
|
+
*/
|
|
269
|
+
async validateBundle(releaseId) {
|
|
270
|
+
try {
|
|
271
|
+
const bundleData = await this.readBundle(releaseId);
|
|
272
|
+
if (!bundleData) {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Check minimum size
|
|
277
|
+
if (bundleData.byteLength < 10) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Read first 1000 bytes to check content
|
|
282
|
+
const bytes = new Uint8Array(bundleData, 0, Math.min(1000, bundleData.byteLength));
|
|
283
|
+
let preview = '';
|
|
284
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
285
|
+
preview += String.fromCharCode(bytes[i]);
|
|
286
|
+
}
|
|
287
|
+
const trimmed = preview.trim();
|
|
288
|
+
|
|
289
|
+
// Check for HTML indicators (common error page patterns)
|
|
290
|
+
if (trimmed.startsWith('<!DOCTYPE') || trimmed.startsWith('<!doctype') || trimmed.startsWith('<html') || trimmed.startsWith('<HTML') || trimmed.includes('<head>') || trimmed.includes('<body>')) {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Accept if it looks like JavaScript
|
|
295
|
+
const jsIndicators = [/^var\s/, /^let\s/, /^const\s/, /^\(function/, /^!function/, /^["']use strict["']/, /^Object\.defineProperty/, /^__d\(/, /^\/[/*]/, /^"use strict"/, /^__BUNDLE_START_TIME__/];
|
|
296
|
+
for (const pattern of jsIndicators) {
|
|
297
|
+
if (pattern.test(trimmed)) {
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Also check for common JS tokens in minified bundles
|
|
303
|
+
if (trimmed.includes('function') || trimmed.includes('exports') || trimmed.includes('require(') || trimmed.includes('__d(')) {
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
return false;
|
|
307
|
+
} catch {
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Clear corrupted bundle if detected.
|
|
314
|
+
* Call this on app startup to recover from bad OTA updates.
|
|
315
|
+
*
|
|
316
|
+
* @returns true if a corrupted bundle was cleared, false otherwise
|
|
317
|
+
*/
|
|
318
|
+
async clearCorruptedBundle() {
|
|
319
|
+
try {
|
|
320
|
+
const metadata = await this.getMetadata();
|
|
321
|
+
if (!metadata) {
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
const isValid = await this.validateBundle(metadata.releaseId);
|
|
325
|
+
if (!isValid) {
|
|
326
|
+
if (__DEV__) {
|
|
327
|
+
console.warn('[OTAUpdate] Detected corrupted bundle, clearing...');
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Clear the corrupted bundle
|
|
331
|
+
await this.deleteBundle(metadata.releaseId);
|
|
332
|
+
await this.clearMetadata();
|
|
333
|
+
await this.clearNativePendingBundle();
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
return false;
|
|
337
|
+
} catch (error) {
|
|
338
|
+
if (__DEV__) {
|
|
339
|
+
console.error('[OTAUpdate] Error checking bundle:', error);
|
|
340
|
+
}
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
235
345
|
/**
|
|
236
346
|
* Register the bundle path with the native module.
|
|
237
347
|
* This saves the path to SharedPreferences (Android) or UserDefaults (iOS)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","normalizePath","path","startsWith","slice","ExpoFileSystem","OTAUpdateNative","NativeModules","OTAUpdate","ExpoStorageAdapter","getDocumentDirectory","documentDirectory","writeFile","data","ArrayBuffer","bytes","Uint8Array","binary","i","length","String","fromCharCode","base64","btoa","writeAsStringAsync","encoding","EncodingType","Base64","readFile","readAsStringAsync","readFileAsBuffer","atob","charCodeAt","buffer","deleteFile","deleteAsync","idempotent","exists","info","getInfoAsync","makeDirectory","makeDirectoryAsync","intermediates","NativeStorageAdapter","Error","writeFileBase64","readFileBase64","getStorageAdapter","UpdateStorage","constructor","storage","isExpo","baseDir","baseDirNormalized","ensureDirectory","getNormalizedPath","saveBundle","releaseId","bundlePath","getRawBundlePath","getBundlePath","readBundle","deleteBundle","saveMetadata","update","metadataPath","JSON","stringify","getMetadata","content","parse","clearMetadata","cleanOldBundles","keepReleaseId","registerBundleWithNative","restart","applyBundle","normalizedPath","__DEV__","console","log","error","clearNativePendingBundle","clearPendingBundle","exports"],"sourceRoot":"../../../src","sources":["utils/storage.ts"],"mappings":";;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA;;AAmBA;AACA,SAASC,aAAaA,CAACC,IAAY,EAAU;EAC3C,IAAIA,IAAI,CAACC,UAAU,CAAC,SAAS,CAAC,EAAE;IAC9B,OAAOD,IAAI,CAACE,KAAK,CAAC,CAAC,CAAC;EACtB;EACA,OAAOF,IAAI;AACb;;AAEA;AACA,IAAIG,cAAmB,GAAG,IAAI;AAC9B,IAAI;EACFA,cAAc,GAAGL,OAAO,CAAC,kBAAkB,CAAC;AAC9C,CAAC,CAAC,MAAM;EACN;AAAA;;AAGF;AACA,MAAMM,eAAe,GAAGC,0BAAa,CAACC,SAAS;;AAE/C;AACA,MAAMC,kBAAkB,CAA2B;EACjDC,oBAAoBA,CAAA,EAAW;IAC7B,OAAOL,cAAc,CAACM,iBAAiB,IAAI,EAAE;EAC/C;EAEA,MAAMC,SAASA,CAACV,IAAY,EAAEW,IAA0B,EAAiB;IACvE,IAAIA,IAAI,YAAYC,WAAW,EAAE;MAC/B;MACA,MAAMC,KAAK,GAAG,IAAIC,UAAU,CAACH,IAAI,CAAC;MAClC,IAAII,MAAM,GAAG,EAAE;MACf,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,KAAK,CAACI,MAAM,EAAED,CAAC,EAAE,EAAE;QACrCD,MAAM,IAAIG,MAAM,CAACC,YAAY,CAACN,KAAK,CAACG,CAAC,CAAC,CAAC;MACzC;MACA,MAAMI,MAAM,GAAGC,IAAI,CAACN,MAAM,CAAC;MAC3B,MAAMZ,cAAc,CAACmB,kBAAkB,CAACtB,IAAI,EAAEoB,MAAM,EAAE;QACpDG,QAAQ,EAAEpB,cAAc,CAACqB,YAAY,CAACC;MACxC,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,MAAMtB,cAAc,CAACmB,kBAAkB,CAACtB,IAAI,EAAEW,IAAI,CAAC;IACrD;EACF;EAEA,MAAMe,QAAQA,CAAC1B,IAAY,EAAmB;IAC5C,OAAOG,cAAc,CAACwB,iBAAiB,CAAC3B,IAAI,CAAC;EAC/C;EAEA,MAAM4B,gBAAgBA,CAAC5B,IAAY,EAAwB;IACzD,MAAMoB,MAAM,GAAG,MAAMjB,cAAc,CAACwB,iBAAiB,CAAC3B,IAAI,EAAE;MAC1DuB,QAAQ,EAAEpB,cAAc,CAACqB,YAAY,CAACC;IACxC,CAAC,CAAC;IACF,MAAMV,MAAM,GAAGc,IAAI,CAACT,MAAM,CAAC;IAC3B,MAAMP,KAAK,GAAG,IAAIC,UAAU,CAACC,MAAM,CAACE,MAAM,CAAC;IAC3C,KAAK,IAAID,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,MAAM,CAACE,MAAM,EAAED,CAAC,EAAE,EAAE;MACtCH,KAAK,CAACG,CAAC,CAAC,GAAGD,MAAM,CAACe,UAAU,CAACd,CAAC,CAAC;IACjC;IACA,OAAOH,KAAK,CAACkB,MAAM;EACrB;EAEA,MAAMC,UAAUA,CAAChC,IAAY,EAAiB;IAC5C,MAAMG,cAAc,CAAC8B,WAAW,CAACjC,IAAI,EAAE;MAAEkC,UAAU,EAAE;IAAK,CAAC,CAAC;EAC9D;EAEA,MAAMC,MAAMA,CAACnC,IAAY,EAAoB;IAC3C,MAAMoC,IAAI,GAAG,MAAMjC,cAAc,CAACkC,YAAY,CAACrC,IAAI,CAAC;IACpD,OAAOoC,IAAI,CAACD,MAAM;EACpB;EAEA,MAAMG,aAAaA,CAACtC,IAAY,EAAiB;IAC/C,MAAMG,cAAc,CAACoC,kBAAkB,CAACvC,IAAI,EAAE;MAAEwC,aAAa,EAAE;IAAK,CAAC,CAAC;EACxE;AACF;;AAEA;AACA,MAAMC,oBAAoB,CAA2B;EACnDjC,oBAAoBA,CAAA,EAAW;IAC7B,IAAI,CAACJ,eAAe,EAAE;MACpB,MAAM,IAAIsC,KAAK,CAAC,8DAA8D,CAAC;IACjF;IACA,OAAOtC,eAAe,CAACI,oBAAoB,CAAC,CAAC;EAC/C;EAEA,MAAME,SAASA,CAACV,IAAY,EAAEW,IAA0B,EAAiB;IACvE,IAAI,CAACP,eAAe,EAAE;MACpB,MAAM,IAAIsC,KAAK,CAAC,mCAAmC,CAAC;IACtD;IAEA,IAAI/B,IAAI,YAAYC,WAAW,EAAE;MAC/B,MAAMC,KAAK,GAAG,IAAIC,UAAU,CAACH,IAAI,CAAC;MAClC,IAAII,MAAM,GAAG,EAAE;MACf,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,KAAK,CAACI,MAAM,EAAED,CAAC,EAAE,EAAE;QACrCD,MAAM,IAAIG,MAAM,CAACC,YAAY,CAACN,KAAK,CAACG,CAAC,CAAC,CAAC;MACzC;MACA,MAAMI,MAAM,GAAGC,IAAI,CAACN,MAAM,CAAC;MAC3B,MAAMX,eAAe,CAACuC,eAAe,CAAC3C,IAAI,EAAEoB,MAAM,CAAC;IACrD,CAAC,MAAM;MACL,MAAMhB,eAAe,CAACM,SAAS,CAACV,IAAI,EAAEW,IAAI,CAAC;IAC7C;EACF;EAEA,MAAMe,QAAQA,CAAC1B,IAAY,EAAmB;IAC5C,IAAI,CAACI,eAAe,EAAE;MACpB,MAAM,IAAIsC,KAAK,CAAC,mCAAmC,CAAC;IACtD;IACA,OAAOtC,eAAe,CAACsB,QAAQ,CAAC1B,IAAI,CAAC;EACvC;EAEA,MAAM4B,gBAAgBA,CAAC5B,IAAY,EAAwB;IACzD,IAAI,CAACI,eAAe,EAAE;MACpB,MAAM,IAAIsC,KAAK,CAAC,mCAAmC,CAAC;IACtD;IACA,MAAMtB,MAAc,GAAG,MAAMhB,eAAe,CAACwC,cAAc,CAAC5C,IAAI,CAAC;IACjE,MAAMe,MAAM,GAAGc,IAAI,CAACT,MAAM,CAAC;IAC3B,MAAMP,KAAK,GAAG,IAAIC,UAAU,CAACC,MAAM,CAACE,MAAM,CAAC;IAC3C,KAAK,IAAID,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,MAAM,CAACE,MAAM,EAAED,CAAC,EAAE,EAAE;MACtCH,KAAK,CAACG,CAAC,CAAC,GAAGD,MAAM,CAACe,UAAU,CAACd,CAAC,CAAC;IACjC;IACA,OAAOH,KAAK,CAACkB,MAAM;EACrB;EAEA,MAAMC,UAAUA,CAAChC,IAAY,EAAiB;IAC5C,IAAI,CAACI,eAAe,EAAE;MACpB,MAAM,IAAIsC,KAAK,CAAC,mCAAmC,CAAC;IACtD;IACA,MAAMtC,eAAe,CAAC4B,UAAU,CAAChC,IAAI,CAAC;EACxC;EAEA,MAAMmC,MAAMA,CAACnC,IAAY,EAAoB;IAC3C,IAAI,CAACI,eAAe,EAAE;MACpB,MAAM,IAAIsC,KAAK,CAAC,mCAAmC,CAAC;IACtD;IACA,OAAOtC,eAAe,CAAC+B,MAAM,CAACnC,IAAI,CAAC;EACrC;EAEA,MAAMsC,aAAaA,CAACtC,IAAY,EAAiB;IAC/C,IAAI,CAACI,eAAe,EAAE;MACpB,MAAM,IAAIsC,KAAK,CAAC,mCAAmC,CAAC;IACtD;IACA,MAAMtC,eAAe,CAACkC,aAAa,CAACtC,IAAI,CAAC;EAC3C;AACF;;AAEA;AACO,SAAS6C,iBAAiBA,CAAA,EAAmB;EAClD,IAAI1C,cAAc,EAAE;IAClB,OAAO,IAAII,kBAAkB,CAAC,CAAC;EACjC;EAEA,IAAIH,eAAe,EAAE;IACnB,OAAO,IAAIqC,oBAAoB,CAAC,CAAC;EACnC;EAEA,MAAM,IAAIC,KAAK,CACb,6FACF,CAAC;AACH;;AAEA;AACO,MAAMI,aAAa,CAAC;EAMzBC,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACC,OAAO,GAAGH,iBAAiB,CAAC,CAAC;IAClC,IAAI,CAACI,MAAM,GAAG,CAAC,CAAC9C,cAAc;IAC9B,IAAI,CAAC+C,OAAO,GAAG,GAAG,IAAI,CAACF,OAAO,CAACxC,oBAAoB,CAAC,CAAC,aAAa;IAClE;IACA,IAAI,CAAC2C,iBAAiB,GAAGpD,aAAa,CAAC,IAAI,CAACmD,OAAO,CAAC;EACtD;EAEA,MAAcE,eAAeA,CAAA,EAAkB;IAC7C,MAAMjB,MAAM,GAAG,MAAM,IAAI,CAACa,OAAO,CAACb,MAAM,CAAC,IAAI,CAACe,OAAO,CAAC;IACtD,IAAI,CAACf,MAAM,EAAE;MACX,MAAM,IAAI,CAACa,OAAO,CAACV,aAAa,CAAC,IAAI,CAACY,OAAO,CAAC;IAChD;EACF;;EAEA;EACAG,iBAAiBA,CAACrD,IAAY,EAAU;IACtC,OAAOD,aAAa,CAACC,IAAI,CAAC;EAC5B;EAEA,MAAMsD,UAAUA,CAACC,SAAiB,EAAE5C,IAAiB,EAAmB;IACtE,MAAM,IAAI,CAACyC,eAAe,CAAC,CAAC;IAE5B,MAAMI,UAAU,GAAG,GAAG,IAAI,CAACN,OAAO,GAAGK,SAAS,SAAS;IACvD,MAAM,IAAI,CAACP,OAAO,CAACtC,SAAS,CAAC8C,UAAU,EAAE7C,IAAI,CAAC;;IAE9C;IACA,OAAOZ,aAAa,CAACyD,UAAU,CAAC;EAClC;;EAEA;EACQC,gBAAgBA,CAACF,SAAiB,EAAU;IAClD,OAAO,GAAG,IAAI,CAACL,OAAO,GAAGK,SAAS,SAAS;EAC7C;EAEA,MAAMG,aAAaA,CAACH,SAAiB,EAA0B;IAC7D,MAAMC,UAAU,GAAG,IAAI,CAACC,gBAAgB,CAACF,SAAS,CAAC;IACnD,MAAMpB,MAAM,GAAG,MAAM,IAAI,CAACa,OAAO,CAACb,MAAM,CAACqB,UAAU,CAAC;IACpD;IACA,OAAOrB,MAAM,GAAGpC,aAAa,CAACyD,UAAU,CAAC,GAAG,IAAI;EAClD;EAEA,MAAMG,UAAUA,CAACJ,SAAiB,EAA+B;IAC/D,MAAMC,UAAU,GAAG,IAAI,CAACC,gBAAgB,CAACF,SAAS,CAAC;IACnD,MAAMpB,MAAM,GAAG,MAAM,IAAI,CAACa,OAAO,CAACb,MAAM,CAACqB,UAAU,CAAC;IACpD,IAAI,CAACrB,MAAM,EAAE,OAAO,IAAI;;IAExB;IACA,OAAO,IAAI,CAACa,OAAO,CAACpB,gBAAgB,CAAC4B,UAAU,CAAC;EAClD;EAEA,MAAMI,YAAYA,CAACL,SAAiB,EAAiB;IACnD,MAAMC,UAAU,GAAG,IAAI,CAACC,gBAAgB,CAACF,SAAS,CAAC;IACnD,IAAI,MAAM,IAAI,CAACP,OAAO,CAACb,MAAM,CAACqB,UAAU,CAAC,EAAE;MACzC,MAAM,IAAI,CAACR,OAAO,CAAChB,UAAU,CAACwB,UAAU,CAAC;IAC3C;EACF;EAEA,MAAMK,YAAYA,CAACC,MAAoB,EAAiB;IACtD,MAAM,IAAI,CAACV,eAAe,CAAC,CAAC;IAE5B,MAAMW,YAAY,GAAG,GAAG,IAAI,CAACb,OAAO,cAAc;IAClD,MAAM,IAAI,CAACF,OAAO,CAACtC,SAAS,CAACqD,YAAY,EAAEC,IAAI,CAACC,SAAS,CAACH,MAAM,CAAC,CAAC;EACpE;EAEA,MAAMI,WAAWA,CAAA,EAAiC;IAChD,MAAMH,YAAY,GAAG,GAAG,IAAI,CAACb,OAAO,cAAc;IAElD,IAAI;MACF,IAAI,MAAM,IAAI,CAACF,OAAO,CAACb,MAAM,CAAC4B,YAAY,CAAC,EAAE;QAC3C,MAAMI,OAAO,GAAG,MAAM,IAAI,CAACnB,OAAO,CAACtB,QAAQ,CAACqC,YAAY,CAAC;QACzD,OAAOC,IAAI,CAACI,KAAK,CAACD,OAAO,CAAC;MAC5B;IACF,CAAC,CAAC,MAAM;MACN;IAAA;IAGF,OAAO,IAAI;EACb;EAEA,MAAME,aAAaA,CAAA,EAAkB;IACnC,MAAMN,YAAY,GAAG,GAAG,IAAI,CAACb,OAAO,cAAc;IAClD,IAAI,MAAM,IAAI,CAACF,OAAO,CAACb,MAAM,CAAC4B,YAAY,CAAC,EAAE;MAC3C,MAAM,IAAI,CAACf,OAAO,CAAChB,UAAU,CAAC+B,YAAY,CAAC;IAC7C;EACF;EAEA,MAAMO,eAAeA,CAACC,aAAqB,EAAiB;IAC1D;IACA;EAAA;;EAGF;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAMC,wBAAwBA,CAAChB,UAAkB,EAAEiB,OAAgB,GAAG,KAAK,EAAoB;IAC7F,IAAI;MACF,IAAIrE,eAAe,EAAEsE,WAAW,EAAE;QAChC;QACA,MAAMC,cAAc,GAAG5E,aAAa,CAACyD,UAAU,CAAC;QAChD,MAAMpD,eAAe,CAACsE,WAAW,CAACC,cAAc,EAAEF,OAAO,CAAC;QAC1D,OAAO,IAAI;MACb,CAAC,MAAM;QACL;QACA;QACA,IAAIG,OAAO,EAAE;UACXC,OAAO,CAACC,GAAG,CAAC,+FAA+F,CAAC;QAC9G;QACA,OAAO,KAAK;MACd;IACF,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,IAAIH,OAAO,EAAE;QACXC,OAAO,CAACE,KAAK,CAAC,2DAA2D,EAAEA,KAAK,CAAC;MACnF;MACA,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;AACA;EACE,MAAMC,wBAAwBA,CAAA,EAAkB;IAC9C,IAAI;MACF,IAAI5E,eAAe,EAAE6E,kBAAkB,EAAE;QACvC,MAAM7E,eAAe,CAAC6E,kBAAkB,CAAC,CAAC;MAC5C;IACF,CAAC,CAAC,OAAOF,KAAK,EAAE;MACd,IAAIH,OAAO,EAAE;QACXC,OAAO,CAACE,KAAK,CAAC,6CAA6C,EAAEA,KAAK,CAAC;MACrE;IACF;EACF;AACF;AAACG,OAAA,CAAApC,aAAA,GAAAA,aAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_reactNative","require","normalizePath","path","startsWith","slice","arrayBufferToBase64","buffer","bytes","Uint8Array","chunkSize","chunks","i","length","chunk","subarray","Math","min","binary","j","String","fromCharCode","push","btoa","join","base64ToArrayBuffer","base64","atob","charCodeAt","ExpoFileSystem","OTAUpdateNative","NativeModules","OTAUpdate","ExpoStorageAdapter","getDocumentDirectory","documentDirectory","writeFile","data","ArrayBuffer","writeAsStringAsync","encoding","EncodingType","Base64","readFile","readAsStringAsync","readFileAsBuffer","deleteFile","deleteAsync","idempotent","exists","info","getInfoAsync","makeDirectory","makeDirectoryAsync","intermediates","NativeStorageAdapter","Error","writeFileBase64","readFileBase64","getStorageAdapter","UpdateStorage","constructor","storage","isExpo","baseDir","baseDirNormalized","ensureDirectory","getNormalizedPath","saveBundle","releaseId","bundlePath","getRawBundlePath","getBundlePath","readBundle","deleteBundle","saveMetadata","update","metadataPath","JSON","stringify","getMetadata","content","parse","clearMetadata","cleanOldBundles","keepReleaseId","validateBundle","bundleData","byteLength","preview","trimmed","trim","includes","jsIndicators","pattern","test","clearCorruptedBundle","metadata","isValid","__DEV__","console","warn","clearNativePendingBundle","error","registerBundleWithNative","restart","applyBundle","normalizedPath","log","clearPendingBundle","exports"],"sourceRoot":"../../../src","sources":["utils/storage.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -32,26 +32,39 @@ function hexToBytes(hex) {
|
|
|
32
32
|
return bytes;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
// Convert ArrayBuffer to base64 in chunks to avoid btoa() size limits
|
|
36
|
+
// btoa() can fail for strings > 2MB on some JS engines
|
|
37
|
+
// Chunk size must be multiple of 3 to avoid base64 padding issues between chunks
|
|
38
|
+
function arrayBufferToBase64(buffer) {
|
|
39
|
+
const bytes = new Uint8Array(buffer);
|
|
40
|
+
// 32766 is divisible by 3, so each chunk produces valid base64 without padding (except last)
|
|
41
|
+
const chunkSize = 32766;
|
|
42
|
+
const chunks = [];
|
|
43
|
+
for (let i = 0; i < bytes.length; i += chunkSize) {
|
|
44
|
+
const chunk = bytes.subarray(i, Math.min(i + chunkSize, bytes.length));
|
|
45
|
+
let binary = '';
|
|
46
|
+
for (let j = 0; j < chunk.length; j++) {
|
|
47
|
+
binary += String.fromCharCode(chunk[j]);
|
|
48
|
+
}
|
|
49
|
+
chunks.push(btoa(binary));
|
|
50
|
+
}
|
|
51
|
+
return chunks.join('');
|
|
52
|
+
}
|
|
53
|
+
|
|
35
54
|
// Calculate SHA-256 hash of data
|
|
36
55
|
async function calculateHash(data) {
|
|
37
|
-
|
|
38
|
-
// Use Expo Crypto
|
|
39
|
-
const hash = await ExpoCrypto.digestStringAsync(ExpoCrypto.CryptoDigestAlgorithm.SHA256, bufferToHex(data), {
|
|
40
|
-
encoding: ExpoCrypto.CryptoEncoding.HEX
|
|
41
|
-
});
|
|
42
|
-
return 'sha256:' + hash;
|
|
43
|
-
}
|
|
56
|
+
// Use native module first (most reliable for binary data)
|
|
44
57
|
if (OTAUpdateNative?.calculateSHA256) {
|
|
45
|
-
// Use
|
|
46
|
-
const
|
|
47
|
-
let binary = '';
|
|
48
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
49
|
-
binary += String.fromCharCode(bytes[i]);
|
|
50
|
-
}
|
|
51
|
-
const base64 = btoa(binary);
|
|
58
|
+
// Use chunked base64 encoding for large bundles
|
|
59
|
+
const base64 = arrayBufferToBase64(data);
|
|
52
60
|
const hash = await OTAUpdateNative.calculateSHA256(base64);
|
|
53
61
|
return 'sha256:' + hash;
|
|
54
62
|
}
|
|
63
|
+
if (ExpoCrypto?.digest) {
|
|
64
|
+
// Use Expo Crypto digest (takes Uint8Array, returns ArrayBuffer)
|
|
65
|
+
const hashBuffer = await ExpoCrypto.digest(ExpoCrypto.CryptoDigestAlgorithm.SHA256, new Uint8Array(data));
|
|
66
|
+
return 'sha256:' + bufferToHex(hashBuffer);
|
|
67
|
+
}
|
|
55
68
|
|
|
56
69
|
// Fallback: Use SubtleCrypto (not available in all RN environments)
|
|
57
70
|
if (typeof crypto !== 'undefined' && crypto.subtle) {
|
|
@@ -73,12 +86,8 @@ async function verifySignature(data, signatureHex, publicKeyHex) {
|
|
|
73
86
|
// We rely on native modules or skip if not available
|
|
74
87
|
|
|
75
88
|
if (OTAUpdateNative?.verifySignature) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
79
|
-
binary += String.fromCharCode(bytes[i]);
|
|
80
|
-
}
|
|
81
|
-
const base64 = btoa(binary);
|
|
89
|
+
// Use chunked base64 encoding for large bundles
|
|
90
|
+
const base64 = arrayBufferToBase64(data);
|
|
82
91
|
return OTAUpdateNative.verifySignature(base64, signatureHex, publicKeyHex);
|
|
83
92
|
}
|
|
84
93
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","ExpoCrypto","OTAUpdateNative","NativeModules","OTAUpdate","bufferToHex","buffer","bytes","Uint8Array","Array","from","map","b","toString","padStart","join","hexToBytes","hex","length","i","parseInt","substr","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","ExpoCrypto","OTAUpdateNative","NativeModules","OTAUpdate","bufferToHex","buffer","bytes","Uint8Array","Array","from","map","b","toString","padStart","join","hexToBytes","hex","length","i","parseInt","substr","arrayBufferToBase64","chunkSize","chunks","chunk","subarray","Math","min","binary","j","String","fromCharCode","push","btoa","calculateHash","data","calculateSHA256","base64","hash","digest","hashBuffer","CryptoDigestAlgorithm","SHA256","crypto","subtle","Error","verifyBundleHash","expectedHash","actualHash","verifySignature","signatureHex","publicKeyHex","__DEV__","console","warn","verifyBundle","signature","publicKey","hashValid","error","valid","signatureValid"],"sourceRoot":"../../../src","sources":["utils/verification.ts"],"mappings":"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","ignoreList":[]}
|