@wabot-dev/framework 0.1.0-beta.1 → 0.1.0-beta.11

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.
Files changed (88) hide show
  1. package/dist/src/ai/deepseek/DeepSeekChatBotAdapter.js +12 -13
  2. package/dist/src/ai/openia/OpenaiChatBotAdapter.js +9 -7
  3. package/dist/src/channels/cmd/@cmd.js +0 -4
  4. package/dist/src/channels/cmd/CmdChannel.js +0 -4
  5. package/dist/src/channels/express/ExpressProvider.js +46 -0
  6. package/dist/src/channels/http/HttpServerProvider.js +31 -0
  7. package/dist/src/channels/{socket-io → socket}/@socket.js +0 -4
  8. package/dist/src/channels/{socket-io → socket}/SocketChannel.js +12 -11
  9. package/dist/src/channels/socket/SocketServerProvider.js +50 -0
  10. package/dist/src/channels/telegram/@telegram.js +0 -4
  11. package/dist/src/channels/telegram/TelegramChannel.js +0 -4
  12. package/dist/src/channels/wabot/WabotDevConnection.js +57 -0
  13. package/dist/src/channels/{whatsapp/WhatsAppDevSocketContracts.js → wabot/WabotDevSocketContracts.js} +3 -3
  14. package/dist/src/channels/whatsapp/@whatsapp.js +0 -4
  15. package/dist/src/channels/whatsapp/EnvWhatsAppRepository.js +49 -0
  16. package/dist/src/channels/whatsapp/PgWhatsAppRepository.js +41 -0
  17. package/dist/src/channels/whatsapp/WhatsApp.js +32 -0
  18. package/dist/src/channels/whatsapp/WhatsAppChannel.js +33 -32
  19. package/dist/src/channels/whatsapp/{WhatsAppConnection.js → WhatsAppReceiver.js} +4 -6
  20. package/dist/src/channels/whatsapp/WhatsAppReceiverByDevConnection.js +32 -0
  21. package/dist/src/channels/whatsapp/WhatsAppReceiverByWebHook.js +63 -0
  22. package/dist/src/channels/whatsapp/WhatsAppRepository.js +10 -0
  23. package/dist/src/channels/whatsapp/WhatsAppSender.js +95 -17
  24. package/dist/src/channels/whatsapp/WhatsAppSenderByCloudApi.js +124 -0
  25. package/dist/src/channels/whatsapp/WhatsAppSenderByDevConnection.js +61 -0
  26. package/dist/src/chatbot/ChatBotAdapter.js +1 -5
  27. package/dist/src/chatbot/metadata/@chatBot.js +0 -5
  28. package/dist/src/chatbot/metadata/ChatBotMetadataStore.js +0 -5
  29. package/dist/src/controller/metadata/ControllerMetadataStore.js +0 -2
  30. package/dist/src/controller/metadata/controller/@chatController.js +0 -2
  31. package/dist/src/core/IMessageContext.js +0 -2
  32. package/dist/src/env/WabotEnv.js +6 -0
  33. package/dist/src/error/CustomError.js +13 -0
  34. package/dist/src/index.d.ts +419 -201
  35. package/dist/src/index.js +54 -28
  36. package/dist/src/mindset/MindsetOperator.js +1 -3
  37. package/dist/src/mindset/metadata/MindsetMetadataStore.js +0 -2
  38. package/dist/src/mindset/metadata/mindsets/@mindset.js +0 -2
  39. package/dist/src/mindset/metadata/modules/@mindsetModule.js +0 -2
  40. package/dist/src/pre-made/module/authentication/requests/SendOneTimePasswordRequest.js +0 -2
  41. package/dist/src/pre-made/module/authentication/requests/ValidateOneTimePasswordRequest.js +0 -2
  42. package/dist/src/pre-made/module/html/HtmlModule.js +70 -0
  43. package/dist/src/pre-made/module/register-user/requests/RegisterUserWithEmailRequest.js +0 -2
  44. package/dist/src/pre-made/repository/chat/pg/PgChatMemory.js +1 -7
  45. package/dist/src/pre-made/repository/chat/pg/PgChatRepository.js +0 -5
  46. package/dist/src/pre-made/repository/user/pg/PgUserRepository.js +0 -5
  47. package/dist/src/repository/pg/PgCrudRepository.js +11 -1
  48. package/dist/src/rest-controller/metadata/@get.js +19 -0
  49. package/dist/src/rest-controller/metadata/@post.js +19 -0
  50. package/dist/src/rest-controller/metadata/@restController.js +15 -0
  51. package/dist/src/rest-controller/metadata/RestControllerMetadataStore.js +37 -0
  52. package/dist/src/rest-controller/runRestControllers.js +85 -0
  53. package/dist/src/server/prepareChatContainer.js +4 -4
  54. package/dist/src/server/runChannel.js +2 -10
  55. package/dist/src/server/runServer.js +0 -43
  56. package/dist/src/validation/metadata/@isBoolean.js +17 -0
  57. package/dist/src/validation/metadata/@isDate.js +17 -0
  58. package/dist/src/validation/metadata/@isNotEmpty.js +17 -0
  59. package/dist/src/validation/metadata/@isNumber.js +17 -0
  60. package/dist/src/validation/metadata/@isOptional.js +17 -0
  61. package/dist/src/validation/metadata/@isPresent.js +17 -0
  62. package/dist/src/validation/metadata/@isString.js +17 -0
  63. package/dist/src/validation/metadata/@max.js +18 -0
  64. package/dist/src/validation/metadata/@min.js +18 -0
  65. package/dist/src/validation/metadata/ValidationMetadataStore.js +55 -0
  66. package/dist/src/validation/validate.js +11 -0
  67. package/dist/src/validation/validators/validateIsBoolean.js +12 -0
  68. package/dist/src/validation/validators/validateIsDate.js +16 -0
  69. package/dist/src/validation/validators/validateIsNotEmpty.js +12 -0
  70. package/dist/src/validation/validators/validateIsNumber.js +12 -0
  71. package/dist/src/validation/validators/validateIsOptional.js +5 -0
  72. package/dist/src/validation/validators/validateIsPresent.js +12 -0
  73. package/dist/src/validation/validators/validateIsString.js +12 -0
  74. package/dist/src/validation/validators/validateMax.js +17 -0
  75. package/dist/src/validation/validators/validateMin.js +17 -0
  76. package/dist/src/validation/validators/validateModel.js +47 -0
  77. package/package.json +4 -6
  78. package/dist/src/channels/whatsapp/WhatsAppDevConnection.js +0 -69
  79. package/dist/src/channels/whatsapp/WhatsAppProdConnection.js +0 -39
  80. package/dist/src/controller/express/Express.js +0 -5
  81. package/dist/src/controller/socket.io/SocketIO.js +0 -5
  82. package/dist/src/mindset/metadata/params/@isOptional.js +0 -21
  83. package/dist/src/pre-made/repository/chat/sqlite/SqliteChatMemory.js +0 -23
  84. package/dist/src/pre-made/repository/chat/sqlite/SqliteChatRepository.js +0 -30
  85. package/dist/src/pre-made/repository/user/sqlite/SqliteUserRepository.js +0 -23
  86. package/dist/src/repository/sqlite/SqliteCrudRepository.js +0 -85
  87. package/dist/src/repository/sqlite/SqlitePersistentMapper.js +0 -17
  88. /package/dist/src/channels/{socket-io → socket}/SocketChannelConfig.js +0 -0
