@diia-inhouse/diia-queue 13.3.4 → 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,187 +1,165 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
1
+ import { Message } from "../interfaces/providers/rabbitmq/index.js";
2
+ import "../interfaces/index.js";
3
+ import { getConsumerTag } from "../utils.js";
4
+ import OptionsBuilder from "./optionsBuilder.js";
5
+ import { InternalServerError } from "@diia-inhouse/errors";
6
+ //#region src/services/communicator.ts
7
+ var Communicator = class {
8
+ logger;
9
+ queueProvider;
10
+ hostName;
11
+ systemServiceName;
12
+ optionsBuilder;
13
+ eventNameToExchangeNameMap = /* @__PURE__ */ new Map();
14
+ queueBindToMap = /* @__PURE__ */ new Map();
15
+ exchangesMap = /* @__PURE__ */ new Map();
16
+ serviceConfig = {
17
+ exchangesOptions: [],
18
+ queuesOptions: []
19
+ };
20
+ constructor(logger, queueProvider, hostName, systemServiceName) {
21
+ this.logger = logger;
22
+ this.queueProvider = queueProvider;
23
+ this.hostName = hostName;
24
+ this.systemServiceName = systemServiceName;
25
+ const { queuesOptions = [] } = this.queueProvider.getMessageBrokerServiceConfig();
26
+ for (const { name: queueName, bindTo } of queuesOptions) this.queueBindToMap.set(queueName, bindTo);
27
+ this.optionsBuilder = new OptionsBuilder(this.queueProvider);
28
+ }
29
+ async onInit() {
30
+ await this.init();
31
+ }
32
+ async onDestroy() {
33
+ const { queuesOptions } = this.serviceConfig;
34
+ const queueNames = queuesOptions.map(({ name }) => name);
35
+ await this.unsubscribeFromQueues(queueNames);
36
+ }
37
+ async subscribeToQueues(listeners) {
38
+ for (const listener of listeners) {
39
+ const { eventNames, queueOptions: { name: queueName } } = listener;
40
+ try {
41
+ await this.subscribe(queueName, listener.handler);
42
+ this.logger.info(`${this.constructor.name} service listener [${eventNames ? eventNames.join(" ") : queueName}] is initialized successfully`);
43
+ } catch (err) {
44
+ this.logger.error(`Failed to initialize ${this.constructor.name} service`, { err });
45
+ throw err;
46
+ }
47
+ }
48
+ }
49
+ async subscribe(queueName, messageHandler) {
50
+ return await this.queueProvider.subscribe(queueName, messageHandler);
51
+ }
52
+ async unsubscribeFromQueues(queueNames) {
53
+ for (const queueName of queueNames) await this.unsubscribe(queueName);
54
+ }
55
+ async unsubscribe(queueName) {
56
+ await this.queueProvider.unsubscribe(queueName);
57
+ }
58
+ async publishToQueue(queueName, messageData, options) {
59
+ const bindTo = [...this.queueBindToMap.get(queueName) ?? []];
60
+ if (bindTo.length === 0) {
61
+ const message = `Not found bind options for queue [${queueName}]`;
62
+ this.logger.error(message);
63
+ throw new InternalServerError(message);
64
+ }
65
+ const queueMessageData = this.getPublishQueueMessageData(messageData.event, messageData.payload);
66
+ for (const bindOptions of bindTo) {
67
+ const { exchangeName, routingKey } = bindOptions;
68
+ await this.queueProvider.publish(queueMessageData, exchangeName, routingKey, options);
69
+ }
70
+ }
71
+ async publishToExchange(exchangeName, routingKey, messageData, options) {
72
+ if (!this.exchangesMap.has(exchangeName)) {
73
+ const message = `Not found exchange [${exchangeName}]`;
74
+ this.logger.error(message);
75
+ throw new InternalServerError(message);
76
+ }
77
+ const message = messageData instanceof Message ? messageData.data : this.getPublishQueueMessageData(messageData.event, messageData.payload);
78
+ return await this.queueProvider.publish(message, exchangeName, routingKey, options);
79
+ }
80
+ async publishEventToExchange(eventName, payload, options) {
81
+ const exchangeName = this.eventNameToExchangeNameMap.get(eventName);
82
+ if (!exchangeName) {
83
+ const message = `Exchange for event [${eventName}] is not defined`;
84
+ this.logger.error(message);
85
+ throw new InternalServerError(message);
86
+ }
87
+ const { routingKey, ...opts } = options || {};
88
+ const message = payload instanceof Message ? payload.data : this.getPublishQueueMessageData(eventName, payload);
89
+ return await this.queueProvider.publish(message, exchangeName, routingKey, opts);
90
+ }
91
+ getPublishQueueMessageData(eventName, message, partialMeta) {
92
+ return {
93
+ meta: {
94
+ date: /* @__PURE__ */ new Date(),
95
+ ...partialMeta
96
+ },
97
+ event: eventName,
98
+ payload: message
99
+ };
100
+ }
101
+ async init() {
102
+ this.buildEventNameToExchangeNameMap();
103
+ const { rabbit: { consumerEnabled } = {} } = this.queueProvider.getConfig();
104
+ const producerExchangesOptions = this.getProducerExchangesOptions();
105
+ const listeners = consumerEnabled === false ? [] : [...this.getMulticastListeners(), ...this.getUnicastListeners()];
106
+ const serviceConfig = this.getServiceConfig(listeners, producerExchangesOptions);
107
+ this.serviceConfig = serviceConfig;
108
+ const { exchangesOptions } = serviceConfig;
109
+ this.buildExchangesMap(exchangesOptions);
110
+ await this.queueProvider.init(serviceConfig);
111
+ await this.subscribeToQueues(listeners);
112
+ return serviceConfig;
113
+ }
114
+ buildExchangesMap(exchangesOptions) {
115
+ for (const exchangeOptions of exchangesOptions) {
116
+ const { name } = exchangeOptions;
117
+ this.exchangesMap.set(name, exchangeOptions);
118
+ }
119
+ }
120
+ buildEventNameToExchangeNameMap() {
121
+ const { topics } = this.queueProvider.getConfig();
122
+ for (const topic in topics) {
123
+ const { events } = topics[topic];
124
+ const exchangeName = this.getExchangeNameWithSuffix(topic);
125
+ for (const eventName of events) this.eventNameToExchangeNameMap.set(eventName, exchangeName);
126
+ }
127
+ }
128
+ getServiceConfig(listeners, implicitExchangesOptions = []) {
129
+ const { queuesOptions, exchangesOptions } = this.unifyServiceConfig(listeners, implicitExchangesOptions);
130
+ return {
131
+ exchangesOptions,
132
+ queuesOptions: queuesOptions.map((queueOptions) => this.enrichQueueConsumerOptions(queueOptions))
133
+ };
134
+ }
135
+ unifyServiceConfig(listeners, implicitExchangesOptions = []) {
136
+ const queuesMap = /* @__PURE__ */ new Map();
137
+ const exchangesMap = /* @__PURE__ */ new Map();
138
+ for (const listener of listeners) {
139
+ const { queueOptions, exchangesOptions } = listener;
140
+ queuesMap.set(queueOptions.name, queueOptions);
141
+ for (const exchangeOptions of exchangesOptions) exchangesMap.set(exchangeOptions.name, exchangeOptions);
142
+ }
143
+ const { queuesOptions, exchangesOptions: explicitExchangesOptions } = this.queueProvider.getMessageBrokerServiceConfig();
144
+ for (const queueOpts of queuesOptions) if (!queuesMap.has(queueOpts.name)) queuesMap.set(queueOpts.name, queueOpts);
145
+ for (const exchangeOpts of [...explicitExchangesOptions, ...implicitExchangesOptions]) if (!exchangesMap.has(exchangeOpts.name)) exchangesMap.set(exchangeOpts.name, exchangeOpts);
146
+ return {
147
+ queuesOptions: [...queuesMap.values()],
148
+ exchangesOptions: [...exchangesMap.values()]
149
+ };
150
+ }
151
+ enrichQueueConsumerOptions(queueOptions) {
152
+ const { prefetchCount: globalPrefetchCount } = this.optionsBuilder.defineConsumerOptionsBasedOnGlobalConfig();
153
+ const { prefetchCount = globalPrefetchCount, consumerTag = getConsumerTag(this.systemServiceName, this.hostName), ...consumerOptions } = queueOptions.consumerOptions || {};
154
+ return {
155
+ ...queueOptions,
156
+ consumerOptions: {
157
+ ...consumerOptions,
158
+ consumerTag,
159
+ prefetchCount
160
+ }
161
+ };
162
+ }
4
163
  };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const errors_1 = require("@diia-inhouse/errors");
