@vanikya/ota-react-native 0.1.8 → 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.
- package/android/src/main/java/com/otaupdate/OTAUpdateModule.kt +94 -0
- package/ios/OTAUpdate.m +9 -0
- package/ios/OTAUpdate.swift +106 -0
- package/lib/commonjs/hooks/useOTAUpdate.js +22 -10
- package/lib/commonjs/hooks/useOTAUpdate.js.map +1 -1
- package/lib/commonjs/utils/storage.js +149 -0
- package/lib/commonjs/utils/storage.js.map +1 -1
- package/lib/module/hooks/useOTAUpdate.js +22 -10
- package/lib/module/hooks/useOTAUpdate.js.map +1 -1
- package/lib/module/utils/storage.js +149 -0
- package/lib/module/utils/storage.js.map +1 -1
- package/lib/typescript/hooks/useOTAUpdate.d.ts.map +1 -1
- package/lib/typescript/utils/storage.d.ts +24 -0
- package/lib/typescript/utils/storage.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/hooks/useOTAUpdate.ts +24 -16
- package/src/utils/storage.ts +170 -0
|
@@ -5,6 +5,10 @@ import android.content.SharedPreferences
|
|
|
5
5
|
import android.util.Base64
|
|
6
6
|
import com.facebook.react.bridge.*
|
|
7
7
|
import java.io.File
|
|
8
|
+
import java.io.FileOutputStream
|
|
9
|
+
import java.io.InputStream
|
|
10
|
+
import java.net.HttpURLConnection
|
|
11
|
+
import java.net.URL
|
|
8
12
|
import java.security.MessageDigest
|
|
9
13
|
|
|
10
14
|
class OTAUpdateModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
|
|
@@ -92,6 +96,65 @@ class OTAUpdateModule(reactContext: ReactApplicationContext) : ReactContextBaseJ
|
|
|
92
96
|
}
|
|
93
97
|
}
|
|
94
98
|
|
|
99
|
+
// Download file directly to disk - bypasses JS memory entirely
|
|
100
|
+
// This is critical for large bundles (5MB+)
|
|
101
|
+
@ReactMethod
|
|
102
|
+
fun downloadFile(urlString: String, destPath: String, promise: Promise) {
|
|
103
|
+
Thread {
|
|
104
|
+
var connection: HttpURLConnection? = null
|
|
105
|
+
var inputStream: InputStream? = null
|
|
106
|
+
var outputStream: FileOutputStream? = null
|
|
107
|
+
|
|
108
|
+
try {
|
|
109
|
+
val url = URL(urlString)
|
|
110
|
+
connection = url.openConnection() as HttpURLConnection
|
|
111
|
+
connection.connectTimeout = 30000
|
|
112
|
+
connection.readTimeout = 60000
|
|
113
|
+
connection.requestMethod = "GET"
|
|
114
|
+
connection.connect()
|
|
115
|
+
|
|
116
|
+
val responseCode = connection.responseCode
|
|
117
|
+
if (responseCode != HttpURLConnection.HTTP_OK) {
|
|
118
|
+
promise.reject("DOWNLOAD_ERROR", "Download failed with status $responseCode")
|
|
119
|
+
return@Thread
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Ensure parent directory exists
|
|
123
|
+
val destFile = File(destPath)
|
|
124
|
+
destFile.parentFile?.mkdirs()
|
|
125
|
+
|
|
126
|
+
inputStream = connection.inputStream
|
|
127
|
+
outputStream = FileOutputStream(destFile)
|
|
128
|
+
|
|
129
|
+
val buffer = ByteArray(8192) // 8KB buffer for efficient streaming
|
|
130
|
+
var bytesRead: Int
|
|
131
|
+
var totalBytesRead: Long = 0
|
|
132
|
+
|
|
133
|
+
while (inputStream.read(buffer).also { bytesRead = it } != -1) {
|
|
134
|
+
outputStream.write(buffer, 0, bytesRead)
|
|
135
|
+
totalBytesRead += bytesRead
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
outputStream.flush()
|
|
139
|
+
|
|
140
|
+
val result = Arguments.createMap()
|
|
141
|
+
result.putDouble("fileSize", totalBytesRead.toDouble())
|
|
142
|
+
promise.resolve(result)
|
|
143
|
+
|
|
144
|
+
} catch (e: Exception) {
|
|
145
|
+
promise.reject("DOWNLOAD_ERROR", "Failed to download file: ${e.message}", e)
|
|
146
|
+
} finally {
|
|
147
|
+
try {
|
|
148
|
+
inputStream?.close()
|
|
149
|
+
outputStream?.close()
|
|
150
|
+
connection?.disconnect()
|
|
151
|
+
} catch (e: Exception) {
|
|
152
|
+
// Ignore cleanup errors
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}.start()
|
|
156
|
+
}
|
|
157
|
+
|
|
95
158
|
// Cryptography
|
|
96
159
|
|
|
97
160
|
@ReactMethod
|
|
@@ -107,6 +170,37 @@ class OTAUpdateModule(reactContext: ReactApplicationContext) : ReactContextBaseJ
|
|
|
107
170
|
}
|
|
108
171
|
}
|
|
109
172
|
|
|
173
|
+
// Calculate SHA256 from file path - streams file to avoid memory issues
|
|
174
|
+
// Critical for large bundles (5MB+)
|
|
175
|
+
@ReactMethod
|
|
176
|
+
fun calculateSHA256FromFile(filePath: String, promise: Promise) {
|
|
177
|
+
Thread {
|
|
178
|
+
try {
|
|
179
|
+
val file = File(filePath)
|
|
180
|
+
if (!file.exists()) {
|
|
181
|
+
promise.reject("FILE_ERROR", "File not found: $filePath")
|
|
182
|
+
return@Thread
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
val digest = MessageDigest.getInstance("SHA-256")
|
|
186
|
+
val buffer = ByteArray(8192) // 8KB buffer
|
|
187
|
+
var bytesRead: Int
|
|
188
|
+
|
|
189
|
+
file.inputStream().use { inputStream ->
|
|
190
|
+
while (inputStream.read(buffer).also { bytesRead = it } != -1) {
|
|
191
|
+
digest.update(buffer, 0, bytesRead)
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
val hash = digest.digest()
|
|
196
|
+
val hexString = hash.joinToString("") { "%02x".format(it) }
|
|
197
|
+
promise.resolve(hexString)
|
|
198
|
+
} catch (e: Exception) {
|
|
199
|
+
promise.reject("HASH_ERROR", "Failed to calculate hash: ${e.message}", e)
|
|
200
|
+
}
|
|
201
|
+
}.start()
|
|
202
|
+
}
|
|
203
|
+
|
|
110
204
|
@ReactMethod
|
|
111
205
|
fun verifySignature(base64Content: String, signatureHex: String, publicKeyHex: String, promise: Promise) {
|
|
112
206
|
// Ed25519 signature verification
|
package/ios/OTAUpdate.m
CHANGED
|
@@ -35,11 +35,20 @@ RCT_EXTERN_METHOD(makeDirectory:(NSString *)path
|
|
|
35
35
|
resolver:(RCTPromiseResolveBlock)resolver
|
|
36
36
|
rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
37
37
|
|
|
38
|
+
RCT_EXTERN_METHOD(downloadFile:(NSString *)urlString
|
|
39
|
+
destPath:(NSString *)destPath
|
|
40
|
+
resolver:(RCTPromiseResolveBlock)resolver
|
|
41
|
+
rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
42
|
+
|
|
38
43
|
// Cryptography
|
|
39
44
|
RCT_EXTERN_METHOD(calculateSHA256:(NSString *)base64Content
|
|
40
45
|
resolver:(RCTPromiseResolveBlock)resolver
|
|
41
46
|
rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
42
47
|
|
|
48
|
+
RCT_EXTERN_METHOD(calculateSHA256FromFile:(NSString *)filePath
|
|
49
|
+
resolver:(RCTPromiseResolveBlock)resolver
|
|
50
|
+
rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
51
|
+
|
|
43
52
|
RCT_EXTERN_METHOD(verifySignature:(NSString *)base64Content
|
|
44
53
|
signatureHex:(NSString *)signatureHex
|
|
45
54
|
publicKeyHex:(NSString *)publicKeyHex
|
package/ios/OTAUpdate.swift
CHANGED
|
@@ -85,6 +85,70 @@ class OTAUpdate: NSObject {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
// Download file directly to disk - bypasses JS memory entirely
|
|
89
|
+
// This is critical for large bundles (5MB+)
|
|
90
|
+
@objc
|
|
91
|
+
func downloadFile(_ urlString: String, destPath: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
92
|
+
guard let url = URL(string: urlString) else {
|
|
93
|
+
rejecter("DOWNLOAD_ERROR", "Invalid URL: \(urlString)", nil)
|
|
94
|
+
return
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
let destURL = URL(fileURLWithPath: destPath)
|
|
98
|
+
|
|
99
|
+
// Ensure parent directory exists
|
|
100
|
+
let parentDir = destURL.deletingLastPathComponent()
|
|
101
|
+
do {
|
|
102
|
+
try FileManager.default.createDirectory(at: parentDir, withIntermediateDirectories: true, attributes: nil)
|
|
103
|
+
} catch {
|
|
104
|
+
rejecter("DOWNLOAD_ERROR", "Failed to create directory: \(error.localizedDescription)", error)
|
|
105
|
+
return
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
let task = URLSession.shared.downloadTask(with: url) { tempURL, response, error in
|
|
109
|
+
if let error = error {
|
|
110
|
+
rejecter("DOWNLOAD_ERROR", "Download failed: \(error.localizedDescription)", error)
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
guard let httpResponse = response as? HTTPURLResponse else {
|
|
115
|
+
rejecter("DOWNLOAD_ERROR", "Invalid response", nil)
|
|
116
|
+
return
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
guard httpResponse.statusCode == 200 else {
|
|
120
|
+
rejecter("DOWNLOAD_ERROR", "Download failed with status \(httpResponse.statusCode)", nil)
|
|
121
|
+
return
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
guard let tempURL = tempURL else {
|
|
125
|
+
rejecter("DOWNLOAD_ERROR", "No temporary file created", nil)
|
|
126
|
+
return
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
do {
|
|
130
|
+
// Remove existing file if it exists
|
|
131
|
+
if FileManager.default.fileExists(atPath: destPath) {
|
|
132
|
+
try FileManager.default.removeItem(atPath: destPath)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Move downloaded file to destination
|
|
136
|
+
try FileManager.default.moveItem(at: tempURL, to: destURL)
|
|
137
|
+
|
|
138
|
+
// Get file size
|
|
139
|
+
let attributes = try FileManager.default.attributesOfItem(atPath: destPath)
|
|
140
|
+
let fileSize = attributes[.size] as? Int64 ?? 0
|
|
141
|
+
|
|
142
|
+
let result: [String: Any] = ["fileSize": fileSize]
|
|
143
|
+
resolver(result)
|
|
144
|
+
} catch {
|
|
145
|
+
rejecter("DOWNLOAD_ERROR", "Failed to save file: \(error.localizedDescription)", error)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
task.resume()
|
|
150
|
+
}
|
|
151
|
+
|
|
88
152
|
// MARK: - Cryptography
|
|
89
153
|
|
|
90
154
|
@objc
|
|
@@ -103,6 +167,48 @@ class OTAUpdate: NSObject {
|
|
|
103
167
|
resolver(hexString)
|
|
104
168
|
}
|
|
105
169
|
|
|
170
|
+
// Calculate SHA256 from file path - streams file to avoid memory issues
|
|
171
|
+
// Critical for large bundles (5MB+)
|
|
172
|
+
@objc
|
|
173
|
+
func calculateSHA256FromFile(_ filePath: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
174
|
+
DispatchQueue.global(qos: .userInitiated).async {
|
|
175
|
+
guard FileManager.default.fileExists(atPath: filePath) else {
|
|
176
|
+
rejecter("FILE_ERROR", "File not found: \(filePath)", nil)
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
guard let inputStream = InputStream(fileAtPath: filePath) else {
|
|
181
|
+
rejecter("FILE_ERROR", "Could not open file: \(filePath)", nil)
|
|
182
|
+
return
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
inputStream.open()
|
|
186
|
+
defer { inputStream.close() }
|
|
187
|
+
|
|
188
|
+
var context = CC_SHA256_CTX()
|
|
189
|
+
CC_SHA256_Init(&context)
|
|
190
|
+
|
|
191
|
+
let bufferSize = 8192 // 8KB buffer
|
|
192
|
+
var buffer = [UInt8](repeating: 0, count: bufferSize)
|
|
193
|
+
|
|
194
|
+
while inputStream.hasBytesAvailable {
|
|
195
|
+
let bytesRead = inputStream.read(&buffer, maxLength: bufferSize)
|
|
196
|
+
if bytesRead > 0 {
|
|
197
|
+
CC_SHA256_Update(&context, buffer, CC_LONG(bytesRead))
|
|
198
|
+
} else if bytesRead < 0 {
|
|
199
|
+
rejecter("READ_ERROR", "Error reading file", inputStream.streamError)
|
|
200
|
+
return
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
|
|
205
|
+
CC_SHA256_Final(&hash, &context)
|
|
206
|
+
|
|
207
|
+
let hexString = hash.map { String(format: "%02x", $0) }.joined()
|
|
208
|
+
resolver(hexString)
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
106
212
|
@objc
|
|
107
213
|
func verifySignature(_ base64Content: String, signatureHex: String, publicKeyHex: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
108
214
|
// Ed25519 signature verification
|
|
@@ -8,7 +8,6 @@ var _react = require("react");
|
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
9
|
var _api = require("../utils/api");
|
|
10
10
|
var _storage = require("../utils/storage");
|
|
11
|
-
var _verification = require("../utils/verification");
|
|
12
11
|
// Generate or get device ID
|
|
13
12
|
async function getDeviceId() {
|
|
14
13
|
// Try to get from native module or AsyncStorage
|
|
@@ -125,23 +124,36 @@ function useOTAUpdate(config) {
|
|
|
125
124
|
deviceInfo: (0, _api.getDeviceInfo)()
|
|
126
125
|
});
|
|
127
126
|
|
|
128
|
-
// Download bundle
|
|
129
|
-
const
|
|
127
|
+
// Download bundle directly to file (bypasses JS memory - critical for large bundles)
|
|
128
|
+
const downloadResult = await storage.current.downloadBundleToFile(release.bundleUrl, release.id);
|
|
130
129
|
setDownloadProgress({
|
|
131
|
-
downloadedBytes:
|
|
130
|
+
downloadedBytes: downloadResult.fileSize,
|
|
132
131
|
totalBytes: release.bundleSize,
|
|
133
132
|
percentage: 100
|
|
134
133
|
});
|
|
135
134
|
|
|
136
|
-
// Verify bundle
|
|
135
|
+
// Verify bundle hash
|
|
137
136
|
setStatus('verifying');
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
137
|
+
|
|
138
|
+
// Calculate hash from file (streaming to avoid memory issues)
|
|
139
|
+
const actualHash = await storage.current.calculateBundleHash(release.id);
|
|
140
|
+
const expectedHashWithoutPrefix = release.bundleHash.replace(/^sha256:/, '');
|
|
141
|
+
if (actualHash !== expectedHashWithoutPrefix) {
|
|
142
|
+
// Delete corrupted bundle
|
|
143
|
+
await storage.current.deleteBundle(release.id);
|
|
144
|
+
throw new Error(`Bundle hash mismatch: expected ${expectedHashWithoutPrefix}, got ${actualHash}`);
|
|
141
145
|
}
|
|
142
146
|
|
|
143
|
-
//
|
|
144
|
-
const
|
|
147
|
+
// Validate bundle content (check it's actually JavaScript, not an error page)
|
|
148
|
+
const isValid = await storage.current.validateBundle(release.id);
|
|
149
|
+
if (!isValid) {
|
|
150
|
+
await storage.current.deleteBundle(release.id);
|
|
151
|
+
throw new Error('Downloaded content is not a valid JavaScript bundle');
|
|
152
|
+
}
|
|
153
|
+
if (__DEV__) {
|
|
154
|
+
console.log('[OTAUpdate] Bundle verified successfully');
|
|
155
|
+
}
|
|
156
|
+
const bundlePath = downloadResult.path;
|
|
145
157
|
|
|
146
158
|
// Save metadata
|
|
147
159
|
await storage.current.saveMetadata({
|
|
@@ -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","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":[]}
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_api","_storage","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","downloadResult","downloadBundleToFile","bundleUrl","fileSize","actualHash","calculateBundleHash","expectedHashWithoutPrefix","bundleHash","replace","deleteBundle","isValid","validateBundle","__DEV__","console","log","bundlePath","path","saveMetadata","downloadedAt","Date","now","registered","registerBundleWithNative","errorMessage","message","applyUpdate","restartApp","clearPendingUpdate","clearMetadata","clearNativePendingBundle","dismissUpdate","resetDismiss","handleAppStateChange","nextAppState","subscription","AppState","addEventListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useOTAUpdate.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -107,6 +107,61 @@ class ExpoStorageAdapter {
|
|
|
107
107
|
intermediates: true
|
|
108
108
|
});
|
|
109
109
|
}
|
|
110
|
+
async downloadToFile(url, destPath) {
|
|
111
|
+
// Use Expo's downloadAsync which downloads directly to file
|
|
112
|
+
// This bypasses JS memory entirely - critical for large bundles
|
|
113
|
+
const result = await ExpoFileSystem.downloadAsync(url, destPath);
|
|
114
|
+
if (result.status !== 200) {
|
|
115
|
+
throw new Error(`Download failed with status ${result.status}`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Get file size
|
|
119
|
+
const info = await ExpoFileSystem.getInfoAsync(destPath);
|
|
120
|
+
return {
|
|
121
|
+
fileSize: info.size || 0
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async calculateHashFromFile(path) {
|
|
125
|
+
// For Expo, we need to read the file and use expo-crypto
|
|
126
|
+
// Try to use expo-crypto if available
|
|
127
|
+
let ExpoCrypto = null;
|
|
128
|
+
try {
|
|
129
|
+
ExpoCrypto = require('expo-crypto');
|
|
130
|
+
} catch {
|
|
131
|
+
// expo-crypto not available
|
|
132
|
+
}
|
|
133
|
+
if (ExpoCrypto?.digest) {
|
|
134
|
+
// Read file as base64 and convert to Uint8Array
|
|
135
|
+
const base64 = await ExpoFileSystem.readAsStringAsync(path, {
|
|
136
|
+
encoding: ExpoFileSystem.EncodingType.Base64
|
|
137
|
+
});
|
|
138
|
+
const binary = atob(base64);
|
|
139
|
+
const bytes = new Uint8Array(binary.length);
|
|
140
|
+
for (let i = 0; i < binary.length; i++) {
|
|
141
|
+
bytes[i] = binary.charCodeAt(i);
|
|
142
|
+
}
|
|
143
|
+
const hashBuffer = await ExpoCrypto.digest(ExpoCrypto.CryptoDigestAlgorithm.SHA256, bytes);
|
|
144
|
+
// Convert ArrayBuffer to hex
|
|
145
|
+
const hashBytes = new Uint8Array(hashBuffer);
|
|
146
|
+
return Array.from(hashBytes).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Fallback to SubtleCrypto if available
|
|
150
|
+
if (typeof crypto !== 'undefined' && crypto.subtle) {
|
|
151
|
+
const base64 = await ExpoFileSystem.readAsStringAsync(path, {
|
|
152
|
+
encoding: ExpoFileSystem.EncodingType.Base64
|
|
153
|
+
});
|
|
154
|
+
const binary = atob(base64);
|
|
155
|
+
const bytes = new Uint8Array(binary.length);
|
|
156
|
+
for (let i = 0; i < binary.length; i++) {
|
|
157
|
+
bytes[i] = binary.charCodeAt(i);
|
|
158
|
+
}
|
|
159
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', bytes.buffer);
|
|
160
|
+
const hashBytes = new Uint8Array(hashBuffer);
|
|
161
|
+
return Array.from(hashBytes).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
162
|
+
}
|
|
163
|
+
throw new Error('No crypto implementation available for hash calculation');
|
|
164
|
+
}
|
|
110
165
|
}
|
|
111
166
|
|
|
112
167
|
// Native implementation for bare React Native
|
|
@@ -165,6 +220,50 @@ class NativeStorageAdapter {
|
|
|
165
220
|
}
|
|
166
221
|
await OTAUpdateNative.makeDirectory(path);
|
|
167
222
|
}
|
|
223
|
+
async downloadToFile(url, destPath) {
|
|
224
|
+
if (!OTAUpdateNative) {
|
|
225
|
+
throw new Error('OTAUpdate native module not found');
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Use native module's downloadFile method if available (preferred)
|
|
229
|
+
if (OTAUpdateNative.downloadFile) {
|
|
230
|
+
const result = await OTAUpdateNative.downloadFile(url, destPath);
|
|
231
|
+
return {
|
|
232
|
+
fileSize: result.fileSize || 0
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Fallback: download via fetch and write in chunks
|
|
237
|
+
// This is less efficient but works without native download support
|
|
238
|
+
const response = await fetch(url);
|
|
239
|
+
if (!response.ok) {
|
|
240
|
+
throw new Error(`Download failed with status ${response.status}`);
|
|
241
|
+
}
|
|
242
|
+
const data = await response.arrayBuffer();
|
|
243
|
+
const base64 = arrayBufferToBase64(data);
|
|
244
|
+
await OTAUpdateNative.writeFileBase64(destPath, base64);
|
|
245
|
+
return {
|
|
246
|
+
fileSize: data.byteLength
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
async calculateHashFromFile(path) {
|
|
250
|
+
if (!OTAUpdateNative) {
|
|
251
|
+
throw new Error('OTAUpdate native module not found');
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Use native module's calculateSHA256FromFile if available (preferred - streams file)
|
|
255
|
+
if (OTAUpdateNative.calculateSHA256FromFile) {
|
|
256
|
+
return OTAUpdateNative.calculateSHA256FromFile(path);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Fallback: read file as base64 and use the base64 hash method
|
|
260
|
+
// This loads the file into memory, but is better than nothing
|
|
261
|
+
if (OTAUpdateNative.calculateSHA256 && OTAUpdateNative.readFileBase64) {
|
|
262
|
+
const base64 = await OTAUpdateNative.readFileBase64(path);
|
|
263
|
+
return OTAUpdateNative.calculateSHA256(base64);
|
|
264
|
+
}
|
|
265
|
+
throw new Error('No hash calculation method available');
|
|
266
|
+
}
|
|
168
267
|
}
|
|
169
268
|
|
|
170
269
|
// Factory function to get the appropriate storage adapter
|
|
@@ -259,6 +358,56 @@ class UpdateStorage {
|
|
|
259
358
|
// In a more advanced implementation, we might keep a few for rollback
|
|
260
359
|
}
|
|
261
360
|
|
|
361
|
+
/**
|
|
362
|
+
* Download bundle directly to file, bypassing JS memory.
|
|
363
|
+
* Critical for large bundles (5MB+).
|
|
364
|
+
*
|
|
365
|
+
* @param url The URL to download from
|
|
366
|
+
* @param releaseId The release ID (used for filename)
|
|
367
|
+
* @returns The normalized file path where bundle was saved
|
|
368
|
+
*/
|
|
369
|
+
async downloadBundleToFile(url, releaseId) {
|
|
370
|
+
await this.ensureDirectory();
|
|
371
|
+
const bundlePath = `${this.baseDir}${releaseId}.bundle`;
|
|
372
|
+
const result = await this.storage.downloadToFile(url, bundlePath);
|
|
373
|
+
|
|
374
|
+
// Return normalized path for native module compatibility
|
|
375
|
+
return {
|
|
376
|
+
path: normalizePath(bundlePath),
|
|
377
|
+
fileSize: result.fileSize
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Calculate SHA256 hash of a stored bundle file.
|
|
383
|
+
* Uses streaming to avoid loading entire file into memory.
|
|
384
|
+
*
|
|
385
|
+
* @param releaseId The release ID of the bundle
|
|
386
|
+
* @returns The hash string (without 'sha256:' prefix)
|
|
387
|
+
*/
|
|
388
|
+
async calculateBundleHash(releaseId) {
|
|
389
|
+
const bundlePath = this.getRawBundlePath(releaseId);
|
|
390
|
+
if (!(await this.storage.exists(bundlePath))) {
|
|
391
|
+
throw new Error('Bundle file not found');
|
|
392
|
+
}
|
|
393
|
+
if (this.storage.calculateHashFromFile) {
|
|
394
|
+
return this.storage.calculateHashFromFile(bundlePath);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Fallback: read file into memory and calculate hash
|
|
398
|
+
// This is not ideal for large files but works as a fallback
|
|
399
|
+
const data = await this.storage.readFileAsBuffer(bundlePath);
|
|
400
|
+
const bytes = new Uint8Array(data);
|
|
401
|
+
|
|
402
|
+
// Use SubtleCrypto if available
|
|
403
|
+
if (typeof crypto !== 'undefined' && crypto.subtle) {
|
|
404
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', bytes.buffer);
|
|
405
|
+
const hashBytes = new Uint8Array(hashBuffer);
|
|
406
|
+
return Array.from(hashBytes).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
407
|
+
}
|
|
408
|
+
throw new Error('No hash calculation method available');
|
|
409
|
+
}
|
|
410
|
+
|
|
262
411
|
/**
|
|
263
412
|
* Validate that a stored bundle is a valid JavaScript file.
|
|
264
413
|
* This helps detect corrupted downloads (e.g., HTML error pages saved as bundles).
|
|
@@ -1 +1 @@
|
|
|
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":[]}
|
|
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","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","exports"],"sourceRoot":"../../../src","sources":["utils/storage.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,7 +2,6 @@ import { useState, useCallback, useEffect, useRef } from 'react';
|
|
|
2
2
|
import { AppState, Platform } from 'react-native';
|
|
3
3
|
import { OTAApiClient, getDeviceInfo } from '../utils/api';
|
|
4
4
|
import { UpdateStorage } from '../utils/storage';
|
|
5
|
-
import { verifyBundle } from '../utils/verification';
|
|
6
5
|
// Generate or get device ID
|
|
7
6
|
async function getDeviceId() {
|
|
8
7
|
// Try to get from native module or AsyncStorage
|
|
@@ -119,23 +118,36 @@ export function useOTAUpdate(config) {
|
|
|
119
118
|
deviceInfo: getDeviceInfo()
|
|
120
119
|
});
|
|
121
120
|
|
|
122
|
-
// Download bundle
|
|
123
|
-
const
|
|
121
|
+
// Download bundle directly to file (bypasses JS memory - critical for large bundles)
|
|
122
|
+
const downloadResult = await storage.current.downloadBundleToFile(release.bundleUrl, release.id);
|
|
124
123
|
setDownloadProgress({
|
|
125
|
-
downloadedBytes:
|
|
124
|
+
downloadedBytes: downloadResult.fileSize,
|
|
126
125
|
totalBytes: release.bundleSize,
|
|
127
126
|
percentage: 100
|
|
128
127
|
});
|
|
129
128
|
|
|
130
|
-
// Verify bundle
|
|
129
|
+
// Verify bundle hash
|
|
131
130
|
setStatus('verifying');
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
131
|
+
|
|
132
|
+
// Calculate hash from file (streaming to avoid memory issues)
|
|
133
|
+
const actualHash = await storage.current.calculateBundleHash(release.id);
|
|
134
|
+
const expectedHashWithoutPrefix = release.bundleHash.replace(/^sha256:/, '');
|
|
135
|
+
if (actualHash !== expectedHashWithoutPrefix) {
|
|
136
|
+
// Delete corrupted bundle
|
|
137
|
+
await storage.current.deleteBundle(release.id);
|
|
138
|
+
throw new Error(`Bundle hash mismatch: expected ${expectedHashWithoutPrefix}, got ${actualHash}`);
|
|
135
139
|
}
|
|
136
140
|
|
|
137
|
-
//
|
|
138
|
-
const
|
|
141
|
+
// Validate bundle content (check it's actually JavaScript, not an error page)
|
|
142
|
+
const isValid = await storage.current.validateBundle(release.id);
|
|
143
|
+
if (!isValid) {
|
|
144
|
+
await storage.current.deleteBundle(release.id);
|
|
145
|
+
throw new Error('Downloaded content is not a valid JavaScript bundle');
|
|
146
|
+
}
|
|
147
|
+
if (__DEV__) {
|
|
148
|
+
console.log('[OTAUpdate] Bundle verified successfully');
|
|
149
|
+
}
|
|
150
|
+
const bundlePath = downloadResult.path;
|
|
139
151
|
|
|
140
152
|
// Save metadata
|
|
141
153
|
await storage.current.saveMetadata({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useState","useCallback","useEffect","useRef","AppState","Platform","OTAApiClient","getDeviceInfo","UpdateStorage","
|
|
1
|
+
{"version":3,"names":["useState","useCallback","useEffect","useRef","AppState","Platform","OTAApiClient","getDeviceInfo","UpdateStorage","getDeviceId","id","Math","random","toString","substring","useOTAUpdate","config","serverUrl","appSlug","channel","appVersion","publicKey","checkOnMount","checkOnForeground","status","setStatus","updateInfo","setUpdateInfo","downloadProgress","setDownloadProgress","error","setError","currentVersion","setCurrentVersion","isDismissed","setIsDismissed","apiClient","storage","deviceIdRef","releaseRef","loadCurrentVersion","metadata","current","getMetadata","version","getDeviceIdCached","checkForUpdate","deviceId","currentMetadata","response","checkUpdate","platform","OS","updateAvailable","release","info","releaseId","bundleSize","isMandatory","releaseNotes","err","Error","String","downloadUpdate","downloadedBytes","totalBytes","percentage","reportEvent","eventType","deviceInfo","downloadResult","downloadBundleToFile","bundleUrl","fileSize","actualHash","calculateBundleHash","expectedHashWithoutPrefix","bundleHash","replace","deleteBundle","isValid","validateBundle","__DEV__","console","log","bundlePath","path","saveMetadata","downloadedAt","Date","now","registered","registerBundleWithNative","errorMessage","message","applyUpdate","restartApp","clearPendingUpdate","clearMetadata","clearNativePendingBundle","dismissUpdate","resetDismiss","handleAppStateChange","nextAppState","subscription","addEventListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useOTAUpdate.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -101,6 +101,61 @@ class ExpoStorageAdapter {
|
|
|
101
101
|
intermediates: true
|
|
102
102
|
});
|
|
103
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
|
+
}
|
|
104
159
|
}
|
|
105
160
|
|
|
106
161
|
// Native implementation for bare React Native
|
|
@@ -159,6 +214,50 @@ class NativeStorageAdapter {
|
|
|
159
214
|
}
|
|
160
215
|
await OTAUpdateNative.makeDirectory(path);
|
|
161
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
|
+
}
|
|
162
261
|
}
|
|
163
262
|
|
|
164
263
|
// Factory function to get the appropriate storage adapter
|
|
@@ -253,6 +352,56 @@ export class UpdateStorage {
|
|
|
253
352
|
// In a more advanced implementation, we might keep a few for rollback
|
|
254
353
|
}
|
|
255
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
|
+
|
|
256
405
|
/**
|
|
257
406
|
* Validate that a stored bundle is a valid JavaScript file.
|
|
258
407
|
* This helps detect corrupted downloads (e.g., HTML error pages saved as bundles).
|
|
@@ -1 +1 @@
|
|
|
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","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"],"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":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOTAUpdate.d.ts","sourceRoot":"","sources":["../../../src/hooks/useOTAUpdate.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -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,26 @@ 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>;
|
|
35
59
|
/**
|
|
36
60
|
* Validate that a stored bundle is a valid JavaScript file.
|
|
37
61
|
* This helps detect corrupted downloads (e.g., HTML error pages saved as bundles).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/utils/storage.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,oBAAoB,IAAI,MAAM,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/utils/storage.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,oBAAoB,IAAI,MAAM,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE7E,qBAAqB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvD;AA2RD,wBAAgB,iBAAiB,IAAI,cAAc,CAYlD;AAGD,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,MAAM,CAAU;;YAUV,eAAe;IAQ7B,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIjC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAWvE,OAAO,CAAC,gBAAgB;IAIlB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOxD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAS1D,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9C,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjD,WAAW,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAe3C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D;;;;;;;OAOG;IACG,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAavG;;;;;;OAMG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4B7D;;;;;;OAMG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqEzD;;;;;OAKG;IACG,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IA8B9C;;;;;;;;OAQG;IACG,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB9F;;;OAGG;IACG,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;CAWhD"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { useState, useCallback, useEffect, useRef } from 'react';
|
|
2
2
|
import { AppState, AppStateStatus, Platform } from 'react-native';
|
|
3
3
|
import { OTAApiClient, ReleaseInfo, getDeviceInfo } from '../utils/api';
|
|
4
|
-
import { UpdateStorage
|
|
5
|
-
import { verifyBundle, VerificationResult } from '../utils/verification';
|
|
4
|
+
import { UpdateStorage } from '../utils/storage';
|
|
6
5
|
|
|
7
6
|
export interface OTAUpdateConfig {
|
|
8
7
|
serverUrl: string;
|
|
@@ -178,31 +177,40 @@ export function useOTAUpdate(config: OTAUpdateConfig): UseOTAUpdateResult {
|
|
|
178
177
|
deviceInfo: getDeviceInfo(),
|
|
179
178
|
});
|
|
180
179
|
|
|
181
|
-
// Download bundle
|
|
182
|
-
const
|
|
180
|
+
// Download bundle directly to file (bypasses JS memory - critical for large bundles)
|
|
181
|
+
const downloadResult = await storage.current.downloadBundleToFile(release.bundleUrl, release.id);
|
|
183
182
|
|
|
184
183
|
setDownloadProgress({
|
|
185
|
-
downloadedBytes:
|
|
184
|
+
downloadedBytes: downloadResult.fileSize,
|
|
186
185
|
totalBytes: release.bundleSize,
|
|
187
186
|
percentage: 100,
|
|
188
187
|
});
|
|
189
188
|
|
|
190
|
-
// Verify bundle
|
|
189
|
+
// Verify bundle hash
|
|
191
190
|
setStatus('verifying');
|
|
192
191
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
release.bundleSignature,
|
|
197
|
-
publicKey || null
|
|
198
|
-
);
|
|
192
|
+
// Calculate hash from file (streaming to avoid memory issues)
|
|
193
|
+
const actualHash = await storage.current.calculateBundleHash(release.id);
|
|
194
|
+
const expectedHashWithoutPrefix = release.bundleHash.replace(/^sha256:/, '');
|
|
199
195
|
|
|
200
|
-
if (
|
|
201
|
-
|
|
196
|
+
if (actualHash !== expectedHashWithoutPrefix) {
|
|
197
|
+
// Delete corrupted bundle
|
|
198
|
+
await storage.current.deleteBundle(release.id);
|
|
199
|
+
throw new Error(`Bundle hash mismatch: expected ${expectedHashWithoutPrefix}, got ${actualHash}`);
|
|
202
200
|
}
|
|
203
201
|
|
|
204
|
-
//
|
|
205
|
-
const
|
|
202
|
+
// Validate bundle content (check it's actually JavaScript, not an error page)
|
|
203
|
+
const isValid = await storage.current.validateBundle(release.id);
|
|
204
|
+
if (!isValid) {
|
|
205
|
+
await storage.current.deleteBundle(release.id);
|
|
206
|
+
throw new Error('Downloaded content is not a valid JavaScript bundle');
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (__DEV__) {
|
|
210
|
+
console.log('[OTAUpdate] Bundle verified successfully');
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const bundlePath = downloadResult.path;
|
|
206
214
|
|
|
207
215
|
// Save metadata
|
|
208
216
|
await storage.current.saveMetadata({
|
package/src/utils/storage.ts
CHANGED
|
@@ -17,6 +17,10 @@ export interface StorageAdapter {
|
|
|
17
17
|
deleteFile(path: string): Promise<void>;
|
|
18
18
|
exists(path: string): Promise<boolean>;
|
|
19
19
|
makeDirectory(path: string): Promise<void>;
|
|
20
|
+
// Download file directly to disk without going through JS memory
|
|
21
|
+
downloadToFile(url: string, destPath: string): Promise<{ fileSize: number }>;
|
|
22
|
+
// Calculate SHA256 hash from file path (without loading into memory)
|
|
23
|
+
calculateHashFromFile?(path: string): Promise<string>;
|
|
20
24
|
}
|
|
21
25
|
|
|
22
26
|
// Helper to normalize file paths (remove file:// prefix)
|
|
@@ -122,6 +126,71 @@ class ExpoStorageAdapter implements StorageAdapter {
|
|
|
122
126
|
async makeDirectory(path: string): Promise<void> {
|
|
123
127
|
await ExpoFileSystem.makeDirectoryAsync(path, { intermediates: true });
|
|
124
128
|
}
|
|
129
|
+
|
|
130
|
+
async downloadToFile(url: string, destPath: string): Promise<{ fileSize: number }> {
|
|
131
|
+
// Use Expo's downloadAsync which downloads directly to file
|
|
132
|
+
// This bypasses JS memory entirely - critical for large bundles
|
|
133
|
+
const result = await ExpoFileSystem.downloadAsync(url, destPath);
|
|
134
|
+
|
|
135
|
+
if (result.status !== 200) {
|
|
136
|
+
throw new Error(`Download failed with status ${result.status}`);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Get file size
|
|
140
|
+
const info = await ExpoFileSystem.getInfoAsync(destPath);
|
|
141
|
+
return { fileSize: info.size || 0 };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async calculateHashFromFile(path: string): Promise<string> {
|
|
145
|
+
// For Expo, we need to read the file and use expo-crypto
|
|
146
|
+
// Try to use expo-crypto if available
|
|
147
|
+
let ExpoCrypto: any = null;
|
|
148
|
+
try {
|
|
149
|
+
ExpoCrypto = require('expo-crypto');
|
|
150
|
+
} catch {
|
|
151
|
+
// expo-crypto not available
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (ExpoCrypto?.digest) {
|
|
155
|
+
// Read file as base64 and convert to Uint8Array
|
|
156
|
+
const base64 = await ExpoFileSystem.readAsStringAsync(path, {
|
|
157
|
+
encoding: ExpoFileSystem.EncodingType.Base64,
|
|
158
|
+
});
|
|
159
|
+
const binary = atob(base64);
|
|
160
|
+
const bytes = new Uint8Array(binary.length);
|
|
161
|
+
for (let i = 0; i < binary.length; i++) {
|
|
162
|
+
bytes[i] = binary.charCodeAt(i);
|
|
163
|
+
}
|
|
164
|
+
const hashBuffer = await ExpoCrypto.digest(
|
|
165
|
+
ExpoCrypto.CryptoDigestAlgorithm.SHA256,
|
|
166
|
+
bytes
|
|
167
|
+
);
|
|
168
|
+
// Convert ArrayBuffer to hex
|
|
169
|
+
const hashBytes = new Uint8Array(hashBuffer);
|
|
170
|
+
return Array.from(hashBytes)
|
|
171
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
172
|
+
.join('');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Fallback to SubtleCrypto if available
|
|
176
|
+
if (typeof crypto !== 'undefined' && crypto.subtle) {
|
|
177
|
+
const base64 = await ExpoFileSystem.readAsStringAsync(path, {
|
|
178
|
+
encoding: ExpoFileSystem.EncodingType.Base64,
|
|
179
|
+
});
|
|
180
|
+
const binary = atob(base64);
|
|
181
|
+
const bytes = new Uint8Array(binary.length);
|
|
182
|
+
for (let i = 0; i < binary.length; i++) {
|
|
183
|
+
bytes[i] = binary.charCodeAt(i);
|
|
184
|
+
}
|
|
185
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', bytes.buffer);
|
|
186
|
+
const hashBytes = new Uint8Array(hashBuffer);
|
|
187
|
+
return Array.from(hashBytes)
|
|
188
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
189
|
+
.join('');
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
throw new Error('No crypto implementation available for hash calculation');
|
|
193
|
+
}
|
|
125
194
|
}
|
|
126
195
|
|
|
127
196
|
// Native implementation for bare React Native
|
|
@@ -187,6 +256,51 @@ class NativeStorageAdapter implements StorageAdapter {
|
|
|
187
256
|
}
|
|
188
257
|
await OTAUpdateNative.makeDirectory(path);
|
|
189
258
|
}
|
|
259
|
+
|
|
260
|
+
async downloadToFile(url: string, destPath: string): Promise<{ fileSize: number }> {
|
|
261
|
+
if (!OTAUpdateNative) {
|
|
262
|
+
throw new Error('OTAUpdate native module not found');
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Use native module's downloadFile method if available (preferred)
|
|
266
|
+
if (OTAUpdateNative.downloadFile) {
|
|
267
|
+
const result = await OTAUpdateNative.downloadFile(url, destPath);
|
|
268
|
+
return { fileSize: result.fileSize || 0 };
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Fallback: download via fetch and write in chunks
|
|
272
|
+
// This is less efficient but works without native download support
|
|
273
|
+
const response = await fetch(url);
|
|
274
|
+
if (!response.ok) {
|
|
275
|
+
throw new Error(`Download failed with status ${response.status}`);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const data = await response.arrayBuffer();
|
|
279
|
+
const base64 = arrayBufferToBase64(data);
|
|
280
|
+
await OTAUpdateNative.writeFileBase64(destPath, base64);
|
|
281
|
+
|
|
282
|
+
return { fileSize: data.byteLength };
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
async calculateHashFromFile(path: string): Promise<string> {
|
|
286
|
+
if (!OTAUpdateNative) {
|
|
287
|
+
throw new Error('OTAUpdate native module not found');
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Use native module's calculateSHA256FromFile if available (preferred - streams file)
|
|
291
|
+
if (OTAUpdateNative.calculateSHA256FromFile) {
|
|
292
|
+
return OTAUpdateNative.calculateSHA256FromFile(path);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Fallback: read file as base64 and use the base64 hash method
|
|
296
|
+
// This loads the file into memory, but is better than nothing
|
|
297
|
+
if (OTAUpdateNative.calculateSHA256 && OTAUpdateNative.readFileBase64) {
|
|
298
|
+
const base64 = await OTAUpdateNative.readFileBase64(path);
|
|
299
|
+
return OTAUpdateNative.calculateSHA256(base64);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
throw new Error('No hash calculation method available');
|
|
303
|
+
}
|
|
190
304
|
}
|
|
191
305
|
|
|
192
306
|
// Factory function to get the appropriate storage adapter
|
|
@@ -303,6 +417,62 @@ export class UpdateStorage {
|
|
|
303
417
|
// In a more advanced implementation, we might keep a few for rollback
|
|
304
418
|
}
|
|
305
419
|
|
|
420
|
+
/**
|
|
421
|
+
* Download bundle directly to file, bypassing JS memory.
|
|
422
|
+
* Critical for large bundles (5MB+).
|
|
423
|
+
*
|
|
424
|
+
* @param url The URL to download from
|
|
425
|
+
* @param releaseId The release ID (used for filename)
|
|
426
|
+
* @returns The normalized file path where bundle was saved
|
|
427
|
+
*/
|
|
428
|
+
async downloadBundleToFile(url: string, releaseId: string): Promise<{ path: string; fileSize: number }> {
|
|
429
|
+
await this.ensureDirectory();
|
|
430
|
+
|
|
431
|
+
const bundlePath = `${this.baseDir}${releaseId}.bundle`;
|
|
432
|
+
const result = await this.storage.downloadToFile(url, bundlePath);
|
|
433
|
+
|
|
434
|
+
// Return normalized path for native module compatibility
|
|
435
|
+
return {
|
|
436
|
+
path: normalizePath(bundlePath),
|
|
437
|
+
fileSize: result.fileSize,
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Calculate SHA256 hash of a stored bundle file.
|
|
443
|
+
* Uses streaming to avoid loading entire file into memory.
|
|
444
|
+
*
|
|
445
|
+
* @param releaseId The release ID of the bundle
|
|
446
|
+
* @returns The hash string (without 'sha256:' prefix)
|
|
447
|
+
*/
|
|
448
|
+
async calculateBundleHash(releaseId: string): Promise<string> {
|
|
449
|
+
const bundlePath = this.getRawBundlePath(releaseId);
|
|
450
|
+
|
|
451
|
+
if (!await this.storage.exists(bundlePath)) {
|
|
452
|
+
throw new Error('Bundle file not found');
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if (this.storage.calculateHashFromFile) {
|
|
456
|
+
return this.storage.calculateHashFromFile(bundlePath);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// Fallback: read file into memory and calculate hash
|
|
460
|
+
// This is not ideal for large files but works as a fallback
|
|
461
|
+
const data = await this.storage.readFileAsBuffer(bundlePath);
|
|
462
|
+
const bytes = new Uint8Array(data);
|
|
463
|
+
|
|
464
|
+
// Use SubtleCrypto if available
|
|
465
|
+
if (typeof crypto !== 'undefined' && crypto.subtle) {
|
|
466
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', bytes.buffer);
|
|
467
|
+
const hashBytes = new Uint8Array(hashBuffer);
|
|
468
|
+
return Array.from(hashBytes)
|
|
469
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
470
|
+
.join('');
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
throw new Error('No hash calculation method available');
|
|
474
|
+
}
|
|
475
|
+
|
|
306
476
|
/**
|
|
307
477
|
* Validate that a stored bundle is a valid JavaScript file.
|
|
308
478
|
* This helps detect corrupted downloads (e.g., HTML error pages saved as bundles).
|