@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
package/dist/src/index.js CHANGED
@@ -1,27 +1,37 @@
1
- export { OpenaiChatBotAdapter } from './ai/openia/OpenaiChatBotAdapter.js';
2
1
  export { DeepSeekChatBotAdapter } from './ai/deepseek/DeepSeekChatBotAdapter.js';
2
+ export { OpenaiChatBotAdapter } from './ai/openia/OpenaiChatBotAdapter.js';
3
3
  export { cmd } from './channels/cmd/@cmd.js';
4
4
  export { CmdChannel } from './channels/cmd/CmdChannel.js';
5
+ export { ExpressProvider } from './channels/express/ExpressProvider.js';
6
+ export { HttpServerProvider } from './channels/http/HttpServerProvider.js';
7
+ export { socket } from './channels/socket/@socket.js';
8
+ export { SocketChannel } from './channels/socket/SocketChannel.js';
9
+ export { SocketChannelConfig } from './channels/socket/SocketChannelConfig.js';
10
+ export { SocketServerProvider } from './channels/socket/SocketServerProvider.js';
5
11
  export { telegram } from './channels/telegram/@telegram.js';
6
12
  export { TelegramChannelConfig } from './channels/telegram/TelegramChannelConfig.js';
7
13
  export { TelegramChannel } from './channels/telegram/TelegramChannel.js';
8
14
  export { whatsapp } from './channels/whatsapp/@whatsapp.js';
15
+ export { WhatsApp } from './channels/whatsapp/WhatsApp.js';
9
16
  export { WhatsAppChannel } from './channels/whatsapp/WhatsAppChannel.js';
10
17
  export { WhatsappChannelConfig } from './channels/whatsapp/WhatsAppChannelConfig.js';
11
- export { WhatsAppConnection } from './channels/whatsapp/WhatsAppConnection.js';
12
- export { WhatsAppDevConnection } from './channels/whatsapp/WhatsAppDevConnection.js';
13
- export { devWhatsAppListentEvent, devWhatsappEmitEvent } from './channels/whatsapp/WhatsAppDevSocketContracts.js';
14
- export { WhatsAppProdConnection } from './channels/whatsapp/WhatsAppProdConnection.js';
18
+ export { WhatsAppReceiver } from './channels/whatsapp/WhatsAppReceiver.js';
19
+ export { WhatsAppReceiverByDevConnection } from './channels/whatsapp/WhatsAppReceiverByDevConnection.js';
20
+ export { WhatsAppReceiverByWebHook } from './channels/whatsapp/WhatsAppReceiverByWebHook.js';
21
+ export { WhatsAppRepository } from './channels/whatsapp/WhatsAppRepository.js';
15
22
  export { WhatsAppSender } from './channels/whatsapp/WhatsAppSender.js';
16
- export { socket } from './channels/socket-io/@socket.js';
17
- export { SocketChannel } from './channels/socket-io/SocketChannel.js';
18
- export { SocketChannelConfig } from './channels/socket-io/SocketChannelConfig.js';
23
+ export { WhatsAppSenderByDevConnection } from './channels/whatsapp/WhatsAppSenderByDevConnection.js';
24
+ export { WhatsAppSenderByCloudApi } from './channels/whatsapp/WhatsAppSenderByCloudApi.js';
25
+ export { PgWhatsAppRepository } from './channels/whatsapp/PgWhatsAppRepository.js';
26
+ export { EnvWhatsAppRepository } from './channels/whatsapp/EnvWhatsAppRepository.js';
19
27
  export { chatBot } from './chatbot/metadata/@chatBot.js';
20
28
  export { ChatBotMetadataStore } from './chatbot/metadata/ChatBotMetadataStore.js';