@@ -1,15 +1,13 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
2
  import { injectable } from '../../injection/index.js';
3
3
  import { OpenAI } from 'openai';
4
- import 'reflect-metadata';
5
- import '../../mindset/metadata/MindsetMetadataStore.js';
6
- import '../../core/chat/repository/IChatRepository.js';
7
- import '../../core/user/IUserRepository.js';
8
- import { MindsetOperator } from '../../mindset/MindsetOperator.js';
9
4
  import 'uuid';
10
5
  import '../../chatbot/metadata/ChatBotMetadataStore.js';
11
6
  import '../../chatbot/ChatBot.js';
12
7
  import { ChatBotAdapter } from '../../chatbot/ChatBotAdapter.js';
8
+ import 'reflect-metadata';
9
+ import '../../mindset/metadata/MindsetMetadataStore.js';
10
+ import { MindsetOperator } from '../../mindset/MindsetOperator.js';
13
11
 
14
12
  let DeepSeekChatBotAdapter = class DeepSeekChatBotAdapter extends ChatBotAdapter {
15
13
  deepSeek;
@@ -23,7 +21,7 @@ let DeepSeekChatBotAdapter = class DeepSeekChatBotAdapter extends ChatBotAdapter
23
21
  this.model = model || 'deepseek-chat';
24
22
  this.deepSeek = new OpenAI({
25
23
  apiKey: apiKey,
26
- baseURL: baseURL
24
+ baseURL: baseURL,
27
25
  });
28
26
  }
