@kkarum/framework 2.3.17

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 (171) hide show
  1. package/Framework.ts +337 -0
  2. package/Framework.ts.meta +10 -0
  3. package/FrameworkBase.ts +207 -0
  4. package/FrameworkBase.ts.meta +10 -0
  5. package/FrameworkInitialize.ts +79 -0
  6. package/FrameworkInitialize.ts.meta +10 -0
  7. package/README.md +93 -0
  8. package/README.md.meta +6 -0
  9. package/animation/FWAnimation.ts +13 -0
  10. package/animation/FWAnimation.ts.meta +10 -0
  11. package/animation/FWSkeleton.ts +174 -0
  12. package/animation/FWSkeleton.ts.meta +10 -0
  13. package/animation/FWTween.ts +60 -0
  14. package/animation/FWTween.ts.meta +10 -0
  15. package/animation.meta +13 -0
  16. package/component/FWVirtuaScrollViewComponent.ts +56 -0
  17. package/component/FWVirtuaScrollViewComponent.ts.meta +10 -0
  18. package/component/FWVirtualViewComponent.ts +2212 -0
  19. package/component/FWVirtualViewComponent.ts.meta +10 -0
  20. package/component.meta +13 -0
  21. package/config/FWAssetConfig.ts +7 -0
  22. package/config/FWAssetConfig.ts.meta +10 -0
  23. package/config/FWSystemConfig.ts +29 -0
  24. package/config/FWSystemConfig.ts.meta +10 -0
  25. package/config.meta +13 -0
  26. package/controller/FWLayerController.ts +178 -0
  27. package/controller/FWLayerController.ts.meta +10 -0
  28. package/controller.meta +13 -0
  29. package/data/FWData.ts +6 -0
  30. package/data/FWData.ts.meta +10 -0
  31. package/data.meta +13 -0
  32. package/define/FWEventDefine.ts +28 -0
  33. package/define/FWEventDefine.ts.meta +10 -0
  34. package/define/FWSystemDefine.ts +154 -0
  35. package/define/FWSystemDefine.ts.meta +10 -0
  36. package/define.meta +13 -0
  37. package/entry/FWEntry.ts +219 -0
  38. package/entry/FWEntry.ts.meta +10 -0
  39. package/entry.meta +13 -0
  40. package/expand/FWCocosExpand.ts +73 -0
  41. package/expand/FWCocosExpand.ts.meta +10 -0
  42. package/expand/FWDecorator.ts +366 -0
  43. package/expand/FWDecorator.ts.meta +10 -0
  44. package/expand/FWNodeExpand.ts +147 -0
  45. package/expand/FWNodeExpand.ts.meta +10 -0
  46. package/expand/FWRollingViewNesting.ts +195 -0
  47. package/expand/FWRollingViewNesting.ts.meta +10 -0
  48. package/expand/FWTweenExpand.ts +44 -0
  49. package/expand/FWTweenExpand.ts.meta +10 -0
  50. package/expand.meta +13 -0
  51. package/item/FWVirtualListItem.ts +141 -0
  52. package/item/FWVirtualListItem.ts.meta +10 -0
  53. package/item.meta +13 -0
  54. package/language/FWLanguage.ts +71 -0
  55. package/language/FWLanguage.ts.meta +10 -0
  56. package/language/FWLanguageLabelLocalize.ts +144 -0
  57. package/language/FWLanguageLabelLocalize.ts.meta +10 -0
  58. package/language/FWLanguageSkeletonLocalize.ts +106 -0
  59. package/language/FWLanguageSkeletonLocalize.ts.meta +10 -0
  60. package/language/FWLanguageSpriteLocalize.ts +81 -0
  61. package/language/FWLanguageSpriteLocalize.ts.meta +10 -0
  62. package/language.meta +13 -0
  63. package/layer/FWLayer.ts +14 -0
  64. package/layer/FWLayer.ts.meta +10 -0
  65. package/layer.meta +13 -0
  66. package/log/FWLog.ts +135 -0
  67. package/log/FWLog.ts.meta +10 -0
  68. package/log.meta +13 -0
  69. package/logic/FWLogic.ts +6 -0
  70. package/logic/FWLogic.ts.meta +10 -0
  71. package/logic.meta +13 -0
  72. package/machine/FWAnimationMachine.ts +28 -0
  73. package/machine/FWAnimationMachine.ts.meta +10 -0
  74. package/machine/FWStateMachine.ts +74 -0
  75. package/machine/FWStateMachine.ts.meta +10 -0
  76. package/machine.meta +13 -0
  77. package/manager/FWAnimationManager.ts +89 -0
  78. package/manager/FWAnimationManager.ts.meta +10 -0
  79. package/manager/FWAssetManager.ts +451 -0
  80. package/manager/FWAssetManager.ts.meta +10 -0
  81. package/manager/FWAudioManager.ts +339 -0
  82. package/manager/FWAudioManager.ts.meta +10 -0
  83. package/manager/FWBundleManager.ts +97 -0
  84. package/manager/FWBundleManager.ts.meta +10 -0
  85. package/manager/FWComponentManager.ts +24 -0
  86. package/manager/FWComponentManager.ts.meta +10 -0
  87. package/manager/FWEngineManager.ts +74 -0
  88. package/manager/FWEngineManager.ts.meta +10 -0
  89. package/manager/FWEventManager.ts +361 -0
  90. package/manager/FWEventManager.ts.meta +10 -0
  91. package/manager/FWHotUpdateManager.ts +344 -0
  92. package/manager/FWHotUpdateManager.ts.meta +10 -0
  93. package/manager/FWLanguageManager.ts +114 -0
  94. package/manager/FWLanguageManager.ts.meta +10 -0
  95. package/manager/FWLayerManager.ts +862 -0
  96. package/manager/FWLayerManager.ts.meta +10 -0
  97. package/manager/FWManager.ts +9 -0
  98. package/manager/FWManager.ts.meta +10 -0
  99. package/manager/FWObjectManager.ts +161 -0
  100. package/manager/FWObjectManager.ts.meta +10 -0
  101. package/manager/FWPerformanceManager.ts +198 -0
  102. package/manager/FWPerformanceManager.ts.meta +10 -0
  103. package/manager/FWPromiseManager.ts +504 -0
  104. package/manager/FWPromiseManager.ts.meta +10 -0
  105. package/manager/FWResManager.ts +299 -0
  106. package/manager/FWResManager.ts.meta +10 -0
  107. package/manager/FWSocketManager.ts +93 -0
  108. package/manager/FWSocketManager.ts.meta +10 -0
  109. package/manager/FWStateManager.ts +100 -0
  110. package/manager/FWStateManager.ts.meta +10 -0
  111. package/manager/FWTaskManager.ts +41 -0
  112. package/manager/FWTaskManager.ts.meta +10 -0
  113. package/manager/FWTimeManager.ts +442 -0
  114. package/manager/FWTimeManager.ts.meta +10 -0
  115. package/manager/FWUiManager.ts +217 -0
  116. package/manager/FWUiManager.ts.meta +10 -0
  117. package/manager.meta +13 -0
  118. package/package.json +11 -0
  119. package/package.json.meta +6 -0
  120. package/registry/FWRegistry.ts +62 -0
  121. package/registry/FWRegistry.ts.meta +10 -0
  122. package/registry.meta +13 -0
  123. package/render/FWRenderAssembler.ts +620 -0
  124. package/render/FWRenderAssembler.ts.meta +10 -0
  125. package/render.meta +13 -0
  126. package/scene/FWScene.ts +23 -0
  127. package/scene/FWScene.ts.meta +10 -0
  128. package/scene.meta +13 -0
  129. package/service/FWService.ts +11 -0
  130. package/service/FWService.ts.meta +10 -0
  131. package/service/http/FWHttp.ts +103 -0
  132. package/service/http/FWHttp.ts.meta +10 -0
  133. package/service/http.meta +13 -0
  134. package/service/socket/FWSocket.ts +367 -0
  135. package/service/socket/FWSocket.ts.meta +10 -0
  136. package/service/socket/FWSocketHandle.ts +16 -0
  137. package/service/socket/FWSocketHandle.ts.meta +10 -0
  138. package/service/socket/FWSocketSender.ts +14 -0
  139. package/service/socket/FWSocketSender.ts.meta +10 -0
  140. package/service/socket/mock/FWSocketMock.ts +202 -0
  141. package/service/socket/mock/FWSocketMock.ts.meta +10 -0
  142. package/service/socket/mock.meta +13 -0
  143. package/service/socket.meta +13 -0
  144. package/service.meta +13 -0
  145. package/state/FWState.ts +8 -0
  146. package/state/FWState.ts.meta +10 -0
  147. package/state.meta +13 -0
  148. package/types/Creator.d.ts +121 -0
  149. package/types/Creator.d.ts.meta +6 -0
  150. package/types/FW.d.ts +3016 -0
  151. package/types/FW.d.ts.meta +6 -0
  152. package/types/Global.d.ts +22 -0
  153. package/types/Global.d.ts.meta +10 -0
  154. package/types.meta +13 -0
  155. package/utils/FWLodash.ts +105 -0
  156. package/utils/FWLodash.ts.meta +10 -0
  157. package/utils/FWMask.ts +222 -0
  158. package/utils/FWMask.ts.meta +10 -0
  159. package/utils/FWObject.ts +27 -0
  160. package/utils/FWObject.ts.meta +10 -0
  161. package/utils/FWObjectPool.ts +177 -0
  162. package/utils/FWObjectPool.ts.meta +10 -0
  163. package/utils/FWQueue.ts +55 -0
  164. package/utils/FWQueue.ts.meta +10 -0
  165. package/utils/FWResLoader.ts +139 -0
  166. package/utils/FWResLoader.ts.meta +10 -0
  167. package/utils/FWTask.ts +227 -0
  168. package/utils/FWTask.ts.meta +10 -0
  169. package/utils/FWUtils.ts +15 -0
  170. package/utils/FWUtils.ts.meta +10 -0
  171. package/utils.meta +13 -0
