@wabot-dev/framework 0.1.0-beta.9 → 0.2.0-beta.1

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 (212) hide show
  1. package/dist/src/addon/async/pg/PgJobRepository.js +26 -0
  2. package/dist/src/addon/auth/api-key/@apiKeyConnectionGuard.js +16 -0
  3. package/dist/src/addon/auth/api-key/@apiKeyGuard.js +17 -0
  4. package/dist/src/addon/auth/api-key/ApiKey.js +45 -0
  5. package/dist/src/addon/auth/api-key/ApiKeyConnectionGuardMiddleware.js +57 -0
  6. package/dist/src/addon/auth/api-key/ApiKeyGuardMiddleware.js +45 -0
  7. package/dist/src/addon/auth/api-key/ApiKeyRepository.js +22 -0
  8. package/dist/src/addon/auth/api-key/PgApiKeyRepository.js +53 -0
  9. package/dist/src/addon/auth/api-key/RemoteApiKeyRepository.js +62 -0
  10. package/dist/src/addon/auth/jwt/@jwtConnectionGuard.js +16 -0
  11. package/dist/src/addon/auth/jwt/@jwtGuard.js +17 -0
  12. package/dist/src/addon/auth/jwt/Jwt.js +53 -0
  13. package/dist/src/addon/auth/jwt/JwtAccessAndRefreshTokenDto.js +20 -0
  14. package/dist/src/addon/auth/jwt/JwtConfig.js +28 -0
  15. package/dist/src/addon/auth/jwt/JwtConnectionGuardMiddleware.js +57 -0
  16. package/dist/src/addon/auth/jwt/JwtGuardMiddleware.js +45 -0
  17. package/dist/src/addon/auth/jwt/JwtRefreshToken.js +56 -0
  18. package/dist/src/addon/auth/jwt/JwtRefreshTokenRepository.js +25 -0
  19. package/dist/src/addon/auth/jwt/JwtSigner.js +36 -0
  20. package/dist/src/addon/auth/jwt/JwtTokenDto.js +22 -0
  21. package/dist/src/addon/auth/jwt/PgJwtRefreshTokenRepository.js +21 -0
  22. package/dist/src/addon/chat-bot/anthropic/AnthropicChatAdapter.js +135 -0
  23. package/dist/src/addon/chat-bot/deepseek/DeepSeekChatAdapter.js +137 -0
  24. package/dist/src/addon/chat-bot/google/GoogleChatAdapter.js +128 -0
  25. package/dist/src/addon/chat-bot/openia/OpenaiChatAdapter.js +117 -0
  26. package/dist/src/{pre-made/repository/chat → addon/chat-bot}/pg/PgChatMemory.js +6 -4
  27. package/dist/src/{pre-made/repository/chat → addon/chat-bot}/pg/PgChatRepository.js +6 -5
  28. package/dist/src/{pre-made/repository/chat → addon/chat-bot}/ram/RamChatRepository.js +2 -2
  29. package/dist/src/addon/chat-bot/wabot/WabotChatAdapter.js +41 -0
  30. package/dist/src/addon/chat-controller/cmd/@cmd.js +24 -0
  31. package/dist/src/addon/chat-controller/cmd/CmdChannel.js +91 -0
  32. package/dist/src/{channels → addon/chat-controller}/socket/@socket.js +10 -4
  33. package/dist/src/{channels → addon/chat-controller}/socket/SocketChannel.js +9 -23
  34. package/dist/src/{channels → addon/chat-controller}/socket/SocketChannelConfig.js +1 -1
  35. package/dist/src/{channels → addon/chat-controller}/telegram/@telegram.js +10 -4
  36. package/dist/src/{channels → addon/chat-controller}/telegram/TelegramChannel.js +4 -22
  37. package/dist/src/addon/chat-controller/whatsapp/@whatsApp.js +26 -0
  38. package/dist/src/{channels → addon/chat-controller}/whatsapp/EnvWhatsAppRepository.js +3 -3
  39. package/dist/src/{channels → addon/chat-controller}/whatsapp/PgWhatsAppRepository.js +2 -2
  40. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsApp.js +2 -4
  41. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppChannel.js +6 -18
  42. package/dist/src/addon/chat-controller/whatsapp/WhatsAppReceiver.js +10 -0
  43. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppSender.js +15 -39
  44. package/dist/src/addon/chat-controller/whatsapp/cloud-api/WhatsAppReceiverByCloudApi.js +97 -0
  45. package/dist/src/{channels/whatsapp → addon/chat-controller/whatsapp/cloud-api}/WhatsAppSenderByCloudApi.js +27 -20
  46. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppProxyContracts.js +5 -0
  47. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppReceiverByWabotProxy.js +65 -0
  48. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppSenderByWabotProxy.js +61 -0
  49. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppWabotProxyConnection.js +45 -0
  50. package/dist/src/{pre-made/module → addon/mindset}/html/HtmlModule.js +7 -7
  51. package/dist/src/core/auth/Auth.js +33 -0
  52. package/dist/src/core/{Persistent.js → entity/Entity.js} +24 -12
  53. package/dist/src/core/env/Env.js +39 -0
  54. package/dist/src/core/error/CustomError.js +15 -0
  55. package/dist/src/core/injection/index.js +4 -0
  56. package/dist/src/core/mapper/Mapper.js +42 -0
  57. package/dist/src/core/password/Password.js +30 -0
  58. package/dist/src/core/random/Random.js +65 -0
  59. package/dist/src/core/storable/Storable.js +8 -0
  60. package/dist/src/core/validation/core/validateArray.js +51 -0
  61. package/dist/src/core/validation/core/validateModel.js +36 -0
  62. package/dist/src/{validation/metadata/@isNumber.js → core/validation/metadata/@isArray.js} +5 -4
  63. package/dist/src/{validation/metadata/@isDate.js → core/validation/metadata/@isModel.js} +5 -4
  64. package/dist/src/{validation → core/validation}/metadata/@isOptional.js +1 -1
  65. package/dist/src/core/validation/metadata/ValidationMetadataStore.js +98 -0
  66. package/dist/src/core/validation/modelInfo.js +9 -0
  67. package/dist/src/{validation/validateModel2.js → core/validation/validate.js} +3 -3
  68. package/dist/src/{validation/metadata → core/validation/validators/is-boolean}/@isBoolean.js +3 -3
  69. package/dist/src/core/validation/validators/is-date/@isDate.js +17 -0
  70. package/dist/src/core/validation/validators/is-in/@isIn.js +18 -0
  71. package/dist/src/core/validation/validators/is-in/validateIsIn.js +12 -0
  72. package/dist/src/{validation/metadata → core/validation/validators/is-not-empty}/@isNotEmpty.js +3 -3
  73. package/dist/src/core/validation/validators/is-number/@isNumber.js +17 -0
  74. package/dist/src/{validation/metadata → core/validation/validators/is-present}/@isPresent.js +3 -3
  75. package/dist/src/{validation/metadata → core/validation/validators/is-string}/@isString.js +3 -3
  76. package/dist/src/{validation/metadata → core/validation/validators/max}/@max.js +3 -3
  77. package/dist/src/{validation/metadata → core/validation/validators/min}/@min.js +3 -3
  78. package/dist/src/feature/async/@command.js +11 -0
  79. package/dist/src/feature/async/@commandHandler.js +12 -0
  80. package/dist/src/feature/async/Async.js +38 -0
  81. package/dist/src/feature/async/Command.js +9 -0
  82. package/dist/src/feature/async/CommandMetadataStore.js +38 -0
  83. package/dist/src/feature/async/Job.js +27 -0
  84. package/dist/src/feature/async/JobRepository.js +31 -0
  85. package/dist/src/feature/async/JobRunner.js +48 -0
  86. package/dist/src/feature/async/JobsEventsHub.js +36 -0
  87. package/dist/src/feature/async/runCommandHandlers.js +29 -0
  88. package/dist/src/{core/chat → feature/chat-bot}/Chat.js +2 -2
  89. package/dist/src/feature/chat-bot/ChatAdapter.js +7 -0
  90. package/dist/src/feature/chat-bot/ChatBot.js +73 -0
  91. package/dist/src/feature/chat-bot/ChatItem.js +24 -0
  92. package/dist/src/feature/chat-bot/ChatMemory.js +10 -0
  93. package/dist/src/{core/chat/repository/IChatRepository.js → feature/chat-bot/ChatRepository.js} +2 -8
  94. package/dist/src/feature/chat-bot/IChatItem.js +3 -0
  95. package/dist/src/{chatbot → feature/chat-bot}/metadata/@chatBot.js +1 -1
  96. package/dist/src/{chatbot → feature/chat-bot}/metadata/ChatBotMetadataStore.js +1 -1
  97. package/dist/src/{controller/channel → feature/chat-controller}/ChatResolver.js +6 -4
  98. package/dist/src/{controller → feature/chat-controller}/metadata/ControllerMetadataStore.js +1 -1
  99. package/dist/src/{controller → feature/chat-controller}/metadata/controller/@chatController.js +1 -1
  100. package/dist/src/feature/chat-controller/runChatControllers.js +83 -0
  101. package/dist/src/{channels → feature}/express/ExpressProvider.js +2 -4
  102. package/dist/src/{channels → feature}/http/HttpServerProvider.js +2 -2
  103. package/dist/src/{mindset → feature/mindset}/IMindset.js +6 -0
  104. package/dist/src/feature/mindset/MindsetOperator.js +180 -0
  105. package/dist/src/{mindset → feature/mindset}/metadata/MindsetMetadataStore.js +1 -1
  106. package/dist/src/{mindset → feature/mindset}/metadata/functions/@mindsetFunction.js +1 -1
  107. package/dist/src/{mindset → feature/mindset}/metadata/mindsets/@mindset.js +1 -1
  108. package/dist/src/{mindset → feature/mindset}/metadata/modules/@mindsetModule.js +1 -2
  109. package/dist/src/{mindset → feature/mindset}/metadata/params/@param.js +1 -1
  110. package/dist/src/feature/money/Money.js +61 -0
  111. package/dist/src/feature/money/MoneyDto.js +22 -0
  112. package/dist/src/{repository → feature}/pg/PgCrudRepository.js +24 -10
  113. package/dist/src/{repository → feature}/pg/PgRepositoryBase.js +2 -2
  114. package/dist/src/feature/rest-controller/injection-tokens.js +4 -0
  115. package/dist/src/{rest-controller/metadata/@post.js → feature/rest-controller/metadata/@middleware.js} +5 -8
  116. package/dist/src/feature/rest-controller/metadata/@onDelete.js +7 -0
  117. package/dist/src/feature/rest-controller/metadata/@onGet.js +7 -0
  118. package/dist/src/feature/rest-controller/metadata/@onPost.js +7 -0
  119. package/dist/src/feature/rest-controller/metadata/@onPut.js +7 -0
  120. package/dist/src/{rest-controller → feature/rest-controller}/metadata/@restController.js +2 -2
  121. package/dist/src/{rest-controller → feature/rest-controller}/metadata/RestControllerMetadataStore.js +14 -1
  122. package/dist/src/{rest-controller/metadata/@get.js → feature/rest-controller/metadata/methodDecorator.js} +5 -5
  123. package/dist/src/feature/rest-controller/runRestControllers.js +103 -0
  124. package/dist/src/{channels → feature}/socket/SocketServerProvider.js +2 -2
  125. package/dist/src/feature/socket-controller/metadata/@connectionMiddleware.js +16 -0
  126. package/dist/src/feature/socket-controller/metadata/@socketConnection.js +18 -0
  127. package/dist/src/feature/socket-controller/metadata/@socketController.js +15 -0
  128. package/dist/src/feature/socket-controller/metadata/@socketEvent.js +18 -0
  129. package/dist/src/feature/socket-controller/metadata/SocketControllerMetadataStore.js +65 -0
  130. package/dist/src/feature/socket-controller/runSocketControllers.js +99 -0
  131. package/dist/src/index.d.ts +1219 -718
  132. package/dist/src/index.js +147 -102
  133. package/package.json +8 -2
  134. package/dist/src/_virtual/_commonjsHelpers.js +0 -5
  135. package/dist/src/_virtual/cjs.js +0 -7
  136. package/dist/src/ai/deepseek/DeepSeekChatBotAdapter.js +0 -107
  137. package/dist/src/ai/openia/OpenaiChatBotAdapter.js +0 -88
  138. package/dist/src/channels/cmd/@cmd.js +0 -18
  139. package/dist/src/channels/cmd/CmdChannel.js +0 -73
  140. package/dist/src/channels/wabot/WabotDevConnection.js +0 -57
  141. package/dist/src/channels/wabot/WabotDevSocketContracts.js +0 -10
  142. package/dist/src/channels/whatsapp/@whatsapp.js +0 -20
  143. package/dist/src/channels/whatsapp/WhatsAppReceiver.js +0 -59
  144. package/dist/src/channels/whatsapp/WhatsAppReceiverByDevConnection.js +0 -32
  145. package/dist/src/channels/whatsapp/WhatsAppReceiverByWebHook.js +0 -63
  146. package/dist/src/channels/whatsapp/WhatsAppSenderByDevConnection.js +0 -61
  147. package/dist/src/chatbot/ChatBot.js +0 -51
  148. package/dist/src/chatbot/ChatBotAdapter.js +0 -72
  149. package/dist/src/controller/channel/UserResolver.js +0 -21
  150. package/dist/src/core/IMessageContext.js +0 -12
  151. package/dist/src/core/chat/ChatItem.js +0 -15
  152. package/dist/src/core/chat/repository/IChatMemory.js +0 -10
  153. package/dist/src/core/user/IUserRepository.js +0 -19
  154. package/dist/src/core/user/User.js +0 -26
  155. package/dist/src/env/WabotEnv.js +0 -27
  156. package/dist/src/injection/index.js +0 -4
  157. package/dist/src/mindset/MindsetOperator.js +0 -101
  158. package/dist/src/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js +0 -90
  159. package/dist/src/node_modules/deepmerge/dist/cjs.js +0 -142
  160. package/dist/src/node_modules/dom-serializer/lib/esm/foreignNames.js +0 -102
  161. package/dist/src/node_modules/dom-serializer/lib/esm/index.js +0 -186
  162. package/dist/src/node_modules/domelementtype/lib/esm/index.js +0 -53
  163. package/dist/src/node_modules/domhandler/lib/esm/index.js +0 -148
  164. package/dist/src/node_modules/domhandler/lib/esm/node.js +0 -334
  165. package/dist/src/node_modules/entities/lib/esm/decode.js +0 -458
  166. package/dist/src/node_modules/entities/lib/esm/decode_codepoint.js +0 -62
  167. package/dist/src/node_modules/entities/lib/esm/escape.js +0 -99
  168. package/dist/src/node_modules/entities/lib/esm/generated/decode-data-html.js +0 -8
  169. package/dist/src/node_modules/entities/lib/esm/generated/decode-data-xml.js +0 -8
  170. package/dist/src/node_modules/html-to-text/lib/html-to-text.js +0 -2147
  171. package/dist/src/node_modules/htmlparser2/lib/esm/Parser.js +0 -491
  172. package/dist/src/node_modules/htmlparser2/lib/esm/Tokenizer.js +0 -928
  173. package/dist/src/node_modules/htmlparser2/lib/esm/index.js +0 -18
  174. package/dist/src/node_modules/leac/lib/leac.js +0 -3
  175. package/dist/src/node_modules/parseley/lib/parseley.js +0 -270
  176. package/dist/src/node_modules/peberminta/lib/core.js +0 -171
  177. package/dist/src/node_modules/selderee/lib/selderee.js +0 -380
  178. package/dist/src/pre-made/module/authentication/AuthenticationModule.js +0 -97
  179. package/dist/src/pre-made/module/authentication/requests/SendOneTimePasswordRequest.js +0 -25
  180. package/dist/src/pre-made/module/authentication/requests/ValidateOneTimePasswordRequest.js +0 -25
  181. package/dist/src/pre-made/module/register-user/RegisterUserModule.js +0 -56
  182. package/dist/src/pre-made/module/register-user/requests/RegisterUserWithEmailRequest.js +0 -25
  183. package/dist/src/pre-made/repository/user/pg/PgUserRepository.js +0 -33
  184. package/dist/src/pre-made/repository/user/ram/RamUserRepository.js +0 -27
  185. package/dist/src/pre-made/service/EmailService.js +0 -13
  186. package/dist/src/pre-made/service/OtpService.js +0 -14
  187. package/dist/src/rest-controller/runRestControllers.js +0 -74
  188. package/dist/src/server/prepareChatContainer.js +0 -43
  189. package/dist/src/server/runChannel.js +0 -27
  190. package/dist/src/server/runServer.js +0 -40
  191. package/dist/src/validation/metadata/@validable.js +0 -14
  192. package/dist/src/validation/metadata/ValidationMetadataStore.js +0 -55
  193. package/dist/src/validation/validators/validateModel.js +0 -47
  194. /package/dist/src/{pre-made/repository/chat → addon/chat-bot}/ram/RamChatMemory.js +0 -0
  195. /package/dist/src/{channels → addon/chat-controller}/telegram/TelegramChannelConfig.js +0 -0
  196. /package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppChannelConfig.js +0 -0
  197. /package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppRepository.js +0 -0
  198. /package/dist/src/{injection → core/injection}/Container.js +0 -0
  199. /package/dist/src/{logger → core/logger}/Logger.js +0 -0
  200. /package/dist/src/{validation/validators → core/validation/core}/validateIsOptional.js +0 -0
  201. /package/dist/src/{validation/validators → core/validation/validators/is-boolean}/validateIsBoolean.js +0 -0
  202. /package/dist/src/{validation/validators → core/validation/validators/is-date}/validateIsDate.js +0 -0
  203. /package/dist/src/{validation/validators → core/validation/validators/is-not-empty}/validateIsNotEmpty.js +0 -0
  204. /package/dist/src/{validation/validators → core/validation/validators/is-number}/validateIsNumber.js +0 -0
  205. /package/dist/src/{validation/validators → core/validation/validators/is-present}/validateIsPresent.js +0 -0
  206. /package/dist/src/{validation/validators → core/validation/validators/is-string}/validateIsString.js +0 -0
  207. /package/dist/src/{validation/validators → core/validation/validators/max}/validateMax.js +0 -0
  208. /package/dist/src/{validation/validators → core/validation/validators/min}/validateMin.js +0 -0
  209. /package/dist/src/{mindset → feature/mindset}/metadata/functions/decoratorNames.js +0 -0
  210. /package/dist/src/{mindset → feature/mindset}/metadata/mindsets/decoratorNames.js +0 -0
  211. /package/dist/src/{mindset → feature/mindset}/metadata/modules/decoratorNames.js +0 -0
  212. /package/dist/src/{mindset → feature/mindset}/metadata/params/decoratorNames.js +0 -0