29
27
  validateEnvVariables(envVariables) {
@@ -38,14 +36,15 @@ let DeepSeekChatBotAdapter = class DeepSeekChatBotAdapter extends ChatBotAdapter
38
36
  const tools = (await this.mindset.allFunctionsDescriptors()).map((fn) => {
39
37
  const parameters = { ...fn.parameters, additionalProperties: false, type: 'object' };
40
38
  return {
41
- type: 'function', function: { name: fn.name, description: fn.description, parameters, strict: true }
39
+ type: 'function',
40
+ function: { name: fn.name, description: fn.description, parameters, strict: true },
42
41
  };
43
42
  });
44
43
  const response = await this.deepSeek.chat.completions.create({
45
44
  model: this.model,
46
45
  messages: [{ role: 'system', content: systemPrompt }, ...this.mapChatItems(chatItems)],
47
46
  tools: tools,
48
- tool_choice: 'auto'
47
+ tool_choice: 'auto',
49
48
  });
50
49
  let newChatItem;
51
50
  const { tool_calls: responseFunctionCall, content: responseText } = response.choices?.[0]?.message ?? {};
@@ -85,15 +84,15 @@ let DeepSeekChatBotAdapter = class DeepSeekChatBotAdapter extends ChatBotAdapter
85
84
  type: 'function',
86
85
  function: {
87
86
  name: itemData.content.name,
88
- arguments: JSON.stringify(itemData.content.arguments)
89
- }
90
- }
91
- ]
87
+ arguments: JSON.stringify(itemData.content.arguments),
88
+ },
89
+ },
90
+ ],
92
91
  });
93
92
  deepSeekInput.push({
94
93
  role: 'tool',
95
94
  tool_call_id: itemData.content.id,
96
- content: itemData.content.result
95
+ content: itemData.content.result,
97
96
  });
98
97
  }
99
98
  }
@@ -1,19 +1,19 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
2
  import { injectable } from '../../injection/index.js';
3
3
  import { OpenAI } from 'openai';
4
- import 'reflect-metadata';
5
- import '../../mindset/metadata/MindsetMetadataStore.js';
6
- import '../../core/chat/repository/IChatRepository.js';
7
- import '../../core/user/IUserRepository.js';
8
- import { MindsetOperator } from '../../mindset/MindsetOperator.js';
9
4
  import 'uuid';
10
5
  import '../../chatbot/metadata/ChatBotMetadataStore.js';
11
6
  import '../../chatbot/ChatBot.js';
12
7
  import { ChatBotAdapter } from '../../chatbot/ChatBotAdapter.js';
8
+ import 'reflect-metadata';
9
+ import '../../mindset/metadata/MindsetMetadataStore.js';
10
+ import { MindsetOperator } from '../../mindset/MindsetOperator.js';
11
+ import { Logger } from '../../logger/Logger.js';
13
12
 
