react-native-update 10.59.2 → 10.60.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 (125) hide show
  1. package/README-CN.md +7 -7
  2. package/README.md +7 -6
  3. package/android/build.gradle +25 -33
  4. package/android/jni/Android.mk +16 -24
  5. package/android/lib/arm64-v8a/librnpushy.so +0 -0
  6. package/android/lib/armeabi-v7a/librnpushy.so +0 -0
  7. package/android/lib/x86/librnpushy.so +0 -0
  8. package/android/lib/x86_64/librnpushy.so +0 -0
  9. package/android/proguard.pro +9 -7
  10. package/android/src/main/java/cn/reactnative/modules/update/ApkInstaller.java +2 -7
  11. package/android/src/main/java/cn/reactnative/modules/update/ArchiveLimits.java +23 -6
  12. package/android/src/main/java/cn/reactnative/modules/update/BundledResourceCopier.java +50 -51
  13. package/android/src/main/java/cn/reactnative/modules/update/CleanupKeepNames.java +12 -13
  14. package/android/src/main/java/cn/reactnative/modules/update/CopyGroupResult.java +3 -0
  15. package/android/src/main/java/cn/reactnative/modules/update/CrashHold.java +22 -30
  16. package/android/src/main/java/cn/reactnative/modules/update/DownloadTask.java +181 -332
  17. package/android/src/main/java/cn/reactnative/modules/update/DownloadTaskParams.java +3 -1
  18. package/android/src/main/java/cn/reactnative/modules/update/ErrorCodes.java +27 -0
  19. package/android/src/main/java/cn/reactnative/modules/update/FileOperationException.java +1 -1
  20. package/android/src/main/java/cn/reactnative/modules/update/FlowBridge.java +32 -8
  21. package/android/src/main/java/cn/reactnative/modules/update/HttpClients.java +63 -0
  22. package/android/src/main/java/cn/reactnative/modules/update/HttpUtils.java +0 -11
  23. package/android/src/main/java/cn/reactnative/modules/update/InstallRecord.java +66 -116
  24. package/android/src/main/java/cn/reactnative/modules/update/NativeCore.java +9 -1
  25. package/android/src/main/java/cn/reactnative/modules/update/PatchFailedException.java +1 -1
  26. package/android/src/main/java/cn/reactnative/modules/update/PushyRuntime.java +32 -60
  27. package/android/src/main/java/cn/reactnative/modules/update/ReactReloadManager.java +8 -23
  28. package/android/src/main/java/cn/reactnative/modules/update/SafeZipFile.java +42 -80
  29. package/android/src/main/java/cn/reactnative/modules/update/StateSerialRunner.java +22 -39
  30. package/android/src/main/java/cn/reactnative/modules/update/SyncCoordinator.java +176 -299
  31. package/android/src/main/java/cn/reactnative/modules/update/Threads.java +35 -0
  32. package/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java +242 -174
  33. package/android/src/main/java/cn/reactnative/modules/update/UpdateEventEmitter.java +1 -1
  34. package/android/src/main/java/cn/reactnative/modules/update/UpdateFileUtils.java +75 -17
  35. package/android/src/main/java/cn/reactnative/modules/update/{UpdateModuleImpl.java → UpdateModule.java} +113 -95
  36. package/android/src/main/java/cn/reactnative/modules/update/UpdatePackage.java +16 -19
  37. package/android/src/oldarch/cn/reactnative/modules/update/NativePushySpec.java +69 -0
  38. package/cpp/android_jni/archive_limits_jni.cpp +83 -0
  39. package/cpp/android_jni/install_record_jni.cpp +89 -0
  40. package/cpp/android_jni/jni_log.h +31 -0
  41. package/cpp/android_jni/jni_natives.h +40 -0
  42. package/cpp/android_jni/jni_registration.cpp +133 -0
  43. package/cpp/android_jni/jni_util.h +160 -0
  44. package/cpp/android_jni/update_core_android.cpp +450 -0
  45. package/cpp/android_jni/update_flow_jni.cpp +133 -0
  46. package/{android/jni → cpp/hpatch}/hpatch.c +5 -5
  47. package/{android/jni → cpp/hpatch}/hpatch.h +4 -1
  48. package/cpp/patch_core/archive_limits.cpp +194 -0
  49. package/cpp/patch_core/archive_limits.h +99 -10
  50. package/cpp/patch_core/archive_patch_core.cpp +96 -12
  51. package/cpp/patch_core/archive_patch_core.h +49 -0
  52. package/cpp/patch_core/digest.h +5 -4
  53. package/cpp/patch_core/error_codes.h +5 -3
  54. package/cpp/patch_core/install_record.cpp +430 -0
  55. package/cpp/patch_core/install_record.h +163 -9
  56. package/cpp/patch_core/patch_core.cpp +62 -16
  57. package/cpp/patch_core/patch_core.h +27 -7
  58. package/cpp/patch_core/patch_manifest.cpp +201 -0
  59. package/cpp/patch_core/patch_manifest.h +74 -0
  60. package/cpp/patch_core/state_ops.h +3 -3
  61. package/cpp/update_flow_core/flow_json.cpp +82 -8
  62. package/cpp/update_flow_core/flow_json.h +21 -0
  63. package/cpp/update_flow_core/native_config.cpp +456 -0
  64. package/cpp/update_flow_core/native_config.h +84 -0
  65. package/cpp/update_flow_core/native_round.cpp +326 -0
  66. package/cpp/update_flow_core/native_round.h +90 -0
  67. package/cpp/update_flow_core/update_flow_core.h +2 -2
  68. package/harmony/hvigor-plugin.ts +11 -19
  69. package/harmony/pushy/src/main/cpp/CMakeLists.txt +17 -26
  70. package/harmony/pushy/src/main/cpp/PushyPackage.h +2 -2
  71. package/harmony/pushy/src/main/cpp/PushyTurboModule.cpp +55 -94
  72. package/harmony/pushy/src/main/cpp/pushy.cpp +694 -517
  73. package/harmony/pushy/src/main/ets/ArchiveLimits.ts +48 -72
  74. package/harmony/pushy/src/main/ets/DownloadTask.ts +164 -404
  75. package/harmony/pushy/src/main/ets/DownloadTaskParams.ts +1 -3
  76. package/harmony/pushy/src/main/ets/ErrorCodes.ts +1 -14
  77. package/harmony/pushy/src/main/ets/EventHub.ts +1 -1
  78. package/harmony/pushy/src/main/ets/InstallRecord.ts +52 -151
  79. package/harmony/pushy/src/main/ets/Logger.ts +20 -34
  80. package/harmony/pushy/src/main/ets/NativePatchCore.ts +116 -42
  81. package/harmony/pushy/src/main/ets/PushyConfiguration.ts +8 -85
  82. package/harmony/pushy/src/main/ets/PushyTurboModule.ts +11 -25
  83. package/harmony/pushy/src/main/ets/SaveFile.ts +99 -18
  84. package/harmony/pushy/src/main/ets/SyncCoordinator.ts +136 -335
  85. package/harmony/pushy/src/main/ets/Texts.ts +0 -4
  86. package/harmony/pushy/src/main/ets/UpdateContext.ts +106 -119
  87. package/harmony/pushy.har +0 -0
  88. package/ios/RCTPushy/RCTPushy+Launch.mm +185 -0
  89. package/ios/RCTPushy/RCTPushy.h +12 -0
  90. package/ios/RCTPushy/RCTPushy.mm +87 -2634
  91. package/ios/RCTPushy/RCTPushyCommon.h +34 -0
  92. package/ios/RCTPushy/RCTPushyConfiguration.h +0 -8
  93. package/ios/RCTPushy/RCTPushyConfiguration.mm +40 -121
  94. package/ios/RCTPushy/RCTPushyDownloader.mm +40 -37
  95. package/ios/RCTPushy/RCTPushyInstallRecord.mm +61 -0
  96. package/ios/RCTPushy/RCTPushyInstaller.mm +689 -0
  97. package/ios/RCTPushy/RCTPushyInternal.h +144 -0
  98. package/ios/RCTPushy/RCTPushyOrchestrator.mm +1001 -0
  99. package/ios/RCTPushy/RCTPushyState.mm +314 -0
  100. package/package.json +25 -23
  101. package/react-native-update.podspec +73 -82
  102. package/src/client.ts +361 -451
  103. package/src/context.ts +1 -1
  104. package/src/core.ts +35 -8
  105. package/src/endpoint.ts +0 -2
  106. package/src/error.ts +13 -32
  107. package/src/i18n.ts +18 -83
  108. package/src/locales/en.ts +0 -4
  109. package/src/locales/zh.ts +0 -4
  110. package/src/provider.tsx +60 -53
  111. package/src/telemetry.ts +0 -13
  112. package/src/type.ts +0 -15
  113. package/src/updateFlowCore.ts +116 -10
  114. package/src/utils.ts +49 -42
  115. package/android/src/main/java/cn/reactnative/modules/update/ArchivePatchPlanResult.java +0 -6
  116. package/android/src/main/java/cn/reactnative/modules/update/PushyConfiguration.java +0 -104
  117. package/android/src/main/java/cn/reactnative/modules/update/UiThreadRunner.java +0 -37
  118. package/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java +0 -121
  119. package/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java +0 -125
  120. package/cpp/patch_core/jni_natives.h +0 -27
  121. package/cpp/patch_core/jni_registration.cpp +0 -103
  122. package/cpp/patch_core/jni_util.h +0 -60
  123. package/cpp/patch_core/patch_core_android.cpp +0 -97
  124. package/cpp/patch_core/update_core_android.cpp +0 -485
  125. package/cpp/update_flow_core/update_flow_jni.cpp +0 -150