7
- const interfaces_1 = require("../interfaces");
8
- const utils_1 = require("../utils");
9
- const optionsBuilder_1 = __importDefault(require("./optionsBuilder"));
10
- class Communicator {
11
- logger;
12
- queueProvider;
13
- hostName;
14
- systemServiceName;
15
- optionsBuilder;
16
- eventNameToExchangeNameMap = new Map();
17
- queueBindToMap = new Map();
18
- exchangesMap = new Map();
19
- serviceConfig = {
20
- exchangesOptions: [],
21
- queuesOptions: [],
22
- };
23
- constructor(logger, queueProvider, hostName, systemServiceName) {
24
- this.logger = logger;
25
- this.queueProvider = queueProvider;
26
- this.hostName = hostName;
27
- this.systemServiceName = systemServiceName;
28
- const { queuesOptions = [] } = this.queueProvider.getMessageBrokerServiceConfig();
29
- for (const { name: queueName, bindTo } of queuesOptions) {
30
- this.queueBindToMap.set(queueName, bindTo);
31
- }
32
- this.optionsBuilder = new optionsBuilder_1.default(this.queueProvider);
33
- }
34
- async onInit() {
35
- await this.init();
36
- }
37
- async onDestroy() {
38
- const { queuesOptions } = this.serviceConfig;
39
- const queueNames = queuesOptions.map(({ name }) => name);
40
- await this.unsubscribeFromQueues(queueNames);
41
- }
42
- async subscribeToQueues(listeners) {
43
- for await (const listener of listeners) {
44
- const { eventNames, queueOptions: { name: queueName }, } = listener;
45
- try {
46
- // eslint-disable-next-line unicorn/consistent-destructuring
47
- await this.subscribe(queueName, listener.handler);
48
- this.logger.info(`${this.constructor.name} service listener [${eventNames ? eventNames.join(' ') : queueName}] is initialized successfully`);
49
- }
50
- catch (err) {
51
- this.logger.error(`Failed to initialize ${this.constructor.name} service`, { err });
52
- throw err;
53
- }
54
- }
55
- }
56
- async subscribe(queueName, messageHandler) {
57
- return await this.queueProvider.subscribe(queueName, messageHandler);
58
- }
59
- async unsubscribeFromQueues(queueNames) {
60
- for await (const queueName of queueNames) {
61
- await this.unsubscribe(queueName);
62
- }
63
- }
64
- async unsubscribe(queueName) {
65
- await this.queueProvider.unsubscribe(queueName);
66
- }
67
- async publishToQueue(queueName, messageData, options) {
68
- const bindTo = [...(this.queueBindToMap.get(queueName) ?? [])];
69
- if (bindTo.length === 0) {
70
- const message = `Not found bind options for queue [${queueName}]`;
71
- this.logger.error(message);
72
- throw new errors_1.InternalServerError(message);
73
- }
74
- const queueMessageData = this.getPublishQueueMessageData(messageData.event, messageData.payload);
75
- for await (const bindOptions of bindTo) {
76
- const { exchangeName, routingKey } = bindOptions;
77
- await this.queueProvider.publish(queueMessageData, exchangeName, routingKey, options);
78
- }
79
- }
80
- async publishToExchange(exchangeName, routingKey, messageData, options) {
81
- if (!this.exchangesMap.has(exchangeName)) {
82
- const message = `Not found exchange [${exchangeName}]`;
83
- this.logger.error(message);
84
- throw new errors_1.InternalServerError(message);
85
- }
86
- const message = messageData instanceof interfaces_1.Message ? messageData.data : this.getPublishQueueMessageData(messageData.event, messageData.payload);
87
- return await this.queueProvider.publish(message, exchangeName, routingKey, options);
88
- }
89
- async publishEventToExchange(eventName, payload, options) {
90
- const exchangeName = this.eventNameToExchangeNameMap.get(eventName);
91
- if (!exchangeName) {
92
- const message = `Exchange for event [${eventName}] is not defined`;
93
- this.logger.error(message);
94
- throw new errors_1.InternalServerError(message);
95
- }
96
- const { routingKey, ...opts } = options || {};
97
- const message = payload instanceof interfaces_1.Message ? payload.data : this.getPublishQueueMessageData(eventName, payload);
98
- return await this.queueProvider.publish(message, exchangeName, routingKey, opts);
99
- }
100
- getPublishQueueMessageData(eventName, message, partialMeta) {
101
- const meta = {
102
- date: new Date(),
103
- ...partialMeta,
104
- };
105
- return {
106
- meta,
107
- event: eventName,
108
- payload: message,
109
- };
110
- }
111
- async init() {
112
- this.buildEventNameToExchangeNameMap();
113
- const { rabbit: { consumerEnabled } = {} } = this.queueProvider.getConfig();
114
- const producerExchangesOptions = this.getProducerExchangesOptions();
115
- const listeners = consumerEnabled === false ? [] : [...this.getMulticastListeners(), ...this.getUnicastListeners()];
116
- const serviceConfig = this.getServiceConfig(listeners, producerExchangesOptions);
117
- this.serviceConfig = serviceConfig;
118
- const { exchangesOptions } = serviceConfig;
119
- this.buildExchangesMap(exchangesOptions);
120
- await this.queueProvider.init(serviceConfig);
121
- await this.subscribeToQueues(listeners);
122
- return serviceConfig;
123
- }
124
- buildExchangesMap(exchangesOptions) {
125
- for (const exchangeOptions of exchangesOptions) {
126
- const { name } = exchangeOptions;
127
- this.exchangesMap.set(name, exchangeOptions);
128
- }
129
- }
130
- buildEventNameToExchangeNameMap() {
131
- const { topics } = this.queueProvider.getConfig();
132
- for (const topic in topics) {
133
- const { events } = topics[topic];
134
- const exchangeName = this.getExchangeNameWithSuffix(topic);
135
- for (const eventName of events) {
136
- this.eventNameToExchangeNameMap.set(eventName, exchangeName);
137
- }
138
- }
139
- }
140
- getServiceConfig(listeners, implicitExchangesOptions = []) {
141
- const { queuesOptions, exchangesOptions } = this.unifyServiceConfig(listeners, implicitExchangesOptions);
142
- return {
143
- exchangesOptions,
144
- queuesOptions: queuesOptions.map((queueOptions) => this.enrichQueueConsumerOptions(queueOptions)),
145
- };
146
- }
147
- unifyServiceConfig(listeners, implicitExchangesOptions = []) {
148
- const queuesMap = new Map();
149
- const exchangesMap = new Map();
150
- for (const listener of listeners) {
151
- const { queueOptions, exchangesOptions } = listener;
152
- queuesMap.set(queueOptions.name, queueOptions);
153
- for (const exchangeOptions of exchangesOptions) {
154
- exchangesMap.set(exchangeOptions.name, exchangeOptions);
155
- }
156
- }
157
- const { queuesOptions, exchangesOptions: explicitExchangesOptions } = this.queueProvider.getMessageBrokerServiceConfig();
158
- for (const queueOpts of queuesOptions) {
159
- if (!queuesMap.has(queueOpts.name)) {
160
- queuesMap.set(queueOpts.name, queueOpts);
161
- }
162
- }
163
- for (const exchangeOpts of [...explicitExchangesOptions, ...implicitExchangesOptions]) {
164
- if (!exchangesMap.has(exchangeOpts.name)) {
165
- exchangesMap.set(exchangeOpts.name, exchangeOpts);
166
- }
167
- }
168
- return {
169
- queuesOptions: [...queuesMap.values()],
170
- exchangesOptions: [...exchangesMap.values()],
171
- };
172
- }
173
- enrichQueueConsumerOptions(queueOptions) {
174
- const { prefetchCount: globalPrefetchCount } = this.optionsBuilder.defineConsumerOptionsBasedOnGlobalConfig();
175
- const { prefetchCount = globalPrefetchCount, consumerTag = (0, utils_1.getConsumerTag)(this.systemServiceName, this.hostName), ...consumerOptions } = queueOptions.consumerOptions || {};
176
- return {
177
- ...queueOptions,
178
- consumerOptions: {
179
- ...consumerOptions,
180
- consumerTag,
181
- prefetchCount,
182
- },
183
- };
184
- }
185
- }
186
- exports.default = Communicator;
187
- //# sourceMappingURL=communicator.js.map
164
+ //#endregion
165
+ export { Communicator as default };
@@ -0,0 +1,25 @@
1
+ import { ExchangeName, ExchangeOptions } from "../interfaces/messageBrokerServiceConfig.js";
2
+ import { PublishOptions } from "../interfaces/options.js";
3
+ import { EventName, QueueName } from "../interfaces/queueConfig/configs.js";
4
+ import { MessagePayload, PublishingResult } from "../interfaces/providers/rabbitmq/amqpPublisher.js";
5
+ import { EventBusListener, EventBusQueue, MessageBrokerServiceEventsListener } from "../interfaces/index.js";
6
+ import { RabbitMQProvider } from "../providers/rabbitmq/index.js";
7
+ import { Communicator } from "./communicator.js";
8
+ import { EventMessageHandler } from "./eventMessageHandler.js";
9
+ import { OnInit } from "@diia-inhouse/types";
10
+ import Logger$1 from "@diia-inhouse/diia-logger";
11
+
12
+ //#region src/services/eventBus.d.ts
13
+ declare class EventBus extends Communicator implements EventBusQueue, OnInit {
14
+ private readonly eventListenerList;
15
+ private readonly queueName;
16
+ private readonly eventCommunicator;
17
+ constructor(queueProvider: RabbitMQProvider, eventListenerList: EventBusListener[], eventMessageHandler: EventMessageHandler, logger: Logger$1, hostName: string, systemServiceName: string, queueName?: QueueName | undefined);
18
+ publish(eventName: EventName, payload: MessagePayload, options?: PublishOptions): Promise<PublishingResult>;
19
+ protected getExchangeNameWithSuffix(exchangeName: ExchangeName): string;
20
+ protected getUnicastListeners(): MessageBrokerServiceEventsListener[];
21
+ protected getProducerExchangesOptions(): ExchangeOptions[];
22
+ protected getMulticastListeners(): MessageBrokerServiceEventsListener[];
23
+ }
24
+ //#endregion
25
+ export { EventBus };
@@ -1,58 +1,46 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
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/eventBus.ts
6
+ var EventBus = class extends Communicator {
7
+ eventListenerList;
8
+ queueName;
9
+ eventCommunicator;
10
+ constructor(queueProvider, eventListenerList, eventMessageHandler, logger, hostName, systemServiceName, queueName = void 0) {
11
+ super(logger, queueProvider, hostName, systemServiceName);
12
+ this.eventListenerList = eventListenerList;
13
+ this.queueName = queueName;
14
+ this.eventCommunicator = new EventCommunicator(logger, queueProvider, eventMessageHandler, eventListenerList);
15
+ }
16
+ async publish(eventName, payload, options) {
17
+ return await this.publishEventToExchange(eventName, payload, options);
18
+ }
19
+ getExchangeNameWithSuffix(exchangeName) {
20
+ return exchangeName;
21
+ }
22
+ getUnicastListeners() {
23
+ return this.eventCommunicator.getUnicastListeners();
24
+ }
25
+ getProducerExchangesOptions() {
26
+ if (!this.queueName) return [];
27
+ const { rabbit: { declareOptions: { assertExchanges } = {} } } = this.queueProvider.getConfig();
28
+ const exchangeNames = this.optionsBuilder.getExchangeNamesByQueueName(this.queueName);
29
+ const exchangesOptions = [];
30
+ for (const exchangeName of exchangeNames) exchangesOptions.push({
31
+ name: exchangeName,
32
+ declare: assertExchanges,
33
+ type: "topic"
34
+ });
35
+ return exchangesOptions;
36
+ }
37
+ getMulticastListeners() {
38
+ if (!this.queueName || this.eventListenerList.length === 0) return [];
39
+ const [queueOptions] = this.optionsBuilder.defineQueueOptionsBasedOnGlobalConfig(this.queueName);
40
+ if (!queueOptions) return [];
41
+ const exchangesOptions = this.getProducerExchangesOptions();
42
+ return this.eventCommunicator.getMulticastListeners([queueOptions], exchangesOptions);
43
+ }
4
44
  };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.EventBus = void 0;