21
- export { mindsetFunction } from './mindset/metadata/functions/@mindsetFunction.js';
22
- export { MINDSET_FUNCTION_DECORATION_FUNCTION } from './mindset/metadata/functions/decoratorNames.js';
23
- export { mindset } from './mindset/metadata/mindsets/@mindset.js';
24
- export { MINDSET_DECORATION_MINDSET } from './mindset/metadata/mindsets/decoratorNames.js';
29
+ export { ChatBot } from './chatbot/ChatBot.js';
30
+ export { ChatBotAdapter } from './chatbot/ChatBotAdapter.js';
31
+ export { ChatResolver } from './controller/channel/ChatResolver.js';
32
+ export { UserResolver } from './controller/channel/UserResolver.js';
33
+ export { chatController } from './controller/metadata/controller/@chatController.js';
34
+ export { ControllerMetadataStore } from './controller/metadata/ControllerMetadataStore.js';
25
35
  export { ChatMemory } from './core/chat/repository/IChatMemory.js';
26
36
  export { ChatRepository } from './core/chat/repository/IChatRepository.js';
27
37
  export { Chat } from './core/chat/Chat.js';
@@ -30,23 +40,18 @@ export { User } from './core/user/User.js';
30
40
  export { UserRepository } from './core/user/IUserRepository.js';
31
41
  export { MessageContext } from './core/IMessageContext.js';
32
42
  export { Persistent } from './core/Persistent.js';
43
+ export { container, inject, injectable, singleton } from './injection/index.js';
44
+ export { mindsetFunction } from './mindset/metadata/functions/@mindsetFunction.js';
45
+ export { MINDSET_FUNCTION_DECORATION_FUNCTION } from './mindset/metadata/functions/decoratorNames.js';
46
+ export { mindset } from './mindset/metadata/mindsets/@mindset.js';
47
+ export { MINDSET_DECORATION_MINDSET } from './mindset/metadata/mindsets/decoratorNames.js';
33
48
  export { mindsetModule } from './mindset/metadata/modules/@mindsetModule.js';
34
49
  export { MINDSET_MODULE_DECORATION_MODULE } from './mindset/metadata/modules/decoratorNames.js';
35
- export { isOptional } from './mindset/metadata/params/@isOptional.js';
36
50
  export { param } from './mindset/metadata/params/@param.js';
37
51
  export { PARAM_DECORATION_IS_OPTIONAL, PARAM_DECORATION_PARAM } from './mindset/metadata/params/decoratorNames.js';
38
- export { Mindset } from './mindset/IMindset.js';
39
52
  export { MindsetMetadataStore } from './mindset/metadata/MindsetMetadataStore.js';
53
+ export { Mindset } from './mindset/IMindset.js';
40
54
  export { MindsetOperator } from './mindset/MindsetOperator.js';
41
- export { ChatBot } from './chatbot/ChatBot.js';
42
- export { ChatBotAdapter } from './chatbot/ChatBotAdapter.js';
43
- export { ChatResolver } from './controller/channel/ChatResolver.js';
44
- export { UserResolver } from './controller/channel/UserResolver.js';
45
- export { chatController } from './controller/metadata/controller/@chatController.js';
46
- export { ControllerMetadataStore } from './controller/metadata/ControllerMetadataStore.js';
47
- export { ExpressApp } from './controller/express/Express.js';
48
- export { SocketIoApp } from './controller/socket.io/SocketIO.js';
49
- export { container, inject, injectable, singleton } from './injection/index.js';
50
55
  export { prepareChatContainer } from './server/prepareChatContainer.js';
51
56
  export { runChannel } from './server/runChannel.js';
52
57
  export { runServer } from './server/runServer.js';
@@ -55,21 +60,42 @@ export { ValidateOneTimePasswordRequest } from './pre-made/module/authentication
55
60
  export { AuthenticationModule } from './pre-made/module/authentication/AuthenticationModule.js';
56
61
  export { RegisterUserWithEmailRequest } from './pre-made/module/register-user/requests/RegisterUserWithEmailRequest.js';
57
62
  export { RegisterUserModule } from './pre-made/module/register-user/RegisterUserModule.js';
63
+ export { HtmlModule } from './pre-made/module/html/HtmlModule.js';
58
64
  export { EmailService } from './pre-made/service/EmailService.js';
59
65
  export { OtpService } from './pre-made/service/OtpService.js';
60
66
  export { PgUserRepository } from './pre-made/repository/user/pg/PgUserRepository.js';
61
67
  export { RamUserRepository } from './pre-made/repository/user/ram/RamUserRepository.js';