14
13
  let OpenaiChatBotAdapter = class OpenaiChatBotAdapter extends ChatBotAdapter {
15
14
  openai = new OpenAI();
16
15
  model;
16
+ logger = new Logger('wabot:openai-chat-bot-adapter');
17
17
  constructor(mindset) {
18
18
  super(mindset);
19
19
  const model = process.env.OPENAI_CHAT_MODEL;
@@ -28,11 +28,13 @@ let OpenaiChatBotAdapter = class OpenaiChatBotAdapter extends ChatBotAdapter {
28
28
  const parameters = { ...fn.parameters, additionalProperties: false, type: 'object' };
29
29
  return { ...fn, type: 'function', parameters, strict: true };
30
30
  });
31
- const response = await this.openai.responses.create({
31
+ const request = {
32
32
  model: this.model,
33
33
  input: [{ role: 'system', content: systemPrompt }, ...this.mapChatItems(chatItems)],
34
34
  tools,
35
- });
35
+ };
36
+ this.logger.debug(`Call Api with Request: ${JSON.stringify(request)}`);
37
+ const response = await this.openai.responses.create(request);
36
38
  let newChatItem;
37
39
  if (response.output_text) {
38
40
  newChatItem = await this.buildBotMessageItem(response.output_text);
@@ -1,11 +1,7 @@
1
1
  import '../../controller/channel/ChatResolver.js';
2
2
  import '../../controller/channel/UserResolver.js';
3
3
  import { container } from '../../injection/index.js';
4
- import '../../core/chat/repository/IChatRepository.js';
5
- import '../../core/user/IUserRepository.js';
6
4
  import { ControllerMetadataStore } from '../../controller/metadata/ControllerMetadataStore.js';
7
- import 'express';
8
- import 'socket.io';
9
5
  import { CmdChannel } from './CmdChannel.js';
10
6
 
11
7
  function cmd() {
@@ -2,11 +2,7 @@ import { __decorate, __metadata } from 'tslib';
2
2
  import { ChatResolver } from '../../controller/channel/ChatResolver.js';
3
3
  import { UserResolver } from '../../controller/channel/UserResolver.js';
4
4
  import { injectable } from '../../injection/index.js';
5
- import '../../core/chat/repository/IChatRepository.js';
6
- import '../../core/user/IUserRepository.js';
7
5
  import '../../controller/metadata/ControllerMetadataStore.js';
8
- import 'express';
9
- import 'socket.io';
10
6
  import * as readline from 'readline';
11
7
 
12
8
  var CmdChannel_1;
@@ -0,0 +1,46 @@
1
+ import { __decorate, __metadata } from 'tslib';
2
+ import { HttpServerProvider } from '../http/HttpServerProvider.js';
3
+ import express from 'express';
4
+ import { singleton } from 'tsyringe';
5
+ import bodyParser from 'body-parser';
6
+ import { Logger } from '../../logger/Logger.js';
7
+
8
+ let ExpressProvider = class ExpressProvider {
9
+ httpServerProvider;
10
+ expressApp = null;
11
+ logger = new Logger('wabot:express');
12
+ constructor(httpServerProvider) {
13
+ this.httpServerProvider = httpServerProvider;
14
+ }
15
+ getExpress() {
16
+ if (!this.expressApp) {
17
+ this.expressApp = this.createExpress();
18
+ }
19
+ return this.expressApp;
20
+ }
21
+ listen() {
22
+ this.httpServerProvider.listen();
23
+ }
24
+ createExpress() {
25
+ const expressApp = express();
26
+ expressApp.use(bodyParser.json());
27
+ expressApp.use((req, res, next) => {
28
+ const start = process.hrtime();
29
+ res.on('finish', () => {
30
+ const [seconds, nanoseconds] = process.hrtime(start);
31
+ const ms = (seconds * 1000 + nanoseconds / 1e6).toFixed(2);
32
+ this.logger.trace(`${req.method} ${req.originalUrl} ${res.statusCode} - ${ms}ms`);
33
+ });
34
+ next();
35
+ });
36
+ const httpServer = this.httpServerProvider.getHttpServer();
37
+ httpServer.on('request', expressApp);
38
+ return expressApp;
39
+ }
40
+ };
41
+ ExpressProvider = __decorate([
42
+ singleton(),
43
+ __metadata("design:paramtypes", [HttpServerProvider])
44
+ ], ExpressProvider);
45
+
46
+ export { ExpressProvider };
@@ -0,0 +1,31 @@
1
+ import { __decorate } from 'tslib';
2
+ import { Logger } from '../../logger/Logger.js';
3
+ import { Server } from 'http';
4
+ import { singleton } from 'tsyringe';
5
+
6
+ let HttpServerProvider = class HttpServerProvider {
7
+ server = null;
8
+ listening = false;
9
+ logger = new Logger('wabot:http');
10
+ getHttpServer() {
11
+ if (!this.server) {
12
+ this.server = new Server();
13
+ }
14
+ return this.server;
15
+ }
16
+ listen() {
17
+ if (!this.server || this.listening) {
18
+ return;
19
+ }
20
+ this.listening = true;
21
+ const PORT = process.env.PORT || 3000;
22
+ this.server.listen(PORT, () => {
23
+ this.logger.info(`server listenig on port ${PORT}`);
24
+ });
25
+ }
26
+ };
27
+ HttpServerProvider = __decorate([
28
+ singleton()
29
+ ], HttpServerProvider);
30
+
31
+ export { HttpServerProvider };
@@ -1,11 +1,7 @@
1
1
  import '../../controller/channel/ChatResolver.js';
2
2
  import '../../controller/channel/UserResolver.js';
3
3
  import { container } from '../../injection/index.js';
4
- import '../../core/chat/repository/IChatRepository.js';
5
- import '../../core/user/IUserRepository.js';
6
4
  import { ControllerMetadataStore } from '../../controller/metadata/ControllerMetadataStore.js';
7
- import 'express';
8
- import 'socket.io';
9
5
  import { SocketChannel } from './SocketChannel.js';
10
6
  import { SocketChannelConfig } from './SocketChannelConfig.js';
11
7
 
@@ -1,26 +1,25 @@
1
- import { __decorate, __param, __metadata } from 'tslib';
1
+ import { __decorate, __metadata } from 'tslib';
2
2
  import { SocketChannelConfig } from './SocketChannelConfig.js';
3
- import { injectable, inject } from '../../injection/index.js';
3
+ import { injectable } from '../../injection/index.js';
4
4
  import { ChatResolver } from '../../controller/channel/ChatResolver.js';
5
5
  import { UserResolver } from '../../controller/channel/UserResolver.js';
6
- import '../../core/chat/repository/IChatRepository.js';
7
- import '../../core/user/IUserRepository.js';
8
6
  import '../../controller/metadata/ControllerMetadataStore.js';
9
- import 'express';
10
- import { SocketIoApp } from '../../controller/socket.io/SocketIO.js';
7
+ import { SocketServerProvider } from './SocketServerProvider.js';
11
8
 
12
9
  var SocketChannel_1;
13
10
  let SocketChannel = SocketChannel_1 = class SocketChannel {
14
11
  config;
15
- server;
12
+ socketServerProvider;
16
13
  chatResolver;
17
14
  userResolver;
18
15
  callBack = null;
19
- constructor(config, server, chatResolver, userResolver) {
16
+ server;
17
+ constructor(config, socketServerProvider, chatResolver, userResolver) {
20
18
  this.config = config;
21
- this.server = server;
19
+ this.socketServerProvider = socketServerProvider;
22
20
  this.chatResolver = chatResolver;
23
21
  this.userResolver = userResolver;
22
+ this.server = this.socketServerProvider.getSocketServer();
24
23
  }
25
24
  listen(callback) {
26
25
  this.callBack = callback;
@@ -66,12 +65,14 @@ let SocketChannel = SocketChannel_1 = class SocketChannel {
66
65
  });
67
66
  });
68
67
  });
68
+ this.socketServerProvider.listen();
69
69
  }
