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,83 @@
1
+ import { SdkRabbitmq } from '../src/components/SdkRabbitmq';
2
+ import { MessageCallback } from '../src/interfaces/IMessage';
3
+
4
+ async function testChatbotExchange(): Promise<void> {
5
+ console.log('🧪 Teste específico da exchange chatbot.whatsapp...\n');
6
+
7
+ let sdk: SdkRabbitmq | undefined;
8
+
9
+ try {
10
+ sdk = await SdkRabbitmq.getInstance();
11
+ console.log('✅ SDK inicializado\n');
12
+
13
+ let messageReceived = false;
14
+ const callback: MessageCallback = (payload: any, ack: () => void, nack: () => void) => {
15
+ console.log('\n🎉 MENSAGEM RECEBIDA NA EXCHANGE CHATBOT!');
16
+ console.log('📄 Payload:', JSON.stringify(payload, null, 2));
17
+ messageReceived = true;
18
+ ack();
19
+ };
20
+
21
+ // Usar exatamente a mesma configuração do teste original
22
+ console.log('👂 Configurando GreetingAgent...');
23
+ await sdk.subscribe(
24
+ 'chatbot.whatsapp',
25
+ 'queue-greeting',
26
+ 'phone.*',
27
+ callback
28
+ );
29
+
30
+ console.log('✅ GreetingAgent configurado');
31
+
32
+ // Aguardar tempo suficiente
33
+ console.log('\n⏳ Aguardando 5 segundos...');
34
+ await new Promise<void>(resolve => setTimeout(resolve, 5000));
35
+
36
+ // Enviar mensagem exatamente como no teste original
37
+ console.log('\n📤 Enviando mensagem para chatbot.whatsapp...');
38
+ const testPayload = {
39
+ phone: '5511999999999',
40
+ timestamp: Date.now(),
41
+ metadata: {
42
+ identification: 'initial',
43
+ senderAgent: 'TestSystem',
44
+ value: 'Mensagem inicial do WhatsApp'
45
+ }
46
+ };
47
+
48
+ const published = await sdk.publish('chatbot.whatsapp', 'phone.5511999999999', testPayload);
49
+ console.log('📊 Publicado:', published);
50
+
51
+ // Aguardar processamento
52
+ console.log('\n⏳ Aguardando processamento (10 segundos)...');
53
+ let waitTime = 0;
54
+ while (!messageReceived && waitTime < 10000) {
55
+ await new Promise<void>(resolve => setTimeout(resolve, 500));
56
+ waitTime += 500;
57
+ if (waitTime % 2000 === 0) {
58
+ console.log(`⏰ Aguardando... ${waitTime/1000}s`);
59
+ }
60
+ }
61
+
62
+ if (messageReceived) {
63
+ console.log('\n✅ SUCESSO! Exchange chatbot.whatsapp funciona');
64
+ } else {
65
+ console.log('\n❌ FALHA! Exchange chatbot.whatsapp não funciona');
66
+ }
67
+
68
+ console.log('\n🏁 Teste concluído');
69
+
70
+ } catch (error) {
71
+ console.error('❌ Erro:', error);
72
+ } finally {
73
+ if (sdk) {
74
+ await sdk.disconnect();
75
+ }
76
+ }
77
+ }
78
+
79
+ if (require.main === module) {
80
+ testChatbotExchange().catch(console.error);
81
+ }
82
+
83
+ export { testChatbotExchange };
@@ -0,0 +1,299 @@
1
+ const { SdkRabbitmq } = require('../dist/index');
2
+
3
+ // Memória global para controlar o fluxo
4
+ const globalMemory = {
5
+ flow: ['greeting', 'patientName', 'patientCPF', 'patientEmail'],
6
+ currentStep: {},
7
+ userData: {}
8
+ };
9
+
10
+ // Definição dos agentes
11
+ const GreetingAgent = {
12
+ routingKeyAgent: 'greeting',
13
+ name: 'GreetingAgent'
14
+ };
15
+
16
+ const PatientNameAgent = {
17
+ routingKeyAgent: 'patientName',
18
+ name: 'PatientNameAgent'
19
+ };
20
+
21
+ const PatientCPFAgent = {
22
+ routingKeyAgent: 'patientCPF',
23
+ name: 'PatientCPFAgent'
24
+ };
25
+
26
+ const PatientEmailAgent = {
27
+ routingKeyAgent: 'patientEmail',
28
+ name: 'PatientEmailAgent'
29
+ };
30
+
31
+ // Função para obter o próximo agente no fluxo
32
+ function getNextAgent(currentAgent) {
33
+ const currentIndex = globalMemory.flow.indexOf(currentAgent);
34
+ if (currentIndex >= 0 && currentIndex < globalMemory.flow.length - 1) {
35
+ return globalMemory.flow[currentIndex + 1];
36
+ }
37
+ return null;
38
+ }
39
+
40
+ // Função para marcar sucesso na memória global
41
+ function markStepAsSuccess(phone, step, value) {
42
+ if (!globalMemory.currentStep[phone]) {
43
+ globalMemory.currentStep[phone] = {};
44
+ }
45
+ if (!globalMemory.userData[phone]) {
46
+ globalMemory.userData[phone] = {};
47
+ }
48
+
49
+ globalMemory.currentStep[phone][step] = 'success';
50
+ globalMemory.userData[phone][step] = value;
51
+
52
+ console.log(`✅ Step ${step} marked as success for phone ${phone}`);
53
+ console.log(`📊 Global Memory:`, JSON.stringify(globalMemory, null, 2));
54
+ }
55
+
56
+ // Função para simular processamento de dados
57
+ function simulateDataProcessing(agentName, phone) {
58
+ const mockData = {
59
+ 'GreetingAgent': `Olá! Bem-vindo ao nosso sistema de atendimento. Telefone: ${phone}`,
60
+ 'PatientNameAgent': `João Silva`,
61
+ 'PatientCPFAgent': `123.456.789-00`,
62
+ 'PatientEmailAgent': `joao.silva@email.com`
63
+ };
64
+
65
+ return mockData[agentName] || `Dados processados por ${agentName}`;
66
+ }
67
+
68
+ // Classe base para os agentes
69
+ class BaseAgent {
70
+ constructor(config, sdk) {
71
+ this.config = config;
72
+ this.sdk = sdk;
73
+ this.name = config.name;
74
+ this.routingKeyAgent = config.routingKeyAgent;
75
+ }
76
+
77
+ async processMessage(payload, ack, nack) {
78
+ try {
79
+ console.log(`\n🤖 ${this.name} processando mensagem:`, payload);
80
+
81
+ const phone = payload.phone;
82
+ const processedValue = simulateDataProcessing(this.name, phone);
83
+
84
+ // Simular processamento
85
+ await new Promise(resolve => setTimeout(resolve, 1000));
86
+
87
+ // Marcar como sucesso na memória global
88
+ markStepAsSuccess(phone, this.routingKeyAgent, processedValue);
89
+
90
+ // Fazer unbind da routing key específica do telefone
91
+ const specificRoutingKey = `phone.${phone}`;
92
+ if (this.name !== 'GreetingAgent') {
93
+ try {
94
+ await this.sdk.unbind(`queue-${this.routingKeyAgent}`, 'chatbot.whatsapp', specificRoutingKey);
95
+ console.log(`🔓 ${this.name} fez unbind da routing key: ${specificRoutingKey}`);
96
+ } catch (error) {
97
+ console.log(`⚠️ Erro ao fazer unbind: ${error.message}`);
98
+ }
99
+ }
100
+
101
+ // Obter próximo agente
102
+ const nextAgentKey = getNextAgent(this.routingKeyAgent);
103
+
104
+ if (nextAgentKey) {
105
+ // Preparar payload para próximo agente
106
+ const nextPayload = {
107
+ phone: phone,
108
+ timestamp: Date.now(),
109
+ metadata: {
110
+ identification: this.routingKeyAgent,
111
+ senderAgent: this.name,
112
+ value: processedValue
113
+ }
114
+ };
115
+
116
+ console.log(`📤 ${this.name} enviando para próximo agente: ${nextAgentKey}`);
117
+
118
+ // Enviar para o próximo agente via exchange chatbot.agents
119
+ await this.sdk.publish('chatbot.agents', nextAgentKey, nextPayload);
120
+ } else {
121
+ console.log(`🏁 ${this.name} finalizou o fluxo para o telefone ${phone}`);
122
+
123
+ // Enviar resultado final via whatsapp.message.text
124
+ const finalPayload = {
125
+ phone: phone,
126
+ timestamp: Date.now(),
127
+ metadata: {
128
+ identification: 'flow_completed',
129
+ senderAgent: this.name,
130
+ value: 'Fluxo completo finalizado',
131
+ userData: globalMemory.userData[phone]
132
+ }
133
+ };
134
+
135
+ await this.sdk.publish('whatsapp.message.text', 'send', finalPayload);
136
+ }
137
+
138
+ ack();
139
+ } catch (error) {
140
+ console.error(`❌ Erro no ${this.name}:`, error);
141
+ nack();
142
+ }
143
+ }
144
+ }
145
+
146
+ // Implementação específica do GreetingAgent
147
+ class GreetingAgentImpl extends BaseAgent {
148
+ async start() {
149
+ console.log(`🚀 Iniciando ${this.name}...`);
150
+
151
+ // GreetingAgent escuta phone.* na exchange chatbot.whatsapp
152
+ await this.sdk.subscribe(
153
+ 'chatbot.whatsapp',
154
+ `queue-${this.routingKeyAgent}`,
155
+ 'phone.*',
156
+ this.processMessage.bind(this)
157
+ );
158
+
159
+ console.log(`👂 ${this.name} ouvindo na exchange: chatbot.whatsapp, routing key: phone.*`);
160
+ }
161
+ }
162
+
163
+ // Implementação dos outros agentes
164
+ class DynamicAgent extends BaseAgent {
165
+ async start() {
166
+ console.log(`🚀 Iniciando ${this.name}...`);
167
+
168
+ // Outros agentes escutam na exchange chatbot.agents
169
+ await this.sdk.subscribe(
170
+ 'chatbot.agents',
171
+ `queue-${this.routingKeyAgent}`,
172
+ this.routingKeyAgent,
173
+ async (payload, ack, nack) => {
174
+ // Fazer bind específico para o telefone do usuário
175
+ const phone = payload.phone;
176
+ const specificRoutingKey = `phone.${phone}`;
177
+
178
+ try {
179
+ await this.sdk.bind(`queue-${this.routingKeyAgent}`, 'chatbot.whatsapp', specificRoutingKey);
180
+ console.log(`🔒 ${this.name} fez bind para routing key: ${specificRoutingKey}`);
181
+
182
+ // Processar a mensagem
183
+ await this.processMessage(payload, ack, nack);
184
+ } catch (error) {
185
+ console.error(`❌ Erro no bind/processamento do ${this.name}:`, error);
186
+ nack();
187
+ }
188
+ }
189
+ );
190
+
191
+ console.log(`👂 ${this.name} ouvindo na exchange: chatbot.agents, routing key: ${this.routingKeyAgent}`);
192
+ }
193
+ }
194
+
195
+ // Função principal de teste
196
+ async function testDynamicRoutingFlow() {
197
+ console.log('🎯 Iniciando teste de fluxo de roteamento dinâmico...\n');
198
+
199
+ let sdk;
200
+
201
+ try {
202
+ // Inicializar SDK
203
+ sdk = await SdkRabbitmq.getInstance();
204
+ console.log('✅ SDK inicializado com sucesso\n');
205
+
206
+ // Criar exchanges topic
207
+ console.log('📡 Criando exchanges...');
208
+ // As exchanges serão criadas automaticamente pelo SDK quando necessário
209
+
210
+ // Configurar subscriber para monitoramento (whatsapp.message.text)
211
+ console.log('👂 Configurando subscriber de monitoramento...');
212
+ await sdk.subscribe(
213
+ 'whatsapp.message.text',
214
+ 'monitor-queue',
215
+ 'send',
216
+ (payload, ack, nack) => {
217
+ console.log('\n📱 MENSAGEM RECEBIDA NO MONITOR:');
218
+ console.log('📄 Payload:', JSON.stringify(payload, null, 2));
219
+ console.log('🕐 Timestamp:', new Date(payload.timestamp).toLocaleString());
220
+ ack();
221
+ }
222
+ );
223
+
224
+ // Inicializar agentes
225
+ console.log('\n🤖 Inicializando agentes...');
226
+
227
+ const greetingAgent = new GreetingAgentImpl(GreetingAgent, sdk);
228
+ await greetingAgent.start();
229
+
230
+ const patientNameAgent = new DynamicAgent(PatientNameAgent, sdk);
231
+ await patientNameAgent.start();
232
+
233
+ const patientCPFAgent = new DynamicAgent(PatientCPFAgent, sdk);
234
+ await patientCPFAgent.start();
235
+
236
+ const patientEmailAgent = new DynamicAgent(PatientEmailAgent, sdk);
237
+ await patientEmailAgent.start();
238
+
239
+ console.log('\n✅ Todos os agentes inicializados!\n');
240
+
241
+ // Aguardar um pouco para garantir que tudo está configurado
242
+ await new Promise(resolve => setTimeout(resolve, 2000));
243
+
244
+ // Simular chegada de mensagens de diferentes telefones
245
+ console.log('📞 Simulando chegada de mensagens...\n');
246
+
247
+ const testPhones = ['5511999999999', '5511888888888'];
248
+
249
+ for (const phone of testPhones) {
250
+ console.log(`\n🔥 Iniciando fluxo para telefone: ${phone}`);
251
+
252
+ const initialPayload = {
253
+ phone: phone,
254
+ timestamp: Date.now(),
255
+ metadata: {
256
+ identification: 'initial',
257
+ senderAgent: 'TestSystem',
258
+ value: 'Mensagem inicial do WhatsApp'
259
+ }
260
+ };
261
+
262
+ // Enviar mensagem inicial para GreetingAgent
263
+ await sdk.publish('chatbot.whatsapp', `phone.${phone}`, initialPayload);
264
+
265
+ // Aguardar um pouco entre os telefones
266
+ await new Promise(resolve => setTimeout(resolve, 3000));
267
+ }
268
+
269
+ // Aguardar processamento completo
270
+ console.log('\n⏳ Aguardando processamento completo...');
271
+ await new Promise(resolve => setTimeout(resolve, 15000));
272
+
273
+ console.log('\n🎉 Teste concluído!');
274
+ console.log('\n📊 Estado final da memória global:');
275
+ console.log(JSON.stringify(globalMemory, null, 2));
276
+
277
+ } catch (error) {
278
+ console.error('❌ Erro durante o teste:', error);
279
+ } finally {
280
+ if (sdk) {
281
+ console.log('\n🔌 Desconectando SDK...');
282
+ await sdk.disconnect();
283
+ }
284
+ }
285
+ }
286
+
287
+ // Executar teste se este arquivo for executado diretamente
288
+ if (require.main === module) {
289
+ testDynamicRoutingFlow().catch(console.error);
290
+ }
291
+
292
+ module.exports = {
293
+ testDynamicRoutingFlow,
294
+ GreetingAgent,
295
+ PatientNameAgent,
296
+ PatientCPFAgent,
297
+ PatientEmailAgent,
298
+ globalMemory
299
+ };