62
- export { SqliteUserRepository } from './pre-made/repository/user/sqlite/SqliteUserRepository.js';
63
68
  export { PgChatRepository } from './pre-made/repository/chat/pg/PgChatRepository.js';
64
69
  export { PgChatMemory } from './pre-made/repository/chat/pg/PgChatMemory.js';
65
- export { SqliteChatMemory } from './pre-made/repository/chat/sqlite/SqliteChatMemory.js';
66
- export { SqliteChatRepository } from './pre-made/repository/chat/sqlite/SqliteChatRepository.js';
67
70
  export { RamChatMemory } from './pre-made/repository/chat/ram/RamChatMemory.js';
68
71
  export { RamChatRepository } from './pre-made/repository/chat/ram/RamChatRepository.js';
69
72
  export { PgCrudRepository } from './repository/pg/PgCrudRepository.js';
70
73
  export { PgRepositoryBase } from './repository/pg/PgRepositoryBase.js';
71
- export { SqliteCrudRepository } from './repository/sqlite/SqliteCrudRepository.js';
72
- export { SqlitePersistentMapper, sqliteMapperFor } from './repository/sqlite/SqlitePersistentMapper.js';
73
74
  export { Logger } from './logger/Logger.js';
74
75
  export { WabotEnv } from './env/WabotEnv.js';
76
+ export { get } from './rest-controller/metadata/@get.js';
77
+ export { post } from './rest-controller/metadata/@post.js';
78
+ export { restController } from './rest-controller/metadata/@restController.js';
79
+ export { RestControllerMetadataStore } from './rest-controller/metadata/RestControllerMetadataStore.js';
80
+ export { runRestControllers } from './rest-controller/runRestControllers.js';
81
+ export { isBoolean } from './validation/metadata/@isBoolean.js';
82
+ export { isDate } from './validation/metadata/@isDate.js';
83
+ export { isNotEmpty } from './validation/metadata/@isNotEmpty.js';
84
+ export { isNumber } from './validation/metadata/@isNumber.js';
85
+ export { isOptional } from './validation/metadata/@isOptional.js';
86
+ export { isPresent } from './validation/metadata/@isPresent.js';
87
+ export { isString } from './validation/metadata/@isString.js';
88
+ export { max } from './validation/metadata/@max.js';
89
+ export { min } from './validation/metadata/@min.js';
90
+ export { ValidationMetadataStore } from './validation/metadata/ValidationMetadataStore.js';
91
+ export { validateIsBoolean } from './validation/validators/validateIsBoolean.js';
92
+ export { validateIsDate } from './validation/validators/validateIsDate.js';
93
+ export { validateIsNotEmpty } from './validation/validators/validateIsNotEmpty.js';
94
+ export { validateIsNumber } from './validation/validators/validateIsNumber.js';
95
+ export { validateIsString } from './validation/validators/validateIsString.js';
96
+ export { validateMax } from './validation/validators/validateMax.js';
97
+ export { validateMin } from './validation/validators/validateMin.js';
98
+ export { validateIsPresent } from './validation/validators/validateIsPresent.js';
99
+ export { validateModel } from './validation/validators/validateModel.js';
100
+ export { validate } from './validation/validate.js';
75
101
  export { Container } from './injection/Container.js';
@@ -1,8 +1,6 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
2
  import { injectable } from '../injection/index.js';
3
3
  import { Mindset } from './IMindset.js';
4
- import '../core/chat/repository/IChatRepository.js';
5
- import '../core/user/IUserRepository.js';
6
4
  import { MindsetMetadataStore } from './metadata/MindsetMetadataStore.js';
7
5
  import { Container } from '../injection/Container.js';
8
6
 
@@ -62,7 +60,7 @@ let MindsetOperator = class MindsetOperator {
62
60
  ...prev,
63
61
  [param.name]: this.toolParam(param),
64
62
  }), {}),
65
- required: fn.params.filter((param) => !param.config.optional).map((param) => param.name)
63
+ required: fn.params.filter((param) => !param.config.optional).map((param) => param.name),
66
64
  },
67
65
  };
68
66
  }
@@ -1,7 +1,5 @@
1
1
  import { __decorate } from 'tslib';
2
2
  import { singleton } from '../../injection/index.js';
