@diia-inhouse/diia-queue 7.3.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 (90) hide show
  1. package/LICENCE.md +287 -0
  2. package/README.md +93 -0
  3. package/dist/constants.js +7 -0
  4. package/dist/constants.js.map +1 -0
  5. package/dist/index.js +19 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/interfaces/deps.js +3 -0
  8. package/dist/interfaces/deps.js.map +1 -0
  9. package/dist/interfaces/externalCommunicator.js +3 -0
  10. package/dist/interfaces/externalCommunicator.js.map +1 -0
  11. package/dist/interfaces/index.js +27 -0
  12. package/dist/interfaces/index.js.map +1 -0
  13. package/dist/interfaces/metrics/index.js +3 -0
  14. package/dist/interfaces/metrics/index.js.map +1 -0
  15. package/dist/interfaces/providers/rabbitmq/amqpConnection.js +14 -0
  16. package/dist/interfaces/providers/rabbitmq/amqpConnection.js.map +1 -0
  17. package/dist/interfaces/providers/rabbitmq/amqpListener.js +3 -0
  18. package/dist/interfaces/providers/rabbitmq/amqpListener.js.map +1 -0
  19. package/dist/interfaces/providers/rabbitmq/amqpPublisher.js +12 -0
  20. package/dist/interfaces/providers/rabbitmq/amqpPublisher.js.map +1 -0
  21. package/dist/interfaces/providers/rabbitmq/index.js +25 -0
  22. package/dist/interfaces/providers/rabbitmq/index.js.map +1 -0
  23. package/dist/interfaces/queueConfig/configs.js +9 -0
  24. package/dist/interfaces/queueConfig/configs.js.map +1 -0
  25. package/dist/interfaces/queueConfig/index.js +18 -0
  26. package/dist/interfaces/queueConfig/index.js.map +1 -0
  27. package/dist/interfaces/queueStatus.js +3 -0
  28. package/dist/interfaces/queueStatus.js.map +1 -0
  29. package/dist/metrics/index.js +9 -0
  30. package/dist/metrics/index.js.map +1 -0
  31. package/dist/providers/rabbitmq/amqpConnection.js +129 -0
  32. package/dist/providers/rabbitmq/amqpConnection.js.map +1 -0
  33. package/dist/providers/rabbitmq/amqpListener.js +171 -0
  34. package/dist/providers/rabbitmq/amqpListener.js.map +1 -0
  35. package/dist/providers/rabbitmq/amqpPublisher.js +140 -0
  36. package/dist/providers/rabbitmq/amqpPublisher.js.map +1 -0
  37. package/dist/providers/rabbitmq/index.js +367 -0
  38. package/dist/providers/rabbitmq/index.js.map +1 -0
  39. package/dist/services/eventBus.js +63 -0
  40. package/dist/services/eventBus.js.map +1 -0
  41. package/dist/services/eventMessageHandler.js +145 -0
  42. package/dist/services/eventMessageHandler.js.map +1 -0
  43. package/dist/services/eventMessageValidator.js +44 -0
  44. package/dist/services/eventMessageValidator.js.map +1 -0
  45. package/dist/services/externalCommunicator.js +134 -0
  46. package/dist/services/externalCommunicator.js.map +1 -0
  47. package/dist/services/externalCommunicatorChannel.js +31 -0
  48. package/dist/services/externalCommunicatorChannel.js.map +1 -0
  49. package/dist/services/externalEventBus.js +71 -0
  50. package/dist/services/externalEventBus.js.map +1 -0
  51. package/dist/services/index.js +26 -0
  52. package/dist/services/index.js.map +1 -0
  53. package/dist/services/queue.js +56 -0
  54. package/dist/services/queue.js.map +1 -0
  55. package/dist/services/scheduledTask.js +65 -0
  56. package/dist/services/scheduledTask.js.map +1 -0
  57. package/dist/services/task.js +56 -0
  58. package/dist/services/task.js.map +1 -0
  59. package/dist/types/constants.d.ts +5 -0
  60. package/dist/types/index.d.ts +3 -0
  61. package/dist/types/interfaces/deps.d.ts +17 -0
  62. package/dist/types/interfaces/externalCommunicator.d.ts +35 -0
  63. package/dist/types/interfaces/index.d.ts +89 -0
  64. package/dist/types/interfaces/metrics/index.d.ts +7 -0
  65. package/dist/types/interfaces/providers/rabbitmq/amqpConnection.d.ts +26 -0
  66. package/dist/types/interfaces/providers/rabbitmq/amqpListener.d.ts +7 -0
  67. package/dist/types/interfaces/providers/rabbitmq/amqpPublisher.d.ts +24 -0
  68. package/dist/types/interfaces/providers/rabbitmq/index.d.ts +50 -0
  69. package/dist/types/interfaces/queueConfig/configs.d.ts +39 -0
  70. package/dist/types/interfaces/queueConfig/index.d.ts +1 -0
  71. package/dist/types/interfaces/queueStatus.d.ts +6 -0
  72. package/dist/types/metrics/index.d.ts +4 -0
  73. package/dist/types/providers/rabbitmq/amqpConnection.d.ts +24 -0
  74. package/dist/types/providers/rabbitmq/amqpListener.d.ts +26 -0
  75. package/dist/types/providers/rabbitmq/amqpPublisher.d.ts +25 -0
  76. package/dist/types/providers/rabbitmq/index.d.ts +55 -0
  77. package/dist/types/services/eventBus.d.ts +16 -0
  78. package/dist/types/services/eventMessageHandler.d.ts +21 -0
  79. package/dist/types/services/eventMessageValidator.d.ts +9 -0
  80. package/dist/types/services/externalCommunicator.d.ts +24 -0
  81. package/dist/types/services/externalCommunicatorChannel.d.ts +11 -0
  82. package/dist/types/services/externalEventBus.d.ts +18 -0
  83. package/dist/types/services/index.d.ts +9 -0
  84. package/dist/types/services/queue.d.ts +18 -0
  85. package/dist/types/services/scheduledTask.d.ts +17 -0
  86. package/dist/types/services/task.d.ts +18 -0
  87. package/dist/types/utils.d.ts +3 -0
  88. package/dist/utils.js +12 -0
  89. package/dist/utils.js.map +1 -0
  90. package/package.json +105 -0
