@eggjs/tegg-runtime 3.52.0 → 4.0.0-beta.2
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/package.json +23 -23
- package/{dist/src → src}/factory/EggContainerFactory.d.ts +1 -0
- package/src/factory/EggContainerFactory.js +77 -0
- package/src/factory/EggObjectFactory.js +46 -0
- package/src/factory/LoadUnitInstanceFactory.js +57 -0
- package/src/factory/index.d.ts +3 -0
- package/src/factory/index.js +4 -0
- package/src/impl/ContextInitiator.js +37 -0
- package/src/impl/ContextObjectGraph.js +38 -0
- package/src/impl/EggAlwaysNewObjectContainer.js +32 -0
- package/{dist/src → src}/impl/EggObjectImpl.d.ts +1 -1
- package/src/impl/EggObjectImpl.js +178 -0
- package/src/impl/EggObjectUtil.js +172 -0
- package/src/impl/ModuleLoadUnitInstance.js +90 -0
- package/src/impl/index.d.ts +6 -0
- package/src/impl/index.js +7 -0
- package/src/index.d.ts +5 -0
- package/src/index.js +5 -0
- package/{dist/src → src}/model/AbstractEggContext.d.ts +1 -1
- package/src/model/AbstractEggContext.js +89 -0
- package/src/model/ContextHandler.js +14 -0
- package/src/model/EggContext.js +3 -0
- package/src/model/EggObject.js +3 -0
- package/src/model/LoadUnitInstance.js +3 -0
- package/src/model/index.d.ts +5 -0
- package/src/model/index.js +6 -0
- package/dist/index.d.ts +0 -13
- package/dist/index.js +0 -29
- package/dist/src/factory/EggContainerFactory.js +0 -76
- package/dist/src/factory/EggObjectFactory.js +0 -53
- package/dist/src/factory/LoadUnitInstanceFactory.js +0 -62
- package/dist/src/impl/ContextInitiator.js +0 -39
- package/dist/src/impl/ContextObjectGraph.js +0 -44
- package/dist/src/impl/EggAlwaysNewObjectContainer.js +0 -36
- package/dist/src/impl/EggObjectImpl.js +0 -178
- package/dist/src/impl/EggObjectUtil.js +0 -176
- package/dist/src/impl/ModuleLoadUnitInstance.js +0 -91
- package/dist/src/model/AbstractEggContext.js +0 -96
- package/dist/src/model/ContextHandler.js +0 -19
- package/dist/src/model/EggContext.js +0 -6
- package/dist/src/model/EggObject.js +0 -6
- package/dist/src/model/LoadUnitInstance.js +0 -6
- /package/{dist/src → src}/factory/EggObjectFactory.d.ts +0 -0
- /package/{dist/src → src}/factory/LoadUnitInstanceFactory.d.ts +0 -0
- /package/{dist/src → src}/impl/ContextInitiator.d.ts +0 -0
- /package/{dist/src → src}/impl/ContextObjectGraph.d.ts +0 -0
- /package/{dist/src → src}/impl/EggAlwaysNewObjectContainer.d.ts +0 -0
- /package/{dist/src → src}/impl/EggObjectUtil.d.ts +0 -0
- /package/{dist/src → src}/impl/ModuleLoadUnitInstance.d.ts +0 -0
- /package/{dist/src → src}/model/ContextHandler.d.ts +0 -0
- /package/{dist/src → src}/model/EggContext.d.ts +0 -0
- /package/{dist/src → src}/model/EggObject.d.ts +0 -0
- /package/{dist/src → src}/model/LoadUnitInstance.d.ts +0 -0
package/package.json
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/tegg-runtime",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0-beta.2",
|
|
4
4
|
"description": "tegg runtime",
|
|
5
|
-
"
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./src/index.d.ts",
|
|
9
|
+
"default": "./src/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
6
12
|
"files": [
|
|
7
|
-
"
|
|
8
|
-
"
|
|
13
|
+
"src/**/*.js",
|
|
14
|
+
"src/**/*.d.ts"
|
|
9
15
|
],
|
|
10
|
-
"typings": "dist/index.d.ts",
|
|
11
16
|
"keywords": [
|
|
12
17
|
"egg",
|
|
13
18
|
"typescript",
|
|
@@ -15,11 +20,10 @@
|
|
|
15
20
|
"tegg"
|
|
16
21
|
],
|
|
17
22
|
"scripts": {
|
|
18
|
-
"test": "cross-env NODE_ENV=test NODE_OPTIONS='--no-deprecation' mocha",
|
|
19
23
|
"clean": "tsc -b --clean",
|
|
20
24
|
"tsc": "npm run clean && tsc -p ./tsconfig.json",
|
|
21
|
-
"tsc:pub": "npm run
|
|
22
|
-
"prepublishOnly": "npm run tsc
|
|
25
|
+
"tsc:pub": "npm run tsc",
|
|
26
|
+
"prepublishOnly": "npm run tsc"
|
|
23
27
|
},
|
|
24
28
|
"author": "killagu <killa123@126.com>",
|
|
25
29
|
"license": "MIT",
|
|
@@ -33,27 +37,23 @@
|
|
|
33
37
|
"directory": "core/runtime"
|
|
34
38
|
},
|
|
35
39
|
"engines": {
|
|
36
|
-
"node": ">=
|
|
40
|
+
"node": ">=20.0.0"
|
|
37
41
|
},
|
|
38
42
|
"dependencies": {
|
|
39
|
-
"@eggjs/core-decorator": "^
|
|
40
|
-
"@eggjs/tegg-common-util": "^
|
|
41
|
-
"@eggjs/tegg-lifecycle": "^
|
|
42
|
-
"@eggjs/tegg-metadata": "^
|
|
43
|
-
"@eggjs/tegg-types": "^
|
|
43
|
+
"@eggjs/core-decorator": "^4.0.0-beta.2",
|
|
44
|
+
"@eggjs/tegg-common-util": "^4.0.0-beta.2",
|
|
45
|
+
"@eggjs/tegg-lifecycle": "^4.0.0-beta.2",
|
|
46
|
+
"@eggjs/tegg-metadata": "^4.0.0-beta.2",
|
|
47
|
+
"@eggjs/tegg-types": "^4.0.0-beta.2"
|
|
44
48
|
},
|
|
45
49
|
"devDependencies": {
|
|
46
|
-
"@eggjs/tegg-loader": "^
|
|
47
|
-
"@types/
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"mm": "^3.2.1",
|
|
51
|
-
"mocha": "^10.2.0",
|
|
52
|
-
"ts-node": "^10.9.1",
|
|
53
|
-
"typescript": "^5.0.4"
|
|
50
|
+
"@eggjs/tegg-loader": "^4.0.0-beta.2",
|
|
51
|
+
"@types/node": "22",
|
|
52
|
+
"ts-node": "10",
|
|
53
|
+
"typescript": "5"
|
|
54
54
|
},
|
|
55
55
|
"publishConfig": {
|
|
56
56
|
"access": "public"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "7e29d49dcc2eb26909697d5543b3c4f596c9e927"
|
|
59
59
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ContainerGetMethod, EggContainer, EggObject, EggObjectName, EggProtoImplClass, EggPrototype, LifecycleContext, ObjectInitTypeLike, QualifierInfo } from '@eggjs/tegg-types';
|
|
2
2
|
export declare class EggContainerFactory {
|
|
3
3
|
private static containerGetMethodMap;
|
|
4
|
+
private static ContextInitiatorClass;
|
|
4
5
|
static registerContainerGetMethod(initType: ObjectInitTypeLike, method: ContainerGetMethod): void;
|
|
5
6
|
static getContainer(proto: EggPrototype): EggContainer<LifecycleContext>;
|
|
6
7
|
/**
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { EggPrototypeFactory } from '@eggjs/tegg-metadata';
|
|
2
|
+
import { PrototypeUtil } from '@eggjs/core-decorator';
|
|
3
|
+
import { NameUtil } from '@eggjs/tegg-common-util';
|
|
4
|
+
import { ContextHandler } from '../model/index.js';
|
|
5
|
+
export class EggContainerFactory {
|
|
6
|
+
static containerGetMethodMap = new Map();
|
|
7
|
+
static ContextInitiatorClass;
|
|
8
|
+
static registerContainerGetMethod(initType, method) {
|
|
9
|
+
this.containerGetMethodMap.set(initType, method);
|
|
10
|
+
}
|
|
11
|
+
static getContainer(proto) {
|
|
12
|
+
const method = this.containerGetMethodMap.get(proto.initType);
|
|
13
|
+
if (!method) {
|
|
14
|
+
throw new Error(`InitType ${proto.initType} has not register ContainerGetMethod`);
|
|
15
|
+
}
|
|
16
|
+
return method(proto);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* get or create egg object
|
|
20
|
+
* If get singleton egg object in context,
|
|
21
|
+
* will create context egg object for it.
|
|
22
|
+
*/
|
|
23
|
+
static async getOrCreateEggObject(proto, name) {
|
|
24
|
+
const container = this.getContainer(proto);
|
|
25
|
+
name = name || proto.name;
|
|
26
|
+
const obj = await container.getOrCreateEggObject(name, proto);
|
|
27
|
+
const ctx = ContextHandler.getContext();
|
|
28
|
+
if (ctx) {
|
|
29
|
+
if (!EggContainerFactory.ContextInitiatorClass) {
|
|
30
|
+
// Dependency cycle between ContextInitiator and EggContainerFactory
|
|
31
|
+
const { ContextInitiator } = await import('../impl/ContextInitiator.js');
|
|
32
|
+
EggContainerFactory.ContextInitiatorClass = ContextInitiator;
|
|
33
|
+
}
|
|
34
|
+
const initiator = EggContainerFactory.ContextInitiatorClass.createContextInitiator(ctx);
|
|
35
|
+
await initiator.init(obj);
|
|
36
|
+
}
|
|
37
|
+
return obj;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* get or create egg object from the Class
|
|
41
|
+
* If get singleton egg object in context,
|
|
42
|
+
* will create context egg object for it.
|
|
43
|
+
*/
|
|
44
|
+
static async getOrCreateEggObjectFromClazz(clazz, name, qualifiers) {
|
|
45
|
+
let proto = PrototypeUtil.getClazzProto(clazz);
|
|
46
|
+
if (PrototypeUtil.isEggMultiInstancePrototype(clazz)) {
|
|
47
|
+
const defaultName = NameUtil.getClassName(clazz);
|
|
48
|
+
name = name ?? defaultName;
|
|
49
|
+
proto = EggPrototypeFactory.instance.getPrototype(name, undefined, qualifiers);
|
|
50
|
+
}
|
|
51
|
+
else if (proto) {
|
|
52
|
+
name = name ?? proto.name;
|
|
53
|
+
}
|
|
54
|
+
if (!proto) {
|
|
55
|
+
throw new Error(`can not get proto for clazz ${clazz.name}`);
|
|
56
|
+
}
|
|
57
|
+
return await this.getOrCreateEggObject(proto, name);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* get or create egg object from the Name
|
|
61
|
+
* If get singleton egg object in context,
|
|
62
|
+
* will create context egg object for it.
|
|
63
|
+
*/
|
|
64
|
+
static async getOrCreateEggObjectFromName(name, qualifiers) {
|
|
65
|
+
const proto = EggPrototypeFactory.instance.getPrototype(name, undefined, qualifiers);
|
|
66
|
+
if (!proto) {
|
|
67
|
+
throw new Error(`can not get proto for clazz ${String(name)}`);
|
|
68
|
+
}
|
|
69
|
+
return await this.getOrCreateEggObject(proto, name);
|
|
70
|
+
}
|
|
71
|
+
static getEggObject(proto, name) {
|
|
72
|
+
const container = this.getContainer(proto);
|
|
73
|
+
name = name || proto.name;
|
|
74
|
+
return container.getEggObject(name, proto);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWdnQ29udGFpbmVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkVnZ0NvbnRhaW5lckZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFZM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHbkQsTUFBTSxPQUFPLG1CQUFtQjtJQUN0QixNQUFNLENBQUMscUJBQXFCLEdBQWdELElBQUksR0FBRyxFQUFFLENBQUM7SUFDdEYsTUFBTSxDQUFDLHFCQUFxQixDQUE4QjtJQUVsRSxNQUFNLENBQUMsMEJBQTBCLENBQUMsUUFBNEIsRUFBRSxNQUEwQjtRQUN4RixJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFtQjtRQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxDQUFDLFFBQVEsc0NBQXNDLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQW1CLEVBQUUsSUFBb0I7UUFDekUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMz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
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { LoadUnitFactory } from '@eggjs/tegg-metadata';
|
|
2
|
+
import { EggObjectImpl } from '../impl/index.js';
|
|
3
|
+
import { EggObjectLifecycleUtil } from '../model/index.js';
|
|
4
|
+
import { LoadUnitInstanceFactory } from './LoadUnitInstanceFactory.js';
|
|
5
|
+
export class EggObjectFactory {
|
|
6
|
+
static eggObjectMap = new Map();
|
|
7
|
+
static eggObjectCreateMap = new Map();
|
|
8
|
+
static registerEggObjectCreateMethod(protoClass, method) {
|
|
9
|
+
this.eggObjectCreateMap.set(protoClass, method);
|
|
10
|
+
}
|
|
11
|
+
static getEggObjectCreateMethod(protoClass) {
|
|
12
|
+
if (this.eggObjectCreateMap.has(protoClass)) {
|
|
13
|
+
return this.eggObjectCreateMap.get(protoClass);
|
|
14
|
+
}
|
|
15
|
+
return EggObjectImpl.createObject;
|
|
16
|
+
}
|
|
17
|
+
static async createObject(name, proto) {
|
|
18
|
+
const loadUnit = LoadUnitFactory.getLoadUnitById(proto.loadUnitId);
|
|
19
|
+
if (!loadUnit) {
|
|
20
|
+
throw new Error(`not found load unit ${proto.loadUnitId}`);
|
|
21
|
+
}
|
|
22
|
+
const loadUnitInstance = LoadUnitInstanceFactory.getLoadUnitInstance(loadUnit);
|
|
23
|
+
const lifecycleContext = {
|
|
24
|
+
loadUnit,
|
|
25
|
+
loadUnitInstance: loadUnitInstance,
|
|
26
|
+
};
|
|
27
|
+
const method = this.getEggObjectCreateMethod(proto.constructor);
|
|
28
|
+
const args = [name, proto, lifecycleContext];
|
|
29
|
+
const obj = await Reflect.apply(method, null, args);
|
|
30
|
+
this.eggObjectMap.set(obj.id, { obj, ctx: lifecycleContext });
|
|
31
|
+
return obj;
|
|
32
|
+
}
|
|
33
|
+
static async destroyObject(obj) {
|
|
34
|
+
const { ctx } = this.eggObjectMap.get(obj.id);
|
|
35
|
+
try {
|
|
36
|
+
if (obj.destroy) {
|
|
37
|
+
await obj.destroy(ctx);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
this.eggObjectMap.delete(obj.id);
|
|
42
|
+
EggObjectLifecycleUtil.clearObjectLifecycle(obj);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWdnT2JqZWN0RmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkVnZ09iamVjdEZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQU92RSxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLE1BQU0sQ0FBQyxZQUFZLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDNUQsTUFBTSxDQUFDLGtCQUFrQixHQUErQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNFLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxVQUE2QixFQUFFLE1BQTBCO1FBQ25HLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxNQUFNLENBQUMsd0JBQXdCLENBQUMsVUFBNkI7UUFDbEUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBRSxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQyxZQUFZLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQW1CLEVBQUUsS0FBbUI7UUFDaEUsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0UsTUFBTSxnQkFBZ0IsR0FBOEI7WUFDbEQsUUFBUTtZQUNSLGdCQUFnQixFQUFFLGdCQUFpQjtTQUNwQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxXQUFnQyxDQUFDLENBQUM7UUFDckYsTUFBTSxJQUFJLEdBQUcsQ0FBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFFLENBQUM7UUFDL0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQWM7UUFDdkMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUM7WUFDSCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakMsc0JBQXNCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUMifQ==
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ObjectInitType } from '@eggjs/tegg-types';
|
|
2
|
+
import { IdenticalUtil } from '@eggjs/tegg-lifecycle';
|
|
3
|
+
import { EggContainerFactory } from './EggContainerFactory.js';
|
|
4
|
+
import { LoadUnitInstanceLifecycleUtil } from '../model/LoadUnitInstance.js';
|
|
5
|
+
export class LoadUnitInstanceFactory {
|
|
6
|
+
static creatorMap = new Map();
|
|
7
|
+
static instanceMap = new Map();
|
|
8
|
+
static registerLoadUnitInstanceClass(type, creator) {
|
|
9
|
+
this.creatorMap.set(type, creator);
|
|
10
|
+
}
|
|
11
|
+
static async createLoadUnitInstance(loadUnit) {
|
|
12
|
+
const creator = this.creatorMap.get(loadUnit.type);
|
|
13
|
+
if (!creator) {
|
|
14
|
+
throw new Error(`load unit instance type ${loadUnit.type} is not implement`);
|
|
15
|
+
}
|
|
16
|
+
const instanceId = IdenticalUtil.createLoadUnitInstanceId(loadUnit.id);
|
|
17
|
+
if (!this.instanceMap.has(instanceId)) {
|
|
18
|
+
const ctx = {
|
|
19
|
+
loadUnit,
|
|
20
|
+
};
|
|
21
|
+
const instance = creator(ctx);
|
|
22
|
+
this.instanceMap.set(instanceId, { instance, ctx });
|
|
23
|
+
if (instance.init) {
|
|
24
|
+
// Module init method will create egg object
|
|
25
|
+
// When inject objects, will find load unit instance
|
|
26
|
+
// so should add instance to instanceMap first
|
|
27
|
+
await instance.init(ctx);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return this.instanceMap.get(instanceId).instance;
|
|
31
|
+
}
|
|
32
|
+
static getLoadUnitInstance(loadUnit) {
|
|
33
|
+
const instanceId = IdenticalUtil.createLoadUnitInstanceId(loadUnit.id);
|
|
34
|
+
return this.instanceMap.get(instanceId)?.instance;
|
|
35
|
+
}
|
|
36
|
+
static async destroyLoadUnitInstance(loadUnitInstance) {
|
|
37
|
+
const { ctx } = this.instanceMap.get(loadUnitInstance.id);
|
|
38
|
+
await LoadUnitInstanceLifecycleUtil.objectPreDestroy(ctx, loadUnitInstance);
|
|
39
|
+
if (loadUnitInstance.destroy) {
|
|
40
|
+
await loadUnitInstance.destroy(ctx);
|
|
41
|
+
}
|
|
42
|
+
this.instanceMap.delete(loadUnitInstance.id);
|
|
43
|
+
LoadUnitInstanceLifecycleUtil.clearObjectLifecycle(loadUnitInstance);
|
|
44
|
+
}
|
|
45
|
+
static getLoadUnitInstanceByProto(proto) {
|
|
46
|
+
for (const { instance } of this.instanceMap.values()) {
|
|
47
|
+
if (instance.loadUnit.containPrototype(proto)) {
|
|
48
|
+
return instance;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`not found load unit for proto ${proto.id}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
EggContainerFactory.registerContainerGetMethod(ObjectInitType.SINGLETON, (proto) => {
|
|
55
|
+
return LoadUnitInstanceFactory.getLoadUnitInstanceByProto(proto);
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZFVuaXRJbnN0YW5jZUZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJMb2FkVW5pdEluc3RhbmNlRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFRbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBUTdFLE1BQU0sT0FBTyx1QkFBdUI7SUFDMUIsTUFBTSxDQUFDLFVBQVUsR0FBc0QsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNqRixNQUFNLENBQUMsV0FBVyxHQUFzQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTFFLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxJQUF5QixFQUFFLE9BQWdDO1FBQzlGLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxRQUFrQjtRQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsUUFBUSxDQUFDLElBQUksbUJBQW1CLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLEdBQUcsR0FBcUM7Z0JBQzVDLFFBQVE7YUFDVCxDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQiw0Q0FBNEM7Z0JBQzVDLG9EQUFvRDtnQkFDcEQsOENBQThDO2dCQUM5QyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBRSxDQUFDLFFBQVEsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQWtCO1FBQzNDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDcEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsZ0JBQWtDO1FBQ3JFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUUsQ0FBQztRQUMzRCxNQUFNLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVFLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLDZCQUE2QixDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxLQUFtQjtRQUNuRCxLQUFLLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDckQsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7QUFHSCxtQkFBbUIsQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBbUIsRUFBRSxFQUFFO0lBQy9GLE9BQU8sdUJBQXVCLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './EggContainerFactory.js';
|
|
2
|
+
export * from './EggObjectFactory.js';
|
|
3
|
+
export * from './LoadUnitInstanceFactory.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyw4QkFBOEIsQ0FBQyJ9
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { LoadUnitFactory } from '@eggjs/tegg-metadata';
|
|
2
|
+
import { ContextObjectGraph } from './ContextObjectGraph.js';
|
|
3
|
+
import { EggContainerFactory } from '../factory/index.js';
|
|
4
|
+
const CONTEXT_INITIATOR = Symbol('EggContext#ContextInitiator');
|
|
5
|
+
export class ContextInitiator {
|
|
6
|
+
eggContext;
|
|
7
|
+
eggObjectInitRecorder;
|
|
8
|
+
constructor(eggContext) {
|
|
9
|
+
this.eggContext = eggContext;
|
|
10
|
+
this.eggObjectInitRecorder = new WeakMap();
|
|
11
|
+
this.eggContext.set(CONTEXT_INITIATOR, this);
|
|
12
|
+
}
|
|
13
|
+
async init(obj) {
|
|
14
|
+
if (this.eggObjectInitRecorder.get(obj) === true) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
this.eggObjectInitRecorder.set(obj, true);
|
|
18
|
+
const injectObjectProtos = ContextObjectGraph.getContextProto(obj.proto);
|
|
19
|
+
await Promise.all(injectObjectProtos.map(async (injectObject) => {
|
|
20
|
+
const proto = injectObject.proto;
|
|
21
|
+
const loadUnit = LoadUnitFactory.getLoadUnitById(proto.loadUnitId);
|
|
22
|
+
if (!loadUnit) {
|
|
23
|
+
throw new Error(`can not find load unit: ${proto.loadUnitId}`);
|
|
24
|
+
}
|
|
25
|
+
await EggContainerFactory.getOrCreateEggObject(proto, injectObject.objName);
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
static createContextInitiator(context) {
|
|
29
|
+
let initiator = context.get(CONTEXT_INITIATOR);
|
|
30
|
+
if (!initiator) {
|
|
31
|
+
initiator = new ContextInitiator(context);
|
|
32
|
+
context.set(CONTEXT_INITIATOR, initiator);
|
|
33
|
+
}
|
|
34
|
+
return initiator;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dEluaXRpYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkNvbnRleHRJbml0aWF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTFELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFFaEUsTUFBTSxPQUFPLGdCQUFnQjtJQUNWLFVBQVUsQ0FBb0I7SUFDOUIscUJBQXFCLENBQThCO0lBRXBFLFlBQVksVUFBNkI7UUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBYztRQUN2QixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDakQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQyxNQUFNLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekUsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUMsWUFBWSxFQUFDLEVBQUU7WUFDNUQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNuRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztZQUNELE1BQU0sbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxPQUEwQjtRQUN0RCxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsU0FBUyxHQUFHLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ObjectInitType } from '@eggjs/tegg-types';
|
|
2
|
+
class InjectProtoHolder {
|
|
3
|
+
idSet = new Set();
|
|
4
|
+
injectProtos = [];
|
|
5
|
+
addInjectProto(injectObjectProto) {
|
|
6
|
+
const id = `${String(injectObjectProto.objName)}:${injectObjectProto.proto.id}`;
|
|
7
|
+
if (this.idSet.has(id)) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
this.idSet.add(id);
|
|
11
|
+
this.injectProtos.push(injectObjectProto);
|
|
12
|
+
}
|
|
13
|
+
dumpProtos() {
|
|
14
|
+
return this.injectProtos;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class ContextObjectGraph {
|
|
18
|
+
static eggObjectInitRecorder = new WeakMap();
|
|
19
|
+
static getContextProto(proto) {
|
|
20
|
+
if (ContextObjectGraph.eggObjectInitRecorder.has(proto)) {
|
|
21
|
+
return ContextObjectGraph.eggObjectInitRecorder.get(proto);
|
|
22
|
+
}
|
|
23
|
+
const holder = new InjectProtoHolder();
|
|
24
|
+
this.doGetContextProto(proto, holder);
|
|
25
|
+
const injectObjectProtos = holder.dumpProtos();
|
|
26
|
+
ContextObjectGraph.eggObjectInitRecorder.set(proto, injectObjectProtos);
|
|
27
|
+
return injectObjectProtos;
|
|
28
|
+
}
|
|
29
|
+
static doGetContextProto(proto, holder) {
|
|
30
|
+
for (const injectObject of proto.injectObjects) {
|
|
31
|
+
if (injectObject.proto.initType === ObjectInitType.CONTEXT && proto.initType !== ObjectInitType.CONTEXT) {
|
|
32
|
+
holder.addInjectProto(injectObject);
|
|
33
|
+
}
|
|
34
|
+
ContextObjectGraph.doGetContextProto(injectObject.proto, holder);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dE9iamVjdEdyYXBoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQ29udGV4dE9iamVjdEdyYXBoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUduRCxNQUFNLGlCQUFpQjtJQUNiLEtBQUssR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMvQixZQUFZLEdBQTZCLEVBQUUsQ0FBQztJQUVwRCxjQUFjLENBQUMsaUJBQW9DO1FBQ2pELE1BQU0sRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxrQkFBa0I7SUFDckIsTUFBTSxDQUFDLHFCQUFxQixHQUFvRCxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRXRHLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBbUI7UUFDeEMsSUFBSSxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxPQUFPLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUUsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0Msa0JBQWtCLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFtQixFQUFFLE1BQXlCO1FBQzdFLEtBQUssTUFBTSxZQUFZLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQy9DLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssY0FBYyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDeEcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQ0Qsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ObjectInitType } from '@eggjs/tegg-types';
|
|
2
|
+
import { EggObjectFactory, EggContainerFactory } from '../factory/index.js';
|
|
3
|
+
export class EggAlwaysNewObjectContainer {
|
|
4
|
+
static instance = new EggAlwaysNewObjectContainer();
|
|
5
|
+
id;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.id = 'ALWAYS_NEW_OBJECT_CONTAINER';
|
|
8
|
+
}
|
|
9
|
+
addProtoToCreate() {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
deleteProtoToCreate() {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
iterateProtoToCreate() {
|
|
16
|
+
return new Map().entries();
|
|
17
|
+
}
|
|
18
|
+
getEggObject() {
|
|
19
|
+
throw new Error('Always Object can not use getEggObject, should use getOrCreateEggObject');
|
|
20
|
+
}
|
|
21
|
+
async getOrCreateEggObject(name, proto) {
|
|
22
|
+
return EggObjectFactory.createObject(name, proto);
|
|
23
|
+
}
|
|
24
|
+
async destroy() {
|
|
25
|
+
// do nothing
|
|
26
|
+
}
|
|
27
|
+
async init() {
|
|
28
|
+
// do nothing
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
EggContainerFactory.registerContainerGetMethod(ObjectInitType.ALWAYS_NEW, () => EggAlwaysNewObjectContainer.instance);
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWdnQWx3YXlzTmV3T2JqZWN0Q29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiRWdnQWx3YXlzTmV3T2JqZWN0Q29udGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU1RSxNQUFNLE9BQU8sMkJBQTJCO0lBQ3RDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSwyQkFBMkIsRUFBRSxDQUFDO0lBQzNDLEVBQUUsQ0FBSztJQUVoQjtRQUNFLElBQUksQ0FBQyxFQUFFLEdBQUcsNkJBQTZCLENBQUM7SUFDMUMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU87SUFDVCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE9BQU87SUFDVCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMseUVBQXlFLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQVksRUFBRSxLQUFtQjtRQUMxRCxPQUFPLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1gsYUFBYTtJQUNmLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLGFBQWE7SUFDZixDQUFDOztBQUdILG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUMifQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EggObject, EggObjectLifeCycleContext, EggObjectName, EggPrototype } from '@eggjs/tegg-types';
|
|
2
|
-
export
|
|
2
|
+
export declare class EggObjectImpl implements EggObject {
|
|
3
3
|
private _obj;
|
|
4
4
|
private status;
|
|
5
5
|
readonly proto: EggPrototype;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { LoadUnitFactory } from '@eggjs/tegg-metadata';
|
|
2
|
+
import { EggObjectStatus, InjectType, ObjectInitType } from '@eggjs/tegg-types';
|
|
3
|
+
import { IdenticalUtil } from '@eggjs/tegg-lifecycle';
|
|
4
|
+
import { EggObjectLifecycleUtil, ContextHandler } from '../model/index.js';
|
|
5
|
+
import { EggContainerFactory } from '../factory/index.js';
|
|
6
|
+
import { EggObjectUtil } from './EggObjectUtil.js';
|
|
7
|
+
export class EggObjectImpl {
|
|
8
|
+
_obj;
|
|
9
|
+
status = EggObjectStatus.PENDING;
|
|
10
|
+
proto;
|
|
11
|
+
name;
|
|
12
|
+
id;
|
|
13
|
+
constructor(name, proto) {
|
|
14
|
+
this.name = name;
|
|
15
|
+
this.proto = proto;
|
|
16
|
+
const ctx = ContextHandler.getContext();
|
|
17
|
+
this.id = IdenticalUtil.createObjectId(this.proto.id, ctx?.id);
|
|
18
|
+
}
|
|
19
|
+
async initWithInjectProperty(ctx) {
|
|
20
|
+
// 1. create obj
|
|
21
|
+
// 2. call obj lifecycle preCreate
|
|
22
|
+
// 3. inject deps
|
|
23
|
+
// 4. call obj lifecycle postCreate
|
|
24
|
+
// 5. success create
|
|
25
|
+
try {
|
|
26
|
+
this._obj = this.proto.constructEggObject();
|
|
27
|
+
const objLifecycleHook = this._obj;
|
|
28
|
+
// global hook
|
|
29
|
+
await EggObjectLifecycleUtil.objectPreCreate(ctx, this);
|
|
30
|
+
// self hook
|
|
31
|
+
const postConstructMethod = EggObjectLifecycleUtil.getLifecycleHook('postConstruct', this.proto) ?? 'postConstruct';
|
|
32
|
+
if (objLifecycleHook[postConstructMethod]) {
|
|
33
|
+
await objLifecycleHook[postConstructMethod](ctx, this);
|
|
34
|
+
}
|
|
35
|
+
const preInjectMethod = EggObjectLifecycleUtil.getLifecycleHook('preInject', this.proto) ?? 'preInject';
|
|
36
|
+
if (objLifecycleHook[preInjectMethod]) {
|
|
37
|
+
await objLifecycleHook[preInjectMethod](ctx, this);
|
|
38
|
+
}
|
|
39
|
+
await Promise.all(this.proto.injectObjects.map(async (injectObject) => {
|
|
40
|
+
const proto = injectObject.proto;
|
|
41
|
+
const loadUnit = LoadUnitFactory.getLoadUnitById(proto.loadUnitId);
|
|
42
|
+
if (!loadUnit) {
|
|
43
|
+
throw new Error(`can not find load unit: ${proto.loadUnitId}`);
|
|
44
|
+
}
|
|
45
|
+
if (this.proto.initType !== ObjectInitType.CONTEXT && injectObject.proto.initType === ObjectInitType.CONTEXT) {
|
|
46
|
+
this.injectProperty(injectObject.refName, EggObjectUtil.contextEggObjectGetProperty(proto, injectObject.objName));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const injectObj = await EggContainerFactory.getOrCreateEggObject(proto, injectObject.objName);
|
|
50
|
+
this.injectProperty(injectObject.refName, EggObjectUtil.eggObjectGetProperty(injectObj));
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
// global hook
|
|
54
|
+
await EggObjectLifecycleUtil.objectPostCreate(ctx, this);
|
|
55
|
+
// self hook
|
|
56
|
+
const postInjectMethod = EggObjectLifecycleUtil.getLifecycleHook('postInject', this.proto) ?? 'postInject';
|
|
57
|
+
if (objLifecycleHook[postInjectMethod]) {
|
|
58
|
+
await objLifecycleHook[postInjectMethod](ctx, this);
|
|
59
|
+
}
|
|
60
|
+
const initMethod = EggObjectLifecycleUtil.getLifecycleHook('init', this.proto) ?? 'init';
|
|
61
|
+
if (objLifecycleHook[initMethod]) {
|
|
62
|
+
await objLifecycleHook[initMethod](ctx, this);
|
|
63
|
+
}
|
|
64
|
+
this.status = EggObjectStatus.READY;
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
this.status = EggObjectStatus.ERROR;
|
|
68
|
+
throw e;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async initWithInjectConstructor(ctx) {
|
|
72
|
+
// 1. create inject deps
|
|
73
|
+
// 2. create obj
|
|
74
|
+
// 3. call obj lifecycle preCreate
|
|
75
|
+
// 4. call obj lifecycle postCreate
|
|
76
|
+
// 5. success create
|
|
77
|
+
try {
|
|
78
|
+
const constructArgs = await Promise.all(this.proto.injectObjects.map(async (injectObject) => {
|
|
79
|
+
const proto = injectObject.proto;
|
|
80
|
+
const loadUnit = LoadUnitFactory.getLoadUnitById(proto.loadUnitId);
|
|
81
|
+
if (!loadUnit) {
|
|
82
|
+
throw new Error(`can not find load unit: ${proto.loadUnitId}`);
|
|
83
|
+
}
|
|
84
|
+
if (this.proto.initType !== ObjectInitType.CONTEXT && injectObject.proto.initType === ObjectInitType.CONTEXT) {
|
|
85
|
+
return EggObjectUtil.contextEggObjectProxy(proto, injectObject.objName);
|
|
86
|
+
}
|
|
87
|
+
const injectObj = await EggContainerFactory.getOrCreateEggObject(proto, injectObject.objName);
|
|
88
|
+
return EggObjectUtil.eggObjectProxy(injectObj);
|
|
89
|
+
}));
|
|
90
|
+
if (typeof this.proto.multiInstanceConstructorIndex !== 'undefined') {
|
|
91
|
+
const qualifiers = this.proto.multiInstanceConstructorAttributes
|
|
92
|
+
?.map(t => {
|
|
93
|
+
return {
|
|
94
|
+
attribute: t,
|
|
95
|
+
value: this.proto.getQualifier(t),
|
|
96
|
+
};
|
|
97
|
+
})
|
|
98
|
+
?.filter(t => typeof t.value !== 'undefined')
|
|
99
|
+
?? [];
|
|
100
|
+
const objInfo = {
|
|
101
|
+
name: this.proto.name,
|
|
102
|
+
qualifiers,
|
|
103
|
+
};
|
|
104
|
+
constructArgs.splice(this.proto.multiInstanceConstructorIndex, 0, objInfo);
|
|
105
|
+
}
|
|
106
|
+
this._obj = this.proto.constructEggObject(...constructArgs);
|
|
107
|
+
const objLifecycleHook = this._obj;
|
|
108
|
+
// global hook
|
|
109
|
+
await EggObjectLifecycleUtil.objectPreCreate(ctx, this);
|
|
110
|
+
// self hook
|
|
111
|
+
const postConstructMethod = EggObjectLifecycleUtil.getLifecycleHook('postConstruct', this.proto) ?? 'postConstruct';
|
|
112
|
+
if (objLifecycleHook[postConstructMethod]) {
|
|
113
|
+
await objLifecycleHook[postConstructMethod](ctx, this);
|
|
114
|
+
}
|
|
115
|
+
const preInjectMethod = EggObjectLifecycleUtil.getLifecycleHook('preInject', this.proto) ?? 'preInject';
|
|
116
|
+
if (objLifecycleHook[preInjectMethod]) {
|
|
117
|
+
await objLifecycleHook[preInjectMethod](ctx, this);
|
|
118
|
+
}
|
|
119
|
+
// global hook
|
|
120
|
+
await EggObjectLifecycleUtil.objectPostCreate(ctx, this);
|
|
121
|
+
// self hook
|
|
122
|
+
const postInjectMethod = EggObjectLifecycleUtil.getLifecycleHook('postInject', this.proto) ?? 'postInject';
|
|
123
|
+
if (objLifecycleHook[postInjectMethod]) {
|
|
124
|
+
await objLifecycleHook[postInjectMethod](ctx, this);
|
|
125
|
+
}
|
|
126
|
+
const initMethod = EggObjectLifecycleUtil.getLifecycleHook('init', this.proto) ?? 'init';
|
|
127
|
+
if (objLifecycleHook[initMethod]) {
|
|
128
|
+
await objLifecycleHook[initMethod](ctx, this);
|
|
129
|
+
}
|
|
130
|
+
this.status = EggObjectStatus.READY;
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
this.status = EggObjectStatus.ERROR;
|
|
134
|
+
throw e;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async init(ctx) {
|
|
138
|
+
if (this.proto.injectType === InjectType.CONSTRUCTOR) {
|
|
139
|
+
await this.initWithInjectConstructor(ctx);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
await this.initWithInjectProperty(ctx);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async destroy(ctx) {
|
|
146
|
+
if (this.status === EggObjectStatus.READY) {
|
|
147
|
+
this.status = EggObjectStatus.DESTROYING;
|
|
148
|
+
// global hook
|
|
149
|
+
await EggObjectLifecycleUtil.objectPreDestroy(ctx, this);
|
|
150
|
+
// self hook
|
|
151
|
+
const objLifecycleHook = this._obj;
|
|
152
|
+
const preDestroyMethod = EggObjectLifecycleUtil.getLifecycleHook('preDestroy', this.proto) ?? 'preDestroy';
|
|
153
|
+
if (objLifecycleHook[preDestroyMethod]) {
|
|
154
|
+
await objLifecycleHook[preDestroyMethod](ctx, this);
|
|
155
|
+
}
|
|
156
|
+
const destroyMethod = EggObjectLifecycleUtil.getLifecycleHook('destroy', this.proto) ?? 'destroy';
|
|
157
|
+
if (objLifecycleHook[destroyMethod]) {
|
|
158
|
+
await objLifecycleHook[destroyMethod](ctx, this);
|
|
159
|
+
}
|
|
160
|
+
this.status = EggObjectStatus.DESTROYED;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
injectProperty(name, descriptor) {
|
|
164
|
+
Reflect.defineProperty(this._obj, name, descriptor);
|
|
165
|
+
}
|
|
166
|
+
get obj() {
|
|
167
|
+
return this._obj;
|
|
168
|
+
}
|
|
169
|
+
get isReady() {
|
|
170
|
+
return this.status === EggObjectStatus.READY;
|
|
171
|
+
}
|
|
172
|
+
static async createObject(name, proto, lifecycleContext) {
|
|
173
|
+
const obj = new EggObjectImpl(name, proto);
|
|
174
|
+
await obj.init(lifecycleContext);
|
|
175
|
+
return obj;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWdnT2JqZWN0SW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkVnZ09iamVjdEltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBUXZELE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE1BQU0sT0FBTyxhQUFhO0lBQ2hCLElBQUksQ0FBUztJQUNiLE1BQU0sR0FBb0IsZUFBZSxDQUFDLE9BQU8sQ0FBQztJQUVqRCxLQUFLLENBQWU7SUFDcEIsSUFBSSxDQUFnQjtJQUNwQixFQUFFLENBQVM7SUFFcEIsWUFBWSxJQUFtQixFQUFFLEtBQW1CO1FBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsR0FBOEI7UUFDekQsZ0JBQWdCO1FBQ2hCLGtDQUFrQztRQUNsQyxpQkFBaUI7UUFDakIsbUNBQW1DO1FBQ25DLG9CQUFvQjtRQUNwQixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUEwQixDQUFDO1lBRXpELGNBQWM7WUFDZCxNQUFNLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEQsWUFBWTtZQUNaLE1BQU0sbUJBQW1CLEdBQUcsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxlQUFlLENBQUM7WUFDcEgsSUFBSSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUVELE1BQU0sZUFBZSxHQUFHLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDO1lBQ3hHLElBQUksZ0JBQWdCLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLFlBQVksRUFBQyxFQUFFO2dCQUNsRSxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssY0FBYyxDQUFDLE9BQU8sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzdHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNwSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxTQUFTLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM5RixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNGLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRUosY0FBYztZQUNkLE1BQU0sc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXpELFlBQVk7WUFDWixNQUFNLGdCQUFnQixHQUFHLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDO1lBQzNHLElBQUksZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQztZQUN6RixJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDdEMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDcEMsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxHQUE4QjtRQUM1RCx3QkFBd0I7UUFDeEIsZ0JBQWdCO1FBQ2hCLGtDQUFrQztRQUNsQyxtQ0FBbUM7UUFDbkMsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQztZQUNILE1BQU0sYUFBYSxHQUFVLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLFlBQVksRUFBQyxFQUFFO2dCQUNoRyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssY0FBYyxDQUFDLE9BQU8sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzdHLE9BQU8sYUFBYSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzFFLENBQUM7Z0JBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM5RixPQUFPLGFBQWEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNKLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLDZCQUE2QixLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNwRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGtDQUFrQztvQkFDOUQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ1IsT0FBTzt3QkFDTCxTQUFTLEVBQUUsQ0FBQzt3QkFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3FCQUNqQixDQUFDO2dCQUNyQixDQUFDLENBQUM7b0JBQ0YsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDO3VCQUMxQyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxPQUFPLEdBQWU7b0JBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7b0JBQ3JCLFVBQVU7aUJBQ1gsQ0FBQztnQkFDRixhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQztZQUM1RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUEwQixDQUFDO1lBRXpELGNBQWM7WUFDZCxNQUFNLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEQsWUFBWTtZQUNaLE1BQU0sbUJBQW1CLEdBQUcsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxlQUFlLENBQUM7WUFDcEgsSUFBSSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUVELE1BQU0sZUFBZSxHQUFHLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDO1lBQ3hHLElBQUksZ0JBQWdCLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUVELGNBQWM7WUFDZCxNQUFNLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUV6RCxZQUFZO1lBQ1osTUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQztZQUMzRyxJQUFJLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUM7WUFDekYsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQ3RDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQThCO1FBQ3ZDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JELE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQThCO1FBQzFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDO1lBQ3pDLGNBQWM7WUFDZCxNQUFNLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUV6RCxZQUFZO1lBQ1osTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBMEIsQ0FBQztZQUN6RCxNQUFNLGdCQUFnQixHQUFHLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDO1lBQzNHLElBQUksZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFFRCxNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQztZQUNsRyxJQUFJLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsSUFBbUIsRUFBRSxVQUE4QjtRQUNoRSxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFtQixFQUFFLEtBQW1CLEVBQUUsZ0JBQTJDO1FBQzdHLE1BQU0sR0FBRyxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNqQyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRiJ9
|