@heavybit/pendoadmin-shared-lib 1.1.5 → 1.1.6
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.
|
@@ -56,6 +56,8 @@ export declare const EVENTS: {
|
|
|
56
56
|
readonly AI_COMPLETION_SUCCESS: "ai.completion.success";
|
|
57
57
|
readonly AI_COMPLETION_FAILED: "ai.completion.failed";
|
|
58
58
|
readonly AI_ANOMALY_DETECTED: "ai.anomaly.detected";
|
|
59
|
+
readonly AI_RPC_REQUEST: "ai.rpc.request";
|
|
60
|
+
readonly AI_PROVIDER_FALLBACK: "ai.provider.fallback";
|
|
59
61
|
readonly GATEWAY_REQUEST_COMPLETED: "gateway.request.completed";
|
|
60
62
|
readonly GATEWAY_REQUEST_ERROR: "gateway.request.error";
|
|
61
63
|
};
|
|
@@ -63,6 +65,10 @@ export declare const EXCHANGES: {
|
|
|
63
65
|
readonly EVENTS: "pendoadmin.events";
|
|
64
66
|
readonly COMMANDS: "pendoadmin.commands";
|
|
65
67
|
};
|
|
68
|
+
/** RPC queue names for direct service-to-service calls */
|
|
69
|
+
export declare const RPC_QUEUES: {
|
|
70
|
+
readonly AI_REQUESTS: "ai.rpc.requests";
|
|
71
|
+
};
|
|
66
72
|
export declare class RabbitMQClient {
|
|
67
73
|
private connection;
|
|
68
74
|
private channel;
|
|
@@ -73,4 +79,75 @@ export declare class RabbitMQClient {
|
|
|
73
79
|
subscribe(queueName: string, routingKeys: string | string[], handler: (data: Record<string, unknown>, routingKey: string) => Promise<void>, exchange?: string): Promise<void>;
|
|
74
80
|
close(): Promise<void>;
|
|
75
81
|
}
|
|
82
|
+
export type RPCHandler = (payload: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
83
|
+
export declare class RabbitMQRPCClient {
|
|
84
|
+
private readonly url;
|
|
85
|
+
private connection;
|
|
86
|
+
private channel;
|
|
87
|
+
private callbackQueue;
|
|
88
|
+
private pending;
|
|
89
|
+
private isConnected;
|
|
90
|
+
constructor(url: string);
|
|
91
|
+
connect(): Promise<void>;
|
|
92
|
+
call(queueName: string, payload: Record<string, unknown>, timeoutMs?: number): Promise<Record<string, unknown>>;
|
|
93
|
+
close(): Promise<void>;
|
|
94
|
+
}
|
|
95
|
+
export declare class RabbitMQRPCServer {
|
|
96
|
+
private readonly url;
|
|
97
|
+
private readonly queueName;
|
|
98
|
+
private connection;
|
|
99
|
+
private channel;
|
|
100
|
+
private isConnected;
|
|
101
|
+
constructor(url: string, queueName: string);
|
|
102
|
+
connect(): Promise<void>;
|
|
103
|
+
startConsuming(handler: RPCHandler): Promise<void>;
|
|
104
|
+
close(): Promise<void>;
|
|
105
|
+
}
|
|
106
|
+
export type AiRpcAction = 'complete' | 'chat.oneshot' | 'chat.message' | 'providers.list' | 'providers.resolve-chain';
|
|
107
|
+
export interface AiRpcRequest {
|
|
108
|
+
action: AiRpcAction;
|
|
109
|
+
promptSlug?: string;
|
|
110
|
+
userMessage?: string;
|
|
111
|
+
variables?: Record<string, string>;
|
|
112
|
+
providerId?: string;
|
|
113
|
+
model?: string;
|
|
114
|
+
companyId?: string;
|
|
115
|
+
userId?: string;
|
|
116
|
+
conversationId?: string;
|
|
117
|
+
messages?: Array<{
|
|
118
|
+
role: 'system' | 'user' | 'assistant';
|
|
119
|
+
content: string;
|
|
120
|
+
}>;
|
|
121
|
+
temperature?: number;
|
|
122
|
+
maxTokens?: number;
|
|
123
|
+
}
|
|
124
|
+
export interface AiRpcResponse {
|
|
125
|
+
success: boolean;
|
|
126
|
+
data?: unknown;
|
|
127
|
+
error?: string;
|
|
128
|
+
}
|
|
129
|
+
export declare class AiRpcClient {
|
|
130
|
+
private rpcClient;
|
|
131
|
+
constructor(amqpUrl: string);
|
|
132
|
+
connect(): Promise<void>;
|
|
133
|
+
call(request: AiRpcRequest, timeoutMs?: number): Promise<AiRpcResponse>;
|
|
134
|
+
oneShot(promptSlug: string, userMessage: string, options?: {
|
|
135
|
+
variables?: Record<string, string>;
|
|
136
|
+
companyId?: string;
|
|
137
|
+
userId?: string;
|
|
138
|
+
providerId?: string;
|
|
139
|
+
model?: string;
|
|
140
|
+
}): Promise<AiRpcResponse>;
|
|
141
|
+
complete(messages: Array<{
|
|
142
|
+
role: 'system' | 'user' | 'assistant';
|
|
143
|
+
content: string;
|
|
144
|
+
}>, options?: {
|
|
145
|
+
temperature?: number;
|
|
146
|
+
maxTokens?: number;
|
|
147
|
+
providerId?: string;
|
|
148
|
+
model?: string;
|
|
149
|
+
}): Promise<AiRpcResponse>;
|
|
150
|
+
listProviders(): Promise<AiRpcResponse>;
|
|
151
|
+
close(): Promise<void>;
|
|
152
|
+
}
|
|
76
153
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"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"}
|
package/dist/messaging/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import amqplib from 'amqplib';
|
|
2
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
3
|
import { createLogger } from '../logging/index.js';
|
|
3
4
|
const logger = createLogger('rabbitmq');
|
|
4
5
|
// ── Event Type Constants ──────────────────────────────
|
|
@@ -69,6 +70,8 @@ export const EVENTS = {
|
|
|
69
70
|
AI_COMPLETION_SUCCESS: 'ai.completion.success',
|
|
70
71
|
AI_COMPLETION_FAILED: 'ai.completion.failed',
|
|
71
72
|
AI_ANOMALY_DETECTED: 'ai.anomaly.detected',
|
|
73
|
+
AI_RPC_REQUEST: 'ai.rpc.request',
|
|
74
|
+
AI_PROVIDER_FALLBACK: 'ai.provider.fallback',
|
|
72
75
|
// Gateway events
|
|
73
76
|
GATEWAY_REQUEST_COMPLETED: 'gateway.request.completed',
|
|
74
77
|
GATEWAY_REQUEST_ERROR: 'gateway.request.error',
|
|
@@ -77,6 +80,10 @@ export const EXCHANGES = {
|
|
|
77
80
|
EVENTS: 'pendoadmin.events',
|
|
78
81
|
COMMANDS: 'pendoadmin.commands',
|
|
79
82
|
};
|
|
83
|
+
/** RPC queue names for direct service-to-service calls */
|
|
84
|
+
export const RPC_QUEUES = {
|
|
85
|
+
AI_REQUESTS: 'ai.rpc.requests',
|
|
86
|
+
};
|
|
80
87
|
// ── RabbitMQ Client ───────────────────────────────────
|
|
81
88
|
export class RabbitMQClient {
|
|
82
89
|
connection = null;
|
|
@@ -149,4 +156,168 @@ export class RabbitMQClient {
|
|
|
149
156
|
await this.connection?.close();
|
|
150
157
|
}
|
|
151
158
|
}
|
|
159
|
+
// ── RabbitMQ RPC Client ───────────────────────────────
|
|
160
|
+
// Sends RPC requests and waits for responses via an exclusive callback queue.
|
|
161
|
+
export class RabbitMQRPCClient {
|
|
162
|
+
url;
|
|
163
|
+
connection = null;
|
|
164
|
+
channel = null;
|
|
165
|
+
callbackQueue = null;
|
|
166
|
+
pending = new Map();
|
|
167
|
+
isConnected = false;
|
|
168
|
+
constructor(url) {
|
|
169
|
+
this.url = url;
|
|
170
|
+
}
|
|
171
|
+
async connect() {
|
|
172
|
+
this.connection = await amqplib.connect(this.url);
|
|
173
|
+
this.channel = await this.connection.createChannel();
|
|
174
|
+
const q = await this.channel.assertQueue('', { exclusive: true, autoDelete: true });
|
|
175
|
+
this.callbackQueue = q.queue;
|
|
176
|
+
this.channel.consume(this.callbackQueue, (msg) => {
|
|
177
|
+
if (!msg)
|
|
178
|
+
return;
|
|
179
|
+
const correlationId = msg.properties.correlationId;
|
|
180
|
+
const entry = this.pending.get(correlationId);
|
|
181
|
+
if (entry) {
|
|
182
|
+
clearTimeout(entry.timer);
|
|
183
|
+
this.pending.delete(correlationId);
|
|
184
|
+
try {
|
|
185
|
+
const response = JSON.parse(msg.content.toString());
|
|
186
|
+
entry.resolve(response);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
entry.reject(new Error('Failed to parse RPC response'));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
this.channel.ack(msg);
|
|
193
|
+
}, { noAck: false });
|
|
194
|
+
this.isConnected = true;
|
|
195
|
+
logger.info('RPC client connected', { callbackQueue: this.callbackQueue });
|
|
196
|
+
this.connection.on('error', (err) => {
|
|
197
|
+
logger.error('RPC client connection error', { error: err.message });
|
|
198
|
+
this.isConnected = false;
|
|
199
|
+
});
|
|
200
|
+
this.connection.on('close', () => {
|
|
201
|
+
logger.warn('RPC client connection closed');
|
|
202
|
+
this.isConnected = false;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
async call(queueName, payload, timeoutMs = 30000) {
|
|
206
|
+
if (!this.isConnected || !this.channel || !this.callbackQueue) {
|
|
207
|
+
throw new Error('RPC client not connected');
|
|
208
|
+
}
|
|
209
|
+
const correlationId = uuidv4();
|
|
210
|
+
return new Promise((resolve, reject) => {
|
|
211
|
+
const timer = setTimeout(() => {
|
|
212
|
+
this.pending.delete(correlationId);
|
|
213
|
+
reject(new Error(`RPC timeout after ${timeoutMs}ms for queue=${queueName}`));
|
|
214
|
+
}, timeoutMs);
|
|
215
|
+
this.pending.set(correlationId, { resolve, reject, timer });
|
|
216
|
+
this.channel.sendToQueue(queueName, Buffer.from(JSON.stringify(payload)), {
|
|
217
|
+
correlationId,
|
|
218
|
+
replyTo: this.callbackQueue,
|
|
219
|
+
persistent: true,
|
|
220
|
+
contentType: 'application/json',
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
async close() {
|
|
225
|
+
for (const [, entry] of this.pending) {
|
|
226
|
+
clearTimeout(entry.timer);
|
|
227
|
+
entry.reject(new Error('RPC client closing'));
|
|
228
|
+
}
|
|
229
|
+
this.pending.clear();
|
|
230
|
+
await this.channel?.close();
|
|
231
|
+
await this.connection?.close();
|
|
232
|
+
this.isConnected = false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// ── RabbitMQ RPC Server ───────────────────────────────
|
|
236
|
+
// Listens on a durable queue and dispatches to a handler, replying via correlationId.
|
|
237
|
+
export class RabbitMQRPCServer {
|
|
238
|
+
url;
|
|
239
|
+
queueName;
|
|
240
|
+
connection = null;
|
|
241
|
+
channel = null;
|
|
242
|
+
isConnected = false;
|
|
243
|
+
constructor(url, queueName) {
|
|
244
|
+
this.url = url;
|
|
245
|
+
this.queueName = queueName;
|
|
246
|
+
}
|
|
247
|
+
async connect() {
|
|
248
|
+
this.connection = await amqplib.connect(this.url);
|
|
249
|
+
this.channel = await this.connection.createChannel();
|
|
250
|
+
await this.channel.prefetch(5);
|
|
251
|
+
await this.channel.assertQueue(this.queueName, { durable: true, autoDelete: false });
|
|
252
|
+
this.isConnected = true;
|
|
253
|
+
logger.info('RPC server connected', { queue: this.queueName });
|
|
254
|
+
this.connection.on('error', (err) => {
|
|
255
|
+
logger.error('RPC server connection error', { error: err.message });
|
|
256
|
+
this.isConnected = false;
|
|
257
|
+
});
|
|
258
|
+
this.connection.on('close', () => {
|
|
259
|
+
logger.warn('RPC server connection closed, reconnecting in 5s...');
|
|
260
|
+
this.isConnected = false;
|
|
261
|
+
setTimeout(() => this.connect(), 5000);
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
async startConsuming(handler) {
|
|
265
|
+
if (!this.isConnected || !this.channel) {
|
|
266
|
+
throw new Error('RPC server not connected');
|
|
267
|
+
}
|
|
268
|
+
await this.channel.consume(this.queueName, async (msg) => {
|
|
269
|
+
if (!msg)
|
|
270
|
+
return;
|
|
271
|
+
const correlationId = msg.properties.correlationId;
|
|
272
|
+
const replyTo = msg.properties.replyTo;
|
|
273
|
+
try {
|
|
274
|
+
const payload = JSON.parse(msg.content.toString());
|
|
275
|
+
logger.info('RPC request received', { queue: this.queueName, correlationId });
|
|
276
|
+
const response = await handler(payload);
|
|
277
|
+
if (replyTo && correlationId) {
|
|
278
|
+
this.channel.sendToQueue(replyTo, Buffer.from(JSON.stringify(response)), { correlationId, contentType: 'application/json', persistent: true });
|
|
279
|
+
}
|
|
280
|
+
this.channel.ack(msg);
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
logger.error('RPC handler error', { queue: this.queueName, error: error.message });
|
|
284
|
+
if (replyTo && correlationId) {
|
|
285
|
+
this.channel.sendToQueue(replyTo, Buffer.from(JSON.stringify({ success: false, error: error.message })), { correlationId, contentType: 'application/json' });
|
|
286
|
+
}
|
|
287
|
+
this.channel.nack(msg, false, false);
|
|
288
|
+
}
|
|
289
|
+
}, { noAck: false });
|
|
290
|
+
logger.info('RPC server listening', { queue: this.queueName });
|
|
291
|
+
}
|
|
292
|
+
async close() {
|
|
293
|
+
await this.channel?.close();
|
|
294
|
+
await this.connection?.close();
|
|
295
|
+
this.isConnected = false;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
export class AiRpcClient {
|
|
299
|
+
rpcClient;
|
|
300
|
+
constructor(amqpUrl) {
|
|
301
|
+
this.rpcClient = new RabbitMQRPCClient(amqpUrl);
|
|
302
|
+
}
|
|
303
|
+
async connect() {
|
|
304
|
+
await this.rpcClient.connect();
|
|
305
|
+
}
|
|
306
|
+
async call(request, timeoutMs = 30000) {
|
|
307
|
+
const result = await this.rpcClient.call(RPC_QUEUES.AI_REQUESTS, request, timeoutMs);
|
|
308
|
+
return result;
|
|
309
|
+
}
|
|
310
|
+
async oneShot(promptSlug, userMessage, options = {}) {
|
|
311
|
+
return this.call({ action: 'chat.oneshot', promptSlug, userMessage, ...options });
|
|
312
|
+
}
|
|
313
|
+
async complete(messages, options = {}) {
|
|
314
|
+
return this.call({ action: 'complete', messages, ...options });
|
|
315
|
+
}
|
|
316
|
+
async listProviders() {
|
|
317
|
+
return this.call({ action: 'providers.list' });
|
|
318
|
+
}
|
|
319
|
+
async close() {
|
|
320
|
+
await this.rpcClient.close();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
152
323
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;AAExC,yDAAyD;AAEzD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,cAAc;IACd,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,oBAAoB,EAAE,sBAAsB;IAC5C,kBAAkB,EAAE,oBAAoB;IACxC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,oBAAoB,EAAE,sBAAsB;IAC5C,oBAAoB,EAAE,sBAAsB;IAC5C,2BAA2B,EAAE,6BAA6B;IAC1D,6BAA6B,EAAE,+BAA+B;IAC9D,kBAAkB,EAAE,oBAAoB;IAExC,sDAAsD;IACtD,YAAY,EAAE,mBAAmB;IACjC,YAAY,EAAE,mBAAmB;IACjC,YAAY,EAAE,mBAAmB;IACjC,cAAc,EAAE,oBAAoB;IACpC,eAAe,EAAE,sBAAsB;IACvC,eAAe,EAAE,sBAAsB;IACvC,eAAe,EAAE,sBAAsB;IACvC,eAAe,EAAE,sBAAsB;IAEvC,aAAa;IACb,gBAAgB,EAAE,kBAAkB;IACpC,qBAAqB,EAAE,uBAAuB;IAC9C,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,sBAAsB,EAAE,wBAAwB;IAChD,qBAAqB,EAAE,uBAAuB;IAC9C,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB;IAExC,8CAA8C;IAC9C,mBAAmB,EAAE,qBAAqB;IAC1C,QAAQ,EAAE,kBAAkB;IAC5B,UAAU,EAAE,oBAAoB;IAChC,aAAa,EAAE,wBAAwB;IACvC,mBAAmB,EAAE,qBAAqB;IAE1C,sBAAsB;IACtB,qBAAqB,EAAE,uBAAuB;IAC9C,0BAA0B,EAAE,4BAA4B;IACxD,uBAAuB,EAAE,yBAAyB;IAClD,sBAAsB,EAAE,wBAAwB;IAChD,iBAAiB,EAAE,mBAAmB;IAEtC,gBAAgB;IAChB,qBAAqB,EAAE,uBAAuB;IAC9C,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;IAC1C,sBAAsB,EAAE,wBAAwB;IAChD,sBAAsB,EAAE,wBAAwB;IAChD,qBAAqB,EAAE,uBAAuB;IAC9C,wBAAwB,EAAE,0BAA0B;IACpD,mBAAmB,EAAE,qBAAqB;IAE1C,cAAc;IACd,oBAAoB,EAAE,sBAAsB;IAC5C,kBAAkB,EAAE,oBAAoB;IACxC,0BAA0B,EAAE,4BAA4B;IACxD,qBAAqB,EAAE,uBAAuB;IAE9C,kBAAkB;IAClB,qBAAqB,EAAE,uBAAuB;IAC9C,yBAAyB,EAAE,2BAA2B;IACtD,0BAA0B,EAAE,4BAA4B;IACxD,qBAAqB,EAAE,uBAAuB;IAE9C,YAAY;IACZ,qBAAqB,EAAE,uBAAuB;IAC9C,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,cAAc,EAAE,gBAAgB;IAChC,oBAAoB,EAAE,sBAAsB;IAE5C,iBAAiB;IACjB,yBAAyB,EAAE,2BAA2B;IACtD,qBAAqB,EAAE,uBAAuB;CACtC,CAAC;AAEX,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,mBAAmB;IAC3B,QAAQ,EAAE,qBAAqB;CACvB,CAAC;AAEX,0DAA0D;AAC1D,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,WAAW,EAAE,iBAAiB;CACtB,CAAC;AAEX,yDAAyD;AAEzD,MAAM,OAAO,cAAc;IACjB,UAAU,GAAwB,IAAI,CAAC;IACvC,OAAO,GAAmB,IAAI,CAAC;IAC/B,GAAG,CAAS;IAEpB,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;YAErD,mBAAmB;YACnB,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAChF,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAEnF,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC/B,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACnF,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,IAA6B,EAAE,WAAmB,SAAS,CAAC,MAAM;QAClG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACzC,UAAU;YACV,IAAI;YACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE;YAClD,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,kBAAkB;SAChC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CACb,SAAiB,EACjB,WAA8B,EAC9B,OAA6E,EAC7E,WAAmB,SAAS,CAAC,MAAM;QAEnC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAEjE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACtE,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,GAA0B,EAAE,EAAE;YACzE,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAClD,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAC5D,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChG,IAAI,CAAC,OAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,wBAAwB,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;IACjC,CAAC;CACF;AAMD,yDAAyD;AACzD,8EAA8E;AAE9E,MAAM,OAAO,iBAAiB;IAWC;IAVrB,UAAU,GAAwB,IAAI,CAAC;IACvC,OAAO,GAAmB,IAAI,CAAC;IAC/B,aAAa,GAAkB,IAAI,CAAC;IACpC,OAAO,GAAG,IAAI,GAAG,EAIrB,CAAC;IACG,WAAW,GAAG,KAAK,CAAC;IAE5B,YAA6B,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAE5C,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QAErD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAA0B,EAAE,EAAE;YACtE,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,aAAuB,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAA4B,CAAC;oBAC/E,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YACD,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAErB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAE3E,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAClC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC/B,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC5C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,OAAgC,EAAE,SAAS,GAAG,KAAK;QAC/E,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC;QAE/B,OAAO,IAAI,OAAO,CAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACnC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,SAAS,gBAAgB,SAAS,EAAE,CAAC,CAAC,CAAC;YAC/E,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAE5D,IAAI,CAAC,OAAQ,CAAC,WAAW,CACvB,SAAS,EACT,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EACpC;gBACE,aAAa;gBACb,OAAO,EAAE,IAAI,CAAC,aAAc;gBAC5B,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,kBAAkB;aAChC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;CACF;AAED,yDAAyD;AACzD,sFAAsF;AAEtF,MAAM,OAAO,iBAAiB;IAMT;IACA;IANX,UAAU,GAAwB,IAAI,CAAC;IACvC,OAAO,GAAmB,IAAI,CAAC;IAC/B,WAAW,GAAG,KAAK,CAAC;IAE5B,YACmB,GAAW,EACX,SAAiB;QADjB,QAAG,GAAH,GAAG,CAAQ;QACX,cAAS,GAAT,SAAS,CAAQ;IACjC,CAAC;IAEJ,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QACrD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAE/D,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAClC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC/B,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACnE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAmB;QACtC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAA0B,EAAE,EAAE;YAC9E,IAAI,CAAC,GAAG;gBAAE,OAAO;YAEjB,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,aAAuB,CAAC;YAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,OAAiB,CAAC;YAEjD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAA4B,CAAC;gBAC9E,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;gBAE9E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;gBAExC,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;oBAC7B,IAAI,CAAC,OAAQ,CAAC,WAAW,CACvB,OAAO,EACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EACrC,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,IAAI,EAAE,CACrE,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;gBAE9F,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;oBAC7B,IAAI,CAAC,OAAQ,CAAC,WAAW,CACvB,OAAO,EACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,EAChF,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,CACnD,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC,OAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAErB,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;CACF;AA4BD,MAAM,OAAO,WAAW;IACd,SAAS,CAAoB;IAErC,YAAY,OAAe;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAqB,EAAE,SAAS,GAAG,KAAK;QACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACtC,UAAU,CAAC,WAAW,EACtB,OAA6C,EAC7C,SAAS,CACV,CAAC;QACF,OAAO,MAAkC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,UAAkB,EAClB,WAAmB,EACnB,UAMI,EAAE;QAEN,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAA2E,EAC3E,UAKI,EAAE;QAEN,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACF"}
|
package/package.json
CHANGED
package/src/messaging/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import amqplib from 'amqplib';
|
|
2
2
|
import type { Channel, ChannelModel, ConsumeMessage } from 'amqplib';
|
|
3
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
3
4
|
import { createLogger } from '../logging/index.js';
|
|
4
5
|
|
|
5
6
|
const logger = createLogger('rabbitmq');
|
|
@@ -81,6 +82,8 @@ export const EVENTS = {
|
|
|
81
82
|
AI_COMPLETION_SUCCESS: 'ai.completion.success',
|
|
82
83
|
AI_COMPLETION_FAILED: 'ai.completion.failed',
|
|
83
84
|
AI_ANOMALY_DETECTED: 'ai.anomaly.detected',
|
|
85
|
+
AI_RPC_REQUEST: 'ai.rpc.request',
|
|
86
|
+
AI_PROVIDER_FALLBACK: 'ai.provider.fallback',
|
|
84
87
|
|
|
85
88
|
// Gateway events
|
|
86
89
|
GATEWAY_REQUEST_COMPLETED: 'gateway.request.completed',
|
|
@@ -92,6 +95,11 @@ export const EXCHANGES = {
|
|
|
92
95
|
COMMANDS: 'pendoadmin.commands',
|
|
93
96
|
} as const;
|
|
94
97
|
|
|
98
|
+
/** RPC queue names for direct service-to-service calls */
|
|
99
|
+
export const RPC_QUEUES = {
|
|
100
|
+
AI_REQUESTS: 'ai.rpc.requests',
|
|
101
|
+
} as const;
|
|
102
|
+
|
|
95
103
|
// ── RabbitMQ Client ───────────────────────────────────
|
|
96
104
|
|
|
97
105
|
export class RabbitMQClient {
|
|
@@ -181,3 +189,266 @@ export class RabbitMQClient {
|
|
|
181
189
|
await this.connection?.close();
|
|
182
190
|
}
|
|
183
191
|
}
|
|
192
|
+
|
|
193
|
+
// ── RPC Types ─────────────────────────────────────────
|
|
194
|
+
|
|
195
|
+
export type RPCHandler = (payload: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
196
|
+
|
|
197
|
+
// ── RabbitMQ RPC Client ───────────────────────────────
|
|
198
|
+
// Sends RPC requests and waits for responses via an exclusive callback queue.
|
|
199
|
+
|
|
200
|
+
export class RabbitMQRPCClient {
|
|
201
|
+
private connection: ChannelModel | null = null;
|
|
202
|
+
private channel: Channel | null = null;
|
|
203
|
+
private callbackQueue: string | null = null;
|
|
204
|
+
private pending = new Map<string, {
|
|
205
|
+
resolve: (val: Record<string, unknown>) => void;
|
|
206
|
+
reject: (err: Error) => void;
|
|
207
|
+
timer: ReturnType<typeof setTimeout>;
|
|
208
|
+
}>();
|
|
209
|
+
private isConnected = false;
|
|
210
|
+
|
|
211
|
+
constructor(private readonly url: string) {}
|
|
212
|
+
|
|
213
|
+
async connect(): Promise<void> {
|
|
214
|
+
this.connection = await amqplib.connect(this.url);
|
|
215
|
+
this.channel = await this.connection.createChannel();
|
|
216
|
+
|
|
217
|
+
const q = await this.channel.assertQueue('', { exclusive: true, autoDelete: true });
|
|
218
|
+
this.callbackQueue = q.queue;
|
|
219
|
+
|
|
220
|
+
this.channel.consume(this.callbackQueue, (msg: ConsumeMessage | null) => {
|
|
221
|
+
if (!msg) return;
|
|
222
|
+
const correlationId = msg.properties.correlationId as string;
|
|
223
|
+
const entry = this.pending.get(correlationId);
|
|
224
|
+
if (entry) {
|
|
225
|
+
clearTimeout(entry.timer);
|
|
226
|
+
this.pending.delete(correlationId);
|
|
227
|
+
try {
|
|
228
|
+
const response = JSON.parse(msg.content.toString()) as Record<string, unknown>;
|
|
229
|
+
entry.resolve(response);
|
|
230
|
+
} catch {
|
|
231
|
+
entry.reject(new Error('Failed to parse RPC response'));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
this.channel!.ack(msg);
|
|
235
|
+
}, { noAck: false });
|
|
236
|
+
|
|
237
|
+
this.isConnected = true;
|
|
238
|
+
logger.info('RPC client connected', { callbackQueue: this.callbackQueue });
|
|
239
|
+
|
|
240
|
+
this.connection.on('error', (err) => {
|
|
241
|
+
logger.error('RPC client connection error', { error: err.message });
|
|
242
|
+
this.isConnected = false;
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
this.connection.on('close', () => {
|
|
246
|
+
logger.warn('RPC client connection closed');
|
|
247
|
+
this.isConnected = false;
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
async call(queueName: string, payload: Record<string, unknown>, timeoutMs = 30000): Promise<Record<string, unknown>> {
|
|
252
|
+
if (!this.isConnected || !this.channel || !this.callbackQueue) {
|
|
253
|
+
throw new Error('RPC client not connected');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const correlationId = uuidv4();
|
|
257
|
+
|
|
258
|
+
return new Promise<Record<string, unknown>>((resolve, reject) => {
|
|
259
|
+
const timer = setTimeout(() => {
|
|
260
|
+
this.pending.delete(correlationId);
|
|
261
|
+
reject(new Error(`RPC timeout after ${timeoutMs}ms for queue=${queueName}`));
|
|
262
|
+
}, timeoutMs);
|
|
263
|
+
|
|
264
|
+
this.pending.set(correlationId, { resolve, reject, timer });
|
|
265
|
+
|
|
266
|
+
this.channel!.sendToQueue(
|
|
267
|
+
queueName,
|
|
268
|
+
Buffer.from(JSON.stringify(payload)),
|
|
269
|
+
{
|
|
270
|
+
correlationId,
|
|
271
|
+
replyTo: this.callbackQueue!,
|
|
272
|
+
persistent: true,
|
|
273
|
+
contentType: 'application/json',
|
|
274
|
+
},
|
|
275
|
+
);
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
async close(): Promise<void> {
|
|
280
|
+
for (const [, entry] of this.pending) {
|
|
281
|
+
clearTimeout(entry.timer);
|
|
282
|
+
entry.reject(new Error('RPC client closing'));
|
|
283
|
+
}
|
|
284
|
+
this.pending.clear();
|
|
285
|
+
await this.channel?.close();
|
|
286
|
+
await this.connection?.close();
|
|
287
|
+
this.isConnected = false;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// ── RabbitMQ RPC Server ───────────────────────────────
|
|
292
|
+
// Listens on a durable queue and dispatches to a handler, replying via correlationId.
|
|
293
|
+
|
|
294
|
+
export class RabbitMQRPCServer {
|
|
295
|
+
private connection: ChannelModel | null = null;
|
|
296
|
+
private channel: Channel | null = null;
|
|
297
|
+
private isConnected = false;
|
|
298
|
+
|
|
299
|
+
constructor(
|
|
300
|
+
private readonly url: string,
|
|
301
|
+
private readonly queueName: string,
|
|
302
|
+
) {}
|
|
303
|
+
|
|
304
|
+
async connect(): Promise<void> {
|
|
305
|
+
this.connection = await amqplib.connect(this.url);
|
|
306
|
+
this.channel = await this.connection.createChannel();
|
|
307
|
+
await this.channel.prefetch(5);
|
|
308
|
+
await this.channel.assertQueue(this.queueName, { durable: true, autoDelete: false });
|
|
309
|
+
this.isConnected = true;
|
|
310
|
+
logger.info('RPC server connected', { queue: this.queueName });
|
|
311
|
+
|
|
312
|
+
this.connection.on('error', (err) => {
|
|
313
|
+
logger.error('RPC server connection error', { error: err.message });
|
|
314
|
+
this.isConnected = false;
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
this.connection.on('close', () => {
|
|
318
|
+
logger.warn('RPC server connection closed, reconnecting in 5s...');
|
|
319
|
+
this.isConnected = false;
|
|
320
|
+
setTimeout(() => this.connect(), 5000);
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
async startConsuming(handler: RPCHandler): Promise<void> {
|
|
325
|
+
if (!this.isConnected || !this.channel) {
|
|
326
|
+
throw new Error('RPC server not connected');
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
await this.channel.consume(this.queueName, async (msg: ConsumeMessage | null) => {
|
|
330
|
+
if (!msg) return;
|
|
331
|
+
|
|
332
|
+
const correlationId = msg.properties.correlationId as string;
|
|
333
|
+
const replyTo = msg.properties.replyTo as string;
|
|
334
|
+
|
|
335
|
+
try {
|
|
336
|
+
const payload = JSON.parse(msg.content.toString()) as Record<string, unknown>;
|
|
337
|
+
logger.info('RPC request received', { queue: this.queueName, correlationId });
|
|
338
|
+
|
|
339
|
+
const response = await handler(payload);
|
|
340
|
+
|
|
341
|
+
if (replyTo && correlationId) {
|
|
342
|
+
this.channel!.sendToQueue(
|
|
343
|
+
replyTo,
|
|
344
|
+
Buffer.from(JSON.stringify(response)),
|
|
345
|
+
{ correlationId, contentType: 'application/json', persistent: true },
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
this.channel!.ack(msg);
|
|
350
|
+
} catch (error) {
|
|
351
|
+
logger.error('RPC handler error', { queue: this.queueName, error: (error as Error).message });
|
|
352
|
+
|
|
353
|
+
if (replyTo && correlationId) {
|
|
354
|
+
this.channel!.sendToQueue(
|
|
355
|
+
replyTo,
|
|
356
|
+
Buffer.from(JSON.stringify({ success: false, error: (error as Error).message })),
|
|
357
|
+
{ correlationId, contentType: 'application/json' },
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
this.channel!.nack(msg, false, false);
|
|
362
|
+
}
|
|
363
|
+
}, { noAck: false });
|
|
364
|
+
|
|
365
|
+
logger.info('RPC server listening', { queue: this.queueName });
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
async close(): Promise<void> {
|
|
369
|
+
await this.channel?.close();
|
|
370
|
+
await this.connection?.close();
|
|
371
|
+
this.isConnected = false;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// ── AI RPC Types & Client ─────────────────────────────
|
|
376
|
+
// Pre-built convenience client for calling the AI service via RPC.
|
|
377
|
+
|
|
378
|
+
export type AiRpcAction = 'complete' | 'chat.oneshot' | 'chat.message' | 'providers.list' | 'providers.resolve-chain';
|
|
379
|
+
|
|
380
|
+
export interface AiRpcRequest {
|
|
381
|
+
action: AiRpcAction;
|
|
382
|
+
promptSlug?: string;
|
|
383
|
+
userMessage?: string;
|
|
384
|
+
variables?: Record<string, string>;
|
|
385
|
+
providerId?: string;
|
|
386
|
+
model?: string;
|
|
387
|
+
companyId?: string;
|
|
388
|
+
userId?: string;
|
|
389
|
+
conversationId?: string;
|
|
390
|
+
messages?: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>;
|
|
391
|
+
temperature?: number;
|
|
392
|
+
maxTokens?: number;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export interface AiRpcResponse {
|
|
396
|
+
success: boolean;
|
|
397
|
+
data?: unknown;
|
|
398
|
+
error?: string;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
export class AiRpcClient {
|
|
402
|
+
private rpcClient: RabbitMQRPCClient;
|
|
403
|
+
|
|
404
|
+
constructor(amqpUrl: string) {
|
|
405
|
+
this.rpcClient = new RabbitMQRPCClient(amqpUrl);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
async connect(): Promise<void> {
|
|
409
|
+
await this.rpcClient.connect();
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
async call(request: AiRpcRequest, timeoutMs = 30000): Promise<AiRpcResponse> {
|
|
413
|
+
const result = await this.rpcClient.call(
|
|
414
|
+
RPC_QUEUES.AI_REQUESTS,
|
|
415
|
+
request as unknown as Record<string, unknown>,
|
|
416
|
+
timeoutMs,
|
|
417
|
+
);
|
|
418
|
+
return result as unknown as AiRpcResponse;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
async oneShot(
|
|
422
|
+
promptSlug: string,
|
|
423
|
+
userMessage: string,
|
|
424
|
+
options: {
|
|
425
|
+
variables?: Record<string, string>;
|
|
426
|
+
companyId?: string;
|
|
427
|
+
userId?: string;
|
|
428
|
+
providerId?: string;
|
|
429
|
+
model?: string;
|
|
430
|
+
} = {},
|
|
431
|
+
): Promise<AiRpcResponse> {
|
|
432
|
+
return this.call({ action: 'chat.oneshot', promptSlug, userMessage, ...options });
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
async complete(
|
|
436
|
+
messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,
|
|
437
|
+
options: {
|
|
438
|
+
temperature?: number;
|
|
439
|
+
maxTokens?: number;
|
|
440
|
+
providerId?: string;
|
|
441
|
+
model?: string;
|
|
442
|
+
} = {},
|
|
443
|
+
): Promise<AiRpcResponse> {
|
|
444
|
+
return this.call({ action: 'complete', messages, ...options });
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
async listProviders(): Promise<AiRpcResponse> {
|
|
448
|
+
return this.call({ action: 'providers.list' });
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
async close(): Promise<void> {
|
|
452
|
+
await this.rpcClient.close();
|
|
453
|
+
}
|
|
454
|
+
}
|