@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.
- package/LICENCE.md +287 -0
- package/README.md +93 -0
- package/dist/constants.js +7 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/deps.js +3 -0
- package/dist/interfaces/deps.js.map +1 -0
- package/dist/interfaces/externalCommunicator.js +3 -0
- package/dist/interfaces/externalCommunicator.js.map +1 -0
- package/dist/interfaces/index.js +27 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/metrics/index.js +3 -0
- package/dist/interfaces/metrics/index.js.map +1 -0
- package/dist/interfaces/providers/rabbitmq/amqpConnection.js +14 -0
- package/dist/interfaces/providers/rabbitmq/amqpConnection.js.map +1 -0
- package/dist/interfaces/providers/rabbitmq/amqpListener.js +3 -0
- package/dist/interfaces/providers/rabbitmq/amqpListener.js.map +1 -0
- package/dist/interfaces/providers/rabbitmq/amqpPublisher.js +12 -0
- package/dist/interfaces/providers/rabbitmq/amqpPublisher.js.map +1 -0
- package/dist/interfaces/providers/rabbitmq/index.js +25 -0
- package/dist/interfaces/providers/rabbitmq/index.js.map +1 -0
- package/dist/interfaces/queueConfig/configs.js +9 -0
- package/dist/interfaces/queueConfig/configs.js.map +1 -0
- package/dist/interfaces/queueConfig/index.js +18 -0
- package/dist/interfaces/queueConfig/index.js.map +1 -0
- package/dist/interfaces/queueStatus.js +3 -0
- package/dist/interfaces/queueStatus.js.map +1 -0
- package/dist/metrics/index.js +9 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/providers/rabbitmq/amqpConnection.js +129 -0
- package/dist/providers/rabbitmq/amqpConnection.js.map +1 -0
- package/dist/providers/rabbitmq/amqpListener.js +171 -0
- package/dist/providers/rabbitmq/amqpListener.js.map +1 -0
- package/dist/providers/rabbitmq/amqpPublisher.js +140 -0
- package/dist/providers/rabbitmq/amqpPublisher.js.map +1 -0
- package/dist/providers/rabbitmq/index.js +367 -0
- package/dist/providers/rabbitmq/index.js.map +1 -0
- package/dist/services/eventBus.js +63 -0
- package/dist/services/eventBus.js.map +1 -0
- package/dist/services/eventMessageHandler.js +145 -0
- package/dist/services/eventMessageHandler.js.map +1 -0
- package/dist/services/eventMessageValidator.js +44 -0
- package/dist/services/eventMessageValidator.js.map +1 -0
- package/dist/services/externalCommunicator.js +134 -0
- package/dist/services/externalCommunicator.js.map +1 -0
- package/dist/services/externalCommunicatorChannel.js +31 -0
- package/dist/services/externalCommunicatorChannel.js.map +1 -0
- package/dist/services/externalEventBus.js +71 -0
- package/dist/services/externalEventBus.js.map +1 -0
- package/dist/services/index.js +26 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/queue.js +56 -0
- package/dist/services/queue.js.map +1 -0
- package/dist/services/scheduledTask.js +65 -0
- package/dist/services/scheduledTask.js.map +1 -0
- package/dist/services/task.js +56 -0
- package/dist/services/task.js.map +1 -0
- package/dist/types/constants.d.ts +5 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/interfaces/deps.d.ts +17 -0
- package/dist/types/interfaces/externalCommunicator.d.ts +35 -0
- package/dist/types/interfaces/index.d.ts +89 -0
- package/dist/types/interfaces/metrics/index.d.ts +7 -0
- package/dist/types/interfaces/providers/rabbitmq/amqpConnection.d.ts +26 -0
- package/dist/types/interfaces/providers/rabbitmq/amqpListener.d.ts +7 -0
- package/dist/types/interfaces/providers/rabbitmq/amqpPublisher.d.ts +24 -0
- package/dist/types/interfaces/providers/rabbitmq/index.d.ts +50 -0
- package/dist/types/interfaces/queueConfig/configs.d.ts +39 -0
- package/dist/types/interfaces/queueConfig/index.d.ts +1 -0
- package/dist/types/interfaces/queueStatus.d.ts +6 -0
- package/dist/types/metrics/index.d.ts +4 -0
- package/dist/types/providers/rabbitmq/amqpConnection.d.ts +24 -0
- package/dist/types/providers/rabbitmq/amqpListener.d.ts +26 -0
- package/dist/types/providers/rabbitmq/amqpPublisher.d.ts +25 -0
- package/dist/types/providers/rabbitmq/index.d.ts +55 -0
- package/dist/types/services/eventBus.d.ts +16 -0
- package/dist/types/services/eventMessageHandler.d.ts +21 -0
- package/dist/types/services/eventMessageValidator.d.ts +9 -0
- package/dist/types/services/externalCommunicator.d.ts +24 -0
- package/dist/types/services/externalCommunicatorChannel.d.ts +11 -0
- package/dist/types/services/externalEventBus.d.ts +18 -0
- package/dist/types/services/index.d.ts +9 -0
- package/dist/types/services/queue.d.ts +18 -0
- package/dist/types/services/scheduledTask.d.ts +17 -0
- package/dist/types/services/task.d.ts +18 -0
- package/dist/types/utils.d.ts +3 -0
- package/dist/utils.js +12 -0
- package/dist/utils.js.map +1 -0
- 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":";;;;;;AAIA,gEAAuC;AAGvC,2CAAgE;AAIhE,MAAa,YAAY;IAMT;IACS;IACA;IAPb,cAAc,GAAwC,IAAI,GAAG,EAAE,CAAA;IAE/D,aAAa,GAA+B,IAAI,GAAG,EAAE,CAAA;IAE7D,YACY,UAA0B,EACjB,MAAc,EACd,OAAyB;QAFlC,eAAU,GAAV,UAAU,CAAgB;QACjB,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAkB;IAC3C,CAAC;IAEJ,KAAK,CAAC,IAAI;QACN,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YACnC,gCAAgC;YAChC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;gBACjF,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;gBAEpD,MAAM,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;YACnE,CAAC,CAAC,CAAA;YAEF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,WAAW,CACb,SAAiB,EACjB,QAAuB,EACvB,eAAoC,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;QAEpF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,SAAS,GAAG,CAAC,CAAA;QAEtD,IAAI;YACA,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YAE3C,MAAM,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;SAClE;QAAC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,SAAS,GAAG,CAAC,CAAA;YAClE,MAAM,GAAG,CAAA;SACZ;IACL,CAAC;IAED,KAAK,CAAC,mBAAmB,CACrB,SAAiB,EACjB,YAAoB,EACpB,aAAqB,mBAAS,CAAC,mBAAmB;QAElD,IAAI;YACA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,SAAS,gBAAgB,YAAY,sBAAsB,UAAU,GAAG,CAAC,CAAA;YAC9G,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;YAE1C,OAAO,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;SACtE;QAAC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,SAAS,kBAAkB,YAAY,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YACpG,MAAM,GAAG,CAAA;SACZ;IACL,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAA;IACtC,CAAC;IAEO,MAAM,CAAC,OAAgB,EAAE,OAAgB,EAAE,OAAO,GAAG,KAAK;QAC9D,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;IAEO,OAAO,CAAC,OAAgB,EAAE,OAAgB;QAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;IAEO,KAAK,CAAC,2BAA2B,CAAC,SAAiB,EAAE,YAAiC;QAC1F,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;QAE9D,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QAClD,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,CAAC,CAAC,CAAA;QAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAEjD,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC3E,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;SAC7D;QAAC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;SACxE;QAED,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;QAClD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,0CAAgC,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;YACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;YACxG,MAAM,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QACnE,CAAC,CAAC,CAAA;IACN,CAAC;IAEO,iBAAiB,CAAC,SAAiB,EAAE,QAAuB;QAChE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC/C,CAAC;IAEO,gBAAgB,CAAC,SAAiB;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAClD,IAAI,CAAC,QAAQ,EAAE;YACX,MAAM,MAAM,GAAG,0CAA0C,SAAS,GAAG,CAAA;YAErE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAEzB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;SAC3B;QAED,OAAO,QAAQ,CAAA;IACnB,CAAC;IAEO,UAAU,CAAC,SAAiB;QAChC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACtD,IAAI,CAAC,OAAO,EAAE;YACV,MAAM,MAAM,GAAG,yCAAyC,SAAS,GAAG,CAAA;YAEpE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAEzB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;SAC3B;QAED,OAAO,OAAO,CAAA;IAClB,CAAC;IAEO,eAAe,CAAC,SAAiB;QACrC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC3D,IAAI,CAAC,YAAY,EAAE;YACf,MAAM,MAAM,GAAG,8CAA8C,SAAS,GAAG,CAAA;YAEzE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAEzB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;SAC3B;QAED,OAAO,YAAY,CAAA;IACvB,CAAC;IAEO,WAAW,CAAC,SAAiB,EAAE,OAAgB,EAAE,YAAiC;QACtF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;IACjE,CAAC;IAEO,iBAAiB,CAAC,OAAgB,EAAE,QAAuB;QAC/D,OAAO,CAAC,OAAuB,EAAW,EAAE;YACxC;;;;;;;;;;;;;;;;;;;;;;;;eAwBG;YACH,IAAI,cAAgC,CAAA;YACpC,IAAI;gBACA,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;aAC1D;YAAC,MAAM;gBACJ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAA;gBAE/D,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;aACvC;YAED,MAAM,QAAQ,GAAiB;gBAC3B,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS;gBAChC,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,IAAI,EAAE,CAAC,IAAc,EAAQ,EAAE;oBAC3B,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,UAAU,CAAA;oBACrD,IAAI,IAAI,IAAI,OAAO,IAAI,aAAa,EAAE;wBAClC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,CAAA;qBACrF;yBAAM,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,aAAa,EAAE;wBAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAA;qBAC3F;oBAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACjC,CAAC;gBACD,MAAM,EAAE,GAAS,EAAE;oBACf,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAClC,CAAC;aACJ,CAAA;YAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC7B,CAAC,CAAA;IACL,CAAC;CACJ;AArMD,oCAqMC"}
|
|
@@ -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":"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"}
|