@lyxa.ai/core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/index.d.ts +8 -0
  2. package/dist/index.js +72 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/libraries/configuration/index.d.ts +23 -0
  5. package/dist/libraries/configuration/index.js +57 -0
  6. package/dist/libraries/configuration/index.js.map +1 -0
  7. package/dist/libraries/configuration/types/EnvironmentConfigurationType.d.ts +6 -0
  8. package/dist/libraries/configuration/types/EnvironmentConfigurationType.js +11 -0
  9. package/dist/libraries/configuration/types/EnvironmentConfigurationType.js.map +1 -0
  10. package/dist/libraries/dispatcher/index.d.ts +7 -0
  11. package/dist/libraries/dispatcher/index.js +35 -0
  12. package/dist/libraries/dispatcher/index.js.map +1 -0
  13. package/dist/libraries/event/BaseEvent.d.ts +7 -0
  14. package/dist/libraries/event/BaseEvent.js +19 -0
  15. package/dist/libraries/event/BaseEvent.js.map +1 -0
  16. package/dist/libraries/event/decorators/metadata.d.ts +13 -0
  17. package/dist/libraries/event/decorators/metadata.js +20 -0
  18. package/dist/libraries/event/decorators/metadata.js.map +1 -0
  19. package/dist/libraries/event/decorators/subscribe.d.ts +1 -0
  20. package/dist/libraries/event/decorators/subscribe.js +10 -0
  21. package/dist/libraries/event/decorators/subscribe.js.map +1 -0
  22. package/dist/libraries/event/index.d.ts +4 -0
  23. package/dist/libraries/event/index.js +51 -0
  24. package/dist/libraries/event/index.js.map +1 -0
  25. package/dist/libraries/event/registry/SubscriptionRegistry.d.ts +11 -0
  26. package/dist/libraries/event/registry/SubscriptionRegistry.js +18 -0
  27. package/dist/libraries/event/registry/SubscriptionRegistry.js.map +1 -0
  28. package/dist/libraries/index.d.ts +14 -0
  29. package/dist/libraries/index.js +41 -0
  30. package/dist/libraries/index.js.map +1 -0
  31. package/dist/libraries/logger/index.d.ts +6 -0
  32. package/dist/libraries/logger/index.js +58 -0
  33. package/dist/libraries/logger/index.js.map +1 -0
  34. package/dist/libraries/mongo/index.d.ts +6 -0
  35. package/dist/libraries/mongo/index.js +32 -0
  36. package/dist/libraries/mongo/index.js.map +1 -0
  37. package/dist/libraries/redis/index.d.ts +13 -0
  38. package/dist/libraries/redis/index.js +73 -0
  39. package/dist/libraries/redis/index.js.map +1 -0
  40. package/dist/libraries/secrets/index.d.ts +10 -0
  41. package/dist/libraries/secrets/index.js +59 -0
  42. package/dist/libraries/secrets/index.js.map +1 -0
  43. package/dist/libraries/twilio/index.d.ts +6 -0
  44. package/dist/libraries/twilio/index.js +43 -0
  45. package/dist/libraries/twilio/index.js.map +1 -0
  46. package/package.json +38 -0
