rabbitmq-sdk 0.0.1-security β†’ 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rabbitmq-sdk might be problematic. Click here for more details.

Files changed (140) hide show
  1. package/.eslintrc.js +23 -0
  2. package/.kiro/specs/sdk-rabbitmq/design.md +369 -0
  3. package/.kiro/specs/sdk-rabbitmq/requirements.md +97 -0
  4. package/.kiro/specs/sdk-rabbitmq/tasks.md +248 -0
  5. package/README.md +273 -5
  6. package/bun.lock +790 -0
  7. package/config.example.json +13 -0
  8. package/dist/components/ConfigurationManager.d.ts +35 -0
  9. package/dist/components/ConfigurationManager.d.ts.map +1 -0
  10. package/dist/components/ConfigurationManager.js +118 -0
  11. package/dist/components/ConfigurationManager.js.map +1 -0
  12. package/dist/components/ConnectionManager.d.ts +93 -0
  13. package/dist/components/ConnectionManager.d.ts.map +1 -0
  14. package/dist/components/ConnectionManager.js +349 -0
  15. package/dist/components/ConnectionManager.js.map +1 -0
  16. package/dist/components/DLQHandler.d.ts +81 -0
  17. package/dist/components/DLQHandler.d.ts.map +1 -0
  18. package/dist/components/DLQHandler.js +228 -0
  19. package/dist/components/DLQHandler.js.map +1 -0
  20. package/dist/components/Logger.d.ts +77 -0
  21. package/dist/components/Logger.d.ts.map +1 -0
  22. package/dist/components/Logger.js +193 -0
  23. package/dist/components/Logger.js.map +1 -0
  24. package/dist/components/MessagePublisher.d.ts +49 -0
  25. package/dist/components/MessagePublisher.d.ts.map +1 -0
  26. package/dist/components/MessagePublisher.js +158 -0
  27. package/dist/components/MessagePublisher.js.map +1 -0
  28. package/dist/components/MessageSubscriber.d.ts +108 -0
  29. package/dist/components/MessageSubscriber.d.ts.map +1 -0
  30. package/dist/components/MessageSubscriber.js +503 -0
  31. package/dist/components/MessageSubscriber.js.map +1 -0
  32. package/dist/components/ResourceCreator.d.ts +89 -0
  33. package/dist/components/ResourceCreator.d.ts.map +1 -0
  34. package/dist/components/ResourceCreator.js +352 -0
  35. package/dist/components/ResourceCreator.js.map +1 -0
  36. package/dist/components/SdkRabbitmq.d.ts +103 -0
  37. package/dist/components/SdkRabbitmq.d.ts.map +1 -0
  38. package/dist/components/SdkRabbitmq.js +364 -0
  39. package/dist/components/SdkRabbitmq.js.map +1 -0
  40. package/dist/components/index.d.ts +9 -0
  41. package/dist/components/index.d.ts.map +1 -0
  42. package/dist/components/index.js +20 -0
  43. package/dist/components/index.js.map +1 -0
  44. package/dist/index.d.ts +5 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +27 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/interfaces/IConfiguration.d.ts +35 -0
  49. package/dist/interfaces/IConfiguration.d.ts.map +1 -0
  50. package/dist/interfaces/IConfiguration.js +3 -0
  51. package/dist/interfaces/IConfiguration.js.map +1 -0
  52. package/dist/interfaces/IConnection.d.ts +21 -0
  53. package/dist/interfaces/IConnection.d.ts.map +1 -0
  54. package/dist/interfaces/IConnection.js +3 -0
  55. package/dist/interfaces/IConnection.js.map +1 -0
  56. package/dist/interfaces/IDLQ.d.ts +12 -0
  57. package/dist/interfaces/IDLQ.d.ts.map +1 -0
  58. package/dist/interfaces/IDLQ.js +3 -0
  59. package/dist/interfaces/IDLQ.js.map +1 -0
  60. package/dist/interfaces/IErrors.d.ts +33 -0
  61. package/dist/interfaces/IErrors.d.ts.map +1 -0
  62. package/dist/interfaces/IErrors.js +56 -0
  63. package/dist/interfaces/IErrors.js.map +1 -0
  64. package/dist/interfaces/ILogger.d.ts +14 -0
  65. package/dist/interfaces/ILogger.d.ts.map +1 -0
  66. package/dist/interfaces/ILogger.js +3 -0
  67. package/dist/interfaces/ILogger.js.map +1 -0
  68. package/dist/interfaces/IMessage.d.ts +52 -0
  69. package/dist/interfaces/IMessage.d.ts.map +1 -0
  70. package/dist/interfaces/IMessage.js +3 -0
  71. package/dist/interfaces/IMessage.js.map +1 -0
  72. package/dist/interfaces/IResource.d.ts +31 -0
  73. package/dist/interfaces/IResource.d.ts.map +1 -0
  74. package/dist/interfaces/IResource.js +3 -0
  75. package/dist/interfaces/IResource.js.map +1 -0
  76. package/dist/interfaces/ISdkRabbitmq.d.ts +17 -0
  77. package/dist/interfaces/ISdkRabbitmq.d.ts.map +1 -0
  78. package/dist/interfaces/ISdkRabbitmq.js +3 -0
  79. package/dist/interfaces/ISdkRabbitmq.js.map +1 -0
  80. package/dist/interfaces/index.d.ts +9 -0
  81. package/dist/interfaces/index.d.ts.map +1 -0
  82. package/dist/interfaces/index.js +33 -0
  83. package/dist/interfaces/index.js.map +1 -0
  84. package/dist/utils/configSchema.d.ts +8 -0
  85. package/dist/utils/configSchema.d.ts.map +1 -0
  86. package/dist/utils/configSchema.js +51 -0
  87. package/dist/utils/configSchema.js.map +1 -0
  88. package/docker-compose.yml +24 -0
  89. package/example.ts +65 -0
  90. package/examples/README-dynamic-routing.md +155 -0
  91. package/examples/bind-unbind-example.js +56 -0
  92. package/examples/test-chatbot-exchange.ts +83 -0
  93. package/examples/test-dynamic-routing-flow.js +299 -0
  94. package/examples/test-dynamic-routing-flow.ts +355 -0
  95. package/examples/test-no-disconnect.ts +0 -0
  96. package/examples/test-raw-rabbitmq.js +68 -0
  97. package/examples/test-same-channel.ts +81 -0
  98. package/examples/test-schedule-flow.ts +713 -0
  99. package/examples/test-simple-greeting.ts +66 -0
  100. package/examples/test-simple-schedule.ts +76 -0
  101. package/examples/test-wildcard.ts +364 -0
  102. package/jest.config.js +17 -0
  103. package/package.json +42 -4
  104. package/preinstall.js +1 -0
  105. package/prompts/test-dynamic-routing-flow.md +46 -0
  106. package/run.js +4 -0
  107. package/scripts/run-dynamic-routing-test.ts +31 -0
  108. package/src/.gitkeep +1 -0
  109. package/src/components/.gitkeep +1 -0
  110. package/src/components/ConfigurationManager.ts +104 -0
  111. package/src/components/ConnectionManager.ts +357 -0
  112. package/src/components/DLQHandler.ts +271 -0
  113. package/src/components/Logger.ts +224 -0
  114. package/src/components/MessagePublisher.ts +180 -0
  115. package/src/components/MessageSubscriber.ts +597 -0
  116. package/src/components/ResourceCreator.ts +411 -0
  117. package/src/components/SdkRabbitmq.ts +443 -0
  118. package/src/components/__tests__/ConfigurationManager.test.ts +357 -0
  119. package/src/components/__tests__/ConnectionManager.test.ts +387 -0
  120. package/src/components/__tests__/DLQHandler.test.ts +399 -0
  121. package/src/components/__tests__/Logger.test.ts +354 -0
  122. package/src/components/__tests__/MessagePublisher.test.ts +337 -0
  123. package/src/components/__tests__/MessageSubscriber.test.ts +542 -0
  124. package/src/components/__tests__/ResourceCreator.test.ts +465 -0
  125. package/src/components/__tests__/SdkRabbitmq.integration.test.ts +433 -0
  126. package/src/components/index.ts +8 -0
  127. package/src/index.ts +11 -0
  128. package/src/interfaces/.gitkeep +1 -0
  129. package/src/interfaces/IConfiguration.ts +38 -0
  130. package/src/interfaces/IConnection.ts +27 -0
  131. package/src/interfaces/IDLQ.ts +13 -0
  132. package/src/interfaces/IErrors.ts +53 -0
  133. package/src/interfaces/ILogger.ts +16 -0
  134. package/src/interfaces/IMessage.ts +65 -0
  135. package/src/interfaces/IResource.ts +35 -0
  136. package/src/interfaces/ISdkRabbitmq.ts +26 -0
  137. package/src/interfaces/index.ts +23 -0
  138. package/src/utils/.gitkeep +1 -0
  139. package/src/utils/configSchema.ts +58 -0
  140. package/tsconfig.json +34 -0