7
- const interfaces_1 = require("../interfaces");
8
- const communicator_1 = __importDefault(require("./communicator"));
9
- const eventCommunicator_1 = require("./eventCommunicator");
10
- class EventBus extends communicator_1.default {
11
- eventListenerList;
12
- queueName;
13
- eventCommunicator;
14
- constructor(queueProvider, eventListenerList, eventMessageHandler, logger, hostName, systemServiceName, queueName) {
15
- super(logger, queueProvider, hostName, systemServiceName);
16
- this.eventListenerList = eventListenerList;
17
- this.queueName = queueName;
18
- this.eventCommunicator = new eventCommunicator_1.EventCommunicator(logger, queueProvider, eventMessageHandler, eventListenerList);
19
- }
20
- async publish(eventName, payload, options) {
21
- return await this.publishEventToExchange(eventName, payload, options);
22
- }
23
- getExchangeNameWithSuffix(exchangeName) {
24
- return exchangeName;
25
- }
26
- getUnicastListeners() {
27
- return this.eventCommunicator.getUnicastListeners();
28
- }
29
- getProducerExchangesOptions() {
30
- if (!this.queueName) {
31
- return [];
32
- }
33
- const { rabbit: { declareOptions: { assertExchanges } = {} }, } = this.queueProvider.getConfig();
34
- const exchangeNames = this.optionsBuilder.getExchangeNamesByQueueName(this.queueName);
35
- const exchangesOptions = [];
36
- for (const exchangeName of exchangeNames) {
37
- exchangesOptions.push({
38
- name: exchangeName,
39
- declare: assertExchanges,
40
- type: interfaces_1.ExchangeType.Topic,
41
- });
42
- }
43
- return exchangesOptions;
44
- }
45
- getMulticastListeners() {
46
- if (!this.queueName || this.eventListenerList.length === 0) {
47
- return [];
48
- }
49
- const [queueOptions] = this.optionsBuilder.defineQueueOptionsBasedOnGlobalConfig(this.queueName);
50
- if (!queueOptions) {
51
- return [];
52
- }
53
- const exchangesOptions = this.getProducerExchangesOptions();
54
- return this.eventCommunicator.getMulticastListeners([queueOptions], exchangesOptions);
55
- }
56
- }
57
- exports.EventBus = EventBus;
58
- //# sourceMappingURL=eventBus.js.map
45
+ //#endregion
46
+ export { EventBus };
@@ -1,125 +1,76 @@
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 () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
1
+ import { collectEventBusListeners } from "../utils.js";
2
+ import lodash from "lodash";
3
+ //#region src/services/eventCommunicator.ts
4
+ var EventCommunicator = class {
5
+ logger;
6
+ queueProvider;
7
+ eventMessageHandler;
8
+ listenerList;
9
+ constructor(logger, queueProvider, eventMessageHandler, listenerList = []) {
10
+ this.logger = logger;
11
+ this.queueProvider = queueProvider;
12
+ this.eventMessageHandler = eventMessageHandler;
13
+ this.listenerList = listenerList;
14
+ }
15
+ getMulticastListeners(queuesOptions, exchangesOptions, eventQueueMap = /* @__PURE__ */ new Map()) {
16
+ const eventListeners = collectEventBusListeners(this.listenerList);
17
+ const eventsHandler = this.eventMessageHandler.eventListenersMessageHandler.bind(this.eventMessageHandler, eventListeners);
18
+ const listeners = [];
19
+ for (const queueOptions of queuesOptions) {
20
+ const { name: queueName } = queueOptions;
21
+ const listener = {
22
+ eventNames: this.defineEventNamesByQueueName(queueName, eventQueueMap),
23
+ queueOptions,
24
+ exchangesOptions,
25
+ handler: eventsHandler
26
+ };
27
+ listeners.push(listener);
28
+ }
29
+ return listeners;
30
+ }
31
+ getUnicastListeners() {
32
+ const listeners = [];
33
+ const { queuesOptions, exchangesOptions } = this.queueProvider.getMessageBrokerServiceConfig();
34
+ const queuesOptionsMap = lodash.keyBy(queuesOptions, "name");
35
+ const exchangesOptionsMap = lodash.keyBy(exchangesOptions, "name");
36
+ for (const eventListener of this.listenerList) {
37
+ const { queueNames = [] } = eventListener;
38
+ for (const queueName of queueNames) {
39
+ const queueOptions = queuesOptionsMap[queueName];
40
+ if (!queueOptions) {
41
+ this.logger.error(`Not found queue options by name (${queueName}) for ${this.constructor.name} service`);
42
+ continue;
43
+ }
44
+ const listener = {
45
+ queueOptions,
46
+ exchangesOptions: this.defineConsumerExchangesOptions(queueName, queueOptions.bindTo, exchangesOptionsMap),
47
+ handler: this.eventMessageHandler.eventListenerMessageHandler.bind(this.eventMessageHandler, eventListener)
48
+ };
49
+ listeners.push(listener);
50
+ }
51
+ }
52
+ return listeners;
53
+ }
54
+ defineConsumerExchangesOptions(queueName, bindTo = [], exchangesMap = {}) {
55
+ const exchangesOptions = [];
56
+ for (const bindOptions of bindTo) {
57
+ const { exchangeName } = bindOptions;
58
+ const exchangeOptions = exchangesMap[exchangeName];
59
+ if (!exchangeOptions) {
60
+ this.logger.error(`Not found exchange options by name (${exchangeName}) for ${this.constructor.name} service`);
61
+ continue;
62
+ }
63
+ exchangesOptions.push(exchangeOptions);
64
+ }
65
+ if (exchangesOptions.length === 0) this.logger.error(`Not found exchanges options for queue (${queueName}) for ${this.constructor.name} service`);
66
+ return exchangesOptions;
67
+ }
68
+ defineEventNamesByQueueName(queueName, eventQueueMap) {
69
+ if (eventQueueMap.size === 0) return this.listenerList.map(({ event }) => event);
70
+ const eventNames = [];
71
+ for (const [eventName, eventQueueName] of eventQueueMap) if (eventQueueName === queueName) eventNames.push(eventName);
72
+ return eventNames;
73
+ }
37
74
  };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.EventCommunicator = void 0;