@@ -37,11 +37,6 @@ interface RestartWant {
37
37
  abilityName?: string;
38
38
  }
39
39
 
40
- // applicationContext.restartApp 是 API 12 才有的可选能力,按结构探测。
41
- interface RestartableApplicationContext {
42
- restartApp?: (want: RestartWant) => void;
43
- }
44
-
45
40
  interface RestartEventEmitter {
46
41
  emit(event: string, payload: Object): void;
47
42
  }
@@ -122,13 +117,10 @@ export class PushyTurboModule extends UITurboModule {
122
117
  abilityName: this.mUiCtx.abilityInfo?.name,
123
118
  };
124
119
  try {
125
- const applicationContext =
126
- this.mUiCtx.getApplicationContext() as unknown as RestartableApplicationContext;
127
- if (applicationContext && typeof applicationContext.restartApp === 'function') {
128
- logger.debug(TAG, 'restartAbility via applicationContext.restartApp');
129
- applicationContext.restartApp(want);
130
- return;
131
- }
120
+ // applicationContext.restartApp exists since API 12, the HAR's minimum.
121
+ logger.debug(TAG, 'restartAbility via applicationContext.restartApp');
122
+ this.mUiCtx.getApplicationContext().restartApp(want);
123
+ return;
132
124
  } catch (e) {
133
125
  logger.error(TAG, `restartAbility via restartApp failed: ${getErrorMessage(e)}`);
134
126
  }