3
- import '../../core/chat/repository/IChatRepository.js';
4
- import '../../core/user/IUserRepository.js';
5
3
  import { MINDSET_FUNCTION_DECORATION_FUNCTION } from './functions/decoratorNames.js';
6
4
  import { MINDSET_DECORATION_MINDSET } from './mindsets/decoratorNames.js';
7
5
  import { MINDSET_MODULE_DECORATION_MODULE } from './modules/decoratorNames.js';
@@ -1,6 +1,4 @@
1
1
  import 'reflect-metadata';
2
- import '../../../core/chat/repository/IChatRepository.js';
3
- import '../../../core/user/IUserRepository.js';
4
2
  import { container, injectable } from '../../../injection/index.js';
5
3
  import { MindsetMetadataStore } from '../MindsetMetadataStore.js';
6
4
  import { MINDSET_DECORATION_MINDSET } from './decoratorNames.js';
@@ -1,7 +1,5 @@
1
1
  import 'reflect-metadata';
2
2
  import { container, injectable } from '../../../injection/index.js';
3
- import '../../../core/chat/repository/IChatRepository.js';
4
- import '../../../core/user/IUserRepository.js';
5
3
  import { MindsetMetadataStore } from '../MindsetMetadataStore.js';
6
4
  import { MINDSET_MODULE_DECORATION_MODULE } from './decoratorNames.js';
7
5
 
@@ -2,8 +2,6 @@ import { __decorate, __metadata } from 'tslib';
2
2
  import 'reflect-metadata';
3
3
  import '../../../../injection/index.js';
4
4
  import '../../../../mindset/metadata/MindsetMetadataStore.js';
5
- import '../../../../core/chat/repository/IChatRepository.js';
6
- import '../../../../core/user/IUserRepository.js';
7
5
  import { param } from '../../../../mindset/metadata/params/@param.js';
8
6
  import '../../../../mindset/MindsetOperator.js';
9
7
 
@@ -2,8 +2,6 @@ import { __decorate, __metadata } from 'tslib';
2
2
  import 'reflect-metadata';
3
3
  import '../../../../injection/index.js';
4
4
  import '../../../../mindset/metadata/MindsetMetadataStore.js';
5
- import '../../../../core/chat/repository/IChatRepository.js';
6
- import '../../../../core/user/IUserRepository.js';
7
5
  import { param } from '../../../../mindset/metadata/params/@param.js';
8
6
  import '../../../../mindset/MindsetOperator.js';
9
7
 
@@ -0,0 +1,70 @@
1
+ import { __decorate, __metadata } from 'tslib';
2
+ import { mindsetFunction } from '../../../mindset/metadata/functions/@mindsetFunction.js';
3
+ import 'reflect-metadata';
4
+ import '../../../injection/index.js';
5
+ import '../../../mindset/metadata/MindsetMetadataStore.js';
6
+ import { mindsetModule } from '../../../mindset/metadata/modules/@mindsetModule.js';
7
+ import { param } from '../../../mindset/metadata/params/@param.js';
8
+ import '../../../mindset/MindsetOperator.js';
9
+ import { convert } from 'html-to-text';
10
+
11
+ function toPascalCaseFunctionName(title) {
12
+ const cleaned = title.replace(/[^a-zA-Z0-9]+/g, ' ');
13
+ const words = cleaned
14
+ .trim()
15
+ .split(/\s+/)
16
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase());
17
+ return words.join('');
18
+ }
19
+ async function fetchRawHtml(url) {
20
+ try {
21
+ const response = await fetch(url);
22
+ if (!response.ok) {
23
+ throw new Error(`HTTP error! Status: ${response.status}`);
24
+ }
25
+ const html = await response.text();
26
+ return html;
27
+ }
28
+ catch (error) {
29
+ throw new Error(`Failed to fetch HTML from ${url}: ${error.message}`);
30
+ }
31
+ }
32
+ class KeywordsReq {
33
+ keywords = '';
34
+ }
35
+ __decorate([
36
+ param({
37
+ description: 'Keywords separated by space',
38
+ }),
39
+ __metadata("design:type", String)
40
+ ], KeywordsReq.prototype, "keywords", void 0);
41
+ function HtmlModule(options) {
42
+ var _a;
43
+ const standaricedTitle = toPascalCaseFunctionName(options.title);
44
+ let documentText = null;
45
+ let HtmlModuleIntern = class HtmlModuleIntern {
46
+ async [_a = `searchInTheDocument${standaricedTitle}`](req) {
47
+ if (!documentText) {
48
+ const rawHtml = await fetchRawHtml(options.url);
49
+ documentText = convert(rawHtml);
50
+ }
51
+ return documentText;
52
+ }
53
+ };
54
+ __decorate([
55
+ mindsetFunction({
56
+ description: `Search information using keywords in the document "${options.title}". Priorize this info.`,
57
+ }),
58
+ __metadata("design:type", Function),
59
+ __metadata("design:paramtypes", [KeywordsReq]),
60
+ __metadata("design:returntype", Promise)
61
+ ], HtmlModuleIntern.prototype, _a, null);
62
+ HtmlModuleIntern = __decorate([
63
+ mindsetModule({
64
+ description: `Search information using keywords in the document ${options.title}`,
65
+ })
66
+ ], HtmlModuleIntern);
67
+ return HtmlModuleIntern;
68
+ }
69
+
70
+ export { HtmlModule };
@@ -2,8 +2,6 @@ import { __decorate, __metadata } from 'tslib';
2
2
  import 'reflect-metadata';