@@ -0,0 +1,129 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.AmqpConnection = void 0;
27
+ const node_events_1 = require("node:events");
28
+ const os = __importStar(require("node:os"));
29
+ const amqplib_1 = require("amqplib");
30
+ const amqpConnection_1 = require("../../interfaces/providers/rabbitmq/amqpConnection");
31
+ const defaultSocketOptions = {
32
+ clientProperties: {
33
+ hostname: os.hostname(),
34
+ },
35
+ };
36
+ const defaultReconnectTimeoutMs = 5000;
37
+ // eslint-disable-next-line unicorn/prefer-event-target
38
+ class AmqpConnection extends node_events_1.EventEmitter {
39
+ connectOptions;
40
+ logger;
41
+ reconnectOptions;
42
+ socketOptions;
43
+ reconnectEnabled = false;
44
+ reconnectTimeout = defaultReconnectTimeoutMs;
45
+ connection = null;
46
+ connectionStatus = amqpConnection_1.ConnectionStatus.Init;
47
+ constructor(connectOptions, logger, reconnectOptions, socketOptions = defaultSocketOptions) {
48
+ super();
49
+ this.connectOptions = connectOptions;
50
+ this.logger = logger;
51
+ this.reconnectOptions = reconnectOptions;
52
+ this.socketOptions = socketOptions;
53
+ if (this.reconnectOptions) {
54
+ const { reconnectEnabled, reconnectTimeout } = this.reconnectOptions;
55
+ this.reconnectEnabled = reconnectEnabled || this.reconnectEnabled;
56
+ this.reconnectTimeout = reconnectTimeout || this.reconnectTimeout;
57
+ }
58
+ }
59
+ async connect() {
60
+ this.connectionStatus = amqpConnection_1.ConnectionStatus.Connecting;
61
+ try {
62
+ this.connection = await (0, amqplib_1.connect)(this.connectOptions, this.socketOptions);
63
+ this.connectionStatus = amqpConnection_1.ConnectionStatus.Connected;
64
+ this.logger.info('Connection to RabbitMQ is created');
65
+ this.logger.info('Connection is ready');
66
+ this.emit('ready');
67
+ this.connection.on('close', async () => {
68
+ this.connectionStatus = amqpConnection_1.ConnectionStatus.Closed;
69
+ if (this.reconnectEnabled) {
70
+ await this.reconnect();
71
+ this.logger.warn('Successful reconnect');
72
+ }
73
+ else {
74
+ this.logger.warn('Reconnect is disabled in config');
75
+ }
76
+ });
77
+ this.connection.on('error', async (err) => {
78
+ this.logger.error('Connection error', err);
79
+ });
80
+ }
81
+ catch (err) {
82
+ this.logger.error('Creating connection to Rabbit MQ error', { err });
83
+ if (this.reconnectEnabled) {
84
+ await this.reconnect();
85
+ this.logger.warn('Successful reconnect');
86
+ }
87
+ else {
88
+ throw err;
89
+ }
90
+ }
91
+ }
92
+ /**
93
+ * Create new channel
94
+ */
95
+ async createChannel(queueName) {
96
+ this.logger.info('Creating channel to RabbitMQ...', { queueName });
97
+ const channel = await this.connection.createChannel();
98
+ channel.on('close', async () => {
99
+ this.logger.info('Channel was closed.');
100
+ });
101
+ channel.on('error', (err) => {
102
+ this.logger.error('Channel on error', { err });
103
+ });
104
+ this.logger.info('Channel to RabbitMQ is created', { queueName });
105
+ return channel;
106
+ }
107
+ async reconnect() {
108
+ this.connectionStatus = amqpConnection_1.ConnectionStatus.Reconnecting;
109
+ this.logger.info(`Try to reconnect to Rabbit MQ in ${this.reconnectTimeout} ms`);
110
+ await new Promise((resolve) => {
111
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
112
+ setTimeout(resolve, this.reconnectTimeout);
113
+ });
114
+ await this.connect();
115
+ }
116
+ async closeConnection() {
117
+ if (!this.connection) {
118
+ return;
119
+ }
120
+ this.connectionStatus = amqpConnection_1.ConnectionStatus.Closing;
121
+ await this.connection.close();
122
+ this.logger.info('Connection was closed');
123
+ }
124
+ getStatus() {
125
+ return this.connectionStatus;
126
+ }
127
+ }
128
+ exports.AmqpConnection = AmqpConnection;
129
+ //# sourceMappingURL=amqpConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amqpConnection.js","sourceRoot":"","sources":["../../../src/providers/rabbitmq/amqpConnection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
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.AmqpListener = void 0;
7
+ const constants_1 = __importDefault(require("../../constants"));
8
+ const metrics_1 = require("../../metrics");
9
+ class AmqpListener {
10
+ connection;
11
+ logger;
12
+ options;
13
+ queuesChannels = new Map();
14
+ queueCallback = new Map();
15
+ constructor(connection, logger, options) {
16
+ this.connection = connection;
17
+ this.logger = logger;
18
+ this.options = options;
19
+ }
20
+ async init() {
21
+ this.connection.on('ready', async () => {
22
+ // in case if reconnect happened
23
+ const tasks = Array.from(this.queuesChannels.keys()).map(async (queueName) => {
24
+ const queueOptions = this.getQueueOptions(queueName);
25
+ await this.createChannelAndListenQueue(queueName, queueOptions);
26
+ });
27
+ await Promise.all(tasks);
28
+ });
29
+ }
30
+ async listenQueue(queueName, callback, queueOptions = this.options?.queueOptions ?? { durable: false }) {
31
+ this.logger.debug(`Start listen queue [${queueName}]`);
32
+ try {
33
+ this.saveQueueCallback(queueName, callback);
34
+ await this.createChannelAndListenQueue(queueName, queueOptions);
35
+ }
36
+ catch (err) {
37
+ this.logger.error(`Error while start listen queue [${queueName}]`);
38
+ throw err;
39
+ }
40
+ }
41
+ async bindQueueToExchange(queueName, exchangeName, routingKey = constants_1.default.DEFAULT_ROUTING_KEY) {
42
+ try {
43
+ this.logger.debug(`Binding queue - ${queueName} to exchange ${exchangeName} with routing key [${routingKey}]`);
44
+ const channel = this.getChannel(queueName);
45
+ return await channel.bindQueue(queueName, exchangeName, routingKey);
46
+ }
47
+ catch (err) {
48
+ this.logger.error(`Error while binding queue [${queueName}] to exchange [${exchangeName}]`, { err });
49
+ throw err;
50
+ }
51
+ }
52
+ getStatus() {
53
+ return this.connection.getStatus();
54
+ }
55
+ ackMsg(channel, message, allUpTo = false) {
56
+ return channel.ack(message, allUpTo);
57
+ }
58
+ nackMsg(channel, message) {
59
+ return channel.nack(message);
60
+ }
61
+ async createChannelAndListenQueue(queueName, queueOptions) {
62
+ const channel = await this.connection.createChannel(queueName);
63
+ await channel.assertQueue(queueName, queueOptions);
64
+ await channel.prefetch(this.options?.prefetchCount ?? 1);
65
+ const callback = this.getQueueCallback(queueName);
66
+ await channel.consume(queueName, this.onMessageCallback(channel, callback));
67
+ try {
68
+ await this.queuesChannels.get(queueName)?.channel?.close();
69
+ }
70
+ catch (err) {
71
+ this.logger.error('Failed to close prev channel', { err, queueName });
72
+ }
73
+ this.saveChannel(queueName, channel, queueOptions);
74
+ channel.on('error', async (err) => {
75
+ metrics_1.totalListenerChannelErrorsMetric.increment({ queueName });
76
+ this.logger.warn('Recreating listener channel with queue on error...', { err, queueName, queueOptions });
77
+ await this.createChannelAndListenQueue(queueName, queueOptions);
78
+ });
79
+ }
80
+ saveQueueCallback(queueName, callback) {
81
+ this.queueCallback.set(queueName, callback);
82
+ }
83
+ getQueueCallback(queueName) {
84
+ const callback = this.queueCallback.get(queueName);
85
+ if (!callback) {
86
+ const errMsg = `Failed to find callback by queue name [${queueName}]`;
87
+ this.logger.error(errMsg);
88
+ throw new Error('Error');
89
+ }
90
+ return callback;
91
+ }
92
+ getChannel(queueName) {
93
+ const { channel } = this.queuesChannels.get(queueName);
94
+ if (!channel) {
95
+ const errMsg = `Failed to find channel by queue name [${queueName}]`;
96
+ this.logger.error(errMsg);
97
+ throw new Error('Error');
98
+ }
99
+ return channel;
100
+ }
101
+ getQueueOptions(queueName) {
102
+ const { queueOptions } = this.queuesChannels.get(queueName);
103
+ if (!queueOptions) {
104
+ const errMsg = `Failed to find queueOptions by queue name [${queueName}]`;
105
+ this.logger.error(errMsg);
106
+ throw new Error('Error');
107
+ }
108
+ return queueOptions;
109
+ }
110
+ saveChannel(queueName, channel, queueOptions) {
111
+ this.queuesChannels.set(queueName, { channel, queueOptions });
112
+ }
113
+ onMessageCallback(channel, callback) {
114
+ return (message) => {
115
+ /**
116
+ * Message example
117
+ * { fields:
118
+ { consumerTag: 'amq.ctag-NwvV8sVg94TU6dW7tNDlzg',
119
+ deliveryTag: 226,
120
+ redelivered: true,
121
+ exchange: '',
122
+ routingKey: 'QueueUser' },
123
+ properties:
124
+ { contentType: undefined,
125
+ contentEncoding: undefined,
126
+ headers: {},
127
+ deliveryMode: 1,
128
+ priority: undefined,
129
+ correlationId: undefined,
130
+ replyTo: undefined,
131
+ expiration: undefined,
132
+ messageId: undefined,
133
+ timestamp: undefined,
134
+ type: undefined,
135
+ userId: undefined,
136
+ appId: undefined,
137
+ clusterId: undefined },
138
+ content: <Buffer 7b 22 74 65 73 74 22 3a 20 66 61 6c 73 65 7d> }
139
+ */
140
+ let messageContent;
141
+ try {
142
+ messageContent = JSON.parse(message.content.toString());
143
+ }
144
+ catch {
145
+ this.logger.error('Error while parse message content', message);
146
+ return this.ackMsg(channel, message);
147
+ }
148
+ const response = {
149
+ id: message.properties.messageId,
150
+ data: messageContent,
151
+ properties: message.properties,
152
+ done: (data) => {
153
+ const { replyTo, correlationId } = message.properties;
154
+ if (data && replyTo && correlationId) {
155
+ channel.publish('', replyTo, Buffer.from(JSON.stringify(data)), { correlationId });
156
+ }
157
+ else if (!data && replyTo && correlationId) {
158
+ this.logger.warn('Reply to and correlationId headers found but no reply data specified');
159
+ }
160
+ this.ackMsg(channel, message);
161
+ },
162
+ reject: () => {
163
+ this.nackMsg(channel, message);
164
+ },
165
+ };
166
+ return callback(response);
167
+ };
168
+ }
169
+ }
170
+ exports.AmqpListener = AmqpListener;
171
+ //# sourceMappingURL=amqpListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amqpListener.js","sourceRoot":"","sources":["../../../src/providers/rabbitmq/amqpListener.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
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.AmqpPublisher = void 0;
7
+ const node_events_1 = require("node:events");
8
+ const uuid_1 = require("uuid");
9
+ const constants_1 = __importDefault(require("../../constants"));
10
+ const interfaces_1 = require("../../interfaces");
11
+ const { APP_ID, DEFAULT_ROUTING_KEY } = constants_1.default;
12
+ class AmqpPublisher {
13
+ connection;
14
+ logger;
15
+ timeout;
16
+ defaultExchangeType = interfaces_1.ExchangeType.Topic;
17
+ channel;
18
+ eventEmitter;
19
+ defaultExchangeOptions = {
20
+ durable: true,
21
+ autoDelete: false,
22
+ };
23
+ constructor(connection, logger, timeout = 10000) {
24
+ this.connection = connection;
25
+ this.logger = logger;
26
+ this.timeout = timeout;
27
+ }
28
+ async init() {
29
+ await this.createChannel();
30
+ this.connection.on('ready', async () => {
31
+ // in case if reconnect happened
32
+ await this.createChannel();
33
+ });
34
+ }
35
+ async createChannel() {
36
+ const queueName = 'amq.rabbitmq.reply-to';
37
+ this.channel = await this.connection.createChannel(queueName);
38
+ // eslint-disable-next-line unicorn/prefer-event-target
39
+ this.eventEmitter = new node_events_1.EventEmitter();
40
+ this.eventEmitter.setMaxListeners(0);
41
+ await this.channel.consume(queueName, (msg) => {
42
+ this.eventEmitter.emit(msg.properties.correlationId, JSON.parse(msg.content.toString('utf8')));
43
+ }, { noAck: true });
44
+ }
45
+ async publishToExchange(params) {
46
+ const { eventName, message, exchangeName, routingKey = DEFAULT_ROUTING_KEY, responseRoutingKey, headers, options } = params;
47
+ if (!eventName || !exchangeName || !message) {
48
+ this.logger.error(`Invalid event name [${eventName}] or exchange name [${exchangeName}] or message [${JSON.stringify(message)}]`);
49
+ return false;
50
+ }
51
+ const eventMessage = AmqpPublisher.prepareQueueMessageData(eventName, responseRoutingKey, message, options);
52
+ return await this.publish(eventMessage, exchangeName, routingKey, headers);
53
+ }
54
+ async publishToExchangeDirect(params) {
55
+ const { eventName, message, exchangeName, routingKey = DEFAULT_ROUTING_KEY, responseRoutingKey, headers, options } = params;
56
+ const timeout = options?.timeout || this.timeout;
57
+ if (!eventName || !exchangeName || !message) {
58
+ throw new Error(`Invalid event name [${eventName}] or exchange name [${exchangeName}] or message [${JSON.stringify(message)}]`);
59
+ }
60
+ const eventMessage = AmqpPublisher.prepareQueueMessageData(eventName, responseRoutingKey, message, options);
61
+ return await this.publishDirect(eventMessage, exchangeName, routingKey, timeout, headers);
62
+ }
63
+ static prepareQueueMessageData(eventName, responseRoutingKey, message, options) {
64
+ const eventMessage = {
65
+ event: eventName,
66
+ payload: message,
67
+ meta: {
68
+ date: new Date(),
69
+ },
70
+ };
71
+ if (responseRoutingKey) {
72
+ eventMessage.meta.responseRoutingKey = responseRoutingKey;
73
+ }
74
+ if (options?.ignoreCache) {
75
+ eventMessage.meta.ignoreCache = options.ignoreCache;
76
+ }
77
+ return eventMessage;
78
+ }
79
+ publishDirect(eventMessage, exchangeName, routingKey, timeoutMs, headers) {
80
+ const correlationId = (0, uuid_1.v4)();
81
+ this.logger.io(`Publish direct event: ${eventMessage.event}`, { routingKey, eventMessage, correlationId });
82
+ const publishOptions = AmqpPublisher.defaultPublishOptions(headers);
83
+ publishOptions.replyTo = 'amq.rabbitmq.reply-to';
84
+ publishOptions.correlationId = correlationId;
85
+ return new Promise((resolve, reject) => {
86
+ const timeout = setTimeout(() => {
87
+ this.eventEmitter.removeAllListeners(correlationId);
88
+ reject(new Error('Time out for external event: ' + eventMessage.event));
89
+ }, timeoutMs);
90
+ this.eventEmitter.once(correlationId, (args) => {
91
+ clearTimeout(timeout);
92
+ resolve(args);
93
+ });
94
+ try {
95
+ this.channel.publish(exchangeName, routingKey, Buffer.from(JSON.stringify(eventMessage)), publishOptions);
96
+ }
97
+ catch (err) {
98
+ reject(err);
99
+ }
100
+ });
101
+ }
102
+ async publish(eventMessage, exchangeName, routingKey, headers) {
103
+ const delay = headers?.['x-delay'];
104
+ this.logger.io(`Publish event: ${eventMessage.event}`, { routingKey, eventMessage, delay });
105
+ const publishOptions = AmqpPublisher.defaultPublishOptions(headers);
106
+ return this.channel.publish(exchangeName, routingKey, Buffer.from(JSON.stringify(eventMessage)), publishOptions);
107
+ }
108
+ static defaultPublishOptions(headers) {
109
+ return {
110
+ // eslint-disable-next-line unicorn/text-encoding-identifier-case
111
+ contentEncoding: 'utf-8',
112
+ contentType: 'application/json',
113
+ // if true, the message will be returned if it is not routed to a queue
114
+ // i.e., if there are no bindings that match its routing key
115
+ // meaning persistent
116
+ deliveryMode: 2,
117
+ // an arbitrary identifier for the originating application
118
+ appId: APP_ID,
119
+ // if true, the message will be returned if it is not routed to a queue
120
+ // (i.e., if there are no bindings that match its routing key).
121
+ mandatory: true,
122
+ timestamp: Date.now(),
123
+ headers,
124
+ };
125
+ }
126
+ async checkExchange(exchangeName, exchangeType = this.defaultExchangeType, options = {}) {
127
+ try {
128
+ return await this.channel.assertExchange(exchangeName, exchangeType, { ...this.defaultExchangeOptions, ...options });
129
+ }
130
+ catch (err) {
131
+ this.logger.error(`Error while assert exchange [${exchangeName}]`);
132
+ throw err;
133
+ }
134
+ }
135
+ getStatus() {
136
+ return this.connection.getStatus();
137
+ }
138
+ }
139
+ exports.AmqpPublisher = AmqpPublisher;
140
+ //# sourceMappingURL=amqpPublisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amqpPublisher.js","sourceRoot":"","sources":["../../../src/providers/rabbitmq/amqpPublisher.ts"],"names":[],"mappings":";;;;;;AAAA,6CAA0C;AAG1C,+BAAiC;AAIjC,gEAAuC;AACvC,iDAAgH;AAKhH,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,mBAAS,CAAA;AAEjD,MAAa,aAAa;IAaD;IACA;IACA;IAdZ,mBAAmB,GAAiB,yBAAY,CAAC,KAAK,CAAA;IAEvD,OAAO,CAAS;IAEhB,YAAY,CAAc;IAEjB,sBAAsB,GAA2B;QAC9D,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,KAAK;KACpB,CAAA;IAED,YACqB,UAA0B,EAC1B,MAAc,EACd,UAAU,KAAK;QAFf,eAAU,GAAV,UAAU,CAAgB;QAC1B,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAQ;IACjC,CAAC;IAEJ,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAE1B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YACnC,gCAAgC;YAChC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;IACN,CAAC;IAEO,KAAK,CAAC,aAAa;QACvB,MAAM,SAAS,GAAG,uBAAuB,CAAA;QAEzC,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;QAC7D,uDAAuD;QACvD,IAAI,CAAC,YAAY,GAAG,IAAI,0BAAY,EAAE,CAAA;QACtC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACtB,SAAS,EACT,CAAC,GAAG,EAAE,EAAE;YACJ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAClG,CAAC,EACD,EAAE,KAAK,EAAE,IAAI,EAAE,CAClB,CAAA;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAA+B;QACnD,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,GAAG,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;QAE3H,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE;YACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,uBAAuB,SAAS,uBAAuB,YAAY,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CACjH,CAAA;YAED,OAAO,KAAK,CAAA;SACf;QAED,MAAM,YAAY,GAAqB,aAAa,CAAC,uBAAuB,CAAC,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAE7H,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;IAC9E,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAI,MAA+B;QAC5D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,GAAG,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;QAE3H,MAAM,OAAO,GAAW,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAA;QACxD,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,uBAAuB,YAAY,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;SAClI;QAED,MAAM,YAAY,GAAqB,aAAa,CAAC,uBAAuB,CAAC,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAE7H,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC7F,CAAC;IAEO,MAAM,CAAC,uBAAuB,CAClC,SAAiB,EACjB,kBAA0B,EAC1B,OAAgB,EAChB,OAAqC;QAErC,MAAM,YAAY,GAAqB;YACnC,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE;gBACF,IAAI,EAAE,IAAI,IAAI,EAAE;aACnB;SACJ,CAAA;QACD,IAAI,kBAAkB,EAAE;YACpB,YAAY,CAAC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;SAC5D;QAED,IAAI,OAAO,EAAE,WAAW,EAAE;YACtB,YAAY,CAAC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;SACtD;QAED,OAAO,YAAY,CAAA;IACvB,CAAC;IAEO,aAAa,CACjB,YAA8B,EAC9B,YAAoB,EACpB,UAAkB,EAClB,SAAiB,EACjB,OAAiB;QAEjB,MAAM,aAAa,GAAG,IAAA,SAAI,GAAE,CAAA;QAE5B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,yBAAyB,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAA;QAC1G,MAAM,cAAc,GAAG,aAAa,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAA;QAEnE,cAAc,CAAC,OAAO,GAAG,uBAAuB,CAAA;QAChD,cAAc,CAAC,aAAa,GAAG,aAAa,CAAA;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAA;gBACnD,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;YAC3E,CAAC,EAAE,SAAS,CAAC,CAAA;YAEb,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC3C,YAAY,CAAC,OAAO,CAAC,CAAA;gBACrB,OAAO,CAAC,IAAI,CAAC,CAAA;YACjB,CAAC,CAAC,CAAA;YACF,IAAI;gBACA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;aAC5G;YAAC,OAAO,GAAG,EAAE;gBACV,MAAM,CAAC,GAAG,CAAC,CAAA;aACd;QACL,CAAC,CAAC,CAAA;IACN,CAAC;IAEO,KAAK,CAAC,OAAO,CACjB,YAA8B,EAC9B,YAAoB,EACpB,UAAkB,EAClB,OAAwB;QAExB,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC,CAAA;QAElC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,kBAAkB,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3F,MAAM,cAAc,GAAG,aAAa,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAA;QAEnE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;IACpH,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,OAAiB;QAClD,OAAO;YACH,iEAAiE;YACjE,eAAe,EAAE,OAAO;YACxB,WAAW,EAAE,kBAAkB;YAC/B,uEAAuE;YACvE,4DAA4D;YAC5D,qBAAqB;YACrB,YAAY,EAAE,CAAC;YACf,0DAA0D;YAC1D,KAAK,EAAE,MAAM;YACb,uEAAuE;YACvE,+DAA+D;YAC/D,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO;SACV,CAAA;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CACf,YAAoB,EACpB,eAA6B,IAAI,CAAC,mBAAmB,EACrD,UAAkC,EAAE;QAEpC,IAAI;YACA,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,GAAG,IAAI,CAAC,sBAAsB,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;SACvH;QAAC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,YAAY,GAAG,CAAC,CAAA;YAClE,MAAM,GAAG,CAAA;SACZ;IACL,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAA;IACtC,CAAC;CACJ;AAlLD,sCAkLC"}