bootifyjs 0.1.1 → 1.0.0

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 (261) hide show
  1. package/dist/api.d.ts +8 -27
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +68 -134
  4. package/dist/api.js.map +1 -1
  5. package/dist/cache/bootstrap.d.ts +6 -0
  6. package/dist/cache/bootstrap.d.ts.map +1 -0
  7. package/dist/cache/bootstrap.js +23 -0
  8. package/dist/cache/bootstrap.js.map +1 -0
  9. package/dist/cache/cache.service.d.ts +9 -0
  10. package/dist/cache/cache.service.d.ts.map +1 -0
  11. package/dist/cache/cache.service.js +40 -0
  12. package/dist/cache/cache.service.js.map +1 -0
  13. package/dist/cache/cache.types.d.ts +14 -0
  14. package/dist/cache/cache.types.d.ts.map +1 -0
  15. package/dist/cache/cache.types.js +8 -0
  16. package/dist/cache/cache.types.js.map +1 -0
  17. package/dist/cache/decorators.d.ts +12 -0
  18. package/dist/cache/decorators.d.ts.map +1 -0
  19. package/dist/cache/decorators.js +53 -0
  20. package/dist/cache/decorators.js.map +1 -0
  21. package/dist/cache/in-memory-cache.store.d.ts +8 -0
  22. package/dist/cache/in-memory-cache.store.d.ts.map +1 -0
  23. package/dist/cache/in-memory-cache.store.js +39 -0
  24. package/dist/cache/in-memory-cache.store.js.map +1 -0
  25. package/dist/cache/index.d.ts +5 -0
  26. package/dist/cache/index.d.ts.map +1 -0
  27. package/dist/cache/index.js +21 -0
  28. package/dist/cache/index.js.map +1 -0
  29. package/dist/core/component-registry.d.ts +7 -0
  30. package/dist/core/component-registry.d.ts.map +1 -0
  31. package/dist/core/component-registry.js +9 -0
  32. package/dist/core/component-registry.js.map +1 -0
  33. package/dist/core/decorators.d.ts +38 -22
  34. package/dist/core/decorators.d.ts.map +1 -0
  35. package/dist/core/decorators.js +155 -174
  36. package/dist/core/decorators.js.map +1 -1
  37. package/dist/core/di-container.d.ts +31 -0
  38. package/dist/core/di-container.d.ts.map +1 -0
  39. package/dist/core/di-container.js +219 -0
  40. package/dist/core/di-container.js.map +1 -0
  41. package/dist/core/index.d.ts +5 -0
  42. package/dist/core/index.d.ts.map +1 -0
  43. package/dist/core/index.js +21 -0
  44. package/dist/core/index.js.map +1 -0
  45. package/dist/core/request-context.service.d.ts +24 -0
  46. package/dist/core/request-context.service.d.ts.map +1 -0
  47. package/dist/core/request-context.service.js +52 -0
  48. package/dist/core/request-context.service.js.map +1 -0
  49. package/dist/core/router.d.ts +4 -32
  50. package/dist/core/router.d.ts.map +1 -0
  51. package/dist/core/router.js +81 -258
  52. package/dist/core/router.js.map +1 -1
  53. package/dist/events/bootstrap.d.ts +8 -0
  54. package/dist/events/bootstrap.d.ts.map +1 -0
  55. package/dist/events/bootstrap.js +37 -0
  56. package/dist/events/bootstrap.js.map +1 -0
  57. package/dist/events/decorators.d.ts +16 -0
  58. package/dist/events/decorators.d.ts.map +1 -0
  59. package/dist/events/decorators.js +37 -0
  60. package/dist/events/decorators.js.map +1 -0
  61. package/dist/events/event-bus.service.d.ts +21 -0
  62. package/dist/events/event-bus.service.d.ts.map +1 -0
  63. package/dist/events/event-bus.service.js +78 -0
  64. package/dist/events/event-bus.service.js.map +1 -0
  65. package/dist/events/event.types.d.ts +17 -0
  66. package/dist/events/event.types.d.ts.map +1 -0
  67. package/dist/events/event.types.js.map +1 -0
  68. package/dist/events/index.d.ts +5 -13
  69. package/dist/events/index.d.ts.map +1 -0
  70. package/dist/events/index.js +4 -54
  71. package/dist/events/index.js.map +1 -1
  72. package/dist/examples/controllers/health.controller.d.ts +7 -0
  73. package/dist/examples/controllers/health.controller.d.ts.map +1 -0
  74. package/dist/{events/examples/system.events.js → examples/controllers/health.controller.js} +16 -15
  75. package/dist/examples/controllers/health.controller.js.map +1 -0
  76. package/dist/examples/controllers/todo.controller.d.ts +31 -0
  77. package/dist/examples/controllers/todo.controller.d.ts.map +1 -0
  78. package/dist/examples/controllers/todo.controller.js +102 -0
  79. package/dist/examples/controllers/todo.controller.js.map +1 -0
  80. package/dist/examples/events/TodoEventHandler.d.ts +2 -0
  81. package/dist/examples/events/TodoEventHandler.d.ts.map +1 -0
  82. package/dist/examples/events/TodoEventHandler.js +31 -0
  83. package/dist/examples/events/TodoEventHandler.js.map +1 -0
  84. package/dist/examples/events/todo.events.d.ts +16 -0
  85. package/dist/examples/events/todo.events.d.ts.map +1 -0
  86. package/dist/examples/events/todo.events.js +13 -0
  87. package/dist/examples/events/todo.events.js.map +1 -0
  88. package/dist/examples/index.d.ts +2 -0
  89. package/dist/examples/index.d.ts.map +1 -0
  90. package/dist/examples/index.js +35 -0
  91. package/dist/examples/index.js.map +1 -0
  92. package/dist/examples/repositories/todo.repository.d.ts +20 -0
  93. package/dist/examples/repositories/todo.repository.d.ts.map +1 -0
  94. package/dist/examples/repositories/todo.repository.js +33 -0
  95. package/dist/examples/repositories/todo.repository.js.map +1 -0
  96. package/dist/examples/services/todo.service.d.ts +33 -0
  97. package/dist/examples/services/todo.service.d.ts.map +1 -0
  98. package/dist/examples/services/todo.service.js +80 -0
  99. package/dist/examples/services/todo.service.js.map +1 -0
  100. package/dist/examples/todos/schema.d.ts +54 -0
  101. package/dist/examples/todos/schema.d.ts.map +1 -0
  102. package/dist/examples/todos/schema.js +20 -0
  103. package/dist/examples/todos/schema.js.map +1 -0
  104. package/dist/index.d.ts +7 -17
  105. package/dist/index.d.ts.map +1 -0
  106. package/dist/index.js +20 -95
  107. package/dist/index.js.map +1 -1
  108. package/dist/logging/config/logging.config.d.ts +31 -3
  109. package/dist/logging/config/logging.config.d.ts.map +1 -0
  110. package/dist/logging/config/logging.config.js +43 -93
  111. package/dist/logging/config/logging.config.js.map +1 -1
  112. package/dist/logging/core/decorators.d.ts +16 -0
  113. package/dist/logging/core/decorators.d.ts.map +1 -0
  114. package/dist/logging/core/decorators.js +74 -0
  115. package/dist/logging/core/decorators.js.map +1 -0
  116. package/dist/logging/core/logger.provider.d.ts +4 -0
  117. package/dist/logging/core/logger.provider.d.ts.map +1 -0
  118. package/dist/logging/core/logger.provider.js +68 -0
  119. package/dist/logging/core/logger.provider.js.map +1 -0
  120. package/dist/logging/core/logger.service.d.ts +9 -27
  121. package/dist/logging/core/logger.service.d.ts.map +1 -0
  122. package/dist/logging/core/logger.service.js +34 -164
  123. package/dist/logging/core/logger.service.js.map +1 -1
  124. package/dist/logging/core/{startup-logger.service.d.ts → startup.logger.d.ts} +4 -6
  125. package/dist/logging/core/startup.logger.d.ts.map +1 -0
  126. package/dist/logging/core/{startup-logger.service.js → startup.logger.js} +36 -42
  127. package/dist/logging/core/startup.logger.js.map +1 -0
  128. package/dist/logging/index.d.ts +7 -14
  129. package/dist/logging/index.d.ts.map +1 -0
  130. package/dist/logging/index.js +17 -28
  131. package/dist/logging/index.js.map +1 -1
  132. package/dist/middleware/auth.middleware.d.ts +3 -0
  133. package/dist/middleware/auth.middleware.d.ts.map +1 -0
  134. package/dist/middleware/auth.middleware.js +18 -0
  135. package/dist/middleware/auth.middleware.js.map +1 -0
  136. package/dist/middleware/context.middleware.d.ts +7 -0
  137. package/dist/middleware/context.middleware.d.ts.map +1 -0
  138. package/dist/middleware/context.middleware.js +25 -0
  139. package/dist/middleware/context.middleware.js.map +1 -0
  140. package/dist/middleware/index.d.ts +4 -0
  141. package/dist/middleware/index.d.ts.map +1 -0
  142. package/dist/middleware/index.js +20 -0
  143. package/dist/middleware/index.js.map +1 -0
  144. package/dist/middleware/request-logger.middleware.d.ts +4 -0
  145. package/dist/middleware/request-logger.middleware.d.ts.map +1 -0
  146. package/dist/middleware/request-logger.middleware.js +18 -0
  147. package/dist/middleware/request-logger.middleware.js.map +1 -0
  148. package/package.json +52 -47
  149. package/LICENSE +0 -21
  150. package/README.md +0 -423
  151. package/dist/config/app.config.d.ts +0 -29
  152. package/dist/config/app.config.js +0 -55
  153. package/dist/config/app.config.js.map +0 -1
  154. package/dist/controllers/config.controller.d.ts +0 -16
  155. package/dist/controllers/config.controller.js +0 -66
  156. package/dist/controllers/config.controller.js.map +0 -1
  157. package/dist/controllers/events.controller.d.ts +0 -66
  158. package/dist/controllers/events.controller.js +0 -145
  159. package/dist/controllers/events.controller.js.map +0 -1
  160. package/dist/controllers/health.controller.d.ts +0 -20
  161. package/dist/controllers/health.controller.js +0 -92
  162. package/dist/controllers/health.controller.js.map +0 -1
  163. package/dist/controllers/user.controller.d.ts +0 -13
  164. package/dist/controllers/user.controller.js +0 -209
  165. package/dist/controllers/user.controller.js.map +0 -1
  166. package/dist/core/application.d.ts +0 -21
  167. package/dist/core/application.js +0 -90
  168. package/dist/core/application.js.map +0 -1
  169. package/dist/core/config.d.ts +0 -3
  170. package/dist/core/config.js +0 -78
  171. package/dist/core/config.js.map +0 -1
  172. package/dist/core/container.d.ts +0 -17
  173. package/dist/core/container.js +0 -92
  174. package/dist/core/container.js.map +0 -1
  175. package/dist/core/errors.d.ts +0 -18
  176. package/dist/core/errors.js +0 -74
  177. package/dist/core/errors.js.map +0 -1
  178. package/dist/core/middleware.d.ts +0 -8
  179. package/dist/core/middleware.js +0 -23
  180. package/dist/core/middleware.js.map +0 -1
  181. package/dist/core/openapi.d.ts +0 -80
  182. package/dist/core/openapi.js +0 -189
  183. package/dist/core/openapi.js.map +0 -1
  184. package/dist/core/utils.d.ts +0 -7
  185. package/dist/core/utils.js +0 -75
  186. package/dist/core/utils.js.map +0 -1
  187. package/dist/core/validation.d.ts +0 -15
  188. package/dist/core/validation.js +0 -161
  189. package/dist/core/validation.js.map +0 -1
  190. package/dist/events/core/event-bus.d.ts +0 -26
  191. package/dist/events/core/event-bus.js +0 -253
  192. package/dist/events/core/event-bus.js.map +0 -1
  193. package/dist/events/core/event-registry.d.ts +0 -31
  194. package/dist/events/core/event-registry.js +0 -170
  195. package/dist/events/core/event-registry.js.map +0 -1
  196. package/dist/events/decorators/event.decorators.d.ts +0 -11
  197. package/dist/events/decorators/event.decorators.js +0 -123
  198. package/dist/events/decorators/event.decorators.js.map +0 -1
  199. package/dist/events/examples/system.events.d.ts +0 -15
  200. package/dist/events/examples/system.events.js.map +0 -1
  201. package/dist/events/examples/user.events.d.ts +0 -68
  202. package/dist/events/examples/user.events.js +0 -73
  203. package/dist/events/examples/user.events.js.map +0 -1
  204. package/dist/events/examples/user.handlers.d.ts +0 -20
  205. package/dist/events/examples/user.handlers.js +0 -157
  206. package/dist/events/examples/user.handlers.js.map +0 -1
  207. package/dist/events/middleware/logging.middleware.d.ts +0 -7
  208. package/dist/events/middleware/logging.middleware.js +0 -44
  209. package/dist/events/middleware/logging.middleware.js.map +0 -1
  210. package/dist/events/middleware/metrics.middleware.d.ts +0 -11
  211. package/dist/events/middleware/metrics.middleware.js +0 -87
  212. package/dist/events/middleware/metrics.middleware.js.map +0 -1
  213. package/dist/events/middleware/validation.middleware.d.ts +0 -8
  214. package/dist/events/middleware/validation.middleware.js +0 -63
  215. package/dist/events/middleware/validation.middleware.js.map +0 -1
  216. package/dist/events/store/memory-event-store.d.ts +0 -21
  217. package/dist/events/store/memory-event-store.js +0 -81
  218. package/dist/events/store/memory-event-store.js.map +0 -1
  219. package/dist/events/types/event.types.d.ts +0 -57
  220. package/dist/events/types/event.types.js.map +0 -1
  221. package/dist/examples/basic-api.d.ts +0 -1
  222. package/dist/examples/basic-api.js +0 -120
  223. package/dist/examples/basic-api.js.map +0 -1
  224. package/dist/logging/core/log-context.service.d.ts +0 -11
  225. package/dist/logging/core/log-context.service.js +0 -40
  226. package/dist/logging/core/log-context.service.js.map +0 -1
  227. package/dist/logging/core/startup-logger.service.js.map +0 -1
  228. package/dist/logging/decorators/log.decorator.d.ts +0 -11
  229. package/dist/logging/decorators/log.decorator.js +0 -80
  230. package/dist/logging/decorators/log.decorator.js.map +0 -1
  231. package/dist/logging/middleware/context.middleware.d.ts +0 -2
  232. package/dist/logging/middleware/context.middleware.js +0 -29
  233. package/dist/logging/middleware/context.middleware.js.map +0 -1
  234. package/dist/logging/middleware/request-logging.middleware.d.ts +0 -3
  235. package/dist/logging/middleware/request-logging.middleware.js +0 -78
  236. package/dist/logging/middleware/request-logging.middleware.js.map +0 -1
  237. package/dist/logging/types/logging.types.d.ts +0 -79
  238. package/dist/logging/types/logging.types.js +0 -3
  239. package/dist/logging/types/logging.types.js.map +0 -1
  240. package/dist/middlewares/auth.middleware.d.ts +0 -2
  241. package/dist/middlewares/auth.middleware.js +0 -20
  242. package/dist/middlewares/auth.middleware.js.map +0 -1
  243. package/dist/middlewares/cors.middleware.d.ts +0 -2
  244. package/dist/middlewares/cors.middleware.js +0 -16
  245. package/dist/middlewares/cors.middleware.js.map +0 -1
  246. package/dist/middlewares/swagger.middleware.d.ts +0 -6
  247. package/dist/middlewares/swagger.middleware.js +0 -84
  248. package/dist/middlewares/swagger.middleware.js.map +0 -1
  249. package/dist/repositories/user.repository.d.ts +0 -16
  250. package/dist/repositories/user.repository.js +0 -110
  251. package/dist/repositories/user.repository.js.map +0 -1
  252. package/dist/schemas/user.schemas.d.ts +0 -214
  253. package/dist/schemas/user.schemas.js +0 -71
  254. package/dist/schemas/user.schemas.js.map +0 -1
  255. package/dist/services/config-demo.service.d.ts +0 -10
  256. package/dist/services/config-demo.service.js +0 -88
  257. package/dist/services/config-demo.service.js.map +0 -1
  258. package/dist/services/user.service.d.ts +0 -21
  259. package/dist/services/user.service.js +0 -201
  260. package/dist/services/user.service.js.map +0 -1
  261. /package/dist/events/{types/event.types.js → event.types.js} +0 -0
