@diia-inhouse/diia-queue 8.0.0 → 13.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENCE.md +59 -59
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/index.js +6 -4
- package/dist/interfaces/index.js.map +1 -1
- package/dist/interfaces/messageBrokerServiceConfig.js +26 -0
- package/dist/interfaces/messageBrokerServiceConfig.js.map +1 -0
- package/dist/interfaces/metrics/index.js +14 -0
- package/dist/interfaces/metrics/index.js.map +1 -1
- package/dist/interfaces/providers/rabbitmq/amqpConnection.js +4 -1
- package/dist/interfaces/providers/rabbitmq/amqpConnection.js.map +1 -1
- package/dist/interfaces/providers/rabbitmq/amqpPublisher.js +1 -9
- package/dist/interfaces/providers/rabbitmq/amqpPublisher.js.map +1 -1
- package/dist/interfaces/providers/rabbitmq/index.js +41 -17
- package/dist/interfaces/providers/rabbitmq/index.js.map +1 -1
- package/dist/interfaces/queueStatus.js.map +1 -1
- package/dist/interfaces/{eventBus.js → services/eventMessageHandler.js} +1 -1
- package/dist/interfaces/services/eventMessageHandler.js.map +1 -0
- package/dist/metrics/index.js +1 -2
- package/dist/metrics/index.js.map +1 -1
- package/dist/providers/index.js +22 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/rabbitmq/amqpAsserter.js +417 -0
- package/dist/providers/rabbitmq/amqpAsserter.js.map +1 -0
- package/dist/providers/rabbitmq/amqpConnection.js +47 -25
- package/dist/providers/rabbitmq/amqpConnection.js.map +1 -1
- package/dist/providers/rabbitmq/amqpListener.js +167 -113
- package/dist/providers/rabbitmq/amqpListener.js.map +1 -1
- package/dist/providers/rabbitmq/amqpPublisher.js +145 -96
- package/dist/providers/rabbitmq/amqpPublisher.js.map +1 -1
- package/dist/providers/rabbitmq/index.js +104 -285
- package/dist/providers/rabbitmq/index.js.map +1 -1
- package/dist/services/communicator.js +187 -0
- package/dist/services/communicator.js.map +1 -0
- package/dist/services/eventBus.js +41 -46
- package/dist/services/eventBus.js.map +1 -1
- package/dist/services/eventCommunicator.js +125 -0
- package/dist/services/eventCommunicator.js.map +1 -0
- package/dist/services/eventMessageHandler.js +73 -89
- package/dist/services/eventMessageHandler.js.map +1 -1
- package/dist/services/externalCommunicator.js +10 -103
- package/dist/services/externalCommunicator.js.map +1 -1
- package/dist/services/externalEventBus.js +147 -55
- package/dist/services/externalEventBus.js.map +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/metrics.js +49 -0
- package/dist/services/metrics.js.map +1 -0
- package/dist/services/optionsBuilder.js +59 -0
- package/dist/services/optionsBuilder.js.map +1 -0
- package/dist/services/queue.js +63 -26
- package/dist/services/queue.js.map +1 -1
- package/dist/services/scheduledTask.js +52 -48
- package/dist/services/scheduledTask.js.map +1 -1
- package/dist/services/task.js +149 -28
- package/dist/services/task.js.map +1 -1
- package/dist/types/constants.d.ts +3 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/interfaces/deps.d.ts +3 -2
- package/dist/types/interfaces/externalCommunicator.d.ts +5 -12
- package/dist/types/interfaces/index.d.ts +70 -20
- package/dist/types/interfaces/messageBrokerServiceConfig.d.ts +79 -0
- package/dist/types/interfaces/messageHandler.d.ts +1 -1
- package/dist/types/interfaces/metrics/index.d.ts +13 -0
- package/dist/types/interfaces/options.d.ts +29 -4
- package/dist/types/interfaces/providers/rabbitmq/amqpConnection.d.ts +3 -0
- package/dist/types/interfaces/providers/rabbitmq/amqpPublisher.d.ts +9 -17
- package/dist/types/interfaces/providers/rabbitmq/index.d.ts +71 -7
- package/dist/types/interfaces/queueConfig/configs.d.ts +19 -11
- package/dist/types/interfaces/queueStatus.d.ts +3 -1
- package/dist/types/interfaces/services/eventMessageHandler.d.ts +5 -0
- package/dist/types/metrics/index.d.ts +1 -2
- package/dist/types/providers/index.d.ts +5 -0
- package/dist/types/providers/rabbitmq/amqpAsserter.d.ts +49 -0
- package/dist/types/providers/rabbitmq/amqpConnection.d.ts +3 -7
- package/dist/types/providers/rabbitmq/amqpListener.d.ts +26 -11
- package/dist/types/providers/rabbitmq/amqpPublisher.d.ts +25 -16
- package/dist/types/providers/rabbitmq/index.d.ts +33 -40
- package/dist/types/services/communicator.d.ts +57 -0
- package/dist/types/services/eventBus.d.ts +15 -14
- package/dist/types/services/eventCommunicator.d.ts +15 -0
- package/dist/types/services/eventMessageHandler.d.ts +9 -11
- package/dist/types/services/externalCommunicator.d.ts +6 -19
- package/dist/types/services/externalEventBus.d.ts +28 -13
- package/dist/types/services/index.d.ts +1 -1
- package/dist/types/services/metrics.d.ts +11 -0
- package/dist/types/services/optionsBuilder.d.ts +10 -0
- package/dist/types/services/queue.d.ts +14 -9
- package/dist/types/services/scheduledTask.d.ts +22 -14
- package/dist/types/services/task.d.ts +21 -11
- package/dist/types/utils.d.ts +2 -2
- package/dist/utils.js +5 -2
- package/dist/utils.js.map +1 -1
- package/package.json +34 -41
- package/dist/interfaces/eventBus.js.map +0 -1
- package/dist/interfaces/providers/rabbitmq/amqpListener.js +0 -3
- package/dist/interfaces/providers/rabbitmq/amqpListener.js.map +0 -1
- package/dist/services/externalCommunicatorChannel.js +0 -31
- package/dist/services/externalCommunicatorChannel.js.map +0 -1
- package/dist/types/interfaces/eventBus.d.ts +0 -19
- package/dist/types/interfaces/providers/rabbitmq/amqpListener.d.ts +0 -7
- package/dist/types/services/externalCommunicatorChannel.d.ts +0 -11
|
@@ -6,136 +6,185 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.AmqpPublisher = void 0;
|
|
7
7
|
const node_crypto_1 = require("node:crypto");
|
|
8
8
|
const node_events_1 = require("node:events");
|
|
9
|
+
const errors_1 = require("@diia-inhouse/errors");
|
|
10
|
+
const types_1 = require("@diia-inhouse/types");
|
|
9
11
|
const constants_1 = __importDefault(require("../../constants"));
|
|
10
|
-
const
|
|
11
|
-
const
|
|
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;
|
|
12
15
|
class AmqpPublisher {
|
|
13
16
|
connection;
|
|
14
17
|
logger;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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,
|
|
22
33
|
};
|
|
23
|
-
|
|
34
|
+
rpcChannel;
|
|
35
|
+
regularChannel;
|
|
36
|
+
replyToQueueName = REPLY_TO_QUEUE_NAME;
|
|
37
|
+
eventEmitter;
|
|
38
|
+
directResponseTimeout = 10000;
|
|
39
|
+
constructor(connection, logger, rabbitMQMetrics, systemServiceName, options = {}) {
|
|
24
40
|
this.connection = connection;
|
|
25
41
|
this.logger = logger;
|
|
26
|
-
this.
|
|
42
|
+
this.rabbitMQMetrics = rabbitMQMetrics;
|
|
43
|
+
this.systemServiceName = systemServiceName;
|
|
44
|
+
this.directResponseTimeout = options.timeout || this.directResponseTimeout;
|
|
45
|
+
this.replyToQueueName = options.replyToQueueName || REPLY_TO_QUEUE_NAME;
|
|
27
46
|
}
|
|
28
47
|
async init() {
|
|
29
|
-
await this.
|
|
48
|
+
await this.createRpcChannel();
|
|
49
|
+
await this.createRegularChannel();
|
|
30
50
|
this.connection.on('ready', async () => {
|
|
31
51
|
// in case if reconnect happened
|
|
32
|
-
await this.
|
|
52
|
+
await this.createRpcChannel();
|
|
53
|
+
await this.createRegularChannel();
|
|
33
54
|
});
|
|
34
55
|
}
|
|
35
|
-
async
|
|
36
|
-
const
|
|
37
|
-
|
|
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());
|
|
38
109
|
// eslint-disable-next-line unicorn/prefer-event-target
|
|
39
110
|
this.eventEmitter = new node_events_1.EventEmitter();
|
|
40
|
-
this.eventEmitter
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}, { noAck: true });
|
|
111
|
+
this.eventEmitter?.setMaxListeners(0);
|
|
112
|
+
const consumeOptions = { noAck: true };
|
|
113
|
+
await this.rpcChannel?.consume(this.replyToQueueName, this.listenReplyToQueue.bind(this), consumeOptions);
|
|
44
114
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return false;
|
|
115
|
+
listenReplyToQueue(msg) {
|
|
116
|
+
if (!msg) {
|
|
117
|
+
this.logger.error('Consumed direct message is null');
|
|
118
|
+
return;
|
|
50
119
|
}
|
|
51
|
-
const
|
|
52
|
-
|
|
120
|
+
const body = JSON.parse(msg.content.toString('utf8'));
|
|
121
|
+
const headers = msg.properties.headers || {};
|
|
122
|
+
this.eventEmitter?.emit(msg.properties.correlationId, { body, headers });
|
|
53
123
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (!eventName || !exchangeName || !message) {
|
|
58
|
-
throw new Error(`Invalid event name [${eventName}] or exchange name [${exchangeName}] or message [${JSON.stringify(message)}]`);
|
|
124
|
+
publishMessage(eventMessage, exchangeName, routingKey, publishOptions) {
|
|
125
|
+
if (!this.regularChannel) {
|
|
126
|
+
throw new Error('Publishing message is denied, channel is not initialized');
|
|
59
127
|
}
|
|
60
|
-
|
|
61
|
-
return await this.publishDirect(eventMessage, exchangeName, routingKey, timeout, headers);
|
|
128
|
+
return this.publish(eventMessage, exchangeName, routingKey, publishOptions, this.regularChannel);
|
|
62
129
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
payload: message,
|
|
67
|
-
meta: {
|
|
68
|
-
date: new Date(),
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
if (responseRoutingKey) {
|
|
72
|
-
eventMessage.meta.responseRoutingKey = responseRoutingKey;
|
|
130
|
+
publishRequest(eventMessage, exchangeName, routingKey, publishOptions) {
|
|
131
|
+
if (!this.rpcChannel) {
|
|
132
|
+
throw new Error('Publishing RPC request is denied, channel is not initialized');
|
|
73
133
|
}
|
|
74
|
-
|
|
75
|
-
|
|
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');
|
|
76
142
|
}
|
|
77
|
-
return eventMessage;
|
|
78
143
|
}
|
|
79
|
-
|
|
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
|
+
}
|
|
80
160
|
const correlationId = (0, node_crypto_1.randomUUID)();
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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) => {
|
|
87
168
|
const timeout = setTimeout(() => {
|
|
88
|
-
this.eventEmitter
|
|
89
|
-
reject(new
|
|
90
|
-
},
|
|
91
|
-
this.eventEmitter
|
|
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) => {
|
|
92
173
|
clearTimeout(timeout);
|
|
93
|
-
|
|
174
|
+
this.logger.io('Direct event response message', args.body);
|
|
175
|
+
return resolve(args);
|
|
94
176
|
});
|
|
95
177
|
try {
|
|
96
|
-
this.
|
|
178
|
+
this.publishRequest(message, exchangeName, routingKey, publishOptions);
|
|
97
179
|
}
|
|
98
180
|
catch (err) {
|
|
99
181
|
reject(err);
|
|
100
182
|
}
|
|
101
183
|
});
|
|
102
184
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
this.
|
|
106
|
-
this.logger.io('Event message', eventMessage);
|
|
107
|
-
const publishOptions = AmqpPublisher.defaultPublishOptions(headers);
|
|
108
|
-
return this.channel.publish(exchangeName, routingKey, Buffer.from(JSON.stringify(eventMessage)), publishOptions);
|
|
109
|
-
}
|
|
110
|
-
static defaultPublishOptions(headers) {
|
|
111
|
-
return {
|
|
112
|
-
// eslint-disable-next-line unicorn/text-encoding-identifier-case
|
|
113
|
-
contentEncoding: 'utf-8',
|
|
114
|
-
contentType: 'application/json',
|
|
115
|
-
// if true, the message will be returned if it is not routed to a queue
|
|
116
|
-
// i.e., if there are no bindings that match its routing key
|
|
117
|
-
// meaning persistent
|
|
118
|
-
deliveryMode: 2,
|
|
119
|
-
// an arbitrary identifier for the originating application
|
|
120
|
-
appId: APP_ID,
|
|
121
|
-
// if true, the message will be returned if it is not routed to a queue
|
|
122
|
-
// (i.e., if there are no bindings that match its routing key).
|
|
123
|
-
mandatory: true,
|
|
124
|
-
timestamp: Date.now(), // a timestamp for the message
|
|
125
|
-
headers,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
async checkExchange(exchangeName, exchangeType = this.defaultExchangeType, options = {}) {
|
|
129
|
-
try {
|
|
130
|
-
return await this.channel.assertExchange(exchangeName, exchangeType, { ...this.defaultExchangeOptions, ...options });
|
|
131
|
-
}
|
|
132
|
-
catch (err) {
|
|
133
|
-
this.logger.error(`Error while assert exchange [${exchangeName}]`);
|
|
134
|
-
throw err;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
getStatus() {
|
|
138
|
-
return this.connection.getStatus();
|
|
185
|
+
collectMetrics(startTime, route, source, destination, errorType) {
|
|
186
|
+
this.rabbitMQMetrics.collectCommunicationsTotalMetric(route, source, destination, 'outbound');
|
|
187
|
+
this.rabbitMQMetrics.collectRequestTotalMetric(startTime, route, source, destination, errorType);
|
|
139
188
|
}
|
|
140
189
|
}
|
|
141
190
|
exports.AmqpPublisher = AmqpPublisher;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amqpPublisher.js","sourceRoot":"","sources":["../../../src/providers/rabbitmq/amqpPublisher.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAwC;AACxC,6CAA0C;
|
|
1
|
+
{"version":3,"file":"amqpPublisher.js","sourceRoot":"","sources":["../../../src/providers/rabbitmq/amqpPublisher.ts"],"names":[],"mappings":"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"}
|