@@ -206,23 +198,17 @@ export class PushyTurboModule extends UITurboModule {
206
198
  uuid,
207
199
  supportedDiffVersion: NativePatchCore.getSupportedDiffVersion(),
208
200
  };
209
- const logResult = {
210
- downloadRootDir: result.downloadRootDir,
211
- currentVersionInfo: result.currentVersionInfo,
212
- packageVersion: result.packageVersion,
213
- currentVersion: result.currentVersion,
214
- buildTime: result.buildTime,
215
- isUsingBundleUrl: result.isUsingBundleUrl,
216
- isFirstTime: result.isFirstTime,
217
- rolledBackVersion: result.rolledBackVersion,
218
- uuidSet: !!result.uuid,
219
- };
220
- logger.info(TAG, `,getConstants result: ${JSON.stringify(logResult)}`);
201
+ // The install uuid stays out of the logs; only whether it is set.
202
+ const { uuid: _uuid, ...logResult } = result;
203
+ logger.info(
204
+ TAG,
205
+ `,getConstants result: ${JSON.stringify({ ...logResult, uuidSet: !!uuid })}`,
206
+ );
221
207
  return result;
222
208
  }
223
209
 
224
210
  // 以下方法在 JS spec(src/NativePushy.ts)里都返回 Promise,C++ 方法表
225
- // (PushyTurboModule.cpp)相应用 PUSHY_ASYNC_METHOD 注册:同步注册会把
211
+ // (PushyTurboModule.cpp 的 PUSHY_METHODS)相应登记为 ASYNC:同步注册会把
226
212
  // ArkTS 的 Promise 变成空对象、把 reject 丢成 ArkTS 侧的 unhandled rejection。
227
213
  // 每个拒绝都带稳定错误码(ErrorCodes.ts):`code` 属性 + `[CODE] ` 消息前缀。
228
214
 
@@ -1,34 +1,115 @@
1
1
  import resourceManager from '@ohos.resourceManager';
2
- import fs, { ReadOptions } from '@ohos.file.fs';
2
+ import fs from '@ohos.file.fs';
3
+ import logger from './Logger';
4
+ import { getErrorMessage } from './ErrorCodes';
3
5
 
4
- const COPY_BUFFER_SIZE = 64 * 1024;
6
+ const TAG = 'SaveFile';
7
+ // 每次 read/write 都是一次工作线程往返:块大一些,几 MB 的 bundle 只需
8
+ // 十几次往返;内存上限仍是一个块。
9
+ const COPY_BUFFER_SIZE = 512 * 1024;
5
10
 
