@hazeljs/messaging 0.2.0-beta.30
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.
- package/LICENSE +192 -0
- package/README.md +186 -0
- package/dist/adapters/telegram.adapter.d.ts +24 -0
- package/dist/adapters/telegram.adapter.d.ts.map +1 -0
- package/dist/adapters/telegram.adapter.js +70 -0
- package/dist/adapters/telegram.adapter.js.map +1 -0
- package/dist/adapters/telegram.adapter.test.d.ts +2 -0
- package/dist/adapters/telegram.adapter.test.d.ts.map +1 -0
- package/dist/adapters/telegram.adapter.test.js +110 -0
- package/dist/adapters/telegram.adapter.test.js.map +1 -0
- package/dist/adapters/viber.adapter.d.ts +29 -0
- package/dist/adapters/viber.adapter.d.ts.map +1 -0
- package/dist/adapters/viber.adapter.js +98 -0
- package/dist/adapters/viber.adapter.js.map +1 -0
- package/dist/adapters/viber.adapter.test.d.ts +2 -0
- package/dist/adapters/viber.adapter.test.d.ts.map +1 -0
- package/dist/adapters/viber.adapter.test.js +73 -0
- package/dist/adapters/viber.adapter.test.js.map +1 -0
- package/dist/adapters/whatsapp.adapter.d.ts +26 -0
- package/dist/adapters/whatsapp.adapter.d.ts.map +1 -0
- package/dist/adapters/whatsapp.adapter.js +87 -0
- package/dist/adapters/whatsapp.adapter.js.map +1 -0
- package/dist/adapters/whatsapp.adapter.test.d.ts +2 -0
- package/dist/adapters/whatsapp.adapter.test.d.ts.map +1 -0
- package/dist/adapters/whatsapp.adapter.test.js +198 -0
- package/dist/adapters/whatsapp.adapter.test.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/messaging-kafka.bootstrap.d.ts +14 -0
- package/dist/messaging-kafka.bootstrap.d.ts.map +1 -0
- package/dist/messaging-kafka.bootstrap.js +42 -0
- package/dist/messaging-kafka.bootstrap.js.map +1 -0
- package/dist/messaging-kafka.bootstrap.test.d.ts +2 -0
- package/dist/messaging-kafka.bootstrap.test.d.ts.map +1 -0
- package/dist/messaging-kafka.bootstrap.test.js +34 -0
- package/dist/messaging-kafka.bootstrap.test.js.map +1 -0
- package/dist/messaging-kafka.consumer.d.ts +10 -0
- package/dist/messaging-kafka.consumer.d.ts.map +1 -0
- package/dist/messaging-kafka.consumer.js +80 -0
- package/dist/messaging-kafka.consumer.js.map +1 -0
- package/dist/messaging-kafka.consumer.test.d.ts +2 -0
- package/dist/messaging-kafka.consumer.test.d.ts.map +1 -0
- package/dist/messaging-kafka.consumer.test.js +129 -0
- package/dist/messaging-kafka.consumer.test.js.map +1 -0
- package/dist/messaging-kafka.types.d.ts +10 -0
- package/dist/messaging-kafka.types.d.ts.map +1 -0
- package/dist/messaging-kafka.types.js +5 -0
- package/dist/messaging-kafka.types.js.map +1 -0
- package/dist/messaging-kafka.types.test.d.ts +2 -0
- package/dist/messaging-kafka.types.test.d.ts.map +1 -0
- package/dist/messaging-kafka.types.test.js +12 -0
- package/dist/messaging-kafka.types.test.js.map +1 -0
- package/dist/messaging.controller.d.ts +27 -0
- package/dist/messaging.controller.d.ts.map +1 -0
- package/dist/messaging.controller.js +151 -0
- package/dist/messaging.controller.js.map +1 -0
- package/dist/messaging.controller.test.d.ts +2 -0
- package/dist/messaging.controller.test.d.ts.map +1 -0
- package/dist/messaging.controller.test.js +184 -0
- package/dist/messaging.controller.test.js.map +1 -0
- package/dist/messaging.module.d.ts +69 -0
- package/dist/messaging.module.d.ts.map +1 -0
- package/dist/messaging.module.js +152 -0
- package/dist/messaging.module.js.map +1 -0
- package/dist/messaging.module.test.d.ts +2 -0
- package/dist/messaging.module.test.d.ts.map +1 -0
- package/dist/messaging.module.test.js +97 -0
- package/dist/messaging.module.test.js.map +1 -0
- package/dist/messaging.service.d.ts +42 -0
- package/dist/messaging.service.d.ts.map +1 -0
- package/dist/messaging.service.js +109 -0
- package/dist/messaging.service.js.map +1 -0
- package/dist/messaging.service.test.d.ts +2 -0
- package/dist/messaging.service.test.d.ts.map +1 -0
- package/dist/messaging.service.test.js +163 -0
- package/dist/messaging.service.test.js.map +1 -0
- package/dist/store/conversation-context.interface.d.ts +17 -0
- package/dist/store/conversation-context.interface.d.ts.map +1 -0
- package/dist/store/conversation-context.interface.js +7 -0
- package/dist/store/conversation-context.interface.js.map +1 -0
- package/dist/store/memory-conversation-context.d.ts +11 -0
- package/dist/store/memory-conversation-context.d.ts.map +1 -0
- package/dist/store/memory-conversation-context.js +22 -0
- package/dist/store/memory-conversation-context.js.map +1 -0
- package/dist/store/memory-conversation-context.test.d.ts +2 -0
- package/dist/store/memory-conversation-context.test.d.ts.map +1 -0
- package/dist/store/memory-conversation-context.test.js +69 -0
- package/dist/store/memory-conversation-context.test.js.map +1 -0
- package/dist/store/redis-conversation-context.d.ts +24 -0
- package/dist/store/redis-conversation-context.d.ts.map +1 -0
- package/dist/store/redis-conversation-context.js +37 -0
- package/dist/store/redis-conversation-context.js.map +1 -0
- package/dist/store/redis-conversation-context.test.d.ts +2 -0
- package/dist/store/redis-conversation-context.test.d.ts.map +1 -0
- package/dist/store/redis-conversation-context.test.js +85 -0
- package/dist/store/redis-conversation-context.test.js.map +1 -0
- package/dist/types/message.types.d.ts +55 -0
- package/dist/types/message.types.d.ts.map +1 -0
- package/dist/types/message.types.js +7 -0
- package/dist/types/message.types.js.map +1 -0
- package/dist/types/response-handler.types.d.ts +47 -0
- package/dist/types/response-handler.types.d.ts.map +1 -0
- package/dist/types/response-handler.types.js +3 -0
- package/dist/types/response-handler.types.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* MessagingController tests
|
|
5
|
+
*/
|
|
6
|
+
const messaging_controller_1 = require("./messaging.controller");
|
|
7
|
+
const messaging_service_1 = require("./messaging.service");
|
|
8
|
+
const core_1 = require("@hazeljs/core");
|
|
9
|
+
const createMockMessage = () => ({
|
|
10
|
+
id: '1',
|
|
11
|
+
channel: 'telegram',
|
|
12
|
+
conversationId: 'conv-1',
|
|
13
|
+
userId: 'user-1',
|
|
14
|
+
text: 'Hello',
|
|
15
|
+
timestamp: new Date(),
|
|
16
|
+
});
|
|
17
|
+
const createMockAdapter = (channel) => ({
|
|
18
|
+
channel: channel,
|
|
19
|
+
parseIncoming: jest.fn(),
|
|
20
|
+
send: jest.fn().mockResolvedValue(undefined),
|
|
21
|
+
});
|
|
22
|
+
const createMockRes = () => {
|
|
23
|
+
const endFn = jest.fn();
|
|
24
|
+
const res = {
|
|
25
|
+
statusCode: 200,
|
|
26
|
+
_headers: {},
|
|
27
|
+
_body: '',
|
|
28
|
+
status: jest.fn((code) => {
|
|
29
|
+
res.statusCode = code;
|
|
30
|
+
return res;
|
|
31
|
+
}),
|
|
32
|
+
setHeader: jest.fn((k, v) => {
|
|
33
|
+
res._headers[k] = v;
|
|
34
|
+
return res;
|
|
35
|
+
}),
|
|
36
|
+
write: jest.fn((chunk) => {
|
|
37
|
+
res._body += chunk;
|
|
38
|
+
return true;
|
|
39
|
+
}),
|
|
40
|
+
end: endFn,
|
|
41
|
+
json: jest.fn((obj) => {
|
|
42
|
+
res._body = JSON.stringify(obj);
|
|
43
|
+
endFn();
|
|
44
|
+
return res;
|
|
45
|
+
}),
|
|
46
|
+
};
|
|
47
|
+
return res;
|
|
48
|
+
};
|
|
49
|
+
describe('MessagingController', () => {
|
|
50
|
+
let messagingService;
|
|
51
|
+
let telegramAdapter;
|
|
52
|
+
let whatsappAdapter;
|
|
53
|
+
beforeEach(() => {
|
|
54
|
+
messagingService = new messaging_service_1.MessagingService({
|
|
55
|
+
customHandler: jest.fn().mockResolvedValue('Reply'),
|
|
56
|
+
});
|
|
57
|
+
telegramAdapter = createMockAdapter('telegram');
|
|
58
|
+
whatsappAdapter = createMockAdapter('whatsapp');
|
|
59
|
+
});
|
|
60
|
+
describe('webhookGet', () => {
|
|
61
|
+
it('returns 404 for non-whatsapp channel', async () => {
|
|
62
|
+
const controller = new messaging_controller_1.MessagingController(messagingService, [telegramAdapter], false, undefined);
|
|
63
|
+
const req = { query: {}, headers: {} };
|
|
64
|
+
const res = createMockRes();
|
|
65
|
+
await controller.webhookGet('telegram', req, res);
|
|
66
|
+
expect(res.status).toHaveBeenCalledWith(404);
|
|
67
|
+
expect(res.write).toHaveBeenCalledWith('Not found');
|
|
68
|
+
});
|
|
69
|
+
it('returns 404 when whatsapp adapter has no verifyWebhook', async () => {
|
|
70
|
+
const controller = new messaging_controller_1.MessagingController(messagingService, [telegramAdapter], false, undefined);
|
|
71
|
+
const req = { query: {}, headers: {} };
|
|
72
|
+
const res = createMockRes();
|
|
73
|
+
await controller.webhookGet('whatsapp', req, res);
|
|
74
|
+
expect(res.status).toHaveBeenCalledWith(404);
|
|
75
|
+
});
|
|
76
|
+
it('returns challenge when whatsapp verification succeeds', async () => {
|
|
77
|
+
const originalEnv = process.env;
|
|
78
|
+
process.env.WHATSAPP_VERIFY_TOKEN = 'secret';
|
|
79
|
+
const waAdapter = {
|
|
80
|
+
...whatsappAdapter,
|
|
81
|
+
verifyWebhook: jest.fn().mockReturnValue(true),
|
|
82
|
+
};
|
|
83
|
+
const controller = new messaging_controller_1.MessagingController(messagingService, [waAdapter], false, undefined);
|
|
84
|
+
const req = {
|
|
85
|
+
query: {
|
|
86
|
+
'hub.mode': 'subscribe',
|
|
87
|
+
'hub.verify_token': 'secret',
|
|
88
|
+
'hub.challenge': 'challenge123',
|
|
89
|
+
},
|
|
90
|
+
headers: {},
|
|
91
|
+
};
|
|
92
|
+
const res = createMockRes();
|
|
93
|
+
await controller.webhookGet('whatsapp', req, res);
|
|
94
|
+
expect(res.status).toHaveBeenCalledWith(200);
|
|
95
|
+
expect(res.write).toHaveBeenCalledWith('challenge123');
|
|
96
|
+
process.env = originalEnv;
|
|
97
|
+
});
|
|
98
|
+
it('returns 403 when verification fails', async () => {
|
|
99
|
+
process.env.WHATSAPP_VERIFY_TOKEN = 'secret';
|
|
100
|
+
const waAdapter = {
|
|
101
|
+
...whatsappAdapter,
|
|
102
|
+
verifyWebhook: jest.fn().mockReturnValue(false),
|
|
103
|
+
};
|
|
104
|
+
const controller = new messaging_controller_1.MessagingController(messagingService, [waAdapter], false, undefined);
|
|
105
|
+
const req = { query: { 'hub.mode': 'subscribe', 'hub.verify_token': 'wrong' }, headers: {} };
|
|
106
|
+
const res = createMockRes();
|
|
107
|
+
await controller.webhookGet('whatsapp', req, res);
|
|
108
|
+
expect(res.status).toHaveBeenCalledWith(403);
|
|
109
|
+
expect(res.write).toHaveBeenCalledWith('Verification failed');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe('webhookPost', () => {
|
|
113
|
+
it('throws BadRequestException for unsupported channel', async () => {
|
|
114
|
+
const controller = new messaging_controller_1.MessagingController(messagingService, [telegramAdapter], false, undefined);
|
|
115
|
+
const req = { body: {} };
|
|
116
|
+
const res = createMockRes();
|
|
117
|
+
await expect(controller.webhookPost('unknown', req, res)).rejects.toThrow(core_1.BadRequestException);
|
|
118
|
+
});
|
|
119
|
+
it('returns 200 with ok when parseIncoming returns null', async () => {
|
|
120
|
+
telegramAdapter.parseIncoming.mockReturnValue(null);
|
|
121
|
+
const controller = new messaging_controller_1.MessagingController(messagingService, [telegramAdapter], false, undefined);
|
|
122
|
+
const req = { body: {} };
|
|
123
|
+
const res = createMockRes();
|
|
124
|
+
await controller.webhookPost('telegram', req, res);
|
|
125
|
+
expect(res.json).toHaveBeenCalledWith({ ok: true });
|
|
126
|
+
});
|
|
127
|
+
it('processes message sync and sends reply', async () => {
|
|
128
|
+
const msg = createMockMessage();
|
|
129
|
+
telegramAdapter.parseIncoming.mockReturnValue(msg);
|
|
130
|
+
const controller = new messaging_controller_1.MessagingController(messagingService, [telegramAdapter], false, undefined);
|
|
131
|
+
const req = { body: { update_id: 1, message: {} } };
|
|
132
|
+
const res = createMockRes();
|
|
133
|
+
await controller.webhookPost('telegram', req, res);
|
|
134
|
+
expect(messagingService.handleMessage).toBeDefined();
|
|
135
|
+
expect(telegramAdapter.send).toHaveBeenCalledWith({
|
|
136
|
+
conversationId: 'conv-1',
|
|
137
|
+
text: 'Reply',
|
|
138
|
+
replyToMessageId: '1',
|
|
139
|
+
});
|
|
140
|
+
expect(res.json).toHaveBeenCalledWith({ ok: true });
|
|
141
|
+
});
|
|
142
|
+
it('produces to Kafka when useKafka is true', async () => {
|
|
143
|
+
const msg = createMockMessage();
|
|
144
|
+
telegramAdapter.parseIncoming.mockReturnValue(msg);
|
|
145
|
+
const producer = {
|
|
146
|
+
send: jest.fn().mockResolvedValue(undefined),
|
|
147
|
+
};
|
|
148
|
+
const controller = new messaging_controller_1.MessagingController(messagingService, [telegramAdapter], true, producer);
|
|
149
|
+
const req = { body: {} };
|
|
150
|
+
const res = createMockRes();
|
|
151
|
+
await controller.webhookPost('telegram', req, res);
|
|
152
|
+
expect(producer.send).toHaveBeenCalledWith('messaging.incoming', expect.objectContaining({
|
|
153
|
+
key: 'conv-1', // sessionId ?? conversationId - mock has no sessionId
|
|
154
|
+
value: expect.stringContaining('"channel":"telegram"'),
|
|
155
|
+
}));
|
|
156
|
+
expect(telegramAdapter.send).not.toHaveBeenCalled();
|
|
157
|
+
expect(res.json).toHaveBeenCalledWith({ ok: true });
|
|
158
|
+
});
|
|
159
|
+
it('handles multiple messages from parseIncoming', async () => {
|
|
160
|
+
const msg1 = createMockMessage();
|
|
161
|
+
const msg2 = { ...createMockMessage(), id: '2', text: 'Second' };
|
|
162
|
+
telegramAdapter.parseIncoming.mockReturnValue([msg1, msg2]);
|
|
163
|
+
const controller = new messaging_controller_1.MessagingController(messagingService, [telegramAdapter], false, undefined);
|
|
164
|
+
const req = { body: {} };
|
|
165
|
+
const res = createMockRes();
|
|
166
|
+
await controller.webhookPost('telegram', req, res);
|
|
167
|
+
expect(telegramAdapter.send).toHaveBeenCalledTimes(2);
|
|
168
|
+
});
|
|
169
|
+
it('handles body parse error', async () => {
|
|
170
|
+
telegramAdapter.parseIncoming.mockReturnValue(null);
|
|
171
|
+
const controller = new messaging_controller_1.MessagingController(messagingService, [telegramAdapter], false, undefined);
|
|
172
|
+
const req = {};
|
|
173
|
+
Object.defineProperty(req, 'body', {
|
|
174
|
+
get: () => {
|
|
175
|
+
throw new Error('parse error');
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
const res = createMockRes();
|
|
179
|
+
await controller.webhookPost('telegram', req, res);
|
|
180
|
+
expect(telegramAdapter.parseIncoming).toHaveBeenCalledWith({});
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=messaging.controller.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.controller.test.js","sourceRoot":"","sources":["../src/messaging.controller.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { MessagingServiceOptions } from './messaging.service';
|
|
2
|
+
import type { KafkaModuleOptions } from '@hazeljs/kafka';
|
|
3
|
+
export interface MessagingModuleChannelConfig {
|
|
4
|
+
telegram?: {
|
|
5
|
+
botToken: string;
|
|
6
|
+
};
|
|
7
|
+
whatsapp?: {
|
|
8
|
+
accessToken: string;
|
|
9
|
+
phoneNumberId: string;
|
|
10
|
+
apiVersion?: string;
|
|
11
|
+
};
|
|
12
|
+
viber?: {
|
|
13
|
+
authToken: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Redis config - client or connection options */
|
|
17
|
+
export interface MessagingRedisConfig {
|
|
18
|
+
client?: {
|
|
19
|
+
get: (k: string) => Promise<string | null>;
|
|
20
|
+
setex: (k: string, t: number, v: string) => Promise<string>;
|
|
21
|
+
del: (k: string) => Promise<number>;
|
|
22
|
+
};
|
|
23
|
+
host?: string;
|
|
24
|
+
port?: number;
|
|
25
|
+
password?: string;
|
|
26
|
+
/** TTL for context keys in seconds (default: 86400 = 24h) */
|
|
27
|
+
ttlSeconds?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface MessagingModuleOptions extends MessagingServiceOptions {
|
|
30
|
+
channels?: MessagingModuleChannelConfig;
|
|
31
|
+
/** Kafka config for async processing (horizontally scalable) */
|
|
32
|
+
kafka?: Partial<KafkaModuleOptions>;
|
|
33
|
+
/** Redis config for conversation context (horizontally scalable) */
|
|
34
|
+
redis?: MessagingRedisConfig;
|
|
35
|
+
}
|
|
36
|
+
export declare class MessagingModule {
|
|
37
|
+
private static options;
|
|
38
|
+
/**
|
|
39
|
+
* Configure MessagingModule with channels and AI.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { MessagingModule } from '@hazeljs/messaging';
|
|
44
|
+
* import { OpenAIProvider } from '@hazeljs/ai';
|
|
45
|
+
*
|
|
46
|
+
* imports: [
|
|
47
|
+
* MessagingModule.forRoot({
|
|
48
|
+
* aiProvider: new OpenAIProvider(),
|
|
49
|
+
* systemPrompt: 'You are a helpful support bot.',
|
|
50
|
+
* channels: {
|
|
51
|
+
* telegram: { botToken: process.env.TELEGRAM_BOT_TOKEN! },
|
|
52
|
+
* whatsapp: {
|
|
53
|
+
* accessToken: process.env.WHATSAPP_ACCESS_TOKEN!,
|
|
54
|
+
* phoneNumberId: process.env.WHATSAPP_PHONE_NUMBER_ID!,
|
|
55
|
+
* },
|
|
56
|
+
* },
|
|
57
|
+
* }),
|
|
58
|
+
* ]
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
static forRoot(options?: MessagingModuleOptions): {
|
|
62
|
+
module: typeof MessagingModule;
|
|
63
|
+
imports?: unknown[];
|
|
64
|
+
providers: unknown[];
|
|
65
|
+
controllers: unknown[];
|
|
66
|
+
};
|
|
67
|
+
static getOptions(): MessagingModuleOptions;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=messaging.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.module.d.ts","sourceRoot":"","sources":["../src/messaging.module.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,KAAK,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/B;AAED,kDAAkD;AAClD,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE;QACP,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAC3C,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5D,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;KACrC,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAuB,SAAQ,uBAAuB;IACrE,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IACxC,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpC,oEAAoE;IACpE,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC9B;AAED,qBAKa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,OAAO,CAA8B;IAEpD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,sBAA2B,GAAG;QACpD,MAAM,EAAE,OAAO,eAAe,CAAC;QAC/B,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;QACpB,SAAS,EAAE,OAAO,EAAE,CAAC;QACrB,WAAW,EAAE,OAAO,EAAE,CAAC;KACxB;IAwGD,MAAM,CAAC,UAAU,IAAI,sBAAsB;CAG5C"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var MessagingModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.MessagingModule = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Messaging Module - Multichannel bot with LLM integration
|
|
13
|
+
* Supports Kafka (async, horizontally scalable) and Redis (context store)
|
|
14
|
+
*/
|
|
15
|
+
const core_1 = require("@hazeljs/core");
|
|
16
|
+
const messaging_service_1 = require("./messaging.service");
|
|
17
|
+
const messaging_controller_1 = require("./messaging.controller");
|
|
18
|
+
const telegram_adapter_1 = require("./adapters/telegram.adapter");
|
|
19
|
+
const whatsapp_adapter_1 = require("./adapters/whatsapp.adapter");
|
|
20
|
+
const viber_adapter_1 = require("./adapters/viber.adapter");
|
|
21
|
+
const redis_conversation_context_1 = require("./store/redis-conversation-context");
|
|
22
|
+
const memory_conversation_context_1 = require("./store/memory-conversation-context");
|
|
23
|
+
let MessagingModule = MessagingModule_1 = class MessagingModule {
|
|
24
|
+
/**
|
|
25
|
+
* Configure MessagingModule with channels and AI.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* import { MessagingModule } from '@hazeljs/messaging';
|
|
30
|
+
* import { OpenAIProvider } from '@hazeljs/ai';
|
|
31
|
+
*
|
|
32
|
+
* imports: [
|
|
33
|
+
* MessagingModule.forRoot({
|
|
34
|
+
* aiProvider: new OpenAIProvider(),
|
|
35
|
+
* systemPrompt: 'You are a helpful support bot.',
|
|
36
|
+
* channels: {
|
|
37
|
+
* telegram: { botToken: process.env.TELEGRAM_BOT_TOKEN! },
|
|
38
|
+
* whatsapp: {
|
|
39
|
+
* accessToken: process.env.WHATSAPP_ACCESS_TOKEN!,
|
|
40
|
+
* phoneNumberId: process.env.WHATSAPP_PHONE_NUMBER_ID!,
|
|
41
|
+
* },
|
|
42
|
+
* },
|
|
43
|
+
* }),
|
|
44
|
+
* ]
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
static forRoot(options = {}) {
|
|
48
|
+
MessagingModule_1.options = options;
|
|
49
|
+
const channels = options.channels ?? {};
|
|
50
|
+
const adapters = [];
|
|
51
|
+
const imports = [];
|
|
52
|
+
if (channels.telegram?.botToken) {
|
|
53
|
+
adapters.push(new telegram_adapter_1.TelegramAdapter({ botToken: channels.telegram.botToken }));
|
|
54
|
+
}
|
|
55
|
+
if (channels.whatsapp?.accessToken) {
|
|
56
|
+
adapters.push(new whatsapp_adapter_1.WhatsAppAdapter({
|
|
57
|
+
accessToken: channels.whatsapp.accessToken,
|
|
58
|
+
phoneNumberId: channels.whatsapp.phoneNumberId,
|
|
59
|
+
apiVersion: channels.whatsapp.apiVersion,
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
if (channels.viber?.authToken) {
|
|
63
|
+
adapters.push(new viber_adapter_1.ViberAdapter({ authToken: channels.viber.authToken }));
|
|
64
|
+
}
|
|
65
|
+
const useKafka = !!options.kafka;
|
|
66
|
+
let contextStore;
|
|
67
|
+
if (options.redis?.client) {
|
|
68
|
+
contextStore = new redis_conversation_context_1.RedisConversationContextStore({
|
|
69
|
+
client: options.redis.client,
|
|
70
|
+
ttlSeconds: options.redis.ttlSeconds,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
else if (options.redis?.host || options.redis?.port) {
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports -- ioredis is optional peer dep
|
|
75
|
+
const Redis = require('ioredis');
|
|
76
|
+
const client = new Redis({
|
|
77
|
+
host: options.redis.host ?? 'localhost',
|
|
78
|
+
port: options.redis.port ?? 6379,
|
|
79
|
+
password: options.redis.password,
|
|
80
|
+
});
|
|
81
|
+
contextStore = new redis_conversation_context_1.RedisConversationContextStore({
|
|
82
|
+
client,
|
|
83
|
+
ttlSeconds: options.redis.ttlSeconds,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
contextStore = new memory_conversation_context_1.MemoryConversationContextStore();
|
|
88
|
+
}
|
|
89
|
+
const providers = [
|
|
90
|
+
{
|
|
91
|
+
provide: messaging_service_1.MessagingService,
|
|
92
|
+
useFactory: () => new messaging_service_1.MessagingService({
|
|
93
|
+
aiProvider: options.aiProvider,
|
|
94
|
+
systemPrompt: options.systemPrompt,
|
|
95
|
+
model: options.model,
|
|
96
|
+
temperature: options.temperature,
|
|
97
|
+
maxTokens: options.maxTokens,
|
|
98
|
+
maxContextTurns: options.maxContextTurns,
|
|
99
|
+
customHandler: options.customHandler,
|
|
100
|
+
agentHandler: options.agentHandler,
|
|
101
|
+
ragService: options.ragService,
|
|
102
|
+
ragTopK: options.ragTopK,
|
|
103
|
+
ragMinScore: options.ragMinScore,
|
|
104
|
+
}, contextStore),
|
|
105
|
+
},
|
|
106
|
+
{ provide: messaging_controller_1.MESSAGING_ADAPTERS, useValue: adapters },
|
|
107
|
+
{ provide: messaging_controller_1.MESSAGING_USE_KAFKA, useValue: useKafka },
|
|
108
|
+
...(useKafka
|
|
109
|
+
? [
|
|
110
|
+
{
|
|
111
|
+
provide: messaging_controller_1.MESSAGING_KAFKA_PRODUCER,
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports -- @hazeljs/kafka is optional
|
|
113
|
+
useExisting: require('@hazeljs/kafka').KafkaProducerService,
|
|
114
|
+
},
|
|
115
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports -- lazy load when Kafka enabled
|
|
116
|
+
require('./messaging-kafka.consumer').MessagingKafkaConsumer,
|
|
117
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports -- lazy load when Kafka enabled
|
|
118
|
+
require('./messaging-kafka.bootstrap').MessagingKafkaBootstrap,
|
|
119
|
+
]
|
|
120
|
+
: [{ provide: messaging_controller_1.MESSAGING_KAFKA_PRODUCER, useValue: null }]),
|
|
121
|
+
];
|
|
122
|
+
if (useKafka) {
|
|
123
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports -- @hazeljs/kafka is optional
|
|
124
|
+
const { KafkaModule } = require('@hazeljs/kafka');
|
|
125
|
+
KafkaModule.forRoot({
|
|
126
|
+
clientId: 'messaging',
|
|
127
|
+
brokers: options.kafka?.brokers ?? ['localhost:9092'],
|
|
128
|
+
...options.kafka,
|
|
129
|
+
});
|
|
130
|
+
imports.push(KafkaModule);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
module: MessagingModule_1,
|
|
134
|
+
imports: imports.length > 0 ? imports : undefined,
|
|
135
|
+
providers,
|
|
136
|
+
controllers: [messaging_controller_1.MessagingController],
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
static getOptions() {
|
|
140
|
+
return MessagingModule_1.options;
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
exports.MessagingModule = MessagingModule;
|
|
144
|
+
MessagingModule.options = {};
|
|
145
|
+
exports.MessagingModule = MessagingModule = MessagingModule_1 = __decorate([
|
|
146
|
+
(0, core_1.HazelModule)({
|
|
147
|
+
providers: [messaging_service_1.MessagingService],
|
|
148
|
+
controllers: [messaging_controller_1.MessagingController],
|
|
149
|
+
exports: [messaging_service_1.MessagingService],
|
|
150
|
+
})
|
|
151
|
+
], MessagingModule);
|
|
152
|
+
//# sourceMappingURL=messaging.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.module.js","sourceRoot":"","sources":["../src/messaging.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.module.test.d.ts","sourceRoot":"","sources":["../src/messaging.module.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* MessagingModule tests - tests forRoot without Kafka/Redis to avoid dynamic requires
|
|
5
|
+
*/
|
|
6
|
+
const messaging_module_1 = require("./messaging.module");
|
|
7
|
+
const messaging_controller_1 = require("./messaging.controller");
|
|
8
|
+
const messaging_service_1 = require("./messaging.service");
|
|
9
|
+
describe('MessagingModule', () => {
|
|
10
|
+
describe('forRoot', () => {
|
|
11
|
+
it('returns dynamic module structure', () => {
|
|
12
|
+
const result = messaging_module_1.MessagingModule.forRoot({
|
|
13
|
+
systemPrompt: 'Test bot',
|
|
14
|
+
channels: {
|
|
15
|
+
telegram: { botToken: 'test-token' },
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
expect(result).toHaveProperty('module', messaging_module_1.MessagingModule);
|
|
19
|
+
expect(result).toHaveProperty('providers');
|
|
20
|
+
expect(result).toHaveProperty('controllers');
|
|
21
|
+
expect(Array.isArray(result.providers)).toBe(true);
|
|
22
|
+
expect(result.controllers).toContain(messaging_controller_1.MessagingController);
|
|
23
|
+
});
|
|
24
|
+
it('creates adapters for configured channels', () => {
|
|
25
|
+
const result = messaging_module_1.MessagingModule.forRoot({
|
|
26
|
+
channels: {
|
|
27
|
+
telegram: { botToken: 't1' },
|
|
28
|
+
whatsapp: {
|
|
29
|
+
accessToken: 'a1',
|
|
30
|
+
phoneNumberId: 'p1',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const adaptersProvider = result.providers?.find((p) => p &&
|
|
35
|
+
typeof p === 'object' &&
|
|
36
|
+
'useValue' in p &&
|
|
37
|
+
Array.isArray(p.useValue));
|
|
38
|
+
expect(adaptersProvider?.useValue).toHaveLength(2);
|
|
39
|
+
expect(adaptersProvider?.useValue[0].channel).toBe('telegram');
|
|
40
|
+
expect(adaptersProvider?.useValue[1].channel).toBe('whatsapp');
|
|
41
|
+
});
|
|
42
|
+
it('creates MessagingService with useFactory', () => {
|
|
43
|
+
const result = messaging_module_1.MessagingModule.forRoot({
|
|
44
|
+
channels: { telegram: { botToken: 't' } },
|
|
45
|
+
});
|
|
46
|
+
const svcProvider = result.providers?.find((p) => p &&
|
|
47
|
+
typeof p === 'object' &&
|
|
48
|
+
'useFactory' in p &&
|
|
49
|
+
p.provide?.name === 'MessagingService');
|
|
50
|
+
expect(svcProvider?.useFactory).toBeDefined();
|
|
51
|
+
const service = svcProvider?.useFactory?.();
|
|
52
|
+
expect(service).toBeInstanceOf(messaging_service_1.MessagingService);
|
|
53
|
+
});
|
|
54
|
+
it('does not include Kafka when kafka config absent', () => {
|
|
55
|
+
const result = messaging_module_1.MessagingModule.forRoot({
|
|
56
|
+
channels: { telegram: { botToken: 't' } },
|
|
57
|
+
});
|
|
58
|
+
const kafkaProvider = result.providers?.find((p) => p &&
|
|
59
|
+
typeof p === 'object' &&
|
|
60
|
+
'useValue' in p &&
|
|
61
|
+
p.useValue === null);
|
|
62
|
+
expect(kafkaProvider).toBeDefined();
|
|
63
|
+
});
|
|
64
|
+
it('uses RedisConversationContextStore when redis.client provided', () => {
|
|
65
|
+
const mockRedis = {
|
|
66
|
+
get: jest.fn().mockResolvedValue(null),
|
|
67
|
+
setex: jest.fn().mockResolvedValue('OK'),
|
|
68
|
+
del: jest.fn().mockResolvedValue(0),
|
|
69
|
+
};
|
|
70
|
+
const result = messaging_module_1.MessagingModule.forRoot({
|
|
71
|
+
channels: { telegram: { botToken: 't' } },
|
|
72
|
+
redis: {
|
|
73
|
+
client: mockRedis,
|
|
74
|
+
ttlSeconds: 7200,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
const svcProvider = result.providers?.find((p) => p &&
|
|
78
|
+
typeof p === 'object' &&
|
|
79
|
+
'useFactory' in p &&
|
|
80
|
+
p.provide?.name === 'MessagingService');
|
|
81
|
+
const service = svcProvider?.useFactory?.();
|
|
82
|
+
expect(service).toBeInstanceOf(messaging_service_1.MessagingService);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('getOptions', () => {
|
|
86
|
+
it('returns last forRoot options', () => {
|
|
87
|
+
messaging_module_1.MessagingModule.forRoot({
|
|
88
|
+
systemPrompt: 'Custom',
|
|
89
|
+
model: 'gpt-4',
|
|
90
|
+
});
|
|
91
|
+
const opts = messaging_module_1.MessagingModule.getOptions();
|
|
92
|
+
expect(opts.systemPrompt).toBe('Custom');
|
|
93
|
+
expect(opts.model).toBe('gpt-4');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=messaging.module.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.module.test.js","sourceRoot":"","sources":["../src/messaging.module.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { IncomingMessage } from './types/message.types';
|
|
2
|
+
import type { IAIProvider } from '@hazeljs/ai';
|
|
3
|
+
import type { IConversationContextStore } from './store/conversation-context.interface';
|
|
4
|
+
import type { AgentHandler, IRAGSearch } from './types/response-handler.types';
|
|
5
|
+
export interface MessagingServiceOptions {
|
|
6
|
+
/** AI provider for LLM responses */
|
|
7
|
+
aiProvider?: IAIProvider;
|
|
8
|
+
/** System prompt for the bot */
|
|
9
|
+
systemPrompt?: string;
|
|
10
|
+
/** Model name (provider-specific) */
|
|
11
|
+
model?: string;
|
|
12
|
+
/** Temperature 0-1 */
|
|
13
|
+
temperature?: number;
|
|
14
|
+
/** Max tokens for response */
|
|
15
|
+
maxTokens?: number;
|
|
16
|
+
/** Max conversation turns to keep in context */
|
|
17
|
+
maxContextTurns?: number;
|
|
18
|
+
/** Custom handler - overrides everything when provided */
|
|
19
|
+
customHandler?: (msg: IncomingMessage) => Promise<string> | string;
|
|
20
|
+
/** Agent handler - CSR-style: tools, RAG, external APIs (e.g. csrService.chat) */
|
|
21
|
+
agentHandler?: AgentHandler;
|
|
22
|
+
/** RAG service - augments LLM with knowledge base search (when not using agentHandler) */
|
|
23
|
+
ragService?: IRAGSearch;
|
|
24
|
+
/** Number of RAG docs to retrieve (default: 5) */
|
|
25
|
+
ragTopK?: number;
|
|
26
|
+
/** Min similarity score for RAG results (0-1, default: 0.5) */
|
|
27
|
+
ragMinScore?: number;
|
|
28
|
+
/** Context store - defaults to memory; use Redis for horizontal scaling */
|
|
29
|
+
contextStore?: IConversationContextStore;
|
|
30
|
+
}
|
|
31
|
+
export declare class MessagingService {
|
|
32
|
+
private options;
|
|
33
|
+
private store;
|
|
34
|
+
constructor(options?: MessagingServiceOptions, contextStore?: IConversationContextStore);
|
|
35
|
+
/** Generate bot response for an incoming message */
|
|
36
|
+
handleMessage(message: IncomingMessage): Promise<string>;
|
|
37
|
+
/** Clear conversation history for a session */
|
|
38
|
+
clearSession(sessionId: string): Promise<void>;
|
|
39
|
+
/** Get current options */
|
|
40
|
+
getOptions(): MessagingServiceOptions;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=messaging.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.service.d.ts","sourceRoot":"","sources":["../src/messaging.service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AAExF,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAQ/E,MAAM,WAAW,uBAAuB;IACtC,oCAAoC;IACpC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACnE,kFAAkF;IAClF,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,0FAA0F;IAC1F,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,yBAAyB,CAAC;CAC1C;AAED,qBACa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CASX;IAEJ,OAAO,CAAC,KAAK,CAA4B;gBAE7B,OAAO,GAAE,uBAA4B,EAAE,YAAY,CAAC,EAAE,yBAAyB;IAc3F,oDAAoD;IAC9C,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IA8F9D,+CAA+C;IACzC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,0BAA0B;IAC1B,UAAU,IAAI,uBAAuB;CAGtC"}
|