@@ -0,0 +1,361 @@
1
+ /**
2
+ * 观察者
3
+ */
4
+ class FWObserver implements FW.Observer {
5
+ private pause: boolean;
6
+ /**
7
+ * 构造函数
8
+ * @param eventName 事件名字
9
+ * @param cb 回调函数
10
+ * @param target 观察目标
11
+ */
12
+ constructor(
13
+ private readonly eventName: string | number,
14
+ private readonly cb: () => void,
15
+ private readonly target: FW.TargetType,
16
+ public readonly priority: number,
17
+ public readonly intercept: boolean,
18
+ public readonly once: boolean = false,
19
+ ) {
20
+ this.cb = cb;
21
+ this.target = target;
22
+ this.pause = false;
23
+ }
24
+
25
+ /**
26
+ * 消息通知
27
+ * @param args
28
+ */
29
+ public notify(
30
+ args1?: FW.EventManagerArgs,
31
+ args2?: FW.EventManagerArgs,
32
+ args3?: FW.EventManagerArgs,
33
+ args4?: FW.EventManagerArgs,
34
+ args5?: FW.EventManagerArgs,
35
+ args6?: FW.EventManagerArgs,
36
+ args7?: FW.EventManagerArgs,
37
+ args8?: FW.EventManagerArgs,
38
+ args9?: FW.EventManagerArgs,
39
+ args10?: FW.EventManagerArgs,
40
+ ) {
41
+ if (this.pause) return;
42
+ this.cb?.call(
43
+ this.target,
44
+ args1,
45
+ args2,
46
+ args3,
47
+ args4,
48
+ args5,
49
+ args6,
50
+ args7,
51
+ args8,
52
+ args9,
53
+ args10,
54
+ );
55
+ }
56
+
57
+ /**
58
+ * 目标比较
59
+ * @param target 目标对象
60
+ * @returns
61
+ */
62
+ public compar(target: FW.TargetType) {
63
+ return (
64
+ this.target === target || (this.target.uuid && target.uuid && this.target.uuid == target.uuid)
65
+ );
66
+ }
67
+
68
+ /**
69
+ * 获取当前绑定事件名字
70
+ * @returns
71
+ */
72
+ public getEventName() {
73
+ return this.eventName;
74
+ }
75
+
76
+ /** 暂停观察 */
77
+ public pauseObserver() {
78
+ this.pause = true;
79
+ }
80
+ /** 恢复观察 */
81
+ public resumeObserver() {
82
+ this.pause = false;
83
+ }
84
+ }
85
+
86
+ /**
87
+ * 事件管理器
88
+ */
89
+ export default class FWEventManager implements FW.EventManager {
90
+ private listeners: { [key: string]: FW.Observer[] } = cc.js.createMap();
91
+
92
+ public initialize(): void {
93
+ this.listeners = cc.js.createMap();
94
+ }
95
+
96
+ /**
97
+ * 事件派发
98
+ * @param eventName 事件名
99
+ * @param args 参数列表
100
+ * @returns
101
+ */
102
+ public dispatch(
103
+ eventName: string | number,
104
+ args1?: FW.EventManagerArgs,
105
+ args2?: FW.EventManagerArgs,
106
+ args3?: FW.EventManagerArgs,
107
+ args4?: FW.EventManagerArgs,
108
+ args5?: FW.EventManagerArgs,
109
+ args6?: FW.EventManagerArgs,
110
+ args7?: FW.EventManagerArgs,
111
+ args8?: FW.EventManagerArgs,
112
+ args9?: FW.EventManagerArgs,
113
+ args10?: FW.EventManagerArgs,
114
+ ) {
115
+ const observers = this.listeners[eventName];
116
+ if (!observers) return;
117
+
118
+ let shouldStopPropagation = false;
119
+ const observersToRemove: FW.Observer[] = [];
120
+
121
+ const observersCopy = [...observers];
122
+
123
+ for (const observer of observersCopy) {
124
+ if (shouldStopPropagation) break;
125
+
126
+ if (observers.indexOf(observer) === -1) continue;
127
+
128
+ observer.notify(args1, args2, args3, args4, args5, args6, args7, args8, args9, args10);
129
+
130
+ if (observer.once) {
131
+ observersToRemove.push(observer);
132
+ }
133
+
134
+ if (observer.intercept) {
135
+ shouldStopPropagation = true;
136
+ }
137
+ }
138
+
139
+ if (observersToRemove.length > 0) {
140
+ this.removeObservers(eventName, observersToRemove);
141
+ }
142
+ }
143
+
144
+ /**
145
+ * 事件注册
146
+ * @param eventName 事件名
147
+ * @param cb 回调函数
148
+ * @param target 事件回调绑定目标
149
+ */
150
+ public register(
151
+ eventName: string | number,
152
+ cb: (
153
+ args1?: FW.EventManagerArgs,
154
+ args2?: FW.EventManagerArgs,
155
+ args3?: FW.EventManagerArgs,
156
+ args4?: FW.EventManagerArgs,
157
+ args5?: FW.EventManagerArgs,
158
+ args6?: FW.EventManagerArgs,
159
+ args7?: FW.EventManagerArgs,
160
+ args8?: FW.EventManagerArgs,
161
+ args9?: FW.EventManagerArgs,
162
+ args10?: FW.EventManagerArgs,
163
+ ) => void,
164
+ target: FW.TargetType,
165
+ options?: {
166
+ priority?: number;
167
+ intercept?: boolean;
168
+ once?: boolean;
169
+ },
170
+ ) {
171
+ const observers = this.listeners[eventName];
172
+ const define = FW.SystemDefine.FWPriorityOrder;
173
+ const priority = options?.priority === undefined ? define.NORMAL : options.priority;
174
+ const intercept = options?.intercept === undefined ? false : options.intercept;
175
+ const once = options?.once === undefined ? false : options.once;
176
+
177
+ const observer = new FWObserver(eventName, cb, target, priority, intercept, once);
178
+
179
+ if (!observers) {
180
+ this.listeners[eventName] = [];
181
+ }
182
+
183
+ const order = Object.values(define);
184
+ const insertIndex = this.listeners[eventName].findIndex(
185
+ (o) => order[o.priority] > order[priority],
186
+ );
187
+
188
+ if (insertIndex === -1) {
189
+ this.listeners[eventName].push(observer);
190
+ } else {
191
+ this.listeners[eventName].splice(insertIndex, 0, observer);
192
+ }
193
+ }
194
+
195
+ /**
196
+ * 注册一次性事件
197
+ * @param eventName 事件名
198
+ * @param cb 回调函数
199
+ * @param target 事件回调绑定目标
200
+ * @param options 选项
201
+ */
202
+ public registerOnce(
203
+ eventName: string | number,
204
+ cb: (
205
+ args1?: FW.EventManagerArgs,
206
+ args2?: FW.EventManagerArgs,
207
+ args3?: FW.EventManagerArgs,
208
+ args4?: FW.EventManagerArgs,
209
+ args5?: FW.EventManagerArgs,
210
+ args6?: FW.EventManagerArgs,
211
+ args7?: FW.EventManagerArgs,
212
+ args8?: FW.EventManagerArgs,
213
+ args9?: FW.EventManagerArgs,
214
+ args10?: FW.EventManagerArgs,
215
+ ) => void,
216
+ target: FW.TargetType,
217
+ options?: {
218
+ priority?: number;
219
+ intercept?: boolean;
220
+ },
221
+ ) {
222
+ this.register(eventName, cb, target, {
223
+ ...options,
224
+ once: true,
225
+ });
226
+ }
227
+
228
+ /**
229
+ * 注销事件
230
+ * @param eventName
231
+ * @param target
232
+ * @returns
233
+ */
234
+ public unRegister(eventName: string, target: Comment | Object) {
235
+ const observers = this.listeners[eventName];
236
+ if (!observers) return;
237
+ for (const observer of observers) {
238
+ if (observer.getEventName() === eventName && observer.compar(target)) {
239
+ observers.splice(observers.indexOf(observer), 1);
240
+ if (observers.length == 0) {
241
+ delete this.listeners[eventName];
242
+ }
243
+ }
244
+ }
245
+ }
246
+
247
+ /**
248
+ * 目标对象是否注册了指定事件
249
+ * @param eventName
250
+ * @param target
251
+ * @returns
252
+ */
253
+ has(eventName: string | number, target: Comment | Object): boolean {
254
+ const observers = this.listeners[eventName];
255
+ if (!observers) return false;
256
+ for (const observer of observers) {
257
+ if (observer.getEventName() === eventName && observer.compar(target)) {
258
+ return true;
259
+ }
260
+ }
261
+ return false;
262
+ }
263
+
264
+ /** 关闭事件 */
265
+ public eventOff(eventName: string | number) {
266
+ const observers = this.listeners[eventName];
267
+ if (!observers) return;
268
+ for (const observer of observers) {
269
+ if (observer.getEventName() === eventName) {
270
+ observers.splice(observers.indexOf(observer), 1);
271
+ if (observers.length == 0) {
272
+ delete this.listeners[eventName];
273
+ }
274
+ }
275
+ }
276
+ }
277
+
278
+ /**
279
+ * 注销对象身上所有事件
280
+ * @param target
281
+ */
282
+ public targetOff(target: FW.TargetType) {
283
+ Object.keys(this.listeners).forEach((eventName) => {
284
+ const observers = this.listeners[eventName];
285
+ for (const observer of observers) {
286
+ if (observer.compar(target)) {
287
+ observers.splice(observers.indexOf(observer), 1);
288
+ if (observers.length == 0) {
289
+ delete this.listeners[eventName];
290
+ }
291
+ }
292
+ }
293
+ });
294
+ }
295
+
296
+ /**
297
+ * 暂停所有已注册事件
298
+ * @param target
299
+ */
300
+ public targetPause(target: Comment | Object | Node) {
301
+ Object.keys(this.listeners).forEach((eventName) => {
302
+ const observers = this.listeners[eventName];
303
+ for (const observer of observers) {
304
+ if (observer.compar(target)) {
305
+ observer.pauseObserver();
306
+ }
307
+ }
308
+ });
309
+ }
310
+
311
+ /**
312
+ * 恢复所有已注册事件
313
+ * @param target
314
+ */
315
+ public targetResume(target: Comment | Object | Node) {
316
+ Object.keys(this.listeners).forEach((eventName) => {
317
+ const observers = this.listeners[eventName];
318
+ for (const observer of observers) {
319
+ if (observer.compar(target)) {
320
+ observer.resumeObserver();
321
+ }
322
+ }
323
+ });
324
+ }
325
+
326
+ /**
327
+ * 移除指定的观察者列表
328
+ * @param eventName 事件名
329
+ * @param observersToRemove 待移除的观察者列表
330
+ */
331
+ private removeObservers(eventName: string | number, observersToRemove: FW.Observer[]): void {
332
+ const observers = this.listeners[eventName];
333
+ if (!observers) return;
334
+
335
+ for (const observerToRemove of observersToRemove) {
336
+ const index = observers.indexOf(observerToRemove);
337
+ if (index !== -1) {
338
+ observers.splice(index, 1);
339
+ }
340
+ }
341
+
342
+ if (observers.length === 0) {
343
+ delete this.listeners[eventName];
344
+ }
345
+ }
346
+
347
+ /**
348
+ * 获取事件监听器数量
349
+ * @param eventName 事件名
350
+ * @returns 监听器数量
351
+ */
352
+ public getListenerCount(eventName: string | number): number {
353
+ const observers = this.listeners[eventName];
354
+ return observers ? observers.length : 0;
355
+ }
356
+
357
+ /** 销毁 */
358
+ public onDestroy(): void {
359
+ this.listeners = cc.js.createMap();
360
+ }
361
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "38cc4633-8a5d-4f6f-ab3e-33a8202c65ad",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
@@ -0,0 +1,344 @@
1
+ import { FWManager } from "./FWManager";
2
+
3
+ const TEMOTE_ASSET = "remote-asset";
4
+
5
+ export default class FWHotUpdateManager
6
+ extends FWManager
7
+ implements FW.HotUpdateManager
8
+ {
9
+ private listener: FW.HotUpdateListener;
10
+ private assetMgr: any;
11
+ private storePath: string;
12
+ private isUpdate: boolean;
13
+ private localManifest: cc.Asset;
14
+ private isRetry: boolean;
15
+ private currentVersion: string;
16
+ private newVersion: string;
17
+
18
+ setListener(listener: FW.HotUpdateListener): FW.HotUpdateManager {
19
+ this.listener = listener;
20
+ FW.Log.debug("热更新监听设置");
21
+ return this;
22
+ }
23
+
24
+ public update(localManifest: cc.Asset) {
25
+ if (!localManifest) {
26
+ FW.Log.error("没有找到本地Manifest文件!");
27
+ return;
28
+ }
29
+
30
+ const loadManifest = jsb.fileUtils.getStringFromFile(
31
+ localManifest.nativeUrl,
32
+ );
33
+ const manifestObject = JSON.parse(loadManifest);
34
+
35
+ FW.Log.debug("开始热更新流程:", manifestObject?.packageUrl);
36
+ this.localManifest = localManifest;
37
+ this.storePath = `${jsb.fileUtils ? jsb.fileUtils.getWritablePath() : "/"}${TEMOTE_ASSET}`;
38
+ this.assetMgr = new jsb.AssetsManager(
39
+ "",
40
+ this.storePath,
41
+ this.versionCompareHandle.bind(this),
42
+ );
43
+ this.assetMgr.setVerifyCallback(function (path: string, asset: any) {
44
+ const compressed = asset.compressed;
45
+ const expectedMD5 = asset.md5;
46
+ const relativePath = asset.path;
47
+ const size = asset.size;
48
+ if (compressed) {
49
+ return true;
50
+ } else {
51
+ return true;
52
+ }
53
+ });
54
+ this.checkHotUpdate();
55
+ }
56
+
57
+ private versionCompareHandle(
58
+ currentVersion: string,
59
+ newVersion: string,
60
+ ): number {
61
+ FW.Log.debug("版本比较", currentVersion, newVersion);
62
+ this.currentVersion = currentVersion;
63
+ this.newVersion = newVersion;
64
+ this.listener.versionCompareHandle(this.currentVersion, this.newVersion);
65
+ var vA = currentVersion.split(".");
66
+ var vB = newVersion.split(".");
67
+ for (var i = 0; i < vA.length; ++i) {
68
+ var a = parseInt(vA[i]);
69
+ var b = parseInt(vB[i] || "0");
70
+ if (a === b) {
71
+ continue;
72
+ } else {
73
+ return a - b;
74
+ }
75
+ }
76
+ if (vB.length > vA.length) {
77
+ return -1;
78
+ } else {
79
+ return 0;
80
+ }
81
+ }
82
+
83
+ private retry() {
84
+ if (!this.isUpdate && this.isRetry) {
85
+ this.isRetry = false;
86
+ this.assetMgr.downloadFailedAssets();
87
+ this.listener.retryHandle?.();
88
+ }
89
+ }
90
+
91
+ private checkHotUpdate() {
92
+ FW.Log.debug("checkHotUpdate1", this.isUpdate);
93
+ if (this.isUpdate) {
94
+ return;
95
+ }
96
+ if (this.assetMgr.getState() === jsb.AssetsManager.State.UNINITED) {
97
+ this.assetMgr.loadLocalManifest(this.localManifest.nativeUrl);
98
+ }
99
+
100
+ FW.Log.debug("checkHotUpdate3", this.assetMgr.getLocalManifest());
101
+
102
+ FW.Log.debug(
103
+ "checkHotUpdate4",
104
+ this.assetMgr.getLocalManifest().isLoaded(),
105
+ );
106
+
107
+ if (
108
+ !this.assetMgr.getLocalManifest() ||
109
+ !this.assetMgr.getLocalManifest().isLoaded()
110
+ ) {
111
+ FW.Log.debug("本地manifest未加载,尝试重新加载");
112
+ this.reloadLocalManifest();
113
+
114
+ // 如果仍然无法加载,则返回
115
+ if (
116
+ !this.assetMgr.getLocalManifest() ||
117
+ !this.assetMgr.getLocalManifest().isLoaded()
118
+ ) {
119
+ FW.Log.error("无法加载本地manifest文件");
120
+ return;
121
+ }
122
+ }
123
+
124
+ this.assetMgr.setEventCallback(this.checkEventHandle.bind(this));
125
+ this.assetMgr.checkUpdate();
126
+ this.isUpdate = true;
127
+ }
128
+
129
+ private reloadLocalManifest() {
130
+ try {
131
+ const updatedManifestPath = `${this.storePath}/project.manifest`;
132
+ if (jsb.fileUtils.isFileExist(updatedManifestPath)) {
133
+ this.assetMgr.loadLocalManifest(updatedManifestPath);
134
+
135
+ if (
136
+ this.assetMgr.getLocalManifest() &&
137
+ this.assetMgr.getLocalManifest().isLoaded()
138
+ ) {
139
+ FW.Log.debug("本地manifest重新加载成功");
140
+ this.localManifest = this.assetMgr.getLocalManifest();
141
+ } else {
142
+ FW.Log.error("本地manifest重新加载失败");
143
+ }
144
+ } else {
145
+ FW.Log.error("更新后的manifest文件不存在:", updatedManifestPath);
146
+ }
147
+ } catch (error) {
148
+ FW.Log.error("重新加载本地manifest时出错:", error);
149
+ }
150
+ }
151
+
152
+ private checkEventHandle(event: any) {
153
+ const code = event.getEventCode();
154
+ FW.Log.debug("checkEvent getEventCode -> ", code);
155
+ switch (code) {
156
+ case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
157
+ FW.Log.debug("checkEvent getEventCode -> ", "ERROR_NO_LOCAL_MANIFEST");
158
+ break;
159
+ case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
160
+ FW.Log.debug("checkEvent getEventCode -> ", "ERROR_DOWNLOAD_MANIFEST");
161
+ break;
162
+ case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
163
+ FW.Log.debug("checkEvent getEventCode -> ", "ERROR_PARSE_MANIFEST");
164
+ break;
165
+ case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
166
+ FW.Log.debug("checkEvent getEventCode -> ", "ALREADY_UP_TO_DATE");
167
+ break;
168
+ case jsb.EventAssetsManager.NEW_VERSION_FOUND:
169
+ FW.Log.debug("checkEvent getEventCode -> ", "NEW_VERSION_FOUND");
170
+ break;
171
+ default:
172
+ return;
173
+ }
174
+
175
+ this.listener.checkHotUpdateHandle?.(code);
176
+ this.assetMgr.setEventCallback(null!);
177
+ this.isUpdate = false;
178
+ FW.Log.debug(
179
+ "isFind New Version -> ",
180
+ event.getEventCode() == jsb.EventAssetsManager.NEW_VERSION_FOUND,
181
+ );
182
+ if (event.getEventCode() == jsb.EventAssetsManager.NEW_VERSION_FOUND) {
183
+ this.hotUpdate();
184
+ }
185
+ }
186
+
187
+ private hotUpdate() {
188
+ FW.Log.debug("start hotUpdate ->", this.assetMgr, this.isUpdate);
189
+ if (this.assetMgr && !this.isUpdate) {
190
+ this.assetMgr.setEventCallback(this.updateEventHandle.bind(this));
191
+ FW.Log.debug(
192
+ "assetMgr state ->",
193
+ this.assetMgr.getState() === jsb.AssetsManager.State.UNINITED,
194
+ );
195
+ if (this.assetMgr.getState() === jsb.AssetsManager.State.UNINITED) {
196
+ this.assetMgr.loadLocalManifest(this.localManifest.nativeUrl);
197
+ }
198
+ this.isUpdate = true;
199
+ this.assetMgr.update();
200
+ }
201
+ }
202
+
203
+ private updateEventHandle(event: any) {
204
+ let needRestart = false;
205
+ let failed = false;
206
+ let percent: number = 0;
207
+ let downloadedFiles: number = 0;
208
+ let totalFiles: number = 0;
209
+ let downloadedBytes: number = 0;
210
+ let totalBytes: number = 0;
211
+ let convertDownloadedBytes: string = "";
212
+ let convertTotalBytes: string = "";
213
+ const code = event.getEventCode();
214
+ const msg = event.getMessage();
215
+ FW.Log.debug("updateEvent getEventCode -> ", code);
216
+ let str = "";
217
+ switch (code) {
218
+ case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
219
+ failed = true;
220
+ str = "ERROR_NO_LOCAL_MANIFEST";
221
+ break;
222
+ case jsb.EventAssetsManager.UPDATE_PROGRESSION:
223
+ str = "UPDATE_PROGRESSION";
224
+ FW.Log.debug("updateEvent percent -> ", event.getPercent());
225
+ if (event.getPercent() > 0) {
226
+ downloadedFiles = event.getDownloadedFiles();
227
+ totalFiles = event.getTotalFiles();
228
+ downloadedBytes = event.getDownloadedBytes();
229
+ totalBytes = event.getTotalBytes();
230
+ convertDownloadedBytes = this.convertBytes(downloadedBytes);
231
+ convertTotalBytes = this.convertBytes(totalBytes);
232
+ percent = event.getPercent();
233
+ FW.Log.debug(
234
+ "正在更新中 -> ",
235
+ "下载文件数量:",
236
+ downloadedFiles,
237
+ ",下载文件总数量:",
238
+ totalFiles,
239
+ ",已下载大小:",
240
+ convertDownloadedBytes,
241
+ ",下载总大小:",
242
+ convertTotalBytes,
243
+ );
244
+ }
245
+ break;
246
+ case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
247
+ str = "ERROR_DOWNLOAD_MANIFEST";
248
+ break;
249
+ case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
250
+ str = "ERROR_PARSE_MANIFEST";
251
+ failed = true;
252
+ break;
253
+ case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
254
+ str = "ALREADY_UP_TO_DATE";
255
+ failed = true;
256
+ break;
257
+ case jsb.EventAssetsManager.UPDATE_FINISHED:
258
+ if (event.getPercent() > 0) {
259
+ downloadedFiles = event.getDownloadedFiles();
260
+ totalFiles = event.getTotalFiles();
261
+ downloadedBytes = event.getDownloadedBytes();
262
+ totalBytes = event.getTotalBytes();
263
+ convertDownloadedBytes = this.convertBytes(downloadedBytes);
264
+ convertTotalBytes = this.convertBytes(totalBytes);
265
+ percent = event.getPercent();
266
+ FW.Log.debug(
267
+ "正在更新完成 -> ",
268
+ "下载文件数量:",
269
+ downloadedFiles,
270
+ ",下载文件总数量:",
271
+ totalFiles,
272
+ ",已下载大小:",
273
+ convertDownloadedBytes,
274
+ ",下载总大小:",
275
+ convertTotalBytes,
276
+ );
277
+ }
278
+ str = "UPDATE_FINISHED";
279
+ needRestart = true;
280
+ break;
281
+ case jsb.EventAssetsManager.UPDATE_FAILED:
282
+ str = "UPDATE_FAILED";
283
+ this.isUpdate = false;
284
+ this.isRetry = true;
285
+ break;
286
+ case jsb.EventAssetsManager.ERROR_UPDATING:
287
+ str = "ERROR_UPDATING";
288
+ break;
289
+ case jsb.EventAssetsManager.ERROR_DECOMPRESS:
290
+ str = "ERROR_DECOMPRESS";
291
+ break;
292
+ default:
293
+ break;
294
+ }
295
+
296
+ FW.Log.debug("热更新中->", str);
297
+ FW.Log.debug("热更新msg ->", msg);
298
+ this.listener.hotUpdatingHandle?.(code, {
299
+ percent: percent,
300
+ downloadedFiles: downloadedFiles,
301
+ totalFiles: totalFiles,
302
+ downloadedBytes: downloadedBytes,
303
+ totalBytes: totalBytes,
304
+ convertDownloadedBytes: convertDownloadedBytes,
305
+ convertTotalBytes: convertTotalBytes,
306
+ });
307
+ if (failed) {
308
+ FW.Log.debug("热更新中结果 failed -> ", failed);
309
+ FW.Log.debug("下载失败");
310
+ this.assetMgr.setEventCallback(null!);
311
+ this.isUpdate = false;
312
+ this.retry();
313
+ }
314
+ if (needRestart) {
315
+ FW.Log.debug("热更新中结果 needRestart -> ", needRestart);
316
+ FW.Log.debug("下载完成");
317
+ const searchPaths = jsb.fileUtils.getSearchPaths();
318
+ const newPaths = this.assetMgr.getLocalManifest().getSearchPaths();
319
+ Array.prototype.unshift.apply(searchPaths, newPaths);
320
+ jsb.fileUtils.setSearchPaths(searchPaths);
321
+ this.isRetry = false;
322
+ this.isUpdate = false;
323
+
324
+ this.reloadLocalManifest();
325
+
326
+ this.assetMgr.setEventCallback(null!);
327
+ this.listener.completedHandle?.(this.newVersion);
328
+ }
329
+ }
330
+
331
+ private convertBytes(bytes: number) {
332
+ const units = ["B", "KB", "MB", "GB"];
333
+ let size = bytes,
334
+ unitIndex = 0;
335
+ while (size >= 1024 && unitIndex < units.length - 1) {
336
+ size /= 1024;
337
+ unitIndex++;
338
+ }
339
+ return `${size.toFixed(size < 10 ? 2 : 1)} ${units[unitIndex]}`;
340
+ }
341
+
342
+ public initialize(): void {}
343
+ public onDestroy(): void {}
344
+ }