@@ -0,0 +1,355 @@
1
+ import { SdkRabbitmq } from '../src/components/SdkRabbitmq';
2
+ import { MessageCallback } from '../src/interfaces/IMessage';
3
+
4
+ // Interfaces para tipagem
5
+ interface AgentConfig {
6
+ routingKeyAgent: string;
7
+ name: string;
8
+ }
9
+
10
+ interface GlobalMemory {
11
+ flow: string[];
12
+ currentStep: Record<string, Record<string, string>>;
13
+ userData: Record<string, Record<string, any>>;
14
+ }
15
+
16
+ interface MessagePayload {
17
+ phone: string;
18
+ timestamp: number;
19
+ metadata: {
20
+ identification: string;
21
+ senderAgent: string;
22
+ value: string;
23
+ userData?: Record<string, any>;
24
+ };
25
+ }
26
+
27
+ // MemΓ³ria global para controlar o fluxo
28
+ const globalMemory: GlobalMemory = {
29
+ flow: ['greeting', 'patientName', 'patientCPF', 'patientEmail'],
30
+ currentStep: {},
31
+ userData: {}
32
+ };
33
+
34
+ // DefiniΓ§Γ£o dos agentes
35
+ const GreetingAgent: AgentConfig = {
36
+ routingKeyAgent: 'greeting',
37
+ name: 'GreetingAgent'
38
+ };
39
+
40
+ const PatientNameAgent: AgentConfig = {
41
+ routingKeyAgent: 'patientName',
42
+ name: 'PatientNameAgent'
43
+ };
44
+
45
+ const PatientCPFAgent: AgentConfig = {
46
+ routingKeyAgent: 'patientCPF',
47
+ name: 'PatientCPFAgent'
48
+ };
49
+
50
+ const PatientEmailAgent: AgentConfig = {
51
+ routingKeyAgent: 'patientEmail',
52
+ name: 'PatientEmailAgent'
53
+ };
54
+
55
+ // FunΓ§Γ£o para obter o prΓ³ximo agente no fluxo
56
+ function getNextAgent(currentAgent: string): string | null {
57
+ const currentIndex = globalMemory.flow.indexOf(currentAgent);
58
+ if (currentIndex >= 0 && currentIndex < globalMemory.flow.length - 1) {
59
+ return globalMemory.flow[currentIndex + 1];
60
+ }
61
+ return null;
62
+ }
63
+
64
+ // FunΓ§Γ£o para marcar sucesso na memΓ³ria global
65
+ function markStepAsSuccess(phone: string, step: string, value: any): void {
66
+ if (!globalMemory.currentStep[phone]) {
67
+ globalMemory.currentStep[phone] = {};
68
+ }
69
+ if (!globalMemory.userData[phone]) {
70
+ globalMemory.userData[phone] = {};
71
+ }
72
+
73
+ globalMemory.currentStep[phone][step] = 'success';
74
+ globalMemory.userData[phone][step] = value;
75
+
76
+ console.log(`βœ… Step ${step} marked as success for phone ${phone}`);
77
+ console.log(`πŸ“Š Global Memory:`, JSON.stringify(globalMemory, null, 2));
78
+ }
79
+
80
+ // FunΓ§Γ£o para simular processamento de dados
81
+ function simulateDataProcessing(agentName: string, phone: string): string {
82
+ const mockData: Record<string, string> = {
83
+ 'GreetingAgent': `OlΓ‘! Bem-vindo ao nosso sistema de atendimento. Telefone: ${phone}`,
84
+ 'PatientNameAgent': `JoΓ£o Silva`,
85
+ 'PatientCPFAgent': `123.456.789-00`,
86
+ 'PatientEmailAgent': `joao.silva@email.com`
87
+ };
88
+
89
+ return mockData[agentName] || `Dados processados por ${agentName}`;
90
+ }
91
+
92
+ // Classe base para os agentes
93
+ abstract class BaseAgent {
94
+ protected config: AgentConfig;
95
+ protected sdk: SdkRabbitmq;
96
+ protected name: string;
97
+ protected routingKeyAgent: string;
98
+
99
+ constructor(config: AgentConfig, sdk: SdkRabbitmq) {
100
+ this.config = config;
101
+ this.sdk = sdk;
102
+ this.name = config.name;
103
+ this.routingKeyAgent = config.routingKeyAgent;
104
+ }
105
+
106
+ protected async processMessage(payload: MessagePayload, ack: () => void, nack: () => void): Promise<void> {
107
+ try {
108
+ console.log(`\nπŸ€– ${this.name} processando mensagem:`, JSON.stringify(payload, null, 2));
109
+
110
+ const phone = payload.phone;
111
+ const processedValue = simulateDataProcessing(this.name, phone);
112
+
113
+ // Simular processamento
114
+ await new Promise(resolve => setTimeout(resolve, 1000));
115
+
116
+ // Marcar como sucesso na memΓ³ria global
117
+ markStepAsSuccess(phone, this.routingKeyAgent, processedValue);
118
+
119
+ // Fazer unbind da routing key especΓ­fica do telefone
120
+ const specificRoutingKey = `phone.${phone}`;
121
+ if (this.name !== 'GreetingAgent') {
122
+ try {
123
+ await this.sdk.unbind(`queue-${this.routingKeyAgent}`, 'chatbot.whatsapp', specificRoutingKey);
124
+ console.log(`πŸ”“ ${this.name} fez unbind da routing key: ${specificRoutingKey}`);
125
+ } catch (error) {
126
+ console.log(`⚠️ Erro ao fazer unbind: ${(error as Error).message}`);
127
+ }
128
+ }
129
+
130
+ // Obter prΓ³ximo agente
131
+ const nextAgentKey = getNextAgent(this.routingKeyAgent);
132
+
133
+ if (nextAgentKey) {
134
+ // Preparar payload para prΓ³ximo agente
135
+ const nextPayload: MessagePayload = {
136
+ phone: phone,
137
+ timestamp: Date.now(),
138
+ metadata: {
139
+ identification: this.routingKeyAgent,
140
+ senderAgent: this.name,
141
+ value: processedValue
142
+ }
143
+ };
144
+
145
+ console.log(`πŸ“€ ${this.name} enviando para prΓ³ximo agente: ${nextAgentKey}`);
146
+
147
+ // Enviar para o prΓ³ximo agente via exchange chatbot.agents
148
+ await this.sdk.publish('chatbot.agents', nextAgentKey, nextPayload);
149
+ } else {
150
+ console.log(`🏁 ${this.name} finalizou o fluxo para o telefone ${phone}`);
151
+
152
+ // Enviar resultado final via whatsapp.message.text
153
+ const finalPayload: MessagePayload = {
154
+ phone: phone,
155
+ timestamp: Date.now(),
156
+ metadata: {
157
+ identification: 'flow_completed',
158
+ senderAgent: this.name,
159
+ value: 'Fluxo completo finalizado',
160
+ userData: globalMemory.userData[phone]
161
+ }
162
+ };
163
+
164
+ await this.sdk.publish('whatsapp.message.text', 'send', finalPayload);
165
+ }
166
+
167
+ ack();
168
+ } catch (error) {
169
+ console.error(`❌ Erro no ${this.name}:`, error);
170
+ nack();
171
+ }
172
+ }
173
+
174
+ abstract start(): Promise<void>;
175
+ }
176
+
177
+ // ImplementaΓ§Γ£o especΓ­fica do GreetingAgent
178
+ class GreetingAgentImpl extends BaseAgent {
179
+ async start(): Promise<void> {
180
+ console.log(`πŸš€ Iniciando ${this.name}...`);
181
+
182
+ // GreetingAgent escuta phone.* na exchange chatbot.whatsapp
183
+ const callback: MessageCallback = (payload: MessagePayload, ack: () => void, nack: () => void) => {
184
+ console.log(`πŸ“¨ ${this.name} RECEBEU mensagem:`, JSON.stringify(payload, null, 2));
185
+ this.processMessage(payload, ack, nack);
186
+ };
187
+
188
+ await this.sdk.subscribe(
189
+ 'chatbot.whatsapp',
190
+ `queue-${this.routingKeyAgent}`,
191
+ 'phone.*',
192
+ callback
193
+ );
194
+
195
+ console.log(`πŸ‘‚ ${this.name} ouvindo na exchange: chatbot.whatsapp, routing key: phone.*`);
196
+ console.log(`πŸ“‹ Queue: queue-${this.routingKeyAgent}`);
197
+ }
198
+ }
199
+
200
+ // ImplementaΓ§Γ£o dos outros agentes
201
+ class DynamicAgent extends BaseAgent {
202
+ async start(): Promise<void> {
203
+ console.log(`πŸš€ Iniciando ${this.name}...`);
204
+
205
+ // Outros agentes escutam na exchange chatbot.agents
206
+ const callback: MessageCallback = async (payload: MessagePayload, ack: () => void, nack: () => void) => {
207
+ console.log(`πŸ“¨ ${this.name} RECEBEU mensagem:`, JSON.stringify(payload, null, 2));
208
+
209
+ // Fazer bind especΓ­fico para o telefone do usuΓ‘rio
210
+ const phone = payload.phone;
211
+ const specificRoutingKey = `phone.${phone}`;
212
+
213
+ try {
214
+ await this.sdk.bind(`queue-${this.routingKeyAgent}`, 'chatbot.whatsapp', specificRoutingKey);
215
+ console.log(`πŸ”’ ${this.name} fez bind para routing key: ${specificRoutingKey}`);
216
+
217
+ // Processar a mensagem
218
+ await this.processMessage(payload, ack, nack);
219
+ } catch (error) {
220
+ console.error(`❌ Erro no bind/processamento do ${this.name}:`, error);
221
+ nack();
222
+ }
223
+ };
224
+
225
+ await this.sdk.subscribe(
226
+ 'chatbot.agents',
227
+ `queue-${this.routingKeyAgent}`,
228
+ this.routingKeyAgent,
229
+ callback
230
+ );
231
+
232
+ console.log(`πŸ‘‚ ${this.name} ouvindo na exchange: chatbot.agents, routing key: ${this.routingKeyAgent}`);
233
+ }
234
+ }
235
+
236
+ // FunΓ§Γ£o principal de teste
237
+ export async function testDynamicRoutingFlow(): Promise<void> {
238
+ console.log('🎯 Iniciando teste de fluxo de roteamento dinÒmico...\n');
239
+
240
+ let sdk: SdkRabbitmq | undefined;
241
+
242
+ try {
243
+ // Inicializar SDK
244
+ sdk = await SdkRabbitmq.getInstance();
245
+ console.log('βœ… SDK inicializado com sucesso\n');
246
+
247
+ // Exchanges serΓ£o criadas automaticamente quando necessΓ‘rio
248
+ console.log('πŸ“‘ Exchanges serΓ£o criadas automaticamente...');
249
+
250
+ // Configurar subscriber para monitoramento (whatsapp.message.text)
251
+ console.log('πŸ‘‚ Configurando subscriber de monitoramento...');
252
+ const monitorCallback: MessageCallback = (payload: MessagePayload, ack: () => void, nack: () => void) => {
253
+ console.log('\nπŸ“± MENSAGEM RECEBIDA NO MONITOR:');
254
+ console.log('πŸ“„ Payload:', JSON.stringify(payload, null, 2));
255
+ console.log('πŸ• Timestamp:', new Date(payload.timestamp).toLocaleString());
256
+ ack();
257
+ };
258
+
259
+ await sdk.subscribe(
260
+ 'whatsapp.message.text',
261
+ 'monitor-queue',
262
+ 'send',
263
+ monitorCallback
264
+ );
265
+
266
+ // Inicializar agentes
267
+ console.log('\nπŸ€– Inicializando agentes...');
268
+
269
+ const greetingAgent = new GreetingAgentImpl(GreetingAgent, sdk);
270
+ await greetingAgent.start();
271
+
272
+ const patientNameAgent = new DynamicAgent(PatientNameAgent, sdk);
273
+ await patientNameAgent.start();
274
+
275
+ const patientCPFAgent = new DynamicAgent(PatientCPFAgent, sdk);
276
+ await patientCPFAgent.start();
277
+
278
+ const patientEmailAgent = new DynamicAgent(PatientEmailAgent, sdk);
279
+ await patientEmailAgent.start();
280
+
281
+ console.log('\nβœ… Todos os agentes inicializados!\n');
282
+
283
+ // Aguardar tempo suficiente para garantir que todos os subscribers estΓ£o ativos
284
+ console.log('⏳ Aguardando configuração completa dos agentes (8 segundos)...');
285
+ await new Promise<void>(resolve => setTimeout(resolve, 8000));
286
+
287
+ // Simular chegada de mensagens de diferentes telefones
288
+ console.log('πŸ“ž Simulando chegada de mensagens...\n');
289
+
290
+ const testPhones = ['5511999999999', '5511888888888'];
291
+
292
+ for (const phone of testPhones) {
293
+ console.log(`\nπŸ”₯ Iniciando fluxo para telefone: ${phone}`);
294
+
295
+ const initialPayload: MessagePayload = {
296
+ phone: phone,
297
+ timestamp: Date.now(),
298
+ metadata: {
299
+ identification: 'initial',
300
+ senderAgent: 'TestSystem',
301
+ value: 'Mensagem inicial do WhatsApp'
302
+ }
303
+ };
304
+
305
+ // Enviar mensagem inicial para GreetingAgent
306
+ console.log(`πŸ“€ Enviando mensagem para exchange: chatbot.whatsapp, routing key: phone.${phone}`);
307
+ console.log(`πŸ“„ Payload:`, JSON.stringify(initialPayload, null, 2));
308
+
309
+ const published = await sdk.publish('chatbot.whatsapp', `phone.${phone}`, initialPayload);
310
+ console.log(`πŸ“Š Mensagem publicada:`, published);
311
+
312
+ // Aguardar um pouco entre os telefones
313
+ await new Promise<void>(resolve => setTimeout(resolve, 3000));
314
+ }
315
+
316
+ // Aguardar processamento completo
317
+ console.log('\n⏳ Aguardando processamento completo...');
318
+ await new Promise<void>(resolve => setTimeout(resolve, 15000));
319
+
320
+ console.log('\nπŸŽ‰ Teste concluΓ­do!');
321
+ console.log('\nπŸ“Š Estado final da memΓ³ria global:');
322
+ console.log(JSON.stringify(globalMemory, null, 2));
323
+
324
+ } catch (error) {
325
+ console.error('❌ Erro durante o teste:', error);
326
+ } finally {
327
+ if (sdk) {
328
+ console.log('\nπŸ”Œ Desconectando SDK...');
329
+ await sdk.disconnect();
330
+ }
331
+ }
332
+ }
333
+
334
+ // Executar teste se este arquivo for executado diretamente
335
+ if (require.main === module) {
336
+ testDynamicRoutingFlow().catch(console.error);
337
+ }
338
+
339
+ // ExportaΓ§Γ΅es para uso em outros mΓ³dulos
340
+ export {
341
+ GreetingAgent,
342
+ PatientNameAgent,
343
+ PatientCPFAgent,
344
+ PatientEmailAgent,
345
+ globalMemory,
346
+ BaseAgent,
347
+ GreetingAgentImpl,
348
+ DynamicAgent
349
+ };
350
+
351
+ export type {
352
+ AgentConfig,
353
+ GlobalMemory,
354
+ MessagePayload
355
+ };
File without changes
@@ -0,0 +1,68 @@
1
+ const amqp = require('amqplib');
2
+
3
+ async function testRawRabbitMQ() {
4
+ console.log('πŸ§ͺ Teste direto com amqplib...\n');
5
+
6
+ let connection;
7
+ let channel;
8
+
9
+ try {
10
+ // Conectar
11
+ console.log('πŸ”Œ Conectando...');
12
+ connection = await amqp.connect('amqp://localhost:5677');
13
+ channel = await connection.createChannel();
14
+ console.log('βœ… Conectado\n');
15
+
16
+ // Criar exchange e queue
17
+ console.log('πŸ“‘ Criando exchange e queue...');
18
+ await channel.assertExchange('test.exchange', 'topic', { durable: true });
19
+ const queueResult = await channel.assertQueue('test.queue', { durable: true });
20
+ await channel.bindQueue('test.queue', 'test.exchange', 'phone.*');
21
+ console.log('βœ… Exchange e queue criados\n');
22
+
23
+ // Configurar consumer
24
+ console.log('πŸ‘‚ Configurando consumer...');
25
+ await channel.consume('test.queue', (message) => {
26
+ if (message) {
27
+ console.log('\nπŸŽ‰ MENSAGEM RECEBIDA!');
28
+ console.log('πŸ“„ Content:', message.content.toString());
29
+ console.log('🏷️ Routing Key:', message.fields.routingKey);
30
+ console.log('πŸ“‘ Exchange:', message.fields.exchange);
31
+ channel.ack(message);
32
+ }
33
+ });
34
+ console.log('βœ… Consumer configurado\n');
35
+
36
+ // Aguardar um pouco
37
+ console.log('⏳ Aguardando 2 segundos...');
38
+ await new Promise(resolve => setTimeout(resolve, 2000));
39
+
40
+ // Enviar mensagem
41
+ console.log('πŸ“€ Enviando mensagem...');
42
+ const payload = JSON.stringify({
43
+ phone: '5511999999999',
44
+ message: 'Teste direto'
45
+ });
46
+
47
+ const published = channel.publish('test.exchange', 'phone.5511999999999', Buffer.from(payload));
48
+ console.log('πŸ“Š Publicado:', published);
49
+
50
+ // Aguardar processamento
51
+ console.log('\n⏳ Aguardando processamento...');
52
+ await new Promise(resolve => setTimeout(resolve, 5000));
53
+
54
+ console.log('\n🏁 Teste concluído');
55
+
56
+ } catch (error) {
57
+ console.error('❌ Erro:', error);
58
+ } finally {
59
+ if (channel) {
60
+ await channel.close();
61
+ }
62
+ if (connection) {
63
+ await connection.close();
64
+ }
65
+ }
66
+ }
67
+
68
+ testRawRabbitMQ().catch(console.error);
@@ -0,0 +1,81 @@
1
+ import { SdkRabbitmq } from '../src/components/SdkRabbitmq';
2
+ import { MessageCallback } from '../src/interfaces/IMessage';
3
+
4
+ async function testSameChannel(): Promise<void> {
5
+ console.log('πŸ§ͺ Teste com mesmo channel...\n');
6
+
7
+ let sdk: SdkRabbitmq | undefined;
8
+
9
+ try {
10
+ // Inicializar SDK
11
+ sdk = await SdkRabbitmq.getInstance();
12
+ console.log('βœ… SDK inicializado\n');
13
+
14
+ // Configurar subscriber PRIMEIRO
15
+ console.log('πŸ‘‚ Configurando subscriber...');
16
+
17
+ let messageReceived = false;
18
+ const callback: MessageCallback = (payload: any, ack: () => void, nack: () => void) => {
19
+ console.log('\nπŸŽ‰ MENSAGEM RECEBIDA NO CALLBACK!');
20
+ console.log('πŸ“„ Payload:', JSON.stringify(payload, null, 2));
21
+ messageReceived = true;
22
+ ack();
23
+ };
24
+
25
+ await sdk.subscribe(
26
+ 'test.same.channel',
27
+ 'same-channel-queue',
28
+ 'test.*',
29
+ callback
30
+ );
31
+
32
+ console.log('βœ… Subscriber configurado');
33
+
34
+ // Aguardar mais tempo para garantir que o subscriber estΓ‘ ativo
35
+ console.log('\n⏳ Aguardando 5 segundos para subscriber ficar ativo...');
36
+ await new Promise<void>(resolve => setTimeout(resolve, 5000));
37
+
38
+ // Enviar mensagem DEPOIS
39
+ console.log('\nπŸ“€ Enviando mensagem...');
40
+ const testPayload = {
41
+ test: 'same-channel',
42
+ timestamp: Date.now()
43
+ };
44
+
45
+ const published = await sdk.publish('test.same.channel', 'test.message', testPayload);
46
+ console.log('πŸ“Š Publicado:', published);
47
+
48
+ // Aguardar processamento com timeout
49
+ console.log('\n⏳ Aguardando processamento (10 segundos)...');
50
+ let waitTime = 0;
51
+ while (!messageReceived && waitTime < 10000) {
52
+ await new Promise<void>(resolve => setTimeout(resolve, 500));
53
+ waitTime += 500;
54
+ if (waitTime % 2000 === 0) {
55
+ console.log(`⏰ Aguardando... ${waitTime/1000}s`);
56
+ }
57
+ }
58
+
59
+ if (messageReceived) {
60
+ console.log('\nβœ… SUCESSO! Mensagem foi recebida');
61
+ } else {
62
+ console.log('\n❌ FALHA! Mensagem não foi recebida');
63
+ }
64
+
65
+ console.log('\n🏁 Teste concluído');
66
+
67
+ } catch (error) {
68
+ console.error('❌ Erro:', error);
69
+ } finally {
70
+ if (sdk) {
71
+ console.log('\nπŸ”Œ Desconectando...');
72
+ await sdk.disconnect();
73
+ }
74
+ }
75
+ }
76
+
77
+ if (require.main === module) {
78
+ testSameChannel().catch(console.error);
79
+ }
80
+
81
+ export { testSameChannel };