@@ -1,5 +1,6 @@
1
1
  import * as shortUUID from 'short-uuid';
2
2
  import { PgRepositoryBase } from './PgRepositoryBase.js';
3
+ import { CustomError } from '../../core/error/CustomError.js';
3
4
 
4
5
  class PgCrudRepository extends PgRepositoryBase {
5
6
  config;
@@ -17,10 +18,25 @@ class PgCrudRepository extends PgRepositoryBase {
17
18
  const items = await this.query(sql, [id]);
18
19
  return items.at(0) ?? null;
19
20
  }
21
+ async findByIds(ids) {
22
+ if (ids.length === 0) {
23
+ return [];
24
+ }
25
+ const sql = `
26
+ SELECT ${this.columns}
27
+ FROM ${this.table}
28
+ WHERE id IN (${ids.map((_, i) => '$' + (i + 1)).join(',')})
29
+ `;
30
+ const items = await this.query(sql, ids);
31
+ return items;
32
+ }
20
33
  async findOrThrow(id) {
21
34
  const item = await this.find(id);
22
35
  if (!item) {
23
- throw new Error(`Not found ${this.config.constructor.name} with id = '${id}'`);
36
+ throw new CustomError({
37
+ message: `Not found ${this.config.constructor.name} with id = '${id}'`,
38
+ httpCode: 404,
39
+ });
24
40
  }
25
41
  return item;
26
42
  }
@@ -53,16 +69,14 @@ class PgCrudRepository extends PgRepositoryBase {
53
69
  SET ${this.updates}
54
70
  WHERE id = $${this.columnsList.length + 1}
55
71
  `;
56
- await this.exec(sql, [...this.values(item), item.getId()]);
72
+ await this.exec(sql, [...this.values(item), item.id]);
57
73
  }
58
- async discard(item) {
59
- const _item = await this.find(item.getId());
60
- if (!_item) {
61
- throw new Error('Not found');
62
- }
63
- item.discard();
64
- _item.discard();
65
- await this.update(_item);
74
+ async delete(item) {
75
+ const sql = `
76
+ DELETE FROM ${this.table}
77
+ WHERE id = $1
78
+ `;
79
+ await this.exec(sql, [item.id]);
66
80
  }
67
81
  }
68
82
 
@@ -32,8 +32,8 @@ class PgRepositoryBase {
32
32
  }
33
33
  values(item) {
34
34
  return [
35
- item.getId(),
36
- item.getCreatedAt(),
35
+ item.id,
36
+ item.createdAt,
37
37
  JSON.stringify(item['data']),
38
38
  ...this.columnsList.slice(3).map((x) => this.addColumns[x].value(item)),
39
39
  ];
@@ -0,0 +1,4 @@
1
+ const EXPRESS_REQ = 'EXPRESS_REQ';
2
+ const EXPRESS_RES = 'EXPRESS_RES';
3
+
4
+ export { EXPRESS_REQ, EXPRESS_RES };
@@ -1,19 +1,16 @@
1
- import { container } from '../../injection/index.js';
1
+ import { container } from '../../../core/injection/index.js';
2
2
  import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
3
 
4
- function post(config) {
4
+ function middleware(middlewareConstructor) {
5
5
  return function (target, propertyKey) {
6
6
  const functionName = propertyKey.toString();
7
- const paramsTypes = Reflect.getMetadata('design:paramtypes', target, functionName);
8
7
  const store = container.resolve(RestControllerMetadataStore);
9
- store.saveEndPointMetadata({
8
+ store.saveMiddlewareMetadata({
10
9
  controllerConstructor: target.constructor,
11
10
  functionName,
12
- method: 'post',
13
- path: config?.path,
14
- paramsTypes,
11
+ middlewareConstructor: middlewareConstructor,
15
12
  });
16
13
  };
17
14
  }
18
15
 
19
- export { post };
16
+ export { middleware };
@@ -0,0 +1,7 @@
1
+ import { methodDecorator } from './methodDecorator.js';
2
+
3
+ function onDelete(config) {
4
+ return methodDecorator('delete', config);
5
+ }
6
+
7
+ export { onDelete };
@@ -0,0 +1,7 @@
1
+ import { methodDecorator } from './methodDecorator.js';
2
+
3
+ function onGet(config) {
4
+ return methodDecorator('get', config);
5
+ }
6
+
7
+ export { onGet };
@@ -0,0 +1,7 @@
1
+ import { methodDecorator } from './methodDecorator.js';
2
+
3
+ function onPost(config) {
4
+ return methodDecorator('post', config);
5
+ }
6
+
7
+ export { onPost };
@@ -0,0 +1,7 @@
1
+ import { methodDecorator } from './methodDecorator.js';
2
+
3
+ function onPut(config) {
4
+ return methodDecorator('put', config);
5
+ }
6
+
7
+ export { onPut };
@@ -1,4 +1,4 @@
1
- import { container, injectable } from '../../injection/index.js';
1
+ import { container, injectable } from '../../../core/injection/index.js';
2
2
  import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
3
 
4
4
  function restController(config) {
@@ -6,7 +6,7 @@ function restController(config) {
6
6
  const metaDataStore = container.resolve(RestControllerMetadataStore);
7
7
  metaDataStore.saveControllerMetadata({
8
8
  controllerConstructor: target,
9
- path: config.path,
9
+ path: typeof config === 'string' ? config : config.path,
10
10
  });
11
11
  injectable()(target);
12
12
  };
@@ -1,8 +1,9 @@
1
1
  import { __decorate } from 'tslib';
2
- import { singleton } from 'tsyringe';
2
+ import { singleton } from '../../../core/injection/index.js';
3
3
 
4
4
  let RestControllerMetadataStore = class RestControllerMetadataStore {
5
5
  endPoints = new Map();
6
+ middlewares = new Map();
6
7
  restControllers = new Map();
7
8
  saveControllerMetadata(controllerMetadata) {
8
9
  this.restControllers.set(controllerMetadata.controllerConstructor, controllerMetadata);
@@ -14,6 +15,17 @@ let RestControllerMetadataStore = class RestControllerMetadataStore {
14
15
  }
15
16
  controllerEndPoints.set(endPointMetadata.functionName, endPointMetadata);
16
17
  }
18
+ saveMiddlewareMetadata(middlewareMetadata) {
19
+ let controllerMiddlewares = this.middlewares.get(middlewareMetadata.controllerConstructor);
20
+ if (!controllerMiddlewares) {
21
+ this.middlewares.set(middlewareMetadata.controllerConstructor, (controllerMiddlewares = new Map()));
22
+ }
23
+ let methodMiddlewares = controllerMiddlewares.get(middlewareMetadata.functionName);
24
+ if (!methodMiddlewares) {
25
+ controllerMiddlewares.set(middlewareMetadata.functionName, (methodMiddlewares = []));
26
+ }
27
+ methodMiddlewares.unshift(middlewareMetadata);
28
+ }
17
29
  getControllerEndPointsInfo(controllerConstructor) {
18
30
  const controller = this.restControllers.get(controllerConstructor);
19
31
  if (!controller) {
@@ -26,6 +38,7 @@ let RestControllerMetadataStore = class RestControllerMetadataStore {
26
38
  }
27
39
  return [...endPoints.values()].map((endPoint) => ({
28
40
  ...endPoint,
41
+ middlewares: this.middlewares.get(endPoint.controllerConstructor)?.get(endPoint.functionName) ?? [],
29
42
  controller: this.restControllers.get(endPoint.controllerConstructor),
30
43
  }));
31
44
  }
@@ -1,19 +1,19 @@
1
- import { container } from '../../injection/index.js';
1
+ import { container } from '../../../core/injection/index.js';
2
2
  import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
3
 
4
- function get(config) {
4
+ function methodDecorator(method, config) {
5
5
  return function (target, propertyKey) {
6
6
  const functionName = propertyKey.toString();
7
7
  const paramsTypes = Reflect.getMetadata('design:paramtypes', target, functionName);
8
8
  const store = container.resolve(RestControllerMetadataStore);
9
9
  store.saveEndPointMetadata({
10
10
  controllerConstructor: target.constructor,
11
+ method,
12
+ config: typeof config === 'string' ? { path: config } : config,
11
13
  functionName,
12
- method: 'get',
13
- path: config?.path,
14
14
  paramsTypes,
15
15
  });
16
16
  };
17
17
  }
18
18
 
19
- export { get };
19
+ export { methodDecorator };
@@ -0,0 +1,103 @@
1
+ import { CustomError } from '../../core/error/CustomError.js';
2
+ import { container } from '../../core/injection/index.js';
3
+ import { Logger } from '../../core/logger/Logger.js';
4
+ import '../../core/validation/metadata/ValidationMetadataStore.js';
5
+ import { validate } from '../../core/validation/validate.js';
6
+ import { ExpressProvider } from '../express/ExpressProvider.js';
7
+ import { json, urlencoded } from 'express';
8
+ import path__default from 'path';
9
+ import { EXPRESS_REQ, EXPRESS_RES } from './injection-tokens.js';
10
+ import { RestControllerMetadataStore } from './metadata/RestControllerMetadataStore.js';
11
+
12
+ function buildRequest(req) {
13
+ return Object.assign({}, req.body, req.query, req.params);
14
+ }
15
+ function runRestControllers(controllers) {
16
+ const logger = new Logger('wabot:rest');
17
+ const metadataStore = container.resolve(RestControllerMetadataStore);
18
+ const expressProvider = container.resolve(ExpressProvider);
19
+ const expressApp = expressProvider.getExpress();
20
+ controllers.forEach((controller) => {
21
+ const endPoints = metadataStore.getControllerEndPointsInfo(controller);
22
+ endPoints.forEach((endPoint) => {
23
+ const method = endPoint.method;
24
+ const route = path__default
25
+ .join(endPoint.controller.path, endPoint.config?.path ?? '')
26
+ .replaceAll('\\', '/');
27
+ logger.info(`config ${endPoint.method.toUpperCase()} ${route}`);
28
+ const rawMiddlewares = [];
29
+ if (!endPoint.config?.disableJsonParser) {
30
+ rawMiddlewares.push(json());
31
+ }
32
+ if (!endPoint.config?.disableUrlEncodedParser) {
33
+ rawMiddlewares.push(urlencoded({ extended: true }));
34
+ }
35
+ expressApp[method](route, ...rawMiddlewares, async (req, res) => {
36
+ const requestContainer = container.createChildContainer();
37
+ requestContainer.register(EXPRESS_REQ, { useValue: req });
38
+ requestContainer.register(EXPRESS_RES, { useValue: req });
39
+ try {
40
+ const middlewares = endPoint.middlewares.map((x) => requestContainer.resolve(x.middlewareConstructor));
41
+ for (const middleware of middlewares) {
42
+ await middleware.handle(req, res, requestContainer);
43
+ }
44
+ const controllerInstance = requestContainer.resolve(endPoint.controllerConstructor);
45
+ const endPointArgs = [];
46
+ let defaultArgFound = false;
47
+ for (let paramIndex = 0; paramIndex < endPoint.paramsTypes.length; paramIndex++) {
48
+ const paramType = endPoint.paramsTypes[paramIndex];
49
+ if (defaultArgFound) {
50
+ throw new Error(`Cant determine de parameter ${paramIndex} value`);
51
+ }
52
+ defaultArgFound = true;
53
+ if (typeof paramType === 'function') {
54
+ const { value, error } = validate(buildRequest(req), paramType);
55
+ if (error) {
56
+ throw new CustomError({ httpCode: 400, message: error.description, info: error });
57
+ }
58
+ endPointArgs.push(value);
59
+ }
60
+ }
61
+ const response = await controllerInstance[endPoint.functionName].apply(controllerInstance, endPointArgs);
62
+ res.status(200).json(response);
63
+ }
64
+ catch (err) {
65
+ logger.error(err);
66
+ if (err instanceof Error) {
67
+ const keys = Object.keys(err).filter((key) => !['message', 'stack'].includes(key));
68
+ const { httpCode, ...info } = keys.reduce((acc, key) => {
69
+ acc[key] = err[key];
70
+ return acc;
71
+ }, {});
72
+ res
73
+ .status(httpCode ?? 500)
74
+ .json(removeCircular({ error: { message: err.message, stack: err.stack, ...info } }));
75
+ }
76
+ else {
77
+ res.status(500).json({ error: { message: 'Unknown error' } });
78
+ }
79
+ }
80
+ finally {
81
+ requestContainer.dispose();
82
+ }
83
+ });
84
+ });
85
+ });
86
+ expressProvider.listen();
87
+ }
88
+ function removeCircular(obj, seen = new WeakSet()) {
89
+ if (obj && typeof obj === 'object') {
90
+ if (seen.has(obj)) {
91
+ return undefined; // remove circular ref
92
+ }
93
+ seen.add(obj);
94
+ const clone = Array.isArray(obj) ? [] : {};
95
+ for (const key in obj) {
96
+ clone[key] = removeCircular(obj[key], seen);
97
+ }
98
+ return clone;
99
+ }
100
+ return obj;
101
+ }
102
+
103
+ export { runRestControllers };
@@ -1,8 +1,8 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
- import { Logger } from '../../logger/Logger.js';
2
+ import { singleton } from '../../core/injection/index.js';
3
+ import { Logger } from '../../core/logger/Logger.js';
3
4
  import { HttpServerProvider } from '../http/HttpServerProvider.js';
4
5
  import { Server } from 'socket.io';
5
- import { singleton } from 'tsyringe';
6
6
 
7
7
  let SocketServerProvider = class SocketServerProvider {
8
8
  httpServerProvider;
@@ -0,0 +1,16 @@
1
+ import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
2
+ import { container } from '../../../core/injection/index.js';
3
+
4
+ function connectionMiddleware(middlewareConstructor) {
5
+ return function (target, propertyKey) {
6
+ const functionName = propertyKey.toString();
7
+ const store = container.resolve(SocketControllerMetadataStore);
8
+ store.saveConnectionMiddlewareMetadata({
9
+ controllerConstructor: target.constructor,
10
+ functionName,
11
+ middlewareConstructor: middlewareConstructor,
12
+ });
13
+ };
14
+ }
15
+
16
+ export { connectionMiddleware };
@@ -0,0 +1,18 @@
1
+ import { container } from '../../../core/injection/index.js';
2
+ import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
3
+
4
+ function socketConnection(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(SocketControllerMetadataStore);
9
+ store.saveSocketConnectionMetadata({
10
+ controllerConstructor: target.constructor,
11
+ config: typeof config === 'string' ? { namespace: config } : config,
12
+ functionName,
13
+ paramsTypes,
14
+ });
15
+ };
16
+ }
17
+
18
+ export { socketConnection };
@@ -0,0 +1,15 @@
1
+ import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
2
+ import { container, injectable } from '../../../core/injection/index.js';
3
+
4
+ function socketController(config) {
5
+ return function (target) {
6
+ const metaDataStore = container.resolve(SocketControllerMetadataStore);
7
+ metaDataStore.saveControllerMetadata({
8
+ controllerConstructor: target,
9
+ config: typeof config === 'string' ? { namespace: config } : config,
10
+ });
11
+ injectable()(target);
12
+ };
13
+ }
14
+
15
+ export { socketController };
@@ -0,0 +1,18 @@
1
+ import { container } from '../../../core/injection/index.js';
2
+ import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
3
+
4
+ function socketEvent(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(SocketControllerMetadataStore);
9
+ store.saveSocketEventMetadata({
10
+ controllerConstructor: target.constructor,
11
+ config: typeof config === 'string' ? { event: config } : config,
12
+ functionName,
13
+ paramsTypes,
14
+ });
15
+ };
16
+ }
17
+
18
+ export { socketEvent };
@@ -0,0 +1,65 @@
1
+ import { __decorate } from 'tslib';
2
+ import { singleton } from '../../../core/injection/index.js';
3
+
4
+ let SocketControllerMetadataStore = class SocketControllerMetadataStore {
5
+ socketControllers = new Map();
6
+ socketConnections = new Map();
7
+ socketEvents = new Map();
8
+ connectionMiddlewares = new Map();
9
+ saveControllerMetadata(controllerMetadata) {
10
+ this.socketControllers.set(controllerMetadata.controllerConstructor, controllerMetadata);
11
+ }
12
+ saveSocketConnectionMetadata(socketConnectionMetadata) {
13
+ let controllerConnections = this.socketConnections.get(socketConnectionMetadata.controllerConstructor);
14
+ if (!controllerConnections) {
15
+ this.socketConnections.set(socketConnectionMetadata.controllerConstructor, (controllerConnections = new Map()));
16
+ }
17
+ controllerConnections.set(socketConnectionMetadata.functionName, socketConnectionMetadata);
18
+ }
19
+ saveSocketEventMetadata(socketEventMetadata) {
20
+ let controllerEvents = this.socketEvents.get(socketEventMetadata.controllerConstructor);
21
+ if (!controllerEvents) {
22
+ this.socketEvents.set(socketEventMetadata.controllerConstructor, (controllerEvents = new Map()));
23
+ }
24
+ controllerEvents.set(socketEventMetadata.functionName, socketEventMetadata);
25
+ }
26
+ saveConnectionMiddlewareMetadata(middlewareMetadata) {
27
+ let controllerMiddlewares = this.connectionMiddlewares.get(middlewareMetadata.controllerConstructor);
28
+ if (!controllerMiddlewares) {
29
+ this.connectionMiddlewares.set(middlewareMetadata.controllerConstructor, (controllerMiddlewares = new Map()));
30
+ }
31
+ let methodMiddlewares = controllerMiddlewares.get(middlewareMetadata.functionName);
32
+ if (!methodMiddlewares) {
33
+ controllerMiddlewares.set(middlewareMetadata.functionName, (methodMiddlewares = []));
34
+ }
35
+ methodMiddlewares.unshift(middlewareMetadata);
36
+ }
37
+ getControllerSockerConnectionsInfo(controllerConstructor) {
38
+ const controller = this.socketControllers.get(controllerConstructor);
39
+ if (!controller) {
40
+ throw new Error(`${controllerConstructor.name} should be decorated with @socketController`);
41
+ }
42
+ const connections = this.socketConnections.get(controllerConstructor);
43
+ const events = this.socketEvents.get(controllerConstructor) ?? new Map();
44
+ if (!connections?.size) {
45
+ // TODO: Warning
46
+ return [];
47
+ }
48
+ return [...connections.values()].map((connection) => ({
49
+ ...connection,
50
+ events: (() => {
51
+ const connectionNamespace = connection.config?.namespace;
52
+ return [...events.values()].filter((x) => x.config?.namespace === connectionNamespace);
53
+ })(),
54
+ connectionMiddlewares: this.connectionMiddlewares
55
+ .get(connection.controllerConstructor)
56
+ ?.get(connection.functionName) ?? [],
57
+ controller: this.socketControllers.get(connection.controllerConstructor),
58
+ }));
59
+ }
60
+ };
61
+ SocketControllerMetadataStore = __decorate([
62
+ singleton()
63
+ ], SocketControllerMetadataStore);
64
+
65
+ export { SocketControllerMetadataStore };
@@ -0,0 +1,99 @@
1
+ import { SocketControllerMetadataStore } from './metadata/SocketControllerMetadataStore.js';
2
+ import { container } from '../../core/injection/index.js';
3
+ import path__default from 'path';
4
+ import { Logger } from '../../core/logger/Logger.js';
5
+ import { SocketServerProvider } from '../socket/SocketServerProvider.js';
6
+ import { CustomError } from '../../core/error/CustomError.js';
7
+ import '../../core/validation/metadata/ValidationMetadataStore.js';
8
+ import { validate } from '../../core/validation/validate.js';
9
+
10
+ function runSocketControllers(controllers) {
11
+ const logger = new Logger('wabot:socket');
12
+ const metadataStore = container.resolve(SocketControllerMetadataStore);
13
+ const socketServerProvider = container.resolve(SocketServerProvider);
14
+ const socketServer = socketServerProvider.getSocketServer();
15
+ controllers.forEach((controller) => {
16
+ const connections = metadataStore.getControllerSockerConnectionsInfo(controller);
17
+ connections.forEach((connection) => {
18
+ const namespace = path__default
19
+ .join(connection.controller.config?.namespace ?? '/', connection.config?.namespace ?? '')
20
+ .replaceAll('\\', '/');
21
+ logger.info(`config connection to ${namespace}`);
22
+ const namespaceServer = socketServer.of(namespace);
23
+ namespaceServer.use(async (socket, next) => {
24
+ const connectionContainer = container.createChildContainer();
25
+ try {
26
+ const middlewares = connection.connectionMiddlewares.map((x) => connectionContainer.resolve(x.middlewareConstructor));
27
+ for (const middleware of middlewares) {
28
+ await middleware.handle(socket, connectionContainer);
29
+ }
30
+ socket.data.connectionContainer = connectionContainer;
31
+ next();
32
+ }
33
+ catch (err) {
34
+ next(err);
35
+ connectionContainer.dispose();
36
+ }
37
+ });
38
+ namespaceServer.on('connection', async (socket) => {
39
+ logger.trace(`connection on '${namespace}'`);
40
+ const connectionContainer = socket.data.connectionContainer;
41
+ try {
42
+ const controllerInstance = connectionContainer.resolve(connection.controllerConstructor);
43
+ connection.events.forEach((event) => {
44
+ logger.trace(`config listener to '${event.config.event}' event on '${namespace}'`);
45
+ socket.on(event.config.event, async (req, callback) => {
46
+ logger.trace(`received '${event.config.event}' event on '${namespace}'`);
47
+ try {
48
+ const reqType = event.paramsTypes[0];
49
+ if (typeof reqType !== 'function') {
50
+ throw new CustomError({
51
+ httpCode: 400,
52
+ message: 'Unable to validate request',
53
+ });
54
+ }
55
+ const { value, error } = validate(req, reqType);
56
+ if (error) {
57
+ throw new CustomError({
58
+ httpCode: 400,
59
+ message: error.description,
60
+ info: error,
61
+ });
62
+ }
63
+ const out = await controllerInstance[event.functionName].apply(controllerInstance, [value, socket]);
64
+ callback(out);
65
+ }
66
+ catch (err) {
67
+ logger.error(err);
68
+ if (err instanceof Error) {
69
+ const keys = Object.keys(err).filter((key) => !['message', 'stack'].includes(key));
70
+ const { httpCode, ...info } = keys.reduce((acc, key) => {
71
+ acc[key] = err[key];
72
+ return acc;
73
+ }, {});
74
+ if (typeof callback === 'function') {
75
+ callback({ error: { ...info, message: err.message, stack: err.stack } });
76
+ }
77
+ }
78
+ else {
79
+ if (typeof callback === 'function') {
80
+ callback({ error: { message: 'Unspected error' } });
81
+ }
82
+ }
83
+ }
84
+ });
85
+ });
86
+ await controllerInstance[connection.functionName].apply(controllerInstance, [socket]);
87
+ }
88
+ catch (err) {
89
+ logger.error(err);
90
+ socket.disconnect();
91
+ connectionContainer.dispose();
92
+ }
93
+ });
94
+ });
95
+ });
96
+ socketServerProvider.listen();
97
+ }
98
+
99
+ export { runSocketControllers };