3
3
  import '../../../../injection/index.js';
4
4
  import '../../../../mindset/metadata/MindsetMetadataStore.js';
5
- import '../../../../core/chat/repository/IChatRepository.js';
6
- import '../../../../core/user/IUserRepository.js';
7
5
  import { param } from '../../../../mindset/metadata/params/@param.js';
8
6
  import '../../../../mindset/MindsetOperator.js';
9
7
 
@@ -1,13 +1,7 @@
1
- import { ChatItem } from '../../../../core/chat/ChatItem.js';
2
1
  import '../../../../core/chat/repository/IChatRepository.js';
2
+ import { ChatItem } from '../../../../core/chat/ChatItem.js';
3
3
  import '../../../../core/user/IUserRepository.js';
4
4
  import { PgCrudRepository } from '../../../../repository/pg/PgCrudRepository.js';
5
- import 'fs';
6
- import 'path';
7
- import 'sqlite';
8
- import 'sqlite3';
9
- import 'uuid';
10
- import 'pg';
11
5
 
12
6
  class PgChatMemory extends PgCrudRepository {
13
7
  chatId;
@@ -6,11 +6,6 @@ import { singleton } from '../../../../injection/index.js';
6
6
  import { Pool } from 'pg';
7
7
  import { PgChatMemory } from './PgChatMemory.js';
8
8
  import { PgCrudRepository } from '../../../../repository/pg/PgCrudRepository.js';
9
- import 'fs';
10
- import 'path';
11
- import 'sqlite';
12
- import 'sqlite3';
13
- import 'uuid';
14
9
 
15
10
  let PgChatRepository = class PgChatRepository extends PgCrudRepository {
16
11
  constructor(pool) {
@@ -4,11 +4,6 @@ import { User } from '../../../../core/user/User.js';
4
4
  import '../../../../core/user/IUserRepository.js';
5
5
  import { singleton } from '../../../../injection/index.js';
6
6
  import { PgCrudRepository } from '../../../../repository/pg/PgCrudRepository.js';
7
- import 'fs';
8
- import 'path';
9
- import 'sqlite';
10
- import 'sqlite3';
11
- import 'uuid';
12
7
  import { Pool } from 'pg';
13
8
 
14
9
  let PgUserRepository = class PgUserRepository extends PgCrudRepository {
@@ -1,6 +1,6 @@
1
- import 'pg';
2
1
  import * as shortUUID from 'short-uuid';
3
2
  import { PgRepositoryBase } from './PgRepositoryBase.js';
3
+ import { CustomError } from '../../error/CustomError.js';
4
4
 
5
5
  class PgCrudRepository extends PgRepositoryBase {
6
6
  config;
@@ -18,6 +18,16 @@ class PgCrudRepository extends PgRepositoryBase {
18
18
  const items = await this.query(sql, [id]);
19
19
  return items.at(0) ?? null;
20
20
  }
21
+ async findOrThrow(id) {
22
+ const item = await this.find(id);
23
+ if (!item) {
24
+ throw new CustomError({
25
+ message: `Not found ${this.config.constructor.name} with id = '${id}'}`,
26
+ httpCode: 404,
27
+ });
28
+ }
29
+ return item;
30
+ }
21
31
  async findAll() {
22
32
  const sql = `
23
33
  SELECT ${this.columns}
@@ -0,0 +1,19 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
+
4
+ function get(config) {
5
+ return function (target, propertyKey) {
6
+ const functionName = propertyKey.toString();
7
+ const paramsTypes = Reflect.getMetadata('design:paramtypes', target, functionName);
8
+ const store = container.resolve(RestControllerMetadataStore);
9
+ store.saveEndPointMetadata({
10
+ controllerConstructor: target.constructor,
11
+ functionName,
12
+ method: 'get',
13
+ path: config?.path,
14
+ paramsTypes,
15
+ });
16
+ };
17
+ }
18
+
19
+ export { get };
@@ -0,0 +1,19 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
+
4
+ function post(config) {
5
+ return function (target, propertyKey) {
6
+ const functionName = propertyKey.toString();
7
+ const paramsTypes = Reflect.getMetadata('design:paramtypes', target, functionName);
8
+ const store = container.resolve(RestControllerMetadataStore);
9
+ store.saveEndPointMetadata({
10
+ controllerConstructor: target.constructor,
11
+ functionName,
12
+ method: 'post',
13
+ path: config?.path,
14
+ paramsTypes,
15
+ });
16
+ };
17
+ }
18
+
19
+ export { post };
@@ -0,0 +1,15 @@
1
+ import { container, injectable } from '../../injection/index.js';
2
+ import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
+
4
+ function restController(config) {
5
+ return function (target) {
6
+ const metaDataStore = container.resolve(RestControllerMetadataStore);
7
+ metaDataStore.saveControllerMetadata({
8
+ controllerConstructor: target,
9
+ path: config.path,
10
+ });
11
+ injectable()(target);
12
+ };
13
+ }
14
+
15
+ export { restController };
@@ -0,0 +1,37 @@
1
+ import { __decorate } from 'tslib';
2
+ import { singleton } from 'tsyringe';
3
+
4
+ let RestControllerMetadataStore = class RestControllerMetadataStore {
5
+ endPoints = new Map();
6
+ restControllers = new Map();
7
+ saveControllerMetadata(controllerMetadata) {
8
+ this.restControllers.set(controllerMetadata.controllerConstructor, controllerMetadata);
9
+ }
10
+ saveEndPointMetadata(endPointMetadata) {
11
+ let controllerEndPoints = this.endPoints.get(endPointMetadata.controllerConstructor);
12
+ if (!controllerEndPoints) {
13
+ this.endPoints.set(endPointMetadata.controllerConstructor, (controllerEndPoints = new Map()));
14
+ }
15
+ controllerEndPoints.set(endPointMetadata.functionName, endPointMetadata);
16
+ }
17
+ getControllerEndPointsInfo(controllerConstructor) {
18
+ const controller = this.restControllers.get(controllerConstructor);
19
+ if (!controller) {
20
+ throw new Error(`${controllerConstructor.name} should be decorated with @restController`);
21
+ }
22
+ const endPoints = this.endPoints.get(controllerConstructor);
23
+ if (!endPoints?.size) {
24
+ // TODO: Warning
25
+ return [];
26
+ }
27
+ return [...endPoints.values()].map((endPoint) => ({
28
+ ...endPoint,
29
+ controller: this.restControllers.get(endPoint.controllerConstructor),
30
+ }));
31
+ }
32
+ };
33
+ RestControllerMetadataStore = __decorate([
34
+ singleton()
35
+ ], RestControllerMetadataStore);
36
+
37
+ export { RestControllerMetadataStore };
@@ -0,0 +1,85 @@
1
+ import '../controller/channel/ChatResolver.js';
2
+ import '../controller/channel/UserResolver.js';
3
+ import '../injection/index.js';
4
+ import '../controller/metadata/ControllerMetadataStore.js';
5
+ import '../channels/cmd/CmdChannel.js';
6
+ import { ExpressProvider } from '../channels/express/ExpressProvider.js';
7
+ import '../channels/http/HttpServerProvider.js';
8
+ import '../channels/socket/SocketChannel.js';
9
+ import '../channels/socket/SocketChannelConfig.js';
10
+ import '../channels/socket/SocketServerProvider.js';
11
+ import '../channels/telegram/TelegramChannel.js';
12
+ import '../channels/whatsapp/WhatsAppChannel.js';
13
+ import '../core/chat/repository/IChatRepository.js';
14
+ import '../core/user/IUserRepository.js';
15
+ import '../channels/whatsapp/WhatsAppReceiverByDevConnection.js';
16
+ import '../channels/whatsapp/WhatsAppReceiverByWebHook.js';
17
+ import '../channels/whatsapp/WhatsAppSenderByDevConnection.js';
18
+ import '../channels/whatsapp/WhatsAppSenderByCloudApi.js';
19
+ import '../channels/whatsapp/PgWhatsAppRepository.js';
20
+ import '../channels/whatsapp/EnvWhatsAppRepository.js';
21
+ import { Logger } from '../logger/Logger.js';
22
+ import '../validation/metadata/ValidationMetadataStore.js';
23
+ import { validate } from '../validation/validate.js';
24
+ import path from 'path';
25
+ import { RestControllerMetadataStore } from './metadata/RestControllerMetadataStore.js';
26
+
27
+ function buildRequest(req) {
28
+ return Object.assign({}, req.body, req.query, req.params);
29
+ }
30
+ function runRestControllers(controllers, container) {
31
+ const logger = new Logger('wabot:rest');
32
+ const metadataStore = container.resolve(RestControllerMetadataStore);
33
+ const expressProvider = container.resolve(ExpressProvider);
34
+ const expressApp = expressProvider.getExpress();
35
+ controllers.forEach((controller) => {
36
+ const endPoints = metadataStore.getControllerEndPointsInfo(controller);
37
+ endPoints.forEach((endPoint) => {
38
+ const method = endPoint.method;
39
+ const route = path.join(endPoint.controller.path, endPoint.path ?? '');
40
+ logger.info(`config ${endPoint.method.toUpperCase()} ${route}`);
41
+ expressApp[method](route, async (req, res) => {
42
+ const requestContainer = container.createChildContainer();
43
+ const controllerInstance = requestContainer.resolve(endPoint.controllerConstructor);
44
+ const endPointArgs = [];
45
+ let defaultArgFound = false;
46
+ for (let paramIndex = 0; paramIndex < endPoint.paramsTypes.length; paramIndex++) {
47
+ const paramType = endPoint.paramsTypes[paramIndex];
48
+ if (defaultArgFound) {
49
+ throw new Error(`Cant determine de parameter ${paramIndex} value`);
50
+ }
51
+ defaultArgFound = true;
52
+ if (typeof paramType === 'function') {
53
+ const { value, error } = validate(buildRequest(req), paramType);
54
+ if (error) {
55
+ res.status(400).json({ error });
56
+ return;
57
+ }
58
+ endPointArgs.push(value);
59
+ }
60
+ }
61
+ try {
62
+ const response = await controllerInstance[endPoint.functionName].apply(controllerInstance, endPointArgs);
63
+ res.status(200).json(response);
64
+ }
65
+ catch (err) {
66
+ if (err instanceof Error) {
67
+ const keys = Object.keys(err).filter((key) => !['message', 'stack'].includes(key));
68
+ const info = keys.reduce((acc, key) => {
69
+ acc[key] = err[key];
70
+ return acc;
71
+ }, {});
72
+ res.status(500).json({ error: { message: err.message, stack: err.stack, ...info } });
73
+ }
74
+ else {
75
+ res.status(500).json({ error: { message: 'Unknown error' } });
76
+ }
77
+ }
78
+ requestContainer.dispose();
79
+ });
80
+ });
81
+ });
82
+ expressProvider.listen();
83
+ }
84
+
85
+ export { runRestControllers };
@@ -1,12 +1,12 @@
1
- import { ChatMemory } from '../core/chat/repository/IChatMemory.js';
2
- import { ChatRepository } from '../core/chat/repository/IChatRepository.js';
3
- import '../core/user/IUserRepository.js';
4
- import { MessageContext } from '../core/IMessageContext.js';
5
1
  import '../injection/index.js';
6
2
  import 'reflect-metadata';
7
3
  import '../mindset/metadata/MindsetMetadataStore.js';
8
4
  import { Mindset } from '../mindset/IMindset.js';
9
5
  import '../mindset/MindsetOperator.js';
6
+ import { ChatMemory } from '../core/chat/repository/IChatMemory.js';
7
+ import { ChatRepository } from '../core/chat/repository/IChatRepository.js';
8
+ import '../core/user/IUserRepository.js';
9
+ import { MessageContext } from '../core/IMessageContext.js';
10
10
  import 'uuid';
11
11
  import { ChatBotMetadataStore } from '../chatbot/metadata/ChatBotMetadataStore.js';
12
12
  import { ChatBot } from '../chatbot/ChatBot.js';
@@ -1,18 +1,10 @@
1
- import 'reflect-metadata';
2
1
  import { container } from '../injection/index.js';
3
- import '../mindset/metadata/MindsetMetadataStore.js';
4
- import { ChatRepository } from '../core/chat/repository/IChatRepository.js';
5
- import '../core/user/IUserRepository.js';
6
- import '../mindset/MindsetOperator.js';
7
2
  import 'uuid';
8
3
  import '../chatbot/metadata/ChatBotMetadataStore.js';
9
4
  import { ChatBot } from '../chatbot/ChatBot.js';
10
5
  import { ChatBotAdapter } from '../chatbot/ChatBotAdapter.js';
11
- import '../controller/channel/ChatResolver.js';
12
- import '../controller/channel/UserResolver.js';
13
- import '../controller/metadata/ControllerMetadataStore.js';
14
- import 'express';
15
- import 'socket.io';
6
+ import { ChatRepository } from '../core/chat/repository/IChatRepository.js';
7
+ import '../core/user/IUserRepository.js';
16
8
  import { prepareChatContainer } from './prepareChatContainer.js';
17
9
 
18
10
  function runChannel(props) {
@@ -1,49 +1,10 @@
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 { ExpressApp } from '../controller/express/Express.js';
8
- import { SocketIoApp } from '../controller/socket.io/SocketIO.js';
9
5
  import { prepareChatContainer } from './prepareChatContainer.js';
10
- import express from 'express';
11
- import { Server } from 'socket.io';
12
- import http from 'http';
13
- import bodyParser from 'body-parser';
14
- import { Logger } from '../logger/Logger.js';
15
6
 
16
7
  function runServer(config) {
17
- const httpLogger = new Logger('wabot:http');
18
- const socketLogger = new Logger('wabot:socket');
19
- const expressApp = express();
20
- const httpServer = http.createServer(expressApp);
21
- const io = new Server(httpServer, {
22
- cors: {
23
- origin: '*',
24
- },
25
- });
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
- httpLogger.trace(`${req.method} ${req.originalUrl} ${res.statusCode} - ${ms}ms`);
33
- });
34
- next();
35
- });
36
- io.on('connection', (socket) => {
37
- socketLogger.trace(`socket:${socket.id} connection`);
38
- socket.onAny((event) => {
39
- socketLogger.trace(`socket:${socket.id} emmits ${event}`);
40
- });
41
- socket.on('disconnect', (reason) => {
42
- socketLogger.trace(`socket:${socket.id} disconnect with reason: ${reason}`);
43
- });
44
- });
45
- container.register(ExpressApp, { useValue: expressApp });
46
- container.register(SocketIoApp, { useValue: io });
47
8
  for (const provider of config.providers ?? []) {
48
9
  if (provider.singleton) {
49
10
  container.registerSingleton(provider.replace, provider.with);
@@ -74,10 +35,6 @@ function runServer(config) {
74
35
  channel.connect();
75
36
  }
76
37
  }
77
- const PORT = process.env.PORT || 3000;
78
- httpServer.listen(PORT, () => {
79
- httpLogger.info(`server listenig on port ${PORT}`);
80
- });
81
38
  }
82
39
 
83
40
  export { runServer };