@vanikya/ota-react-native 0.1.7 → 0.1.9

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.
Files changed (36) hide show
  1. package/README.md +82 -7
  2. package/android/src/main/java/com/otaupdate/OTAUpdateModule.kt +94 -0
  3. package/ios/OTAUpdate.m +9 -0
  4. package/ios/OTAUpdate.swift +106 -0
  5. package/lib/commonjs/hooks/useOTAUpdate.js +42 -11
  6. package/lib/commonjs/hooks/useOTAUpdate.js.map +1 -1
  7. package/lib/commonjs/index.js +1 -1
  8. package/lib/commonjs/utils/api.js +53 -1
  9. package/lib/commonjs/utils/api.js.map +1 -1
  10. package/lib/commonjs/utils/storage.js +265 -13
  11. package/lib/commonjs/utils/storage.js.map +1 -1
  12. package/lib/commonjs/utils/verification.js +23 -12
  13. package/lib/commonjs/utils/verification.js.map +1 -1
  14. package/lib/module/hooks/useOTAUpdate.js +42 -11
  15. package/lib/module/hooks/useOTAUpdate.js.map +1 -1
  16. package/lib/module/index.js +1 -1
  17. package/lib/module/utils/api.js +53 -1
  18. package/lib/module/utils/api.js.map +1 -1
  19. package/lib/module/utils/storage.js +265 -13
  20. package/lib/module/utils/storage.js.map +1 -1
  21. package/lib/module/utils/verification.js +23 -12
  22. package/lib/module/utils/verification.js.map +1 -1
  23. package/lib/typescript/hooks/useOTAUpdate.d.ts +3 -0
  24. package/lib/typescript/hooks/useOTAUpdate.d.ts.map +1 -1
  25. package/lib/typescript/index.d.ts +1 -1
  26. package/lib/typescript/utils/api.d.ts +1 -0
  27. package/lib/typescript/utils/api.d.ts.map +1 -1
  28. package/lib/typescript/utils/storage.d.ts +39 -0
  29. package/lib/typescript/utils/storage.d.ts.map +1 -1
  30. package/lib/typescript/utils/verification.d.ts.map +1 -1
  31. package/package.json +2 -2
  32. package/src/hooks/useOTAUpdate.ts +46 -16
  33. package/src/index.ts +1 -1
  34. package/src/utils/api.ts +81 -1
  35. package/src/utils/storage.ts +317 -13
  36. package/src/utils/verification.ts +25 -12
