@diia-inhouse/diia-queue 13.3.3 → 14.0.10

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 (148) hide show
  1. package/dist/constants.js +9 -9
  2. package/dist/index.d.ts +27 -0
  3. package/dist/index.js +23 -21
  4. package/dist/interfaces/deps.d.ts +30 -0
  5. package/dist/interfaces/externalCommunicator.d.ts +58 -0
  6. package/dist/interfaces/index.d.ts +95 -0
  7. package/dist/interfaces/index.js +7 -30
  8. package/dist/interfaces/messageBrokerServiceConfig.d.ts +80 -0
  9. package/dist/interfaces/messageBrokerServiceConfig.js +27 -24
  10. package/dist/interfaces/messageHandler.d.ts +6 -0
  11. package/dist/interfaces/metrics/index.d.ts +23 -0
  12. package/dist/interfaces/metrics/index.js +12 -16
  13. package/dist/interfaces/options.d.ts +52 -0
  14. package/dist/interfaces/providers/rabbitmq/amqpConnection.d.ts +33 -0
  15. package/dist/interfaces/providers/rabbitmq/amqpConnection.js +14 -17
  16. package/dist/interfaces/providers/rabbitmq/amqpPublisher.d.ts +20 -0
  17. package/dist/interfaces/providers/rabbitmq/index.d.ts +107 -0
  18. package/dist/interfaces/providers/rabbitmq/index.js +35 -47
  19. package/dist/interfaces/queueConfig/configs.d.ts +47 -0
  20. package/dist/interfaces/queueConfig/configs.js +8 -9
  21. package/dist/interfaces/queueConfig/index.d.ts +1 -0
  22. package/dist/interfaces/queueContext.d.ts +8 -0
  23. package/dist/interfaces/queueStatus.d.ts +15 -0
  24. package/dist/interfaces/queueStatus.js +8 -9
  25. package/dist/metrics/index.js +5 -8
  26. package/dist/providers/index.d.ts +5 -0
  27. package/dist/providers/index.js +6 -22
  28. package/dist/providers/rabbitmq/amqpAsserter.d.ts +53 -0
  29. package/dist/providers/rabbitmq/amqpAsserter.js +369 -416
  30. package/dist/providers/rabbitmq/amqpConnection.d.ts +24 -0
  31. package/dist/providers/rabbitmq/amqpConnection.js +97 -150
  32. package/dist/providers/rabbitmq/amqpListener.d.ts +47 -0
  33. package/dist/providers/rabbitmq/amqpListener.js +218 -225
  34. package/dist/providers/rabbitmq/amqpPublisher.d.ts +38 -0
  35. package/dist/providers/rabbitmq/amqpPublisher.js +184 -191
  36. package/dist/providers/rabbitmq/index.d.ts +56 -0
  37. package/dist/providers/rabbitmq/index.js +161 -186
  38. package/dist/services/communicator.d.ts +66 -0
  39. package/dist/services/communicator.js +164 -186
  40. package/dist/services/eventBus.d.ts +25 -0
  41. package/dist/services/eventBus.js +45 -57
  42. package/dist/services/eventCommunicator.js +75 -124
  43. package/dist/services/eventMessageHandler.d.ts +25 -0
  44. package/dist/services/eventMessageHandler.js +112 -129
  45. package/dist/services/eventMessageValidator.d.ts +13 -0
  46. package/dist/services/eventMessageValidator.js +59 -44
  47. package/dist/services/externalCommunicator.d.ts +114 -0
  48. package/dist/services/externalCommunicator.js +149 -140
  49. package/dist/services/externalEventBus.d.ts +39 -0
  50. package/dist/services/externalEventBus.js +144 -162
  51. package/dist/services/index.d.ts +8 -0
  52. package/dist/services/index.js +10 -26
  53. package/dist/services/metrics.d.ts +15 -0
  54. package/dist/services/metrics.js +46 -49
  55. package/dist/services/optionsBuilder.d.ts +14 -0
  56. package/dist/services/optionsBuilder.js +43 -58
  57. package/dist/services/queue.d.ts +29 -0
  58. package/dist/services/queue.js +78 -93
  59. package/dist/services/scheduledTask.d.ts +30 -0
  60. package/dist/services/scheduledTask.js +60 -68
  61. package/dist/services/task.d.ts +33 -0
  62. package/dist/services/task.js +160 -176
  63. package/dist/utils.js +7 -11
  64. package/package.json +44 -50
  65. package/dist/constants.js.map +0 -1
  66. package/dist/index.js.map +0 -1
  67. package/dist/interfaces/deps.js +0 -3
  68. package/dist/interfaces/deps.js.map +0 -1
  69. package/dist/interfaces/externalCommunicator.js +0 -3
  70. package/dist/interfaces/externalCommunicator.js.map +0 -1
  71. package/dist/interfaces/index.js.map +0 -1
  72. package/dist/interfaces/messageBrokerServiceConfig.js.map +0 -1
  73. package/dist/interfaces/messageHandler.js +0 -3
  74. package/dist/interfaces/messageHandler.js.map +0 -1
  75. package/dist/interfaces/metrics/index.js.map +0 -1
  76. package/dist/interfaces/options.js +0 -3
  77. package/dist/interfaces/options.js.map +0 -1
  78. package/dist/interfaces/providers/rabbitmq/amqpConnection.js.map +0 -1
  79. package/dist/interfaces/providers/rabbitmq/amqpPublisher.js +0 -4
  80. package/dist/interfaces/providers/rabbitmq/amqpPublisher.js.map +0 -1
  81. package/dist/interfaces/providers/rabbitmq/index.js.map +0 -1
  82. package/dist/interfaces/queueConfig/configs.js.map +0 -1
  83. package/dist/interfaces/queueConfig/index.js +0 -18
  84. package/dist/interfaces/queueConfig/index.js.map +0 -1
  85. package/dist/interfaces/queueContext.js +0 -3
  86. package/dist/interfaces/queueContext.js.map +0 -1
  87. package/dist/interfaces/queueStatus.js.map +0 -1
  88. package/dist/interfaces/services/eventMessageHandler.js +0 -3
  89. package/dist/interfaces/services/eventMessageHandler.js.map +0 -1
  90. package/dist/metrics/index.js.map +0 -1
  91. package/dist/providers/index.js.map +0 -1
  92. package/dist/providers/rabbitmq/amqpAsserter.js.map +0 -1
  93. package/dist/providers/rabbitmq/amqpConnection.js.map +0 -1
  94. package/dist/providers/rabbitmq/amqpListener.js.map +0 -1
  95. package/dist/providers/rabbitmq/amqpPublisher.js.map +0 -1
  96. package/dist/providers/rabbitmq/index.js.map +0 -1
  97. package/dist/services/communicator.js.map +0 -1
  98. package/dist/services/eventBus.js.map +0 -1
  99. package/dist/services/eventCommunicator.js.map +0 -1
  100. package/dist/services/eventMessageHandler.js.map +0 -1
  101. package/dist/services/eventMessageValidator.js.map +0 -1
  102. package/dist/services/externalCommunicator.js.map +0 -1
  103. package/dist/services/externalEventBus.js.map +0 -1
  104. package/dist/services/index.js.map +0 -1
  105. package/dist/services/metrics.js.map +0 -1
  106. package/dist/services/optionsBuilder.js.map +0 -1
  107. package/dist/services/queue.js.map +0 -1
  108. package/dist/services/scheduledTask.js.map +0 -1
  109. package/dist/services/task.js.map +0 -1
  110. package/dist/types/constants.d.ts +0 -8
  111. package/dist/types/index.d.ts +0 -4
  112. package/dist/types/interfaces/deps.d.ts +0 -26
  113. package/dist/types/interfaces/externalCommunicator.d.ts +0 -54
  114. package/dist/types/interfaces/index.d.ts +0 -99
  115. package/dist/types/interfaces/messageBrokerServiceConfig.d.ts +0 -79
  116. package/dist/types/interfaces/messageHandler.d.ts +0 -2
  117. package/dist/types/interfaces/metrics/index.d.ts +0 -20
  118. package/dist/types/interfaces/options.d.ts +0 -49
  119. package/dist/types/interfaces/providers/rabbitmq/amqpConnection.d.ts +0 -29
  120. package/dist/types/interfaces/providers/rabbitmq/amqpPublisher.d.ts +0 -16
  121. package/dist/types/interfaces/providers/rabbitmq/index.d.ts +0 -114
  122. package/dist/types/interfaces/queueConfig/configs.d.ts +0 -47
  123. package/dist/types/interfaces/queueConfig/index.d.ts +0 -1
  124. package/dist/types/interfaces/queueContext.d.ts +0 -4
  125. package/dist/types/interfaces/queueStatus.d.ts +0 -11
  126. package/dist/types/interfaces/services/eventMessageHandler.d.ts +0 -5
  127. package/dist/types/metrics/index.d.ts +0 -3
  128. package/dist/types/providers/index.d.ts +0 -5
  129. package/dist/types/providers/rabbitmq/amqpAsserter.d.ts +0 -49
  130. package/dist/types/providers/rabbitmq/amqpConnection.d.ts +0 -20
  131. package/dist/types/providers/rabbitmq/amqpListener.d.ts +0 -42
  132. package/dist/types/providers/rabbitmq/amqpPublisher.d.ts +0 -34
  133. package/dist/types/providers/rabbitmq/index.d.ts +0 -52
  134. package/dist/types/services/communicator.d.ts +0 -57
  135. package/dist/types/services/eventBus.d.ts +0 -20
  136. package/dist/types/services/eventCommunicator.d.ts +0 -15
  137. package/dist/types/services/eventMessageHandler.d.ts +0 -19
  138. package/dist/types/services/eventMessageValidator.d.ts +0 -9
  139. package/dist/types/services/externalCommunicator.d.ts +0 -110
  140. package/dist/types/services/externalEventBus.d.ts +0 -33
  141. package/dist/types/services/index.d.ts +0 -9
  142. package/dist/types/services/metrics.d.ts +0 -11
  143. package/dist/types/services/optionsBuilder.d.ts +0 -10
  144. package/dist/types/services/queue.d.ts +0 -23
  145. package/dist/types/services/scheduledTask.d.ts +0 -25
  146. package/dist/types/services/task.d.ts +0 -28
  147. package/dist/types/utils.d.ts +0 -3
  148. package/dist/utils.js.map +0 -1
