bootifyjs 0.1.1 → 1.1.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.
- package/dist/api.d.ts +8 -27
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +68 -134
- package/dist/api.js.map +1 -1
- package/dist/cache/bootstrap.d.ts +6 -0
- package/dist/cache/bootstrap.d.ts.map +1 -0
- package/dist/cache/bootstrap.js +23 -0
- package/dist/cache/bootstrap.js.map +1 -0
- package/dist/cache/cache.service.d.ts +9 -0
- package/dist/cache/cache.service.d.ts.map +1 -0
- package/dist/cache/cache.service.js +40 -0
- package/dist/cache/cache.service.js.map +1 -0
- package/dist/cache/cache.types.d.ts +14 -0
- package/dist/cache/cache.types.d.ts.map +1 -0
- package/dist/cache/cache.types.js +8 -0
- package/dist/cache/cache.types.js.map +1 -0
- package/dist/cache/decorators.d.ts +12 -0
- package/dist/cache/decorators.d.ts.map +1 -0
- package/dist/cache/decorators.js +53 -0
- package/dist/cache/decorators.js.map +1 -0
- package/dist/cache/in-memory-cache.store.d.ts +8 -0
- package/dist/cache/in-memory-cache.store.d.ts.map +1 -0
- package/dist/cache/in-memory-cache.store.js +39 -0
- package/dist/cache/in-memory-cache.store.js.map +1 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/core/component-registry.d.ts +7 -0
- package/dist/core/component-registry.d.ts.map +1 -0
- package/dist/core/component-registry.js +9 -0
- package/dist/core/component-registry.js.map +1 -0
- package/dist/core/decorators.d.ts +38 -22
- package/dist/core/decorators.d.ts.map +1 -0
- package/dist/core/decorators.js +155 -174
- package/dist/core/decorators.js.map +1 -1
- package/dist/core/di-container.d.ts +31 -0
- package/dist/core/di-container.d.ts.map +1 -0
- package/dist/core/di-container.js +219 -0
- package/dist/core/di-container.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +21 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/request-context.service.d.ts +24 -0
- package/dist/core/request-context.service.d.ts.map +1 -0
- package/dist/core/request-context.service.js +52 -0
- package/dist/core/request-context.service.js.map +1 -0
- package/dist/core/router.d.ts +4 -32
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +81 -258
- package/dist/core/router.js.map +1 -1
- package/dist/events/bootstrap.d.ts +8 -0
- package/dist/events/bootstrap.d.ts.map +1 -0
- package/dist/events/bootstrap.js +37 -0
- package/dist/events/bootstrap.js.map +1 -0
- package/dist/events/decorators.d.ts +16 -0
- package/dist/events/decorators.d.ts.map +1 -0
- package/dist/events/decorators.js +37 -0
- package/dist/events/decorators.js.map +1 -0
- package/dist/events/event-bus.service.d.ts +21 -0
- package/dist/events/event-bus.service.d.ts.map +1 -0
- package/dist/events/event-bus.service.js +78 -0
- package/dist/events/event-bus.service.js.map +1 -0
- package/dist/events/event.types.d.ts +17 -0
- package/dist/events/event.types.d.ts.map +1 -0
- package/dist/events/event.types.js.map +1 -0
- package/dist/events/index.d.ts +5 -13
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +4 -54
- package/dist/events/index.js.map +1 -1
- package/dist/examples/controllers/health.controller.d.ts +7 -0
- package/dist/examples/controllers/health.controller.d.ts.map +1 -0
- package/dist/{events/examples/system.events.js → examples/controllers/health.controller.js} +16 -15
- package/dist/examples/controllers/health.controller.js.map +1 -0
- package/dist/examples/controllers/todo.controller.d.ts +31 -0
- package/dist/examples/controllers/todo.controller.d.ts.map +1 -0
- package/dist/examples/controllers/todo.controller.js +102 -0
- package/dist/examples/controllers/todo.controller.js.map +1 -0
- package/dist/examples/events/TodoEventHandler.d.ts +2 -0
- package/dist/examples/events/TodoEventHandler.d.ts.map +1 -0
- package/dist/examples/events/TodoEventHandler.js +31 -0
- package/dist/examples/events/TodoEventHandler.js.map +1 -0
- package/dist/examples/events/todo.events.d.ts +16 -0
- package/dist/examples/events/todo.events.d.ts.map +1 -0
- package/dist/examples/events/todo.events.js +13 -0
- package/dist/examples/events/todo.events.js.map +1 -0
- package/dist/examples/index.d.ts +2 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/dist/examples/index.js +35 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/examples/repositories/todo.repository.d.ts +20 -0
- package/dist/examples/repositories/todo.repository.d.ts.map +1 -0
- package/dist/examples/repositories/todo.repository.js +33 -0
- package/dist/examples/repositories/todo.repository.js.map +1 -0
- package/dist/examples/services/todo.service.d.ts +33 -0
- package/dist/examples/services/todo.service.d.ts.map +1 -0
- package/dist/examples/services/todo.service.js +80 -0
- package/dist/examples/services/todo.service.js.map +1 -0
- package/dist/examples/todos/schema.d.ts +54 -0
- package/dist/examples/todos/schema.d.ts.map +1 -0
- package/dist/examples/todos/schema.js +20 -0
- package/dist/examples/todos/schema.js.map +1 -0
- package/dist/index.d.ts +7 -17
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -95
- package/dist/index.js.map +1 -1
- package/dist/logging/config/logging.config.d.ts +31 -3
- package/dist/logging/config/logging.config.d.ts.map +1 -0
- package/dist/logging/config/logging.config.js +43 -93
- package/dist/logging/config/logging.config.js.map +1 -1
- package/dist/logging/core/decorators.d.ts +16 -0
- package/dist/logging/core/decorators.d.ts.map +1 -0
- package/dist/logging/core/decorators.js +74 -0
- package/dist/logging/core/decorators.js.map +1 -0
- package/dist/logging/core/logger.provider.d.ts +4 -0
- package/dist/logging/core/logger.provider.d.ts.map +1 -0
- package/dist/logging/core/logger.provider.js +68 -0
- package/dist/logging/core/logger.provider.js.map +1 -0
- package/dist/logging/core/logger.service.d.ts +9 -27
- package/dist/logging/core/logger.service.d.ts.map +1 -0
- package/dist/logging/core/logger.service.js +34 -164
- package/dist/logging/core/logger.service.js.map +1 -1
- package/dist/logging/core/{startup-logger.service.d.ts → startup.logger.d.ts} +4 -6
- package/dist/logging/core/startup.logger.d.ts.map +1 -0
- package/dist/logging/core/{startup-logger.service.js → startup.logger.js} +36 -42
- package/dist/logging/core/startup.logger.js.map +1 -0
- package/dist/logging/index.d.ts +7 -14
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +17 -28
- package/dist/logging/index.js.map +1 -1
- package/dist/middleware/auth.middleware.d.ts +3 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +18 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/middleware/context.middleware.d.ts +7 -0
- package/dist/middleware/context.middleware.d.ts.map +1 -0
- package/dist/middleware/context.middleware.js +25 -0
- package/dist/middleware/context.middleware.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +20 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/request-logger.middleware.d.ts +4 -0
- package/dist/middleware/request-logger.middleware.d.ts.map +1 -0
- package/dist/middleware/request-logger.middleware.js +18 -0
- package/dist/middleware/request-logger.middleware.js.map +1 -0
- package/package.json +52 -47
- package/LICENSE +0 -21
- package/README.md +0 -423
- package/dist/config/app.config.d.ts +0 -29
- package/dist/config/app.config.js +0 -55
- package/dist/config/app.config.js.map +0 -1
- package/dist/controllers/config.controller.d.ts +0 -16
- package/dist/controllers/config.controller.js +0 -66
- package/dist/controllers/config.controller.js.map +0 -1
- package/dist/controllers/events.controller.d.ts +0 -66
- package/dist/controllers/events.controller.js +0 -145
- package/dist/controllers/events.controller.js.map +0 -1
- package/dist/controllers/health.controller.d.ts +0 -20
- package/dist/controllers/health.controller.js +0 -92
- package/dist/controllers/health.controller.js.map +0 -1
- package/dist/controllers/user.controller.d.ts +0 -13
- package/dist/controllers/user.controller.js +0 -209
- package/dist/controllers/user.controller.js.map +0 -1
- package/dist/core/application.d.ts +0 -21
- package/dist/core/application.js +0 -90
- package/dist/core/application.js.map +0 -1
- package/dist/core/config.d.ts +0 -3
- package/dist/core/config.js +0 -78
- package/dist/core/config.js.map +0 -1
- package/dist/core/container.d.ts +0 -17
- package/dist/core/container.js +0 -92
- package/dist/core/container.js.map +0 -1
- package/dist/core/errors.d.ts +0 -18
- package/dist/core/errors.js +0 -74
- package/dist/core/errors.js.map +0 -1
- package/dist/core/middleware.d.ts +0 -8
- package/dist/core/middleware.js +0 -23
- package/dist/core/middleware.js.map +0 -1
- package/dist/core/openapi.d.ts +0 -80
- package/dist/core/openapi.js +0 -189
- package/dist/core/openapi.js.map +0 -1
- package/dist/core/utils.d.ts +0 -7
- package/dist/core/utils.js +0 -75
- package/dist/core/utils.js.map +0 -1
- package/dist/core/validation.d.ts +0 -15
- package/dist/core/validation.js +0 -161
- package/dist/core/validation.js.map +0 -1
- package/dist/events/core/event-bus.d.ts +0 -26
- package/dist/events/core/event-bus.js +0 -253
- package/dist/events/core/event-bus.js.map +0 -1
- package/dist/events/core/event-registry.d.ts +0 -31
- package/dist/events/core/event-registry.js +0 -170
- package/dist/events/core/event-registry.js.map +0 -1
- package/dist/events/decorators/event.decorators.d.ts +0 -11
- package/dist/events/decorators/event.decorators.js +0 -123
- package/dist/events/decorators/event.decorators.js.map +0 -1
- package/dist/events/examples/system.events.d.ts +0 -15
- package/dist/events/examples/system.events.js.map +0 -1
- package/dist/events/examples/user.events.d.ts +0 -68
- package/dist/events/examples/user.events.js +0 -73
- package/dist/events/examples/user.events.js.map +0 -1
- package/dist/events/examples/user.handlers.d.ts +0 -20
- package/dist/events/examples/user.handlers.js +0 -157
- package/dist/events/examples/user.handlers.js.map +0 -1
- package/dist/events/middleware/logging.middleware.d.ts +0 -7
- package/dist/events/middleware/logging.middleware.js +0 -44
- package/dist/events/middleware/logging.middleware.js.map +0 -1
- package/dist/events/middleware/metrics.middleware.d.ts +0 -11
- package/dist/events/middleware/metrics.middleware.js +0 -87
- package/dist/events/middleware/metrics.middleware.js.map +0 -1
- package/dist/events/middleware/validation.middleware.d.ts +0 -8
- package/dist/events/middleware/validation.middleware.js +0 -63
- package/dist/events/middleware/validation.middleware.js.map +0 -1
- package/dist/events/store/memory-event-store.d.ts +0 -21
- package/dist/events/store/memory-event-store.js +0 -81
- package/dist/events/store/memory-event-store.js.map +0 -1
- package/dist/events/types/event.types.d.ts +0 -57
- package/dist/events/types/event.types.js.map +0 -1
- package/dist/examples/basic-api.d.ts +0 -1
- package/dist/examples/basic-api.js +0 -120
- package/dist/examples/basic-api.js.map +0 -1
- package/dist/logging/core/log-context.service.d.ts +0 -11
- package/dist/logging/core/log-context.service.js +0 -40
- package/dist/logging/core/log-context.service.js.map +0 -1
- package/dist/logging/core/startup-logger.service.js.map +0 -1
- package/dist/logging/decorators/log.decorator.d.ts +0 -11
- package/dist/logging/decorators/log.decorator.js +0 -80
- package/dist/logging/decorators/log.decorator.js.map +0 -1
- package/dist/logging/middleware/context.middleware.d.ts +0 -2
- package/dist/logging/middleware/context.middleware.js +0 -29
- package/dist/logging/middleware/context.middleware.js.map +0 -1
- package/dist/logging/middleware/request-logging.middleware.d.ts +0 -3
- package/dist/logging/middleware/request-logging.middleware.js +0 -78
- package/dist/logging/middleware/request-logging.middleware.js.map +0 -1
- package/dist/logging/types/logging.types.d.ts +0 -79
- package/dist/logging/types/logging.types.js +0 -3
- package/dist/logging/types/logging.types.js.map +0 -1
- package/dist/middlewares/auth.middleware.d.ts +0 -2
- package/dist/middlewares/auth.middleware.js +0 -20
- package/dist/middlewares/auth.middleware.js.map +0 -1
- package/dist/middlewares/cors.middleware.d.ts +0 -2
- package/dist/middlewares/cors.middleware.js +0 -16
- package/dist/middlewares/cors.middleware.js.map +0 -1
- package/dist/middlewares/swagger.middleware.d.ts +0 -6
- package/dist/middlewares/swagger.middleware.js +0 -84
- package/dist/middlewares/swagger.middleware.js.map +0 -1
- package/dist/repositories/user.repository.d.ts +0 -16
- package/dist/repositories/user.repository.js +0 -110
- package/dist/repositories/user.repository.js.map +0 -1
- package/dist/schemas/user.schemas.d.ts +0 -214
- package/dist/schemas/user.schemas.js +0 -71
- package/dist/schemas/user.schemas.js.map +0 -1
- package/dist/services/config-demo.service.d.ts +0 -10
- package/dist/services/config-demo.service.js +0 -88
- package/dist/services/config-demo.service.js.map +0 -1
- package/dist/services/user.service.d.ts +0 -21
- package/dist/services/user.service.js +0 -201
- package/dist/services/user.service.js.map +0 -1
- /package/dist/events/{types/event.types.js → event.types.js} +0 -0
package/dist/core/router.js
CHANGED
@@ -1,266 +1,89 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
4
|
-
const
|
5
|
-
const
|
6
|
-
const
|
7
|
-
const
|
8
|
-
const
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
const
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
const
|
48
|
-
const
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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
|
-
|
93
|
-
|
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
|
package/dist/core/router.js.map
CHANGED
@@ -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":""}
|