@@ -40,7 +40,59 @@ export class OTAApiClient {
40
40
  if (!response.ok) {
41
41
  throw new Error(`Failed to download bundle: HTTP ${response.status}`);
42
42
  }
43
- return response.arrayBuffer();
43
+
44
+ // Validate content type if available
45
+ const contentType = response.headers.get('content-type');
46
+ if (contentType && contentType.includes('text/html')) {
47
+ throw new Error('Server returned HTML instead of JavaScript bundle. Check your server configuration.');
48
+ }
49
+ const data = await response.arrayBuffer();
50
+
51
+ // Basic validation: check if content looks like JavaScript
52
+ // JavaScript bundles typically start with specific patterns
53
+ if (!this.isValidJavaScriptBundle(data)) {
54
+ throw new Error('Downloaded content does not appear to be a valid JavaScript bundle');
55
+ }
56
+ return data;
57
+ }
58
+ isValidJavaScriptBundle(data) {
59
+ // Check minimum size (a valid bundle should be at least a few bytes)
60
+ if (data.byteLength < 10) {
61
+ return false;
62
+ }
63
+
64
+ // Read first 1000 bytes as string to check content
65
+ const bytes = new Uint8Array(data, 0, Math.min(1000, data.byteLength));
66
+ let preview = '';
67
+ for (let i = 0; i < bytes.length; i++) {
68
+ preview += String.fromCharCode(bytes[i]);
69
+ }
70
+ const trimmed = preview.trim();
71
+
72
+ // Check for HTML indicators (common error page patterns)
73
+ if (trimmed.startsWith('<!DOCTYPE') || trimmed.startsWith('<!doctype') || trimmed.startsWith('<html') || trimmed.startsWith('<HTML') || trimmed.includes('<head>') || trimmed.includes('<body>')) {
74
+ return false;
75
+ }
76
+
77
+ // JavaScript bundles typically start with:
78
+ // - var, let, const (variable declarations)
79
+ // - (function or !function (IIFEs)
80
+ // - "use strict"
81
+ // - Object.defineProperty (common in transpiled code)
82
+ // - __d( (Metro bundler format)
83
+ // - Comments: // or /*
84
+ const jsPatterns = [/^var\s/, /^let\s/, /^const\s/, /^\(function/, /^!function/, /^["']use strict["']/, /^Object\.defineProperty/, /^__d\(/, /^\/[/*]/, /^"use strict"/, /^__BUNDLE_START_TIME__/];
85
+ for (const pattern of jsPatterns) {
86
+ if (pattern.test(trimmed)) {
87
+ return true;
88
+ }
89
+ }
90
+
91
+ // Also accept if it contains common JS tokens (for minified bundles)
92
+ if (trimmed.includes('function') || trimmed.includes('exports') || trimmed.includes('require(') || trimmed.includes('__d(')) {
93
+ return true;
94
+ }
95
+ return false;
44
96
  }
45
97
  }
46
98
  export function getDeviceInfo() {
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","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","getDeviceInfo","os","OS","osVersion","Version","toString"],"sourceRoot":"../../../src","sources":["utils/api.ts"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAc;AAyCvC,OAAO,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,OAAOZ,QAAQ,CAACmB,WAAW,CAAC,CAAC;EAC/B;AACF;AAEA,OAAO,SAASC,aAAaA,CAAA,EAAsC;EACjE,OAAO;IACLC,EAAE,EAAE5B,QAAQ,CAAC6B,EAAE;IACfC,SAAS,EAAE9B,QAAQ,CAAC+B,OAAO,CAACC,QAAQ,CAAC;EACvC,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["Platform","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","getDeviceInfo","os","OS","osVersion","Version","toString"],"sourceRoot":"../../../src","sources":["utils/api.ts"],"mappings":"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","ignoreList":[]}
@@ -10,6 +10,35 @@ function normalizePath(path) {
10
10
  return path;
11
11
  }
12
12
 
13
+ // Convert ArrayBuffer to base64 in chunks to avoid btoa() size limits
14
+ // btoa() can fail for strings > 2MB on some JS engines
15
+ // Chunk size must be multiple of 3 to avoid base64 padding issues between chunks
16
+ function arrayBufferToBase64(buffer) {
17
+ const bytes = new Uint8Array(buffer);
18
+ // 32766 is divisible by 3, so each chunk produces valid base64 without padding (except last)
19
+ const chunkSize = 32766;
20
+ const chunks = [];
21
+ for (let i = 0; i < bytes.length; i += chunkSize) {
22
+ const chunk = bytes.subarray(i, Math.min(i + chunkSize, bytes.length));
23
+ let binary = '';
24
+ for (let j = 0; j < chunk.length; j++) {
25
+ binary += String.fromCharCode(chunk[j]);
26
+ }
27
+ chunks.push(btoa(binary));
28
+ }
29
+ return chunks.join('');
30
+ }
31
+
32
+ // Convert base64 to ArrayBuffer
33
+ function base64ToArrayBuffer(base64) {
34
+ const binary = atob(base64);
35
+ const bytes = new Uint8Array(binary.length);
36
+ for (let i = 0; i < binary.length; i++) {
37
+ bytes[i] = binary.charCodeAt(i);
38
+ }
39
+ return bytes.buffer;
40
+ }
41
+
13
42
  // Try to use Expo FileSystem if available
14
43
  // Use legacy API to avoid deprecation warnings in expo-file-system v54+
15
44
  let ExpoFileSystem = null;
@@ -35,13 +64,8 @@ class ExpoStorageAdapter {
35
64
  }
36
65
  async writeFile(path, data) {
37
66
  if (data instanceof ArrayBuffer) {
38
- // Convert ArrayBuffer to base64
39
- const bytes = new Uint8Array(data);
40
- let binary = '';
41
- for (let i = 0; i < bytes.length; i++) {
42
- binary += String.fromCharCode(bytes[i]);
43
- }
44
- const base64 = btoa(binary);
67
+ // Convert ArrayBuffer to base64 using chunked approach for large bundles
68
+ const base64 = arrayBufferToBase64(data);
45
69
  await ExpoFileSystem.writeAsStringAsync(path, base64, {
46
70
  encoding: ExpoFileSystem.EncodingType.Base64
47
71
  });
@@ -77,6 +101,61 @@ class ExpoStorageAdapter {
77
101
  intermediates: true
78
102
  });
79
103
  }
104
+ async downloadToFile(url, destPath) {
105
+ // Use Expo's downloadAsync which downloads directly to file
106
+ // This bypasses JS memory entirely - critical for large bundles
107
+ const result = await ExpoFileSystem.downloadAsync(url, destPath);
108
+ if (result.status !== 200) {
109
+ throw new Error(`Download failed with status ${result.status}`);
110
+ }
111
+
112
+ // Get file size
113
+ const info = await ExpoFileSystem.getInfoAsync(destPath);
114
+ return {
115
+ fileSize: info.size || 0
116
+ };
117
+ }
118
+ async calculateHashFromFile(path) {
119
+ // For Expo, we need to read the file and use expo-crypto
120
+ // Try to use expo-crypto if available
121
+ let ExpoCrypto = null;
122
+ try {
123
+ ExpoCrypto = require('expo-crypto');
124
+ } catch {
125
+ // expo-crypto not available
126
+ }
127
+ if (ExpoCrypto?.digest) {
128
+ // Read file as base64 and convert to Uint8Array
129
+ const base64 = await ExpoFileSystem.readAsStringAsync(path, {
130
+ encoding: ExpoFileSystem.EncodingType.Base64
131
+ });
132
+ const binary = atob(base64);
133
+ const bytes = new Uint8Array(binary.length);
134
+ for (let i = 0; i < binary.length; i++) {
135
+ bytes[i] = binary.charCodeAt(i);
136
+ }
137
+ const hashBuffer = await ExpoCrypto.digest(ExpoCrypto.CryptoDigestAlgorithm.SHA256, bytes);
138
+ // Convert ArrayBuffer to hex
139
+ const hashBytes = new Uint8Array(hashBuffer);
140
+ return Array.from(hashBytes).map(b => b.toString(16).padStart(2, '0')).join('');
141
+ }
142
+
143
+ // Fallback to SubtleCrypto if available
144
+ if (typeof crypto !== 'undefined' && crypto.subtle) {
145
+ const base64 = await ExpoFileSystem.readAsStringAsync(path, {
146
+ encoding: ExpoFileSystem.EncodingType.Base64
147
+ });
148
+ const binary = atob(base64);
149
+ const bytes = new Uint8Array(binary.length);
150
+ for (let i = 0; i < binary.length; i++) {
151
+ bytes[i] = binary.charCodeAt(i);
152
+ }
153
+ const hashBuffer = await crypto.subtle.digest('SHA-256', bytes.buffer);
154
+ const hashBytes = new Uint8Array(hashBuffer);
155
+ return Array.from(hashBytes).map(b => b.toString(16).padStart(2, '0')).join('');
156
+ }
157
+ throw new Error('No crypto implementation available for hash calculation');
158
+ }
80
159
  }
81
160
 
82
161
  // Native implementation for bare React Native
@@ -92,12 +171,8 @@ class NativeStorageAdapter {
92
171
  throw new Error('OTAUpdate native module not found');
93
172
  }
94
173
  if (data instanceof ArrayBuffer) {
95
- const bytes = new Uint8Array(data);
96
- let binary = '';
97
- for (let i = 0; i < bytes.length; i++) {
98
- binary += String.fromCharCode(bytes[i]);
99
- }
100
- const base64 = btoa(binary);
174
+ // Convert ArrayBuffer to base64 using chunked approach for large bundles
175
+ const base64 = arrayBufferToBase64(data);
101
176
  await OTAUpdateNative.writeFileBase64(path, base64);
102
177
  } else {
103
178
  await OTAUpdateNative.writeFile(path, data);
@@ -139,6 +214,50 @@ class NativeStorageAdapter {
139
214
  }
140
215
  await OTAUpdateNative.makeDirectory(path);
141
216
  }
217
+ async downloadToFile(url, destPath) {
218
+ if (!OTAUpdateNative) {
219
+ throw new Error('OTAUpdate native module not found');
220
+ }
221
+
222
+ // Use native module's downloadFile method if available (preferred)
223
+ if (OTAUpdateNative.downloadFile) {
224
+ const result = await OTAUpdateNative.downloadFile(url, destPath);
225
+ return {
226
+ fileSize: result.fileSize || 0
227
+ };
228
+ }
229
+
230
+ // Fallback: download via fetch and write in chunks
231
+ // This is less efficient but works without native download support
232
+ const response = await fetch(url);
233
+ if (!response.ok) {
234
+ throw new Error(`Download failed with status ${response.status}`);
235
+ }
236
+ const data = await response.arrayBuffer();
237
+ const base64 = arrayBufferToBase64(data);
238
+ await OTAUpdateNative.writeFileBase64(destPath, base64);
239
+ return {
240
+ fileSize: data.byteLength
241
+ };
242
+ }
243
+ async calculateHashFromFile(path) {
244
+ if (!OTAUpdateNative) {
245
+ throw new Error('OTAUpdate native module not found');
246
+ }
247
+
248
+ // Use native module's calculateSHA256FromFile if available (preferred - streams file)
249
+ if (OTAUpdateNative.calculateSHA256FromFile) {
250
+ return OTAUpdateNative.calculateSHA256FromFile(path);
251
+ }
252
+
253
+ // Fallback: read file as base64 and use the base64 hash method
254
+ // This loads the file into memory, but is better than nothing
255
+ if (OTAUpdateNative.calculateSHA256 && OTAUpdateNative.readFileBase64) {
256
+ const base64 = await OTAUpdateNative.readFileBase64(path);
257
+ return OTAUpdateNative.calculateSHA256(base64);
258
+ }
259
+ throw new Error('No hash calculation method available');
260
+ }
142
261
  }
143
262
 
144
263
  // Factory function to get the appropriate storage adapter
@@ -233,6 +352,139 @@ export class UpdateStorage {
233
352
  // In a more advanced implementation, we might keep a few for rollback
234
353
  }
235
354
 
355
+ /**
356
+ * Download bundle directly to file, bypassing JS memory.
357
+ * Critical for large bundles (5MB+).
358
+ *
359
+ * @param url The URL to download from
360
+ * @param releaseId The release ID (used for filename)
361
+ * @returns The normalized file path where bundle was saved
362
+ */
363
+ async downloadBundleToFile(url, releaseId) {
364
+ await this.ensureDirectory();
365
+ const bundlePath = `${this.baseDir}${releaseId}.bundle`;
366
+ const result = await this.storage.downloadToFile(url, bundlePath);
367
+
368
+ // Return normalized path for native module compatibility
369
+ return {
370
+ path: normalizePath(bundlePath),
371
+ fileSize: result.fileSize
372
+ };
373
+ }
374
+
375
+ /**
376
+ * Calculate SHA256 hash of a stored bundle file.
377
+ * Uses streaming to avoid loading entire file into memory.
378
+ *
379
+ * @param releaseId The release ID of the bundle
380
+ * @returns The hash string (without 'sha256:' prefix)
381
+ */
382
+ async calculateBundleHash(releaseId) {
383
+ const bundlePath = this.getRawBundlePath(releaseId);
384
+ if (!(await this.storage.exists(bundlePath))) {
385
+ throw new Error('Bundle file not found');
386
+ }
387
+ if (this.storage.calculateHashFromFile) {
388
+ return this.storage.calculateHashFromFile(bundlePath);
389
+ }
390
+
391
+ // Fallback: read file into memory and calculate hash
392
+ // This is not ideal for large files but works as a fallback
393
+ const data = await this.storage.readFileAsBuffer(bundlePath);
394
+ const bytes = new Uint8Array(data);
395
+
396
+ // Use SubtleCrypto if available
397
+ if (typeof crypto !== 'undefined' && crypto.subtle) {
398
+ const hashBuffer = await crypto.subtle.digest('SHA-256', bytes.buffer);
399
+ const hashBytes = new Uint8Array(hashBuffer);
400
+ return Array.from(hashBytes).map(b => b.toString(16).padStart(2, '0')).join('');
401
+ }
402
+ throw new Error('No hash calculation method available');
403
+ }
404
+
405
+ /**
406
+ * Validate that a stored bundle is a valid JavaScript file.
407
+ * This helps detect corrupted downloads (e.g., HTML error pages saved as bundles).
408
+ *
409
+ * @param releaseId The release ID to validate
410
+ * @returns true if bundle is valid JavaScript, false otherwise
411
+ */
412
+ async validateBundle(releaseId) {
413
+ try {
414
+ const bundleData = await this.readBundle(releaseId);
415
+ if (!bundleData) {
416
+ return false;
417
+ }
418
+
419
+ // Check minimum size
420
+ if (bundleData.byteLength < 10) {
421
+ return false;
422
+ }
423
+
424
+ // Read first 1000 bytes to check content
425
+ const bytes = new Uint8Array(bundleData, 0, Math.min(1000, bundleData.byteLength));
426
+ let preview = '';
427
+ for (let i = 0; i < bytes.length; i++) {
428
+ preview += String.fromCharCode(bytes[i]);
429
+ }
430
+ const trimmed = preview.trim();
431
+
432
+ // Check for HTML indicators (common error page patterns)
433
+ if (trimmed.startsWith('<!DOCTYPE') || trimmed.startsWith('<!doctype') || trimmed.startsWith('<html') || trimmed.startsWith('<HTML') || trimmed.includes('<head>') || trimmed.includes('<body>')) {
434
+ return false;
435
+ }
436
+
437
+ // Accept if it looks like JavaScript
438
+ const jsIndicators = [/^var\s/, /^let\s/, /^const\s/, /^\(function/, /^!function/, /^["']use strict["']/, /^Object\.defineProperty/, /^__d\(/, /^\/[/*]/, /^"use strict"/, /^__BUNDLE_START_TIME__/];
439
+ for (const pattern of jsIndicators) {
440
+ if (pattern.test(trimmed)) {
441
+ return true;
442
+ }
443
+ }
444
+
445
+ // Also check for common JS tokens in minified bundles
446
+ if (trimmed.includes('function') || trimmed.includes('exports') || trimmed.includes('require(') || trimmed.includes('__d(')) {
447
+ return true;
448
+ }
449
+ return false;
450
+ } catch {
451
+ return false;
452
+ }
453
+ }
454
+
455
+ /**
456
+ * Clear corrupted bundle if detected.
457
+ * Call this on app startup to recover from bad OTA updates.
458
+ *
459
+ * @returns true if a corrupted bundle was cleared, false otherwise
460
+ */
461
+ async clearCorruptedBundle() {
462
+ try {
463
+ const metadata = await this.getMetadata();
464
+ if (!metadata) {
465
+ return false;
466
+ }
467
+ const isValid = await this.validateBundle(metadata.releaseId);
468
+ if (!isValid) {
469
+ if (__DEV__) {
470
+ console.warn('[OTAUpdate] Detected corrupted bundle, clearing...');
471
+ }
472
+
473
+ // Clear the corrupted bundle
474
+ await this.deleteBundle(metadata.releaseId);
475
+ await this.clearMetadata();
476
+ await this.clearNativePendingBundle();
477
+ return true;
478
+ }
479
+ return false;
480
+ } catch (error) {
481
+ if (__DEV__) {
482
+ console.error('[OTAUpdate] Error checking bundle:', error);
483
+ }
484
+ return false;
485
+ }
486
+ }
487
+
236
488
  /**
237
489
  * Register the bundle path with the native module.
238
490
  * This saves the path to SharedPreferences (Android) or UserDefaults (iOS)
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","normalizePath","path","startsWith","slice","ExpoFileSystem","require","OTAUpdateNative","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"],"sourceRoot":"../../../src","sources":["utils/storage.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeModules","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","require","OTAUpdateNative","OTAUpdate","ExpoStorageAdapter","getDocumentDirectory","documentDirectory","writeFile","data","ArrayBuffer","writeAsStringAsync","encoding","EncodingType","Base64","readFile","readAsStringAsync","readFileAsBuffer","deleteFile","deleteAsync","idempotent","exists","info","getInfoAsync","makeDirectory","makeDirectoryAsync","intermediates","downloadToFile","url","destPath","result","downloadAsync","status","Error","fileSize","size","calculateHashFromFile","ExpoCrypto","digest","hashBuffer","CryptoDigestAlgorithm","SHA256","hashBytes","Array","from","map","b","toString","padStart","crypto","subtle","NativeStorageAdapter","writeFileBase64","readFileBase64","downloadFile","response","fetch","ok","arrayBuffer","byteLength","calculateSHA256FromFile","calculateSHA256","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","downloadBundleToFile","calculateBundleHash","validateBundle","bundleData","preview","trimmed","trim","includes","jsIndicators","pattern","test","clearCorruptedBundle","metadata","isValid","__DEV__","console","warn","clearNativePendingBundle","error","registerBundleWithNative","restart","applyBundle","normalizedPath","log","clearPendingBundle"],"sourceRoot":"../../../src","sources":["utils/storage.ts"],"mappings":"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","ignoreList":[]}
@@ -24,16 +24,31 @@ function hexToBytes(hex) {
24
24
  return bytes;
25
25
  }
26
26
 
27
+ // Convert ArrayBuffer to base64 in chunks to avoid btoa() size limits
28
+ // btoa() can fail for strings > 2MB on some JS engines
29
+ // Chunk size must be multiple of 3 to avoid base64 padding issues between chunks
30
+ function arrayBufferToBase64(buffer) {
31
+ const bytes = new Uint8Array(buffer);
32
+ // 32766 is divisible by 3, so each chunk produces valid base64 without padding (except last)
33
+ const chunkSize = 32766;
34
+ const chunks = [];
35
+ for (let i = 0; i < bytes.length; i += chunkSize) {
36
+ const chunk = bytes.subarray(i, Math.min(i + chunkSize, bytes.length));
37
+ let binary = '';
38
+ for (let j = 0; j < chunk.length; j++) {
39
+ binary += String.fromCharCode(chunk[j]);
40
+ }
41
+ chunks.push(btoa(binary));
42
+ }
43
+ return chunks.join('');
44
+ }
45
+
27
46
  // Calculate SHA-256 hash of data
28
47
  export async function calculateHash(data) {
29
48
  // Use native module first (most reliable for binary data)
30
49
  if (OTAUpdateNative?.calculateSHA256) {
31
- const bytes = new Uint8Array(data);
32
- let binary = '';
33
- for (let i = 0; i < bytes.length; i++) {
34
- binary += String.fromCharCode(bytes[i]);
35
- }
36
- const base64 = btoa(binary);
50
+ // Use chunked base64 encoding for large bundles
51
+ const base64 = arrayBufferToBase64(data);
37
52
  const hash = await OTAUpdateNative.calculateSHA256(base64);
38
53
  return 'sha256:' + hash;
39
54
  }
@@ -63,12 +78,8 @@ export async function verifySignature(data, signatureHex, publicKeyHex) {
63
78
  // We rely on native modules or skip if not available
64
79
 
65
80
  if (OTAUpdateNative?.verifySignature) {
66
- const bytes = new Uint8Array(data);
67
- let binary = '';
68
- for (let i = 0; i < bytes.length; i++) {
69
- binary += String.fromCharCode(bytes[i]);
70
- }
71
- const base64 = btoa(binary);
81
+ // Use chunked base64 encoding for large bundles
82
+ const base64 = arrayBufferToBase64(data);
72
83
  return OTAUpdateNative.verifySignature(base64, signatureHex, publicKeyHex);
73
84
  }
74
85
 
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","ExpoCrypto","require","OTAUpdateNative","OTAUpdate","bufferToHex","buffer","bytes","Uint8Array","Array","from","map","b","toString","padStart","join","hexToBytes","hex","length","i","parseInt","substr","calculateHash","data","calculateSHA256","binary","String","fromCharCode","base64","btoa","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":[]}
1
+ {"version":3,"names":["NativeModules","ExpoCrypto","require","OTAUpdateNative","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":[]}
@@ -26,10 +26,13 @@ export interface UseOTAUpdateResult {
26
26
  downloadProgress: DownloadProgress | null;
27
27
  error: Error | null;
28
28
  currentVersion: string | null;
29
+ isDismissed: boolean;
29
30
  checkForUpdate: () => Promise<UpdateInfo | null>;
30
31
  downloadUpdate: () => Promise<void>;
31
32
  applyUpdate: (restartApp?: boolean) => Promise<void>;
32
33
  clearPendingUpdate: () => Promise<void>;
34
+ dismissUpdate: () => void;
35
+ resetDismiss: () => void;
33
36
  }
34
37
  export declare function useOTAUpdate(config: OTAUpdateConfig): UseOTAUpdateResult;
35
38
  //# sourceMappingURL=useOTAUpdate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useOTAUpdate.d.ts","sourceRoot":"","sources":["../../../src/hooks/useOTAUpdate.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,UAAU,GACV,WAAW,GACX,aAAa,GACb,WAAW,GACX,OAAO,GACP,UAAU,GACV,OAAO,GACP,YAAY,CAAC;AAEjB,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAWD,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,kBAAkB,CA2SxE"}
1
+ {"version":3,"file":"useOTAUpdate.d.ts","sourceRoot":"","sources":["../../../src/hooks/useOTAUpdate.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,UAAU,GACV,WAAW,GACX,aAAa,GACb,WAAW,GACX,OAAO,GACP,UAAU,GACV,OAAO,GACP,YAAY,CAAC;AAEjB,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAWD,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,kBAAkB,CAuUxE"}
@@ -8,5 +8,5 @@ export { UpdateStorage, getStorageAdapter } from './utils/storage';
8
8
  export type { StoredUpdate, StorageAdapter } from './utils/storage';
9
9
  export { calculateHash, verifyBundleHash, verifySignature, verifyBundle, } from './utils/verification';
10
10
  export type { VerificationResult } from './utils/verification';
11
- export declare const VERSION = "0.1.0";
11
+ export declare const VERSION = "0.1.8";
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -39,6 +39,7 @@ export declare class OTAApiClient {
39
39
  checkUpdate(request: CheckUpdateRequest): Promise<CheckUpdateResponse>;
40
40
  reportEvent(request: ReportEventRequest): Promise<void>;
41
41
  downloadBundle(bundleUrl: string): Promise<ArrayBuffer>;
42
+ private isValidJavaScriptBundle;
42
43
  }
43
44
  export declare function getDeviceInfo(): {
44
45
  os: string;
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/utils/api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAIvB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiBtE,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBvD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAS9D;AAED,wBAAgB,aAAa,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAKjE"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/utils/api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAIvB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiBtE,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBvD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAwB7D,OAAO,CAAC,uBAAuB;CAiEhC;AAED,wBAAgB,aAAa,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAKjE"}
@@ -13,6 +13,10 @@ export interface StorageAdapter {
13
13
  deleteFile(path: string): Promise<void>;
14
14
  exists(path: string): Promise<boolean>;
15
15
  makeDirectory(path: string): Promise<void>;
16
+ downloadToFile(url: string, destPath: string): Promise<{
17
+ fileSize: number;
18
+ }>;
19
+ calculateHashFromFile?(path: string): Promise<string>;
16
20
  }
17
21
  export declare function getStorageAdapter(): StorageAdapter;
18
22
  export declare class UpdateStorage {
@@ -32,6 +36,41 @@ export declare class UpdateStorage {
32
36
  getMetadata(): Promise<StoredUpdate | null>;
33
37
  clearMetadata(): Promise<void>;
34
38
  cleanOldBundles(keepReleaseId: string): Promise<void>;
39
+ /**
40
+ * Download bundle directly to file, bypassing JS memory.
41
+ * Critical for large bundles (5MB+).
42
+ *
43
+ * @param url The URL to download from
44
+ * @param releaseId The release ID (used for filename)
45
+ * @returns The normalized file path where bundle was saved
46
+ */
47
+ downloadBundleToFile(url: string, releaseId: string): Promise<{
48
+ path: string;
49
+ fileSize: number;
50
+ }>;
51
+ /**
52
+ * Calculate SHA256 hash of a stored bundle file.
53
+ * Uses streaming to avoid loading entire file into memory.
54
+ *
55
+ * @param releaseId The release ID of the bundle
56
+ * @returns The hash string (without 'sha256:' prefix)
57
+ */
58
+ calculateBundleHash(releaseId: string): Promise<string>;
59
+ /**
60
+ * Validate that a stored bundle is a valid JavaScript file.
61
+ * This helps detect corrupted downloads (e.g., HTML error pages saved as bundles).
62
+ *
63
+ * @param releaseId The release ID to validate
64
+ * @returns true if bundle is valid JavaScript, false otherwise
65
+ */
66
+ validateBundle(releaseId: string): Promise<boolean>;
67
+ /**
68
+ * Clear corrupted bundle if detected.
69
+ * Call this on app startup to recover from bad OTA updates.
70
+ *
71
+ * @returns true if a corrupted bundle was cleared, false otherwise
72
+ */
73
+ clearCorruptedBundle(): Promise<boolean>;
35
74
  /**
36
75
  * Register the bundle path with the native module.
37
76
  * This saves the path to SharedPreferences (Android) or UserDefaults (iOS)