react-native-update 10.55.1 → 10.56.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/README-CN.md +35 -0
- package/README.md +37 -0
- package/android/build.gradle +53 -27
- package/android/jni/Application.mk +6 -1
- package/android/jni/hpatch.c +59 -4
- package/android/lib/arm64-v8a/librnupdate.so +0 -0
- package/android/lib/armeabi-v7a/librnupdate.so +0 -0
- package/android/lib/x86/librnupdate.so +0 -0
- package/android/lib/x86_64/librnupdate.so +0 -0
- package/android/proguard.pro +70 -14
- package/android/src/main/java/cn/reactnative/modules/update/ApkInstaller.java +15 -8
- package/android/src/main/java/cn/reactnative/modules/update/ArchiveLimits.java +1 -0
- package/android/src/main/java/cn/reactnative/modules/update/BundledResourceCopier.java +1 -2
- package/android/src/main/java/cn/reactnative/modules/update/CleanupKeepNames.java +25 -0
- package/android/src/main/java/cn/reactnative/modules/update/DownloadTask.java +98 -34
- package/android/src/main/java/cn/reactnative/modules/update/DownloadTaskParams.java +29 -0
- package/android/src/main/java/cn/reactnative/modules/update/FileOperationException.java +15 -0
- package/android/src/main/java/cn/reactnative/modules/update/HttpUtils.java +59 -0
- package/android/src/main/java/cn/reactnative/modules/update/InstallRecord.java +27 -1
- package/android/src/main/java/cn/reactnative/modules/update/NativeCheckOrchestrator.java +57 -16
- package/android/src/main/java/cn/reactnative/modules/update/ReactReloadManager.java +38 -46
- package/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java +279 -183
- package/android/src/main/java/cn/reactnative/modules/update/UpdateFileUtils.java +14 -0
- package/android/src/main/java/cn/reactnative/modules/update/UpdateModuleImpl.java +222 -215
- package/android/src/main/java/cn/reactnative/modules/update/UpdatePackage.java +5 -0
- package/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java +23 -25
- package/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java +29 -29
- package/cpp/patch_core/archive_limits.h +6 -0
- package/cpp/patch_core/jni_util.h +6 -2
- package/cpp/patch_core/patch_core.cpp +237 -84
- package/cpp/patch_core/patch_core.h +11 -0
- package/cpp/patch_core/patch_core_android.cpp +49 -33
- package/cpp/patch_core/update_core_android.cpp +134 -103
- package/cpp/update_flow_core/flow_json.cpp +150 -17
- package/cpp/update_flow_core/flow_json.h +13 -1
- package/cpp/update_flow_core/update_flow_core.cpp +78 -8
- package/cpp/update_flow_core/update_flow_core.h +9 -0
- package/cpp/update_flow_core/update_flow_jni.cpp +44 -25
- package/harmony/hvigor-plugin.ts +168 -21
- package/harmony/pushy/src/README.md +74 -0
- package/harmony/pushy/src/main/cpp/CMakeLists.txt +13 -3
- package/harmony/pushy/src/main/cpp/PushyTurboModule.cpp +11 -5
- package/harmony/pushy/src/main/cpp/pushy.cpp +103 -18
- package/harmony/pushy/src/main/ets/ArchiveLimits.ts +61 -5
- package/harmony/pushy/src/main/ets/DownloadTask.ts +255 -166
- package/harmony/pushy/src/main/ets/ErrorCodes.ts +75 -0
- package/harmony/pushy/src/main/ets/EventHub.ts +22 -20
- package/harmony/pushy/src/main/ets/InstallRecord.ts +79 -21
- package/harmony/pushy/src/main/ets/Logger.ts +42 -16
- package/harmony/pushy/src/main/ets/NativeCheckOrchestrator.ts +98 -17
- package/harmony/pushy/src/main/ets/NativePatchCore.ts +10 -3
- package/harmony/pushy/src/main/ets/PathUtils.ts +9 -3
- package/harmony/pushy/src/main/ets/PushyTurboModule.ts +139 -53
- package/harmony/pushy/src/main/ets/UpdateContext.ts +269 -159
- package/harmony/pushy/src/main/module.json5 +5 -1
- package/harmony/pushy.har +0 -0
- package/ios/PrivacyInfo.xcprivacy +79 -0
- package/ios/RCTPushy/RCTPushy.mm +399 -170
- package/ios/RCTPushy/RCTPushyDownloader.h +14 -0
- package/ios/RCTPushy/RCTPushyDownloader.mm +136 -11
- package/package.json +14 -24
- package/react-native-update.podspec +36 -3
- package/src/client.ts +236 -82
- package/src/context.ts +40 -27
- package/src/core.ts +41 -16
- package/src/endpoint.ts +2 -1
- package/src/error.ts +49 -11
- package/src/index.ts +14 -0
- package/src/locales/en.ts +1 -23
- package/src/locales/zh.ts +1 -22
- package/src/provider.tsx +159 -111
- package/src/type.ts +0 -2
- package/src/updateFlowCore.ts +10 -2
- package/src/utils.ts +61 -4
- package/android/src/main/java/cn/reactnative/modules/update/ReactNativeHostHandler.java +0 -13
- package/android/src/main/java/cn/reactnative/modules/update/UpdateModuleSupport.java +0 -45
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import fileIo from '@ohos.file.fs';
|
|
2
2
|
import statvfs from '@ohos.file.statvfs';
|
|
3
|
+
import {
|
|
4
|
+
ERROR_FILE_OPERATION_FAILED,
|
|
5
|
+
ERROR_PATCH_FAILED,
|
|
6
|
+
createUpdateError,
|
|
7
|
+
} from './ErrorCodes';
|
|
8
|
+
import { isReservedEntryName } from './InstallRecord';
|
|
3
9
|
|
|
4
|
-
// ArkTS mirror of cpp/patch_core/archive_limits.h — keep in sync by hand
|
|
10
|
+
// ArkTS mirror of cpp/patch_core/archive_limits.h — keep in sync by hand
|
|
11
|
+
// (harmony/pushy/src/test/check-constant-parity.js asserts the values match).
|
|
5
12
|
// 损坏或恶意更新包的伤害上限:最多耗费有限的磁盘/内存/时间,绝不撑爆磁盘。
|
|
6
13
|
export const MAX_ARCHIVE_BYTES = 512 * 1024 * 1024;
|
|
7
14
|
export const MAX_TOTAL_UNCOMPRESSED_BYTES = 2048 * 1024 * 1024;
|
|
@@ -11,6 +18,38 @@ export const MAX_COMPRESSION_RATIO = 100;
|
|
|
11
18
|
export const RATIO_CHECK_MIN_BYTES = 1 * 1024 * 1024;
|
|
12
19
|
export const MAX_MANIFEST_BYTES = 16 * 1024 * 1024;
|
|
13
20
|
export const FREE_DISK_MARGIN_BYTES = 64 * 1024 * 1024;
|
|
21
|
+
export const UNKNOWN_LENGTH_FREE_SPACE_PROBE_BYTES = 8 * 1024 * 1024;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 解压前的总量校验(zlib.getOriginalSize 给出的归档解压后总字节数)。
|
|
25
|
+
* zlib.decompressFile 没有逐条钩子,C++ 头文件里的逐条压缩比在这里只能按
|
|
26
|
+
* 整包近似:总解压量超过上限、或(总量大于 RATIO_CHECK_MIN_BYTES 时)总压缩
|
|
27
|
+
* 比超过 MAX_COMPRESSION_RATIO 即拒绝——20MB 归档 100:1 的 2GB 载荷在解压前
|
|
28
|
+
* 就被挡下,而不是先解出来再量。
|
|
29
|
+
*/
|
|
30
|
+
export function checkUncompressedSize(
|
|
31
|
+
archiveBytes: number,
|
|
32
|
+
uncompressedBytes: number,
|
|
33
|
+
): void {
|
|
34
|
+
if (uncompressedBytes > MAX_TOTAL_UNCOMPRESSED_BYTES) {
|
|
35
|
+
throw createUpdateError(
|
|
36
|
+
ERROR_PATCH_FAILED,
|
|
37
|
+
`archive expands beyond ${MAX_TOTAL_UNCOMPRESSED_BYTES} bytes ` +
|
|
38
|
+
`(${uncompressedBytes})`,
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
if (
|
|
42
|
+
uncompressedBytes > RATIO_CHECK_MIN_BYTES &&
|
|
43
|
+
archiveBytes > 0 &&
|
|
44
|
+
uncompressedBytes > archiveBytes * MAX_COMPRESSION_RATIO
|
|
45
|
+
) {
|
|
46
|
+
throw createUpdateError(
|
|
47
|
+
ERROR_PATCH_FAILED,
|
|
48
|
+
`archive compression ratio exceeds ${MAX_COMPRESSION_RATIO}:1 ` +
|
|
49
|
+
`(${uncompressedBytes}/${archiveBytes})`,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
14
53
|
|
|
15
54
|
/**
|
|
16
55
|
* 目标所在文件系统必须还能再写 bytesToWrite + 安全余量。取不到可用空间
|
|
@@ -39,7 +78,10 @@ export async function ensureFreeSpace(
|
|
|
39
78
|
}
|
|
40
79
|
const needed = Math.max(0, bytesToWrite) + FREE_DISK_MARGIN_BYTES;
|
|
41
80
|
if (free < needed) {
|
|
42
|
-
throw
|
|
81
|
+
throw createUpdateError(
|
|
82
|
+
ERROR_FILE_OPERATION_FAILED,
|
|
83
|
+
`insufficient disk space: need ${needed} bytes, have ${free}`,
|
|
84
|
+
);
|
|
43
85
|
}
|
|
44
86
|
}
|
|
45
87
|
|
|
@@ -50,6 +92,7 @@ export interface DirectoryMeasure {
|
|
|
50
92
|
|
|
51
93
|
/**
|
|
52
94
|
* 递归统计目录里的条目数与总字节数;两者任一超过上限立即抛错(不必扫完)。
|
|
95
|
+
* 同一趟遍历里拒绝任意深度的 `.pushy-` 保留条目(完成记录只能由 SDK 写)。
|
|
53
96
|
*/
|
|
54
97
|
export async function measureExtractedDirectory(
|
|
55
98
|
directory: string,
|
|
@@ -59,22 +102,35 @@ export async function measureExtractedDirectory(
|
|
|
59
102
|
name => name !== '.' && name !== '..',
|
|
60
103
|
);
|
|
61
104
|
for (const name of names) {
|
|
105
|
+
if (isReservedEntryName(name)) {
|
|
106
|
+
throw createUpdateError(
|
|
107
|
+
ERROR_PATCH_FAILED,
|
|
108
|
+
`archive contains reserved entry ${name}`,
|
|
109
|
+
);
|
|
110
|
+
}
|
|
62
111
|
const path = `${directory}/${name}`;
|
|
63
112
|
const stat = await fileIo.stat(path);
|
|
64
113
|
acc.entries += 1;
|
|
65
114
|
if (acc.entries > MAX_ENTRIES) {
|
|
66
|
-
throw
|
|
115
|
+
throw createUpdateError(
|
|
116
|
+
ERROR_PATCH_FAILED,
|
|
117
|
+
`archive has too many entries (> ${MAX_ENTRIES})`,
|
|
118
|
+
);
|
|
67
119
|
}
|
|
68
120
|
if (stat.isDirectory()) {
|
|
69
121
|
await measureExtractedDirectory(path, acc);
|
|
70
122
|
continue;
|
|
71
123
|
}
|
|
72
124
|
if (stat.size > MAX_ENTRY_BYTES) {
|
|
73
|
-
throw
|
|
125
|
+
throw createUpdateError(
|
|
126
|
+
ERROR_PATCH_FAILED,
|
|
127
|
+
`archive entry too large: ${name} (${stat.size} bytes)`,
|
|
128
|
+
);
|
|
74
129
|
}
|
|
75
130
|
acc.bytes += stat.size;
|
|
76
131
|
if (acc.bytes > MAX_TOTAL_UNCOMPRESSED_BYTES) {
|
|
77
|
-
throw
|
|
132
|
+
throw createUpdateError(
|
|
133
|
+
ERROR_PATCH_FAILED,
|
|
78
134
|
`archive expands beyond ${MAX_TOTAL_UNCOMPRESSED_BYTES} bytes`,
|
|
79
135
|
);
|
|
80
136
|
}
|