@@ -0,0 +1,8 @@
1
+ import { LibraryManager } from "./libraries";
2
+ import { ConfigurationOptions } from "./libraries/configuration";
3
+ export { ConfigurationOptions } from "./libraries/configuration";
4
+ export { EnvironmentConfigurationType } from "./libraries/configuration/types/EnvironmentConfigurationType";
5
+ export { initGlobalConnection, createGlobalModel, createGlobalDiscriminatorModel } from './libraries/mongo';
6
+ export declare function bootstrapCore(options?: ConfigurationOptions): Promise<void>;
7
+ export declare function registerLibraries(options?: ConfigurationOptions): Promise<void>;
8
+ export declare function getLibraries(): LibraryManager;
package/dist/index.js ADDED
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createGlobalDiscriminatorModel = exports.createGlobalModel = exports.initGlobalConnection = exports.EnvironmentConfigurationType = void 0;
7
+ exports.bootstrapCore = bootstrapCore;
8
+ exports.registerLibraries = registerLibraries;
9
+ exports.getLibraries = getLibraries;
10
+ const libraries_1 = require("./libraries");
11
+ const typedi_1 = require("typedi");
12
+ const mongoose_1 = __importDefault(require("mongoose"));
13
+ const configuration_1 = require("./libraries/configuration");
14
+ const EnvironmentConfigurationType_1 = require("./libraries/configuration/types/EnvironmentConfigurationType");
15
+ const logger_1 = require("./libraries/logger");
16
+ const redis_1 = require("./libraries/redis");
17
+ const event_1 = require("./libraries/event");
18
+ const SubscriptionRegistry_1 = require("./libraries/event/registry/SubscriptionRegistry");
19
+ const mongo_1 = require("./libraries/mongo");
20
+ var EnvironmentConfigurationType_2 = require("./libraries/configuration/types/EnvironmentConfigurationType");
21
+ Object.defineProperty(exports, "EnvironmentConfigurationType", { enumerable: true, get: function () { return EnvironmentConfigurationType_2.EnvironmentConfigurationType; } });
22
+ var mongo_2 = require("./libraries/mongo");
23
+ Object.defineProperty(exports, "initGlobalConnection", { enumerable: true, get: function () { return mongo_2.initGlobalConnection; } });
24
+ Object.defineProperty(exports, "createGlobalModel", { enumerable: true, get: function () { return mongo_2.createGlobalModel; } });
25
+ Object.defineProperty(exports, "createGlobalDiscriminatorModel", { enumerable: true, get: function () { return mongo_2.createGlobalDiscriminatorModel; } });
26
+ async function bootstrapCore(options) {
27
+ try {
28
+ await registerLibraries(options);
29
+ const gracefulShutdown = async () => {
30
+ getLibraries().getLogger().logger.info('Received shutdown signal, shutting down gracefully...');
31
+ };
32
+ process.on('SIGTERM', gracefulShutdown);
33
+ process.on('SIGINT', gracefulShutdown);
34
+ process.on('uncaughtException', (err) => {
35
+ getLibraries().getLogger().logger.error('Uncaught exception, shutting down...', err);
36
+ gracefulShutdown();
37
+ });
38
+ }
39
+ catch (e) {
40
+ console.error(e);
41
+ }
42
+ }
43
+ async function registerLibraries(options) {
44
+ const configurationInstance = new configuration_1.ConfigurationService(options);
45
+ typedi_1.Container.set(configuration_1.ConfigurationService, configurationInstance);
46
+ const redisInstance = new redis_1.RedisService(configurationInstance.options.redisURL);
47
+ typedi_1.Container.set(redis_1.RedisService, redisInstance);
48
+ const mongoUrl = await getLibraries().getSecretsService()
49
+ .getKey("MONGO_URL");
50
+ await mongoose_1.default.connect(mongoUrl, { dbName: `lyxa-${options.tenet}` });
51
+ mongoose_1.default.set('debug', getLibraries().getConfigurationService().options.environment == EnvironmentConfigurationType_1.EnvironmentConfigurationType.DEV);
52
+ await (0, mongo_1.initGlobalConnection)(mongoUrl);
53
+ const loggerInstance = new logger_1.LyxaLogger(options.instanceType, mongoUrl);
54
+ typedi_1.Container.set(logger_1.LyxaLogger, loggerInstance);
55
+ await (0, event_1.initEventBus)("amqp://localhost");
56
+ const allSubscriptions = SubscriptionRegistry_1.SubscriptionRegistry.getAllSubscriptions();
57
+ const instantiatedServices = new Map();
58
+ for (const { eventId, targetConstructor, methodName } of allSubscriptions) {
59
+ let instance = instantiatedServices.get(targetConstructor);
60
+ if (!instance) {
61
+ instance = typedi_1.Container.get(targetConstructor);
62
+ instantiatedServices.set(targetConstructor, instance);
63
+ }
64
+ await (0, event_1.subscribeToEvent)(eventId, async (payload) => {
65
+ return instance[methodName](payload);
66
+ });
67
+ }
68
+ }
69
+ function getLibraries() {
70
+ return typedi_1.Container.get(libraries_1.LibraryManager);
71
+ }
72
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":";;;;;;AAmBA,sCAiBC;AACD,8CAqCC;AAED,oCAEC;AA9ED,2CAA2C;AAC3C,mCAAiC;AACjC,wDAAgC;AAChC,6DAAqF;AACrF,+GAA0G;AAC1G,+CAA8C;AAC9C,6CAA+C;AAC/C,6CAAiE;AACjE,0FAAqF;AACrF,6CAAuD;AAGvD,6GAA4G;AAAnG,4IAAA,4BAA4B,OAAA;AACrC,2CAI2B;AAHvB,6GAAA,oBAAoB,OAAA;AACpB,0GAAA,iBAAiB,OAAA;AACjB,uHAAA,8BAA8B,OAAA;AAG3B,KAAK,UAAU,aAAa,CAAC,OAA8B;IAC9D,IAAI,CAAC;QACD,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;YAChC,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACpG,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACxC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACvC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;YACpC,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;YACrF,gBAAgB,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;AACL,CAAC;AACM,KAAK,UAAU,iBAAiB,CAAC,OAA8B;IAElE,MAAM,qBAAqB,GAAG,IAAI,oCAAoB,CAAC,OAAO,CAAC,CAAC;IAChE,kBAAS,CAAC,GAAG,CAAC,oCAAoB,EAAE,qBAAqB,CAAC,CAAC;IAG3D,MAAM,aAAa,GAAG,IAAI,oBAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,QAAS,CAAC,CAAC;IAChF,kBAAS,CAAC,GAAG,CAAC,oBAAY,EAAE,aAAa,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC,iBAAiB,EAAE;SACpD,MAAM,CAAC,WAAW,CAAC,CAAC;IAEzB,MAAM,kBAAQ,CAAC,OAAO,CAAC,QAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,OAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxE,kBAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,uBAAuB,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,2DAA4B,CAAC,GAAG,CAAC,CAAC;IAExH,MAAM,IAAA,4BAAoB,EAAC,QAAS,CAAC,CAAC;IAEtC,MAAM,cAAc,GAAG,IAAI,mBAAU,CAAC,OAAQ,CAAC,YAAa,EAAE,QAAS,CAAC,CAAC;IACzE,kBAAS,CAAC,GAAG,CAAC,mBAAU,EAAE,cAAc,CAAC,CAAC;IAG1C,MAAM,IAAA,oBAAY,EAAC,kBAAkB,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,2CAAoB,CAAC,mBAAmB,EAAE,CAAC;IAEpE,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAiB,CAAC;IAEtD,KAAK,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,IAAI,gBAAgB,EAAE,CAAC;QACxE,IAAI,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,QAAQ,GAAG,kBAAS,CAAC,GAAG,CAAC,iBAAwB,CAAC,CAAC;YACnD,oBAAoB,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,IAAA,wBAAgB,EAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC9C,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,SAAgB,YAAY;IACxB,OAAO,kBAAS,CAAC,GAAG,CAAC,0BAAc,CAAC,CAAA;AACxC,CAAC","sourcesContent":["import {LibraryManager} from \"./libraries\";\r\nimport {Container} from \"typedi\";\r\nimport mongoose from \"mongoose\";\r\nimport {ConfigurationOptions, ConfigurationService} from \"./libraries/configuration\";\r\nimport {EnvironmentConfigurationType} from \"./libraries/configuration/types/EnvironmentConfigurationType\";\r\nimport {LyxaLogger} from \"./libraries/logger\";\r\nimport {RedisService} from \"./libraries/redis\";\r\nimport {initEventBus, subscribeToEvent} from \"./libraries/event\";\r\nimport {SubscriptionRegistry} from \"./libraries/event/registry/SubscriptionRegistry\";\r\nimport {initGlobalConnection} from \"./libraries/mongo\";\r\n\r\nexport { ConfigurationOptions } from \"./libraries/configuration\";\r\nexport { EnvironmentConfigurationType } from \"./libraries/configuration/types/EnvironmentConfigurationType\";\r\nexport {\r\n initGlobalConnection,\r\n createGlobalModel,\r\n createGlobalDiscriminatorModel\r\n} from './libraries/mongo';\r\n\r\nexport async function bootstrapCore(options?: ConfigurationOptions) {\r\n try {\r\n await registerLibraries(options);\r\n\r\n const gracefulShutdown = async () => {\r\n getLibraries().getLogger().logger.info('Received shutdown signal, shutting down gracefully...');\r\n };\r\n\r\n process.on('SIGTERM', gracefulShutdown);\r\n process.on('SIGINT', gracefulShutdown);\r\n process.on('uncaughtException', (err) => {\r\n getLibraries().getLogger().logger.error('Uncaught exception, shutting down...', err);\r\n gracefulShutdown();\r\n });\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n}\r\nexport async function registerLibraries(options?: ConfigurationOptions) {\r\n // Setup configuration.\r\n const configurationInstance = new ConfigurationService(options);\r\n Container.set(ConfigurationService, configurationInstance);\r\n\r\n // Setup redis.\r\n const redisInstance = new RedisService(configurationInstance.options.redisURL!);\r\n Container.set(RedisService, redisInstance);\r\n\r\n const mongoUrl = await getLibraries().getSecretsService()\r\n .getKey(\"MONGO_URL\");\r\n\r\n await mongoose.connect(mongoUrl!, { dbName: `lyxa-${options!.tenet}` });\r\n mongoose.set('debug', getLibraries().getConfigurationService().options.environment == EnvironmentConfigurationType.DEV);\r\n\r\n await initGlobalConnection(mongoUrl!);\r\n\r\n const loggerInstance = new LyxaLogger(options!.instanceType!, mongoUrl!);\r\n Container.set(LyxaLogger, loggerInstance);\r\n\r\n // Load subscriptions.\r\n await initEventBus(\"amqp://localhost\");\r\n const allSubscriptions = SubscriptionRegistry.getAllSubscriptions();\r\n\r\n const instantiatedServices = new Map<Function, any>();\r\n\r\n for (const { eventId, targetConstructor, methodName } of allSubscriptions) {\r\n let instance = instantiatedServices.get(targetConstructor);\r\n if (!instance) {\r\n instance = Container.get(targetConstructor as any);\r\n instantiatedServices.set(targetConstructor, instance);\r\n }\r\n\r\n await subscribeToEvent(eventId, async (payload) => {\r\n return instance[methodName](payload);\r\n });\r\n }\r\n}\r\n\r\nexport function getLibraries(): LibraryManager {\r\n return Container.get(LibraryManager)\r\n}\r\n"]}
@@ -0,0 +1,23 @@
1
+ import { FirebaseOptions } from "firebase/app";
2
+ import { ServiceAccount } from "firebase-admin";
3
+ import { EnvironmentConfigurationType } from "./types/EnvironmentConfigurationType";
4
+ export interface ConfigurationOptions {
5
+ tenet?: string;
6
+ redisURL?: string;
7
+ instanceType?: string;
8
+ firebaseClient?: {
9
+ firebaseClientOptions: FirebaseOptions;
10
+ firebaseClientAppName?: string;
11
+ };
12
+ firebaseAdmin?: {
13
+ firebaseAdminServiceAccount: ServiceAccount;
14
+ firebaseAdminAppName?: string;
15
+ };
16
+ environment: EnvironmentConfigurationType;
17
+ }
18
+ export declare class ConfigurationService {
19
+ private readonly _defaultOptions;
20
+ private readonly _options;
21
+ constructor(options?: ConfigurationOptions);
22
+ get options(): ConfigurationOptions;
23
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ConfigurationService = void 0;
13
+ const typedi_1 = require("typedi");
14
+ const EnvironmentConfigurationType_1 = require("./types/EnvironmentConfigurationType");
15
+ let ConfigurationService = class ConfigurationService {
16
+ _defaultOptions = {
17
+ redisURL: "redis://localhost:6379",
18
+ tenet: "default",
19
+ instanceType: "unknown",
20
+ firebaseClient: {
21
+ firebaseClientOptions: {
22
+ apiKey: "",
23
+ authDomain: "",
24
+ databaseURL: "",
25
+ projectId: "",
26
+ storageBucket: "",
27
+ messagingSenderId: "",
28
+ appId: "",
29
+ measurementId: ""
30
+ }
31
+ },
32
+ firebaseAdmin: {
33
+ firebaseAdminServiceAccount: {
34
+ projectId: "",
35
+ privateKey: "",
36
+ clientEmail: ""
37
+ }
38
+ },
39
+ environment: EnvironmentConfigurationType_1.EnvironmentConfigurationType.DEV
40
+ };
41
+ _options;
42
+ constructor(options) {
43
+ this._options = {
44
+ ...this._defaultOptions,
45
+ ...options,
46
+ };
47
+ }
48
+ get options() {
49
+ return this._options;
50
+ }
51
+ };
52
+ exports.ConfigurationService = ConfigurationService;
53
+ exports.ConfigurationService = ConfigurationService = __decorate([
54
+ (0, typedi_1.Service)(),
55
+ __metadata("design:paramtypes", [Object])
56
+ ], ConfigurationService);
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/configuration/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,mCAA+B;AAC/B,uFAAkF;AAmB3E,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAEZ,eAAe,GAAyB;QACrD,QAAQ,EAAE,wBAAwB;QAClC,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,SAAS;QACvB,cAAc,EAAE;YACZ,qBAAqB,EAAE;gBACnB,MAAM,EAAE,EAAE;gBACV,UAAU,EAAE,EAAE;gBACd,WAAW,EAAE,EAAE;gBACf,SAAS,EAAE,EAAE;gBACb,aAAa,EAAE,EAAE;gBACjB,iBAAiB,EAAE,EAAE;gBACrB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,EAAE;aACpB;SACJ;QACD,aAAa,EAAE;YACX,2BAA2B,EAAE;gBACzB,SAAS,EAAE,EAAE;gBACb,UAAU,EAAE,EAAE;gBACd,WAAW,EAAE,EAAE;aAClB;SACJ;QACD,WAAW,EAAE,2DAA4B,CAAC,GAAG;KAChD,CAAC;IAEe,QAAQ,CAAuB;IAEhD,YAAY,OAA8B;QACtC,IAAI,CAAC,QAAQ,GAAG;YACZ,GAAG,IAAI,CAAC,eAAe;YACvB,GAAG,OAAO;SACb,CAAC;IACN,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;CACJ,CAAA;AAxCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,gBAAO,GAAE;;GACG,oBAAoB,CAwChC","sourcesContent":["import {FirebaseOptions} from \"firebase/app\";\r\nimport {ServiceAccount} from \"firebase-admin\";\r\nimport {Service} from \"typedi\";\r\nimport {EnvironmentConfigurationType} from \"./types/EnvironmentConfigurationType\";\r\n\r\nexport interface ConfigurationOptions {\r\n tenet?: string;\r\n redisURL?: string;\r\n instanceType?: string;\r\n firebaseClient?: {\r\n firebaseClientOptions: FirebaseOptions,\r\n firebaseClientAppName?: string,\r\n },\r\n firebaseAdmin?: {\r\n firebaseAdminServiceAccount: ServiceAccount,\r\n firebaseAdminAppName?: string,\r\n },\r\n environment: EnvironmentConfigurationType\r\n}\r\n\r\n\r\n@Service()\r\nexport class ConfigurationService {\r\n\r\n private readonly _defaultOptions: ConfigurationOptions = {\r\n redisURL: \"redis://localhost:6379\",\r\n tenet: \"default\",\r\n instanceType: \"unknown\",\r\n firebaseClient: {\r\n firebaseClientOptions: {\r\n apiKey: \"\",\r\n authDomain: \"\",\r\n databaseURL: \"\",\r\n projectId: \"\",\r\n storageBucket: \"\",\r\n messagingSenderId: \"\",\r\n appId: \"\",\r\n measurementId: \"\"\r\n }\r\n },\r\n firebaseAdmin: {\r\n firebaseAdminServiceAccount: {\r\n projectId: \"\",\r\n privateKey: \"\",\r\n clientEmail: \"\"\r\n }\r\n },\r\n environment: EnvironmentConfigurationType.DEV\r\n };\r\n\r\n private readonly _options: ConfigurationOptions;\r\n\r\n constructor(options?: ConfigurationOptions) {\r\n this._options = {\r\n ...this._defaultOptions,\r\n ...options,\r\n };\r\n }\r\n\r\n get options(): ConfigurationOptions {\r\n return this._options;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,6 @@
1
+ export declare enum EnvironmentConfigurationType {
2
+ MOCK = "MOCK",
3
+ DEV = "DEV",
4
+ PREPROD = "PREPROD",
5
+ PROD = "PROD"
6
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnvironmentConfigurationType = void 0;
4
+ var EnvironmentConfigurationType;
5
+ (function (EnvironmentConfigurationType) {
6
+ EnvironmentConfigurationType["MOCK"] = "MOCK";
7
+ EnvironmentConfigurationType["DEV"] = "DEV";
8
+ EnvironmentConfigurationType["PREPROD"] = "PREPROD";
9
+ EnvironmentConfigurationType["PROD"] = "PROD";
10
+ })(EnvironmentConfigurationType || (exports.EnvironmentConfigurationType = EnvironmentConfigurationType = {}));
11
+ //# sourceMappingURL=EnvironmentConfigurationType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnvironmentConfigurationType.js","sourceRoot":"/","sources":["libraries/configuration/types/EnvironmentConfigurationType.ts"],"names":[],"mappings":";;;AAAA,IAAY,4BAKX;AALD,WAAY,4BAA4B;IACpC,6CAAa,CAAA;IACb,2CAAW,CAAA;IACX,mDAAmB,CAAA;IACnB,6CAAa,CAAA;AACjB,CAAC,EALW,4BAA4B,4CAA5B,4BAA4B,QAKvC","sourcesContent":["export enum EnvironmentConfigurationType {\r\n MOCK = \"MOCK\",\r\n DEV = \"DEV\",\r\n PREPROD = \"PREPROD\",\r\n PROD = \"PROD\"\r\n}\r\n"]}
@@ -0,0 +1,7 @@
1
+ import { AnyRouter } from "@trpc/server";
2
+ import { SecretManagerService } from "../secrets";
3
+ export declare class MicroServiceDispatcher {
4
+ private _secretService;
5
+ MicroServiceDispatcher(secretService: SecretManagerService): void;
6
+ getMicroService<T extends AnyRouter>(serviceName: string): Promise<import("@trpc/client").CreateTRPCProxyClient<T>>;
7
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MicroServiceDispatcher = void 0;
10
+ const typedi_1 = require("typedi");
11
+ const client_1 = require("@trpc/client");
12
+ let MicroServiceDispatcher = class MicroServiceDispatcher {
13
+ _secretService;
14
+ MicroServiceDispatcher(secretService) {
15
+ this._secretService = secretService;
16
+ }
17
+ async getMicroService(serviceName) {
18
+ const deploymentURL = await this._secretService.getKey("DEPLOYMENTS_MICROSERVICE_" + serviceName.toUpperCase() + "_ENDPOINT");
19
+ if (!deploymentURL) {
20
+ throw new Error("The request service does not have a configure secret URL");
21
+ }
22
+ return (0, client_1.createTRPCProxyClient)({
23
+ links: [
24
+ (0, client_1.httpBatchLink)({
25
+ url: deploymentURL,
26
+ }),
27
+ ],
28
+ });
29
+ }
30
+ };
31
+ exports.MicroServiceDispatcher = MicroServiceDispatcher;
32
+ exports.MicroServiceDispatcher = MicroServiceDispatcher = __decorate([
33
+ (0, typedi_1.Service)()
34
+ ], MicroServiceDispatcher);
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/dispatcher/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,mCAA+B;AAC/B,yCAAkE;AAK3D,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACvB,cAAc,CAAwB;IAEvC,sBAAsB,CAAC,aAAmC;QAC7D,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,eAAe,CAAsB,WAAmB;QACjE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,2BAA2B,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC,CAAC;QAE9H,IAAG,CAAC,aAAa,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAChF,CAAC;QAGD,OAAO,IAAA,8BAAqB,EAAI;YAC5B,KAAK,EAAE;gBACH,IAAA,sBAAa,EAAC;oBACV,GAAG,EAAE,aAAa;iBACrB,CAAC;aACL;SACJ,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AAvBY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,gBAAO,GAAE;GACG,sBAAsB,CAuBlC","sourcesContent":["import {Service} from \"typedi\";\r\nimport {createTRPCProxyClient, httpBatchLink} from \"@trpc/client\";\r\nimport {AnyRouter} from \"@trpc/server\";\r\nimport {SecretManagerService} from \"../secrets\";\r\n\r\n@Service()\r\nexport class MicroServiceDispatcher {\r\n private _secretService!: SecretManagerService;\r\n\r\n public MicroServiceDispatcher(secretService: SecretManagerService) {\r\n this._secretService = secretService;\r\n }\r\n\r\n public async getMicroService<T extends AnyRouter>(serviceName: string) {\r\n const deploymentURL = await this._secretService.getKey(\"DEPLOYMENTS_MICROSERVICE_\" + serviceName.toUpperCase() + \"_ENDPOINT\");\r\n\r\n if(!deploymentURL) {\r\n throw new Error(\"The request service does not have a configure secret URL\");\r\n }\r\n\r\n // @ts-ignore\r\n return createTRPCProxyClient<T>({\r\n links: [\r\n httpBatchLink({\r\n url: deploymentURL,\r\n }),\r\n ],\r\n });\r\n }\r\n}\r\n"]}
@@ -0,0 +1,7 @@
1
+ export declare abstract class BaseEvent<TPayload extends Record<string, unknown>> {
2
+ private readonly _eventId;
3
+ private readonly _payload;
4
+ protected constructor(eventId: string, payload: TPayload);
5
+ get eventId(): string;
6
+ get payload(): TPayload;
7
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseEvent = void 0;
4
+ class BaseEvent {
5
+ _eventId;
6
+ _payload;
7
+ constructor(eventId, payload) {
8
+ this._eventId = eventId;
9
+ this._payload = payload;
10
+ }
11
+ get eventId() {
12
+ return this._eventId;
13
+ }
14
+ get payload() {
15
+ return this._payload;
16
+ }
17
+ }
18
+ exports.BaseEvent = BaseEvent;
19
+ //# sourceMappingURL=BaseEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseEvent.js","sourceRoot":"/","sources":["libraries/event/BaseEvent.ts"],"names":[],"mappings":";;;AAAA,MAAsB,SAAS;IACV,QAAQ,CAAS;IACjB,QAAQ,CAAW;IAEpC,YAAsB,OAAe,EAAE,OAAiB;QACpD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;CACJ;AAhBD,8BAgBC","sourcesContent":["export abstract class BaseEvent<TPayload extends Record<string, unknown>> {\r\n private readonly _eventId: string;\r\n private readonly _payload: TPayload;\r\n\r\n protected constructor(eventId: string, payload: TPayload) {\r\n this._eventId = eventId;\r\n this._payload = payload;\r\n }\r\n\r\n get eventId(): string {\r\n return this._eventId;\r\n }\r\n\r\n get payload(): TPayload {\r\n return this._payload;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,13 @@
1
+ import { BaseEvent } from "../BaseEvent";
2
+ export interface EventParameter {
3
+ name: string;
4
+ type: string;
5
+ }
6
+ export declare class EventRegistry {
7
+ private static eventsMetadata;
8
+ static registerMetadata(eventId: string, metadata: EventParameter[]): void;
9
+ static getMetadata(eventId: string): EventParameter[] | undefined;
10
+ }
11
+ export declare function EventMetadata(eventId: string, parameters?: EventParameter[]): <T extends {
12
+ new (...args: any[]): BaseEvent<any>;
13
+ }>(constructor: T) => void;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventRegistry = void 0;
4
+ exports.EventMetadata = EventMetadata;
5
+ class EventRegistry {
6
+ static eventsMetadata = {};
7
+ static registerMetadata(eventId, metadata) {
8
+ EventRegistry.eventsMetadata[eventId] = metadata;
9
+ }
10
+ static getMetadata(eventId) {
11
+ return EventRegistry.eventsMetadata[eventId];
12
+ }
13
+ }
14
+ exports.EventRegistry = EventRegistry;
15
+ function EventMetadata(eventId, parameters = []) {
16
+ return function (constructor) {
17
+ EventRegistry.registerMetadata(eventId, parameters);
18
+ };
19
+ }
20
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"/","sources":["libraries/event/decorators/metadata.ts"],"names":[],"mappings":";;;AA6BA,sCASC;AA/BD,MAAa,aAAa;IAEd,MAAM,CAAC,cAAc,GAAqC,EAAE,CAAC;IAE9D,MAAM,CAAC,gBAAgB,CAC1B,OAAe,EACf,QAA0B;QAE1B,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;IACrD,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,OAAe;QACrC,OAAO,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;;AAbL,sCAcC;AAQD,SAAgB,aAAa,CACzB,OAAe,EACf,aAA+B,EAAE;IAEjC,OAAO,UACH,WAAc;QAEd,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC;AACN,CAAC","sourcesContent":["import { BaseEvent } from \"../BaseEvent\";\r\n\r\nexport interface EventParameter {\r\n name: string;\r\n type: string;\r\n}\r\n\r\nexport class EventRegistry {\r\n // A static registry that maps an event ID to a list of parameters (metadata).\r\n private static eventsMetadata: Record<string, EventParameter[]> = {};\r\n\r\n public static registerMetadata(\r\n eventId: string,\r\n metadata: EventParameter[]\r\n ): void {\r\n EventRegistry.eventsMetadata[eventId] = metadata;\r\n }\r\n\r\n public static getMetadata(eventId: string): EventParameter[] | undefined {\r\n return EventRegistry.eventsMetadata[eventId];\r\n }\r\n}\r\n\r\n/**\r\n * Decorator to attach metadata to an event.\r\n * Example usage:\r\n * @EventMetadata(\"UserCreated\", [{name: \"userId\", type: \"string\"}])\r\n * export class UserCreatedEvent extends BaseEvent<{ userId: string }> {}\r\n */\r\nexport function EventMetadata(\r\n eventId: string,\r\n parameters: EventParameter[] = []\r\n) {\r\n return function <T extends { new (...args: any[]): BaseEvent<any> }>(\r\n constructor: T\r\n ) {\r\n EventRegistry.registerMetadata(eventId, parameters);\r\n };\r\n}\r\n"]}
@@ -0,0 +1 @@
1
+ export declare function Subscribe(eventId: string): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Subscribe = Subscribe;
4
+ const SubscriptionRegistry_1 = require("../registry/SubscriptionRegistry");
5
+ function Subscribe(eventId) {
6
+ return function (target, propertyKey, descriptor) {
7
+ SubscriptionRegistry_1.SubscriptionRegistry.register(eventId, target.constructor, propertyKey);
8
+ };
9
+ }
10
+ //# sourceMappingURL=subscribe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.js","sourceRoot":"/","sources":["libraries/event/decorators/subscribe.ts"],"names":[],"mappings":";;AAEA,8BAQC;AAVD,2EAAsE;AAEtE,SAAgB,SAAS,CAAC,OAAe;IACrC,OAAO,UACH,MAAW,EACX,WAAmB,EACnB,UAA8B;QAE9B,2CAAoB,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC5E,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {SubscriptionRegistry} from \"../registry/SubscriptionRegistry\";\r\n\r\nexport function Subscribe(eventId: string) {\r\n return function (\r\n target: any,\r\n propertyKey: string,\r\n descriptor: PropertyDescriptor\r\n ) {\r\n SubscriptionRegistry.register(eventId, target.constructor, propertyKey);\r\n };\r\n}\r\n"]}
@@ -0,0 +1,4 @@
1
+ import { BaseEvent } from "./BaseEvent";
2
+ export declare function initEventBus(rabbitUrl: string): Promise<void>;
3
+ export declare function publishEvent<TPayload extends Record<string, unknown>>(event: BaseEvent<TPayload>): Promise<void>;
4
+ export declare function subscribeToEvent(eventId: string, onMessage: (payload: any) => Promise<void>): Promise<void>;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initEventBus = initEventBus;
7
+ exports.publishEvent = publishEvent;
8
+ exports.subscribeToEvent = subscribeToEvent;
9
+ const amqplib_1 = __importDefault(require("amqplib"));
10
+ let connection;
11
+ let channel;
12
+ const EXCHANGE_NAME = "lyxa.events";
13
+ async function initEventBus(rabbitUrl) {
14
+ connection = await amqplib_1.default.connect(rabbitUrl);
15
+ channel = await connection.createChannel();
16
+ await channel.assertExchange(EXCHANGE_NAME, "topic", { durable: true });
17
+ console.log("EventBus initialized and exchange asserted");
18
+ }
19
+ async function publishEvent(event) {
20
+ if (!channel)
21
+ throw new Error("Channel not initialized. Call initEventBus first.");
22
+ const messageBuffer = Buffer.from(JSON.stringify(event.payload));
23
+ channel.publish(EXCHANGE_NAME, event.eventId, messageBuffer, {
24
+ contentType: "application/json",
25
+ });
26
+ console.log(`Published event [${event.eventId}] with payload`, event.payload);
27
+ }
28
+ async function subscribeToEvent(eventId, onMessage) {
29
+ if (!channel)
30
+ throw new Error("Channel not initialized. Call initEventBus first.");
31
+ const queueName = `${eventId}-queue`;
32
+ await channel.assertQueue(queueName, {
33
+ durable: true,
34
+ });
35
+ await channel.bindQueue(queueName, EXCHANGE_NAME, eventId);
36
+ await channel.consume(queueName, async (msg) => {
37
+ if (msg !== null) {
38
+ const payloadString = msg.content.toString();
39
+ const payload = JSON.parse(payloadString);
40
+ try {
41
+ await onMessage(payload);
42
+ channel.ack(msg);
43
+ }
44
+ catch (err) {
45
+ console.error(`Error handling event [${eventId}]`, err);
46
+ }
47
+ }
48
+ }, { noAck: false });
49
+ console.log(`Subscribed to event [${eventId}] on queue [${queueName}]`);
50
+ }
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/event/index.ts"],"names":[],"mappings":";;;;;AAQA,oCAOC;AAED,oCAYC;AAED,4CAmCC;AAlED,sDAA2B;AAG3B,IAAI,UAA2B,CAAC;AAChC,IAAI,OAAqB,CAAC;AAE1B,MAAM,aAAa,GAAG,aAAa,CAAC;AAE7B,KAAK,UAAU,YAAY,CAAC,SAAiB;IAChD,UAAU,GAAG,MAAM,iBAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;IAE3C,MAAM,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAExE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAC9D,CAAC;AAEM,KAAK,UAAU,YAAY,CAC9B,KAA0B;IAE1B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAEnF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE;QACzD,WAAW,EAAE,kBAAkB;KAClC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,OAAO,gBAAgB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;AAClF,CAAC;AAEM,KAAK,UAAU,gBAAgB,CAClC,OAAe,EACf,SAA0C;IAE1C,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAEnF,MAAM,SAAS,GAAG,GAAG,OAAO,QAAQ,CAAC;IAErC,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE;QACjC,OAAO,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IAE3D,MAAM,OAAO,CAAC,OAAO,CACjB,SAAS,EACT,KAAK,EAAE,GAAG,EAAE,EAAE;QACV,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACf,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAE1C,IAAI,CAAC;gBACD,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;gBAEzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;YAE5D,CAAC;QACL,CAAC;IACL,CAAC,EACD,EAAC,KAAK,EAAE,KAAK,EAAC,CACjB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,eAAe,SAAS,GAAG,CAAC,CAAC;AAC5E,CAAC","sourcesContent":["import amqp from \"amqplib\";\r\nimport { BaseEvent } from \"./BaseEvent\";\r\n\r\nlet connection: amqp.Connection;\r\nlet channel: amqp.Channel;\r\n\r\nconst EXCHANGE_NAME = \"lyxa.events\";\r\n\r\nexport async function initEventBus(rabbitUrl: string) {\r\n connection = await amqp.connect(rabbitUrl);\r\n channel = await connection.createChannel();\r\n\r\n await channel.assertExchange(EXCHANGE_NAME, \"topic\", { durable: true });\r\n\r\n console.log(\"EventBus initialized and exchange asserted\");\r\n}\r\n\r\nexport async function publishEvent<TPayload extends Record<string, unknown>>(\r\n event: BaseEvent<TPayload>\r\n): Promise<void> {\r\n if (!channel) throw new Error(\"Channel not initialized. Call initEventBus first.\");\r\n\r\n const messageBuffer = Buffer.from(JSON.stringify(event.payload));\r\n\r\n channel.publish(EXCHANGE_NAME, event.eventId, messageBuffer, {\r\n contentType: \"application/json\",\r\n });\r\n\r\n console.log(`Published event [${event.eventId}] with payload`, event.payload);\r\n}\r\n\r\nexport async function subscribeToEvent(\r\n eventId: string,\r\n onMessage: (payload: any) => Promise<void>\r\n): Promise<void> {\r\n if (!channel) throw new Error(\"Channel not initialized. Call initEventBus first.\");\r\n\r\n const queueName = `${eventId}-queue`;\r\n\r\n await channel.assertQueue(queueName, {\r\n durable: true,\r\n });\r\n\r\n await channel.bindQueue(queueName, EXCHANGE_NAME, eventId);\r\n\r\n await channel.consume(\r\n queueName,\r\n async (msg) => {\r\n if (msg !== null) {\r\n const payloadString = msg.content.toString();\r\n const payload = JSON.parse(payloadString);\r\n\r\n try {\r\n await onMessage(payload);\r\n // Acknowledge the message as processed\r\n channel.ack(msg);\r\n } catch (err) {\r\n console.error(`Error handling event [${eventId}]`, err);\r\n // Optional: channel.nack(msg) for requeue\r\n }\r\n }\r\n },\r\n {noAck: false}\r\n );\r\n\r\n console.log(`Subscribed to event [${eventId}] on queue [${queueName}]`);\r\n}\r\n"]}
@@ -0,0 +1,11 @@
1
+ interface SubscriptionMetadata {
2
+ eventId: string;
3
+ targetConstructor: Function;
4
+ methodName: string;
5
+ }
6
+ export declare class SubscriptionRegistry {
7
+ private static subscriptions;
8
+ static register(eventId: string, targetConstructor: Function, methodName: string): void;
9
+ static getAllSubscriptions(): SubscriptionMetadata[];
10
+ }
11
+ export {};
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubscriptionRegistry = void 0;
4
+ class SubscriptionRegistry {
5
+ static subscriptions = [];
6
+ static register(eventId, targetConstructor, methodName) {
7
+ this.subscriptions.push({
8
+ eventId,
9
+ targetConstructor,
10
+ methodName,
11
+ });
12
+ }
13
+ static getAllSubscriptions() {
14
+ return [...this.subscriptions];
15
+ }
16
+ }
17
+ exports.SubscriptionRegistry = SubscriptionRegistry;
18
+ //# sourceMappingURL=SubscriptionRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubscriptionRegistry.js","sourceRoot":"/","sources":["libraries/event/registry/SubscriptionRegistry.ts"],"names":[],"mappings":";;;AAQA,MAAa,oBAAoB;IACrB,MAAM,CAAC,aAAa,GAA2B,EAAE,CAAC;IAMnD,MAAM,CAAC,QAAQ,CAClB,OAAe,EACf,iBAA2B,EAC3B,UAAkB;QAElB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACpB,OAAO;YACP,iBAAiB;YACjB,UAAU;SACb,CAAC,CAAC;IACP,CAAC;IAMM,MAAM,CAAC,mBAAmB;QAC7B,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;;AAzBL,oDA0BC","sourcesContent":["\r\n\r\ninterface SubscriptionMetadata {\r\n eventId: string;\r\n targetConstructor: Function;\r\n methodName: string;\r\n}\r\n\r\nexport class SubscriptionRegistry {\r\n private static subscriptions: SubscriptionMetadata[] = [];\r\n\r\n /**\r\n * Called by the decorator to record which class method\r\n * is subscribed to which eventId.\r\n */\r\n public static register(\r\n eventId: string,\r\n targetConstructor: Function,\r\n methodName: string\r\n ) {\r\n this.subscriptions.push({\r\n eventId,\r\n targetConstructor,\r\n methodName,\r\n });\r\n }\r\n\r\n /**\r\n * Called at bootstrap to retrieve all known subscriptions\r\n * so we can actually wire them up.\r\n */\r\n public static getAllSubscriptions(): SubscriptionMetadata[] {\r\n return [...this.subscriptions];\r\n }\r\n}\r\n"]}
@@ -0,0 +1,14 @@
1
+ import { TwilioService } from "./twilio";
2
+ import { LyxaLogger } from "./logger";
3
+ import { MicroServiceDispatcher } from "./dispatcher";
4
+ import { SecretManagerService } from "./secrets";
5
+ import { RedisService } from "./redis";
6
+ import { ConfigurationService } from "./configuration";
7
+ export declare class LibraryManager {
8
+ getLogger(): LyxaLogger;
9
+ getMicroServiceDispatcher(): MicroServiceDispatcher;
10
+ getTwilioService(): TwilioService;
11
+ getSecretsService(): SecretManagerService;
12
+ getRedisService(): RedisService;
13
+ getConfigurationService(): ConfigurationService;
14
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.LibraryManager = void 0;
10
+ const typedi_1 = require("typedi");
11
+ const twilio_1 = require("./twilio");
12
+ const logger_1 = require("./logger");
13
+ const dispatcher_1 = require("./dispatcher");
14
+ const secrets_1 = require("./secrets");
15
+ const redis_1 = require("./redis");
16
+ const configuration_1 = require("./configuration");
17
+ let LibraryManager = class LibraryManager {
18
+ getLogger() {
19
+ return typedi_1.Container.get(logger_1.LyxaLogger);
20
+ }
21
+ getMicroServiceDispatcher() {
22
+ return typedi_1.Container.get(dispatcher_1.MicroServiceDispatcher);
23
+ }
24
+ getTwilioService() {
25
+ return typedi_1.Container.get(twilio_1.TwilioService);
26
+ }
27
+ getSecretsService() {
28
+ return typedi_1.Container.get(secrets_1.SecretManagerService);
29
+ }
30
+ getRedisService() {
31
+ return typedi_1.Container.get(redis_1.RedisService);
32
+ }
33
+ getConfigurationService() {
34
+ return typedi_1.Container.get(configuration_1.ConfigurationService);
35
+ }
36
+ };
37
+ exports.LibraryManager = LibraryManager;
38
+ exports.LibraryManager = LibraryManager = __decorate([
39
+ (0, typedi_1.Service)()
40
+ ], LibraryManager);
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,mCAA0C;AAC1C,qCAAuC;AACvC,qCAAoC;AACpC,6CAAoD;AACpD,uCAA+C;AAC/C,mCAAqC;AACrC,mDAAqD;AAG9C,IAAM,cAAc,GAApB,MAAM,cAAc;IAChB,SAAS;QACZ,OAAO,kBAAS,CAAC,GAAG,CAAC,mBAAU,CAAC,CAAC;IACrC,CAAC;IACM,yBAAyB;QAC5B,OAAO,kBAAS,CAAC,GAAG,CAAC,mCAAsB,CAAC,CAAC;IACjD,CAAC;IACM,gBAAgB;QACnB,OAAO,kBAAS,CAAC,GAAG,CAAC,sBAAa,CAAC,CAAC;IACxC,CAAC;IACM,iBAAiB;QACpB,OAAO,kBAAS,CAAC,GAAG,CAAC,8BAAoB,CAAC,CAAC;IAC/C,CAAC;IACM,eAAe;QAClB,OAAO,kBAAS,CAAC,GAAG,CAAC,oBAAY,CAAC,CAAC;IACvC,CAAC;IACM,uBAAuB;QAC1B,OAAO,kBAAS,CAAC,GAAG,CAAC,oCAAoB,CAAC,CAAC;IAC/C,CAAC;CACJ,CAAA;AAnBY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,gBAAO,GAAE;GACG,cAAc,CAmB1B","sourcesContent":["import {Container, Service} from \"typedi\";\r\nimport {TwilioService} from \"./twilio\";\r\nimport {LyxaLogger} from \"./logger\";\r\nimport {MicroServiceDispatcher} from \"./dispatcher\";\r\nimport {SecretManagerService} from \"./secrets\";\r\nimport {RedisService} from \"./redis\";\r\nimport {ConfigurationService} from \"./configuration\";\r\n\r\n@Service()\r\nexport class LibraryManager {\r\n public getLogger(): LyxaLogger {\r\n return Container.get(LyxaLogger);\r\n }\r\n public getMicroServiceDispatcher(): MicroServiceDispatcher {\r\n return Container.get(MicroServiceDispatcher);\r\n }\r\n public getTwilioService(): TwilioService {\r\n return Container.get(TwilioService);\r\n }\r\n public getSecretsService(): SecretManagerService {\r\n return Container.get(SecretManagerService);\r\n }\r\n public getRedisService(): RedisService {\r\n return Container.get(RedisService);\r\n }\r\n public getConfigurationService(): ConfigurationService {\r\n return Container.get(ConfigurationService);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,6 @@
1
+ import { Logger } from "pino";
2
+ export declare class LyxaLogger {
3
+ private readonly _logger;
4
+ constructor(identifier: string, mongoURI: string);
5
+ get logger(): Logger;
6
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LyxaLogger = void 0;
13
+ const pino_1 = require("pino");
14
+ const typedi_1 = require("typedi");
15
+ let LyxaLogger = class LyxaLogger {
16
+ _logger;
17
+ constructor(identifier, mongoURI) {
18
+ const transports = pino_1.pino.transport({
19
+ targets: [
20
+ {
21
+ target: 'pino-pretty',
22
+ options: {
23
+ colorize: true
24
+ },
25
+ level: 'info'
26
+ },
27
+ {
28
+ target: 'pino/file',
29
+ options: {
30
+ destination: './logs/error.log'
31
+ },
32
+ level: 'error'
33
+ },
34
+ {
35
+ target: 'pino-mongodb',
36
+ options: {
37
+ uri: mongoURI,
38
+ database: 'lyxa-logs',
39
+ collection: identifier
40
+ },
41
+ level: 'error'
42
+ }
43
+ ]
44
+ });
45
+ this._logger = (0, pino_1.pino)({
46
+ level: "info"
47
+ }, transports);
48
+ }
49
+ get logger() {
50
+ return this._logger;
51
+ }
52
+ };
53
+ exports.LyxaLogger = LyxaLogger;
54
+ exports.LyxaLogger = LyxaLogger = __decorate([
55
+ (0, typedi_1.Service)(),
56
+ __metadata("design:paramtypes", [String, String])
57
+ ], LyxaLogger);
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/logger/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+BAAoC;AACpC,mCAA+B;AAGxB,IAAM,UAAU,GAAhB,MAAM,UAAU;IACF,OAAO,CAAS;IAEjC,YAAY,UAAkB,EAAE,QAAgB;QAC5C,MAAM,UAAU,GAAG,WAAI,CAAC,SAAS,CAAC;YAC9B,OAAO,EAAE;gBACL;oBACI,MAAM,EAAE,aAAa;oBACrB,OAAO,EAAE;wBACL,QAAQ,EAAE,IAAI;qBACjB;oBACD,KAAK,EAAE,MAAM;iBAChB;gBACD;oBACI,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE;wBACL,WAAW,EAAE,kBAAkB;qBAClC;oBACD,KAAK,EAAE,OAAO;iBACjB;gBACD;oBACI,MAAM,EAAE,cAAc;oBACtB,OAAO,EAAE;wBACL,GAAG,EAAE,QAAQ;wBACb,QAAQ,EAAE,WAAW;wBACrB,UAAU,EAAE,UAAU;qBACzB;oBACD,KAAK,EAAE,OAAO;iBACjB;aACJ;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,GAAG,IAAA,WAAI,EACf;YACI,KAAK,EAAE,MAAM;SAChB,EACD,UAAU,CACb,CAAC;IACN,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACJ,CAAA;AA3CY,gCAAU;qBAAV,UAAU;IADtB,IAAA,gBAAO,GAAE;;GACG,UAAU,CA2CtB","sourcesContent":["import { pino, Logger } from \"pino\";\r\nimport {Service} from \"typedi\";\r\n\r\n@Service()\r\nexport class LyxaLogger {\r\n private readonly _logger: Logger;\r\n\r\n constructor(identifier: string, mongoURI: string) {\r\n const transports = pino.transport({\r\n targets: [\r\n {\r\n target: 'pino-pretty',\r\n options: {\r\n colorize: true\r\n },\r\n level: 'info'\r\n },\r\n {\r\n target: 'pino/file',\r\n options: {\r\n destination: './logs/error.log'\r\n },\r\n level: 'error'\r\n },\r\n {\r\n target: 'pino-mongodb',\r\n options: {\r\n uri: mongoURI,\r\n database: 'lyxa-logs',\r\n collection: identifier\r\n },\r\n level: 'error'\r\n }\r\n ]\r\n });\r\n\r\n this._logger = pino(\r\n {\r\n level: \"info\"\r\n },\r\n transports\r\n );\r\n }\r\n\r\n get logger(): Logger {\r\n return this._logger;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,6 @@
1
+ import { Connection } from 'mongoose';
2
+ import { ReturnModelType } from '@typegoose/typegoose';
3
+ import { AnyParamConstructor, IModelOptions } from "@typegoose/typegoose/lib/types";
4
+ export declare function initGlobalConnection(uri: string): Promise<Connection>;
5
+ export declare function createGlobalModel<T extends AnyParamConstructor<any>>(Class: T): ReturnModelType<T>;
6
+ export declare function createGlobalDiscriminatorModel<Base extends AnyParamConstructor<any>, Sub extends AnyParamConstructor<any>>(baseModel: ReturnModelType<Base>, subClass: Sub, discriminatorName?: string, options?: IModelOptions): ReturnModelType<Sub>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initGlobalConnection = initGlobalConnection;
4
+ exports.createGlobalModel = createGlobalModel;
5
+ exports.createGlobalDiscriminatorModel = createGlobalDiscriminatorModel;
6
+ const mongoose_1 = require("mongoose");
7
+ const typegoose_1 = require("@typegoose/typegoose");
8
+ let globalConnection;
9
+ async function initGlobalConnection(uri) {
10
+ if (!globalConnection) {
11
+ globalConnection = (0, mongoose_1.createConnection)(uri, {
12
+ dbName: 'lyxa-global',
13
+ });
14
+ }
15
+ return globalConnection;
16
+ }
17
+ function createGlobalModel(Class) {
18
+ if (!globalConnection) {
19
+ throw new Error('Global connection not initialized. Call initGlobalConnection(...) first.');
20
+ }
21
+ return (0, typegoose_1.getModelForClass)(Class, { existingConnection: globalConnection });
22
+ }
23
+ function createGlobalDiscriminatorModel(baseModel, subClass, discriminatorName, options) {
24
+ if (!globalConnection) {
25
+ throw new Error('Global connection not initialized. Call initGlobalConnection(...) first.');
26
+ }
27
+ return (0, typegoose_1.getDiscriminatorModelForClass)(baseModel, subClass, discriminatorName, {
28
+ existingConnection: globalConnection,
29
+ ...options,
30
+ });
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/mongo/index.ts"],"names":[],"mappings":";;AAMA,oDAOC;AAKD,8CASC;AAWD,wEAmBC;AAzDD,uCAAwD;AACxD,oDAAsG;AAGtG,IAAI,gBAAwC,CAAC;AAEtC,KAAK,UAAU,oBAAoB,CAAC,GAAW;IAClD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpB,gBAAgB,GAAG,IAAA,2BAAgB,EAAC,GAAG,EAAE;YACrC,MAAM,EAAE,aAAa;SACxB,CAAC,CAAC;IACP,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC5B,CAAC;AAKD,SAAgB,iBAAiB,CAC7B,KAAQ;IAER,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACX,0EAA0E,CAC7E,CAAC;IACN,CAAC;IACD,OAAO,IAAA,4BAAgB,EAAC,KAAK,EAAE,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC7E,CAAC;AAWD,SAAgB,8BAA8B,CAI1C,SAAgC,EAChC,QAAa,EACb,iBAA0B,EAC1B,OAAuB;IAEvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACX,0EAA0E,CAC7E,CAAC;IACN,CAAC;IAED,OAAO,IAAA,yCAA6B,EAAC,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE;QACzE,kBAAkB,EAAE,gBAAgB;QACpC,GAAG,OAAO;KACb,CAAC,CAAC;AACP,CAAC","sourcesContent":["import { Connection, createConnection } from 'mongoose';\r\nimport {getDiscriminatorModelForClass, getModelForClass, ReturnModelType} from '@typegoose/typegoose';\r\nimport {AnyParamConstructor, IModelOptions} from \"@typegoose/typegoose/lib/types\";\r\n\r\nlet globalConnection: Connection | undefined;\r\n\r\nexport async function initGlobalConnection(uri: string) {\r\n if (!globalConnection) {\r\n globalConnection = createConnection(uri, {\r\n dbName: 'lyxa-global',\r\n });\r\n }\r\n return globalConnection;\r\n}\r\n\r\n/**\r\n * Creates a Typegoose model from a class (with a single, global connection).\r\n */\r\nexport function createGlobalModel<T extends AnyParamConstructor<any>>(\r\n Class: T\r\n): ReturnModelType<T> {\r\n if (!globalConnection) {\r\n throw new Error(\r\n 'Global connection not initialized. Call initGlobalConnection(...) first.'\r\n );\r\n }\r\n return getModelForClass(Class, { existingConnection: globalConnection });\r\n}\r\n\r\n/**\r\n * Creates a Typegoose *discriminator* model from a base model,\r\n * using a derived sub-class & optional discriminator value.\r\n *\r\n * @param baseModel The ReturnModelType (model) for the base class\r\n * @param subClass The derived class constructor\r\n * @param discriminatorName A string to label this sub-class (e.g. \"DOG\")\r\n * @param options Additional model options\r\n */\r\nexport function createGlobalDiscriminatorModel<\r\n Base extends AnyParamConstructor<any>,\r\n Sub extends AnyParamConstructor<any>,\r\n>(\r\n baseModel: ReturnModelType<Base>,\r\n subClass: Sub,\r\n discriminatorName?: string,\r\n options?: IModelOptions,\r\n): ReturnModelType<Sub> {\r\n if (!globalConnection) {\r\n throw new Error(\r\n 'Global connection not initialized. Call initGlobalConnection(...) first.',\r\n );\r\n }\r\n\r\n return getDiscriminatorModelForClass(baseModel, subClass, discriminatorName, {\r\n existingConnection: globalConnection,\r\n ...options,\r\n });\r\n}\r\n"]}
@@ -0,0 +1,13 @@
1
+ import Redis from "ioredis";
2
+ export declare class RedisService {
3
+ private _redisClient;
4
+ constructor(redisURL: string);
5
+ get redisClient(): Redis;
6
+ getCachedObject<T>(key: string): Promise<T | undefined>;
7
+ cacheObject<T>(key: string, object: T, expiry?: number): Promise<boolean>;
8
+ deleteCachedObject(key: string): Promise<boolean>;
9
+ getCachedObjectByGroup<T>(group: string, key: string): Promise<T | undefined>;
10
+ setCachedObjectByGroup<T>(group: string, key: string, object: T): Promise<boolean>;
11
+ deleteCachedObjectByGroup<T>(group: string, key: string): Promise<boolean>;
12
+ sanitizeKey(key: string): string;
13
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RedisService = void 0;
16
+ const ioredis_1 = __importDefault(require("ioredis"));
17
+ const typedi_1 = require("typedi");
18
+ let RedisService = class RedisService {
19
+ _redisClient;
20
+ constructor(redisURL) {
21
+ this._redisClient = new ioredis_1.default(redisURL);
22
+ this._redisClient.connect(() => console.error(""));
23
+ }
24
+ get redisClient() {
25
+ return this._redisClient;
26
+ }
27
+ async getCachedObject(key) {
28
+ const usageResponse = await this._redisClient.get(key);
29
+ if (usageResponse != undefined) {
30
+ return JSON.parse(usageResponse);
31
+ }
32
+ return undefined;
33
+ }
34
+ async cacheObject(key, object, expiry) {
35
+ const stringifiedObject = JSON.stringify(object);
36
+ if (expiry) {
37
+ await this._redisClient.setex(key, expiry, stringifiedObject);
38
+ }
39
+ else {
40
+ await this._redisClient.set(key, stringifiedObject);
41
+ }
42
+ return true;
43
+ }
44
+ async deleteCachedObject(key) {
45
+ await this._redisClient.del(key);
46
+ return true;
47
+ }
48
+ async getCachedObjectByGroup(group, key) {
49
+ const usageResponse = await this._redisClient.hget(group, key);
50
+ if (usageResponse != undefined) {
51
+ return JSON.parse(usageResponse);
52
+ }
53
+ return undefined;
54
+ }
55
+ async setCachedObjectByGroup(group, key, object) {
56
+ const stringifiedObject = JSON.stringify(object);
57
+ await this._redisClient.hset(group, key, stringifiedObject);
58
+ return true;
59
+ }
60
+ async deleteCachedObjectByGroup(group, key) {
61
+ await this._redisClient.hdel(group, key);
62
+ return true;
63
+ }
64
+ sanitizeKey(key) {
65
+ return key.replace(/[^\w\s]/gi, '').replace(/\s+/g, '-').toLowerCase();
66
+ }
67
+ };
68
+ exports.RedisService = RedisService;
69
+ exports.RedisService = RedisService = __decorate([
70
+ (0, typedi_1.Service)(),
71
+ __metadata("design:paramtypes", [String])
72
+ ], RedisService);
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/redis/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sDAA2B;AAC3B,mCAA+B;AAGxB,IAAM,YAAY,GAAlB,MAAM,YAAY;IACb,YAAY,CAAS;IAE7B,YAAY,QAAgB;QACxB,IAAI,CAAC,YAAY,GAAG,IAAI,iBAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAEM,KAAK,CAAC,eAAe,CAAI,GAAW;QACvC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEtD,IAAG,aAAa,IAAI,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAM,CAAA;QACzC,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAI,GAAW,EAAE,MAAS,EAAE,MAAe;QAC/D,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAG,MAAM,EAAE,CAAC;YACR,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAA;QACjE,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAA;QACvD,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,GAAW;QACvC,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAI,KAAa,EAAE,GAAW;QAC7D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAE9D,IAAG,aAAa,IAAI,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAM,CAAA;QACzC,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAI,KAAa,EAAE,GAAW,EAAE,MAAS;QACxE,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAA;QAE3D,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,yBAAyB,CAAI,KAAa,EAAE,GAAW;QAChE,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACxC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,WAAW,CAAC,GAAW;QAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3E,CAAC;CACJ,CAAA;AAhEY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,gBAAO,GAAE;;GACG,YAAY,CAgExB","sourcesContent":["import Redis from \"ioredis\"\r\nimport {Service} from \"typedi\";\r\n\r\n@Service()\r\nexport class RedisService {\r\n private _redisClient!: Redis;\r\n\r\n constructor(redisURL: string) {\r\n this._redisClient = new Redis(redisURL);\r\n this._redisClient.connect(() => console.error(\"\"))\r\n }\r\n\r\n get redisClient(): Redis {\r\n return this._redisClient;\r\n }\r\n\r\n public async getCachedObject<T>(key: string): Promise<T | undefined> {\r\n const usageResponse = await this._redisClient.get(key)\r\n\r\n if(usageResponse != undefined) {\r\n return JSON.parse(usageResponse) as T\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n public async cacheObject<T>(key: string, object: T, expiry?: number): Promise<boolean> {\r\n const stringifiedObject = JSON.stringify(object);\r\n\r\n if(expiry) {\r\n await this._redisClient.setex(key, expiry, stringifiedObject)\r\n } else {\r\n await this._redisClient.set(key, stringifiedObject)\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public async deleteCachedObject(key: string): Promise<boolean> {\r\n await this._redisClient.del(key);\r\n return true;\r\n }\r\n\r\n public async getCachedObjectByGroup<T>(group: string, key: string): Promise<T | undefined> {\r\n const usageResponse = await this._redisClient.hget(group, key)\r\n\r\n if(usageResponse != undefined) {\r\n return JSON.parse(usageResponse) as T\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n public async setCachedObjectByGroup<T>(group: string, key: string, object: T): Promise<boolean> {\r\n const stringifiedObject = JSON.stringify(object);\r\n await this._redisClient.hset(group, key, stringifiedObject)\r\n\r\n return true;\r\n }\r\n\r\n public async deleteCachedObjectByGroup<T>(group: string, key: string): Promise<boolean> {\r\n await this._redisClient.hdel(group, key)\r\n return true;\r\n }\r\n\r\n public sanitizeKey(key: string) {\r\n return key.replace(/[^\\w\\s]/gi, '').replace(/\\s+/g, '-').toLowerCase();\r\n }\r\n}\r\n"]}
@@ -0,0 +1,10 @@
1
+ import { RedisService } from "../redis";
2
+ import { ConfigurationService } from "../configuration";
3
+ export declare class SecretManagerService {
4
+ private _configurationService;
5
+ private _redisManager;
6
+ private _client;
7
+ constructor(configurationService: ConfigurationService, redisManager: RedisService);
8
+ getKey(key: string): Promise<string | undefined>;
9
+ setKey(key: string, value: string): Promise<string>;
10
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SecretManagerService = void 0;
13
+ const secret_manager_1 = require("@google-cloud/secret-manager");
14
+ const typedi_1 = require("typedi");
15
+ const redis_1 = require("../redis");
16
+ const configuration_1 = require("../configuration");
17
+ let SecretManagerService = class SecretManagerService {
18
+ _configurationService;
19
+ _redisManager;
20
+ _client;
21
+ constructor(configurationService, redisManager) {
22
+ this._configurationService = configurationService;
23
+ this._redisManager = redisManager;
24
+ this._client = new secret_manager_1.SecretManagerServiceClient({
25
+ credentials: {
26
+ projectId: "",
27
+ private_key: "",
28
+ client_email: ""
29
+ }
30
+ });
31
+ }
32
+ async getKey(key) {
33
+ const environmentTransformedKey = this._configurationService.options.environment + "_" + key;
34
+ try {
35
+ const data = await this._redisManager.getCachedObjectByGroup(this._configurationService.options.environment + "_KEYS", key);
36
+ if (data != undefined) {
37
+ return data;
38
+ }
39
+ const [accessResponse] = await this._client.accessSecretVersion({
40
+ name: "projects/312948262281/secrets/" + environmentTransformedKey + "/versions/latest",
41
+ });
42
+ const val = accessResponse.payload.data.toString();
43
+ await this.setKey(key, val);
44
+ return val;
45
+ }
46
+ catch (e) {
47
+ }
48
+ }
49
+ async setKey(key, value) {
50
+ await this._redisManager.setCachedObjectByGroup(this._configurationService.options.environment + "_KEYS", key, value);
51
+ return value;
52
+ }
53
+ };
54
+ exports.SecretManagerService = SecretManagerService;
55
+ exports.SecretManagerService = SecretManagerService = __decorate([
56
+ (0, typedi_1.Service)(),
57
+ __metadata("design:paramtypes", [configuration_1.ConfigurationService, redis_1.RedisService])
58
+ ], SecretManagerService);
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/secrets/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,iEAAwE;AACxE,mCAA+B;AAC/B,oCAAsC;AACtC,oDAAsD;AAG/C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACrB,qBAAqB,CAAwB;IAC7C,aAAa,CAAgB;IAC7B,OAAO,CAA8B;IAE7C,YAAY,oBAA0C,EAAE,YAA0B;QAC9E,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,2CAA0B,CAAC;YAC1C,WAAW,EAAE;gBACT,SAAS,EAAE,EAAE;gBACb,WAAW,EAAE,EAAE;gBACf,YAAY,EAAE,EAAE;aACnB;SACJ,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW;QAC3B,MAAM,yBAAyB,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC;QAE7F,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAS,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,EAAE,GAAG,CAAC,CAAA;YAEnI,IAAG,IAAI,IAAI,SAAS,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAA;YACf,CAAC;YAED,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;gBAC5D,IAAI,EAAE,gCAAgC,GAAG,yBAAyB,GAAG,kBAAkB;aAC1F,CAAC,CAAA;YAEF,MAAM,GAAG,GAAG,cAAc,CAAC,OAAQ,CAAC,IAAK,CAAC,QAAQ,EAAE,CAAA;YACpD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAE5B,OAAO,GAAG,CAAA;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;QAEb,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,KAAa;QAC1C,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAS,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAC7H,OAAO,KAAK,CAAA;IAChB,CAAC;CAEJ,CAAA;AA7CY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,gBAAO,GAAE;qCAM4B,oCAAoB,EAAgB,oBAAY;GALzE,oBAAoB,CA6ChC","sourcesContent":["\r\nimport {SecretManagerServiceClient} from \"@google-cloud/secret-manager\";\r\nimport {Service} from \"typedi\";\r\nimport {RedisService} from \"../redis\";\r\nimport {ConfigurationService} from \"../configuration\";\r\n\r\n@Service()\r\nexport class SecretManagerService {\r\n private _configurationService!: ConfigurationService;\r\n private _redisManager!: RedisService;\r\n private _client!: SecretManagerServiceClient;\r\n\r\n constructor(configurationService: ConfigurationService, redisManager: RedisService) {\r\n this._configurationService = configurationService;\r\n this._redisManager = redisManager;\r\n this._client = new SecretManagerServiceClient({\r\n credentials: {\r\n projectId: \"\",\r\n private_key: \"\",\r\n client_email: \"\"\r\n }\r\n })\r\n }\r\n\r\n public async getKey(key: string): Promise<string | undefined> {\r\n const environmentTransformedKey = this._configurationService.options.environment + \"_\" + key;\r\n\r\n try {\r\n const data = await this._redisManager.getCachedObjectByGroup<string>(this._configurationService.options.environment + \"_KEYS\", key)\r\n\r\n if(data != undefined) {\r\n return data\r\n }\r\n\r\n const [accessResponse] = await this._client.accessSecretVersion({\r\n name: \"projects/312948262281/secrets/\" + environmentTransformedKey + \"/versions/latest\",\r\n })\r\n\r\n const val = accessResponse.payload!.data!.toString()\r\n await this.setKey(key, val);\r\n\r\n return val\r\n } catch (e) {\r\n\r\n }\r\n }\r\n\r\n public async setKey(key: string, value: string): Promise<string> {\r\n await this._redisManager.setCachedObjectByGroup<string>(this._configurationService.options.environment + \"_KEYS\", key, value)\r\n return value\r\n }\r\n\r\n}\r\n"]}
@@ -0,0 +1,6 @@
1
+ import { MessageInstance } from "twilio/lib/rest/api/v2010/account/message";
2
+ export declare class TwilioService {
3
+ private _client;
4
+ constructor();
5
+ sendWhatsappOTP(toNumber: number, otp: string): Promise<MessageInstance | null>;
6
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TwilioService = void 0;
13
+ const typedi_1 = require("typedi");
14
+ const twilio_1 = require("twilio");
15
+ let TwilioService = class TwilioService {
16
+ _client;
17
+ constructor() {
18
+ this._client = new twilio_1.Twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
19
+ }
20
+ async sendWhatsappOTP(toNumber, otp) {
21
+ try {
22
+ return await this._client.messages.create({
23
+ from: process.env.TWILIO_FROM_NUMBER,
24
+ to: `whatsapp:${toNumber}`,
25
+ messagingServiceSid: 'MG7388a0916945dcd333451f22f9f723f7',
26
+ contentSid: 'HXbd364741884cfdbbfd7dd38ce7f6b5d3',
27
+ contentVariables: JSON.stringify({
28
+ "1": otp
29
+ })
30
+ });
31
+ }
32
+ catch (error) {
33
+ return null;
34
+ }
35
+ }
36
+ ;
37
+ };
38
+ exports.TwilioService = TwilioService;
39
+ exports.TwilioService = TwilioService = __decorate([
40
+ (0, typedi_1.Service)(),
41
+ __metadata("design:paramtypes", [])
42
+ ], TwilioService);
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/twilio/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,mCAA+B;AAC/B,mCAA8B;AAGvB,IAAM,aAAa,GAAnB,MAAM,aAAa;IAEd,OAAO,CAAS;IAExB;QACI,IAAI,CAAC,OAAO,GAAG,IAAI,eAAM,CACrB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAChC,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,GAAW;QACtD,IAAI,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACtC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;gBACpC,EAAE,EAAE,YAAY,QAAQ,EAAE;gBAC1B,mBAAmB,EAAE,oCAAoC;gBACzD,UAAU,EAAE,oCAAoC;gBAChD,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC;oBAC7B,GAAG,EAAE,GAAG;iBACX,CAAC;aACL,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEb,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAAA,CAAC;CACL,CAAA;AA3BY,sCAAa;wBAAb,aAAa;IADzB,IAAA,gBAAO,GAAE;;GACG,aAAa,CA2BzB","sourcesContent":["import {MessageInstance} from \"twilio/lib/rest/api/v2010/account/message\";\r\nimport {Service} from \"typedi\";\r\nimport {Twilio} from \"twilio\";\r\n\r\n@Service()\r\nexport class TwilioService {\r\n\r\n private _client: Twilio;\r\n\r\n constructor() {\r\n this._client = new Twilio(\r\n process.env.TWILIO_ACCOUNT_SID,\r\n process.env.TWILIO_AUTH_TOKEN\r\n );\r\n }\r\n\r\n public async sendWhatsappOTP(toNumber: number, otp: string): Promise<MessageInstance | null> {\r\n try {\r\n return await this._client.messages.create({\r\n from: process.env.TWILIO_FROM_NUMBER,\r\n to: `whatsapp:${toNumber}`,\r\n messagingServiceSid: 'MG7388a0916945dcd333451f22f9f723f7',\r\n contentSid: 'HXbd364741884cfdbbfd7dd38ce7f6b5d3',\r\n contentVariables: JSON.stringify({\r\n \"1\": otp\r\n })\r\n });\r\n } catch (error) {\r\n //todo log error in logger\r\n return null;\r\n }\r\n };\r\n}\r\n"]}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@lyxa.ai/core",
3
+ "version": "1.0.0",
4
+ "description": "The Core system of the Lyxa services.",
5
+ "author": "elie <42282499+Internalizable@users.noreply.github.com>",
6
+ "license": "MIT",
7
+ "files": [
8
+ "dist/**/*"
9
+ ],
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "clean": "rimraf dist",
15
+ "prepare": "npm run build"
16
+ },
17
+ "dependencies": {
18
+ "@google-cloud/secret-manager": "^5.6.0",
19
+ "@trpc/client": "^10.45.2",
20
+ "@trpc/server": "^10.45.2",
21
+ "@typegoose/typegoose": "^12.10.1",
22
+ "@types/amqplib": "^0.10.6",
23
+ "@types/node": "^22.10.2",
24
+ "@types/twilio": "^3.19.3",
25
+ "amqplib": "^0.10.5",
26
+ "firebase": "^11.1.0",
27
+ "firebase-admin": "^13.0.1",
28
+ "ioredis": "^5.4.1",
29
+ "mongoose": "^8.9.1",
30
+ "pino": "^9.5.0",
31
+ "pino-mongodb": "^4.3.0",
32
+ "pino-pretty": "^13.0.0",
33
+ "twilio": "^5.4.0",
34
+ "typedi": "^0.10.0",
35
+ "typescript": "^5.7.2",
36
+ "zod": "^3.24.1"
37
+ }
38
+ }