70
70
  };
71
71
  SocketChannel = SocketChannel_1 = __decorate([
72
72
  injectable(),
73
- __param(1, inject(SocketIoApp)),
74
- __metadata("design:paramtypes", [SocketChannelConfig, Function, ChatResolver,
73
+ __metadata("design:paramtypes", [SocketChannelConfig,
74
+ SocketServerProvider,
75
+ ChatResolver,
75
76
  UserResolver])
76
77
  ], SocketChannel);
77
78
 
@@ -0,0 +1,50 @@
1
+ import { __decorate, __metadata } from 'tslib';
2
+ import { Logger } from '../../logger/Logger.js';
3
+ import { HttpServerProvider } from '../http/HttpServerProvider.js';
4
+ import { Server } from 'socket.io';
5
+ import { singleton } from 'tsyringe';
6
+
7
+ let SocketServerProvider = class SocketServerProvider {
8
+ httpServerProvider;
9
+ socketServer = null;
10
+ logger = new Logger('wabot:socket');
11
+ constructor(httpServerProvider) {
12
+ this.httpServerProvider = httpServerProvider;
13
+ }
14
+ getSocketServer() {
15
+ if (!this.socketServer) {
16
+ this.socketServer = this.createSocketServer();
17
+ }
18
+ return this.socketServer;
19
+ }
20
+ listen() {
21
+ this.httpServerProvider.listen();
22
+ }
23
+ createSocketServer() {
24
+ const httpServer = this.httpServerProvider.getHttpServer();
25
+ const socketServer = new Server(httpServer, {
26
+ cors: {
27
+ origin: '*',
28
+ },
29
+ });
30
+ socketServer.on('connection', (socket) => {
31
+ this.logger.trace(`socket:${socket.id} connection`);
32
+ socket.onAny((event) => {
33
+ this.logger.trace(`socket:${socket.id} emmits ${event}`);
34
+ });
35
+ socket.on('disconnect', (reason) => {
36
+ this.logger.trace(`socket:${socket.id} disconnect with reason: ${reason}`);
37
+ });
38
+ });
39
+ httpServer.on('listening', () => {
40
+ this.logger.info(`socket server listening`);
41
+ });
42
+ return socketServer;
43
+ }
44
+ };
45
+ SocketServerProvider = __decorate([
46
+ singleton(),
47
+ __metadata("design:paramtypes", [HttpServerProvider])
48
+ ], SocketServerProvider);
49
+
50
+ export { SocketServerProvider };
@@ -1,11 +1,7 @@
1
1
  import { container } from '../../injection/index.js';
2
2
  import '../../controller/channel/ChatResolver.js';
3
3
  import '../../controller/channel/UserResolver.js';
4
- import '../../core/chat/repository/IChatRepository.js';
5
- import '../../core/user/IUserRepository.js';
6
4
  import { ControllerMetadataStore } from '../../controller/metadata/ControllerMetadataStore.js';
7
- import 'express';
8
- import 'socket.io';
9
5
  import { TelegramChannel } from './TelegramChannel.js';
10
6
  import { TelegramChannelConfig } from './TelegramChannelConfig.js';
11
7
 
@@ -2,11 +2,7 @@ import { __decorate, __metadata } from 'tslib';
2
2
  import { ChatResolver } from '../../controller/channel/ChatResolver.js';
3
3
  import { UserResolver } from '../../controller/channel/UserResolver.js';
4
4
  import { injectable } from '../../injection/index.js';
5
- import '../../core/chat/repository/IChatRepository.js';
6
- import '../../core/user/IUserRepository.js';
7
5
  import '../../controller/metadata/ControllerMetadataStore.js';
8
- import 'express';
9
- import 'socket.io';
10
6
  import { Bot } from 'grammy';
11
7
  import { TelegramChannelConfig } from './TelegramChannelConfig.js';
12
8
 
@@ -0,0 +1,57 @@
1
+ import { __decorate, __metadata } from 'tslib';
2
+ import { singleton } from '../../injection/index.js';
3
+ import { Logger } from '../../logger/Logger.js';
4
+ import { io } from 'socket.io-client';
5
+ import { devEmitEvent } from './WabotDevSocketContracts.js';
6
+
7
+ var WabotDevConnection_1;
8
+ let WabotDevConnection = WabotDevConnection_1 = class WabotDevConnection {
9
+ devProxy;
10
+ devProxySocket = null;
11
+ devToken;
12
+ logger = new Logger('wabot:dev-connection');
13
+ static isTokenAvailable() {
14
+ return !!process.env.WABOT_DEV_TOKEN;
15
+ }
16
+ constructor() {
17
+ if (!WabotDevConnection_1.isTokenAvailable()) {
18
+ throw new Error('WABOT_DEV_TOKEN is not set in environment variables');
19
+ }
20
+ this.devToken = process.env.WABOT_DEV_TOKEN;
21
+ this.devProxy = process.env.WABOT_DEV_PROXY ?? 'https://proxy.wabot.dev';
22
+ }
23
+ async getSocket() {
24
+ if (this.devProxySocket) {
25
+ return this.devProxySocket;
26
+ }
27
+ return new Promise((resolve, reject) => {
28
+ const devProxySocket = io(this.devProxy, { autoConnect: false });
29
+ devProxySocket.on('connect', async () => {
30
+ try {
31
+ const req = {
32
+ token: this.devToken,
33
+ };
34
+ this.logger.debug('dev connection request');
35
+ const ack = await devProxySocket.emitWithAck(devEmitEvent.DEV_CONNECTION, req);
36
+ if (ack != 'OK') {
37
+ return reject(new Error('Dev connection failed'));
38
+ }
39
+ this.logger.debug('success dev connection');
40
+ this.devProxySocket = devProxySocket;
41
+ resolve(devProxySocket);
42
+ }
43
+ catch (err) {
44
+ this.logger.error(err);
45
+ reject(err);
46
+ }
47
+ });
48
+ devProxySocket.connect();
49
+ });
50
+ }
51
+ };
52
+ WabotDevConnection = WabotDevConnection_1 = __decorate([
53
+ singleton(),
54
+ __metadata("design:paramtypes", [])
55
+ ], WabotDevConnection);
56
+
57
+ export { WabotDevConnection };
@@ -1,10 +1,10 @@
1
- const devWhatsAppListentEvent = {
1
+ const devListentEvent = {
2
2
  DEV_WATSAPP_WEBHOOK: 'dev-whatsapp-webhook',
3
3
  };
4
- const devWhatsappEmitEvent = {
4
+ const devEmitEvent = {
5
5
  DEV_CONNECTION: 'dev-connection',
6
6
  DEV_SEND_WHATSAPP: 'dev-send-whatsapp',
7
7
  DEV_SEND_WHATSAPP_TEMPLATE: 'dev-send-whatsapp-template',
8
8
  };
9
9
 
10
- export { devWhatsAppListentEvent, devWhatsappEmitEvent };
10
+ export { devEmitEvent, devListentEvent };
@@ -2,11 +2,7 @@ import { container } from '../../injection/index.js';
2
2
  import { WhatsappChannelConfig } from './WhatsAppChannelConfig.js';
3
3
  import '../../controller/channel/ChatResolver.js';
4
4
  import '../../controller/channel/UserResolver.js';
5
- import '../../core/chat/repository/IChatRepository.js';
6
- import '../../core/user/IUserRepository.js';
7
5
  import { ControllerMetadataStore } from '../../controller/metadata/ControllerMetadataStore.js';
8
- import 'express';
9
- import 'socket.io';
10
6
  import { WhatsAppChannel } from './WhatsAppChannel.js';
11
7
 
12
8
  function whatsapp(config) {
@@ -0,0 +1,49 @@
1
+ import { __decorate, __metadata } from 'tslib';
2
+ import { singleton } from '../../injection/index.js';
3
+ import { WhatsApp } from './WhatsApp.js';
4
+ import { WabotEnv } from '../../env/WabotEnv.js';
5
+
6
+ let EnvWhatsAppRepository = class EnvWhatsAppRepository {
7
+ env;
8
+ constructor(env) {
9
+ this.env = env;
10
+ }
11
+ async findBySlug(slug) {
12
+ const whatsApp = this.getFromEnvVars();
13
+ if (whatsApp.getSlug() !== slug) {
14
+ throw new Error(`Not found WhatsApp configuration in env variables for the required slug '${slug}'`);
15
+ }
16
+ return whatsApp;
17
+ }
18
+ async findByBusinessNumber(number) {
19
+ const whatsApp = this.getFromEnvVars();
20
+ if (!whatsApp.getBussinessNumber(number)) {
21
+ throw new Error(`Not found WhatsApp configuration in env variables for the required number '${number}'`);
22
+ }
23
+ return whatsApp;
24
+ }
25
+ getFromEnvVars() {
26
+ const whatsApp = new WhatsApp({
27
+ verifyToken: this.env.requireString('WHATSAPP_HOOK_TOKEN'),
28
+ slug: this.env.requireString('WHATSAPP_HOOK_SLUG'),
29
+ appSecret: this.env.requireString('WHATSAPP_APP_SECRET'),
30
+ businessAccount: {
31
+ id: this.env.requireString('WHATSAPP_ACCOUNT_ID'),
32
+ },
33
+ accessToken: this.env.requireString('WHATSAPP_ACCESS_TOKEN'),
34
+ businessNumbers: [
35
+ {
36
+ id: this.env.requireString('WHATSAPP_BUSINESS_NUMBER_ID'),
37
+ number: this.env.requireString('WHATSAPP_BUSINESS_NUMBER'),
38
+ },
39
+ ],
40
+ });
41
+ return whatsApp;
42
+ }
43
+ };
44
+ EnvWhatsAppRepository = __decorate([
45
+ singleton(),
46
+ __metadata("design:paramtypes", [WabotEnv])
47
+ ], EnvWhatsAppRepository);
48
+
49
+ export { EnvWhatsAppRepository };
@@ -0,0 +1,41 @@
1
+ import { __decorate, __metadata } from 'tslib';
2
+ import { Pool } from 'pg';
3
+ import { WhatsApp } from './WhatsApp.js';
4
+ import { singleton } from '../../injection/index.js';
5
+ import { PgCrudRepository } from '../../repository/pg/PgCrudRepository.js';
6
+
7
+ let PgWhatsAppRepository = class PgWhatsAppRepository extends PgCrudRepository {
8
+ constructor(pool) {
9
+ super(pool, {
10
+ table: 'whatsapp',
11
+ constructor: WhatsApp,
12
+ schema: 'wabot',
13
+ });
14
+ }
15
+ async findBySlug(slug) {
16
+ const sql = `
17
+ SELECT ${this.columns}
18
+ FROM ${this.table}
19
+ WHERE data @> $1
20
+ LIMIT 1
21
+ `;
22
+ const items = await this.query(sql, [JSON.stringify({ slug })]);
23
+ return items.at(0) ?? null;
24
+ }
25
+ async findByBusinessNumber(number) {
26
+ const sql = `
27
+ SELECT ${this.columns}
28
+ FROM ${this.table}
29
+ WHERE data->'businessNumbers' @> $1
30
+ LIMIT 1
31
+ `;
32
+ const items = await this.query(sql, [JSON.stringify([{ number }])]);
33
+ return items.at(0) ?? null;
34
+ }
35
+ };
36
+ PgWhatsAppRepository = __decorate([
37
+ singleton(),
38
+ __metadata("design:paramtypes", [Pool])
39
+ ], PgWhatsAppRepository);
40
+
41
+ export { PgWhatsAppRepository };
@@ -0,0 +1,32 @@
1
+ import '../../core/chat/repository/IChatRepository.js';
2
+ import { Persistent } from '../../core/Persistent.js';
3
+ import '../../core/user/IUserRepository.js';
4
+
5
+ class WhatsApp extends Persistent {
6
+ getVerifyToken() {
7
+ return this.data.verifyToken;
8
+ }
9
+ getSlug() {
10
+ return this.data.slug;
11
+ }
12
+ getBusinessAccount() {
13
+ return this.data.businessAccount;
14
+ }
15
+ getAppSecret() {
16
+ return this.data.appSecret;
17
+ }
18
+ getBusinessNumbers() {
19
+ return this.data.businessNumbers;
20
+ }
21
+ getAccessToken() {
22
+ return this.data.accessToken;
23
+ }
24
+ hasBusinessNumber(number) {
25
+ return this.data.businessNumbers.some((x) => x.number === number);
26
+ }
27
+ getBussinessNumber(number) {
28
+ return this.data.businessNumbers.find((x) => x.number === number) ?? null;
29
+ }
30
+ }
31
+
32
+ export { WhatsApp };
@@ -2,52 +2,54 @@ import { __decorate, __metadata } from 'tslib';
2
2
  import { ChatResolver } from '../../controller/channel/ChatResolver.js';
3
3
  import { UserResolver } from '../../controller/channel/UserResolver.js';
4
4
  import { injectable } from '../../injection/index.js';
5
- import '../../core/chat/repository/IChatRepository.js';
6
- import '../../core/user/IUserRepository.js';
7
5
  import '../../controller/metadata/ControllerMetadataStore.js';
8
- import 'express';
9
- import 'socket.io';
10
- import { WabotEnv } from '../../env/WabotEnv.js';
11
6
  import { Logger } from '../../logger/Logger.js';
12
7
  import { WhatsappChannelConfig } from './WhatsAppChannelConfig.js';
13
- import { WhatsAppDevConnection } from './WhatsAppDevConnection.js';
14
- import { WhatsAppProdConnection } from './WhatsAppProdConnection.js';
8
+ import { WhatsAppReceiver } from './WhatsAppReceiver.js';
9
+ import { WhatsAppSender } from './WhatsAppSender.js';
15
10
 
16
11
  let WhatsAppChannel = class WhatsAppChannel {
17
12
  config;
18
13
  chatResolver;
19
14
  userResolver;
20
- wabotEnv;
15
+ sender;
16
+ receiver;
21
17
  logger = new Logger('wabot:whatsapp-channel');
22
- whatsAppConection;
23
- constructor(config, chatResolver, userResolver, wabotEnv, devConnection, prodConnection) {
18
+ constructor(config, chatResolver, userResolver, sender, receiver) {
24
19
  this.config = config;
25
20
  this.chatResolver = chatResolver;
26
21
  this.userResolver = userResolver;
27
- this.wabotEnv = wabotEnv;
28
- this.whatsAppConection = this.wabotEnv.isProduction() ? prodConnection : devConnection;
22
+ this.sender = sender;
23
+ this.receiver = receiver;
29
24
  }
30
25
  listen(callback) {
31
- this.whatsAppConection.listenMessage(this.config.number, async (message) => {
32
- try {
33
- const chat = await this.chatResolver.resolve(message.chatConnection);
34
- const user = await this.userResolver.resolve(message.userConnection);
35
- callback({
36
- chat,
37
- user,
38
- message,
39
- reply: (replyMessage) => {
40
- this.whatsAppConection.sendWhatsApp(this.config.number, message.userConnection.id, replyMessage);
41
- },
42
- });
43
- }
44
- catch (err) {
45
- this.logger.error(err);
46
- }
26
+ this.receiver.listenMessage({
27
+ to: this.config.number,
28
+ listener: async (message) => {
29
+ try {
30
+ const chat = await this.chatResolver.resolve(message.chatConnection);
31
+ const user = await this.userResolver.resolve(message.userConnection);
32
+ callback({
33
+ chat,
34
+ user,
35
+ message,
36
+ reply: (replyMessage) => {
37
+ this.sender.sendWhatsApp({
38
+ from: this.config.number,
39
+ to: message.userConnection.id,
40
+ message: replyMessage,
41
+ });
42
+ },
43
+ });
44
+ }
45
+ catch (err) {
46
+ this.logger.error(err);
47
+ }
48
+ },
47
49
  });
48
50
  }
49
51
  connect() {
50
- this.whatsAppConection.connect();
52
+ this.receiver.connect();
51
53
  }
52
54
  };
53
55
  WhatsAppChannel = __decorate([
@@ -55,9 +57,8 @@ WhatsAppChannel = __decorate([
55
57
  __metadata("design:paramtypes", [WhatsappChannelConfig,
56
58
  ChatResolver,
57
59
  UserResolver,
58
- WabotEnv,
59
- WhatsAppDevConnection,
60
- WhatsAppProdConnection])
60
+ WhatsAppSender,
61
+ WhatsAppReceiver])
61
62
  ], WhatsAppChannel);
62
63
 
63
64
  export { WhatsAppChannel };