@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.
- package/Framework.ts +337 -0
- package/Framework.ts.meta +10 -0
- package/FrameworkBase.ts +207 -0
- package/FrameworkBase.ts.meta +10 -0
- package/FrameworkInitialize.ts +79 -0
- package/FrameworkInitialize.ts.meta +10 -0
- package/README.md +93 -0
- package/README.md.meta +6 -0
- package/animation/FWAnimation.ts +13 -0
- package/animation/FWAnimation.ts.meta +10 -0
- package/animation/FWSkeleton.ts +174 -0
- package/animation/FWSkeleton.ts.meta +10 -0
- package/animation/FWTween.ts +60 -0
- package/animation/FWTween.ts.meta +10 -0
- package/animation.meta +13 -0
- package/component/FWVirtuaScrollViewComponent.ts +56 -0
- package/component/FWVirtuaScrollViewComponent.ts.meta +10 -0
- package/component/FWVirtualViewComponent.ts +2212 -0
- package/component/FWVirtualViewComponent.ts.meta +10 -0
- package/component.meta +13 -0
- package/config/FWAssetConfig.ts +7 -0
- package/config/FWAssetConfig.ts.meta +10 -0
- package/config/FWSystemConfig.ts +29 -0
- package/config/FWSystemConfig.ts.meta +10 -0
- package/config.meta +13 -0
- package/controller/FWLayerController.ts +178 -0
- package/controller/FWLayerController.ts.meta +10 -0
- package/controller.meta +13 -0
- package/data/FWData.ts +6 -0
- package/data/FWData.ts.meta +10 -0
- package/data.meta +13 -0
- package/define/FWEventDefine.ts +28 -0
- package/define/FWEventDefine.ts.meta +10 -0
- package/define/FWSystemDefine.ts +154 -0
- package/define/FWSystemDefine.ts.meta +10 -0
- package/define.meta +13 -0
- package/entry/FWEntry.ts +219 -0
- package/entry/FWEntry.ts.meta +10 -0
- package/entry.meta +13 -0
- package/expand/FWCocosExpand.ts +73 -0
- package/expand/FWCocosExpand.ts.meta +10 -0
- package/expand/FWDecorator.ts +366 -0
- package/expand/FWDecorator.ts.meta +10 -0
- package/expand/FWNodeExpand.ts +147 -0
- package/expand/FWNodeExpand.ts.meta +10 -0
- package/expand/FWRollingViewNesting.ts +195 -0
- package/expand/FWRollingViewNesting.ts.meta +10 -0
- package/expand/FWTweenExpand.ts +44 -0
- package/expand/FWTweenExpand.ts.meta +10 -0
- package/expand.meta +13 -0
- package/item/FWVirtualListItem.ts +141 -0
- package/item/FWVirtualListItem.ts.meta +10 -0
- package/item.meta +13 -0
- package/language/FWLanguage.ts +71 -0
- package/language/FWLanguage.ts.meta +10 -0
- package/language/FWLanguageLabelLocalize.ts +144 -0
- package/language/FWLanguageLabelLocalize.ts.meta +10 -0
- package/language/FWLanguageSkeletonLocalize.ts +106 -0
- package/language/FWLanguageSkeletonLocalize.ts.meta +10 -0
- package/language/FWLanguageSpriteLocalize.ts +81 -0
- package/language/FWLanguageSpriteLocalize.ts.meta +10 -0
- package/language.meta +13 -0
- package/layer/FWLayer.ts +14 -0
- package/layer/FWLayer.ts.meta +10 -0
- package/layer.meta +13 -0
- package/log/FWLog.ts +135 -0
- package/log/FWLog.ts.meta +10 -0
- package/log.meta +13 -0
- package/logic/FWLogic.ts +6 -0
- package/logic/FWLogic.ts.meta +10 -0
- package/logic.meta +13 -0
- package/machine/FWAnimationMachine.ts +28 -0
- package/machine/FWAnimationMachine.ts.meta +10 -0
- package/machine/FWStateMachine.ts +74 -0
- package/machine/FWStateMachine.ts.meta +10 -0
- package/machine.meta +13 -0
- package/manager/FWAnimationManager.ts +89 -0
- package/manager/FWAnimationManager.ts.meta +10 -0
- package/manager/FWAssetManager.ts +451 -0
- package/manager/FWAssetManager.ts.meta +10 -0
- package/manager/FWAudioManager.ts +339 -0
- package/manager/FWAudioManager.ts.meta +10 -0
- package/manager/FWBundleManager.ts +97 -0
- package/manager/FWBundleManager.ts.meta +10 -0
- package/manager/FWComponentManager.ts +24 -0
- package/manager/FWComponentManager.ts.meta +10 -0
- package/manager/FWEngineManager.ts +74 -0
- package/manager/FWEngineManager.ts.meta +10 -0
- package/manager/FWEventManager.ts +361 -0
- package/manager/FWEventManager.ts.meta +10 -0
- package/manager/FWHotUpdateManager.ts +344 -0
- package/manager/FWHotUpdateManager.ts.meta +10 -0
- package/manager/FWLanguageManager.ts +114 -0
- package/manager/FWLanguageManager.ts.meta +10 -0
- package/manager/FWLayerManager.ts +862 -0
- package/manager/FWLayerManager.ts.meta +10 -0
- package/manager/FWManager.ts +9 -0
- package/manager/FWManager.ts.meta +10 -0
- package/manager/FWObjectManager.ts +161 -0
- package/manager/FWObjectManager.ts.meta +10 -0
- package/manager/FWPerformanceManager.ts +198 -0
- package/manager/FWPerformanceManager.ts.meta +10 -0
- package/manager/FWPromiseManager.ts +504 -0
- package/manager/FWPromiseManager.ts.meta +10 -0
- package/manager/FWResManager.ts +299 -0
- package/manager/FWResManager.ts.meta +10 -0
- package/manager/FWSocketManager.ts +93 -0
- package/manager/FWSocketManager.ts.meta +10 -0
- package/manager/FWStateManager.ts +100 -0
- package/manager/FWStateManager.ts.meta +10 -0
- package/manager/FWTaskManager.ts +41 -0
- package/manager/FWTaskManager.ts.meta +10 -0
- package/manager/FWTimeManager.ts +442 -0
- package/manager/FWTimeManager.ts.meta +10 -0
- package/manager/FWUiManager.ts +217 -0
- package/manager/FWUiManager.ts.meta +10 -0
- package/manager.meta +13 -0
- package/package.json +11 -0
- package/package.json.meta +6 -0
- package/registry/FWRegistry.ts +62 -0
- package/registry/FWRegistry.ts.meta +10 -0
- package/registry.meta +13 -0
- package/render/FWRenderAssembler.ts +620 -0
- package/render/FWRenderAssembler.ts.meta +10 -0
- package/render.meta +13 -0
- package/scene/FWScene.ts +23 -0
- package/scene/FWScene.ts.meta +10 -0
- package/scene.meta +13 -0
- package/service/FWService.ts +11 -0
- package/service/FWService.ts.meta +10 -0
- package/service/http/FWHttp.ts +103 -0
- package/service/http/FWHttp.ts.meta +10 -0
- package/service/http.meta +13 -0
- package/service/socket/FWSocket.ts +367 -0
- package/service/socket/FWSocket.ts.meta +10 -0
- package/service/socket/FWSocketHandle.ts +16 -0
- package/service/socket/FWSocketHandle.ts.meta +10 -0
- package/service/socket/FWSocketSender.ts +14 -0
- package/service/socket/FWSocketSender.ts.meta +10 -0
- package/service/socket/mock/FWSocketMock.ts +202 -0
- package/service/socket/mock/FWSocketMock.ts.meta +10 -0
- package/service/socket/mock.meta +13 -0
- package/service/socket.meta +13 -0
- package/service.meta +13 -0
- package/state/FWState.ts +8 -0
- package/state/FWState.ts.meta +10 -0
- package/state.meta +13 -0
- package/types/Creator.d.ts +121 -0
- package/types/Creator.d.ts.meta +6 -0
- package/types/FW.d.ts +3016 -0
- package/types/FW.d.ts.meta +6 -0
- package/types/Global.d.ts +22 -0
- package/types/Global.d.ts.meta +10 -0
- package/types.meta +13 -0
- package/utils/FWLodash.ts +105 -0
- package/utils/FWLodash.ts.meta +10 -0
- package/utils/FWMask.ts +222 -0
- package/utils/FWMask.ts.meta +10 -0
- package/utils/FWObject.ts +27 -0
- package/utils/FWObject.ts.meta +10 -0
- package/utils/FWObjectPool.ts +177 -0
- package/utils/FWObjectPool.ts.meta +10 -0
- package/utils/FWQueue.ts +55 -0
- package/utils/FWQueue.ts.meta +10 -0
- package/utils/FWResLoader.ts +139 -0
- package/utils/FWResLoader.ts.meta +10 -0
- package/utils/FWTask.ts +227 -0
- package/utils/FWTask.ts.meta +10 -0
- package/utils/FWUtils.ts +15 -0
- package/utils/FWUtils.ts.meta +10 -0
- package/utils.meta +13 -0
package/Framework.ts
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { Container, interfaces } from "inversify";
|
|
3
|
+
|
|
4
|
+
export class Framework implements FW.Framework {
|
|
5
|
+
private container: Container;
|
|
6
|
+
private registry: Map<string, new () => FW.Registry>;
|
|
7
|
+
private registeredComponents: Map<string, FW.RegisterFramework[]> = new Map();
|
|
8
|
+
|
|
9
|
+
initialize() {
|
|
10
|
+
this.container = new Container({
|
|
11
|
+
defaultScope: "Singleton",
|
|
12
|
+
autoBindInjectable: true,
|
|
13
|
+
});
|
|
14
|
+
this.registry = new Map<string, new () => FW.Registry>();
|
|
15
|
+
this.registeredComponents.clear();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public getContainer(): Container {
|
|
19
|
+
return this.container;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** 获取组件 */
|
|
23
|
+
public getComponent<T>(serviceIdentifier: FW.ServiceIdentifier<T>): T {
|
|
24
|
+
if (typeof serviceIdentifier === "string") {
|
|
25
|
+
if (this.container.isBound(serviceIdentifier)) {
|
|
26
|
+
return this.container.get<T>(serviceIdentifier);
|
|
27
|
+
}
|
|
28
|
+
} else if (typeof serviceIdentifier === "function") {
|
|
29
|
+
const className = serviceIdentifier?.name;
|
|
30
|
+
|
|
31
|
+
if (this.container.isBound(serviceIdentifier)) {
|
|
32
|
+
return this.container.get<T>(serviceIdentifier);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const suffixMap = {
|
|
36
|
+
Logic: FW.SystemDefine.FWBindTag.LOGIC,
|
|
37
|
+
Data: FW.SystemDefine.FWBindTag.DATA,
|
|
38
|
+
Config: FW.SystemDefine.FWBindTag.CONFIG,
|
|
39
|
+
Sender: FW.SystemDefine.FWBindTag.SENDER,
|
|
40
|
+
Handle: FW.SystemDefine.FWBindTag.HANDLE,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const [suffix] =
|
|
44
|
+
Object.entries(suffixMap).find(([key]) => className.endsWith(key)) ||
|
|
45
|
+
[];
|
|
46
|
+
|
|
47
|
+
if (suffix) {
|
|
48
|
+
const bundleName = FW.Entry.bundleName;
|
|
49
|
+
const tag = suffixMap[suffix as keyof typeof suffixMap];
|
|
50
|
+
const bindingKey = this.getKey(bundleName, tag);
|
|
51
|
+
if (this.container.isBound(bindingKey)) {
|
|
52
|
+
return this.container.get<T>(bindingKey);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return this.getComponents(serviceIdentifier)[0];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** 获取所有组件 */
|
|
60
|
+
public getComponents<T>(serviceIdentifier: FW.ServiceIdentifier<T>): T[] {
|
|
61
|
+
const instances: T[] = [];
|
|
62
|
+
|
|
63
|
+
if (typeof serviceIdentifier === "string") {
|
|
64
|
+
if (this.container.isBound(serviceIdentifier)) {
|
|
65
|
+
instances.push(this.container.get<T>(serviceIdentifier));
|
|
66
|
+
}
|
|
67
|
+
return instances;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (typeof serviceIdentifier === "function") {
|
|
71
|
+
for (const registrations of this.registeredComponents.values()) {
|
|
72
|
+
for (const data of registrations) {
|
|
73
|
+
const classes = [
|
|
74
|
+
data.logic,
|
|
75
|
+
data.data,
|
|
76
|
+
data.config,
|
|
77
|
+
data.sender,
|
|
78
|
+
data.handle,
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
for (const cls of classes) {
|
|
82
|
+
if (!cls) continue;
|
|
83
|
+
|
|
84
|
+
if (!this.isSubclassOf(cls, serviceIdentifier)) continue;
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
const instance = this.getComponent<T>(cls as any);
|
|
88
|
+
if (instance && !instances.includes(instance)) {
|
|
89
|
+
instances.push(instance);
|
|
90
|
+
}
|
|
91
|
+
} catch (e) {
|
|
92
|
+
FW.Log.warn(
|
|
93
|
+
`Error getting component instance for ${cls.name}:`,
|
|
94
|
+
e,
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return instances;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 是否已经注册注册表
|
|
107
|
+
* @param bundleName
|
|
108
|
+
* @returns
|
|
109
|
+
*/
|
|
110
|
+
hasRegistry(bundleName: string) {
|
|
111
|
+
return this.registry.has(bundleName);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* 添加进注册表
|
|
116
|
+
* @param bundleName
|
|
117
|
+
* @param registry
|
|
118
|
+
*/
|
|
119
|
+
addRegistry(bundleName: string, registry: new () => FW.Registry) {
|
|
120
|
+
this.registry.set(bundleName, registry);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* 获取注册表
|
|
125
|
+
* @param bundleName
|
|
126
|
+
*/
|
|
127
|
+
getRegistry(bundleName: string): FW.Registry {
|
|
128
|
+
if (this.registry.has(bundleName)) {
|
|
129
|
+
return this.container.get(this.registry.get(bundleName));
|
|
130
|
+
}
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* 创建注册表实例
|
|
136
|
+
*/
|
|
137
|
+
createRegistry(bundleName: string): FW.Registry {
|
|
138
|
+
if (!this.registry.has(bundleName)) return;
|
|
139
|
+
this.container
|
|
140
|
+
.bind(this.registry.get(bundleName))
|
|
141
|
+
.toSelf()
|
|
142
|
+
.inSingletonScope();
|
|
143
|
+
return this.getRegistry(bundleName);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* 销毁注册表实例
|
|
148
|
+
* @param bundleName
|
|
149
|
+
*/
|
|
150
|
+
destroyRegistry(bundleName: string) {
|
|
151
|
+
if (!this.registry.has(bundleName)) return;
|
|
152
|
+
this.container.unbind(this.registry.get(bundleName));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 注册数据
|
|
157
|
+
* @param data
|
|
158
|
+
*/
|
|
159
|
+
register(data: FW.RegisterFramework) {
|
|
160
|
+
const classes = [
|
|
161
|
+
data.logic,
|
|
162
|
+
data.data,
|
|
163
|
+
data.config,
|
|
164
|
+
data.sender,
|
|
165
|
+
data.handle,
|
|
166
|
+
];
|
|
167
|
+
classes.forEach((cls, index) => {
|
|
168
|
+
if (cls && !this.container.isBound(cls)) {
|
|
169
|
+
this.container.bind(cls).toSelf().inSingletonScope();
|
|
170
|
+
this.container.bind(this.getKey(data.bundleName, index)).toService(cls);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
this.recordRegistration(data);
|
|
175
|
+
|
|
176
|
+
classes.forEach((cls) => {
|
|
177
|
+
if (cls && this.container.isBound(cls)) {
|
|
178
|
+
try {
|
|
179
|
+
const instance = this.container.get(cls) as FW.FrameworkBase;
|
|
180
|
+
instance?.initializeDependencies?.();
|
|
181
|
+
} catch (error) {
|
|
182
|
+
FW.Log.warn(
|
|
183
|
+
`Error initializing dependencies for ${cls.name}:`,
|
|
184
|
+
error,
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* 注销数据
|
|
193
|
+
* @param data
|
|
194
|
+
* @returns
|
|
195
|
+
*/
|
|
196
|
+
unRegister(data: FW.RegisterFramework) {
|
|
197
|
+
const classes = [
|
|
198
|
+
data.logic,
|
|
199
|
+
data.data,
|
|
200
|
+
data.config,
|
|
201
|
+
data.sender,
|
|
202
|
+
data.handle,
|
|
203
|
+
];
|
|
204
|
+
classes.forEach((cls, index) => {
|
|
205
|
+
const key = this.getKey(data.bundleName, index);
|
|
206
|
+
if (cls && this.container.isBound(cls)) {
|
|
207
|
+
this.container.get(key)?.["onDestroy"]?.();
|
|
208
|
+
this.container.unbind(cls);
|
|
209
|
+
}
|
|
210
|
+
if (this.container.isBound(key)) {
|
|
211
|
+
this.container.get(key)?.["onDestroy"]?.();
|
|
212
|
+
this.container.unbind(this.getKey(data.bundleName, index));
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
this.removeRegistration(data);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* 获取注册表
|
|
219
|
+
* @param bundleName
|
|
220
|
+
* @param tag
|
|
221
|
+
* @returns
|
|
222
|
+
*/
|
|
223
|
+
private recordRegistration(data: FW.RegisterFramework) {
|
|
224
|
+
const bundleName = data.bundleName;
|
|
225
|
+
if (!this.registeredComponents.has(bundleName)) {
|
|
226
|
+
this.registeredComponents.set(bundleName, []);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const registrations = this.registeredComponents.get(bundleName)!;
|
|
230
|
+
|
|
231
|
+
if (!registrations) return;
|
|
232
|
+
|
|
233
|
+
const exists = registrations.some(
|
|
234
|
+
(reg) =>
|
|
235
|
+
reg.logic === data.logic &&
|
|
236
|
+
reg.data === data.data &&
|
|
237
|
+
reg.config === data.config &&
|
|
238
|
+
reg.sender === data.sender &&
|
|
239
|
+
reg.handle === data.handle,
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
if (!exists) {
|
|
243
|
+
registrations.push({ ...data });
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
private removeRegistration(data: FW.RegisterFramework) {
|
|
248
|
+
const bundleName = data.bundleName;
|
|
249
|
+
if (this.registeredComponents.has(bundleName)) {
|
|
250
|
+
const registrations = this.registeredComponents.get(bundleName)!;
|
|
251
|
+
const index = registrations.findIndex(
|
|
252
|
+
(reg) =>
|
|
253
|
+
reg.logic === data.logic &&
|
|
254
|
+
reg.data === data.data &&
|
|
255
|
+
reg.config === data.config &&
|
|
256
|
+
reg.sender === data.sender &&
|
|
257
|
+
reg.handle === data.handle,
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
if (index !== -1) {
|
|
261
|
+
registrations.splice(index, 1);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (registrations.length === 0) {
|
|
265
|
+
this.registeredComponents.delete(bundleName);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
public restart(): void {
|
|
271
|
+
this.destroyAllComponents();
|
|
272
|
+
this.container.unbindAll();
|
|
273
|
+
this.container = new Container({
|
|
274
|
+
defaultScope: "Singleton",
|
|
275
|
+
autoBindInjectable: true,
|
|
276
|
+
});
|
|
277
|
+
this.reregisterAllComponents();
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
private destroyAllComponents(): void {
|
|
281
|
+
const binder = (this.container as any)._bindingDictionary;
|
|
282
|
+
const map = binder._map;
|
|
283
|
+
|
|
284
|
+
for (const [key, bindings] of map.entries()) {
|
|
285
|
+
for (const binding of bindings) {
|
|
286
|
+
try {
|
|
287
|
+
if (this.container.isBound(binding.serviceIdentifier)) {
|
|
288
|
+
const instance = this.container.get(binding.serviceIdentifier);
|
|
289
|
+
instance?.["onDestroy"]?.();
|
|
290
|
+
}
|
|
291
|
+
} catch (e) {
|
|
292
|
+
FW.Log.warn(`Error destroying component ${key}:`, e);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
private reregisterAllComponents(): void {
|
|
299
|
+
for (const [
|
|
300
|
+
bundleName,
|
|
301
|
+
registrations,
|
|
302
|
+
] of this.registeredComponents.entries()) {
|
|
303
|
+
for (const data of registrations) {
|
|
304
|
+
try {
|
|
305
|
+
this.register(data);
|
|
306
|
+
} catch (e) {
|
|
307
|
+
console.error(
|
|
308
|
+
`Error re-registering component for bundle ${bundleName}:`,
|
|
309
|
+
e,
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
public getRegisteredComponents(): Map<string, FW.RegisterFramework[]> {
|
|
317
|
+
return new Map(this.registeredComponents);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
private getKey(bundleName: string, tag: FW.SystemDefine.FWBindTag) {
|
|
321
|
+
return `${bundleName}${tag}`;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
private isSubclassOf(child: any, parent: any): boolean {
|
|
325
|
+
if (typeof child !== "function" || typeof parent !== "function") {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
let current = child;
|
|
329
|
+
while (current) {
|
|
330
|
+
if (current === parent) {
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
current = Object.getPrototypeOf(current);
|
|
334
|
+
}
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
}
|
package/FrameworkBase.ts
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { injectable } from "inversify";
|
|
2
|
+
|
|
3
|
+
@injectable()
|
|
4
|
+
export abstract class FrameworkBase {
|
|
5
|
+
public _logic?: FW.Logic;
|
|
6
|
+
public data?: FW.Data;
|
|
7
|
+
public config?: FW.AssetConfig;
|
|
8
|
+
public sender?: FW.Sender;
|
|
9
|
+
public handle?: FW.Handle;
|
|
10
|
+
private dependenciesInjected: boolean = false;
|
|
11
|
+
private isInitialized: boolean = false;
|
|
12
|
+
protected abstract initialize?(): void;
|
|
13
|
+
protected abstract onDestroy?(): void;
|
|
14
|
+
protected onRestart?(): void;
|
|
15
|
+
get entry() {
|
|
16
|
+
return FW.Entry;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
get logic() {
|
|
20
|
+
return this._logic;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
set logic(value: FW.Logic) {
|
|
24
|
+
this._logic = value;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
constructor() {
|
|
28
|
+
this.initialize?.();
|
|
29
|
+
this.entry.evtMgr.register(
|
|
30
|
+
FW.EventDefine.SystemEvent.SYSTEM_RESTART,
|
|
31
|
+
this.onRestart,
|
|
32
|
+
this,
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
protected get moduleName(): string {
|
|
37
|
+
return cc.js.getClassName(this);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public getLogic<T extends FW.Logic = FW.Logic>() {
|
|
41
|
+
return this.logic as T;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public getData<T extends FW.Data = FW.Data>() {
|
|
45
|
+
return this.data as T;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public getSender<T extends FW.Sender>() {
|
|
49
|
+
return this.sender as T;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public getHandle<T extends FW.Handle>() {
|
|
53
|
+
return this.handle as T;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public getConfig<T extends FW.AssetConfig>() {
|
|
57
|
+
return this.config as T;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public initializeDependencies(): void {
|
|
61
|
+
if (this.dependenciesInjected || this.isInitialized) return;
|
|
62
|
+
|
|
63
|
+
const bundleName = this.findBundleNameByClassName();
|
|
64
|
+
if (!bundleName) {
|
|
65
|
+
if (FW.Entry?.engineMgr?.debug) {
|
|
66
|
+
FW.Log.warn(
|
|
67
|
+
`[FrameworkBase] 未能根据类名 "${this.moduleName}" 推断出 bundleName,跳过依赖注入`,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const tag = this.getClassTag();
|
|
74
|
+
if (tag === undefined) {
|
|
75
|
+
if (FW.Entry?.engineMgr?.debug) {
|
|
76
|
+
FW.Log.warn(
|
|
77
|
+
`[FrameworkBase] 未能根据类名 "${this.moduleName}" 推断出绑定类型(Logic/Data/Config/Sender/Handle),跳过依赖注入`,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// 只有在 bundleName / tag 均解析成功时,才标记为已初始化,避免无效的“锁死”状态
|
|
84
|
+
this.dependenciesInjected = true;
|
|
85
|
+
this.isInitialized = true;
|
|
86
|
+
|
|
87
|
+
if (tag !== FW.SystemDefine.FWBindTag.LOGIC) {
|
|
88
|
+
this.logic = FW.Entry.getComponent<FW.Logic>(
|
|
89
|
+
`${bundleName}${FW.SystemDefine.FWBindTag.LOGIC}`,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (tag !== FW.SystemDefine.FWBindTag.DATA) {
|
|
94
|
+
this.data = FW.Entry.getComponent<FW.Data>(
|
|
95
|
+
`${bundleName}${FW.SystemDefine.FWBindTag.DATA}`,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (tag !== FW.SystemDefine.FWBindTag.CONFIG) {
|
|
100
|
+
this.config = FW.Entry.getComponent<FW.AssetConfig>(
|
|
101
|
+
`${bundleName}${FW.SystemDefine.FWBindTag.CONFIG}`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (tag !== FW.SystemDefine.FWBindTag.SENDER) {
|
|
106
|
+
this.sender = FW.Entry.getComponent<FW.Sender>(
|
|
107
|
+
`${bundleName}${FW.SystemDefine.FWBindTag.SENDER}`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (tag !== FW.SystemDefine.FWBindTag.HANDLE) {
|
|
112
|
+
this.handle = FW.Entry.getComponent<FW.Handle>(
|
|
113
|
+
`${bundleName}${FW.SystemDefine.FWBindTag.HANDLE}`,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
protected async invoke<T>(
|
|
119
|
+
operation: Promise<T>,
|
|
120
|
+
operationName: string = "unknown",
|
|
121
|
+
): Promise<T> {
|
|
122
|
+
const startTime = this.getCurrentTime();
|
|
123
|
+
|
|
124
|
+
try {
|
|
125
|
+
const result = await operation;
|
|
126
|
+
const duration = this.getCurrentTime() - startTime;
|
|
127
|
+
this.recordPerformanceMetric(operationName, duration);
|
|
128
|
+
return result;
|
|
129
|
+
} catch (error) {
|
|
130
|
+
this.handleError(operationName, error);
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
private recordPerformanceMetric(
|
|
136
|
+
operationName: string,
|
|
137
|
+
duration: number,
|
|
138
|
+
): void {
|
|
139
|
+
if (FW.Entry.performanceMgr) {
|
|
140
|
+
FW.Entry.performanceMgr.recordOperationMetric(
|
|
141
|
+
this.moduleName,
|
|
142
|
+
operationName,
|
|
143
|
+
duration,
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const shouldWarn = duration > 1000;
|
|
148
|
+
|
|
149
|
+
if (FW.Entry.engineMgr.debug || shouldWarn) {
|
|
150
|
+
const log = shouldWarn ? FW.Log.warn : FW.Log.debug;
|
|
151
|
+
log(
|
|
152
|
+
`[${this.moduleName?.toUpperCase()}] Operation ${operationName} took ${duration}ms`,
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
protected handleError(operation: string, error: any): void {
|
|
158
|
+
const errorInfo = {
|
|
159
|
+
type: this.moduleName,
|
|
160
|
+
operation,
|
|
161
|
+
error: error?.message || error,
|
|
162
|
+
stack: error?.stack,
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
FW.Log.error(`Error in ${this.moduleName}.${operation}:`, errorInfo);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
protected getCurrentTime(): number {
|
|
169
|
+
return Date.now();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private findBundleNameByClassName(): string | undefined {
|
|
173
|
+
const registeredComponents = FW.Framework.getRegisteredComponents();
|
|
174
|
+
|
|
175
|
+
const bundleNames = Array.from(registeredComponents.keys());
|
|
176
|
+
|
|
177
|
+
for (const bundleName of bundleNames) {
|
|
178
|
+
if (this.doesClassNameContainBundleName(this.moduleName, bundleName)) {
|
|
179
|
+
return bundleName;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
private doesClassNameContainBundleName(
|
|
187
|
+
className: string,
|
|
188
|
+
bundleName: string,
|
|
189
|
+
): boolean {
|
|
190
|
+
const bundleNameLower = bundleName.toLowerCase();
|
|
191
|
+
const classNameLower = className.toLowerCase();
|
|
192
|
+
return classNameLower.includes(bundleNameLower);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private getClassTag(): FW.SystemDefine.FWBindTag {
|
|
196
|
+
const className = this.moduleName;
|
|
197
|
+
if (className.endsWith("Logic")) return FW.SystemDefine.FWBindTag.LOGIC;
|
|
198
|
+
if (className.endsWith("Data")) return FW.SystemDefine.FWBindTag.DATA;
|
|
199
|
+
if (className.endsWith("Config") || className.endsWith("AssetConfig"))
|
|
200
|
+
return FW.SystemDefine.FWBindTag.CONFIG;
|
|
201
|
+
if (className.endsWith("Sender") || className.endsWith("SocketSender"))
|
|
202
|
+
return FW.SystemDefine.FWBindTag.SENDER;
|
|
203
|
+
if (className.endsWith("Handle") || className.endsWith("SocketHandle"))
|
|
204
|
+
return FW.SystemDefine.FWBindTag.HANDLE;
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export function initializeFramework() {
|
|
2
|
+
const WD = window as any;
|
|
3
|
+
const SD = require("./define/FWSystemDefine");
|
|
4
|
+
const ED = require("./define/FWEventDefine");
|
|
5
|
+
|
|
6
|
+
// 防止重复初始化导致状态错乱(例如热重载或多次调用)
|
|
7
|
+
if (WD.FW && WD.FW.Framework && WD.FW.Entry) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
WD.FW = {};
|
|
12
|
+
|
|
13
|
+
globalThis.FWPropertyNode = require("./expand/FWDecorator").FWPropertyNode;
|
|
14
|
+
globalThis.searchChild = require("./expand/FWDecorator").searchChild;
|
|
15
|
+
globalThis.FWPropertyNode = require("./expand/FWDecorator").FWPropertyNode;
|
|
16
|
+
globalThis.FWPropertyNodes = require("./expand/FWDecorator").FWPropertyNodes;
|
|
17
|
+
globalThis.FWPropertyComponent =
|
|
18
|
+
require("./expand/FWDecorator").FWPropertyComponent;
|
|
19
|
+
globalThis.FWPropertyComponents =
|
|
20
|
+
require("./expand/FWDecorator").FWPropertyComponents;
|
|
21
|
+
globalThis.PerformanceMonitor =
|
|
22
|
+
require("./expand/FWDecorator").PerformanceMonitor;
|
|
23
|
+
globalThis.FWDeprecated = require("./expand/FWDecorator").FWDeprecated;
|
|
24
|
+
globalThis.FWSocketAutoProcessPause =
|
|
25
|
+
require("./expand/FWDecorator").FWSocketAutoProcessPause;
|
|
26
|
+
globalThis.FWSocketAutoProcessResume =
|
|
27
|
+
require("./expand/FWDecorator").FWSocketAutoProcessResume;
|
|
28
|
+
globalThis.RegisterEvents = require("./expand/FWDecorator").RegisterEvents;
|
|
29
|
+
globalThis.AutoRegisterCCEvent =
|
|
30
|
+
require("./expand/FWDecorator").AutoRegisterCCEvent;
|
|
31
|
+
globalThis.AutoRegisterFWEvent =
|
|
32
|
+
require("./expand/FWDecorator").AutoRegisterFWEvent;
|
|
33
|
+
globalThis.launchScene = "";
|
|
34
|
+
|
|
35
|
+
(FW.SystemDefine as any) = {};
|
|
36
|
+
(FW.EventDefine as any) = {};
|
|
37
|
+
|
|
38
|
+
FW.EventDefine.CCEvent = new ED.CCEvent();
|
|
39
|
+
FW.EventDefine.LanguageEvent = new ED.LanguageEvent();
|
|
40
|
+
FW.EventDefine.SystemEvent = new ED.SystemEvent();
|
|
41
|
+
FW.EventDefine.TaskEvent = new ED.TaskEvent();
|
|
42
|
+
FW.SystemDefine.FWBindTag = new SD.FWBindTag();
|
|
43
|
+
FW.SystemDefine.FWObjectType = new SD.FWObjectType();
|
|
44
|
+
FW.SystemDefine.FWLayerRenderOrder = new SD.FWLayerRenderOrder();
|
|
45
|
+
FW.SystemDefine.FWLayerType = new SD.FWLayerType();
|
|
46
|
+
FW.SystemDefine.FWTaskStatus = new SD.FWTaskStatus();
|
|
47
|
+
FW.SystemDefine.FWPriorityOrder = new SD.FWPriorityOrder();
|
|
48
|
+
FW.SystemDefine.FWLogType = new SD.FWLogType();
|
|
49
|
+
FW.SystemDefine.FWHttpRequestType = new SD.FWHttpRequestType();
|
|
50
|
+
FW.SystemDefine.FWAnimationMachineType = new SD.FWAnimationMachineType();
|
|
51
|
+
FW.SystemDefine.FWScrollViewTemplateType = new SD.FWScrollViewTemplateType();
|
|
52
|
+
FW.SystemDefine.FWScrollViewSlideType = new SD.FWScrollViewSlideType();
|
|
53
|
+
FW.SystemDefine.FWScrollViewSelectedType = new SD.FWScrollViewSelectedType();
|
|
54
|
+
FW.SystemDefine.FWLanguageAssetType = new SD.FWLanguageAssetType();
|
|
55
|
+
FW.SystemDefine.FWPromiseStatus = new SD.FWPromiseStatus();
|
|
56
|
+
FW.SystemDefine.FWLayerState = new SD.FWLayerState();
|
|
57
|
+
FW.SystemDefine.FWAudioType = new SD.FWAudioType();
|
|
58
|
+
FW.Service = require("./service/FWService").FWService;
|
|
59
|
+
FW.Http = require("./service/http/FWHttp").FWHttp;
|
|
60
|
+
FW.Registry = require("./registry/FWRegistry").FWRegistry;
|
|
61
|
+
FW.Framework = new (require("./Framework").Framework)();
|
|
62
|
+
FW.FrameworkBase = require("./FrameworkBase").FrameworkBase;
|
|
63
|
+
FW.Object = require("./utils/FWObject").FWObject;
|
|
64
|
+
FW.Entry = new (require("./entry/FWEntry").FWEntry)();
|
|
65
|
+
FW.Scene = require("./scene/FWScene").FWScene;
|
|
66
|
+
FW.Logic = require("./logic/FWLogic").FWLogic;
|
|
67
|
+
FW.Data = require("./data/FWData").FWData;
|
|
68
|
+
FW.Sender = require("./service/socket/FWSocketSender").FWSocketSender;
|
|
69
|
+
FW.Handle = require("./service/socket/FWSocketHandle").FWSocketHandle;
|
|
70
|
+
FW.AssetConfig = require("./config/FWAssetConfig").FWAssetConfig;
|
|
71
|
+
FW.Log = new (require("./log/FWLog").FWLog)();
|
|
72
|
+
FW.Layer = require("./layer/FWLayer").FWLayer;
|
|
73
|
+
FW.LayerController =
|
|
74
|
+
require("./controller/FWLayerController").FWLayerController;
|
|
75
|
+
FW.SocketMock =
|
|
76
|
+
new (require("./service/socket/mock/FWSocketMock").FWSocketMock)();
|
|
77
|
+
FW.Framework.initialize();
|
|
78
|
+
FW.Entry.initialize();
|
|
79
|
+
}
|