6
- export const saveFileToSandbox = (
11
+ // resourceManager 按文件名跟踪 rawfile descriptor(closeRawFd 只收名字):
12
+ // 同名的 getRawFd/closeRawFd 若交错,一方的 close 可能在另一方读到一半时
13
+ // 关掉它的 fd。同名访问按到达顺序串行(不同名互不影响)。
14
+ const rawFdChains = new Map<string, Promise<void>>();
15
+
16
+ /**
17
+ * 打开 rawfile descriptor 交给 job,job 结束(无论成败)后关闭。同名串行。
18
+ * descriptor 指向 HAP 内 [offset, offset + length) 区间,job 只能按 offset
19
+ * 定位读取。
20
+ */
21
+ export async function withRawFd<T>(
22
+ manager: resourceManager.ResourceManager,
23
+ name: string,
24
+ job: (descriptor: resourceManager.RawFileDescriptor) => Promise<T>,
25
+ ): Promise<T> {
26
+ const previous = rawFdChains.get(name) ?? Promise.resolve();
27
+ let release: () => void = () => {};
28
+ const held = new Promise<void>(resolve => {
29
+ release = resolve;
30
+ });
31
+ const tail = previous.then(() => held);
32
+ rawFdChains.set(name, tail);
33
+ try {
34
+ await previous;
35
+ const descriptor = await manager.getRawFd(name);
36
+ try {
37
+ return await job(descriptor);
38
+ } finally {
39
+ try {
40
+ await manager.closeRawFd(name);
41
+ } catch (closeError) {
42
+ logger.error(
43
+ TAG,
44
+ `Failed to close raw fd for ${name}: ${getErrorMessage(closeError)}`,
45
+ );
46
+ }
47
+ }
48
+ } finally {
49
+ release();
50
+ if (rawFdChains.get(name) === tail) {
51
+ rawFdChains.delete(name);
52
+ }
53
+ }
54
+ }
55
+
56
+ /** 把 buffer 的前 length 字节完整写入 fd(处理短写)。 */
57
+ export async function writeFully(
58
+ fd: number,
59
+ buffer: ArrayBuffer,
60
+ length: number,
61
+ ): Promise<void> {
62
+ let written = 0;
63
+ while (written < length) {
64
+ const chunk = written === 0 ? buffer : buffer.slice(written, length);
65
+ const count = await fs.write(fd, chunk, { length: length - written });
66
+ if (count <= 0) {
67
+ throw new Error(`Short write: ${written}/${length} bytes`);
68
+ }
69
+ written += count;
70
+ }
71
+ }
72
+
73
+ /** 文件存在则删除(删除失败照常抛出)。 */
74
+ export async function unlinkIfExists(path: string): Promise<void> {
75
+ if (fs.accessSync(path)) {
76
+ await fs.unlink(path);
77
+ }
78
+ }
79
+
80
+ /**
81
+ * 把 rawfile descriptor 指向的区间异步拷贝到沙箱文件(覆盖)。全程异步
82
+ * fileIo:调用方在 UI 线程(TurboModule),同步 IO 会冻结界面。读到预期
83
+ * 长度之前遇到 EOF 视为错误。
84
+ */
85
+ export async function saveFileToSandbox(
7
86
  from: resourceManager.RawFileDescriptor,
8
87
  toPath: string,
9
- ) => {
10
- let to = fs.openSync(toPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
11
-
12
- const buffer = new ArrayBuffer(COPY_BUFFER_SIZE);
13
- let currentOffset = from.offset;
88
+ ): Promise<void> {
89
+ const to = await fs.open(
90
+ toPath,
91
+ fs.OpenMode.WRITE_ONLY | fs.OpenMode.CREATE | fs.OpenMode.TRUNC,
92
+ );
93
+ const buffer = new ArrayBuffer(
94
+ Math.max(1, Math.min(COPY_BUFFER_SIZE, from.length)),
95
+ );
96
+ let position = from.offset;
14
97
  let remaining = from.length;
15
98
 
16
99
  try {
17
100
  while (remaining > 0) {
18
- const readOption: ReadOptions = {
19
- offset: currentOffset,
20
- length: Math.min(COPY_BUFFER_SIZE, remaining),
21
- };
22
- const readLength = fs.readSync(from.fd, buffer, readOption);
101
+ const readLength = await fs.read(from.fd, buffer, {
102
+ offset: position,
103
+ length: Math.min(buffer.byteLength, remaining),
104
+ });
23
105
  if (readLength <= 0) {
24
106
  throw new Error(`Unexpected EOF while copying resource to ${toPath}`);
25
107
  }
26
-
27
- fs.writeSync(to.fd, buffer, { length: readLength });
28
- currentOffset += readLength;
108
+ await writeFully(to.fd, buffer, readLength);
109
+ position += readLength;
29
110
  remaining -= readLength;
30
111
  }
31
112
  } finally {
32
- fs.close(to);
113
+ await fs.close(to);
33
114
  }
34
- };
115
+ }