@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.
- package/dist/constants.js +9 -9
- package/dist/index.d.ts +27 -0
- package/dist/index.js +23 -21
- package/dist/interfaces/deps.d.ts +30 -0
- package/dist/interfaces/externalCommunicator.d.ts +58 -0
- package/dist/interfaces/index.d.ts +95 -0
- package/dist/interfaces/index.js +7 -30
- package/dist/interfaces/messageBrokerServiceConfig.d.ts +80 -0
- package/dist/interfaces/messageBrokerServiceConfig.js +27 -24
- package/dist/interfaces/messageHandler.d.ts +6 -0
- package/dist/interfaces/metrics/index.d.ts +23 -0
- package/dist/interfaces/metrics/index.js +12 -16
- package/dist/interfaces/options.d.ts +52 -0
- package/dist/interfaces/providers/rabbitmq/amqpConnection.d.ts +33 -0
- package/dist/interfaces/providers/rabbitmq/amqpConnection.js +14 -17
- package/dist/interfaces/providers/rabbitmq/amqpPublisher.d.ts +20 -0
- package/dist/interfaces/providers/rabbitmq/index.d.ts +107 -0
- package/dist/interfaces/providers/rabbitmq/index.js +35 -47
- package/dist/interfaces/queueConfig/configs.d.ts +47 -0
- package/dist/interfaces/queueConfig/configs.js +8 -9
- package/dist/interfaces/queueConfig/index.d.ts +1 -0
- package/dist/interfaces/queueContext.d.ts +8 -0
- package/dist/interfaces/queueStatus.d.ts +15 -0
- package/dist/interfaces/queueStatus.js +8 -9
- package/dist/metrics/index.js +5 -8
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.js +6 -22
- package/dist/providers/rabbitmq/amqpAsserter.d.ts +53 -0
- package/dist/providers/rabbitmq/amqpAsserter.js +369 -416
- package/dist/providers/rabbitmq/amqpConnection.d.ts +24 -0
- package/dist/providers/rabbitmq/amqpConnection.js +97 -150
- package/dist/providers/rabbitmq/amqpListener.d.ts +47 -0
- package/dist/providers/rabbitmq/amqpListener.js +218 -225
- package/dist/providers/rabbitmq/amqpPublisher.d.ts +38 -0
- package/dist/providers/rabbitmq/amqpPublisher.js +184 -191
- package/dist/providers/rabbitmq/index.d.ts +56 -0
- package/dist/providers/rabbitmq/index.js +161 -186
- package/dist/services/communicator.d.ts +66 -0
- package/dist/services/communicator.js +164 -186
- package/dist/services/eventBus.d.ts +25 -0
- package/dist/services/eventBus.js +45 -57
- package/dist/services/eventCommunicator.js +75 -124
- package/dist/services/eventMessageHandler.d.ts +25 -0
- package/dist/services/eventMessageHandler.js +112 -129
- package/dist/services/eventMessageValidator.d.ts +13 -0
- package/dist/services/eventMessageValidator.js +59 -44
- package/dist/services/externalCommunicator.d.ts +114 -0
- package/dist/services/externalCommunicator.js +149 -140
- package/dist/services/externalEventBus.d.ts +39 -0
- package/dist/services/externalEventBus.js +144 -162
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.js +10 -26
- package/dist/services/metrics.d.ts +15 -0
- package/dist/services/metrics.js +46 -49
- package/dist/services/optionsBuilder.d.ts +14 -0
- package/dist/services/optionsBuilder.js +43 -58
- package/dist/services/queue.d.ts +29 -0
- package/dist/services/queue.js +78 -93
- package/dist/services/scheduledTask.d.ts +30 -0
- package/dist/services/scheduledTask.js +60 -68
- package/dist/services/task.d.ts +33 -0
- package/dist/services/task.js +160 -176
- package/dist/utils.js +7 -11
- package/package.json +44 -50
- package/dist/constants.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/interfaces/deps.js +0 -3
- package/dist/interfaces/deps.js.map +0 -1
- package/dist/interfaces/externalCommunicator.js +0 -3
- package/dist/interfaces/externalCommunicator.js.map +0 -1
- package/dist/interfaces/index.js.map +0 -1
- package/dist/interfaces/messageBrokerServiceConfig.js.map +0 -1
- package/dist/interfaces/messageHandler.js +0 -3
- package/dist/interfaces/messageHandler.js.map +0 -1
- package/dist/interfaces/metrics/index.js.map +0 -1
- package/dist/interfaces/options.js +0 -3
- package/dist/interfaces/options.js.map +0 -1
- package/dist/interfaces/providers/rabbitmq/amqpConnection.js.map +0 -1
- package/dist/interfaces/providers/rabbitmq/amqpPublisher.js +0 -4
- package/dist/interfaces/providers/rabbitmq/amqpPublisher.js.map +0 -1
- package/dist/interfaces/providers/rabbitmq/index.js.map +0 -1
- package/dist/interfaces/queueConfig/configs.js.map +0 -1
- package/dist/interfaces/queueConfig/index.js +0 -18
- package/dist/interfaces/queueConfig/index.js.map +0 -1
- package/dist/interfaces/queueContext.js +0 -3
- package/dist/interfaces/queueContext.js.map +0 -1
- package/dist/interfaces/queueStatus.js.map +0 -1
- package/dist/interfaces/services/eventMessageHandler.js +0 -3
- package/dist/interfaces/services/eventMessageHandler.js.map +0 -1
- package/dist/metrics/index.js.map +0 -1
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/rabbitmq/amqpAsserter.js.map +0 -1
- package/dist/providers/rabbitmq/amqpConnection.js.map +0 -1
- package/dist/providers/rabbitmq/amqpListener.js.map +0 -1
- package/dist/providers/rabbitmq/amqpPublisher.js.map +0 -1
- package/dist/providers/rabbitmq/index.js.map +0 -1
- package/dist/services/communicator.js.map +0 -1
- package/dist/services/eventBus.js.map +0 -1
- package/dist/services/eventCommunicator.js.map +0 -1
- package/dist/services/eventMessageHandler.js.map +0 -1
- package/dist/services/eventMessageValidator.js.map +0 -1
- package/dist/services/externalCommunicator.js.map +0 -1
- package/dist/services/externalEventBus.js.map +0 -1
- package/dist/services/index.js.map +0 -1
- package/dist/services/metrics.js.map +0 -1
- package/dist/services/optionsBuilder.js.map +0 -1
- package/dist/services/queue.js.map +0 -1
- package/dist/services/scheduledTask.js.map +0 -1
- package/dist/services/task.js.map +0 -1
- package/dist/types/constants.d.ts +0 -8
- package/dist/types/index.d.ts +0 -4
- package/dist/types/interfaces/deps.d.ts +0 -26
- package/dist/types/interfaces/externalCommunicator.d.ts +0 -54
- package/dist/types/interfaces/index.d.ts +0 -99
- package/dist/types/interfaces/messageBrokerServiceConfig.d.ts +0 -79
- package/dist/types/interfaces/messageHandler.d.ts +0 -2
- package/dist/types/interfaces/metrics/index.d.ts +0 -20
- package/dist/types/interfaces/options.d.ts +0 -49
- package/dist/types/interfaces/providers/rabbitmq/amqpConnection.d.ts +0 -29
- package/dist/types/interfaces/providers/rabbitmq/amqpPublisher.d.ts +0 -16
- package/dist/types/interfaces/providers/rabbitmq/index.d.ts +0 -114
- package/dist/types/interfaces/queueConfig/configs.d.ts +0 -47
- package/dist/types/interfaces/queueConfig/index.d.ts +0 -1
- package/dist/types/interfaces/queueContext.d.ts +0 -4
- package/dist/types/interfaces/queueStatus.d.ts +0 -11
- package/dist/types/interfaces/services/eventMessageHandler.d.ts +0 -5
- package/dist/types/metrics/index.d.ts +0 -3
- package/dist/types/providers/index.d.ts +0 -5
- package/dist/types/providers/rabbitmq/amqpAsserter.d.ts +0 -49
- package/dist/types/providers/rabbitmq/amqpConnection.d.ts +0 -20
- package/dist/types/providers/rabbitmq/amqpListener.d.ts +0 -42
- package/dist/types/providers/rabbitmq/amqpPublisher.d.ts +0 -34
- package/dist/types/providers/rabbitmq/index.d.ts +0 -52
- package/dist/types/services/communicator.d.ts +0 -57
- package/dist/types/services/eventBus.d.ts +0 -20
- package/dist/types/services/eventCommunicator.d.ts +0 -15
- package/dist/types/services/eventMessageHandler.d.ts +0 -19
- package/dist/types/services/eventMessageValidator.d.ts +0 -9
- package/dist/types/services/externalCommunicator.d.ts +0 -110
- package/dist/types/services/externalEventBus.d.ts +0 -33
- package/dist/types/services/index.d.ts +0 -9
- package/dist/types/services/metrics.d.ts +0 -11
- package/dist/types/services/optionsBuilder.d.ts +0 -10
- package/dist/types/services/queue.d.ts +0 -23
- package/dist/types/services/scheduledTask.d.ts +0 -25
- package/dist/types/services/task.d.ts +0 -28
- package/dist/types/utils.d.ts +0 -3
- package/dist/utils.js.map +0 -1
|
@@ -1,69 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
exports.ScheduledTask = void 0;
|
|
7
|
-
const interfaces_1 = require("../interfaces");
|
|
8
|
-
const communicator_1 = __importDefault(require("./communicator"));
|
|
9
|
-
const eventCommunicator_1 = require("./eventCommunicator");
|
|
1
|
+
import "../interfaces/messageBrokerServiceConfig.js";
|
|
2
|
+
import "../interfaces/index.js";
|
|
3
|
+
import Communicator from "./communicator.js";
|
|
4
|
+
import { EventCommunicator } from "./eventCommunicator.js";
|
|
5
|
+
//#region src/services/scheduledTask.ts
|
|
10
6
|
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
exports.ScheduledTask = ScheduledTask;
|
|
69
|
-
//# sourceMappingURL=scheduledTask.js.map
|
|
7
|
+
* @deprecated use pkg-workflow entities instead
|
|
8
|
+
*/
|
|
9
|
+
var ScheduledTask = class extends Communicator {
|
|
10
|
+
serviceName;
|
|
11
|
+
scheduledTaskList;
|
|
12
|
+
queueName;
|
|
13
|
+
eventCommunicator;
|
|
14
|
+
eventRoutingPart = "scheduled-task";
|
|
15
|
+
constructor(serviceName, systemServiceName, queueProvider, scheduledTaskList, eventMessageHandler, logger, hostName, queueName = void 0) {
|
|
16
|
+
super(logger, queueProvider, hostName, systemServiceName);
|
|
17
|
+
this.serviceName = serviceName;
|
|
18
|
+
this.scheduledTaskList = scheduledTaskList;
|
|
19
|
+
this.queueName = queueName;
|
|
20
|
+
this.eventCommunicator = new EventCommunicator(logger, queueProvider, eventMessageHandler, scheduledTaskList);
|
|
21
|
+
}
|
|
22
|
+
async publish(eventName, serviceName) {
|
|
23
|
+
const routingKey = this.getRoutingKey(serviceName);
|
|
24
|
+
return await this.publishEventToExchange(eventName, {}, { routingKey });
|
|
25
|
+
}
|
|
26
|
+
getExchangeNameWithSuffix(exchangeName) {
|
|
27
|
+
return exchangeName;
|
|
28
|
+
}
|
|
29
|
+
getUnicastListeners() {
|
|
30
|
+
return this.eventCommunicator.getUnicastListeners();
|
|
31
|
+
}
|
|
32
|
+
getMulticastListeners() {
|
|
33
|
+
if (!this.queueName || this.scheduledTaskList.length === 0) return [];
|
|
34
|
+
const routingKey = this.getRoutingKey(this.serviceName);
|
|
35
|
+
const [queueOptions] = this.optionsBuilder.defineQueueOptionsBasedOnGlobalConfig(this.queueName, routingKey);
|
|
36
|
+
if (!queueOptions) return [];
|
|
37
|
+
const exchangesOptions = this.getProducerExchangesOptions();
|
|
38
|
+
return this.eventCommunicator.getMulticastListeners([queueOptions], exchangesOptions);
|
|
39
|
+
}
|
|
40
|
+
getProducerExchangesOptions() {
|
|
41
|
+
const exchangesOptions = [];
|
|
42
|
+
const { topics = {}, rabbit: { declareOptions: { assertExchanges } = {} } } = this.queueProvider.getConfig();
|
|
43
|
+
const createExchangeOptions = (exchangeName) => ({
|
|
44
|
+
name: exchangeName,
|
|
45
|
+
type: "topic",
|
|
46
|
+
declare: assertExchanges
|
|
47
|
+
});
|
|
48
|
+
const exchangeNamesByQueueName = this.optionsBuilder.getExchangeNamesByQueueName(this.queueName);
|
|
49
|
+
const exchangeNamesSet = new Set([...Object.keys(topics), ...exchangeNamesByQueueName]);
|
|
50
|
+
for (const exchangeName of exchangeNamesSet) {
|
|
51
|
+
const exchangeOptions = createExchangeOptions(exchangeName);
|
|
52
|
+
exchangesOptions.push(exchangeOptions);
|
|
53
|
+
}
|
|
54
|
+
return exchangesOptions;
|
|
55
|
+
}
|
|
56
|
+
getRoutingKey(serviceName) {
|
|
57
|
+
return `${serviceName}.${this.eventRoutingPart}`;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
//#endregion
|
|
61
|
+
export { ScheduledTask };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ExchangeOptions } from "../interfaces/messageBrokerServiceConfig.js";
|
|
2
|
+
import { MessagePayload, PublishingResult } from "../interfaces/providers/rabbitmq/amqpPublisher.js";
|
|
3
|
+
import { MessageBrokerServiceListener, TaskListener, TaskQueue } from "../interfaces/index.js";
|
|
4
|
+
import { RabbitMQProvider } from "../providers/rabbitmq/index.js";
|
|
5
|
+
import { Communicator } from "./communicator.js";
|
|
6
|
+
import { EventMessageHandler } from "./eventMessageHandler.js";
|
|
7
|
+
import { OnInit } from "@diia-inhouse/types";
|
|
8
|
+
import Logger$1 from "@diia-inhouse/diia-logger";
|
|
9
|
+
|
|
10
|
+
//#region src/services/task.d.ts
|
|
11
|
+
declare class Task extends Communicator implements TaskQueue, OnInit {
|
|
12
|
+
private readonly serviceName;
|
|
13
|
+
private readonly taskList;
|
|
14
|
+
private readonly eventMessageHandler;
|
|
15
|
+
private queueNamePrefix;
|
|
16
|
+
private taskNameExchangesOptionsMap;
|
|
17
|
+
constructor(serviceName: string, systemServiceName: string, queueProvider: RabbitMQProvider, taskList: TaskListener[], eventMessageHandler: EventMessageHandler, logger: Logger$1, hostName: string);
|
|
18
|
+
onInit(): Promise<void>;
|
|
19
|
+
publish(taskName: string, payload: MessagePayload, delay?: number): Promise<PublishingResult>;
|
|
20
|
+
protected getProducerExchangesOptions(): ExchangeOptions[];
|
|
21
|
+
protected getMulticastListeners(): MessageBrokerServiceListener[];
|
|
22
|
+
protected getUnicastListeners(): MessageBrokerServiceListener[];
|
|
23
|
+
protected getExchangeNameWithSuffix(taskName: string): string;
|
|
24
|
+
private defineExchangesOptions;
|
|
25
|
+
private defineQueueOptionsBasedOnGlobalConfig;
|
|
26
|
+
private defineExchangesOptionsBasedOnGlobalConfig;
|
|
27
|
+
private defineConsumerOptionsBasedOnGlobalConfig;
|
|
28
|
+
private getQueueName;
|
|
29
|
+
private capitalizeFirstLetter;
|
|
30
|
+
private defineQueueNameByTaskName;
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { Task };
|
package/dist/services/task.js
CHANGED
|
@@ -1,177 +1,161 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { QueueTypes } from "../interfaces/messageBrokerServiceConfig.js";
|
|
2
|
+
import "../interfaces/index.js";
|
|
3
|
+
import constants_default from "../constants.js";
|
|
4
|
+
import Communicator from "./communicator.js";
|
|
5
|
+
import lodash from "lodash";
|
|
6
|
+
//#region src/services/task.ts
|
|
7
|
+
var Task = class extends Communicator {
|
|
8
|
+
serviceName;
|
|
9
|
+
taskList;
|
|
10
|
+
eventMessageHandler;
|
|
11
|
+
queueNamePrefix = "TasksQueue";
|
|
12
|
+
taskNameExchangesOptionsMap = /* @__PURE__ */ new Map();
|
|
13
|
+
constructor(serviceName, systemServiceName, queueProvider, taskList, eventMessageHandler, logger, hostName) {
|
|
14
|
+
super(logger, queueProvider, hostName, systemServiceName);
|
|
15
|
+
this.serviceName = serviceName;
|
|
16
|
+
this.taskList = taskList;
|
|
17
|
+
this.eventMessageHandler = eventMessageHandler;
|
|
18
|
+
}
|
|
19
|
+
async onInit() {
|
|
20
|
+
const { queuesOptions, exchangesOptions } = await this.init();
|
|
21
|
+
const queuesOptionsMap = lodash.keyBy(queuesOptions, "name");
|
|
22
|
+
const exchangesOptionsMap = lodash.keyBy(exchangesOptions, "name");
|
|
23
|
+
for (const task of this.taskList) {
|
|
24
|
+
const { name: taskName, isDelayed = false, queueNames = [] } = task;
|
|
25
|
+
if (queueNames.length === 0) {
|
|
26
|
+
const queueName = this.defineQueueNameByTaskName(taskName, isDelayed, queuesOptionsMap, exchangesOptionsMap);
|
|
27
|
+
queueNames.push(queueName);
|
|
28
|
+
}
|
|
29
|
+
const taskExchangesOptions = [];
|
|
30
|
+
for (const queueName of queueNames) {
|
|
31
|
+
const queueOptions = queuesOptionsMap[queueName];
|
|
32
|
+
if (!queueOptions) {
|
|
33
|
+
this.logger.error(`Not found queue options by name (${queueName}) for task service`);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const { bindTo } = queueOptions;
|
|
37
|
+
const options = this.defineExchangesOptions(queueName, isDelayed, bindTo, exchangesOptionsMap);
|
|
38
|
+
taskExchangesOptions.push(...options);
|
|
39
|
+
}
|
|
40
|
+
this.taskNameExchangesOptionsMap.set(taskName, taskExchangesOptions);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async publish(taskName, payload, delay) {
|
|
44
|
+
const exchangesOptions = this.taskNameExchangesOptionsMap.get(taskName);
|
|
45
|
+
if (!exchangesOptions || exchangesOptions.length === 0) throw new Error(`Not found task [${taskName}] exchanges options`);
|
|
46
|
+
for (const exchangeOptions of exchangesOptions) {
|
|
47
|
+
const { name: exchangeName, delayed } = exchangeOptions;
|
|
48
|
+
if (delay && !delayed) {
|
|
49
|
+
const logMessage = "Delay option could be used only with delayed tasks";
|
|
50
|
+
this.logger.error(logMessage, {
|
|
51
|
+
exchangeName,
|
|
52
|
+
taskName
|
|
53
|
+
});
|
|
54
|
+
throw new Error(logMessage);
|
|
55
|
+
}
|
|
56
|
+
const message = {
|
|
57
|
+
payload,
|
|
58
|
+
event: this.getQueueName(taskName)
|
|
59
|
+
};
|
|
60
|
+
await this.publishToExchange(exchangeName, constants_default.DEFAULT_ROUTING_KEY, message, { delay });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
getProducerExchangesOptions() {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
getMulticastListeners() {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
getUnicastListeners() {
|
|
70
|
+
const listeners = [];
|
|
71
|
+
const { queuesOptions, exchangesOptions } = this.queueProvider.getMessageBrokerServiceConfig();
|
|
72
|
+
const queuesOptionsMap = lodash.keyBy(queuesOptions, "name");
|
|
73
|
+
const exchangesOptionsMap = lodash.keyBy(exchangesOptions, "name");
|
|
74
|
+
for (const task of this.taskList) {
|
|
75
|
+
const { queueNames = [], name: taskName, isDelayed = false } = task;
|
|
76
|
+
if (queueNames.length === 0) {
|
|
77
|
+
const queueName = this.defineQueueNameByTaskName(taskName, isDelayed, queuesOptionsMap, exchangesOptionsMap);
|
|
78
|
+
queueNames.push(queueName);
|
|
79
|
+
}
|
|
80
|
+
for (const queueName of queueNames) {
|
|
81
|
+
const queueOptions = queuesOptionsMap[queueName];
|
|
82
|
+
if (!queueOptions) {
|
|
83
|
+
this.logger.error(`Not found queue options by name (${queueName}) for ${this.constructor.name} service`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const listenerExchangesOptions = this.defineExchangesOptions(queueName, isDelayed, queueOptions.bindTo, exchangesOptionsMap);
|
|
87
|
+
const listener = {
|
|
88
|
+
handler: this.eventMessageHandler.eventListenerMessageHandler.bind(this.eventMessageHandler, task),
|
|
89
|
+
queueOptions,
|
|
90
|
+
exchangesOptions: listenerExchangesOptions
|
|
91
|
+
};
|
|
92
|
+
listeners.push(listener);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return listeners;
|
|
96
|
+
}
|
|
97
|
+
getExchangeNameWithSuffix(taskName) {
|
|
98
|
+
return this.getQueueName(taskName);
|
|
99
|
+
}
|
|
100
|
+
defineExchangesOptions(queueName, isExchangeDelayed = false, bindTo = [], exchangesMap = {}) {
|
|
101
|
+
const exchangesOptions = [];
|
|
102
|
+
for (const bindOptions of bindTo) {
|
|
103
|
+
const { exchangeName } = bindOptions;
|
|
104
|
+
const exchangeOptions = exchangesMap[exchangeName];
|
|
105
|
+
if (!exchangeOptions) {
|
|
106
|
+
this.logger.error(`Not found exchange options by name (${exchangeName}) for task service`);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
exchangesOptions.push(exchangeOptions);
|
|
110
|
+
}
|
|
111
|
+
if (exchangesOptions.length === 0) {
|
|
112
|
+
const globalExchangesOptions = this.defineExchangesOptionsBasedOnGlobalConfig(queueName, isExchangeDelayed);
|
|
113
|
+
exchangesOptions.push(...globalExchangesOptions);
|
|
114
|
+
}
|
|
115
|
+
return exchangesOptions;
|
|
116
|
+
}
|
|
117
|
+
defineQueueOptionsBasedOnGlobalConfig(queueName) {
|
|
118
|
+
const { rabbit: { listenerOptions: { queueOptions } = {}, declareOptions: { assertQueues, queuesOptions: overrideQueueOptions = {} } = {} } } = this.queueProvider.getConfig();
|
|
119
|
+
return {
|
|
120
|
+
bindTo: [{
|
|
121
|
+
bind: assertQueues,
|
|
122
|
+
exchangeName: queueName,
|
|
123
|
+
routingKey: constants_default.DEFAULT_ROUTING_KEY
|
|
124
|
+
}],
|
|
125
|
+
name: queueName,
|
|
126
|
+
declare: assertQueues,
|
|
127
|
+
options: queueOptions,
|
|
128
|
+
type: QueueTypes.Quorum,
|
|
129
|
+
consumerOptions: this.defineConsumerOptionsBasedOnGlobalConfig(),
|
|
130
|
+
...overrideQueueOptions
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
defineExchangesOptionsBasedOnGlobalConfig(exchangeName, isExchangeDelayed = false) {
|
|
134
|
+
const { rabbit: { declareOptions: { assertExchanges } = {} } } = this.queueProvider.getConfig();
|
|
135
|
+
return [{
|
|
136
|
+
name: exchangeName,
|
|
137
|
+
declare: assertExchanges,
|
|
138
|
+
delayed: isExchangeDelayed
|
|
139
|
+
}];
|
|
140
|
+
}
|
|
141
|
+
defineConsumerOptionsBasedOnGlobalConfig() {
|
|
142
|
+
const { rabbit: { listenerOptions: { prefetchCount } = {} } } = this.queueProvider.getConfig();
|
|
143
|
+
return { prefetchCount };
|
|
144
|
+
}
|
|
145
|
+
getQueueName(taskName) {
|
|
146
|
+
if (taskName.includes(this.queueNamePrefix)) return taskName;
|
|
147
|
+
return `${this.queueNamePrefix}${this.capitalizeFirstLetter(this.serviceName)}[${taskName}]`;
|
|
148
|
+
}
|
|
149
|
+
capitalizeFirstLetter(s) {
|
|
150
|
+
return s.split("-").map((str) => str.charAt(0).toUpperCase() + str.slice(1)).join("");
|
|
151
|
+
}
|
|
152
|
+
defineQueueNameByTaskName(taskName, isDelayed, queuesOptionsMap, exchangesOptionsMap) {
|
|
153
|
+
const queueName = this.getQueueName(taskName);
|
|
154
|
+
queuesOptionsMap[queueName] = this.defineQueueOptionsBasedOnGlobalConfig(queueName);
|
|
155
|
+
const [exchangeOptions] = this.defineExchangesOptionsBasedOnGlobalConfig(queueName, isDelayed);
|
|
156
|
+
exchangesOptionsMap[exchangeOptions.name] = exchangeOptions;
|
|
157
|
+
return queueName;
|
|
158
|
+
}
|
|
4
159
|
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
8
|
-
const constants_1 = __importDefault(require("../constants"));
|
|
9
|
-
const interfaces_1 = require("../interfaces");
|
|
10
|
-
const communicator_1 = __importDefault(require("./communicator"));
|
|
11
|
-
class Task extends communicator_1.default {
|
|
12
|
-
serviceName;
|
|
13
|
-
taskList;
|
|
14
|
-
eventMessageHandler;
|
|
15
|
-
queueNamePrefix = 'TasksQueue';
|
|
16
|
-
taskNameExchangesOptionsMap = new Map();
|
|
17
|
-
constructor(serviceName, systemServiceName, queueProvider, taskList, eventMessageHandler, logger, hostName) {
|
|
18
|
-
super(logger, queueProvider, hostName, systemServiceName);
|
|
19
|
-
this.serviceName = serviceName;
|
|
20
|
-
this.taskList = taskList;
|
|
21
|
-
this.eventMessageHandler = eventMessageHandler;
|
|
22
|
-
}
|
|
23
|
-
async onInit() {
|
|
24
|
-
const { queuesOptions, exchangesOptions } = await this.init();
|
|
25
|
-
const queuesOptionsMap = lodash_1.default.keyBy(queuesOptions, 'name');
|
|
26
|
-
const exchangesOptionsMap = lodash_1.default.keyBy(exchangesOptions, 'name');
|
|
27
|
-
for (const task of this.taskList) {
|
|
28
|
-
const { name: taskName, isDelayed = false, queueNames = [] } = task;
|
|
29
|
-
if (queueNames.length === 0) {
|
|
30
|
-
const queueName = this.defineQueueNameByTaskName(taskName, isDelayed, queuesOptionsMap, exchangesOptionsMap);
|
|
31
|
-
queueNames.push(queueName);
|
|
32
|
-
}
|
|
33
|
-
const exchangesOptions = [];
|
|
34
|
-
for (const queueName of queueNames) {
|
|
35
|
-
const queueOptions = queuesOptionsMap[queueName];
|
|
36
|
-
if (!queueOptions) {
|
|
37
|
-
this.logger.error(`Not found queue options by name (${queueName}) for task service`);
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
const { bindTo } = queueOptions;
|
|
41
|
-
const options = this.defineExchangesOptions(queueName, isDelayed, bindTo, exchangesOptionsMap);
|
|
42
|
-
exchangesOptions.push(...options);
|
|
43
|
-
}
|
|
44
|
-
this.taskNameExchangesOptionsMap.set(taskName, exchangesOptions);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
async publish(taskName, payload, delay) {
|
|
48
|
-
const exchangesOptions = this.taskNameExchangesOptionsMap.get(taskName);
|
|
49
|
-
if (!exchangesOptions || exchangesOptions.length === 0) {
|
|
50
|
-
throw new Error(`Not found task [${taskName}] exchanges options`);
|
|
51
|
-
}
|
|
52
|
-
for await (const exchangeOptions of exchangesOptions) {
|
|
53
|
-
const { name: exchangeName, delayed } = exchangeOptions;
|
|
54
|
-
if (delay && !delayed) {
|
|
55
|
-
const logMessage = 'Delay option could be used only with delayed tasks';
|
|
56
|
-
this.logger.error(logMessage, { exchangeName, taskName });
|
|
57
|
-
throw new Error(logMessage);
|
|
58
|
-
}
|
|
59
|
-
const message = {
|
|
60
|
-
payload,
|
|
61
|
-
event: this.getQueueName(taskName),
|
|
62
|
-
};
|
|
63
|
-
await this.publishToExchange(exchangeName, constants_1.default.DEFAULT_ROUTING_KEY, message, { delay });
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
getProducerExchangesOptions() {
|
|
67
|
-
return [];
|
|
68
|
-
}
|
|
69
|
-
getMulticastListeners() {
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
getUnicastListeners() {
|
|
73
|
-
const listeners = [];
|
|
74
|
-
const { queuesOptions, exchangesOptions } = this.queueProvider.getMessageBrokerServiceConfig();
|
|
75
|
-
const queuesOptionsMap = lodash_1.default.keyBy(queuesOptions, 'name');
|
|
76
|
-
const exchangesOptionsMap = lodash_1.default.keyBy(exchangesOptions, 'name');
|
|
77
|
-
for (const task of this.taskList) {
|
|
78
|
-
const { queueNames = [], name: taskName, isDelayed = false } = task;
|
|
79
|
-
if (queueNames.length === 0) {
|
|
80
|
-
const queueName = this.defineQueueNameByTaskName(taskName, isDelayed, queuesOptionsMap, exchangesOptionsMap);
|
|
81
|
-
queueNames.push(queueName);
|
|
82
|
-
}
|
|
83
|
-
for (const queueName of queueNames) {
|
|
84
|
-
const queueOptions = queuesOptionsMap[queueName];
|
|
85
|
-
if (!queueOptions) {
|
|
86
|
-
this.logger.error(`Not found queue options by name (${queueName}) for ${this.constructor.name} service`);
|
|
87
|
-
continue;
|
|
88
|
-
}
|
|
89
|
-
const exchangesOptions = this.defineExchangesOptions(queueName, isDelayed, queueOptions.bindTo, exchangesOptionsMap);
|
|
90
|
-
const handler = this.eventMessageHandler.eventListenerMessageHandler.bind(this.eventMessageHandler, task);
|
|
91
|
-
const listener = {
|
|
92
|
-
handler,
|
|
93
|
-
queueOptions,
|
|
94
|
-
exchangesOptions,
|
|
95
|
-
};
|
|
96
|
-
listeners.push(listener);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return listeners;
|
|
100
|
-
}
|
|
101
|
-
getExchangeNameWithSuffix(taskName) {
|
|
102
|
-
return this.getQueueName(taskName);
|
|
103
|
-
}
|
|
104
|
-
defineExchangesOptions(queueName, isExchangeDelayed = false, bindTo = [], exchangesMap = {}) {
|
|
105
|
-
const exchangesOptions = [];
|
|
106
|
-
for (const bindOptions of bindTo) {
|
|
107
|
-
const { exchangeName } = bindOptions;
|
|
108
|
-
const exchangeOptions = exchangesMap[exchangeName];
|
|
109
|
-
if (!exchangeOptions) {
|
|
110
|
-
this.logger.error(`Not found exchange options by name (${exchangeName}) for task service`);
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
exchangesOptions.push(exchangeOptions);
|
|
114
|
-
}
|
|
115
|
-
if (exchangesOptions.length === 0) {
|
|
116
|
-
const globalExchangesOptions = this.defineExchangesOptionsBasedOnGlobalConfig(queueName, isExchangeDelayed);
|
|
117
|
-
exchangesOptions.push(...globalExchangesOptions);
|
|
118
|
-
}
|
|
119
|
-
return exchangesOptions;
|
|
120
|
-
}
|
|
121
|
-
defineQueueOptionsBasedOnGlobalConfig(queueName) {
|
|
122
|
-
const { rabbit: { listenerOptions: { queueOptions } = {}, declareOptions: { assertQueues, queuesOptions: overrideQueueOptions = {} } = {}, }, } = this.queueProvider.getConfig();
|
|
123
|
-
const bindTo = [
|
|
124
|
-
{
|
|
125
|
-
bind: assertQueues,
|
|
126
|
-
exchangeName: queueName,
|
|
127
|
-
routingKey: constants_1.default.DEFAULT_ROUTING_KEY,
|
|
128
|
-
},
|
|
129
|
-
];
|
|
130
|
-
return {
|
|
131
|
-
bindTo,
|
|
132
|
-
name: queueName,
|
|
133
|
-
declare: assertQueues,
|
|
134
|
-
options: queueOptions,
|
|
135
|
-
type: interfaces_1.QueueTypes.Quorum,
|
|
136
|
-
consumerOptions: this.defineConsumerOptionsBasedOnGlobalConfig(),
|
|
137
|
-
...overrideQueueOptions,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
defineExchangesOptionsBasedOnGlobalConfig(exchangeName, isExchangeDelayed = false) {
|
|
141
|
-
const { rabbit: { declareOptions: { assertExchanges } = {} }, } = this.queueProvider.getConfig();
|
|
142
|
-
return [
|
|
143
|
-
{
|
|
144
|
-
name: exchangeName,
|
|
145
|
-
declare: assertExchanges,
|
|
146
|
-
delayed: isExchangeDelayed,
|
|
147
|
-
},
|
|
148
|
-
];
|
|
149
|
-
}
|
|
150
|
-
defineConsumerOptionsBasedOnGlobalConfig() {
|
|
151
|
-
const { rabbit: { listenerOptions: { prefetchCount } = {} }, } = this.queueProvider.getConfig();
|
|
152
|
-
return {
|
|
153
|
-
prefetchCount,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
getQueueName(taskName) {
|
|
157
|
-
if (taskName.includes(this.queueNamePrefix)) {
|
|
158
|
-
return taskName;
|
|
159
|
-
}
|
|
160
|
-
return `${this.queueNamePrefix}${this.capitalizeFirstLetter(this.serviceName)}[${taskName}]`;
|
|
161
|
-
}
|
|
162
|
-
capitalizeFirstLetter(s) {
|
|
163
|
-
return s
|
|
164
|
-
.split('-')
|
|
165
|
-
.map((str) => str.charAt(0).toUpperCase() + str.slice(1))
|
|
166
|
-
.join('');
|
|
167
|
-
}
|
|
168
|
-
defineQueueNameByTaskName(taskName, isDelayed, queuesOptionsMap, exchangesOptionsMap) {
|
|
169
|
-
const queueName = this.getQueueName(taskName);
|
|
170
|
-
queuesOptionsMap[queueName] = this.defineQueueOptionsBasedOnGlobalConfig(queueName);
|
|
171
|
-
const [exchangeOptions] = this.defineExchangesOptionsBasedOnGlobalConfig(queueName, isDelayed);
|
|
172
|
-
exchangesOptionsMap[exchangeOptions.name] = exchangeOptions;
|
|
173
|
-
return queueName;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
exports.Task = Task;
|
|
177
|
-
//# sourceMappingURL=task.js.map
|
|
160
|
+
//#endregion
|
|
161
|
+
export { Task };
|
package/dist/utils.js
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.collectEventBusListeners = collectEventBusListeners;
|
|
4
|
-
exports.getConsumerTag = getConsumerTag;
|
|
1
|
+
//#region src/utils.ts
|
|
5
2
|
function collectEventBusListeners(eventBusListeners) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
return eventListeners;
|
|
3
|
+
const eventListeners = {};
|
|
4
|
+
for (const listener of eventBusListeners) eventListeners[listener.event] = listener;
|
|
5
|
+
return eventListeners;
|
|
11
6
|
}
|
|
12
7
|
function getConsumerTag(serviceName, hostname) {
|
|
13
|
-
|
|
8
|
+
return `${serviceName}:${hostname}`;
|
|
14
9
|
}
|
|
15
|
-
//#
|
|
10
|
+
//#endregion
|
|
11
|
+
export { collectEventBusListeners, getConsumerTag };
|
package/package.json
CHANGED
|
@@ -1,25 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diia-inhouse/diia-queue",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "14.0.10",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"description": "Package provide queue functionality",
|
|
5
6
|
"main": "dist/index.js",
|
|
6
|
-
"types": "dist/
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
7
15
|
"repository": "https://github.com/diia-open-source/be-diia-queue",
|
|
8
16
|
"author": "Diia",
|
|
9
17
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
10
18
|
"engines": {
|
|
11
|
-
"node": ">=
|
|
19
|
+
"node": ">=24"
|
|
12
20
|
},
|
|
13
21
|
"files": [
|
|
14
22
|
"dist"
|
|
15
23
|
],
|
|
16
24
|
"scripts": {
|
|
17
|
-
"build": "rimraf dist/ &&
|
|
18
|
-
"build-watch": "
|
|
19
|
-
"lint": "
|
|
20
|
-
"lint-fix": "
|
|
25
|
+
"build": "rimraf dist/ && tsdown",
|
|
26
|
+
"build-watch": "tsdown --watch",
|
|
27
|
+
"lint": "oxlint && oxfmt --check .",
|
|
28
|
+
"lint-fix": "oxlint --fix && oxfmt .",
|
|
21
29
|
"lint:lockfile": "lockfile-lint --path package-lock.json --allowed-hosts registry.npmjs.org --validate-https",
|
|
22
|
-
"format": "
|
|
30
|
+
"format": "oxfmt \"src/**/*.ts\"",
|
|
23
31
|
"prepare": "npm run build",
|
|
24
32
|
"semantic-release": "semantic-release",
|
|
25
33
|
"test": "vitest run",
|
|
@@ -33,39 +41,42 @@
|
|
|
33
41
|
"p-timeout": "4.1.0"
|
|
34
42
|
},
|
|
35
43
|
"peerDependencies": {
|
|
36
|
-
"@diia-inhouse/diia-logger": ">=
|
|
37
|
-
"@diia-inhouse/diia-metrics": ">=
|
|
38
|
-
"@diia-inhouse/env": ">=
|
|
39
|
-
"@diia-inhouse/errors": ">=
|
|
40
|
-
"@diia-inhouse/types": ">=
|
|
41
|
-
"@diia-inhouse/utils": ">=
|
|
42
|
-
"@diia-inhouse/validators": ">=
|
|
44
|
+
"@diia-inhouse/diia-logger": ">=4.0.0",
|
|
45
|
+
"@diia-inhouse/diia-metrics": ">=7.0.0",
|
|
46
|
+
"@diia-inhouse/env": ">=3.0.0",
|
|
47
|
+
"@diia-inhouse/errors": ">=2.0.0",
|
|
48
|
+
"@diia-inhouse/types": ">=13.1.0",
|
|
49
|
+
"@diia-inhouse/utils": ">=6.0.0",
|
|
50
|
+
"@diia-inhouse/validators": ">=2.0.0",
|
|
43
51
|
"@opentelemetry/api": ">=1.7.0"
|
|
44
52
|
},
|
|
45
53
|
"devDependencies": {
|
|
46
|
-
"@diia-inhouse/configs": "
|
|
47
|
-
"@diia-inhouse/diia-logger": "
|
|
48
|
-
"@diia-inhouse/diia-metrics": "
|
|
49
|
-
"@diia-inhouse/
|
|
50
|
-
"@diia-inhouse/
|
|
51
|
-
"@diia-inhouse/
|
|
52
|
-
"@diia-inhouse/test": "
|
|
53
|
-
"@diia-inhouse/types": "
|
|
54
|
-
"@diia-inhouse/utils": "
|
|
55
|
-
"@diia-inhouse/validators": "
|
|
54
|
+
"@diia-inhouse/configs": "7.0.0",
|
|
55
|
+
"@diia-inhouse/diia-logger": "4.2.4",
|
|
56
|
+
"@diia-inhouse/diia-metrics": "7.1.5",
|
|
57
|
+
"@diia-inhouse/env": "3.3.1",
|
|
58
|
+
"@diia-inhouse/errors": "2.1.1",
|
|
59
|
+
"@diia-inhouse/oxc-config": "1.10.0",
|
|
60
|
+
"@diia-inhouse/test": "8.2.1",
|
|
61
|
+
"@diia-inhouse/types": "13.2.0",
|
|
62
|
+
"@diia-inhouse/utils": "6.0.11",
|
|
63
|
+
"@diia-inhouse/validators": "2.2.2",
|
|
56
64
|
"@opentelemetry/api": "1.9.0",
|
|
57
65
|
"@types/lodash": "4.17.24",
|
|
58
|
-
"@types/node": "
|
|
59
|
-
"@vitest/coverage-v8": "4.
|
|
60
|
-
"@vitest/ui": "4.
|
|
61
|
-
"lockfile-lint": "
|
|
66
|
+
"@types/node": "25.6.2",
|
|
67
|
+
"@vitest/coverage-v8": "4.1.5",
|
|
68
|
+
"@vitest/ui": "4.1.5",
|
|
69
|
+
"lockfile-lint": "5.0.0",
|
|
62
70
|
"madge": "8.0.0",
|
|
63
|
-
"
|
|
71
|
+
"oxfmt": "0.48.0",
|
|
72
|
+
"oxlint": "1.63.0",
|
|
73
|
+
"oxlint-tsgolint": "0.22.1",
|
|
64
74
|
"rimraf": "6.1.3",
|
|
65
|
-
"
|
|
75
|
+
"tsdown": "0.22.0",
|
|
76
|
+
"type-fest": "5.6.0",
|
|
66
77
|
"vite-tsconfig-paths": "6.1.1",
|
|
67
|
-
"vitest": "4.
|
|
68
|
-
"vitest-mock-extended": "
|
|
78
|
+
"vitest": "4.1.5",
|
|
79
|
+
"vitest-mock-extended": "4.0.0"
|
|
69
80
|
},
|
|
70
81
|
"release": {
|
|
71
82
|
"extends": "@diia-inhouse/configs/dist/semantic-release/package"
|
|
@@ -73,23 +84,6 @@
|
|
|
73
84
|
"commitlint": {
|
|
74
85
|
"extends": "@diia-inhouse/configs/dist/commitlint"
|
|
75
86
|
},
|
|
76
|
-
"eslintConfig": {
|
|
77
|
-
"extends": "@diia-inhouse/eslint-config",
|
|
78
|
-
"overrides": [
|
|
79
|
-
{
|
|
80
|
-
"files": [
|
|
81
|
-
"*.ts"
|
|
82
|
-
],
|
|
83
|
-
"parserOptions": {
|
|
84
|
-
"project": [
|
|
85
|
-
"./tsconfig.json",
|
|
86
|
-
"./tests/tsconfig.json"
|
|
87
|
-
]
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
]
|
|
91
|
-
},
|
|
92
|
-
"prettier": "@diia-inhouse/eslint-config/prettier",
|
|
93
87
|
"madge": {
|
|
94
88
|
"tsConfig": "./tsconfig.json"
|
|
95
89
|
}
|
package/dist/constants.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;AAAA,kBAAe;IACX,mBAAmB,EAAE,GAAG;IACxB,MAAM,EAAE,UAAU;IAClB,YAAY,EAAE,MAAM;IACpB,WAAW,EAAE,QAAQ;IACrB,mBAAmB,EAAE,uBAAuB;CAC/C,CAAA"}
|