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.
- package/.eslintrc.js +23 -0
- package/.kiro/specs/sdk-rabbitmq/design.md +369 -0
- package/.kiro/specs/sdk-rabbitmq/requirements.md +97 -0
- package/.kiro/specs/sdk-rabbitmq/tasks.md +248 -0
- package/README.md +273 -5
- package/bun.lock +790 -0
- package/config.example.json +13 -0
- package/dist/components/ConfigurationManager.d.ts +35 -0
- package/dist/components/ConfigurationManager.d.ts.map +1 -0
- package/dist/components/ConfigurationManager.js +118 -0
- package/dist/components/ConfigurationManager.js.map +1 -0
- package/dist/components/ConnectionManager.d.ts +93 -0
- package/dist/components/ConnectionManager.d.ts.map +1 -0
- package/dist/components/ConnectionManager.js +349 -0
- package/dist/components/ConnectionManager.js.map +1 -0
- package/dist/components/DLQHandler.d.ts +81 -0
- package/dist/components/DLQHandler.d.ts.map +1 -0
- package/dist/components/DLQHandler.js +228 -0
- package/dist/components/DLQHandler.js.map +1 -0
- package/dist/components/Logger.d.ts +77 -0
- package/dist/components/Logger.d.ts.map +1 -0
- package/dist/components/Logger.js +193 -0
- package/dist/components/Logger.js.map +1 -0
- package/dist/components/MessagePublisher.d.ts +49 -0
- package/dist/components/MessagePublisher.d.ts.map +1 -0
- package/dist/components/MessagePublisher.js +158 -0
- package/dist/components/MessagePublisher.js.map +1 -0
- package/dist/components/MessageSubscriber.d.ts +108 -0
- package/dist/components/MessageSubscriber.d.ts.map +1 -0
- package/dist/components/MessageSubscriber.js +503 -0
- package/dist/components/MessageSubscriber.js.map +1 -0
- package/dist/components/ResourceCreator.d.ts +89 -0
- package/dist/components/ResourceCreator.d.ts.map +1 -0
- package/dist/components/ResourceCreator.js +352 -0
- package/dist/components/ResourceCreator.js.map +1 -0
- package/dist/components/SdkRabbitmq.d.ts +103 -0
- package/dist/components/SdkRabbitmq.d.ts.map +1 -0
- package/dist/components/SdkRabbitmq.js +364 -0
- package/dist/components/SdkRabbitmq.js.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +20 -0
- package/dist/components/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/IConfiguration.d.ts +35 -0
- package/dist/interfaces/IConfiguration.d.ts.map +1 -0
- package/dist/interfaces/IConfiguration.js +3 -0
- package/dist/interfaces/IConfiguration.js.map +1 -0
- package/dist/interfaces/IConnection.d.ts +21 -0
- package/dist/interfaces/IConnection.d.ts.map +1 -0
- package/dist/interfaces/IConnection.js +3 -0
- package/dist/interfaces/IConnection.js.map +1 -0
- package/dist/interfaces/IDLQ.d.ts +12 -0
- package/dist/interfaces/IDLQ.d.ts.map +1 -0
- package/dist/interfaces/IDLQ.js +3 -0
- package/dist/interfaces/IDLQ.js.map +1 -0
- package/dist/interfaces/IErrors.d.ts +33 -0
- package/dist/interfaces/IErrors.d.ts.map +1 -0
- package/dist/interfaces/IErrors.js +56 -0
- package/dist/interfaces/IErrors.js.map +1 -0
- package/dist/interfaces/ILogger.d.ts +14 -0
- package/dist/interfaces/ILogger.d.ts.map +1 -0
- package/dist/interfaces/ILogger.js +3 -0
- package/dist/interfaces/ILogger.js.map +1 -0
- package/dist/interfaces/IMessage.d.ts +52 -0
- package/dist/interfaces/IMessage.d.ts.map +1 -0
- package/dist/interfaces/IMessage.js +3 -0
- package/dist/interfaces/IMessage.js.map +1 -0
- package/dist/interfaces/IResource.d.ts +31 -0
- package/dist/interfaces/IResource.d.ts.map +1 -0
- package/dist/interfaces/IResource.js +3 -0
- package/dist/interfaces/IResource.js.map +1 -0
- package/dist/interfaces/ISdkRabbitmq.d.ts +17 -0
- package/dist/interfaces/ISdkRabbitmq.d.ts.map +1 -0
- package/dist/interfaces/ISdkRabbitmq.js +3 -0
- package/dist/interfaces/ISdkRabbitmq.js.map +1 -0
- package/dist/interfaces/index.d.ts +9 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +33 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/utils/configSchema.d.ts +8 -0
- package/dist/utils/configSchema.d.ts.map +1 -0
- package/dist/utils/configSchema.js +51 -0
- package/dist/utils/configSchema.js.map +1 -0
- package/docker-compose.yml +24 -0
- package/example.ts +65 -0
- package/examples/README-dynamic-routing.md +155 -0
- package/examples/bind-unbind-example.js +56 -0
- package/examples/test-chatbot-exchange.ts +83 -0
- package/examples/test-dynamic-routing-flow.js +299 -0
- package/examples/test-dynamic-routing-flow.ts +355 -0
- package/examples/test-no-disconnect.ts +0 -0
- package/examples/test-raw-rabbitmq.js +68 -0
- package/examples/test-same-channel.ts +81 -0
- package/examples/test-schedule-flow.ts +713 -0
- package/examples/test-simple-greeting.ts +66 -0
- package/examples/test-simple-schedule.ts +76 -0
- package/examples/test-wildcard.ts +364 -0
- package/jest.config.js +17 -0
- package/package.json +42 -4
- package/preinstall.js +1 -0
- package/prompts/test-dynamic-routing-flow.md +46 -0
- package/run.js +4 -0
- package/scripts/run-dynamic-routing-test.ts +31 -0
- package/src/.gitkeep +1 -0
- package/src/components/.gitkeep +1 -0
- package/src/components/ConfigurationManager.ts +104 -0
- package/src/components/ConnectionManager.ts +357 -0
- package/src/components/DLQHandler.ts +271 -0
- package/src/components/Logger.ts +224 -0
- package/src/components/MessagePublisher.ts +180 -0
- package/src/components/MessageSubscriber.ts +597 -0
- package/src/components/ResourceCreator.ts +411 -0
- package/src/components/SdkRabbitmq.ts +443 -0
- package/src/components/__tests__/ConfigurationManager.test.ts +357 -0
- package/src/components/__tests__/ConnectionManager.test.ts +387 -0
- package/src/components/__tests__/DLQHandler.test.ts +399 -0
- package/src/components/__tests__/Logger.test.ts +354 -0
- package/src/components/__tests__/MessagePublisher.test.ts +337 -0
- package/src/components/__tests__/MessageSubscriber.test.ts +542 -0
- package/src/components/__tests__/ResourceCreator.test.ts +465 -0
- package/src/components/__tests__/SdkRabbitmq.integration.test.ts +433 -0
- package/src/components/index.ts +8 -0
- package/src/index.ts +11 -0
- package/src/interfaces/.gitkeep +1 -0
- package/src/interfaces/IConfiguration.ts +38 -0
- package/src/interfaces/IConnection.ts +27 -0
- package/src/interfaces/IDLQ.ts +13 -0
- package/src/interfaces/IErrors.ts +53 -0
- package/src/interfaces/ILogger.ts +16 -0
- package/src/interfaces/IMessage.ts +65 -0
- package/src/interfaces/IResource.ts +35 -0
- package/src/interfaces/ISdkRabbitmq.ts +26 -0
- package/src/interfaces/index.ts +23 -0
- package/src/utils/.gitkeep +1 -0
- package/src/utils/configSchema.ts +58 -0
- 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 };
|