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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +471 -0
  3. package/android/build.gradle +100 -0
  4. package/android/src/main/AndroidManifest.xml +3 -0
  5. package/android/src/main/java/vn/reactnativebspatch/BsPatchModule.kt +139 -0
  6. package/android/src/main/java/vn/reactnativebspatch/BsPatchPackage.kt +16 -0
  7. package/android/src/main/java/vn/reactnativebspatch/OtaBundleResolver.kt +227 -0
  8. package/cpp/CMakeLists.txt +43 -0
  9. package/cpp/bsdiff/bspatch.c +194 -0
  10. package/cpp/bsdiff/bspatch.h +41 -0
  11. package/cpp/bsdiff/bspatch_wrapper.c +150 -0
  12. package/cpp/bsdiff/bspatch_wrapper.h +6 -0
  13. package/cpp/bspatch_jni.cpp +41 -0
  14. package/cpp/bzip2/LICENSE +42 -0
  15. package/cpp/bzip2/blocksort.c +1094 -0
  16. package/cpp/bzip2/bzlib.c +1572 -0
  17. package/cpp/bzip2/bzlib.h +282 -0
  18. package/cpp/bzip2/bzlib_private.h +509 -0
  19. package/cpp/bzip2/compress.c +672 -0
  20. package/cpp/bzip2/crctable.c +104 -0
  21. package/cpp/bzip2/decompress.c +652 -0
  22. package/cpp/bzip2/huffman.c +205 -0
  23. package/cpp/bzip2/randtable.c +84 -0
  24. package/ios/OtaBundleResolver.swift +241 -0
  25. package/ios/RNBsPatch.h +8 -0
  26. package/ios/RNBsPatch.mm +198 -0
  27. package/lib/commonjs/NativeBsPatch.js +9 -0
  28. package/lib/commonjs/NativeBsPatch.js.map +1 -0
  29. package/lib/commonjs/crypto-js.d.js +2 -0
  30. package/lib/commonjs/crypto-js.d.js.map +1 -0
  31. package/lib/commonjs/index.js +90 -0
  32. package/lib/commonjs/index.js.map +1 -0
  33. package/lib/commonjs/ota/OtaProvider.js +306 -0
  34. package/lib/commonjs/ota/OtaProvider.js.map +1 -0
  35. package/lib/commonjs/ota/otaAssetResolver.js +145 -0
  36. package/lib/commonjs/ota/otaAssetResolver.js.map +1 -0
  37. package/lib/commonjs/ota/otaCore.js +736 -0
  38. package/lib/commonjs/ota/otaCore.js.map +1 -0
  39. package/lib/commonjs/ota/otaLogger.js +64 -0
  40. package/lib/commonjs/ota/otaLogger.js.map +1 -0
  41. package/lib/commonjs/ota/otaMetadata.js +138 -0
  42. package/lib/commonjs/ota/otaMetadata.js.map +1 -0
  43. package/lib/commonjs/ota/storage/CustomStorage.js +140 -0
  44. package/lib/commonjs/ota/storage/CustomStorage.js.map +1 -0
  45. package/lib/commonjs/ota/storage/GitHubReleaseStorage.js +96 -0
  46. package/lib/commonjs/ota/storage/GitHubReleaseStorage.js.map +1 -0
  47. package/lib/commonjs/ota/types.js +39 -0
  48. package/lib/commonjs/ota/types.js.map +1 -0
  49. package/lib/commonjs/package.json +1 -0
  50. package/lib/module/NativeBsPatch.js +5 -0
  51. package/lib/module/NativeBsPatch.js.map +1 -0
  52. package/lib/module/crypto-js.d.js +2 -0
  53. package/lib/module/crypto-js.d.js.map +1 -0
  54. package/lib/module/index.js +23 -0
  55. package/lib/module/index.js.map +1 -0
  56. package/lib/module/ota/OtaProvider.js +299 -0
  57. package/lib/module/ota/OtaProvider.js.map +1 -0
  58. package/lib/module/ota/otaAssetResolver.js +138 -0
  59. package/lib/module/ota/otaAssetResolver.js.map +1 -0
  60. package/lib/module/ota/otaCore.js +725 -0
  61. package/lib/module/ota/otaCore.js.map +1 -0
  62. package/lib/module/ota/otaLogger.js +59 -0
  63. package/lib/module/ota/otaLogger.js.map +1 -0
  64. package/lib/module/ota/otaMetadata.js +127 -0
  65. package/lib/module/ota/otaMetadata.js.map +1 -0
  66. package/lib/module/ota/storage/CustomStorage.js +134 -0
  67. package/lib/module/ota/storage/CustomStorage.js.map +1 -0
  68. package/lib/module/ota/storage/GitHubReleaseStorage.js +90 -0
  69. package/lib/module/ota/storage/GitHubReleaseStorage.js.map +1 -0
  70. package/lib/module/ota/types.js +38 -0
  71. package/lib/module/ota/types.js.map +1 -0
  72. package/lib/typescript/NativeBsPatch.d.ts +39 -0
  73. package/lib/typescript/NativeBsPatch.d.ts.map +1 -0
  74. package/lib/typescript/index.d.ts +15 -0
  75. package/lib/typescript/index.d.ts.map +1 -0
  76. package/lib/typescript/ota/OtaProvider.d.ts +10 -0
  77. package/lib/typescript/ota/OtaProvider.d.ts.map +1 -0
  78. package/lib/typescript/ota/otaAssetResolver.d.ts +15 -0
  79. package/lib/typescript/ota/otaAssetResolver.d.ts.map +1 -0
  80. package/lib/typescript/ota/otaCore.d.ts +109 -0
  81. package/lib/typescript/ota/otaCore.d.ts.map +1 -0
  82. package/lib/typescript/ota/otaLogger.d.ts +44 -0
  83. package/lib/typescript/ota/otaLogger.d.ts.map +1 -0
  84. package/lib/typescript/ota/otaMetadata.d.ts +46 -0
  85. package/lib/typescript/ota/otaMetadata.d.ts.map +1 -0
  86. package/lib/typescript/ota/storage/CustomStorage.d.ts +12 -0
  87. package/lib/typescript/ota/storage/CustomStorage.d.ts.map +1 -0
  88. package/lib/typescript/ota/storage/GitHubReleaseStorage.d.ts +20 -0
  89. package/lib/typescript/ota/storage/GitHubReleaseStorage.d.ts.map +1 -0
  90. package/lib/typescript/ota/types.d.ts +191 -0
  91. package/lib/typescript/ota/types.d.ts.map +1 -0
  92. package/package.json +89 -0
  93. package/react-native-bspatch.podspec +46 -0
  94. package/src/NativeBsPatch.ts +52 -0
  95. package/src/crypto-js.d.ts +1 -0
  96. package/src/index.ts +29 -0
  97. package/src/ota/OtaProvider.tsx +399 -0
  98. package/src/ota/otaAssetResolver.ts +182 -0
  99. package/src/ota/otaCore.ts +963 -0
  100. package/src/ota/otaLogger.ts +72 -0
  101. package/src/ota/otaMetadata.ts +149 -0
  102. package/src/ota/storage/CustomStorage.ts +143 -0
  103. package/src/ota/storage/GitHubReleaseStorage.ts +98 -0
  104. package/src/ota/types.ts +211 -0
  105. package/tools/bsdiff +0 -0
  106. package/tools/bsdiff.c +445 -0
  107. package/tools/bsdiff.h +45 -0
  108. package/tools/build_ota.sh +457 -0
  109. package/tools/setup_project.js +273 -0
  110. package/tools/update_registry.js +145 -0
  111. package/tools/upload_ota_custom.sh +138 -0
@@ -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,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=crypto-js.d.js.map
@@ -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":[]}