40
- const lodash_1 = __importDefault(require("lodash"));
41
- const Utils = __importStar(require("../utils"));
42
- class EventCommunicator {
43
- logger;
44
- queueProvider;
45
- eventMessageHandler;
46
- listenerList;
47
- constructor(logger, queueProvider, eventMessageHandler, listenerList = []) {
48
- this.logger = logger;
49
- this.queueProvider = queueProvider;
50
- this.eventMessageHandler = eventMessageHandler;
51
- this.listenerList = listenerList;
52
- }
53
- getMulticastListeners(queuesOptions, exchangesOptions, eventQueueMap = new Map()) {
54
- const eventListeners = Utils.collectEventBusListeners(this.listenerList);
55
- const eventsHandler = this.eventMessageHandler.eventListenersMessageHandler.bind(this.eventMessageHandler, eventListeners);
56
- const listeners = [];
57
- for (const queueOptions of queuesOptions) {
58
- const { name: queueName } = queueOptions;
59
- const eventNames = this.defineEventNamesByQueueName(queueName, eventQueueMap);
60
- const listener = {
61
- eventNames,
62
- queueOptions,
63
- exchangesOptions,
64
- handler: eventsHandler,
65
- };
66
- listeners.push(listener);
67
- }
68
- return listeners;
69
- }
70
- getUnicastListeners() {
71
- const listeners = [];
72
- const { queuesOptions, exchangesOptions } = this.queueProvider.getMessageBrokerServiceConfig();
73
- const queuesOptionsMap = lodash_1.default.keyBy(queuesOptions, 'name');
74
- const exchangesOptionsMap = lodash_1.default.keyBy(exchangesOptions, 'name');
75
- for (const eventListener of this.listenerList) {
76
- const { queueNames = [] } = eventListener;
77
- for (const queueName of queueNames) {
78
- const queueOptions = queuesOptionsMap[queueName];
79
- if (!queueOptions) {
80
- this.logger.error(`Not found queue options by name (${queueName}) for ${this.constructor.name} service`);
81
- continue;
82
- }
83
- const exchangesOptions = this.defineConsumerExchangesOptions(queueName, queueOptions.bindTo, exchangesOptionsMap);
84
- const eventMessageHandler = this.eventMessageHandler.eventListenerMessageHandler.bind(this.eventMessageHandler, eventListener);
85
- const listener = {
86
- queueOptions,
87
- exchangesOptions,
88
- handler: eventMessageHandler,
89
- };
90
- listeners.push(listener);
91
- }
92
- }
93
- return listeners;
94
- }
95
- defineConsumerExchangesOptions(queueName, bindTo = [], exchangesMap = {}) {
96
- const exchangesOptions = [];
97
- for (const bindOptions of bindTo) {
98
- const { exchangeName } = bindOptions;
99
- const exchangeOptions = exchangesMap[exchangeName];
100
- if (!exchangeOptions) {
101
- this.logger.error(`Not found exchange options by name (${exchangeName}) for ${this.constructor.name} service`);
102
- continue;
103
- }
104
- exchangesOptions.push(exchangeOptions);
105
- }
106
- if (exchangesOptions.length === 0) {
107
- this.logger.error(`Not found exchanges options for queue (${queueName}) for ${this.constructor.name} service`);
108
- }
109
- return exchangesOptions;
110
- }
111
- defineEventNamesByQueueName(queueName, eventQueueMap) {
112
- if (eventQueueMap.size === 0) {
113
- return this.listenerList.map(({ event }) => event);
114
- }
115
- const eventNames = [];
116
- for (const [eventName, eventQueueName] of eventQueueMap) {
117
- if (eventQueueName === queueName) {
118
- eventNames.push(eventName);
119
- }
120
- }
121
- return eventNames;
122
- }
123
- }
124
- exports.EventCommunicator = EventCommunicator;
125
- //# sourceMappingURL=eventCommunicator.js.map
75
+ //#endregion
76
+ export { EventCommunicator };