@@ -1,192 +1,185 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
1
+ import { Headers } from "../../interfaces/providers/rabbitmq/index.js";
2
+ import { LabelUnknown } from "../../interfaces/metrics/index.js";
3
+ import constants_default from "../../constants.js";
4
+ import { ErrorType, ExternalCommunicatorError, InternalServerError } from "@diia-inhouse/errors";
5
+ import { randomUUID } from "node:crypto";
6
+ import { HttpStatusCode } from "@diia-inhouse/types";
7
+ import { EventEmitter } from "node:events";
8
+ //#region src/providers/rabbitmq/amqpPublisher.ts
9
+ const { APP_ID, DEFAULT_ROUTING_KEY, REPLY_TO_QUEUE_NAME } = constants_default;
10
+ var AmqpPublisher = class {
11
+ connection;
12
+ logger;
13
+ rabbitMQMetrics;
14
+ systemServiceName;
15
+ defaultPublishOptions = {
16
+ contentEncoding: "utf-8",
17
+ contentType: "application/json",
18
+ deliveryMode: 2,
19
+ appId: APP_ID,
20
+ mandatory: true
21
+ };
22
+ rpcChannel;
23
+ regularChannel;
24
+ replyToQueueName = REPLY_TO_QUEUE_NAME;
25
+ eventEmitter;
26
+ directResponseTimeout = 1e4;
27
+ constructor(connection, logger, rabbitMQMetrics, systemServiceName, options = {}) {
28
+ this.connection = connection;
29
+ this.logger = logger;
30
+ this.rabbitMQMetrics = rabbitMQMetrics;
31
+ this.systemServiceName = systemServiceName;
32
+ this.directResponseTimeout = options.timeout || this.directResponseTimeout;
33
+ this.replyToQueueName = options.replyToQueueName || REPLY_TO_QUEUE_NAME;
34
+ }
35
+ async init() {
36
+ await this.createRpcChannel();
37
+ await this.createRegularChannel();
38
+ this.connection.on("ready", async () => {
39
+ await this.createRpcChannel();
40
+ await this.createRegularChannel();
41
+ });
42
+ }
43
+ async publishToExchange(exchangeName, message, headers, routingKey = DEFAULT_ROUTING_KEY) {
44
+ const { event, payload } = message;
45
+ const startTime = process.hrtime.bigint();
46
+ const route = event;
47
+ const source = this.systemServiceName;
48
+ const destination = LabelUnknown;
49
+ try {
50
+ if (!event || !exchangeName || !payload) {
51
+ const errorMessage = `Invalid event name [${event}] or exchange name [${exchangeName}] or payload [${JSON.stringify(payload)}]`;
52
+ this.logger.error(errorMessage);
53
+ throw new InternalServerError(errorMessage);
54
+ }
55
+ const publishOptions = this.getPublishOptions(headers);
56
+ this.logger.info(`Publish event: ${event}`, {
57
+ routingKey,
58
+ delay: headers["x-delay"]
59
+ });
60
+ this.logger.io("Event message", message);
61
+ this.publishMessage(message, exchangeName, routingKey, publishOptions);
62
+ this.collectMetrics(startTime, route, source, destination);
63
+ } catch (err) {
64
+ this.logger.error("Error while publishing event", {
65
+ err,
66
+ exchangeName,
67
+ routingKey
68
+ });
69
+ this.collectMetrics(startTime, route, source, destination, ErrorType.Unoperated);
70
+ throw err;
71
+ }
72
+ }
73
+ async publishToExchangeDirect(exchangeName, message, headers, routingKey = DEFAULT_ROUTING_KEY, responseTimeoutMs = this.directResponseTimeout) {
74
+ const startTime = process.hrtime.bigint();
75
+ const route = message.event;
76
+ const source = this.systemServiceName;
77
+ let errorType = void 0;
78
+ let destination = LabelUnknown;
79
+ try {
80
+ const { body, headers: { [Headers.handledBy]: handledBy } } = await this.receiveDirectResponse(exchangeName, message, headers, routingKey, responseTimeoutMs);
81
+ destination = handledBy || destination;
82
+ return body;
83
+ } catch (err) {
84
+ this.logger.error("Failed to receive a direct response", {
85
+ err,
86
+ exchangeName,
87
+ routingKey
88
+ });
89
+ errorType = ErrorType.Unoperated;
90
+ throw err;
91
+ } finally {
92
+ this.collectMetrics(startTime, route, source, destination, errorType);
93
+ }
94
+ }
95
+ getStatus() {
96
+ return this.connection.getStatus();
97
+ }
98
+ async createRegularChannel() {
99
+ this.regularChannel = await this.connection.createChannel();
100
+ }
101
+ async createRpcChannel() {
102
+ this.rpcChannel = await this.connection.createChannel(this.replyToQueueName);
103
+ this.rpcChannel?.on("error", async () => await this.createRpcChannel());
104
+ this.eventEmitter = new EventEmitter();
105
+ this.eventEmitter?.setMaxListeners(0);
106
+ await this.rpcChannel?.consume(this.replyToQueueName, this.listenReplyToQueue.bind(this), { noAck: true });
107
+ }
108
+ listenReplyToQueue(msg) {
109
+ if (!msg) {
110
+ this.logger.error("Consumed direct message is null");
111
+ return;
112
+ }
113
+ const body = JSON.parse(msg.content.toString("utf8"));
114
+ const headers = msg.properties.headers || {};
115
+ this.eventEmitter?.emit(msg.properties.correlationId, {
116
+ body,
117
+ headers
118
+ });
119
+ }
120
+ publishMessage(eventMessage, exchangeName, routingKey, publishOptions) {
121
+ if (!this.regularChannel) throw new Error("Publishing message is denied, channel is not initialized");
122
+ return this.publish(eventMessage, exchangeName, routingKey, publishOptions, this.regularChannel);
123
+ }
124
+ publishRequest(eventMessage, exchangeName, routingKey, publishOptions) {
125
+ if (!this.rpcChannel) throw new Error("Publishing RPC request is denied, channel is not initialized");
126
+ return this.publish(eventMessage, exchangeName, routingKey, publishOptions, this.rpcChannel);
127
+ }
128
+ publish(eventMessage, exchangeName, routingKey, publishOptions, channel) {
129
+ const data = JSON.stringify(eventMessage);
130
+ const content = Buffer.from(data);
131
+ if (!channel.publish(exchangeName, routingKey, content, publishOptions)) throw new InternalServerError("Message has not been published");
132
+ }
133
+ getPublishOptions(headers, extraOpts = {}) {
134
+ return {
135
+ ...this.defaultPublishOptions,
136
+ timestamp: Date.now(),
137
+ ...extraOpts,
138
+ headers: {
139
+ ...headers,
140
+ [Headers.sentFrom]: this.systemServiceName
141
+ }
142
+ };
143
+ }
144
+ async receiveDirectResponse(exchangeName, message, headers, routingKey = DEFAULT_ROUTING_KEY, responseTimeoutMs = this.directResponseTimeout) {
145
+ const { event, payload } = message;
146
+ if (!event || !exchangeName || !payload) throw new Error(`Invalid event name [${event}] or exchange name [${exchangeName}] or payload [${JSON.stringify(payload)}]`);
147
+ const correlationId = randomUUID();
148
+ const publishOptions = this.getPublishOptions(headers, {
149
+ correlationId,
150
+ replyTo: this.replyToQueueName
151
+ });
152
+ this.logger.info(`Publish direct event: ${event}`, {
153
+ routingKey,
154
+ correlationId,
155
+ eventUuid: payload.uuid
156
+ });
157
+ this.logger.io("Direct event message", message);
158
+ return await new Promise((resolve, reject) => {
159
+ const timeout = setTimeout(() => {
160
+ this.eventEmitter?.removeAllListeners(correlationId);
161
+ reject(new ExternalCommunicatorError(`Time out for external event: ${event}`, HttpStatusCode.GATEWAY_TIMEOUT));
162
+ }, responseTimeoutMs);
163
+ this.eventEmitter?.once(correlationId, (args) => {
164
+ clearTimeout(timeout);
165
+ this.logger.info(`Received direct event response: ${event}`, { traceId: headers.traceId });
166
+ this.logger.io(`Direct event response message`, {
167
+ body: args.body,
168
+ traceId: headers.traceId
169
+ });
170
+ return resolve(args);
171
+ });
172
+ try {
173
+ this.publishRequest(message, exchangeName, routingKey, publishOptions);
174
+ } catch (err) {
175
+ reject(err);
176
+ }
177
+ });
178
+ }
179
+ collectMetrics(startTime, route, source, destination, errorType) {
180
+ this.rabbitMQMetrics.collectCommunicationsTotalMetric(route, source, destination, "outbound");
181
+ this.rabbitMQMetrics.collectRequestTotalMetric(startTime, route, source, destination, errorType);
182
+ }
4
183
  };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.AmqpPublisher = void 0;