@@ -1,266 +1,89 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Router = void 0;
4
- const container_1 = require("./container");
5
- const errors_1 = require("./errors");
6
- const utils_1 = require("./utils");
7
- const validation_1 = require("./validation");
8
- const logger_service_1 = require("../logging/core/logger.service");
9
- class Router {
10
- constructor() {
11
- this.routes = [];
12
- try {
13
- this.logger = logger_service_1.LoggerService.getInstance();
3
+ exports.registerControllers = registerControllers;
4
+ const zod_to_json_schema_1 = require("zod-to-json-schema");
5
+ const di_container_1 = require("./di-container");
6
+ const decorators_1 = require("./decorators");
7
+ // const buildJsonSchema = (schemas: any) => {
8
+ // const schema: any = {}
9
+ // if (schemas.body) schema.body = zodToJsonSchema(schemas.body)
10
+ // if (schemas.query) schema.querystring = zodToJsonSchema(schemas.query)
11
+ // if (schemas.params) schema.params = zodToJsonSchema(schemas.params)
12
+ // return schema
13
+ // }
14
+ function buildFastifySchema(options) {
15
+ const schema = {};
16
+ if (options.body)
17
+ schema.body = (0, zod_to_json_schema_1.zodToJsonSchema)(options.body);
18
+ if (options.query)
19
+ schema.querystring = (0, zod_to_json_schema_1.zodToJsonSchema)(options.query);
20
+ if (options.params)
21
+ schema.params = (0, zod_to_json_schema_1.zodToJsonSchema)(options.params);
22
+ if (options.responses) {
23
+ schema.response = {};
24
+ for (const statusCode in options.responses) {
25
+ schema.response[statusCode] = (0, zod_to_json_schema_1.zodToJsonSchema)(options.responses[statusCode]);
14
26
  }
15
- catch (error) {
16
- // Logger not initialized yet
17
- }
18
- }
19
- registerControllers(controllers) {
20
- if (this.logger) {
21
- this.logger.component('Registering controllers', { count: controllers.length });
22
- }
23
- controllers.forEach(Controller => {
24
- this.registerController(Controller);
25
- });
26
- if (this.logger) {
27
- this.logger.component('Controllers registered successfully', {
28
- totalRoutes: this.routes.length,
29
- controllers: controllers.map(c => c.name)
30
- });
31
- }
32
- // Log all registered routes
33
- this.logRegisteredRoutes();
34
27
  }
35
- registerController(Controller) {
36
- const prefix = Reflect.getMetadata('controller:prefix', Controller) || '';
37
- const classMiddlewares = Reflect.getMetadata('middlewares', Controller) || [];
38
- const instance = container_1.container.resolve(Controller);
39
- if (this.logger) {
40
- this.logger.trace(`Registering controller: ${Controller.name}`, { prefix });
41
- }
42
- const methodNames = Object.getOwnPropertyNames(Controller.prototype);
43
- methodNames.forEach(methodName => {
44
- if (methodName === 'constructor')
45
- return;
46
- const method = Reflect.getMetadata('route:method', Controller.prototype, methodName);
47
- const path = Reflect.getMetadata('route:path', Controller.prototype, methodName);
48
- const methodMiddlewares = Reflect.getMetadata('middlewares', Controller.prototype, methodName) || [];
49
- if (method && path !== undefined) {
50
- const fullPath = `${prefix}${path}`.replace(/\/+/g, '/');
51
- const allMiddlewares = [...classMiddlewares, ...methodMiddlewares];
52
- this.routes.push({
53
- method: method.toUpperCase(),
54
- path: fullPath,
55
- handler: Controller.prototype[methodName],
56
- controller: instance,
57
- middlewares: allMiddlewares,
58
- originalMethod: methodName
59
- });
60
- if (this.logger) {
61
- this.logger.trace(`Route registered: ${method.toUpperCase()} ${fullPath}`, {
62
- controller: Controller.name,
63
- method: methodName,
64
- middlewares: allMiddlewares.length
65
- });
66
- }
67
- }
68
- });
69
- }
70
- logRegisteredRoutes() {
71
- if (!this.logger)
72
- return;
73
- // Group routes by controller for better organization
74
- const routesByController = this.routes.reduce((acc, route) => {
75
- const controllerName = route.controller.constructor.name;
76
- if (!acc[controllerName]) {
77
- acc[controllerName] = [];
78
- }
79
- acc[controllerName].push({
28
+ return schema;
29
+ }
30
+ function registerControllers(fastify, controllers) {
31
+ console.log('📋 Registering controllers...');
32
+ controllers.forEach((controllerClass) => {
33
+ // 👇 Read controller-level middleware
34
+ const classMiddlewares = Reflect.getMetadata(decorators_1.METADATA_KEYS.middleware, controllerClass) || [];
35
+ const controllerInstance = di_container_1.container.resolve(controllerClass);
36
+ const prefix = Reflect.getMetadata(decorators_1.METADATA_KEYS.controllerPrefix, controllerClass) || '';
37
+ const routes = Reflect.getMetadata(decorators_1.METADATA_KEYS.routes, controllerClass) || [];
38
+ routes.forEach((route) => {
39
+ // 👇 Read method-level middleware
40
+ const methodMiddlewares = Reflect.getMetadata(decorators_1.METADATA_KEYS.middleware, controllerInstance, route.handlerName) || [];
41
+ const allMiddlewares = [...classMiddlewares, ...methodMiddlewares]; // Combine them
42
+ const handler = controllerInstance[route.handlerName].bind(controllerInstance);
43
+ const paramDecorators = Reflect.getMetadata(decorators_1.METADATA_KEYS.paramTypes, controllerInstance, route.handlerName) || [];
44
+ const validationSchemas = Reflect.getMetadata(decorators_1.METADATA_KEYS.validationSchema, controllerInstance, route.handlerName);
45
+ console.log(validationSchemas);
46
+ const routeOptions = {
80
47
  method: route.method,
81
- path: route.path,
82
- handler: route.originalMethod,
83
- middlewares: route.middlewares.length
84
- });
85
- return acc;
86
- }, {});
87
- // Log summary
88
- this.logger.info('📋 Registered Routes Summary', {
89
- totalRoutes: this.routes.length,
90
- controllers: Object.keys(routesByController).length
48
+ url: `${prefix}${route.path}`.replace(/\/+/g, '/'),
49
+ schema: validationSchemas ? buildFastifySchema(validationSchemas) : {},
50
+ // 👇 Attach all middleware functions to the preHandler hook
51
+ preHandler: allMiddlewares,
52
+ handler: async (request, reply) => {
53
+ // ... handler logic remains the same
54
+ try {
55
+ const args = paramDecorators.map((param) => {
56
+ if (!param)
57
+ return undefined;
58
+ switch (param.type) {
59
+ case 'body':
60
+ return request.body;
61
+ case 'query':
62
+ return param.name ? request.query[param.name] : request.query;
63
+ case 'param':
64
+ return request.params[param.name];
65
+ case 'request':
66
+ return request;
67
+ case 'reply':
68
+ return reply;
69
+ default:
70
+ return undefined;
71
+ }
72
+ });
73
+ const result = await handler(...args);
74
+ if (!reply.sent) {
75
+ return result;
76
+ }
77
+ }
78
+ catch (error) {
79
+ throw error;
80
+ }
81
+ },
82
+ };
83
+ fastify.route(routeOptions);
84
+ console.log(` ✓ Registered: ${route.method.padEnd(7)} ${routeOptions.url} (middlewares: ${allMiddlewares.length})`);
91
85
  });
92
- // Log routes by controller
93
- Object.entries(routesByController).forEach(([controllerName, routes]) => {
94
- this.logger.info(`🎯 ${controllerName} Routes:`, {
95
- controller: controllerName,
96
- routes: routes.map(r => `${r.method} ${r.path} -> ${r.handler}()`),
97
- count: routes.length
98
- });
99
- });
100
- // Create a formatted table for console output
101
- this.logRoutesTable();
102
- }
103
- logRoutesTable() {
104
- console.log('\n📋 Available Routes:');
105
- console.log('─'.repeat(80));
106
- console.log('Method'.padEnd(8) + 'Path'.padEnd(30) + 'Controller'.padEnd(20) + 'Handler'.padEnd(15) + 'Middlewares');
107
- console.log('─'.repeat(80));
108
- // Sort routes by path for better readability
109
- const sortedRoutes = [...this.routes].sort((a, b) => a.path.localeCompare(b.path));
110
- sortedRoutes.forEach(route => {
111
- const method = route.method.padEnd(8);
112
- const path = route.path.padEnd(30);
113
- const controller = route.controller.constructor.name.padEnd(20);
114
- const handler = route.originalMethod.padEnd(15);
115
- const middlewares = route.middlewares.length.toString();
116
- console.log(`${method}${path}${controller}${handler}${middlewares}`);
117
- });
118
- console.log('─'.repeat(80));
119
- console.log(`Total: ${this.routes.length} routes registered\n`);
120
- }
121
- getRoutes() {
122
- return [...this.routes];
123
- }
124
- getRoutesSummary() {
125
- const routesByMethod = this.routes.reduce((acc, route) => {
126
- acc[route.method] = (acc[route.method] || 0) + 1;
127
- return acc;
128
- }, {});
129
- const routesByController = this.routes.reduce((acc, route) => {
130
- const controllerName = route.controller.constructor.name;
131
- acc[controllerName] = (acc[controllerName] || 0) + 1;
132
- return acc;
133
- }, {});
134
- return {
135
- totalRoutes: this.routes.length,
136
- routesByMethod,
137
- routesByController
138
- };
139
- }
140
- getRouteCount() {
141
- return this.routes.length;
142
- }
143
- async handleRequest(req, res) {
144
- const method = req.method?.toUpperCase() || 'GET';
145
- const url = req.url || '/';
146
- const pathname = url.split('?')[0];
147
- const route = this.findRoute(method, pathname);
148
- if (!route) {
149
- // Check if response has already been sent (e.g., by middleware)
150
- if (res.headersSent) {
151
- return;
152
- }
153
- res.writeHead(404, { 'Content-Type': 'application/json' });
154
- res.end(JSON.stringify({ error: 'Not Found', status: 404 }));
155
- return;
156
- }
157
- try {
158
- await this.executeRoute(route, req, res);
159
- }
160
- catch (error) {
161
- (0, errors_1.errorHandler)(error, res);
162
- }
163
- }
164
- findRoute(method, pathname) {
165
- // First try exact match for better performance
166
- const exactMatches = this.routes.filter(route => route.method === method && route.path === pathname);
167
- if (exactMatches.length > 0) {
168
- return { ...exactMatches[0], params: {} };
169
- }
170
- // Then try pattern matching
171
- for (const route of this.routes) {
172
- if (route.method === method) {
173
- const { isMatch, params } = (0, utils_1.matchRoute)(route.path, pathname);
174
- if (isMatch) {
175
- return { ...route, params };
176
- }
177
- }
178
- }
179
- return null;
180
- }
181
- async executeRoute(route, req, res) {
182
- // Execute middlewares
183
- await this.executeMiddlewares(route.middlewares, req, res);
184
- // Prepare handler arguments
185
- const args = await this.prepareHandlerArgs(route, req, res);
186
- // Execute handler
187
- const result = await route.handler.call(route.controller, ...args);
188
- // Validate response if schema exists
189
- const validationMeta = Reflect.getMetadata('validation', route.controller, route.originalMethod) || {};
190
- let finalResult = result;
191
- if (validationMeta.response && result !== undefined) {
192
- finalResult = validation_1.ValidationService.validateResponse(result, validationMeta.response);
193
- }
194
- // Send response if not already sent
195
- if (!res.headersSent) {
196
- res.writeHead(200, { 'Content-Type': 'application/json' });
197
- res.end(JSON.stringify(finalResult));
198
- }
199
- }
200
- async executeMiddlewares(middlewares, req, res) {
201
- let index = 0;
202
- const next = async () => {
203
- if (index < middlewares.length) {
204
- const middleware = middlewares[index++];
205
- await middleware(req, res, next);
206
- }
207
- };
208
- await next();
209
- }
210
- async prepareHandlerArgs(route, req, res) {
211
- const paramTypes = Reflect.getMetadata('design:paramtypes', route.controller, route.originalMethod) || [];
212
- const validationMeta = Reflect.getMetadata('validation', route.controller, route.originalMethod) || {};
213
- const args = [];
214
- // Parse and validate request data
215
- let body = null;
216
- let query = null;
217
- let params = route.params;
218
- // Validate params if schema exists
219
- if (validationMeta.params) {
220
- params = validation_1.ValidationService.validateParams(route.params, validationMeta.params);
221
- }
222
- // Parse and validate query if needed
223
- if (validationMeta.query) {
224
- const rawQuery = (0, utils_1.parseQuery)(req);
225
- query = validation_1.ValidationService.validateQuery(rawQuery, validationMeta.query);
226
- }
227
- else {
228
- query = (0, utils_1.parseQuery)(req);
229
- }
230
- // Parse and validate body if needed
231
- if (validationMeta.body) {
232
- const rawBody = await (0, utils_1.parseBody)(req);
233
- body = validation_1.ValidationService.validateBody(rawBody, validationMeta.body);
234
- }
235
- for (let i = 0; i < paramTypes.length; i++) {
236
- const paramMeta = Reflect.getMetadata(`param:${i}`, route.controller.constructor.prototype, route.originalMethod);
237
- if (paramMeta) {
238
- switch (paramMeta.type) {
239
- case 'request':
240
- args[i] = req;
241
- break;
242
- case 'response':
243
- args[i] = res;
244
- break;
245
- case 'body':
246
- args[i] = body || await (0, utils_1.parseBody)(req);
247
- break;
248
- case 'param':
249
- args[i] = params[paramMeta.name];
250
- break;
251
- case 'query':
252
- args[i] = paramMeta.name ? query[paramMeta.name] : query;
253
- break;
254
- default:
255
- args[i] = undefined;
256
- }
257
- }
258
- else {
259
- args[i] = undefined;
260
- }
261
- }
262
- return args;
263
- }
86
+ });
87
+ console.log('✅ All controllers registered successfully!\n');
264
88
  }
265
- exports.Router = Router;
266
89
  //# sourceMappingURL=router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/core/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/core/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Constructor } from '../core/di-container';
2
+ /**
3
+ * Scans all registered DI components for EventListeners and subscribes
4
+ * their handlers to the EventBus. Should be called once at application startup.
5
+ * @param components An array of all registered service/controller constructors.
6
+ */
7
+ export declare function bootstrapEventSystem(components: Constructor[]): void;
8
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/events/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAK7D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,WAAW,EAAE,QAgC7D"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bootstrapEventSystem = bootstrapEventSystem;
4
+ const di_container_1 = require("../core/di-container");
5
+ const event_bus_service_1 = require("./event-bus.service");
6
+ const decorators_1 = require("./decorators");
7
+ /**
8
+ * Scans all registered DI components for EventListeners and subscribes
9
+ * their handlers to the EventBus. Should be called once at application startup.
10
+ * @param components An array of all registered service/controller constructors.
11
+ */
12
+ function bootstrapEventSystem(components) {
13
+ console.log('🔄 Bootstrapping Event System...');
14
+ const eventBus = di_container_1.container.resolve(event_bus_service_1.EventBusService);
15
+ for (const component of components) {
16
+ const isListener = Reflect.getMetadata(decorators_1.EVENTS_METADATA_KEYS.eventListener, component);
17
+ if (!isListener) {
18
+ continue;
19
+ }
20
+ const handlers = Reflect.getMetadata(decorators_1.EVENTS_METADATA_KEYS.onEvent, component) || [];
21
+ if (handlers.length === 0) {
22
+ continue;
23
+ }
24
+ // Get the singleton instance of the listener class from the DI container
25
+ const listenerInstance = di_container_1.container.resolve(component);
26
+ console.log(` - Found listener: ${component.name}`);
27
+ for (const handlerInfo of handlers) {
28
+ const handler = {
29
+ handle: listenerInstance[handlerInfo.methodName].bind(listenerInstance),
30
+ };
31
+ eventBus.subscribe(handlerInfo.eventType, handler);
32
+ console.log(` ✓ Registered handler for '${handlerInfo.eventType}' -> ${handlerInfo.methodName}()`);
33
+ }
34
+ }
35
+ console.log('✅ Event System bootstrapped successfully!\n');
36
+ }
37
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/events/bootstrap.ts"],"names":[],"mappings":";;AAUA,oDAgCC;AA1CD,uDAA6D;AAC7D,2DAAqD;AACrD,6CAAmD;AAGnD;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,UAAyB;IAC5D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,wBAAS,CAAC,OAAO,CAAkB,mCAAe,CAAQ,CAAA;IAE3E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,iCAAoB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;QACrF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,SAAQ;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,iCAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,CAAA;QACnF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,SAAQ;QACV,CAAC;QAED,yEAAyE;QACzE,MAAM,gBAAgB,GAAG,wBAAS,CAAC,OAAO,CAAC,SAAS,CAAQ,CAAA;QAE5D,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;QAEpD,KAAK,MAAM,WAAW,IAAI,QAAQ,EAAE,CAAC;YACnC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;aACvD,CAAA;YAElB,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAClD,OAAO,CAAC,GAAG,CACT,iCAAiC,WAAW,CAAC,SAAS,QAAQ,WAAW,CAAC,UAAU,IAAI,CACzF,CAAA;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;AAC5D,CAAC"}
@@ -0,0 +1,16 @@
1
+ import 'reflect-metadata';
2
+ export declare const EVENTS_METADATA_KEYS: {
3
+ eventListener: string;
4
+ onEvent: string;
5
+ };
6
+ /**
7
+ * A class decorator that marks a class as a container for event listeners.
8
+ * The framework will automatically scan these classes for handlers.
9
+ */
10
+ export declare const EventListener: () => ClassDecorator;
11
+ /**
12
+ * A method decorator that registers the method as a handler for a specific event type.
13
+ * @param eventType The unique string identifier for the event.
14
+ */
15
+ export declare const OnEvent: (eventType: string) => MethodDecorator;
16
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/events/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAA;AAGzB,eAAO,MAAM,oBAAoB;;;CAGhC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAO,cAMhC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,WAAW,MAAM,KAAG,eAS3C,CAAA"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OnEvent = exports.EventListener = exports.EVENTS_METADATA_KEYS = void 0;
4
+ require("reflect-metadata");
5
+ const decorators_1 = require("../core/decorators");
6
+ exports.EVENTS_METADATA_KEYS = {
7
+ eventListener: 'bootify:event-listener',
8
+ onEvent: 'bootify:on-event',
9
+ };
10
+ /**
11
+ * A class decorator that marks a class as a container for event listeners.
12
+ * The framework will automatically scan these classes for handlers.
13
+ */
14
+ const EventListener = () => {
15
+ return (target) => {
16
+ Reflect.defineMetadata(exports.EVENTS_METADATA_KEYS.eventListener, true, target);
17
+ // Call the base Component decorator's logic
18
+ (0, decorators_1.Component)()(target);
19
+ };
20
+ };
21
+ exports.EventListener = EventListener;
22
+ /**
23
+ * A method decorator that registers the method as a handler for a specific event type.
24
+ * @param eventType The unique string identifier for the event.
25
+ */
26
+ const OnEvent = (eventType) => {
27
+ return (target, propertyKey) => {
28
+ const handlers = Reflect.getMetadata(exports.EVENTS_METADATA_KEYS.onEvent, target.constructor) || [];
29
+ handlers.push({
30
+ eventType,
31
+ methodName: propertyKey,
32
+ });
33
+ Reflect.defineMetadata(exports.EVENTS_METADATA_KEYS.onEvent, handlers, target.constructor);
34
+ };
35
+ };
36
+ exports.OnEvent = OnEvent;
37
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/events/decorators.ts"],"names":[],"mappings":";;;AAAA,4BAAyB;AACzB,mDAA8C;AAEjC,QAAA,oBAAoB,GAAG;IAClC,aAAa,EAAE,wBAAwB;IACvC,OAAO,EAAE,kBAAkB;CAC5B,CAAA;AAED;;;GAGG;AACI,MAAM,aAAa,GAAG,GAAmB,EAAE;IAChD,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,OAAO,CAAC,cAAc,CAAC,4BAAoB,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QACxE,4CAA4C;QAC5C,IAAA,sBAAS,GAAE,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC,CAAA;AACH,CAAC,CAAA;AANY,QAAA,aAAa,iBAMzB;AAED;;;GAGG;AACI,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAmB,EAAE;IAC5D,OAAO,CAAC,MAAW,EAAE,WAA4B,EAAE,EAAE;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,4BAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;QAC5F,QAAQ,CAAC,IAAI,CAAC;YACZ,SAAS;YACT,UAAU,EAAE,WAAW;SACxB,CAAC,CAAA;QACF,OAAO,CAAC,cAAc,CAAC,4BAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IACpF,CAAC,CAAA;AACH,CAAC,CAAA;AATY,QAAA,OAAO,WASnB"}
@@ -0,0 +1,21 @@
1
+ import { IEvent, IEventHandler } from './event.types';
2
+ export declare class EventBusService {
3
+ private readonly emitter;
4
+ private readonly deadLetterQueue;
5
+ private readonly options;
6
+ constructor();
7
+ /**
8
+ * Subscribes an event handler to a specific event type.
9
+ * This is used internally by the framework during bootstrap.
10
+ */
11
+ subscribe<T extends IEvent>(eventType: string, handler: IEventHandler<T>): void;
12
+ /**
13
+ * Emits an event to all registered listeners.
14
+ */
15
+ emit(event: IEvent): void;
16
+ /**
17
+ * Retrieves all events that have failed all retry attempts.
18
+ */
19
+ getDeadLetterQueue(): IEvent[];
20
+ }
21
+ //# sourceMappingURL=event-bus.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.service.d.ts","sourceRoot":"","sources":["../../src/events/event-bus.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAQrD,qBACa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;;IAYnD;;;OAGG;IACH,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IA4B/E;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASzB;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;CAG/B"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.EventBusService = void 0;
13
+ const events_1 = require("events");
14
+ const decorators_1 = require("../core/decorators");
15
+ const request_context_service_1 = require("../core/request-context.service");
16
+ let EventBusService = class EventBusService {
17
+ constructor() {
18
+ this.emitter = new events_1.EventEmitter();
19
+ this.deadLetterQueue = [];
20
+ // Default options can be extended via a ConfigService
21
+ this.options = {
22
+ maxRetries: 3,
23
+ retryDelayMs: 500,
24
+ };
25
+ // Increase max listeners to avoid warnings for many handlers
26
+ this.emitter.setMaxListeners(50);
27
+ }
28
+ /**
29
+ * Subscribes an event handler to a specific event type.
30
+ * This is used internally by the framework during bootstrap.
31
+ */
32
+ subscribe(eventType, handler) {
33
+ this.emitter.on(eventType, async (event) => {
34
+ let attempt = 0;
35
+ while (attempt < this.options.maxRetries) {
36
+ try {
37
+ console.log(`[EventBus] Attempt ${attempt + 1}: Handling event '${event.type}'`);
38
+ await handler.handle(event);
39
+ return; // Success, exit loop
40
+ }
41
+ catch (error) {
42
+ attempt++;
43
+ console.error(`[EventBus] Error handling event '${event.type}' (Attempt ${attempt})`, error);
44
+ if (attempt >= this.options.maxRetries) {
45
+ console.error(`[EventBus] Event '${event.type}' failed after ${this.options.maxRetries} attempts. Moving to DLQ.`);
46
+ this.deadLetterQueue.push(event);
47
+ }
48
+ else {
49
+ // Wait before retrying
50
+ await new Promise((res) => setTimeout(res, this.options.retryDelayMs * attempt));
51
+ }
52
+ }
53
+ }
54
+ });
55
+ }
56
+ /**
57
+ * Emits an event to all registered listeners.
58
+ */
59
+ emit(event) {
60
+ // Enrich event with correlationId from the current request context
61
+ const contextService = new request_context_service_1.RequestContextService();
62
+ event.correlationId = contextService.get('requestId');
63
+ console.log(`[EventBus] Emitting event '${event.type}'`, { correlationId: event.correlationId });
64
+ this.emitter.emit(event.type, event);
65
+ }
66
+ /**
67
+ * Retrieves all events that have failed all retry attempts.
68
+ */
69
+ getDeadLetterQueue() {
70
+ return [...this.deadLetterQueue];
71
+ }
72
+ };
73
+ exports.EventBusService = EventBusService;
74
+ exports.EventBusService = EventBusService = __decorate([
75
+ (0, decorators_1.Service)(),
76
+ __metadata("design:paramtypes", [])
77
+ ], EventBusService);
78
+ //# sourceMappingURL=event-bus.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.service.js","sourceRoot":"","sources":["../../src/events/event-bus.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAqC;AACrC,mDAAuD;AAEvD,6EAAuE;AAQhE,IAAM,eAAe,GAArB,MAAM,eAAe;IAK1B;QAJiB,YAAO,GAAG,IAAI,qBAAY,EAAE,CAAA;QAC5B,oBAAe,GAAa,EAAE,CAAA;QAI7C,sDAAsD;QACtD,IAAI,CAAC,OAAO,GAAG;YACb,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,GAAG;SAClB,CAAA;QACD,6DAA6D;QAC7D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IAED;;;OAGG;IACH,SAAS,CAAmB,SAAiB,EAAE,OAAyB;QACtE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAQ,EAAE,EAAE;YAC5C,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,OAAO,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,GAAG,CAAC,qBAAqB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAA;oBAChF,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBAC3B,OAAM,CAAC,qBAAqB;gBAC9B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,EAAE,CAAA;oBACT,OAAO,CAAC,KAAK,CACX,oCAAoC,KAAK,CAAC,IAAI,cAAc,OAAO,GAAG,EACtE,KAAK,CACN,CAAA;oBACD,IAAI,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;wBACvC,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,CAAC,IAAI,kBAAkB,IAAI,CAAC,OAAO,CAAC,UAAU,2BAA2B,CACpG,CAAA;wBACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBAClC,CAAC;yBAAM,CAAC;wBACN,uBAAuB;wBACvB,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,CAAC,CAAA;oBAClF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,KAAa;QAChB,mEAAmE;QACnE,MAAM,cAAc,GAAG,IAAI,+CAAqB,EAAE,CAAA;QAClD,KAAK,CAAC,aAAa,GAAG,cAAc,CAAC,GAAG,CAAS,WAAW,CAAC,CAAA;QAE7D,OAAO,CAAC,GAAG,CAAC,8BAA8B,KAAK,CAAC,IAAI,GAAG,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAA;QAChG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAA;IAClC,CAAC;CACF,CAAA;AAjEY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,oBAAO,GAAE;;GACG,eAAe,CAiE3B"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The base interface for all events.
3
+ * It ensures that every event has a unique type identifier.
4
+ */
5
+ export interface IEvent {
6
+ readonly type: string;
7
+ payload: any;
8
+ correlationId?: string;
9
+ }
10
+ /**
11
+ * Defines the shape of an event handler. It's a class with
12
+ * a 'handle' method for a specific event type.
13
+ */
14
+ export interface IEventHandler<T extends IEvent = IEvent> {
15
+ handle(event: T): Promise<void> | void;
16
+ }
17
+ //# sourceMappingURL=event.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.types.d.ts","sourceRoot":"","sources":["../../src/events/event.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,GAAG,CAAA;IACZ,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACtD,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CACvC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.types.js","sourceRoot":"","sources":["../../src/events/event.types.ts"],"names":[],"mappings":""}