@aptana/multichannel-common 2.9.12

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 (202) hide show
  1. package/core/domain/Command.d.ts +3 -0
  2. package/core/domain/Command.js +2 -0
  3. package/core/domain/Entity.d.ts +6 -0
  4. package/core/domain/Entity.js +13 -0
  5. package/core/domain/Identifier.d.ts +5 -0
  6. package/core/domain/Identifier.js +13 -0
  7. package/core/domain/UniqueId.d.ts +4 -0
  8. package/core/domain/UniqueId.js +11 -0
  9. package/core/domain/UseCase.d.ts +3 -0
  10. package/core/domain/UseCase.js +2 -0
  11. package/core/domain/ValueObject.d.ts +4 -0
  12. package/core/domain/ValueObject.js +10 -0
  13. package/core/domain/auth/Auth.d.ts +17 -0
  14. package/core/domain/auth/Auth.js +41 -0
  15. package/core/domain/auth/Authenticable.d.ts +4 -0
  16. package/core/domain/auth/Authenticable.js +2 -0
  17. package/core/domain/auth/Guard.d.ts +20 -0
  18. package/core/domain/auth/Guard.js +2 -0
  19. package/core/domain/auth/TokenGuard.d.ts +33 -0
  20. package/core/domain/auth/TokenGuard.js +94 -0
  21. package/core/domain/auth/UserProvider.d.ts +17 -0
  22. package/core/domain/auth/UserProvider.js +2 -0
  23. package/core/domain/cache/Cache.d.ts +8 -0
  24. package/core/domain/cache/Cache.js +2 -0
  25. package/core/domain/cache/Repo.d.ts +51 -0
  26. package/core/domain/cache/Repo.js +2 -0
  27. package/core/domain/cache/Store.d.ts +26 -0
  28. package/core/domain/cache/Store.js +2 -0
  29. package/core/domain/events/Event.d.ts +8 -0
  30. package/core/domain/events/Event.js +2 -0
  31. package/core/domain/events/Listener.d.ts +4 -0
  32. package/core/domain/events/Listener.js +2 -0
  33. package/core/domain/events/Worker.d.ts +3 -0
  34. package/core/domain/events/Worker.js +2 -0
  35. package/core/domain/loaders/Loader.d.ts +4 -0
  36. package/core/domain/loaders/Loader.js +2 -0
  37. package/core/domain/loaders/Manager.d.ts +3 -0
  38. package/core/domain/loaders/Manager.js +2 -0
  39. package/core/errors/AppError.d.ts +10 -0
  40. package/core/errors/AppError.js +16 -0
  41. package/core/errors/AuthenticationTokenMissingError.d.ts +5 -0
  42. package/core/errors/AuthenticationTokenMissingError.js +11 -0
  43. package/core/errors/BadRequestError.d.ts +5 -0
  44. package/core/errors/BadRequestError.js +11 -0
  45. package/core/errors/NotAuthorizedError.d.ts +5 -0
  46. package/core/errors/NotAuthorizedError.js +11 -0
  47. package/core/errors/NotFoundError.d.ts +5 -0
  48. package/core/errors/NotFoundError.js +11 -0
  49. package/core/errors/RequestValidationError.d.ts +10 -0
  50. package/core/errors/RequestValidationError.js +47 -0
  51. package/core/errors/ValidationError.d.ts +8 -0
  52. package/core/errors/ValidationError.js +19 -0
  53. package/core/errors/WrongAuthenticationTokenError.d.ts +5 -0
  54. package/core/errors/WrongAuthenticationTokenError.js +11 -0
  55. package/core/errors/WrongCredentialsError.d.ts +5 -0
  56. package/core/errors/WrongCredentialsError.js +11 -0
  57. package/core/index.d.ts +48 -0
  58. package/core/index.js +69 -0
  59. package/core/infrastructure/Container.d.ts +1 -0
  60. package/core/infrastructure/Container.js +8 -0
  61. package/core/infrastructure/Controller.d.ts +9 -0
  62. package/core/infrastructure/Controller.js +30 -0
  63. package/core/infrastructure/DatabaseRepository.d.ts +35 -0
  64. package/core/infrastructure/DatabaseRepository.js +2 -0
  65. package/core/infrastructure/Mapper.d.ts +2 -0
  66. package/core/infrastructure/Mapper.js +6 -0
  67. package/core/infrastructure/Repo.d.ts +2 -0
  68. package/core/infrastructure/Repo.js +6 -0
  69. package/core/infrastructure/cache/Cache.d.ts +47 -0
  70. package/core/infrastructure/cache/Cache.js +101 -0
  71. package/core/infrastructure/cache/InMemoryCache.d.ts +20 -0
  72. package/core/infrastructure/cache/InMemoryCache.js +62 -0
  73. package/core/infrastructure/cache/RedisCache.d.ts +15 -0
  74. package/core/infrastructure/cache/RedisCache.js +51 -0
  75. package/core/infrastructure/cache/Repo.d.ts +25 -0
  76. package/core/infrastructure/cache/Repo.js +103 -0
  77. package/core/infrastructure/cache/stores/ArrayStore.d.ts +17 -0
  78. package/core/infrastructure/cache/stores/ArrayStore.js +65 -0
  79. package/core/infrastructure/cache/stores/FileStore.d.ts +14 -0
  80. package/core/infrastructure/cache/stores/FileStore.js +171 -0
  81. package/core/infrastructure/cache/stores/NullStore.d.ts +9 -0
  82. package/core/infrastructure/cache/stores/NullStore.js +24 -0
  83. package/core/infrastructure/cache/stores/RedisStore.d.ts +13 -0
  84. package/core/infrastructure/cache/stores/RedisStore.js +44 -0
  85. package/core/infrastructure/events/ChannelEvent.d.ts +9 -0
  86. package/core/infrastructure/events/ChannelEvent.js +37 -0
  87. package/core/infrastructure/events/Connection.d.ts +8 -0
  88. package/core/infrastructure/events/Connection.js +30 -0
  89. package/core/infrastructure/events/Event.d.ts +16 -0
  90. package/core/infrastructure/events/Event.js +42 -0
  91. package/core/infrastructure/events/Listener.d.ts +23 -0
  92. package/core/infrastructure/events/Listener.js +77 -0
  93. package/core/infrastructure/events/Worker.d.ts +9 -0
  94. package/core/infrastructure/events/Worker.js +34 -0
  95. package/core/infrastructure/events/grpc/Connection.d.ts +9 -0
  96. package/core/infrastructure/events/grpc/Connection.js +34 -0
  97. package/core/infrastructure/events/grpc/Event.d.ts +12 -0
  98. package/core/infrastructure/events/grpc/Event.js +80 -0
  99. package/core/infrastructure/events/grpc/Listener.d.ts +16 -0
  100. package/core/infrastructure/events/grpc/Listener.js +74 -0
  101. package/core/infrastructure/events/rpc/Event.d.ts +13 -0
  102. package/core/infrastructure/events/rpc/Event.js +98 -0
  103. package/core/infrastructure/events/rpc/Listener.d.ts +6 -0
  104. package/core/infrastructure/events/rpc/Listener.js +30 -0
  105. package/core/infrastructure/http/App.d.ts +15 -0
  106. package/core/infrastructure/http/App.js +73 -0
  107. package/core/infrastructure/http/middleware/alwaysAcceptJsonMiddleware.d.ts +2 -0
  108. package/core/infrastructure/http/middleware/alwaysAcceptJsonMiddleware.js +8 -0
  109. package/core/infrastructure/http/middleware/errorMiddleware.d.ts +2 -0
  110. package/core/infrastructure/http/middleware/errorMiddleware.js +18 -0
  111. package/core/infrastructure/http/middleware/loggerMiddleware.d.ts +2 -0
  112. package/core/infrastructure/http/middleware/loggerMiddleware.js +17 -0
  113. package/core/infrastructure/http/middleware/routeNotFoundMiddleware.d.ts +2 -0
  114. package/core/infrastructure/http/middleware/routeNotFoundMiddleware.js +11 -0
  115. package/core/infrastructure/http/middleware/validationMiddleware.d.ts +4 -0
  116. package/core/infrastructure/http/middleware/validationMiddleware.js +35 -0
  117. package/core/infrastructure/loaders/Loader.d.ts +8 -0
  118. package/core/infrastructure/loaders/Loader.js +14 -0
  119. package/core/infrastructure/loaders/Manager.d.ts +7 -0
  120. package/core/infrastructure/loaders/Manager.js +24 -0
  121. package/core/modules/health/errors/ConnectionNotFoundError.d.ts +4 -0
  122. package/core/modules/health/errors/ConnectionNotFoundError.js +10 -0
  123. package/core/modules/health/errors/HealthCheckError.d.ts +3 -0
  124. package/core/modules/health/errors/HealthCheckError.js +10 -0
  125. package/core/modules/health/errors/TimeoutError.d.ts +4 -0
  126. package/core/modules/health/errors/TimeoutError.js +10 -0
  127. package/core/modules/health/useCases/health/HealthController.d.ts +20 -0
  128. package/core/modules/health/useCases/health/HealthController.js +75 -0
  129. package/core/modules/health/useCases/healthCheck/HealthCheck.d.ts +8 -0
  130. package/core/modules/health/useCases/healthCheck/HealthCheck.js +37 -0
  131. package/core/modules/health/useCases/healthCheck/HealthCheckExecutor.d.ts +8 -0
  132. package/core/modules/health/useCases/healthCheck/HealthCheckExecutor.js +48 -0
  133. package/core/modules/health/useCases/healthCheck/HealthCheckResult.d.ts +6 -0
  134. package/core/modules/health/useCases/healthCheck/HealthCheckResult.js +2 -0
  135. package/core/modules/health/useCases/healthIndicator/HealthIndicator.d.ts +7 -0
  136. package/core/modules/health/useCases/healthIndicator/HealthIndicator.js +14 -0
  137. package/core/modules/health/useCases/healthIndicator/HealthIndicatorResult.d.ts +7 -0
  138. package/core/modules/health/useCases/healthIndicator/HealthIndicatorResult.js +2 -0
  139. package/core/modules/health/useCases/healthIndicator/database/mongooseHealthIndicator.d.ts +21 -0
  140. package/core/modules/health/useCases/healthIndicator/database/mongooseHealthIndicator.js +69 -0
  141. package/core/modules/health/useCases/healthIndicator/database/sequelizeHealthIndicator.d.ts +27 -0
  142. package/core/modules/health/useCases/healthIndicator/database/sequelizeHealthIndicator.js +73 -0
  143. package/core/modules/health/useCases/healthIndicator/message-broker/rabbitmqHealthIndicator.d.ts +21 -0
  144. package/core/modules/health/useCases/healthIndicator/message-broker/rabbitmqHealthIndicator.js +66 -0
  145. package/core/modules/health/utils/promise.d.ts +1 -0
  146. package/core/modules/health/utils/promise.js +12 -0
  147. package/core/modules/service/useCases/detail/DetailController.d.ts +6 -0
  148. package/core/modules/service/useCases/detail/DetailController.js +25 -0
  149. package/core/utils/Crypto.d.ts +24 -0
  150. package/core/utils/Crypto.js +93 -0
  151. package/core/utils/Hash.d.ts +6 -0
  152. package/core/utils/Hash.js +23 -0
  153. package/core/utils/cache.d.ts +1 -0
  154. package/core/utils/cache.js +16 -0
  155. package/core/utils/commands.d.ts +2 -0
  156. package/core/utils/commands.js +7 -0
  157. package/core/utils/events.d.ts +3 -0
  158. package/core/utils/events.js +11 -0
  159. package/core/utils/logger.d.ts +2 -0
  160. package/core/utils/logger.js +15 -0
  161. package/core/utils/response.d.ts +4 -0
  162. package/core/utils/response.js +11 -0
  163. package/core/utils/validator.d.ts +4 -0
  164. package/core/utils/validator.js +48 -0
  165. package/domain/BalanceMutation.d.ts +18 -0
  166. package/domain/BalanceMutation.js +8 -0
  167. package/domain/ChannelWhatsapp.d.ts +18 -0
  168. package/domain/ChannelWhatsapp.js +2 -0
  169. package/domain/MessageTemplate.d.ts +26 -0
  170. package/domain/MessageTemplate.js +12 -0
  171. package/domain/MessageTemplateCategoryUpdate.d.ts +8 -0
  172. package/domain/MessageTemplateCategoryUpdate.js +2 -0
  173. package/domain/MessageTemplateStatusUpdate.d.ts +8 -0
  174. package/domain/MessageTemplateStatusUpdate.js +2 -0
  175. package/domain/Payment.d.ts +14 -0
  176. package/domain/Payment.js +8 -0
  177. package/domain/Report.d.ts +33 -0
  178. package/domain/Report.js +15 -0
  179. package/domain/TransactionMessaging.d.ts +33 -0
  180. package/domain/TransactionMessaging.js +11 -0
  181. package/domain/TransactionMessagingStatusUpdate.d.ts +6 -0
  182. package/domain/TransactionMessagingStatusUpdate.js +2 -0
  183. package/domain/User.d.ts +25 -0
  184. package/domain/User.js +19 -0
  185. package/domain/index.d.ts +10 -0
  186. package/domain/index.js +26 -0
  187. package/index.d.ts +3 -0
  188. package/index.js +19 -0
  189. package/package.json +57 -0
  190. package/readme.md +4 -0
  191. package/shared/index.d.ts +5 -0
  192. package/shared/index.js +21 -0
  193. package/shared/plugins/axios-logger-mongo.d.ts +5 -0
  194. package/shared/plugins/axios-logger-mongo.js +113 -0
  195. package/shared/plugins/axios.d.ts +1 -0
  196. package/shared/plugins/axios.js +31 -0
  197. package/shared/plugins/cursor.d.ts +29 -0
  198. package/shared/plugins/cursor.js +231 -0
  199. package/shared/plugins/mongoose.d.ts +31 -0
  200. package/shared/plugins/mongoose.js +125 -0
  201. package/shared/resources/JsonResource.d.ts +16 -0
  202. package/shared/resources/JsonResource.js +59 -0
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Listener = exports.Connection = void 0;
4
+ const core_1 = require("../../../core");
5
+ const Connection_1 = require("./Connection");
6
+ Object.defineProperty(exports, "Connection", { enumerable: true, get: function () { return Connection_1.Connection; } });
7
+ class Listener {
8
+ static instance;
9
+ connection;
10
+ channel;
11
+ service;
12
+ extraQueues = {};
13
+ exclusiveConnection = false;
14
+ constructor() {
15
+ this.connection = Connection_1.Connection.getConnection(this.connectionName);
16
+ }
17
+ init() {
18
+ this.channel = this.connection.createChannel({
19
+ json: true,
20
+ setup: (channel) => this.setup(channel)
21
+ });
22
+ return this;
23
+ }
24
+ setup(channel) {
25
+ channel.assertExchange(this.exchange, 'topic', { durable: false });
26
+ channel.assertQueue(this.queue);
27
+ channel.bindQueue(this.queue, this.exchange, this.topic);
28
+ channel.prefetch(parseInt(process.env.MQ_PREFETCH ?? '10'));
29
+ }
30
+ setupExtraQueue(channel, suffixes = ['backup']) {
31
+ suffixes.push('json_parse_error');
32
+ suffixes.forEach((suffix) => {
33
+ this.extraQueues[suffix] = `${this.queue}.${suffix}`;
34
+ const extraTopic = `${this.topic}.${suffix}`;
35
+ channel.assertQueue(this.extraQueues[suffix], { durable: false });
36
+ channel.bindQueue(this.extraQueues[suffix], this.exchange, extraTopic);
37
+ });
38
+ }
39
+ listen() {
40
+ return this.channel.consume(this.queue, (msg) => {
41
+ const parsedMessage = this.parseMessage(msg);
42
+ core_1.logger.debug('Receive message %s', this.constructor.name, { parsedMessage });
43
+ if (!parsedMessage)
44
+ return;
45
+ this.onMessage(parsedMessage, () => this.channel.ack(msg), () => this.channel.nack(msg));
46
+ });
47
+ }
48
+ get queue() {
49
+ let queue = [];
50
+ queue.push(this.service);
51
+ queue.push(this.constructor.name);
52
+ queue.push(this.exchange);
53
+ queue.push(this.topic);
54
+ return queue.join('.');
55
+ }
56
+ get connectionName() {
57
+ return this.exclusiveConnection ? this.constructor.name : 'listener';
58
+ }
59
+ parseMessage(msg) {
60
+ try {
61
+ const json = msg.content.toString();
62
+ return JSON.parse(json);
63
+ }
64
+ catch (error) {
65
+ core_1.logger.error("Error while parsing message", {
66
+ message: error.message,
67
+ stack: error.stack,
68
+ });
69
+ if (this.extraQueues.json_parse_error) {
70
+ this.channel.sendToQueue(this.extraQueues.json_parse_error, msg.content);
71
+ }
72
+ this.channel.ack(msg);
73
+ return;
74
+ }
75
+ }
76
+ }
77
+ exports.Listener = Listener;
@@ -0,0 +1,9 @@
1
+ import { Worker as WorkerContract } from '../../../core/domain/events/Worker';
2
+ import { Listener as ListenerContract } from '../../../core/domain/events/Listener';
3
+ export declare class Worker implements WorkerContract {
4
+ protected listeners: ListenerContract[];
5
+ constructor(listeners: any[]);
6
+ protected registerListeners(listeners: any[]): void;
7
+ protected resolve(klass: any): ListenerContract;
8
+ start(): void;
9
+ }
@@ -0,0 +1,34 @@
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.Worker = void 0;
7
+ const Container_1 = require("../../../core/infrastructure/Container");
8
+ const Listener_1 = require("./Listener");
9
+ const logger_1 = __importDefault(require("../../../core/utils/logger"));
10
+ class Worker {
11
+ listeners = [];
12
+ constructor(listeners) {
13
+ this.registerListeners(listeners);
14
+ }
15
+ registerListeners(listeners) {
16
+ listeners.forEach((listener) => {
17
+ const instance = this.resolve(listener);
18
+ this.listeners.push(instance);
19
+ });
20
+ }
21
+ resolve(klass) {
22
+ if (klass instanceof Listener_1.Listener) {
23
+ return klass;
24
+ }
25
+ return Container_1.Container.get(klass);
26
+ }
27
+ start() {
28
+ logger_1.default.info('Register listeners %s', this.listeners);
29
+ for (const listener of this.listeners) {
30
+ listener.init().listen();
31
+ }
32
+ }
33
+ }
34
+ exports.Worker = Worker;
@@ -0,0 +1,9 @@
1
+ import { Server } from "@grpc/grpc-js";
2
+ import { Root } from "protobufjs";
3
+ export declare class Connection {
4
+ private static connection;
5
+ private static server;
6
+ constructor();
7
+ static getConnection(): Root;
8
+ static getServer(): Server;
9
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Connection = void 0;
4
+ const grpc_js_1 = require("@grpc/grpc-js");
5
+ const protobufjs_1 = require("protobufjs");
6
+ class Connection {
7
+ static connection = null;
8
+ static server = null;
9
+ constructor() {
10
+ Connection.connection = new protobufjs_1.Root();
11
+ const Event = new protobufjs_1.Type("Event").add(new protobufjs_1.Field("data", 1, "string"));
12
+ const Listener = new protobufjs_1.Type("Listener").add(new protobufjs_1.Field("message", 1, "string"));
13
+ Connection.connection.add(Event).add(Listener);
14
+ if (!Connection.server) {
15
+ Connection.server = new grpc_js_1.Server();
16
+ Connection.server.bindAsync(process.env.APP_GRPC, grpc_js_1.ServerCredentials.createInsecure(), () => {
17
+ Connection.server.start();
18
+ });
19
+ }
20
+ }
21
+ static getConnection() {
22
+ if (!Connection.connection) {
23
+ new Connection();
24
+ }
25
+ return Connection.connection;
26
+ }
27
+ static getServer() {
28
+ if (!Connection.server) {
29
+ new Connection();
30
+ }
31
+ return Connection.server;
32
+ }
33
+ }
34
+ exports.Connection = Connection;
@@ -0,0 +1,12 @@
1
+ import { Root } from "protobufjs";
2
+ export declare abstract class Event<T> {
3
+ protected connection: Root;
4
+ protected channel: any;
5
+ protected payload: T;
6
+ abstract exchange: string;
7
+ constructor(payload: T);
8
+ init(): this;
9
+ protected setup(): void;
10
+ publish<Response>(options?: {}): Promise<Response>;
11
+ protected parseMessage(message: any): any;
12
+ }
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.Event = void 0;
30
+ const grpc = __importStar(require("@grpc/grpc-js"));
31
+ const protoLoader = __importStar(require("@grpc/proto-loader"));
32
+ const protobufjs_1 = require("protobufjs");
33
+ const Connection_1 = require("./Connection");
34
+ const logger_1 = __importDefault(require("../../../../core/utils/logger"));
35
+ class Event {
36
+ connection;
37
+ channel;
38
+ payload;
39
+ constructor(payload) {
40
+ this.connection = Connection_1.Connection.getConnection();
41
+ this.payload = payload;
42
+ this.setup();
43
+ }
44
+ init() {
45
+ const packageDefinition = protoLoader.fromJSON(this.connection.toJSON());
46
+ const channel = grpc.loadPackageDefinition(packageDefinition);
47
+ this.channel = new channel[this.constructor.name](this.exchange, grpc.credentials.createInsecure());
48
+ return this;
49
+ }
50
+ setup() {
51
+ try {
52
+ if (!this.connection.get(this.constructor.name)) {
53
+ const service = new protobufjs_1.Service(this.constructor.name).add(new protobufjs_1.Method("Publish", "rpc", 'Event', 'Listener'));
54
+ this.connection.add(service);
55
+ }
56
+ }
57
+ catch (error) {
58
+ logger_1.default.error('Error while connecting the server', { error: error.stack });
59
+ }
60
+ }
61
+ publish(options = {}) {
62
+ logger_1.default.debug('Publish message %s', this.constructor.name);
63
+ return new Promise((resolve, reject) => {
64
+ const handleMessage = (err, response) => {
65
+ if (err) {
66
+ console.log({ err });
67
+ reject(err);
68
+ }
69
+ const message = this.parseMessage(response?.message);
70
+ resolve(message);
71
+ };
72
+ this.channel.publish({ data: JSON.stringify(this.payload) }, handleMessage);
73
+ });
74
+ }
75
+ parseMessage(message) {
76
+ const json = message.toString();
77
+ return JSON.parse(json);
78
+ }
79
+ }
80
+ exports.Event = Event;
@@ -0,0 +1,16 @@
1
+ import { Root } from 'protobufjs';
2
+ import { Server } from '@grpc/grpc-js';
3
+ export declare abstract class Listener<T> {
4
+ protected connection: Root;
5
+ protected server: Server;
6
+ protected channel: any;
7
+ protected payload: T;
8
+ abstract exchange: string;
9
+ constructor();
10
+ init(): this;
11
+ protected setup(): Promise<void>;
12
+ abstract onMessage(data: T): Promise<any>;
13
+ listen(): Promise<void>;
14
+ get constructorName(): string;
15
+ protected parseMessage(message: any): any;
16
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.Listener = void 0;
30
+ const protoLoader = __importStar(require("@grpc/proto-loader"));
31
+ const protobufjs_1 = require("protobufjs");
32
+ const Connection_1 = require("./Connection");
33
+ const grpc_js_1 = require("@grpc/grpc-js");
34
+ const logger_1 = __importDefault(require("../../../../core/utils/logger"));
35
+ class Listener {
36
+ connection;
37
+ server;
38
+ channel;
39
+ payload;
40
+ constructor() {
41
+ this.connection = Connection_1.Connection.getConnection();
42
+ this.server = Connection_1.Connection.getServer();
43
+ this.setup();
44
+ }
45
+ init() {
46
+ const packageDefinition = protoLoader.fromJSON(this.connection.toJSON());
47
+ this.channel = (0, grpc_js_1.loadPackageDefinition)(packageDefinition);
48
+ return this;
49
+ }
50
+ async setup() {
51
+ if (!this.connection.get(this.constructorName)) {
52
+ const service = new protobufjs_1.Service(this.constructorName).add(new protobufjs_1.Method("Publish", "rpc", 'Event', 'Listener'));
53
+ this.connection.add(service);
54
+ }
55
+ }
56
+ async listen() {
57
+ this.server.addService(this.channel[this.constructorName].service, {
58
+ publish: async (call, callback) => {
59
+ const parsedMessage = this.parseMessage(call.request.data);
60
+ logger_1.default.info('Receive message %s', this.constructor.name, { parsedMessage });
61
+ const res = await this.onMessage(parsedMessage);
62
+ callback(null, { message: JSON.stringify(res) });
63
+ }
64
+ });
65
+ }
66
+ get constructorName() {
67
+ return this.constructor.name.replace(/Listener/g, '');
68
+ }
69
+ parseMessage(message) {
70
+ const json = message.toString();
71
+ return JSON.parse(json);
72
+ }
73
+ }
74
+ exports.Listener = Listener;
@@ -0,0 +1,13 @@
1
+ import { Event as BaseEvent, Channel } from "../../../../core";
2
+ export declare abstract class Event<T> extends BaseEvent<T> {
3
+ readonly correlationId: string;
4
+ constructor(payload: T);
5
+ setup(channel: Channel): void;
6
+ publish<Response>(options?: {}): Promise<Response>;
7
+ publishWithoutPersistence<Response>(options?: {}): Promise<Response>;
8
+ get queue(): string;
9
+ get exclusiveQueue(): string;
10
+ protected uniqueId(): string;
11
+ protected parseMessage(msg: any): any;
12
+ protected close(): Promise<any>;
13
+ }
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Event = void 0;
4
+ const core_1 = require("../../../../core");
5
+ const promises_1 = require("timers/promises");
6
+ class Event extends core_1.Event {
7
+ correlationId;
8
+ constructor(payload) {
9
+ super(payload);
10
+ this.correlationId = this.uniqueId();
11
+ }
12
+ setup(channel) {
13
+ channel.assertQueue(this.exclusiveQueue, { exclusive: true });
14
+ }
15
+ publish(options = {}) {
16
+ core_1.logger.debug("Publish message %s", this.constructor.name);
17
+ return new Promise((resolve) => {
18
+ const correlationId = this.correlationId;
19
+ const handleMessage = async (msg) => {
20
+ if (msg.properties.correlationId == correlationId) {
21
+ const parsedMessage = this.parseMessage(msg);
22
+ this.channel.removeListener("message", handleMessage);
23
+ await this.close();
24
+ resolve(parsedMessage);
25
+ }
26
+ };
27
+ this.channel.consume(this.exclusiveQueue, handleMessage, { noAck: true });
28
+ this.channel.sendToQueue(this.queue, this.payload, Object.assign({
29
+ correlationId: correlationId,
30
+ replyTo: this.exclusiveQueue,
31
+ deliveryMode: 2,
32
+ persistent: true,
33
+ }, options));
34
+ });
35
+ }
36
+ publishWithoutPersistence(options = {}) {
37
+ core_1.logger.debug("Publish message %s", this.constructor.name);
38
+ return new Promise((resolve) => {
39
+ const correlationId = this.correlationId;
40
+ const handleMessage = async (msg) => {
41
+ if (msg.properties.correlationId == correlationId) {
42
+ const parsedMessage = this.parseMessage(msg);
43
+ this.channel.removeListener("message", handleMessage);
44
+ await this.close();
45
+ resolve(parsedMessage);
46
+ }
47
+ };
48
+ this.channel.consume(this.exclusiveQueue, handleMessage, { noAck: true });
49
+ this.channel.sendToQueue(this.queue, this.payload, Object.assign({
50
+ correlationId: correlationId,
51
+ replyTo: this.exclusiveQueue,
52
+ deliveryMode: 1,
53
+ persistent: false,
54
+ }, options));
55
+ });
56
+ }
57
+ get queue() {
58
+ const queue = [];
59
+ queue.push("Rmq");
60
+ queue.push("rpc");
61
+ queue.push(this.exchange);
62
+ queue.push(this.topic);
63
+ return queue.join(".");
64
+ }
65
+ get exclusiveQueue() {
66
+ const executiveQueue = [];
67
+ executiveQueue.push(this.constructor.name);
68
+ executiveQueue.push(this.exchange);
69
+ executiveQueue.push(this.topic);
70
+ executiveQueue.push(this.correlationId);
71
+ return executiveQueue.join(".");
72
+ }
73
+ uniqueId() {
74
+ return String(new core_1.UniqueId());
75
+ }
76
+ parseMessage(msg) {
77
+ const json = msg.content.toString();
78
+ return JSON.parse(json);
79
+ }
80
+ async close() {
81
+ return await (0, promises_1.setTimeout)(1000, async () => {
82
+ if (this.channel) {
83
+ this.channel
84
+ .deleteQueue(this.exclusiveQueue)
85
+ .then(() => {
86
+ core_1.logger.info("The response queue is cleared");
87
+ })
88
+ .catch((err) => {
89
+ core_1.logger.error("Failed to delete queue: ", { msg: err.message });
90
+ });
91
+ await this.channel.close().catch((reason) => {
92
+ core_1.logger.error("Failed to close rpc channel", { reason });
93
+ });
94
+ }
95
+ });
96
+ }
97
+ }
98
+ exports.Event = Event;
@@ -0,0 +1,6 @@
1
+ import { Listener as BaseListener, Channel } from '../../../../core';
2
+ export declare abstract class Listener<T> extends BaseListener<T> {
3
+ setup(channel: Channel): void;
4
+ listen(): Promise<import("amqplib").Replies.Consume>;
5
+ get queue(): string;
6
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Listener = void 0;
4
+ const core_1 = require("../../../../core");
5
+ class Listener extends core_1.Listener {
6
+ setup(channel) {
7
+ channel.assertQueue(this.queue, { durable: true });
8
+ channel.prefetch(parseInt(process.env.MQ_PREFETCH ?? '10'));
9
+ }
10
+ listen() {
11
+ return this.channel.consume(this.queue, async (msg) => {
12
+ const parsedMessage = this.parseMessage(msg);
13
+ core_1.logger.debug('Receive message %s', this.constructor.name, { parsedMessage });
14
+ const res = await this.onMessage(parsedMessage, () => this.channel.ack);
15
+ await this.channel.sendToQueue(msg.properties.replyTo, res, {
16
+ correlationId: msg.properties.correlationId
17
+ });
18
+ this.channel.ack(msg);
19
+ });
20
+ }
21
+ get queue() {
22
+ const queue = [];
23
+ queue.push('Rmq');
24
+ queue.push('rpc');
25
+ queue.push(this.exchange);
26
+ queue.push(this.topic);
27
+ return queue.join('.');
28
+ }
29
+ }
30
+ exports.Listener = Listener;
@@ -0,0 +1,15 @@
1
+ import express from 'express';
2
+ import 'express-async-errors';
3
+ import { Controller } from '../../../core/infrastructure/Controller';
4
+ export declare class App {
5
+ protected app: express.Application;
6
+ protected controllers: any[];
7
+ constructor(controllers: any[], options?: any);
8
+ start(): void;
9
+ protected registerMiddleware(): void;
10
+ protected registerControllers(controllers: any[]): void;
11
+ protected resolve(klass: any): Controller;
12
+ protected registerHealthHandlers(health: any): void;
13
+ protected registerDetailControllers(): void;
14
+ protected registerErrorHandlers(): void;
15
+ }
@@ -0,0 +1,73 @@
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.App = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const helmet_1 = __importDefault(require("helmet"));
9
+ const cors_1 = __importDefault(require("cors"));
10
+ require("express-async-errors");
11
+ const Container_1 = require("../../../core/infrastructure/Container");
12
+ const Controller_1 = require("../../../core/infrastructure/Controller");
13
+ const loggerMiddleware_1 = require("../../../core/infrastructure/http/middleware/loggerMiddleware");
14
+ const routeNotFoundMiddleware_1 = require("../../../core/infrastructure/http/middleware/routeNotFoundMiddleware");
15
+ const errorMiddleware_1 = require("../../../core/infrastructure/http/middleware/errorMiddleware");
16
+ const alwaysAcceptJsonMiddleware_1 = require("../../../core/infrastructure/http/middleware/alwaysAcceptJsonMiddleware");
17
+ const HealthController_1 = __importDefault(require("../../../core/modules/health/useCases/health/HealthController"));
18
+ const DetailController_1 = __importDefault(require("../../../core/modules/service/useCases/detail/DetailController"));
19
+ class App {
20
+ app = (0, express_1.default)();
21
+ controllers = [];
22
+ constructor(controllers, options = {}) {
23
+ this.registerMiddleware();
24
+ this.registerHealthHandlers(options.health);
25
+ this.registerDetailControllers();
26
+ this.registerControllers([...this.controllers, ...controllers]);
27
+ this.registerErrorHandlers();
28
+ }
29
+ start() {
30
+ this.app.listen(3000, () => {
31
+ console.info('App listening @', 3000);
32
+ });
33
+ }
34
+ registerMiddleware() {
35
+ this.app.disable('x-powered-by');
36
+ this.app.use(loggerMiddleware_1.loggerMiddleware);
37
+ this.app.use(alwaysAcceptJsonMiddleware_1.alwaysAcceptJsonMiddleware);
38
+ this.app.use((0, cors_1.default)({ origin: '*' }));
39
+ // this.app.use(compression());
40
+ this.app.use((0, helmet_1.default)());
41
+ this.app.use(express_1.default.json({ limit: '2048mb' }));
42
+ this.app.use(express_1.default.urlencoded({ limit: '2048mb', extended: true }));
43
+ }
44
+ registerControllers(controllers) {
45
+ controllers.forEach((controller) => {
46
+ const instance = this.resolve(controller);
47
+ this.app.use('/', instance.router);
48
+ });
49
+ }
50
+ resolve(klass) {
51
+ if (klass instanceof Controller_1.Controller) {
52
+ return klass;
53
+ }
54
+ return Container_1.Container.get(klass);
55
+ }
56
+ registerHealthHandlers(health) {
57
+ Container_1.Container.set('health', health);
58
+ if (!Container_1.Container.has('HealthController')) {
59
+ this.controllers.push(HealthController_1.default);
60
+ return;
61
+ }
62
+ const healthController = Container_1.Container.get('HealthController');
63
+ this.controllers.push(healthController);
64
+ }
65
+ registerDetailControllers() {
66
+ this.controllers.push(DetailController_1.default);
67
+ }
68
+ registerErrorHandlers() {
69
+ this.app.use(routeNotFoundMiddleware_1.routeNotFoundMiddleware);
70
+ this.app.use(errorMiddleware_1.errorMiddleware);
71
+ }
72
+ }
73
+ exports.App = App;
@@ -0,0 +1,2 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ export declare function alwaysAcceptJsonMiddleware(req: Request, res: Response, next: NextFunction): void;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.alwaysAcceptJsonMiddleware = void 0;
4
+ function alwaysAcceptJsonMiddleware(req, res, next) {
5
+ req.headers['accept'] = 'application/json';
6
+ next();
7
+ }
8
+ exports.alwaysAcceptJsonMiddleware = alwaysAcceptJsonMiddleware;
@@ -0,0 +1,2 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ export declare function errorMiddleware(err: Error, req: Request, res: Response, next: NextFunction): Response<any, Record<string, any>>;
@@ -0,0 +1,18 @@
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.errorMiddleware = void 0;
7
+ const logger_1 = __importDefault(require("../../../../core/utils/logger"));
8
+ const AppError_1 = require("../../../../core/errors/AppError");
9
+ const response_1 = require("../../../../core/utils/response");
10
+ function errorMiddleware(err, req, res, next) {
11
+ if (err instanceof AppError_1.AppError) {
12
+ logger_1.default.error(err.message, { cause: err.cause, stack: err.stack, res: err.serializeErrors() });
13
+ return (0, response_1.sendErrorResponse)(res, err.serializeErrors(), err.status);
14
+ }
15
+ logger_1.default.error(err.message, { cause: err.cause, stack: err.stack });
16
+ return (0, response_1.sendErrorResponse)(res, [{ message: err.message }]);
17
+ }
18
+ exports.errorMiddleware = errorMiddleware;
@@ -0,0 +1,2 @@
1
+ /// <reference types="node" />
2
+ export declare const loggerMiddleware: (req: import("http").IncomingMessage, res: import("http").ServerResponse<import("http").IncomingMessage>, callback: (err?: Error | undefined) => void) => void;
@@ -0,0 +1,17 @@
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.loggerMiddleware = void 0;
7
+ const morgan_1 = __importDefault(require("morgan"));
8
+ const morgan_json_1 = __importDefault(require("morgan-json"));
9
+ const logger_1 = require("../../../../core/utils/logger");
10
+ exports.loggerMiddleware = (0, morgan_1.default)((0, morgan_json_1.default)(':method :url :status :res[content-length] :response-time :user-agent'), {
11
+ stream: new class {
12
+ write(message) {
13
+ const logMessage = JSON.parse(message);
14
+ logger_1.logger.info(logMessage);
15
+ }
16
+ }
17
+ });
@@ -0,0 +1,2 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ export declare function routeNotFoundMiddleware(req: Request, res: Response, next: NextFunction): void;