@tsed/temporal 7.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +13 -0
- package/.eslintrc.js +1 -0
- package/jest.config.js +19 -0
- package/lib/cjs/TemporalModule.js +53 -0
- package/lib/cjs/TemporalModule.js.map +1 -0
- package/lib/cjs/constants.js +5 -0
- package/lib/cjs/constants.js.map +1 -0
- package/lib/cjs/decorators/activity.js +17 -0
- package/lib/cjs/decorators/activity.js.map +1 -0
- package/lib/cjs/decorators/temporal.js +13 -0
- package/lib/cjs/decorators/temporal.js.map +1 -0
- package/lib/cjs/index.js +15 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/interfaces/TemporalStore.js +5 -0
- package/lib/cjs/interfaces/TemporalStore.js.map +1 -0
- package/lib/cjs/interfaces/interfaces.js +3 -0
- package/lib/cjs/interfaces/interfaces.js.map +1 -0
- package/lib/cjs/package.json +3 -0
- package/lib/cjs/services/TemporalFactory.js +51 -0
- package/lib/cjs/services/TemporalFactory.js.map +1 -0
- package/lib/cjs/utils/worker.js +35 -0
- package/lib/cjs/utils/worker.js.map +1 -0
- package/lib/esm/TemporalModule.js +50 -0
- package/lib/esm/TemporalModule.js.map +1 -0
- package/lib/esm/constants.js +2 -0
- package/lib/esm/constants.js.map +1 -0
- package/lib/esm/decorators/activity.js +13 -0
- package/lib/esm/decorators/activity.js.map +1 -0
- package/lib/esm/decorators/temporal.js +9 -0
- package/lib/esm/decorators/temporal.js.map +1 -0
- package/lib/esm/index.js +12 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/interfaces/TemporalStore.js +2 -0
- package/lib/esm/interfaces/TemporalStore.js.map +1 -0
- package/lib/esm/interfaces/interfaces.js +2 -0
- package/lib/esm/interfaces/interfaces.js.map +1 -0
- package/lib/esm/package.json +3 -0
- package/lib/esm/services/TemporalFactory.js +48 -0
- package/lib/esm/services/TemporalFactory.js.map +1 -0
- package/lib/esm/utils/worker.js +31 -0
- package/lib/esm/utils/worker.js.map +1 -0
- package/lib/tsconfig.esm.tsbuildinfo +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/lib/types/TemporalModule.d.ts +12 -0
- package/lib/types/constants.d.ts +1 -0
- package/lib/types/decorators/activity.d.ts +2 -0
- package/lib/types/decorators/temporal.d.ts +1 -0
- package/lib/types/index.d.ts +11 -0
- package/lib/types/interfaces/TemporalStore.d.ts +9 -0
- package/lib/types/interfaces/interfaces.d.ts +12 -0
- package/lib/types/services/TemporalFactory.d.ts +5 -0
- package/lib/types/utils/worker.d.ts +9 -0
- package/package.json +49 -0
- package/readme.md +256 -0
- package/src/TemporalModule.ts +39 -0
- package/src/constants.ts +1 -0
- package/src/decorators/activity.spec.ts +40 -0
- package/src/decorators/activity.ts +14 -0
- package/src/decorators/temporal.spec.ts +11 -0
- package/src/decorators/temporal.ts +11 -0
- package/src/index.ts +12 -0
- package/src/interfaces/TemporalStore.ts +9 -0
- package/src/interfaces/interfaces.ts +14 -0
- package/src/services/TemporalFactory.ts +55 -0
- package/src/utils/worker.ts +43 -0
- package/tsconfig.esm.json +39 -0
- package/tsconfig.json +39 -0
package/.eslintignore
ADDED
package/.eslintrc.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require("@tsed/eslint/node.js");
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// For a detailed explanation regarding each configuration property, visit:
|
|
2
|
+
// https://jestjs.io/docs/en/configuration.html
|
|
3
|
+
|
|
4
|
+
module.exports = {
|
|
5
|
+
...require("@tsed/jest-config"),
|
|
6
|
+
roots: ["<rootDir>/src", "<rootDir>/test"],
|
|
7
|
+
coverageThreshold: {
|
|
8
|
+
global: {
|
|
9
|
+
statements: 94.62,
|
|
10
|
+
branches: 75.75,
|
|
11
|
+
functions: 93.33,
|
|
12
|
+
lines: 94.62
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
transformIgnorePatterns: ["test/workflows/.*\\.ts$"],
|
|
16
|
+
moduleNameMapper: {
|
|
17
|
+
"@tsed/temporal": "<rootDir>/src/index.ts"
|
|
18
|
+
}
|
|
19
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TemporalModule = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const core_1 = require("@tsed/core");
|
|
6
|
+
const common_1 = require("@tsed/common");
|
|
7
|
+
const di_1 = require("@tsed/di");
|
|
8
|
+
const constants_1 = require("./constants");
|
|
9
|
+
const TemporalStore_1 = require("./interfaces/TemporalStore");
|
|
10
|
+
const TemporalFactory_1 = require("./services/TemporalFactory");
|
|
11
|
+
let TemporalModule = class TemporalModule {
|
|
12
|
+
temporalServices;
|
|
13
|
+
logger;
|
|
14
|
+
injector;
|
|
15
|
+
client;
|
|
16
|
+
constructor(temporalServices) {
|
|
17
|
+
this.temporalServices = temporalServices;
|
|
18
|
+
}
|
|
19
|
+
getActivities() {
|
|
20
|
+
return this.temporalServices.reduce((activities, instance) => Object.assign(activities, this.getActivitiesFromInstance(instance)), {});
|
|
21
|
+
}
|
|
22
|
+
getActivitiesFromInstance(instance) {
|
|
23
|
+
const provider = this.injector.getProvider((0, core_1.classOf)(instance));
|
|
24
|
+
const store = provider.store.get(TemporalStore_1.TEMPORAL_STORE_KEY, {});
|
|
25
|
+
return Object.entries(store.activities || {}).reduce((activities, [propertyKey, { name }]) => {
|
|
26
|
+
const jobProcessor = instance[propertyKey].bind(instance);
|
|
27
|
+
const jobName = name || propertyKey;
|
|
28
|
+
return {
|
|
29
|
+
...activities,
|
|
30
|
+
[jobName]: jobProcessor
|
|
31
|
+
};
|
|
32
|
+
}, {});
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
tslib_1.__decorate([
|
|
36
|
+
(0, di_1.Inject)(),
|
|
37
|
+
tslib_1.__metadata("design:type", common_1.Logger)
|
|
38
|
+
], TemporalModule.prototype, "logger", void 0);
|
|
39
|
+
tslib_1.__decorate([
|
|
40
|
+
(0, di_1.Inject)(),
|
|
41
|
+
tslib_1.__metadata("design:type", di_1.InjectorService)
|
|
42
|
+
], TemporalModule.prototype, "injector", void 0);
|
|
43
|
+
tslib_1.__decorate([
|
|
44
|
+
(0, di_1.Inject)(),
|
|
45
|
+
tslib_1.__metadata("design:type", TemporalFactory_1.TemporalClient)
|
|
46
|
+
], TemporalModule.prototype, "client", void 0);
|
|
47
|
+
TemporalModule = tslib_1.__decorate([
|
|
48
|
+
(0, di_1.Module)(),
|
|
49
|
+
tslib_1.__param(0, (0, di_1.Inject)(constants_1.PROVIDER_TYPE_TEMPORAL)),
|
|
50
|
+
tslib_1.__metadata("design:paramtypes", [Array])
|
|
51
|
+
], TemporalModule);
|
|
52
|
+
exports.TemporalModule = TemporalModule;
|
|
53
|
+
//# sourceMappingURL=TemporalModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemporalModule.js","sourceRoot":"","sources":["../../src/TemporalModule.ts"],"names":[],"mappings":";;;;AAAA,qCAAmC;AACnC,yCAAoC;AACpC,iCAAmE;AACnE,2CAAmD;AACnD,8DAA6E;AAC7E,gEAA0D;AAGnD,IAAM,cAAc,GAApB,MAAM,cAAc;IAU2B;IAR1C,MAAM,CAAU;IAGhB,QAAQ,CAAmB;IAG3B,MAAM,CAAkB;IAElC,YAAoD,gBAAuB;QAAvB,qBAAgB,GAAhB,gBAAgB,CAAO;IAAG,CAAC;IAExE,aAAa;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzI,CAAC;IAES,yBAAyB,CAAC,QAAa;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAA,cAAO,EAAC,QAAQ,CAAC,CAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAgB,kCAAkB,EAAE,EAAE,CAAC,CAAC;QAExE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,EAAC,IAAI,EAAC,CAAC,EAAE,EAAE;YACzF,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,IAAI,WAAW,CAAC;YAEpC,OAAO;gBACL,GAAG,UAAU;gBACb,CAAC,OAAO,CAAC,EAAE,YAAY;aACxB,CAAC;QACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;CACF,CAAA;AA7BC;IAAC,IAAA,WAAM,GAAE;sCACU,eAAM;8CAAC;AAE1B;IAAC,IAAA,WAAM,GAAE;sCACY,oBAAe;gDAAC;AAErC;IAAC,IAAA,WAAM,GAAE;sCACU,gCAAc;8CAAC;AARvB,cAAc;IAD1B,IAAA,WAAM,GAAE;IAWM,mBAAA,IAAA,WAAM,EAAC,kCAAsB,CAAC,CAAA;;GAVhC,cAAc,CA8B1B;AA9BY,wCAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Activity = void 0;
|
|
4
|
+
const core_1 = require("@tsed/core");
|
|
5
|
+
const TemporalStore_1 = require("../interfaces/TemporalStore");
|
|
6
|
+
function Activity(options = {}) {
|
|
7
|
+
return (target, propertyKey) => {
|
|
8
|
+
const store = {
|
|
9
|
+
activities: {
|
|
10
|
+
[propertyKey]: options
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
core_1.Store.from(target).merge(TemporalStore_1.TEMPORAL_STORE_KEY, store);
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
exports.Activity = Activity;
|
|
17
|
+
//# sourceMappingURL=activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/decorators/activity.ts"],"names":[],"mappings":";;;AAAA,qCAAiC;AACjC,+DAA+F;AAE/F,SAAgB,QAAQ,CAAC,UAA2B,EAAE;IACpD,OAAO,CAAC,MAAW,EAAE,WAA4B,EAAE,EAAE;QACnD,MAAM,KAAK,GAAkB;YAC3B,UAAU,EAAE;gBACV,CAAC,WAAW,CAAC,EAAE,OAAO;aACvB;SACF,CAAC;QAEF,YAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,kCAAkB,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC;AACJ,CAAC;AAVD,4BAUC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Temporal = void 0;
|
|
4
|
+
const core_1 = require("@tsed/core");
|
|
5
|
+
const di_1 = require("@tsed/di");
|
|
6
|
+
const constants_1 = require("../constants");
|
|
7
|
+
function Temporal() {
|
|
8
|
+
return (0, core_1.useDecorators)((0, di_1.Injectable)({
|
|
9
|
+
type: constants_1.PROVIDER_TYPE_TEMPORAL
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
exports.Temporal = Temporal;
|
|
13
|
+
//# sourceMappingURL=temporal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.js","sourceRoot":"","sources":["../../../src/decorators/temporal.ts"],"names":[],"mappings":";;;AAAA,qCAAyC;AACzC,iCAAoC;AACpC,4CAAoD;AAEpD,SAAgB,QAAQ;IACtB,OAAO,IAAA,oBAAa,EAClB,IAAA,eAAU,EAAC;QACT,IAAI,EAAE,kCAAsB;KAC7B,CAAC,CACH,CAAC;AACJ,CAAC;AAND,4BAMC"}
|
package/lib/cjs/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file Automatically generated by barrelsby.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const tslib_1 = require("tslib");
|
|
7
|
+
tslib_1.__exportStar(require("./TemporalModule"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./constants"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./decorators/activity"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./decorators/temporal"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./interfaces/TemporalStore"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./interfaces/interfaces"), exports);
|
|
13
|
+
tslib_1.__exportStar(require("./services/TemporalFactory"), exports);
|
|
14
|
+
tslib_1.__exportStar(require("./utils/worker"), exports);
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,2DAAiC;AACjC,sDAA4B;AAC5B,gEAAsC;AACtC,gEAAsC;AACtC,qEAA2C;AAC3C,kEAAwC;AACxC,qEAA2C;AAC3C,yDAA+B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemporalStore.js","sourceRoot":"","sources":["../../../src/interfaces/TemporalStore.ts"],"names":[],"mappings":";;;AAAa,QAAA,kBAAkB,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/interfaces/interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TemporalClient = exports.TemporalConnection = void 0;
|
|
4
|
+
const di_1 = require("@tsed/di");
|
|
5
|
+
const client_1 = require("@temporalio/client");
|
|
6
|
+
const common_1 = require("@tsed/common");
|
|
7
|
+
exports.TemporalConnection = client_1.Connection;
|
|
8
|
+
exports.TemporalClient = client_1.Client;
|
|
9
|
+
(0, di_1.registerProvider)({
|
|
10
|
+
provide: exports.TemporalConnection,
|
|
11
|
+
deps: [di_1.Configuration, common_1.Logger],
|
|
12
|
+
async useAsyncFactory(settings, logger) {
|
|
13
|
+
const { temporal } = settings;
|
|
14
|
+
if (!temporal?.enabled) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
logger.info("Connecting to Temporal Server: ", temporal.connection?.address || "default");
|
|
19
|
+
const connection = await client_1.Connection.connect(temporal.connection);
|
|
20
|
+
logger.info("... connected to Temporal Server: ", temporal.connection?.address || "default");
|
|
21
|
+
return connection;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
logger.error("Failed to connect to Temporal Server:", error);
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
(0, di_1.registerProvider)({
|
|
30
|
+
provide: exports.TemporalClient,
|
|
31
|
+
deps: [di_1.Configuration, exports.TemporalConnection],
|
|
32
|
+
useFactory(settings, connection) {
|
|
33
|
+
const { temporal } = settings;
|
|
34
|
+
if (!temporal?.enabled) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const client = new exports.TemporalClient({
|
|
38
|
+
connection,
|
|
39
|
+
...temporal.client
|
|
40
|
+
});
|
|
41
|
+
return client;
|
|
42
|
+
},
|
|
43
|
+
hooks: {
|
|
44
|
+
$onDestroy: async (client) => {
|
|
45
|
+
if (client) {
|
|
46
|
+
await client.connection.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=TemporalFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemporalFactory.js","sourceRoot":"","sources":["../../../src/services/TemporalFactory.ts"],"names":[],"mappings":";;;AAAA,iCAAyD;AACzD,+CAAsD;AACtD,yCAAoC;AAEvB,QAAA,kBAAkB,GAAG,mBAAU,CAAC;AAGhC,QAAA,cAAc,GAAG,eAAM,CAAC;AAGrC,IAAA,qBAAgB,EAAC;IACf,OAAO,EAAE,0BAAkB;IAC3B,IAAI,EAAE,CAAC,kBAAa,EAAE,eAAM,CAAC;IAC7B,KAAK,CAAC,eAAe,CAAC,QAAuB,EAAE,MAAc;QAC3D,MAAM,EAAC,QAAQ,EAAC,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE;YACtB,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YACF,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;YAC1F,MAAM,UAAU,GAAG,MAAM,mBAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;YAC7F,OAAO,UAAU,CAAC;SACnB;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM,KAAK,CAAC;SACb;IACH,CAAC;CACF,CAAC,CAAC;AAEH,IAAA,qBAAgB,EAAC;IACf,OAAO,EAAE,sBAAc;IACvB,IAAI,EAAE,CAAC,kBAAa,EAAE,0BAAkB,CAAC;IACzC,UAAU,CAAC,QAAuB,EAAE,UAA8B;QAChE,MAAM,EAAC,QAAQ,EAAC,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE;YACtB,OAAO,IAAI,CAAC;SACb;QAED,MAAM,MAAM,GAAG,IAAI,sBAAc,CAAC;YAChC,UAAU;YACV,GAAG,QAAQ,CAAC,MAAM;SACnB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,KAAK,EAAE;QACL,UAAU,EAAE,KAAK,EAAE,MAAqB,EAAE,EAAE;YAC1C,IAAI,MAAM,EAAE;gBACV,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;aACjC;QACH,CAAC;KACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bootstrapWorker = void 0;
|
|
4
|
+
const common_1 = require("@tsed/common");
|
|
5
|
+
const logger_1 = require("@tsed/logger");
|
|
6
|
+
const worker_1 = require("@temporalio/worker");
|
|
7
|
+
const TemporalModule_1 = require("../TemporalModule");
|
|
8
|
+
async function bootstrapWorker(mod, settings) {
|
|
9
|
+
await common_1.PlatformTest.bootstrap(mod, settings.platform)();
|
|
10
|
+
const temporalioModule = common_1.PlatformTest.get(TemporalModule_1.TemporalModule);
|
|
11
|
+
const activities = temporalioModule.getActivities();
|
|
12
|
+
logger_1.$log.info('Starting temporal worker with queue "%s" and activities:', settings.worker.taskQueue);
|
|
13
|
+
if (Object.keys(activities).length > 0) {
|
|
14
|
+
logger_1.$log.printTable(Object.entries(activities).map((x) => ({
|
|
15
|
+
name: x[0],
|
|
16
|
+
activity: x[1].toString()
|
|
17
|
+
})));
|
|
18
|
+
}
|
|
19
|
+
let connection;
|
|
20
|
+
if (settings.connection instanceof worker_1.NativeConnection) {
|
|
21
|
+
connection = settings.connection;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
logger_1.$log.info("Connecting to Temporal Server: ", settings.connection?.address || "default");
|
|
25
|
+
connection = await worker_1.NativeConnection.connect(settings.connection);
|
|
26
|
+
}
|
|
27
|
+
const worker = await worker_1.Worker.create({
|
|
28
|
+
connection,
|
|
29
|
+
...settings.worker,
|
|
30
|
+
activities
|
|
31
|
+
});
|
|
32
|
+
return worker;
|
|
33
|
+
}
|
|
34
|
+
exports.bootstrapWorker = bootstrapWorker;
|
|
35
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/utils/worker.ts"],"names":[],"mappings":";;;AAAA,yCAAmE;AACnE,yCAAkC;AAElC,+CAAoG;AACpG,sDAAiD;AAQ1C,KAAK,UAAU,eAAe,CAAC,GAAQ,EAAE,QAAgC;IAC9E,MAAM,qBAAY,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvD,MAAM,gBAAgB,GAAG,qBAAY,CAAC,GAAG,CAAiB,+BAAc,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,gBAAgB,CAAC,aAAa,EAAE,CAAC;IACpD,aAAI,CAAC,IAAI,CAAC,0DAA0D,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEjG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QACtC,aAAI,CAAC,UAAU,CACb,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACV,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAC,CACJ,CAAC;KACH;IAED,IAAI,UAA4B,CAAC;IACjC,IAAI,QAAQ,CAAC,UAAU,YAAY,yBAAgB,EAAE;QACnD,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;KAClC;SAAM;QACL,aAAI,CAAC,IAAI,CAAC,iCAAiC,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;QACxF,UAAU,GAAG,MAAM,yBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAClE;IAED,MAAM,MAAM,GAAG,MAAM,eAAM,CAAC,MAAM,CAAC;QACjC,UAAU;QACV,GAAG,QAAQ,CAAC,MAAM;QAClB,UAAU;KACX,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AA9BD,0CA8BC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { __decorate, __metadata, __param } from "tslib";
|
|
2
|
+
import { classOf } from "@tsed/core";
|
|
3
|
+
import { Logger } from "@tsed/common";
|
|
4
|
+
import { Inject, InjectorService, Module } from "@tsed/di";
|
|
5
|
+
import { PROVIDER_TYPE_TEMPORAL } from "./constants.js";
|
|
6
|
+
import { TEMPORAL_STORE_KEY } from "./interfaces/TemporalStore.js";
|
|
7
|
+
import { TemporalClient } from "./services/TemporalFactory.js";
|
|
8
|
+
let TemporalModule = class TemporalModule {
|
|
9
|
+
temporalServices;
|
|
10
|
+
logger;
|
|
11
|
+
injector;
|
|
12
|
+
client;
|
|
13
|
+
constructor(temporalServices) {
|
|
14
|
+
this.temporalServices = temporalServices;
|
|
15
|
+
}
|
|
16
|
+
getActivities() {
|
|
17
|
+
return this.temporalServices.reduce((activities, instance) => Object.assign(activities, this.getActivitiesFromInstance(instance)), {});
|
|
18
|
+
}
|
|
19
|
+
getActivitiesFromInstance(instance) {
|
|
20
|
+
const provider = this.injector.getProvider(classOf(instance));
|
|
21
|
+
const store = provider.store.get(TEMPORAL_STORE_KEY, {});
|
|
22
|
+
return Object.entries(store.activities || {}).reduce((activities, [propertyKey, { name }]) => {
|
|
23
|
+
const jobProcessor = instance[propertyKey].bind(instance);
|
|
24
|
+
const jobName = name || propertyKey;
|
|
25
|
+
return {
|
|
26
|
+
...activities,
|
|
27
|
+
[jobName]: jobProcessor
|
|
28
|
+
};
|
|
29
|
+
}, {});
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
__decorate([
|
|
33
|
+
Inject(),
|
|
34
|
+
__metadata("design:type", Logger)
|
|
35
|
+
], TemporalModule.prototype, "logger", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
Inject(),
|
|
38
|
+
__metadata("design:type", InjectorService)
|
|
39
|
+
], TemporalModule.prototype, "injector", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
Inject(),
|
|
42
|
+
__metadata("design:type", TemporalClient)
|
|
43
|
+
], TemporalModule.prototype, "client", void 0);
|
|
44
|
+
TemporalModule = __decorate([
|
|
45
|
+
Module(),
|
|
46
|
+
__param(0, Inject(PROVIDER_TYPE_TEMPORAL)),
|
|
47
|
+
__metadata("design:paramtypes", [Array])
|
|
48
|
+
], TemporalModule);
|
|
49
|
+
export { TemporalModule };
|
|
50
|
+
//# sourceMappingURL=TemporalModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemporalModule.js","sourceRoot":"","sources":["../../src/TemporalModule.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAC;AACnC,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACpC,OAAO,EAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAW,MAAM,UAAU,CAAC;AACnE,OAAO,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AACnD,OAAO,EAAgB,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAC,cAAc,EAAC,MAAM,4BAA4B,CAAC;AAGnD,IAAM,cAAc,GAApB,MAAM,cAAc;IAU2B;IAR1C,MAAM,CAAU;IAGhB,QAAQ,CAAmB;IAG3B,MAAM,CAAkB;IAElC,YAAoD,gBAAuB;QAAvB,qBAAgB,GAAhB,gBAAgB,CAAO;IAAG,CAAC;IAExE,aAAa;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzI,CAAC;IAES,yBAAyB,CAAC,QAAa;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAgB,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAExE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,EAAC,IAAI,EAAC,CAAC,EAAE,EAAE;YACzF,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,IAAI,WAAW,CAAC;YAEpC,OAAO;gBACL,GAAG,UAAU;gBACb,CAAC,OAAO,CAAC,EAAE,YAAY;aACxB,CAAC;QACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;CACF,CAAA;AA7BC;IAAC,MAAM,EAAE;8BACU,MAAM;8CAAC;AAE1B;IAAC,MAAM,EAAE;8BACY,eAAe;gDAAC;AAErC;IAAC,MAAM,EAAE;8BACU,cAAc;8CAAC;AARvB,cAAc;IAD1B,MAAM,EAAE;IAWM,WAAA,MAAM,CAAC,sBAAsB,CAAC,CAAA;;GAVhC,cAAc,CA8B1B;SA9BY,cAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Store } from "@tsed/core";
|
|
2
|
+
import { TEMPORAL_STORE_KEY } from "../interfaces/TemporalStore.js";
|
|
3
|
+
export function Activity(options = {}) {
|
|
4
|
+
return (target, propertyKey) => {
|
|
5
|
+
const store = {
|
|
6
|
+
activities: {
|
|
7
|
+
[propertyKey]: options
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
Store.from(target).merge(TEMPORAL_STORE_KEY, store);
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/decorators/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AACjC,OAAO,EAAiC,kBAAkB,EAAC,MAAM,6BAA6B,CAAC;AAE/F,MAAM,UAAU,QAAQ,CAAC,UAA2B,EAAE;IACpD,OAAO,CAAC,MAAW,EAAE,WAA4B,EAAE,EAAE;QACnD,MAAM,KAAK,GAAkB;YAC3B,UAAU,EAAE;gBACV,CAAC,WAAW,CAAC,EAAE,OAAO;aACvB;SACF,CAAC;QAEF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { useDecorators } from "@tsed/core";
|
|
2
|
+
import { Injectable } from "@tsed/di";
|
|
3
|
+
import { PROVIDER_TYPE_TEMPORAL } from "../constants.js";
|
|
4
|
+
export function Temporal() {
|
|
5
|
+
return useDecorators(Injectable({
|
|
6
|
+
type: PROVIDER_TYPE_TEMPORAL
|
|
7
|
+
}));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=temporal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.js","sourceRoot":"","sources":["../../../src/decorators/temporal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AACzC,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AACpC,OAAO,EAAC,sBAAsB,EAAC,MAAM,cAAc,CAAC;AAEpD,MAAM,UAAU,QAAQ;IACtB,OAAO,aAAa,CAClB,UAAU,CAAC;QACT,IAAI,EAAE,sBAAsB;KAC7B,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Automatically generated by barrelsby.
|
|
3
|
+
*/
|
|
4
|
+
export * from "./TemporalModule.js";
|
|
5
|
+
export * from "./constants.js";
|
|
6
|
+
export * from "./decorators/activity.js";
|
|
7
|
+
export * from "./decorators/temporal.js";
|
|
8
|
+
export * from "./interfaces/TemporalStore.js";
|
|
9
|
+
export * from "./interfaces/interfaces.js";
|
|
10
|
+
export * from "./services/TemporalFactory.js";
|
|
11
|
+
export * from "./utils/worker.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemporalStore.js","sourceRoot":"","sources":["../../../src/interfaces/TemporalStore.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/interfaces/interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Configuration, registerProvider } from "@tsed/di";
|
|
2
|
+
import { Client, Connection } from "@temporalio/client";
|
|
3
|
+
import { Logger } from "@tsed/common";
|
|
4
|
+
export const TemporalConnection = Connection;
|
|
5
|
+
export const TemporalClient = Client;
|
|
6
|
+
registerProvider({
|
|
7
|
+
provide: TemporalConnection,
|
|
8
|
+
deps: [Configuration, Logger],
|
|
9
|
+
async useAsyncFactory(settings, logger) {
|
|
10
|
+
const { temporal } = settings;
|
|
11
|
+
if (!temporal?.enabled) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
logger.info("Connecting to Temporal Server: ", temporal.connection?.address || "default");
|
|
16
|
+
const connection = await Connection.connect(temporal.connection);
|
|
17
|
+
logger.info("... connected to Temporal Server: ", temporal.connection?.address || "default");
|
|
18
|
+
return connection;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
logger.error("Failed to connect to Temporal Server:", error);
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
registerProvider({
|
|
27
|
+
provide: TemporalClient,
|
|
28
|
+
deps: [Configuration, TemporalConnection],
|
|
29
|
+
useFactory(settings, connection) {
|
|
30
|
+
const { temporal } = settings;
|
|
31
|
+
if (!temporal?.enabled) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const client = new TemporalClient({
|
|
35
|
+
connection,
|
|
36
|
+
...temporal.client
|
|
37
|
+
});
|
|
38
|
+
return client;
|
|
39
|
+
},
|
|
40
|
+
hooks: {
|
|
41
|
+
$onDestroy: async (client) => {
|
|
42
|
+
if (client) {
|
|
43
|
+
await client.connection.close();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=TemporalFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemporalFactory.js","sourceRoot":"","sources":["../../../src/services/TemporalFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,gBAAgB,EAAC,MAAM,UAAU,CAAC;AACzD,OAAO,EAAC,MAAM,EAAE,UAAU,EAAC,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAEpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAG7C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAGrC,gBAAgB,CAAC;IACf,OAAO,EAAE,kBAAkB;IAC3B,IAAI,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,eAAe,CAAC,QAAuB,EAAE,MAAc;QAC3D,MAAM,EAAC,QAAQ,EAAC,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE;YACtB,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YACF,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;YAC1F,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;YAC7F,OAAO,UAAU,CAAC;SACnB;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM,KAAK,CAAC;SACb;IACH,CAAC;CACF,CAAC,CAAC;AAEH,gBAAgB,CAAC;IACf,OAAO,EAAE,cAAc;IACvB,IAAI,EAAE,CAAC,aAAa,EAAE,kBAAkB,CAAC;IACzC,UAAU,CAAC,QAAuB,EAAE,UAA8B;QAChE,MAAM,EAAC,QAAQ,EAAC,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE;YACtB,OAAO,IAAI,CAAC;SACb;QAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;YAChC,UAAU;YACV,GAAG,QAAQ,CAAC,MAAM;SACnB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,KAAK,EAAE;QACL,UAAU,EAAE,KAAK,EAAE,MAAqB,EAAE,EAAE;YAC1C,IAAI,MAAM,EAAE;gBACV,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;aACjC;QACH,CAAC;KACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { PlatformTest } from "@tsed/common";
|
|
2
|
+
import { $log } from "@tsed/logger";
|
|
3
|
+
import { NativeConnection, Worker } from "@temporalio/worker";
|
|
4
|
+
import { TemporalModule } from "../TemporalModule.js";
|
|
5
|
+
export async function bootstrapWorker(mod, settings) {
|
|
6
|
+
await PlatformTest.bootstrap(mod, settings.platform)();
|
|
7
|
+
const temporalioModule = PlatformTest.get(TemporalModule);
|
|
8
|
+
const activities = temporalioModule.getActivities();
|
|
9
|
+
$log.info('Starting temporal worker with queue "%s" and activities:', settings.worker.taskQueue);
|
|
10
|
+
if (Object.keys(activities).length > 0) {
|
|
11
|
+
$log.printTable(Object.entries(activities).map((x) => ({
|
|
12
|
+
name: x[0],
|
|
13
|
+
activity: x[1].toString()
|
|
14
|
+
})));
|
|
15
|
+
}
|
|
16
|
+
let connection;
|
|
17
|
+
if (settings.connection instanceof NativeConnection) {
|
|
18
|
+
connection = settings.connection;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
$log.info("Connecting to Temporal Server: ", settings.connection?.address || "default");
|
|
22
|
+
connection = await NativeConnection.connect(settings.connection);
|
|
23
|
+
}
|
|
24
|
+
const worker = await Worker.create({
|
|
25
|
+
connection,
|
|
26
|
+
...settings.worker,
|
|
27
|
+
activities
|
|
28
|
+
});
|
|
29
|
+
return worker;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/utils/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,YAAY,EAAC,MAAM,cAAc,CAAC;AACnE,OAAO,EAAC,IAAI,EAAC,MAAM,cAAc,CAAC;AAElC,OAAO,EAAC,gBAAgB,EAA2B,MAAM,EAAgB,MAAM,oBAAoB,CAAC;AACpG,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAQjD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAQ,EAAE,QAAgC;IAC9E,MAAM,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvD,MAAM,gBAAgB,GAAG,YAAY,CAAC,GAAG,CAAiB,cAAc,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,gBAAgB,CAAC,aAAa,EAAE,CAAC;IACpD,IAAI,CAAC,IAAI,CAAC,0DAA0D,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEjG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QACtC,IAAI,CAAC,UAAU,CACb,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACV,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAC,CACJ,CAAC;KACH;IAED,IAAI,UAA4B,CAAC;IACjC,IAAI,QAAQ,CAAC,UAAU,YAAY,gBAAgB,EAAE;QACnD,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;KAClC;SAAM;QACL,IAAI,CAAC,IAAI,CAAC,iCAAiC,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;QACxF,UAAU,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAClE;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;QACjC,UAAU;QACV,GAAG,QAAQ,CAAC,MAAM;QAClB,UAAU;KACX,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|