@makebelieve21213-packages/rabbitmq-client 1.0.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.
Files changed (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +461 -0
  3. package/dist/__tests__/__mocks__/logger.d.ts +10 -0
  4. package/dist/__tests__/__mocks__/logger.d.ts.map +1 -0
  5. package/dist/__tests__/__mocks__/logger.js +11 -0
  6. package/dist/__tests__/__mocks__/logger.js.map +1 -0
  7. package/dist/__tests__/__mocks__/redis-client.d.ts +9 -0
  8. package/dist/__tests__/__mocks__/redis-client.d.ts.map +1 -0
  9. package/dist/__tests__/__mocks__/redis-client.js +10 -0
  10. package/dist/__tests__/__mocks__/redis-client.js.map +1 -0
  11. package/dist/__tests__/connect-rabbitmq-receiver.spec.d.ts +2 -0
  12. package/dist/__tests__/connect-rabbitmq-receiver.spec.d.ts.map +1 -0
  13. package/dist/__tests__/connect-rabbitmq-receiver.spec.js +206 -0
  14. package/dist/__tests__/connect-rabbitmq-receiver.spec.js.map +1 -0
  15. package/dist/__tests__/connect-rabbitmq-receivers.spec.d.ts +2 -0
  16. package/dist/__tests__/connect-rabbitmq-receivers.spec.d.ts.map +1 -0
  17. package/dist/__tests__/connect-rabbitmq-receivers.spec.js +139 -0
  18. package/dist/__tests__/connect-rabbitmq-receivers.spec.js.map +1 -0
  19. package/dist/__tests__/index.spec.d.ts +2 -0
  20. package/dist/__tests__/index.spec.d.ts.map +1 -0
  21. package/dist/__tests__/index.spec.js +206 -0
  22. package/dist/__tests__/index.spec.js.map +1 -0
  23. package/dist/__tests__/setup.d.ts +2 -0
  24. package/dist/__tests__/setup.d.ts.map +1 -0
  25. package/dist/__tests__/setup.js +15 -0
  26. package/dist/__tests__/setup.js.map +1 -0
  27. package/dist/__tests__/test-types.d.ts +52 -0
  28. package/dist/__tests__/test-types.d.ts.map +1 -0
  29. package/dist/__tests__/test-types.js +2 -0
  30. package/dist/__tests__/test-types.js.map +1 -0
  31. package/dist/config/__tests__/factories.spec.d.ts +2 -0
  32. package/dist/config/__tests__/factories.spec.d.ts.map +1 -0
  33. package/dist/config/__tests__/factories.spec.js +168 -0
  34. package/dist/config/__tests__/factories.spec.js.map +1 -0
  35. package/dist/config/factories.d.ts +23 -0
  36. package/dist/config/factories.d.ts.map +1 -0
  37. package/dist/config/factories.js +123 -0
  38. package/dist/config/factories.js.map +1 -0
  39. package/dist/connect-rabbitmq-receiver.d.ts +8 -0
  40. package/dist/connect-rabbitmq-receiver.d.ts.map +1 -0
  41. package/dist/connect-rabbitmq-receiver.js +49 -0
  42. package/dist/connect-rabbitmq-receiver.js.map +1 -0
  43. package/dist/connect-rabbitmq-receivers.d.ts +8 -0
  44. package/dist/connect-rabbitmq-receivers.d.ts.map +1 -0
  45. package/dist/connect-rabbitmq-receivers.js +18 -0
  46. package/dist/connect-rabbitmq-receivers.js.map +1 -0
  47. package/dist/index.d.ts +14 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +8 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/interceptors/__tests__/rabbitmq.interceptor.spec.d.ts +2 -0
  52. package/dist/interceptors/__tests__/rabbitmq.interceptor.spec.d.ts.map +1 -0
  53. package/dist/interceptors/__tests__/rabbitmq.interceptor.spec.js +647 -0
  54. package/dist/interceptors/__tests__/rabbitmq.interceptor.spec.js.map +1 -0
  55. package/dist/interceptors/rabbitmq.interceptor.d.ts +18 -0
  56. package/dist/interceptors/rabbitmq.interceptor.d.ts.map +1 -0
  57. package/dist/interceptors/rabbitmq.interceptor.js +107 -0
  58. package/dist/interceptors/rabbitmq.interceptor.js.map +1 -0
  59. package/dist/main/__tests__/rabbitmq.module.spec.d.ts +2 -0
  60. package/dist/main/__tests__/rabbitmq.module.spec.d.ts.map +1 -0
  61. package/dist/main/__tests__/rabbitmq.module.spec.js +266 -0
  62. package/dist/main/__tests__/rabbitmq.module.spec.js.map +1 -0
  63. package/dist/main/__tests__/rabbitmq.service.spec.d.ts +2 -0
  64. package/dist/main/__tests__/rabbitmq.service.spec.d.ts.map +1 -0
  65. package/dist/main/__tests__/rabbitmq.service.spec.js +349 -0
  66. package/dist/main/__tests__/rabbitmq.service.spec.js.map +1 -0
  67. package/dist/main/rabbitmq.module.d.ts +10 -0
  68. package/dist/main/rabbitmq.module.d.ts.map +1 -0
  69. package/dist/main/rabbitmq.module.js +51 -0
  70. package/dist/main/rabbitmq.module.js.map +1 -0
  71. package/dist/main/rabbitmq.service.d.ts +26 -0
  72. package/dist/main/rabbitmq.service.d.ts.map +1 -0
  73. package/dist/main/rabbitmq.service.js +100 -0
  74. package/dist/main/rabbitmq.service.js.map +1 -0
  75. package/dist/types/base.config.d.ts +15 -0
  76. package/dist/types/base.config.d.ts.map +1 -0
  77. package/dist/types/base.config.js +2 -0
  78. package/dist/types/base.config.js.map +1 -0
  79. package/dist/types/idempotent-message.d.ts +6 -0
  80. package/dist/types/idempotent-message.d.ts.map +1 -0
  81. package/dist/types/idempotent-message.js +2 -0
  82. package/dist/types/idempotent-message.js.map +1 -0
  83. package/dist/types/message-with-correlation-id.d.ts +10 -0
  84. package/dist/types/message-with-correlation-id.d.ts.map +1 -0
  85. package/dist/types/message-with-correlation-id.js +2 -0
  86. package/dist/types/message-with-correlation-id.js.map +1 -0
  87. package/dist/types/rabbitmq-config-dlx.d.ts +4 -0
  88. package/dist/types/rabbitmq-config-dlx.d.ts.map +1 -0
  89. package/dist/types/rabbitmq-config-dlx.js +2 -0
  90. package/dist/types/rabbitmq-config-dlx.js.map +1 -0
  91. package/dist/types/rabbitmq-config-receiver.d.ts +15 -0
  92. package/dist/types/rabbitmq-config-receiver.d.ts.map +1 -0
  93. package/dist/types/rabbitmq-config-receiver.js +2 -0
  94. package/dist/types/rabbitmq-config-receiver.js.map +1 -0
  95. package/dist/types/rabbitmq-config-retry.d.ts +13 -0
  96. package/dist/types/rabbitmq-config-retry.d.ts.map +1 -0
  97. package/dist/types/rabbitmq-config-retry.js +2 -0
  98. package/dist/types/rabbitmq-config-retry.js.map +1 -0
  99. package/dist/types/rabbitmq-config-sender.d.ts +14 -0
  100. package/dist/types/rabbitmq-config-sender.d.ts.map +1 -0
  101. package/dist/types/rabbitmq-config-sender.js +2 -0
  102. package/dist/types/rabbitmq-config-sender.js.map +1 -0
  103. package/dist/types/rabbitmq-module-options.d.ts +17 -0
  104. package/dist/types/rabbitmq-module-options.d.ts.map +1 -0
  105. package/dist/types/rabbitmq-module-options.js +2 -0
  106. package/dist/types/rabbitmq-module-options.js.map +1 -0
  107. package/dist/types/rabbitmq-receiver-options.d.ts +18 -0
  108. package/dist/types/rabbitmq-receiver-options.d.ts.map +1 -0
  109. package/dist/types/rabbitmq-receiver-options.js +2 -0
  110. package/dist/types/rabbitmq-receiver-options.js.map +1 -0
  111. package/dist/types/rabbitmq-receiver-subscription.d.ts +19 -0
  112. package/dist/types/rabbitmq-receiver-subscription.d.ts.map +1 -0
  113. package/dist/types/rabbitmq-receiver-subscription.js +2 -0
  114. package/dist/types/rabbitmq-receiver-subscription.js.map +1 -0
  115. package/dist/types/rabbitmq-receivers-config.d.ts +14 -0
  116. package/dist/types/rabbitmq-receivers-config.d.ts.map +1 -0
  117. package/dist/types/rabbitmq-receivers-config.js +2 -0
  118. package/dist/types/rabbitmq-receivers-config.js.map +1 -0
  119. package/dist/types/rabbitmq-sender-options.d.ts +10 -0
  120. package/dist/types/rabbitmq-sender-options.d.ts.map +1 -0
  121. package/dist/types/rabbitmq-sender-options.js +2 -0
  122. package/dist/types/rabbitmq-sender-options.js.map +1 -0
  123. package/dist/types/routing-keys.d.ts +24 -0
  124. package/dist/types/routing-keys.d.ts.map +1 -0
  125. package/dist/types/routing-keys.js +29 -0
  126. package/dist/types/routing-keys.js.map +1 -0
  127. package/dist/utils/__tests__/injections.spec.d.ts +2 -0
  128. package/dist/utils/__tests__/injections.spec.d.ts.map +1 -0
  129. package/dist/utils/__tests__/injections.spec.js +174 -0
  130. package/dist/utils/__tests__/injections.spec.js.map +1 -0
  131. package/dist/utils/injections.d.ts +2 -0
  132. package/dist/utils/injections.d.ts.map +1 -0
  133. package/dist/utils/injections.js +2 -0
  134. package/dist/utils/injections.js.map +1 -0
  135. package/package.json +91 -0
@@ -0,0 +1,349 @@
1
+ import { LoggerService } from "@makebelieve21213-packages/logger";
2
+ import { ConfigService } from "@nestjs/config";
3
+ import { Test } from "@nestjs/testing";
4
+ import { lastValueFrom, of, throwError } from "rxjs";
5
+ import { createSenderConfig } from "../../config/factories.js";
6
+ import RabbitMQService from "../../main/rabbitmq.service.js";
7
+ import { ROUTING_KEYS } from "../../types/routing-keys.js";
8
+ import { RABBITMQ_SENDER_SERVICE } from "../../utils/injections.js";
9
+ // Мокаем модуль lastValueFrom из rxjs
10
+ jest.mock("rxjs", () => ({
11
+ ...jest.requireActual("rxjs"),
12
+ lastValueFrom: jest.fn(),
13
+ }));
14
+ // Мокаем createSenderConfig
15
+ jest.mock("src/config/factories", () => ({
16
+ createSenderConfig: jest.fn(),
17
+ }));
18
+ const mockLastValueFrom = lastValueFrom;
19
+ const mockCreateSenderConfig = createSenderConfig;
20
+ describe("RabbitMQService", () => {
21
+ let service;
22
+ let clientProxy;
23
+ let configService;
24
+ let loggerService;
25
+ const mockSenderOptions = {
26
+ url: "amqp://localhost:5672",
27
+ exchange: "test_exchange",
28
+ exchangeType: "topic",
29
+ };
30
+ const mockRoutingKeys = {
31
+ [ROUTING_KEYS.TOKENS_FETCH_ALL]: ROUTING_KEYS.TOKENS_FETCH_ALL,
32
+ [ROUTING_KEYS.TOKENS_FETCH_DETAILS_ETHEREUM]: ROUTING_KEYS.TOKENS_FETCH_DETAILS_ETHEREUM,
33
+ [ROUTING_KEYS.TOKENS_FETCH_DETAILS_NFT]: ROUTING_KEYS.TOKENS_FETCH_DETAILS_NFT,
34
+ [ROUTING_KEYS.TOKENS_DEPLOY_ETHEREUM]: ROUTING_KEYS.TOKENS_DEPLOY_ETHEREUM,
35
+ [ROUTING_KEYS.TOKENS_DEPLOY_NFT]: ROUTING_KEYS.TOKENS_DEPLOY_NFT,
36
+ [ROUTING_KEYS.ANALYTICS_GLOBAL]: ROUTING_KEYS.ANALYTICS_GLOBAL,
37
+ [ROUTING_KEYS.ANALYTICS_TOTAL_MARKET_CHART]: ROUTING_KEYS.ANALYTICS_TOTAL_MARKET_CHART,
38
+ [ROUTING_KEYS.ANALYTICS_MARKET_CHART]: ROUTING_KEYS.ANALYTICS_MARKET_CHART,
39
+ [ROUTING_KEYS.ANALYTICS_DOMINANCE_CHART]: ROUTING_KEYS.ANALYTICS_DOMINANCE_CHART,
40
+ [ROUTING_KEYS.ANALYTICS_VOLUME_CHART]: ROUTING_KEYS.ANALYTICS_VOLUME_CHART,
41
+ [ROUTING_KEYS.ANALYTICS_TOP_VOLUME_LEADERS]: ROUTING_KEYS.ANALYTICS_TOP_VOLUME_LEADERS,
42
+ [ROUTING_KEYS.ANALYTICS_TRENDING]: ROUTING_KEYS.ANALYTICS_TRENDING,
43
+ [ROUTING_KEYS.ANALYTICS_COINS_TABLE]: ROUTING_KEYS.ANALYTICS_COINS_TABLE,
44
+ [ROUTING_KEYS.ANALYTICS_UPDATE_GLOBAL]: ROUTING_KEYS.ANALYTICS_UPDATE_GLOBAL,
45
+ [ROUTING_KEYS.ANALYTICS_UPDATE_TOTAL_MARKET_CHART]: ROUTING_KEYS.ANALYTICS_UPDATE_TOTAL_MARKET_CHART,
46
+ [ROUTING_KEYS.ANALYTICS_UPDATE_MARKET_CHART]: ROUTING_KEYS.ANALYTICS_UPDATE_MARKET_CHART,
47
+ [ROUTING_KEYS.ANALYTICS_UPDATE_DOMINANCE_CHART]: ROUTING_KEYS.ANALYTICS_UPDATE_DOMINANCE_CHART,
48
+ [ROUTING_KEYS.ANALYTICS_UPDATE_VOLUME_CHART]: ROUTING_KEYS.ANALYTICS_UPDATE_VOLUME_CHART,
49
+ [ROUTING_KEYS.ANALYTICS_UPDATE_TOP_VOLUME_LEADERS]: ROUTING_KEYS.ANALYTICS_UPDATE_TOP_VOLUME_LEADERS,
50
+ [ROUTING_KEYS.ANALYTICS_UPDATE_TRENDING]: ROUTING_KEYS.ANALYTICS_UPDATE_TRENDING,
51
+ [ROUTING_KEYS.ANALYTICS_UPDATE_COINS_TABLE]: ROUTING_KEYS.ANALYTICS_UPDATE_COINS_TABLE,
52
+ };
53
+ beforeEach(async () => {
54
+ jest.clearAllMocks();
55
+ // Создаем моки для всех зависимостей
56
+ clientProxy = {
57
+ connect: jest.fn().mockResolvedValue(undefined),
58
+ close: jest.fn().mockResolvedValue(undefined),
59
+ emit: jest.fn().mockReturnValue(of(undefined)),
60
+ send: jest.fn().mockReturnValue(of({})),
61
+ };
62
+ configService = {
63
+ get: jest.fn(),
64
+ };
65
+ loggerService = {
66
+ setContext: jest.fn(),
67
+ log: jest.fn(),
68
+ info: jest.fn(),
69
+ error: jest.fn(),
70
+ warn: jest.fn(),
71
+ };
72
+ // Настраиваем мок для ConfigService
73
+ configService.get.mockImplementation((key) => {
74
+ if (key === "rabbitmqSender") {
75
+ return mockSenderOptions;
76
+ }
77
+ return undefined;
78
+ });
79
+ // Настраиваем мок для createSenderConfig
80
+ mockCreateSenderConfig.mockReturnValue({
81
+ transport: {},
82
+ options: {},
83
+ routingKeys: mockRoutingKeys,
84
+ });
85
+ const module = await Test.createTestingModule({
86
+ providers: [
87
+ RabbitMQService,
88
+ {
89
+ provide: RABBITMQ_SENDER_SERVICE,
90
+ useValue: clientProxy,
91
+ },
92
+ {
93
+ provide: ConfigService,
94
+ useValue: configService,
95
+ },
96
+ {
97
+ provide: LoggerService,
98
+ useValue: loggerService,
99
+ },
100
+ ],
101
+ }).compile();
102
+ service = module.get(RabbitMQService);
103
+ });
104
+ describe("конструктор", () => {
105
+ it("должен инициализировать сервис с правильными зависимостями", () => {
106
+ expect(service).toBeDefined();
107
+ expect(configService.get).toHaveBeenCalledWith("rabbitmqSender");
108
+ expect(loggerService.setContext).toHaveBeenCalledWith("RabbitMQService");
109
+ expect(mockCreateSenderConfig).toHaveBeenCalledWith(mockSenderOptions);
110
+ });
111
+ it("должен вычислить конфигурацию динамически через createSenderConfig", () => {
112
+ expect(mockCreateSenderConfig).toHaveBeenCalledWith(mockSenderOptions);
113
+ expect(loggerService.log).toHaveBeenCalledWith(expect.stringContaining("RabbitMQ routing keys initialized"));
114
+ });
115
+ it("должен использовать routing keys из вычисленной конфигурации", () => {
116
+ const testData = { test: "data" };
117
+ service.fireAndForget(ROUTING_KEYS.TOKENS_FETCH_ALL, testData);
118
+ expect(clientProxy.emit).toHaveBeenCalledWith(ROUTING_KEYS.TOKENS_FETCH_ALL, testData);
119
+ });
120
+ it("должен правильно инициализировать все параметры конструктора", () => {
121
+ expect(service).toBeDefined();
122
+ expect(clientProxy).toBeDefined();
123
+ expect(configService).toBeDefined();
124
+ });
125
+ it("должен выбросить ошибку если senderOptions не найдены в конфигурации", () => {
126
+ // Создаем новый ConfigService который возвращает undefined для rabbitmqSender
127
+ const emptyConfigService = {
128
+ get: jest.fn().mockReturnValue(undefined),
129
+ };
130
+ // Ошибка выбрасывается в конструкторе, поэтому нужно использовать try-catch
131
+ expect(() => {
132
+ new RabbitMQService(clientProxy, emptyConfigService, loggerService);
133
+ }).toThrow("RabbitMQ sender options not found in configuration");
134
+ });
135
+ it("должен использовать client и configService параметры конструктора", async () => {
136
+ // Создаем новые моки для явной проверки использования параметров
137
+ const testClientProxy = {
138
+ connect: jest.fn().mockResolvedValue(undefined),
139
+ close: jest.fn().mockResolvedValue(undefined),
140
+ emit: jest.fn().mockReturnValue(of(undefined)),
141
+ send: jest.fn().mockReturnValue(of({})),
142
+ };
143
+ const testConfigService = {
144
+ get: jest.fn(),
145
+ };
146
+ const testLoggerService = {
147
+ setContext: jest.fn(),
148
+ log: jest.fn(),
149
+ info: jest.fn(),
150
+ error: jest.fn(),
151
+ warn: jest.fn(),
152
+ };
153
+ // Настраиваем мок для ConfigService
154
+ testConfigService.get.mockImplementation((key) => {
155
+ if (key === "rabbitmqSender") {
156
+ return mockSenderOptions;
157
+ }
158
+ return undefined;
159
+ });
160
+ // Настраиваем мок для createSenderConfig
161
+ mockCreateSenderConfig.mockReturnValue({
162
+ transport: {},
163
+ options: {},
164
+ routingKeys: mockRoutingKeys,
165
+ });
166
+ // Создаем новый экземпляр сервиса с тестовыми зависимостями
167
+ const testService = new RabbitMQService(testClientProxy, testConfigService, testLoggerService);
168
+ // Проверяем, что configService был использован в конструкторе
169
+ expect(testConfigService.get).toHaveBeenCalledWith("rabbitmqSender");
170
+ // Проверяем, что client используется через вызов onModuleInit
171
+ await testService.onModuleInit();
172
+ expect(testClientProxy.connect).toHaveBeenCalled();
173
+ // Проверяем, что client используется через вызов fireAndForget
174
+ const testData = { test: "data" };
175
+ testService.fireAndForget(ROUTING_KEYS.TOKENS_FETCH_ALL, testData);
176
+ expect(testClientProxy.emit).toHaveBeenCalledWith(ROUTING_KEYS.TOKENS_FETCH_ALL, testData);
177
+ // Проверяем, что client используется через вызов publish
178
+ const observable = of({ result: "success" });
179
+ testClientProxy.send.mockReturnValue(observable);
180
+ mockLastValueFrom.mockResolvedValue({ result: "success" });
181
+ await testService.publish(ROUTING_KEYS.TOKENS_FETCH_DETAILS_ETHEREUM, testData);
182
+ expect(testClientProxy.send).toHaveBeenCalled();
183
+ // Проверяем, что client используется через вызов onModuleDestroy
184
+ await testService.onModuleDestroy();
185
+ expect(testClientProxy.close).toHaveBeenCalled();
186
+ });
187
+ });
188
+ describe("onModuleInit", () => {
189
+ it("должен подключиться к RabbitMQ и залогировать сообщение", async () => {
190
+ clientProxy.connect.mockResolvedValue(undefined);
191
+ await service.onModuleInit();
192
+ expect(clientProxy.connect).toHaveBeenCalled();
193
+ expect(loggerService.log).toHaveBeenCalledWith("RabbitMQ connected");
194
+ });
195
+ it("должен передать ошибку при неудачном подключении", async () => {
196
+ const error = new Error("Connection failed");
197
+ clientProxy.connect.mockRejectedValue(error);
198
+ await expect(service.onModuleInit()).rejects.toThrow("Connection failed");
199
+ });
200
+ });
201
+ describe("onModuleDestroy", () => {
202
+ it("должен отключиться от RabbitMQ и залогировать сообщение", async () => {
203
+ clientProxy.close.mockResolvedValue(undefined);
204
+ await service.onModuleDestroy();
205
+ expect(clientProxy.close).toHaveBeenCalled();
206
+ expect(loggerService.log).toHaveBeenCalledWith("RabbitMQ disconnected");
207
+ });
208
+ it("должен передать ошибку при неудачном отключении", async () => {
209
+ const error = new Error("Disconnect failed");
210
+ clientProxy.close.mockRejectedValue(error);
211
+ await expect(service.onModuleDestroy()).rejects.toThrow("Disconnect failed");
212
+ });
213
+ });
214
+ describe("fireAndForget", () => {
215
+ it("должен отправить сообщение без ожидания ответа", () => {
216
+ const testData = { test: "data" };
217
+ const routingKey = ROUTING_KEYS.TOKENS_FETCH_ALL;
218
+ service.fireAndForget(routingKey, testData);
219
+ expect(loggerService.log).toHaveBeenCalledWith(`fireAndForget [routingKey=${routingKey}, data=${JSON.stringify(testData)}]`);
220
+ expect(clientProxy.emit).toHaveBeenCalledWith(routingKey, testData);
221
+ });
222
+ it("должен корректно обработать пустые данные", () => {
223
+ const testData = {};
224
+ const routingKey = ROUTING_KEYS.ANALYTICS_GLOBAL;
225
+ service.fireAndForget(routingKey, testData);
226
+ expect(loggerService.log).toHaveBeenCalledWith(`fireAndForget [routingKey=${routingKey}, data=${JSON.stringify(testData)}]`);
227
+ expect(clientProxy.emit).toHaveBeenCalledWith(routingKey, testData);
228
+ });
229
+ it("должен корректно обработать сложные объекты", () => {
230
+ const testData = {
231
+ nested: { value: 123 },
232
+ array: [1, 2, 3],
233
+ boolean: true,
234
+ };
235
+ const routingKey = ROUTING_KEYS.TOKENS_DEPLOY_ETHEREUM;
236
+ service.fireAndForget(routingKey, testData);
237
+ expect(loggerService.log).toHaveBeenCalledWith(`fireAndForget [routingKey=${routingKey}, data=${JSON.stringify(testData)}]`);
238
+ expect(clientProxy.emit).toHaveBeenCalledWith(routingKey, testData);
239
+ });
240
+ it("должен обработать ошибку отправки через subscribe", () => {
241
+ const testData = { test: "data" };
242
+ const routingKey = ROUTING_KEYS.TOKENS_FETCH_ALL;
243
+ const error = new Error("Emit failed");
244
+ clientProxy.emit.mockReturnValue(throwError(() => error));
245
+ service.fireAndForget(routingKey, testData);
246
+ expect(loggerService.log).toHaveBeenCalled();
247
+ expect(clientProxy.emit).toHaveBeenCalledWith(routingKey, testData);
248
+ });
249
+ });
250
+ describe("publish", () => {
251
+ it("должен отправить сообщение с correlationId и вернуть ответ", async () => {
252
+ const testData = { input: "test" };
253
+ const expectedResponse = { output: "response" };
254
+ const routingKey = ROUTING_KEYS.TOKENS_FETCH_DETAILS_ETHEREUM;
255
+ const observable = of(expectedResponse);
256
+ clientProxy.send.mockReturnValue(observable);
257
+ mockLastValueFrom.mockResolvedValue(expectedResponse);
258
+ const result = await service.publish(routingKey, testData);
259
+ expect(loggerService.log).toHaveBeenCalledWith(expect.stringContaining(`publish [routingKey=${routingKey}, correlationId=`));
260
+ expect(loggerService.log).toHaveBeenCalledWith(expect.stringContaining(`data=${JSON.stringify(testData)}]`));
261
+ expect(clientProxy.send).toHaveBeenCalledWith(routingKey, expect.objectContaining({
262
+ ...testData,
263
+ correlationId: expect.any(String),
264
+ correlationTimestamp: expect.any(Number),
265
+ }));
266
+ expect(mockLastValueFrom).toHaveBeenCalledWith(observable);
267
+ expect(result).toEqual(expectedResponse);
268
+ });
269
+ it("должен добавить correlationId и correlationTimestamp к сообщению", async () => {
270
+ const testData = { input: "test" };
271
+ const expectedResponse = { output: "response" };
272
+ const routingKey = ROUTING_KEYS.TOKENS_FETCH_DETAILS_NFT;
273
+ const observable = of(expectedResponse);
274
+ clientProxy.send.mockReturnValue(observable);
275
+ mockLastValueFrom.mockResolvedValue(expectedResponse);
276
+ await service.publish(routingKey, testData);
277
+ const sendCall = clientProxy.send.mock.calls[0];
278
+ const messageWithCorrelation = sendCall[1];
279
+ expect(messageWithCorrelation.correlationId).toBeDefined();
280
+ expect(typeof messageWithCorrelation.correlationId).toBe("string");
281
+ expect(messageWithCorrelation.correlationTimestamp).toBeDefined();
282
+ expect(typeof messageWithCorrelation.correlationTimestamp).toBe("number");
283
+ expect(messageWithCorrelation.input).toBe("test");
284
+ });
285
+ it("должен обработать необъектные данные, обернув их в объект", async () => {
286
+ const testData = "string data";
287
+ const expectedResponse = { output: "response" };
288
+ const routingKey = ROUTING_KEYS.ANALYTICS_GLOBAL;
289
+ const observable = of(expectedResponse);
290
+ clientProxy.send.mockReturnValue(observable);
291
+ mockLastValueFrom.mockResolvedValue(expectedResponse);
292
+ await service.publish(routingKey, testData);
293
+ const sendCall = clientProxy.send.mock.calls[0];
294
+ const messageWithCorrelation = sendCall[1];
295
+ expect(messageWithCorrelation.correlationId).toBeDefined();
296
+ expect(messageWithCorrelation.correlationTimestamp).toBeDefined();
297
+ expect(messageWithCorrelation.data).toBe("string data");
298
+ });
299
+ it("должен передать ошибку при неудачной отправке", async () => {
300
+ const testData = { input: "test" };
301
+ const routingKey = ROUTING_KEYS.TOKENS_FETCH_DETAILS_NFT;
302
+ const error = new Error("Send failed");
303
+ const observable = throwError(() => error);
304
+ clientProxy.send.mockReturnValue(observable);
305
+ mockLastValueFrom.mockRejectedValue(error);
306
+ await expect(service.publish(routingKey, testData)).rejects.toThrow("Send failed");
307
+ expect(loggerService.log).toHaveBeenCalledWith(expect.stringContaining(`publish [routingKey=${routingKey}`));
308
+ expect(clientProxy.send).toHaveBeenCalled();
309
+ });
310
+ it("должен работать с разными типами данных входа и выхода", async () => {
311
+ const testData = { id: 1, name: "test" };
312
+ const expectedResponse = {
313
+ success: true,
314
+ result: "processed",
315
+ };
316
+ const routingKey = ROUTING_KEYS.ANALYTICS_TRENDING;
317
+ const observable = of(expectedResponse);
318
+ clientProxy.send.mockReturnValue(observable);
319
+ mockLastValueFrom.mockResolvedValue(expectedResponse);
320
+ const result = await service.publish(routingKey, testData);
321
+ expect(result).toEqual(expectedResponse);
322
+ expect(result.success).toBe(true);
323
+ expect(result.result).toBe("processed");
324
+ });
325
+ });
326
+ describe("интеграция routing keys", () => {
327
+ it("должен использовать правильные routing keys для всех типов операций", () => {
328
+ const testData = { test: "data" };
329
+ // Тестируем все routing keys
330
+ Object.values(ROUTING_KEYS).forEach((routingKey) => {
331
+ service.fireAndForget(routingKey, testData);
332
+ expect(clientProxy.emit).toHaveBeenCalledWith(routingKey, testData);
333
+ });
334
+ expect(clientProxy.emit).toHaveBeenCalledTimes(Object.values(ROUTING_KEYS).length);
335
+ });
336
+ });
337
+ describe("динамическое вычисление конфигурации", () => {
338
+ it("должен вычислить конфигурацию динамически через createSenderConfig", () => {
339
+ expect(mockCreateSenderConfig).toHaveBeenCalledWith(mockSenderOptions);
340
+ expect(service).toBeDefined();
341
+ });
342
+ it("должен использовать вычисленные routing keys для отправки сообщений", () => {
343
+ const testData = { test: "data" };
344
+ service.fireAndForget(ROUTING_KEYS.TOKENS_FETCH_ALL, testData);
345
+ expect(clientProxy.emit).toHaveBeenCalledWith(ROUTING_KEYS.TOKENS_FETCH_ALL, testData);
346
+ });
347
+ });
348
+ });
349
+ //# sourceMappingURL=rabbitmq.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.service.spec.js","sourceRoot":"","sources":["../../../src/main/__tests__/rabbitmq.service.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { DynamicModule, Type } from "@nestjs/common";
2
+ import type RabbitMQSenderOptions from "../types/rabbitmq-sender-options.js";
3
+ export default class RabbitMQModule {
4
+ static forRootAsync(options: {
5
+ imports?: Type<unknown>[];
6
+ useFactory: (...args: unknown[]) => Promise<RabbitMQSenderOptions> | RabbitMQSenderOptions;
7
+ inject?: unknown[];
8
+ }): DynamicModule;
9
+ }
10
+ //# sourceMappingURL=rabbitmq.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.module.d.ts","sourceRoot":"","sources":["../../src/main/rabbitmq.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAOrE,OAAO,KAAK,qBAAqB,MAAM,mCAAmC,CAAC;AAK3E,MAAM,CAAC,OAAO,OAAO,cAAc;IAElC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE;QAC5B,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,qBAAqB,CAAC,GAAG,qBAAqB,CAAC;QAC3F,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;KACnB,GAAG,aAAa;CA6BjB"}
@@ -0,0 +1,51 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var RabbitMQModule_1;
8
+ import { Global, Module } from "@nestjs/common";
9
+ import { ConfigModule } from "@nestjs/config";
10
+ import { ClientsModule } from "@nestjs/microservices";
11
+ import { createSenderConfig } from "../config/factories.js";
12
+ import RabbitMQService from "../main/rabbitmq.service.js";
13
+ import { RABBITMQ_SENDER_SERVICE } from "../utils/injections.js";
14
+ // Глобальный модуль отправки сообщений через RabbitMQ на другие сервисы
15
+ let RabbitMQModule = RabbitMQModule_1 = class RabbitMQModule {
16
+ // Статический метод для настройки модуля с конфигурацией через forRootAsync
17
+ static forRootAsync(options) {
18
+ return {
19
+ module: RabbitMQModule_1,
20
+ imports: [
21
+ ConfigModule,
22
+ ...(options.imports || []),
23
+ ClientsModule.registerAsync([
24
+ {
25
+ name: RABBITMQ_SENDER_SERVICE,
26
+ imports: [ConfigModule, ...(options.imports || [])],
27
+ useFactory: async (...args) => {
28
+ // Получаем опции через useFactory
29
+ const moduleOptions = await options.useFactory(...args);
30
+ // Вычисляем конфигурацию sender
31
+ const rmq = createSenderConfig(moduleOptions);
32
+ return {
33
+ transport: rmq.transport,
34
+ options: rmq.options,
35
+ };
36
+ },
37
+ inject: options.inject || [],
38
+ },
39
+ ]),
40
+ ],
41
+ providers: [RabbitMQService],
42
+ exports: [RabbitMQService],
43
+ };
44
+ }
45
+ };
46
+ RabbitMQModule = RabbitMQModule_1 = __decorate([
47
+ Global(),
48
+ Module({})
49
+ ], RabbitMQModule);
50
+ export default RabbitMQModule;
51
+ //# sourceMappingURL=rabbitmq.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.module.js","sourceRoot":"","sources":["../../src/main/rabbitmq.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,EAAQ,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,eAAe,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAI/D,wEAAwE;AAGzD,IAAM,cAAc,sBAApB,MAAM,cAAc;IAClC,4EAA4E;IAC5E,MAAM,CAAC,YAAY,CAAC,OAInB;QACA,OAAO;YACN,MAAM,EAAE,gBAAc;YACtB,OAAO,EAAE;gBACR,YAAY;gBACZ,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC1B,aAAa,CAAC,aAAa,CAAC;oBAC3B;wBACC,IAAI,EAAE,uBAAuB;wBAC7B,OAAO,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;wBACnD,UAAU,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;4BACxC,kCAAkC;4BAClC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;4BACxD,gCAAgC;4BAChC,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;4BAE9C,OAAO;gCACN,SAAS,EAAE,GAAG,CAAC,SAAS;gCACxB,OAAO,EAAE,GAAG,CAAC,OAAO;6BACpB,CAAC;wBACH,CAAC;wBACD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;qBAC5B;iBACD,CAAC;aACF;YACD,SAAS,EAAE,CAAC,eAAe,CAAC;YAC5B,OAAO,EAAE,CAAC,eAAe,CAAC;SAC1B,CAAC;IACH,CAAC;CACD,CAAA;AAnCoB,cAAc;IAFlC,MAAM,EAAE;IACR,MAAM,CAAC,EAAE,CAAC;GACU,cAAc,CAmClC;eAnCoB,cAAc"}
@@ -0,0 +1,26 @@
1
+ import { LoggerService } from "@makebelieve21213-packages/logger";
2
+ import { OnModuleDestroy, OnModuleInit } from "@nestjs/common";
3
+ import { ConfigService } from "@nestjs/config";
4
+ import { ClientProxy } from "@nestjs/microservices";
5
+ import { ROUTING_KEYS } from "../types/routing-keys.js";
6
+ export default class RabbitMQService implements OnModuleInit, OnModuleDestroy {
7
+ private readonly client;
8
+ private readonly configService;
9
+ private readonly logger;
10
+ private readonly rk;
11
+ constructor(client: ClientProxy, configService: ConfigService, logger: LoggerService);
12
+ onModuleInit(): Promise<void>;
13
+ onModuleDestroy(): Promise<void>;
14
+ private addCorrelationId;
15
+ /**
16
+ * Отправляем сообщение по указанному routingKey используя fire-and-forget паттерн
17
+ * Для fire-and-forget не добавляем correlationId, так как идемпотентность не требуется
18
+ */
19
+ fireAndForget<I>(key: ROUTING_KEYS, data: I): void;
20
+ /**
21
+ * Отправляем сообщение по указанному routingKey и ждем ответ от получателя (request-response паттерн)
22
+ * Добавляем correlationId и correlationTimestamp для идемпотентности
23
+ */
24
+ publish<I, O>(key: ROUTING_KEYS, data: I): Promise<O>;
25
+ }
26
+ //# sourceMappingURL=rabbitmq.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.service.d.ts","sourceRoot":"","sources":["../../src/main/rabbitmq.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAsB,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAStD,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,YAAY,EAAE,eAAe;IAK3E,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANxB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAqC;gBAItC,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,aAAa;IAkBjC,YAAY;IAKZ,eAAe;IAMrB,OAAO,CAAC,gBAAgB;IAiBxB;;;OAGG;IACH,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAalD;;;OAGG;IACG,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAY3D"}
@@ -0,0 +1,100 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var RabbitMQService_1;
14
+ import { LoggerService } from "@makebelieve21213-packages/logger";
15
+ import { Inject, Injectable } from "@nestjs/common";
16
+ import { ConfigService } from "@nestjs/config";
17
+ import { ClientProxy } from "@nestjs/microservices";
18
+ import { lastValueFrom } from "rxjs";
19
+ import { createSenderConfig } from "../config/factories.js";
20
+ import { RABBITMQ_SENDER_SERVICE } from "../utils/injections.js";
21
+ import { v4 as uuidv4 } from "uuid";
22
+ // Сервис по отправке сообщений через RabbitMQ на другие сервисы
23
+ let RabbitMQService = RabbitMQService_1 = class RabbitMQService {
24
+ client;
25
+ configService;
26
+ logger;
27
+ rk;
28
+ constructor(client, configService, logger) {
29
+ this.client = client;
30
+ this.configService = configService;
31
+ this.logger = logger;
32
+ this.logger.setContext(RabbitMQService_1.name);
33
+ // Всегда вычисляем конфигурацию динамически из senderOptions
34
+ // Это гарантирует наличие routingKeys без необходимости регистрации в ConfigService
35
+ const senderOptions = this.configService.get("rabbitmqSender");
36
+ if (!senderOptions) {
37
+ throw new Error("RabbitMQ sender options not found in configuration");
38
+ }
39
+ const rmq = createSenderConfig(senderOptions);
40
+ this.rk = rmq.routingKeys;
41
+ this.logger.log(`RabbitMQ routing keys initialized: ${Object.keys(this.rk).length} keys`);
42
+ }
43
+ async onModuleInit() {
44
+ await this.client.connect();
45
+ this.logger.log("RabbitMQ connected");
46
+ }
47
+ async onModuleDestroy() {
48
+ await this.client.close();
49
+ this.logger.log("RabbitMQ disconnected");
50
+ }
51
+ // Добавляет correlationId и correlationTimestamp в сообщение для идемпотентности
52
+ addCorrelationId(data) {
53
+ if (data === null || typeof data !== "object") {
54
+ // Если данные не объект, оборачиваем в объект
55
+ return {
56
+ data,
57
+ correlationId: uuidv4(),
58
+ correlationTimestamp: Date.now(),
59
+ };
60
+ }
61
+ return {
62
+ ...data,
63
+ correlationId: uuidv4(),
64
+ correlationTimestamp: Date.now(),
65
+ };
66
+ }
67
+ /**
68
+ * Отправляем сообщение по указанному routingKey используя fire-and-forget паттерн
69
+ * Для fire-and-forget не добавляем correlationId, так как идемпотентность не требуется
70
+ */
71
+ fireAndForget(key, data) {
72
+ this.logger.log(`fireAndForget [routingKey=${this.rk[key]}, data=${JSON.stringify(data)}]`);
73
+ // Подписываемся на Observable для гарантии отправки и обработки ошибок
74
+ this.client.emit(this.rk[key], data).subscribe({
75
+ error: (error) => {
76
+ this.logger.error(`Ошибка отправки fire-and-forget сообщения [routingKey=${this.rk[key]}]: ${error}`);
77
+ },
78
+ });
79
+ }
80
+ /**
81
+ * Отправляем сообщение по указанному routingKey и ждем ответ от получателя (request-response паттерн)
82
+ * Добавляем correlationId и correlationTimestamp для идемпотентности
83
+ */
84
+ async publish(key, data) {
85
+ const messageWithCorrelation = this.addCorrelationId(data);
86
+ const routingKey = this.rk[key];
87
+ this.logger.log(`publish [routingKey=${routingKey}, correlationId=${messageWithCorrelation.correlationId}, data=${JSON.stringify(data)}]`);
88
+ const result = this.client.send(routingKey, messageWithCorrelation);
89
+ return (await lastValueFrom(result));
90
+ }
91
+ };
92
+ RabbitMQService = RabbitMQService_1 = __decorate([
93
+ Injectable(),
94
+ __param(0, Inject(RABBITMQ_SENDER_SERVICE)),
95
+ __metadata("design:paramtypes", [ClientProxy,
96
+ ConfigService,
97
+ LoggerService])
98
+ ], RabbitMQService);
99
+ export default RabbitMQService;
100
+ //# sourceMappingURL=rabbitmq.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.service.js","sourceRoot":"","sources":["../../src/main/rabbitmq.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Transport } from "@nestjs/microservices/enums/transport.enum.js";
2
+ export default interface RabbitMQConfigBase {
3
+ transport: Transport.RMQ;
4
+ options: {
5
+ urls: string[];
6
+ queue: string;
7
+ queueOptions: {
8
+ durable: boolean;
9
+ };
10
+ exchange: string;
11
+ exchangeType: string;
12
+ wildcards: boolean;
13
+ };
14
+ }
15
+ //# sourceMappingURL=base.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.config.d.ts","sourceRoot":"","sources":["../../src/types/base.config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4CAA4C,CAAC;AAG5E,MAAM,CAAC,OAAO,WAAW,kBAAkB;IAC1C,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC;IACzB,OAAO,EAAE;QACR,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE;YACb,OAAO,EAAE,OAAO,CAAC;SACjB,CAAC;QACF,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,OAAO,CAAC;KACnB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.config.js","sourceRoot":"","sources":["../../src/types/base.config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export default interface IdempotentMessage<T> {
2
+ id: string;
3
+ timestamp: number;
4
+ data: T;
5
+ }
6
+ //# sourceMappingURL=idempotent-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotent-message.d.ts","sourceRoot":"","sources":["../../src/types/idempotent-message.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,OAAO,WAAW,iBAAiB,CAAC,CAAC;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,CAAC,CAAC;CACR"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=idempotent-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotent-message.js","sourceRoot":"","sources":["../../src/types/idempotent-message.ts"],"names":[],"mappings":""}