react-native-bspatch 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +471 -0
- package/android/build.gradle +100 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/java/vn/reactnativebspatch/BsPatchModule.kt +139 -0
- package/android/src/main/java/vn/reactnativebspatch/BsPatchPackage.kt +16 -0
- package/android/src/main/java/vn/reactnativebspatch/OtaBundleResolver.kt +227 -0
- package/cpp/CMakeLists.txt +43 -0
- package/cpp/bsdiff/bspatch.c +194 -0
- package/cpp/bsdiff/bspatch.h +41 -0
- package/cpp/bsdiff/bspatch_wrapper.c +150 -0
- package/cpp/bsdiff/bspatch_wrapper.h +6 -0
- package/cpp/bspatch_jni.cpp +41 -0
- package/cpp/bzip2/LICENSE +42 -0
- package/cpp/bzip2/blocksort.c +1094 -0
- package/cpp/bzip2/bzlib.c +1572 -0
- package/cpp/bzip2/bzlib.h +282 -0
- package/cpp/bzip2/bzlib_private.h +509 -0
- package/cpp/bzip2/compress.c +672 -0
- package/cpp/bzip2/crctable.c +104 -0
- package/cpp/bzip2/decompress.c +652 -0
- package/cpp/bzip2/huffman.c +205 -0
- package/cpp/bzip2/randtable.c +84 -0
- package/ios/OtaBundleResolver.swift +241 -0
- package/ios/RNBsPatch.h +8 -0
- package/ios/RNBsPatch.mm +198 -0
- package/lib/commonjs/NativeBsPatch.js +9 -0
- package/lib/commonjs/NativeBsPatch.js.map +1 -0
- package/lib/commonjs/crypto-js.d.js +2 -0
- package/lib/commonjs/crypto-js.d.js.map +1 -0
- package/lib/commonjs/index.js +90 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/ota/OtaProvider.js +306 -0
- package/lib/commonjs/ota/OtaProvider.js.map +1 -0
- package/lib/commonjs/ota/otaAssetResolver.js +145 -0
- package/lib/commonjs/ota/otaAssetResolver.js.map +1 -0
- package/lib/commonjs/ota/otaCore.js +736 -0
- package/lib/commonjs/ota/otaCore.js.map +1 -0
- package/lib/commonjs/ota/otaLogger.js +64 -0
- package/lib/commonjs/ota/otaLogger.js.map +1 -0
- package/lib/commonjs/ota/otaMetadata.js +138 -0
- package/lib/commonjs/ota/otaMetadata.js.map +1 -0
- package/lib/commonjs/ota/storage/CustomStorage.js +140 -0
- package/lib/commonjs/ota/storage/CustomStorage.js.map +1 -0
- package/lib/commonjs/ota/storage/GitHubReleaseStorage.js +96 -0
- package/lib/commonjs/ota/storage/GitHubReleaseStorage.js.map +1 -0
- package/lib/commonjs/ota/types.js +39 -0
- package/lib/commonjs/ota/types.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/module/NativeBsPatch.js +5 -0
- package/lib/module/NativeBsPatch.js.map +1 -0
- package/lib/module/crypto-js.d.js +2 -0
- package/lib/module/crypto-js.d.js.map +1 -0
- package/lib/module/index.js +23 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/ota/OtaProvider.js +299 -0
- package/lib/module/ota/OtaProvider.js.map +1 -0
- package/lib/module/ota/otaAssetResolver.js +138 -0
- package/lib/module/ota/otaAssetResolver.js.map +1 -0
- package/lib/module/ota/otaCore.js +725 -0
- package/lib/module/ota/otaCore.js.map +1 -0
- package/lib/module/ota/otaLogger.js +59 -0
- package/lib/module/ota/otaLogger.js.map +1 -0
- package/lib/module/ota/otaMetadata.js +127 -0
- package/lib/module/ota/otaMetadata.js.map +1 -0
- package/lib/module/ota/storage/CustomStorage.js +134 -0
- package/lib/module/ota/storage/CustomStorage.js.map +1 -0
- package/lib/module/ota/storage/GitHubReleaseStorage.js +90 -0
- package/lib/module/ota/storage/GitHubReleaseStorage.js.map +1 -0
- package/lib/module/ota/types.js +38 -0
- package/lib/module/ota/types.js.map +1 -0
- package/lib/typescript/NativeBsPatch.d.ts +39 -0
- package/lib/typescript/NativeBsPatch.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +15 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/ota/OtaProvider.d.ts +10 -0
- package/lib/typescript/ota/OtaProvider.d.ts.map +1 -0
- package/lib/typescript/ota/otaAssetResolver.d.ts +15 -0
- package/lib/typescript/ota/otaAssetResolver.d.ts.map +1 -0
- package/lib/typescript/ota/otaCore.d.ts +109 -0
- package/lib/typescript/ota/otaCore.d.ts.map +1 -0
- package/lib/typescript/ota/otaLogger.d.ts +44 -0
- package/lib/typescript/ota/otaLogger.d.ts.map +1 -0
- package/lib/typescript/ota/otaMetadata.d.ts +46 -0
- package/lib/typescript/ota/otaMetadata.d.ts.map +1 -0
- package/lib/typescript/ota/storage/CustomStorage.d.ts +12 -0
- package/lib/typescript/ota/storage/CustomStorage.d.ts.map +1 -0
- package/lib/typescript/ota/storage/GitHubReleaseStorage.d.ts +20 -0
- package/lib/typescript/ota/storage/GitHubReleaseStorage.d.ts.map +1 -0
- package/lib/typescript/ota/types.d.ts +191 -0
- package/lib/typescript/ota/types.d.ts.map +1 -0
- package/package.json +89 -0
- package/react-native-bspatch.podspec +46 -0
- package/src/NativeBsPatch.ts +52 -0
- package/src/crypto-js.d.ts +1 -0
- package/src/index.ts +29 -0
- package/src/ota/OtaProvider.tsx +399 -0
- package/src/ota/otaAssetResolver.ts +182 -0
- package/src/ota/otaCore.ts +963 -0
- package/src/ota/otaLogger.ts +72 -0
- package/src/ota/otaMetadata.ts +149 -0
- package/src/ota/storage/CustomStorage.ts +143 -0
- package/src/ota/storage/GitHubReleaseStorage.ts +98 -0
- package/src/ota/types.ts +211 -0
- package/tools/bsdiff +0 -0
- package/tools/bsdiff.c +445 -0
- package/tools/bsdiff.h +45 -0
- package/tools/build_ota.sh +457 -0
- package/tools/setup_project.js +273 -0
- package/tools/update_registry.js +145 -0
- package/tools/upload_ota_custom.sh +138 -0
package/ios/RNBsPatch.mm
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
#import "RNBsPatch.h"
|
|
2
|
+
#import <Foundation/Foundation.h>
|
|
3
|
+
#import <UIKit/UIKit.h>
|
|
4
|
+
#import <zlib.h>
|
|
5
|
+
#import <React/RCTLog.h>
|
|
6
|
+
#import <React/RCTReloadCommand.h>
|
|
7
|
+
#import <SSZipArchive/SSZipArchive.h>
|
|
8
|
+
|
|
9
|
+
#if __has_include(<react_native_bspatch/react_native_bspatch-Swift.h>)
|
|
10
|
+
#import <react_native_bspatch/react_native_bspatch-Swift.h>
|
|
11
|
+
#else
|
|
12
|
+
#import "react_native_bspatch-Swift.h"
|
|
13
|
+
#endif
|
|
14
|
+
|
|
15
|
+
#ifdef __cplusplus
|
|
16
|
+
extern "C" {
|
|
17
|
+
#endif
|
|
18
|
+
#include "../cpp/bsdiff/bspatch_wrapper.h"
|
|
19
|
+
#ifdef __cplusplus
|
|
20
|
+
}
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
// Import codegen headers for New Architecture
|
|
24
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
25
|
+
#import "RNBsPatchSpec.h"
|
|
26
|
+
#endif
|
|
27
|
+
|
|
28
|
+
@interface RNBsPatch () <RCTBridgeModule>
|
|
29
|
+
@end
|
|
30
|
+
|
|
31
|
+
@implementation RNBsPatch
|
|
32
|
+
|
|
33
|
+
RCT_EXPORT_MODULE(BsPatch)
|
|
34
|
+
|
|
35
|
+
+ (BOOL)requiresMainQueueSetup {
|
|
36
|
+
return NO;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
RCT_EXPORT_METHOD(applyPatch:(NSString *)oldPath
|
|
40
|
+
newPath:(NSString *)newPath
|
|
41
|
+
patchPath:(NSString *)patchPath
|
|
42
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
43
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
44
|
+
{
|
|
45
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
46
|
+
const char *old_file = [oldPath UTF8String];
|
|
47
|
+
const char *new_file = [newPath UTF8String];
|
|
48
|
+
const char *patch_file = [patchPath UTF8String];
|
|
49
|
+
|
|
50
|
+
int result = apply_bspatch(old_file, new_file, patch_file);
|
|
51
|
+
|
|
52
|
+
if (result == 0) {
|
|
53
|
+
resolve(@(YES));
|
|
54
|
+
} else {
|
|
55
|
+
resolve(@(NO));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
RCT_EXPORT_METHOD(unzip:(NSString *)source
|
|
61
|
+
targetDir:(NSString *)targetDir
|
|
62
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
63
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
64
|
+
{
|
|
65
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
66
|
+
BOOL success = [SSZipArchive unzipFileAtPath:source toDestination:targetDir];
|
|
67
|
+
if (success) {
|
|
68
|
+
resolve(@(YES));
|
|
69
|
+
} else {
|
|
70
|
+
reject(@"ERR_UNZIP", @"Failed to unzip file", nil);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
RCT_EXPORT_METHOD(extractBundleFromAssets:(NSString *)assetName
|
|
76
|
+
destPath:(NSString *)destPath
|
|
77
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
78
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
79
|
+
{
|
|
80
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
81
|
+
NSString *resourceName = [assetName stringByDeletingPathExtension];
|
|
82
|
+
NSString *resourceType = [assetName pathExtension];
|
|
83
|
+
if (resourceType.length == 0) resourceType = @"jsbundle";
|
|
84
|
+
|
|
85
|
+
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:resourceName ofType:resourceType];
|
|
86
|
+
if (!bundlePath) {
|
|
87
|
+
reject(@"ERR_EXTRACT_ASSET", [NSString stringWithFormat:@"%@ not found in main bundle", assetName], nil);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
NSError *error = nil;
|
|
91
|
+
BOOL success = [[NSFileManager defaultManager] copyItemAtPath:bundlePath toPath:destPath error:&error];
|
|
92
|
+
if (success) {
|
|
93
|
+
resolve(@(YES));
|
|
94
|
+
} else {
|
|
95
|
+
reject(@"ERR_EXTRACT_ASSET", error.localizedDescription, error);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
RCT_EXPORT_METHOD(reloadBundle)
|
|
101
|
+
{
|
|
102
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
103
|
+
RCTTriggerReloadCommandListeners(@"OTA Update Applied");
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
RCT_EXPORT_METHOD(logNative:(NSString *)message)
|
|
108
|
+
{
|
|
109
|
+
NSLog(@"[JS-OTA] %@", message);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
RCT_EXPORT_METHOD(markAsHealthy)
|
|
113
|
+
{
|
|
114
|
+
[OtaBundleResolver markAsHealthy];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
RCT_EXPORT_METHOD(decompressGzip:(NSString *)sourcePath
|
|
118
|
+
destPath:(NSString *)destPath
|
|
119
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
120
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
121
|
+
{
|
|
122
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
123
|
+
NSString *src = sourcePath;
|
|
124
|
+
NSString *dst = destPath;
|
|
125
|
+
|
|
126
|
+
// Remove existing destination file if present
|
|
127
|
+
[[NSFileManager defaultManager] removeItemAtPath:dst error:nil];
|
|
128
|
+
|
|
129
|
+
// Read the compressed data
|
|
130
|
+
NSData *compressed = [NSData dataWithContentsOfFile:src];
|
|
131
|
+
if (!compressed) {
|
|
132
|
+
reject(@"ERR_GZIP_DECOMPRESS", @"Failed to read source file", nil);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Decompress using zlib (Compression framework handles gzip automatically)
|
|
137
|
+
// COMPRESSION_ZLIB wrapper detects gzip format from the header
|
|
138
|
+
NSData *decompressed = [self decompressGzipData:compressed];
|
|
139
|
+
if (!decompressed) {
|
|
140
|
+
reject(@"ERR_GZIP_DECOMPRESS", @"Failed to decompress gzip data", nil);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
NSError *error = nil;
|
|
145
|
+
BOOL success = [decompressed writeToFile:dst options:NSDataWritingAtomic error:&error];
|
|
146
|
+
if (success) {
|
|
147
|
+
resolve(@(YES));
|
|
148
|
+
} else {
|
|
149
|
+
reject(@"ERR_GZIP_DECOMPRESS", error.localizedDescription, error);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
- (NSData *)decompressGzipData:(NSData *)compressed {
|
|
155
|
+
// Decompress gzip using zlib directly
|
|
156
|
+
// gzip adds a 10-byte header + 8-byte footer over the raw zlib stream
|
|
157
|
+
const size_t chunkSize = 32768;
|
|
158
|
+
z_stream strm;
|
|
159
|
+
memset(&strm, 0, sizeof(strm));
|
|
160
|
+
|
|
161
|
+
strm.next_in = (Bytef *)compressed.bytes;
|
|
162
|
+
strm.avail_in = (uInt)compressed.length;
|
|
163
|
+
|
|
164
|
+
// 16 + MAX_WBITS = automatic gzip/zlib header detection
|
|
165
|
+
if (inflateInit2(&strm, 16 + MAX_WBITS) != Z_OK) {
|
|
166
|
+
return nil;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
NSMutableData *decompressed = [NSMutableData dataWithCapacity:compressed.length * 4];
|
|
170
|
+
unsigned char out[chunkSize];
|
|
171
|
+
int ret;
|
|
172
|
+
|
|
173
|
+
do {
|
|
174
|
+
strm.next_out = out;
|
|
175
|
+
strm.avail_out = chunkSize;
|
|
176
|
+
ret = inflate(&strm, Z_FINISH);
|
|
177
|
+
if (ret != Z_STREAM_END && ret != Z_OK && ret != Z_BUF_ERROR) {
|
|
178
|
+
inflateEnd(&strm);
|
|
179
|
+
return nil;
|
|
180
|
+
}
|
|
181
|
+
size_t have = chunkSize - strm.avail_out;
|
|
182
|
+
[decompressed appendBytes:out length:have];
|
|
183
|
+
} while (ret != Z_STREAM_END);
|
|
184
|
+
|
|
185
|
+
inflateEnd(&strm);
|
|
186
|
+
return [decompressed copy];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Don't compile this code when we build for the old architecture.
|
|
190
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
191
|
+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
192
|
+
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
193
|
+
{
|
|
194
|
+
return std::make_shared<facebook::react::NativeBsPatchSpecJSI>(params);
|
|
195
|
+
}
|
|
196
|
+
#endif
|
|
197
|
+
|
|
198
|
+
@end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
var _default = exports.default = _reactNative.TurboModuleRegistry.getEnforcing('BsPatch');
|
|
9
|
+
//# sourceMappingURL=NativeBsPatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeBsPatch.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAkDpCC,gCAAmB,CAACC,YAAY,CAAO,SAAS,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["crypto-js.d.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _exportNames = {
|
|
7
|
+
applyPatch: true,
|
|
8
|
+
markAsHealthy: true,
|
|
9
|
+
reloadBundle: true,
|
|
10
|
+
initOtaAssetResolver: true,
|
|
11
|
+
resetOtaAssetResolver: true,
|
|
12
|
+
GitHubReleaseStorageProvider: true
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "GitHubReleaseStorageProvider", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () {
|
|
17
|
+
return _GitHubReleaseStorage.GitHubReleaseStorageProvider;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
exports.applyPatch = applyPatch;
|
|
21
|
+
exports.default = void 0;
|
|
22
|
+
Object.defineProperty(exports, "initOtaAssetResolver", {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
get: function () {
|
|
25
|
+
return _otaAssetResolver.initOtaAssetResolver;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
exports.markAsHealthy = markAsHealthy;
|
|
29
|
+
exports.reloadBundle = reloadBundle;
|
|
30
|
+
Object.defineProperty(exports, "resetOtaAssetResolver", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return _otaAssetResolver.resetOtaAssetResolver;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
var _NativeBsPatch = _interopRequireDefault(require("./NativeBsPatch"));
|
|
37
|
+
var _otaLogger = require("./ota/otaLogger");
|
|
38
|
+
Object.keys(_otaLogger).forEach(function (key) {
|
|
39
|
+
if (key === "default" || key === "__esModule") return;
|
|
40
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
41
|
+
if (key in exports && exports[key] === _otaLogger[key]) return;
|
|
42
|
+
Object.defineProperty(exports, key, {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () {
|
|
45
|
+
return _otaLogger[key];
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
var _OtaProvider = require("./ota/OtaProvider");
|
|
50
|
+
Object.keys(_OtaProvider).forEach(function (key) {
|
|
51
|
+
if (key === "default" || key === "__esModule") return;
|
|
52
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
53
|
+
if (key in exports && exports[key] === _OtaProvider[key]) return;
|
|
54
|
+
Object.defineProperty(exports, key, {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () {
|
|
57
|
+
return _OtaProvider[key];
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
var _types = require("./ota/types");
|
|
62
|
+
Object.keys(_types).forEach(function (key) {
|
|
63
|
+
if (key === "default" || key === "__esModule") return;
|
|
64
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
65
|
+
if (key in exports && exports[key] === _types[key]) return;
|
|
66
|
+
Object.defineProperty(exports, key, {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
get: function () {
|
|
69
|
+
return _types[key];
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
var _otaAssetResolver = require("./ota/otaAssetResolver");
|
|
74
|
+
var _GitHubReleaseStorage = require("./ota/storage/GitHubReleaseStorage");
|
|
75
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
76
|
+
function applyPatch(oldBundlePath, newBundlePath, patchPath) {
|
|
77
|
+
return _NativeBsPatch.default.applyPatch(oldBundlePath, newBundlePath, patchPath);
|
|
78
|
+
}
|
|
79
|
+
function markAsHealthy() {
|
|
80
|
+
return _NativeBsPatch.default.markAsHealthy();
|
|
81
|
+
}
|
|
82
|
+
function reloadBundle() {
|
|
83
|
+
return _NativeBsPatch.default.reloadBundle();
|
|
84
|
+
}
|
|
85
|
+
var _default = exports.default = {
|
|
86
|
+
applyPatch,
|
|
87
|
+
reloadBundle,
|
|
88
|
+
markAsHealthy
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_NativeBsPatch","_interopRequireDefault","require","_otaLogger","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_OtaProvider","_types","_otaAssetResolver","_GitHubReleaseStorage","e","__esModule","default","applyPatch","oldBundlePath","newBundlePath","patchPath","NativeBsPatch","markAsHealthy","reloadBundle","_default"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,cAAA,GAAAC,sBAAA,CAAAC,OAAA;AAkBA,IAAAC,UAAA,GAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,UAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,UAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,UAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,YAAA,GAAAd,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAW,YAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAS,YAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,YAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AACA,IAAAU,MAAA,GAAAf,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAY,MAAA,EAAAX,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAU,MAAA,CAAAV,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,MAAA,CAAAV,GAAA;IAAA;EAAA;AAAA;AACA,IAAAW,iBAAA,GAAAhB,OAAA;AACA,IAAAiB,qBAAA,GAAAjB,OAAA;AAAkF,SAAAD,uBAAAmB,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AApB3E,SAASG,UAAUA,CACxBC,aAAqB,EACrBC,aAAqB,EACrBC,SAAiB,EACC;EAClB,OAAOC,sBAAa,CAACJ,UAAU,CAACC,aAAa,EAAEC,aAAa,EAAEC,SAAS,CAAC;AAC1E;AAEO,SAASE,aAAaA,CAAA,EAAS;EACpC,OAAOD,sBAAa,CAACC,aAAa,CAAC,CAAC;AACtC;AAEO,SAASC,YAAYA,CAAA,EAAS;EACnC,OAAOF,sBAAa,CAACE,YAAY,CAAC,CAAC;AACrC;AAAC,IAAAC,QAAA,GAAAlB,OAAA,CAAAU,OAAA,GAQc;EACbC,UAAU;EACVM,YAAY;EACZD;AACF,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.OtaProvider = OtaProvider;
|
|
7
|
+
exports.useOta = useOta;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _reactNative = require("react-native");
|
|
10
|
+
var _reactNativeBlobUtil = _interopRequireDefault(require("react-native-blob-util"));
|
|
11
|
+
var _NativeBsPatch = _interopRequireDefault(require("../NativeBsPatch"));
|
|
12
|
+
var _otaAssetResolver = require("./otaAssetResolver");
|
|
13
|
+
var _otaCore = require("./otaCore");
|
|
14
|
+
var _otaLogger = require("./otaLogger");
|
|
15
|
+
var _otaMetadata = require("./otaMetadata");
|
|
16
|
+
var _types = require("./types");
|
|
17
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
18
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
20
|
+
const OtaContext = /*#__PURE__*/(0, _react.createContext)(undefined);
|
|
21
|
+
function OtaProvider({
|
|
22
|
+
children,
|
|
23
|
+
config,
|
|
24
|
+
loadingView,
|
|
25
|
+
useLoadingView = true
|
|
26
|
+
}) {
|
|
27
|
+
const [status, setStatus] = (0, _react.useState)(_types.OtaStatus.IDLE);
|
|
28
|
+
const [message, setMessage] = (0, _react.useState)('Initializing...');
|
|
29
|
+
const [progress, setProgress] = (0, _react.useState)(0);
|
|
30
|
+
const [currentVersion, setCurrentVersion] = (0, _react.useState)(config.baseAppVersion);
|
|
31
|
+
const [latestVersion, setLatestVersion] = (0, _react.useState)(config.baseAppVersion);
|
|
32
|
+
const [pendingCount, setPendingCount] = (0, _react.useState)(0);
|
|
33
|
+
const [isChecking, setIsChecking] = (0, _react.useState)(false);
|
|
34
|
+
const [metrics, setMetrics] = (0, _react.useState)(null);
|
|
35
|
+
const [patches, setPatches] = (0, _react.useState)([]);
|
|
36
|
+
const [isInitialized, setIsInitialized] = (0, _react.useState)(false);
|
|
37
|
+
const appState = (0, _react.useRef)(_reactNative.AppState.currentState);
|
|
38
|
+
const isCheckingRef = (0, _react.useRef)(false);
|
|
39
|
+
const bootstrapDone = (0, _react.useRef)(false);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Core apply update logic — separated so it can be mapped to button clicks
|
|
43
|
+
* OR called automatically by checkUpdates()
|
|
44
|
+
*/
|
|
45
|
+
const executeApplyUpdate = (0, _react.useCallback)(async (patchList, currentVer, targetVer) => {
|
|
46
|
+
console.log('[OtaProvider] executeApplyUpdate | targetV:', targetVer, 'currentV:', currentVer);
|
|
47
|
+
const directPatch = patchList.find(p => p.fromVersion === currentVer && p.toVersion === targetVer && p.platform === _reactNative.Platform.OS);
|
|
48
|
+
if (!directPatch) {
|
|
49
|
+
console.warn('[OtaProvider] No direct patch found for', currentVer, '->', targetVer);
|
|
50
|
+
setStatus(_types.OtaStatus.ERROR);
|
|
51
|
+
setMessage('No direct upgrade path found.');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
setStatus(_types.OtaStatus.DOWNLOADING);
|
|
56
|
+
setProgress(0);
|
|
57
|
+
await (0, _otaCore.applyOtaPatchInternal)(directPatch, config, (s, msg, m) => {
|
|
58
|
+
setMessage(msg);
|
|
59
|
+
setStatus(s);
|
|
60
|
+
if (m) {
|
|
61
|
+
setMetrics(m);
|
|
62
|
+
// Initialize asset resolver for the new version immediately
|
|
63
|
+
(0, _otaAssetResolver.initOtaAssetResolver)(targetVer);
|
|
64
|
+
}
|
|
65
|
+
}, percent => {
|
|
66
|
+
setProgress(percent);
|
|
67
|
+
});
|
|
68
|
+
} catch (error) {
|
|
69
|
+
console.error('[OtaProvider] Update error:', error);
|
|
70
|
+
setStatus(_types.OtaStatus.ERROR);
|
|
71
|
+
setMessage(`Update failed: ${error.message}`);
|
|
72
|
+
}
|
|
73
|
+
}, [config]);
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Exposed method for manual trigger
|
|
77
|
+
*/
|
|
78
|
+
const applyUpdate = (0, _react.useCallback)(async () => {
|
|
79
|
+
await executeApplyUpdate(patches, currentVersion, latestVersion);
|
|
80
|
+
}, [executeApplyUpdate, patches, currentVersion, latestVersion]);
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Check for updates from the manifest.
|
|
84
|
+
* Uses a ref to guard against concurrent calls (avoids stale closure).
|
|
85
|
+
*/
|
|
86
|
+
const checkUpdates = (0, _react.useCallback)(async () => {
|
|
87
|
+
if (isCheckingRef.current) return;
|
|
88
|
+
isCheckingRef.current = true;
|
|
89
|
+
setIsChecking(true);
|
|
90
|
+
setStatus(_types.OtaStatus.CHECKING);
|
|
91
|
+
setMessage('Checking for updates...');
|
|
92
|
+
const log = (0, _otaLogger.createOtaLogger)(config.onEvent);
|
|
93
|
+
log.emit(_otaLogger.OtaEvent.CHECK_UPDATE);
|
|
94
|
+
try {
|
|
95
|
+
const remotePatches = await (0, _otaCore.fetchOtaManifest)(config);
|
|
96
|
+
const metadata = await (0, _otaMetadata.loadMetadata)(config.baseAppVersion);
|
|
97
|
+
const localV = metadata.currentVersion;
|
|
98
|
+
console.log('[OtaProvider] checkUpdates | localV:', localV, 'remotePatches count:', remotePatches.length);
|
|
99
|
+
const platformPatches = remotePatches.filter(p => p.platform === _reactNative.Platform.OS);
|
|
100
|
+
console.log('[OtaProvider] platformPatches count:', platformPatches.length);
|
|
101
|
+
const maxV = platformPatches.length > 0 ? Math.max(...platformPatches.map(p => p.toVersion)) : localV;
|
|
102
|
+
console.log('[OtaProvider] latestV determined:', maxV);
|
|
103
|
+
setPatches(platformPatches);
|
|
104
|
+
setCurrentVersion(localV);
|
|
105
|
+
setLatestVersion(maxV);
|
|
106
|
+
if (maxV > localV) {
|
|
107
|
+
setPendingCount(1);
|
|
108
|
+
setMessage(`Update available: V${localV} → V${maxV}`);
|
|
109
|
+
setStatus(_types.OtaStatus.UPDATE_AVAILABLE);
|
|
110
|
+
|
|
111
|
+
// Trigger behaviors based on mode
|
|
112
|
+
if (config.updateMode === _types.OtaUpdateMode.BACKGROUND_DOWNLOAD) {
|
|
113
|
+
downloadBackgroundUpdate(platformPatches, localV, maxV);
|
|
114
|
+
} else if (config.updateMode === _types.OtaUpdateMode.ON_APP_START || config.updateMode === _types.OtaUpdateMode.ON_APP_FOREGROUND) {
|
|
115
|
+
// Auto-apply immediately!
|
|
116
|
+
await executeApplyUpdate(platformPatches, localV, maxV);
|
|
117
|
+
}
|
|
118
|
+
} else {
|
|
119
|
+
setPendingCount(0);
|
|
120
|
+
setMessage(`All systems nominal (V${localV})`);
|
|
121
|
+
setStatus(_types.OtaStatus.UP_TO_DATE);
|
|
122
|
+
}
|
|
123
|
+
} catch (error) {
|
|
124
|
+
setMessage(`Check failed: ${error.message}`);
|
|
125
|
+
setStatus(_types.OtaStatus.ERROR);
|
|
126
|
+
} finally {
|
|
127
|
+
isCheckingRef.current = false;
|
|
128
|
+
setIsChecking(false);
|
|
129
|
+
}
|
|
130
|
+
}, [config, executeApplyUpdate]);
|
|
131
|
+
const downloadBackgroundUpdate = async (patchList, localV, targetV) => {
|
|
132
|
+
const directPatch = patchList.find(p => p.fromVersion === localV && p.toVersion === targetV);
|
|
133
|
+
if (!directPatch) return;
|
|
134
|
+
console.warn('[OtaProvider] BACKGROUND_DOWNLOAD mode is not yet implemented. ' + 'Patches were found but no download occurred. ' + 'Use MANUAL or ON_APP_START mode for now.');
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Bootstrap: runs once on mount.
|
|
139
|
+
*
|
|
140
|
+
* Lifecycle:
|
|
141
|
+
* 1. Load metadata
|
|
142
|
+
* 2. Check if previous launch failed → rollback if needed
|
|
143
|
+
* 3. Mark current launch as "pending verification" (lastLaunchSuccessful=false)
|
|
144
|
+
* 4. App renders → markAsHealthy() sets it back to true
|
|
145
|
+
* 5. If crash before markAsHealthy → next boot sees false → rollback
|
|
146
|
+
* 6. Check for updates based on updateMode
|
|
147
|
+
*/
|
|
148
|
+
(0, _react.useEffect)(() => {
|
|
149
|
+
const bootstrap = async () => {
|
|
150
|
+
// Clean up any pending trash directories from previous resets (non-blocking)
|
|
151
|
+
_reactNativeBlobUtil.default.fs.ls(_reactNativeBlobUtil.default.fs.dirs.DocumentDir).then(dirs => {
|
|
152
|
+
for (const dir of dirs) {
|
|
153
|
+
if (dir.startsWith('ota_trash_')) {
|
|
154
|
+
_reactNativeBlobUtil.default.fs.unlink(`${_reactNativeBlobUtil.default.fs.dirs.DocumentDir}/${dir}`).catch(() => {});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}).catch(() => {});
|
|
158
|
+
const metadata = await (0, _otaMetadata.loadMetadata)(config.baseAppVersion);
|
|
159
|
+
|
|
160
|
+
// Display current version immediately
|
|
161
|
+
setCurrentVersion(metadata.currentVersion);
|
|
162
|
+
|
|
163
|
+
// Initialize asset resolver with current version (if not base)
|
|
164
|
+
if (metadata.currentVersion > config.baseAppVersion) {
|
|
165
|
+
await (0, _otaAssetResolver.initOtaAssetResolver)(metadata.currentVersion);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// (Native layer handled crash detection and any necessary rollback)
|
|
169
|
+
// We just mark bootstrap as done
|
|
170
|
+
bootstrapDone.current = true;
|
|
171
|
+
|
|
172
|
+
// Always mark as healthy after a successful JS bootstrap.
|
|
173
|
+
//
|
|
174
|
+
// The native OtaBundleResolver uses its own baseVersion (DEFAULT_BASE_VERSION=1),
|
|
175
|
+
// independent of the JS-side config.baseAppVersion. It marks
|
|
176
|
+
// lastLaunchSuccessful=false before loading ANY OTA bundle (even when
|
|
177
|
+
// JS baseAppVersion has been bumped to match currentVersion). If we only
|
|
178
|
+
// call markAsHealthy when currentVersion > JS baseAppVersion, we miss this
|
|
179
|
+
// case and the native layer will rollback on the very next cold boot.
|
|
180
|
+
//
|
|
181
|
+
// markAsHealthy() is safe to call unconditionally — it's a no-op when
|
|
182
|
+
// the metadata already has lastLaunchSuccessful=true.
|
|
183
|
+
console.log(`[OtaProvider] Marking V${metadata.currentVersion} as healthy`);
|
|
184
|
+
await markAsHealthy();
|
|
185
|
+
|
|
186
|
+
// Mode-based auto-check
|
|
187
|
+
const mode = config.updateMode ?? _types.OtaUpdateMode.MANUAL;
|
|
188
|
+
if (mode === _types.OtaUpdateMode.ON_APP_START || mode === _types.OtaUpdateMode.BACKGROUND_DOWNLOAD) {
|
|
189
|
+
checkUpdates();
|
|
190
|
+
} else {
|
|
191
|
+
setMessage(`Ready (V${metadata.currentVersion})`);
|
|
192
|
+
setStatus(_types.OtaStatus.UP_TO_DATE);
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
bootstrap().then(() => setIsInitialized(true)).catch(() => {
|
|
196
|
+
// Bootstrap failed: keep UI blocked so user sees the error state.
|
|
197
|
+
// setIsInitialized stays false → isBlocking remains true → the error
|
|
198
|
+
// message is shown via loadingView instead of a silent blank screen.
|
|
199
|
+
});
|
|
200
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
201
|
+
}, []);
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* AppState listener for ON_APP_FOREGROUND mode
|
|
205
|
+
*/
|
|
206
|
+
(0, _react.useEffect)(() => {
|
|
207
|
+
const subscription = _reactNative.AppState.addEventListener('change', nextAppState => {
|
|
208
|
+
if (appState.current.match(/inactive|background/) && nextAppState === 'active' && bootstrapDone.current) {
|
|
209
|
+
const mode = config.updateMode ?? _types.OtaUpdateMode.MANUAL;
|
|
210
|
+
if (mode === _types.OtaUpdateMode.ON_APP_FOREGROUND) {
|
|
211
|
+
checkUpdates();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
appState.current = nextAppState;
|
|
215
|
+
});
|
|
216
|
+
return () => {
|
|
217
|
+
subscription.remove();
|
|
218
|
+
};
|
|
219
|
+
}, [config.updateMode, checkUpdates]);
|
|
220
|
+
const markAsHealthy = async () => {
|
|
221
|
+
const log = (0, _otaLogger.createOtaLogger)(config.onEvent);
|
|
222
|
+
log.emit(_otaLogger.OtaEvent.MARK_HEALTHY);
|
|
223
|
+
await (0, _otaMetadata.markHealthy)(config.baseAppVersion);
|
|
224
|
+
_NativeBsPatch.default.markAsHealthy();
|
|
225
|
+
};
|
|
226
|
+
const resetToFactory = async () => {
|
|
227
|
+
const log = (0, _otaLogger.createOtaLogger)(config.onEvent);
|
|
228
|
+
try {
|
|
229
|
+
setStatus(_types.OtaStatus.APPLYING);
|
|
230
|
+
setMessage('Executing system wipe...');
|
|
231
|
+
log.emit(_otaLogger.OtaEvent.RESET_FACTORY);
|
|
232
|
+
const otaDir = `${_reactNativeBlobUtil.default.fs.dirs.DocumentDir}/ota`;
|
|
233
|
+
if (await _reactNativeBlobUtil.default.fs.exists(otaDir)) {
|
|
234
|
+
// Fast atomic rename to prevent blocking the JS thread during deletion of potentially 1000s of files
|
|
235
|
+
const trashDir = `${_reactNativeBlobUtil.default.fs.dirs.DocumentDir}/ota_trash_${Date.now()}`;
|
|
236
|
+
await _reactNativeBlobUtil.default.fs.mv(otaDir, trashDir);
|
|
237
|
+
// Deletion is deferred to the next app bootstrap to prevent blocking the bridge before reload
|
|
238
|
+
}
|
|
239
|
+
setMessage('Reset complete. Core reload initiated...');
|
|
240
|
+
_NativeBsPatch.default.reloadBundle();
|
|
241
|
+
} catch (error) {
|
|
242
|
+
setStatus(_types.OtaStatus.ERROR);
|
|
243
|
+
setMessage(`Reset failed: ${error.message}`);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
const value = {
|
|
247
|
+
status,
|
|
248
|
+
message,
|
|
249
|
+
progress,
|
|
250
|
+
currentVersion,
|
|
251
|
+
latestVersion,
|
|
252
|
+
pendingCount,
|
|
253
|
+
isChecking,
|
|
254
|
+
metrics,
|
|
255
|
+
applyUpdate,
|
|
256
|
+
resetToFactory,
|
|
257
|
+
markAsHealthy,
|
|
258
|
+
checkUpdate: checkUpdates
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
// Logic to determine if we should block the UI
|
|
262
|
+
const isBlocking = (0, _react.useMemo)(() => {
|
|
263
|
+
return useLoadingView && (!isInitialized || config.updateMode === _types.OtaUpdateMode.ON_APP_START && (status === _types.OtaStatus.IDLE || status === _types.OtaStatus.CHECKING || status === _types.OtaStatus.DOWNLOADING || status === _types.OtaStatus.APPLYING || status === _types.OtaStatus.UPDATE_AVAILABLE));
|
|
264
|
+
}, [useLoadingView, isInitialized, config.updateMode, status]);
|
|
265
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(OtaContext.Provider, {
|
|
266
|
+
value: value,
|
|
267
|
+
children: !isBlocking ? children : loadingView !== undefined ? loadingView : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
268
|
+
style: styles.loadingContainer,
|
|
269
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
|
|
270
|
+
size: "large",
|
|
271
|
+
color: "#FF00F5"
|
|
272
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
273
|
+
style: styles.loadingText,
|
|
274
|
+
children: message
|
|
275
|
+
}), status === _types.OtaStatus.DOWNLOADING || status === _types.OtaStatus.APPLYING ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
276
|
+
style: styles.progressText,
|
|
277
|
+
children: [progress.toFixed(1), "%"]
|
|
278
|
+
}) : null]
|
|
279
|
+
})
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
function useOta() {
|
|
283
|
+
const context = (0, _react.useContext)(OtaContext);
|
|
284
|
+
if (context === undefined) {
|
|
285
|
+
throw new Error('useOta must be used within an OtaProvider');
|
|
286
|
+
}
|
|
287
|
+
return context;
|
|
288
|
+
}
|
|
289
|
+
const styles = _reactNative.StyleSheet.create({
|
|
290
|
+
loadingContainer: {
|
|
291
|
+
flex: 1,
|
|
292
|
+
justifyContent: 'center',
|
|
293
|
+
alignItems: 'center',
|
|
294
|
+
backgroundColor: '#000'
|
|
295
|
+
},
|
|
296
|
+
loadingText: {
|
|
297
|
+
marginTop: 20,
|
|
298
|
+
color: '#00FFCC',
|
|
299
|
+
fontSize: 16
|
|
300
|
+
},
|
|
301
|
+
progressText: {
|
|
302
|
+
marginTop: 10,
|
|
303
|
+
color: '#fff'
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
//# sourceMappingURL=OtaProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeBlobUtil","_interopRequireDefault","_NativeBsPatch","_otaAssetResolver","_otaCore","_otaLogger","_otaMetadata","_types","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","OtaContext","createContext","undefined","OtaProvider","children","config","loadingView","useLoadingView","status","setStatus","useState","OtaStatus","IDLE","message","setMessage","progress","setProgress","currentVersion","setCurrentVersion","baseAppVersion","latestVersion","setLatestVersion","pendingCount","setPendingCount","isChecking","setIsChecking","metrics","setMetrics","patches","setPatches","isInitialized","setIsInitialized","appState","useRef","AppState","currentState","isCheckingRef","bootstrapDone","executeApplyUpdate","useCallback","patchList","currentVer","targetVer","console","log","directPatch","find","p","fromVersion","toVersion","platform","Platform","OS","warn","ERROR","DOWNLOADING","applyOtaPatchInternal","s","msg","m","initOtaAssetResolver","percent","error","applyUpdate","checkUpdates","current","CHECKING","createOtaLogger","onEvent","emit","OtaEvent","CHECK_UPDATE","remotePatches","fetchOtaManifest","metadata","loadMetadata","localV","length","platformPatches","filter","maxV","Math","max","map","UPDATE_AVAILABLE","updateMode","OtaUpdateMode","BACKGROUND_DOWNLOAD","downloadBackgroundUpdate","ON_APP_START","ON_APP_FOREGROUND","UP_TO_DATE","targetV","useEffect","bootstrap","ReactNativeBlobUtil","fs","ls","dirs","DocumentDir","then","dir","startsWith","unlink","catch","markAsHealthy","mode","MANUAL","subscription","addEventListener","nextAppState","match","remove","MARK_HEALTHY","markHealthy","NativeBsPatch","resetToFactory","APPLYING","RESET_FACTORY","otaDir","exists","trashDir","Date","now","mv","reloadBundle","value","checkUpdate","isBlocking","useMemo","jsx","Provider","jsxs","View","style","styles","loadingContainer","ActivityIndicator","size","color","Text","loadingText","progressText","toFixed","useOta","context","useContext","Error","StyleSheet","create","flex","justifyContent","alignItems","backgroundColor","marginTop","fontSize"],"sourceRoot":"../../../src","sources":["ota/OtaProvider.tsx"],"mappings":"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","ignoreList":[]}
|