7
- const node_crypto_1 = require("node:crypto");
8
- const node_events_1 = require("node:events");
9
- const errors_1 = require("@diia-inhouse/errors");
10
- const types_1 = require("@diia-inhouse/types");
11
- const constants_1 = __importDefault(require("../../constants"));
12
- const metrics_1 = require("../../interfaces/metrics");
13
- const rabbitmq_1 = require("../../interfaces/providers/rabbitmq");
14
- const { APP_ID, DEFAULT_ROUTING_KEY, REPLY_TO_QUEUE_NAME } = constants_1.default;
15
- class AmqpPublisher {
16
- connection;
17
- logger;
18
- rabbitMQMetrics;
19
- systemServiceName;
20
- defaultPublishOptions = {
21
- // eslint-disable-next-line unicorn/text-encoding-identifier-case
22
- contentEncoding: 'utf-8',
23
- contentType: 'application/json',
24
- // if true, the message will be returned if it is not routed to a queue
25
- // i.e., if there are no bindings that match its routing key
26
- // meaning persistent
27
- deliveryMode: 2,
28
- // an arbitrary identifier for the originating application
29
- appId: APP_ID,
30
- // if true, the message will be returned if it is not routed to a queue
31
- // (i.e., if there are no bindings that match its routing key).
32
- mandatory: true,
33
- };
34
- rpcChannel;
35
- regularChannel;
36
- replyToQueueName = REPLY_TO_QUEUE_NAME;
37
- eventEmitter;
38
- directResponseTimeout = 10000;
39
- constructor(connection, logger, rabbitMQMetrics, systemServiceName, options = {}) {
40
- this.connection = connection;
41
- this.logger = logger;
42
- this.rabbitMQMetrics = rabbitMQMetrics;
43
- this.systemServiceName = systemServiceName;
44
- this.directResponseTimeout = options.timeout || this.directResponseTimeout;
45
- this.replyToQueueName = options.replyToQueueName || REPLY_TO_QUEUE_NAME;
46
- }
47
- async init() {
48
- await this.createRpcChannel();
49
- await this.createRegularChannel();
50
- this.connection.on('ready', async () => {
51
- // in case if reconnect happened
52
- await this.createRpcChannel();
53
- await this.createRegularChannel();
54
- });
55
- }
56
- async publishToExchange(exchangeName, message, headers, routingKey = DEFAULT_ROUTING_KEY) {
57
- const { event, payload } = message;
58
- const startTime = process.hrtime.bigint();
59
- const route = event;
60
- const source = this.systemServiceName;
61
- const destination = metrics_1.LabelUnknown;
62
- try {
63
- if (!event || !exchangeName || !payload) {
64
- const message = `Invalid event name [${event}] or exchange name [${exchangeName}] or payload [${JSON.stringify(payload)}]`;
65
- this.logger.error(message);
66
- throw new errors_1.InternalServerError(message);
67
- }
68
- const publishOptions = this.getPublishOptions(headers);
69
- this.logger.info(`Publish event: ${event}`, { routingKey, delay: headers['x-delay'] });
70
- this.logger.io('Event message', message);
71
- this.publishMessage(message, exchangeName, routingKey, publishOptions);
72
- this.collectMetrics(startTime, route, source, destination);
73
- }
74
- catch (err) {
75
- this.logger.error('Error while publishing event', { err, exchangeName, routingKey });
76
- this.collectMetrics(startTime, route, source, destination, errors_1.ErrorType.Unoperated);
77
- throw err;
78
- }
79
- }
80
- async publishToExchangeDirect(exchangeName, message, headers, routingKey = DEFAULT_ROUTING_KEY, responseTimeoutMs = this.directResponseTimeout) {
81
- const startTime = process.hrtime.bigint();
82
- const route = message.event;
83
- const source = this.systemServiceName;
84
- let errorType = undefined;
85
- let destination = metrics_1.LabelUnknown;
86
- try {
87
- const { body, headers: { [rabbitmq_1.Headers.handledBy]: handledBy }, } = await this.receiveDirectResponse(exchangeName, message, headers, routingKey, responseTimeoutMs);
88
- destination = handledBy || destination;
89
- return body;
90
- }
91
- catch (err) {
92
- this.logger.error('Failed to receive a direct response', { err, exchangeName, routingKey });
93
- errorType = errors_1.ErrorType.Unoperated;
94
- throw err;
95
- }
96
- finally {
97
- this.collectMetrics(startTime, route, source, destination, errorType);
98
- }
99
- }
100
- getStatus() {
101
- return this.connection.getStatus();
102
- }
103
- async createRegularChannel() {
104
- this.regularChannel = await this.connection.createChannel();
105
- }
106
- async createRpcChannel() {
107
- this.rpcChannel = await this.connection.createChannel(this.replyToQueueName);
108
- this.rpcChannel?.on('error', async () => await this.createRpcChannel());
109
- // eslint-disable-next-line unicorn/prefer-event-target
110
- this.eventEmitter = new node_events_1.EventEmitter();
111
- this.eventEmitter?.setMaxListeners(0);
112
- const consumeOptions = { noAck: true };
113
- await this.rpcChannel?.consume(this.replyToQueueName, this.listenReplyToQueue.bind(this), consumeOptions);
114
- }
115
- listenReplyToQueue(msg) {
116
- if (!msg) {
117
- this.logger.error('Consumed direct message is null');
118
- return;
119
- }
120
- const body = JSON.parse(msg.content.toString('utf8'));
121
- const headers = msg.properties.headers || {};
122
- this.eventEmitter?.emit(msg.properties.correlationId, { body, headers });
123
- }
124
- publishMessage(eventMessage, exchangeName, routingKey, publishOptions) {
125
- if (!this.regularChannel) {
126
- throw new Error('Publishing message is denied, channel is not initialized');
127
- }
128
- return this.publish(eventMessage, exchangeName, routingKey, publishOptions, this.regularChannel);
129
- }
130
- publishRequest(eventMessage, exchangeName, routingKey, publishOptions) {
131
- if (!this.rpcChannel) {
132
- throw new Error('Publishing RPC request is denied, channel is not initialized');
133
- }
134
- return this.publish(eventMessage, exchangeName, routingKey, publishOptions, this.rpcChannel);
135
- }
136
- publish(eventMessage, exchangeName, routingKey, publishOptions, channel) {
137
- const data = JSON.stringify(eventMessage);
138
- const content = Buffer.from(data);
139
- const isPublishingSuccessful = channel.publish(exchangeName, routingKey, content, publishOptions);
140
- if (!isPublishingSuccessful) {
141
- throw new errors_1.InternalServerError('Message has not been published');
142
- }
143
- }
144
- getPublishOptions(headers, extraOpts = {}) {
145
- return {
146
- ...this.defaultPublishOptions,
147
- timestamp: Date.now(), // a timestamp for the message
148
- ...extraOpts,
149
- headers: {
150
- ...headers,
151
- [rabbitmq_1.Headers.sentFrom]: this.systemServiceName,
152
- },
153
- };
154
- }
155
- async receiveDirectResponse(exchangeName, message, headers, routingKey = DEFAULT_ROUTING_KEY, responseTimeoutMs = this.directResponseTimeout) {
156
- const { event, payload } = message;
157
- if (!event || !exchangeName || !payload) {
158
- throw new Error(`Invalid event name [${event}] or exchange name [${exchangeName}] or payload [${JSON.stringify(payload)}]`);
159
- }
160
- const correlationId = (0, node_crypto_1.randomUUID)();
161
- const publishOptions = this.getPublishOptions(headers, {
162
- correlationId,
163
- replyTo: this.replyToQueueName,
164
- });
165
- this.logger.info(`Publish direct event: ${event}`, { routingKey, correlationId, eventUuid: payload.uuid });
166
- this.logger.io('Direct event message', message);
167
- return await new Promise((resolve, reject) => {
168
- const timeout = setTimeout(() => {
169
- this.eventEmitter?.removeAllListeners(correlationId);
170
- reject(new errors_1.ExternalCommunicatorError(`Time out for external event: ${event}`, types_1.HttpStatusCode.GATEWAY_TIMEOUT));
171
- }, responseTimeoutMs);
172
- this.eventEmitter?.once(correlationId, (args) => {
173
- clearTimeout(timeout);
174
- this.logger.info(`Received direct event response: ${event}`, { traceId: headers.traceId });
175
- this.logger.io(`Direct event response message`, { body: args.body, traceId: headers.traceId });
176
- return resolve(args);
177
- });
178
- try {
179
- this.publishRequest(message, exchangeName, routingKey, publishOptions);
180
- }
181
- catch (err) {
182
- reject(err);
183
- }
184
- });
185
- }
186
- collectMetrics(startTime, route, source, destination, errorType) {
187
- this.rabbitMQMetrics.collectCommunicationsTotalMetric(route, source, destination, 'outbound');
188
- this.rabbitMQMetrics.collectRequestTotalMetric(startTime, route, source, destination, errorType);
189
- }
190
- }
191
- exports.AmqpPublisher = AmqpPublisher;
192
- //# sourceMappingURL=amqpPublisher.js.map
184
+ //#endregion
185
+ export { AmqpPublisher };
@@ -0,0 +1,56 @@
1
+ import { MessageBrokerServiceConfig, QueueOptions } from "../../interfaces/messageBrokerServiceConfig.js";
2
+ import { AmqpConnection } from "./amqpConnection.js";
3
+ import { PublishDirectOptions, PublishOptions } from "../../interfaces/options.js";
4
+ import { EventName, QueueConfigByQueueName, QueueName, ServiceConfigByConfigType, TopicConfigByConfigType } from "../../interfaces/queueConfig/configs.js";
5
+ import { ConnectionClientType, ExportConfig, QueueMessageData, RabbitMQConfig, RabbitMQStatus } from "../../interfaces/providers/rabbitmq/index.js";
6
+ import { MessageHandler } from "../../interfaces/messageHandler.js";
7
+ import { PublishingResult } from "../../interfaces/providers/rabbitmq/amqpPublisher.js";
8
+ import { QueueContext } from "../../interfaces/queueContext.js";
9
+ import { AmqpAsserter } from "./amqpAsserter.js";
10
+ import { AmqpListener } from "./amqpListener.js";
11
+ import { AmqpPublisher } from "./amqpPublisher.js";
12
+ import { Logger } from "@diia-inhouse/types";
13
+ import { EventEmitter } from "node:events";
14
+ import { MetricsService } from "@diia-inhouse/diia-metrics";
15
+ import { AsyncLocalStorage } from "node:async_hooks";
16
+
17
+ //#region src/providers/rabbitmq/index.d.ts
18
+ declare class RabbitMQProvider extends EventEmitter {
19
+ private readonly systemServiceName;
20
+ private readonly rabbitmqConfig;
21
+ private readonly serviceConfig;
22
+ private readonly topicsConfig;
23
+ private readonly portalEvents;
24
+ private readonly logger;
25
+ private readonly metrics;
26
+ private readonly asyncLocalStorage;
27
+ private readonly queuesConfig;
28
+ private readonly messageBrokerServiceConfig;
29
+ private initializingLock?;
30
+ private listener?;
31
+ private publisher?;
32
+ private asserter?;
33
+ private connectionList;
34
+ private readonly publisherIsNotInitializedErrorMsg;
35
+ private readonly rabbitMQMetricsService;
36
+ constructor(systemServiceName: string, rabbitmqConfig: RabbitMQConfig, serviceConfig: ServiceConfigByConfigType, topicsConfig: TopicConfigByConfigType, portalEvents: EventName[], logger: Logger, metrics: MetricsService, asyncLocalStorage?: AsyncLocalStorage<QueueContext> | undefined, queuesConfig?: QueueConfigByQueueName | undefined, messageBrokerServiceConfig?: MessageBrokerServiceConfig | undefined);
37
+ getConfig(): ExportConfig;
38
+ getMessageBrokerServiceConfig(): MessageBrokerServiceConfig;
39
+ init(config?: MessageBrokerServiceConfig): Promise<void>;
40
+ subscribe(queueName: QueueName, messageHandler: MessageHandler): Promise<boolean>;
41
+ unsubscribe(queueName: QueueName): Promise<void>;
42
+ publish(message: QueueMessageData, exchangeName: string, routingKey?: string, options?: PublishOptions): Promise<PublishingResult>;
43
+ publishExternalDirect<T>(message: QueueMessageData, exchangeName: string, routingKey?: string, options?: PublishDirectOptions): Promise<T>;
44
+ getStatus(): RabbitMQStatus;
45
+ makeAMQPConnection(client: ConnectionClientType): Promise<AmqpConnection>;
46
+ makeAMQPListener(queuesOptions: QueueOptions[]): Promise<AmqpListener>;
47
+ makeAMQPAsserter(): Promise<AmqpAsserter>;
48
+ makeAMQPPublisher(): Promise<AmqpPublisher>;
49
+ private setListener;
50
+ private setAsserter;
51
+ private setPublisher;
52
+ private getConnection;
53
+ private preparePublisherHeaders;
54
+ }
55
+ //#endregion
56
+ export { RabbitMQProvider };