@asenajs/asena 0.3.3 → 0.5.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/README.md +165 -140
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/adapter/AsenaAdapter.d.ts +19 -3
- package/dist/lib/adapter/AsenaAdapter.js.map +1 -1
- package/dist/lib/adapter/AsenaWebsocketAdapter.d.ts +2 -2
- package/dist/lib/adapter/AsenaWebsocketAdapter.js.map +1 -1
- package/dist/lib/adapter/types/RouteParams.d.ts +3 -0
- package/dist/lib/adapter/types/ServeOptions.d.ts +2 -2
- package/dist/lib/adapter/types/index.d.ts +4 -4
- package/dist/lib/adapter/types/index.js +4 -4
- package/dist/lib/adapter/types/index.js.map +1 -1
- package/dist/lib/ioc/CircularDependencyDetector.d.ts +49 -0
- package/dist/lib/ioc/CircularDependencyDetector.js +69 -0
- package/dist/lib/ioc/CircularDependencyDetector.js.map +1 -0
- package/dist/lib/ioc/Container.d.ts +16 -0
- package/dist/lib/ioc/Container.js +61 -11
- package/dist/lib/ioc/Container.js.map +1 -1
- package/dist/lib/ioc/CoreContainer.d.ts +78 -0
- package/dist/lib/ioc/CoreContainer.js +139 -0
- package/dist/lib/ioc/CoreContainer.js.map +1 -0
- package/dist/lib/ioc/IocEngine.d.ts +16 -6
- package/dist/lib/ioc/IocEngine.js +35 -7
- package/dist/lib/ioc/IocEngine.js.map +1 -1
- package/dist/lib/ioc/component/decorators/Inject.d.ts +24 -4
- package/dist/lib/ioc/component/decorators/Inject.js +44 -7
- package/dist/lib/ioc/component/decorators/Inject.js.map +1 -1
- package/dist/lib/ioc/component/index.d.ts +1 -1
- package/dist/lib/ioc/component/index.js +1 -1
- package/dist/lib/ioc/component/index.js.map +1 -1
- package/dist/lib/ioc/constants/ComponentConstants.d.ts +27 -18
- package/dist/lib/ioc/constants/ComponentConstants.js +34 -20
- package/dist/lib/ioc/constants/ComponentConstants.js.map +1 -1
- package/dist/lib/ioc/decorators/CoreService.d.ts +8 -0
- package/dist/lib/ioc/decorators/CoreService.js +27 -0
- package/dist/lib/ioc/decorators/CoreService.js.map +1 -0
- package/dist/lib/ioc/decorators/index.d.ts +1 -0
- package/dist/lib/ioc/decorators/index.js +2 -0
- package/dist/lib/ioc/decorators/index.js.map +1 -0
- package/dist/lib/ioc/index.d.ts +5 -0
- package/dist/lib/ioc/index.js +5 -0
- package/dist/lib/ioc/index.js.map +1 -1
- package/dist/lib/ioc/types/CoreBootstrapPhase.d.ts +15 -0
- package/dist/lib/ioc/types/CoreBootstrapPhase.js +17 -0
- package/dist/lib/ioc/types/CoreBootstrapPhase.js.map +1 -0
- package/dist/lib/ioc/types/ICoreService.d.ts +9 -0
- package/dist/lib/ioc/types/ICoreService.js +2 -0
- package/dist/lib/ioc/types/ICoreService.js.map +1 -0
- package/dist/lib/ioc/types/ICoreServiceNamesType.d.ts +19 -0
- package/dist/lib/ioc/types/ICoreServiceNamesType.js +25 -0
- package/dist/lib/ioc/types/ICoreServiceNamesType.js.map +1 -0
- package/dist/lib/ioc/types/decorators/ControllerParams.d.ts +1 -1
- package/dist/lib/ioc/types/index.d.ts +3 -0
- package/dist/lib/ioc/types/index.js +3 -0
- package/dist/lib/ioc/types/index.js.map +1 -1
- package/dist/lib/server/AsenaServer.d.ts +85 -14
- package/dist/lib/server/AsenaServer.js +176 -68
- package/dist/lib/server/AsenaServer.js.map +1 -1
- package/dist/lib/server/AsenaServerFactory.d.ts +26 -0
- package/dist/lib/server/AsenaServerFactory.js +66 -0
- package/dist/lib/server/AsenaServerFactory.js.map +1 -0
- package/dist/lib/server/config/AsenaConfig.d.ts +91 -18
- package/dist/lib/server/decorators/Override.js +1 -1
- package/dist/lib/server/decorators/Override.js.map +1 -1
- package/dist/lib/server/decorators/components/Config.d.ts +1 -1
- package/dist/lib/server/decorators/components/Config.js +1 -1
- package/dist/lib/server/decorators/components/Config.js.map +1 -1
- package/dist/lib/server/decorators/components/Controller.d.ts +1 -1
- package/dist/lib/server/decorators/components/Controller.js +1 -2
- package/dist/lib/server/decorators/components/Controller.js.map +1 -1
- package/dist/lib/server/decorators/components/Middleware.js +1 -2
- package/dist/lib/server/decorators/components/Middleware.js.map +1 -1
- package/dist/lib/server/decorators/components/Schedule.d.ts +1 -1
- package/dist/lib/server/decorators/components/Schedule.js +1 -2
- package/dist/lib/server/decorators/components/Schedule.js.map +1 -1
- package/dist/lib/server/decorators/components/WebSocket.d.ts +1 -1
- package/dist/lib/server/decorators/components/WebSocket.js +1 -2
- package/dist/lib/server/decorators/components/WebSocket.js.map +1 -1
- package/dist/lib/server/decorators/index.d.ts +2 -0
- package/dist/lib/server/decorators/index.js +2 -0
- package/dist/lib/server/decorators/index.js.map +1 -1
- package/dist/lib/server/index.d.ts +3 -0
- package/dist/lib/server/index.js +4 -0
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/messaging/Ulak.d.ts +224 -0
- package/dist/lib/server/messaging/Ulak.js +351 -0
- package/dist/lib/server/messaging/Ulak.js.map +1 -0
- package/dist/lib/server/messaging/index.d.ts +8 -0
- package/dist/lib/server/messaging/index.js +9 -0
- package/dist/lib/server/messaging/index.js.map +1 -0
- package/dist/lib/server/messaging/types.d.ts +73 -0
- package/dist/lib/server/messaging/types.js +35 -0
- package/dist/lib/server/messaging/types.js.map +1 -0
- package/dist/lib/server/src/services/PrepareConfigService.d.ts +9 -5
- package/dist/lib/server/src/services/PrepareConfigService.js +32 -7
- package/dist/lib/server/src/services/PrepareConfigService.js.map +1 -1
- package/dist/lib/server/src/services/PrepareMiddlewareService.d.ts +8 -5
- package/dist/lib/server/src/services/PrepareMiddlewareService.js +27 -7
- package/dist/lib/server/src/services/PrepareMiddlewareService.js.map +1 -1
- package/dist/lib/server/src/services/PrepareStaticServeConfigService.d.ts +8 -5
- package/dist/lib/server/src/services/PrepareStaticServeConfigService.js +27 -6
- package/dist/lib/server/src/services/PrepareStaticServeConfigService.js.map +1 -1
- package/dist/lib/server/src/services/PrepareValidatorService.d.ts +8 -5
- package/dist/lib/server/src/services/PrepareValidatorService.js +27 -6
- package/dist/lib/server/src/services/PrepareValidatorService.js.map +1 -1
- package/dist/lib/server/src/services/PrepareWebsocketService.d.ts +9 -5
- package/dist/lib/server/src/services/PrepareWebsocketService.js +35 -9
- package/dist/lib/server/src/services/PrepareWebsocketService.js.map +1 -1
- package/dist/lib/server/web/decorators/http.base.d.ts +1 -1
- package/dist/lib/server/web/decorators/http.base.js.map +1 -1
- package/dist/lib/server/web/decorators/methods/Connect.d.ts +1 -1
- package/dist/lib/server/web/decorators/methods/Delete.d.ts +1 -1
- package/dist/lib/server/web/decorators/methods/Get.d.ts +1 -1
- package/dist/lib/server/web/decorators/methods/Head.d.ts +1 -1
- package/dist/lib/server/web/decorators/methods/Options.d.ts +1 -1
- package/dist/lib/server/web/decorators/methods/Patch.d.ts +1 -1
- package/dist/lib/server/web/decorators/methods/Post.d.ts +1 -1
- package/dist/lib/server/web/decorators/methods/Put.d.ts +1 -1
- package/dist/lib/server/web/decorators/methods/Trace.d.ts +1 -1
- package/dist/lib/server/web/websocket/AsenaSocket.js.map +1 -1
- package/dist/lib/server/web/websocket/AsenaWebSocketServer.d.ts +3 -16
- package/dist/lib/server/web/websocket/AsenaWebSocketServer.js +3 -20
- package/dist/lib/server/web/websocket/AsenaWebSocketServer.js.map +1 -1
- package/dist/lib/server/web/websocket/index.d.ts +1 -1
- package/dist/lib/server/web/websocket/index.js +1 -1
- package/dist/lib/server/web/websocket/index.js.map +1 -1
- package/dist/lib/utils/patternMatcher.d.ts +41 -0
- package/dist/lib/utils/patternMatcher.js +99 -0
- package/dist/lib/utils/patternMatcher.js.map +1 -0
- package/dist/lib/utils/typedMetadata.d.ts +3 -3
- package/dist/lib/utils/typedMetadata.js.map +1 -1
- package/package.json +19 -8
- package/dist/lib/server/src/PrepareService.d.ts +0 -8
- package/dist/lib/server/src/PrepareService.js +0 -9
- package/dist/lib/server/src/PrepareService.js.map +0 -1
|
@@ -1,92 +1,89 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { ComponentType, CoreBootstrapPhase, CoreService, ICoreServiceNames, } from '../ioc';
|
|
4
11
|
import * as path from 'node:path';
|
|
5
12
|
import { ComponentConstants } from '../ioc/constants';
|
|
6
13
|
import * as bun from 'bun';
|
|
7
|
-
import { green, yellow } from '../logger';
|
|
14
|
+
import { blue, green, yellow } from '../logger';
|
|
8
15
|
import { getOwnTypedMetadata, getTypedMetadata } from '../utils/typedMetadata';
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
_components = [];
|
|
18
|
-
_ioc;
|
|
19
|
-
_logger;
|
|
16
|
+
import { Inject, PostConstruct } from '../ioc/component';
|
|
17
|
+
/**
|
|
18
|
+
* @description AsenaServer - Main server class for Asena framework
|
|
19
|
+
* Now a core service managed by IoC container with field injection
|
|
20
|
+
*/
|
|
21
|
+
let AsenaServer = class AsenaServer {
|
|
22
|
+
serviceName = 'AsenaServer';
|
|
23
|
+
_coreContainer;
|
|
20
24
|
_adapter;
|
|
25
|
+
_logger;
|
|
21
26
|
prepareMiddleware;
|
|
22
27
|
prepareConfigService;
|
|
23
28
|
prepareWebsocketService;
|
|
24
29
|
prepareValidatorService;
|
|
25
30
|
prepareStaticServeConfigService;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
async initialize() {
|
|
38
|
-
const config = await readConfigFile();
|
|
39
|
-
if (!config) {
|
|
40
|
-
this._logger.warn('asena-config file not found');
|
|
41
|
-
}
|
|
42
|
-
this._ioc = new IocEngine(config);
|
|
43
|
-
await this._ioc.searchAndRegister(this._components);
|
|
44
|
-
this.prepareMiddleware = new PrepareMiddlewareService(this._ioc.container, this._logger);
|
|
45
|
-
this.prepareConfigService = new PrepareConfigService(this._ioc.container, this._logger);
|
|
46
|
-
this.prepareWebsocketService = new PrepareWebsocketService(this._ioc.container, this._logger);
|
|
47
|
-
this.prepareValidatorService = new PrepareValidatorService(this._ioc.container, this._logger);
|
|
48
|
-
this.prepareStaticServeConfigService = new PrepareStaticServeConfigService(this._ioc.container, this._logger);
|
|
49
|
-
return this._ioc.container;
|
|
31
|
+
// Instance state
|
|
32
|
+
_port;
|
|
33
|
+
_gc = false;
|
|
34
|
+
controllers = [];
|
|
35
|
+
/**
|
|
36
|
+
* @description Lifecycle hook - called after dependencies are injected
|
|
37
|
+
* @returns {void}
|
|
38
|
+
*/
|
|
39
|
+
onInit() {
|
|
40
|
+
this._logger.info(`${blue('[AsenaServer]')} is initialized`);
|
|
50
41
|
}
|
|
51
|
-
|
|
52
|
-
|
|
42
|
+
/**
|
|
43
|
+
* @description Start the server
|
|
44
|
+
* Main entry point after factory creation
|
|
45
|
+
* @returns {Promise<void>}
|
|
46
|
+
*/
|
|
47
|
+
async start() {
|
|
53
48
|
this._logger.info(`Adapter: ${green(this._adapter.name)} implemented`);
|
|
54
49
|
this._adapter.setPort(this._port);
|
|
55
50
|
this._logger.info('All components registered and ready to use');
|
|
51
|
+
// Phase 7: Application setup
|
|
52
|
+
this._coreContainer.setPhase(CoreBootstrapPhase.APPLICATION_SETUP);
|
|
56
53
|
await this.prepareConfigs();
|
|
57
54
|
await this.initializeControllers();
|
|
58
55
|
await this.prepareWebSocket();
|
|
59
|
-
|
|
56
|
+
// Phase 8: Server ready
|
|
57
|
+
this._coreContainer.setPhase(CoreBootstrapPhase.SERVER_READY);
|
|
60
58
|
await this._adapter.start();
|
|
61
|
-
|
|
62
|
-
if (gc) {
|
|
59
|
+
if (this._gc) {
|
|
63
60
|
bun.gc(true);
|
|
64
61
|
}
|
|
65
62
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
};
|
|
73
|
-
return component;
|
|
74
|
-
});
|
|
75
|
-
return this;
|
|
76
|
-
}
|
|
63
|
+
/**
|
|
64
|
+
* @description Configure server port
|
|
65
|
+
* Builder pattern for API compatibility
|
|
66
|
+
* @param {number} port - Port number
|
|
67
|
+
* @returns {this}
|
|
68
|
+
*/
|
|
77
69
|
port(port) {
|
|
78
70
|
this._port = port;
|
|
79
71
|
return this;
|
|
80
72
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
73
|
+
/**
|
|
74
|
+
* @description Get current CoreContainer instance
|
|
75
|
+
* @returns {CoreContainer}
|
|
76
|
+
*/
|
|
77
|
+
get coreContainer() {
|
|
78
|
+
return this._coreContainer;
|
|
84
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* @description Initialize and register all controllers
|
|
82
|
+
* @returns {Promise<void>}
|
|
83
|
+
*/
|
|
85
84
|
async initializeControllers() {
|
|
86
85
|
await this.validateAndSetControllers();
|
|
87
86
|
for (const controller of this.controllers) {
|
|
88
|
-
const name = getTypedMetadata(ComponentConstants.NameKey, controller.constructor);
|
|
89
|
-
this._logger.info(`Controller: ${green(name)} found:`);
|
|
90
87
|
const routes = getOwnTypedMetadata(ComponentConstants.RouteKey, controller.constructor) || {};
|
|
91
88
|
const routePath = getOwnTypedMetadata(ComponentConstants.PathKey, controller.constructor) || '';
|
|
92
89
|
await this.prepareTopMiddlewares({ controller, routePath });
|
|
@@ -101,13 +98,18 @@ export class AsenaServer {
|
|
|
101
98
|
handler: controller[name].bind(controller),
|
|
102
99
|
staticServe: await this.prepareStaticServeConfig(params.staticServe),
|
|
103
100
|
validator: validatorInstance,
|
|
101
|
+
controllerName: getTypedMetadata(ComponentConstants.NameKey, controller.constructor),
|
|
102
|
+
controllerBasePath: routePath,
|
|
104
103
|
});
|
|
105
104
|
}
|
|
106
|
-
this._logger.info(`Controller: ${green(name)} successfully registered.`);
|
|
107
105
|
}
|
|
108
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* @description Validate and set controllers from container
|
|
109
|
+
* @returns {Promise<void>}
|
|
110
|
+
*/
|
|
109
111
|
async validateAndSetControllers() {
|
|
110
|
-
const controllers = await this.
|
|
112
|
+
const controllers = await this._coreContainer.container.resolveAll(ComponentType.CONTROLLER);
|
|
111
113
|
if (controllers !== null) {
|
|
112
114
|
// check if any controller is array or not
|
|
113
115
|
if (controllers.find((controller) => Array.isArray(controller))) {
|
|
@@ -116,29 +118,62 @@ export class AsenaServer {
|
|
|
116
118
|
this.controllers = controllers;
|
|
117
119
|
}
|
|
118
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* @description Prepare static serve configuration
|
|
123
|
+
* @param {StaticServeClass} staticServeClass - Static serve class
|
|
124
|
+
* @returns {Promise<BaseStaticServeParams>}
|
|
125
|
+
*/
|
|
119
126
|
async prepareStaticServeConfig(staticServeClass) {
|
|
120
127
|
return await this.prepareStaticServeConfigService.prepare(staticServeClass);
|
|
121
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* @description Prepare top-level middlewares for controller or websocket
|
|
131
|
+
* @param {PrepareMiddlewareParams} params - Middleware parameters
|
|
132
|
+
* @param {boolean} websocket - Whether this is for websocket
|
|
133
|
+
* @returns {Promise<BaseMiddleware[]>}
|
|
134
|
+
*/
|
|
122
135
|
async prepareTopMiddlewares({ controller, routePath }, websocket = false) {
|
|
123
136
|
const topMiddlewares = getTypedMetadata(ComponentConstants.MiddlewaresKey, controller.constructor) || [];
|
|
124
137
|
const middlewares = await this.prepareMiddlewares(topMiddlewares);
|
|
125
138
|
if (websocket) {
|
|
126
139
|
return middlewares;
|
|
127
140
|
}
|
|
141
|
+
// Register controller-level middlewares with pattern matching
|
|
142
|
+
// Convert routePath to pattern: /api → /api/*
|
|
143
|
+
const routePattern = routePath ? `${routePath}/*` : undefined;
|
|
128
144
|
for (const middleware of middlewares) {
|
|
129
|
-
await this._adapter.use(middleware,
|
|
145
|
+
await this._adapter.use(middleware, routePattern ? { include: [routePattern] } : undefined);
|
|
130
146
|
}
|
|
131
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* @description Prepare validator instance
|
|
150
|
+
* @param {ValidatorClass<any>} Validator - Validator class
|
|
151
|
+
* @returns {Promise<BaseValidator>}
|
|
152
|
+
*/
|
|
132
153
|
async prepareValidator(Validator) {
|
|
133
154
|
return await this.prepareValidatorService.prepare(Validator);
|
|
134
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* @description Prepare route-level middlewares
|
|
158
|
+
* @param {ApiParams} middlewareParams - Middleware parameters
|
|
159
|
+
* @returns {Promise<BaseMiddleware[]>}
|
|
160
|
+
*/
|
|
135
161
|
async prepareRouteMiddleware(middlewareParams) {
|
|
136
162
|
const routeMiddlewares = middlewareParams?.middlewares || [];
|
|
137
163
|
return this.prepareMiddlewares(routeMiddlewares);
|
|
138
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* @description Prepare middlewares from classes
|
|
167
|
+
* @param {MiddlewareClass[]} middlewares - Middleware classes
|
|
168
|
+
* @returns {Promise<BaseMiddleware[]>}
|
|
169
|
+
*/
|
|
139
170
|
async prepareMiddlewares(middlewares) {
|
|
140
171
|
return this.prepareMiddleware.prepare(middlewares);
|
|
141
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* @description Prepare and register WebSocket routes
|
|
175
|
+
* @returns {Promise<void>}
|
|
176
|
+
*/
|
|
142
177
|
async prepareWebSocket() {
|
|
143
178
|
const websockets = await this.prepareWebsocketService.prepare();
|
|
144
179
|
if (!websockets) {
|
|
@@ -151,9 +186,33 @@ export class AsenaServer {
|
|
|
151
186
|
path: path,
|
|
152
187
|
middlewares: middlewares,
|
|
153
188
|
websocketService: websocket,
|
|
189
|
+
controllerName: getTypedMetadata(ComponentConstants.NameKey, websocket.constructor),
|
|
154
190
|
});
|
|
155
191
|
}
|
|
156
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* @description Normalizes global middleware entry to config format
|
|
195
|
+
* Handles backward compatibility (MiddlewareClass → GlobalMiddlewareConfig)
|
|
196
|
+
*
|
|
197
|
+
* @param entry - Middleware entry (class or config object)
|
|
198
|
+
* @returns Normalized config object
|
|
199
|
+
*/
|
|
200
|
+
normalizeMiddlewareEntry(entry) {
|
|
201
|
+
// If it's already a config object, return as-is
|
|
202
|
+
if (typeof entry === 'object' && 'middleware' in entry) {
|
|
203
|
+
return entry;
|
|
204
|
+
}
|
|
205
|
+
// If it's a class (old format), convert to config format
|
|
206
|
+
return {
|
|
207
|
+
middleware: entry,
|
|
208
|
+
routes: undefined, // No route config = apply to all routes
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* @description Prepare and apply configuration
|
|
213
|
+
* Updated to support pattern-based global middlewares
|
|
214
|
+
* @returns {Promise<void>}
|
|
215
|
+
*/
|
|
157
216
|
async prepareConfigs() {
|
|
158
217
|
const configInstance = await this.prepareConfigService.prepare();
|
|
159
218
|
if (!configInstance) {
|
|
@@ -165,15 +224,64 @@ export class AsenaServer {
|
|
|
165
224
|
if (typeof configInstance.onError === 'function') {
|
|
166
225
|
await this._adapter.onError(configInstance.onError.bind(configInstance));
|
|
167
226
|
}
|
|
227
|
+
// Pattern-based global middleware registration
|
|
168
228
|
if (typeof configInstance.globalMiddlewares === 'function') {
|
|
169
|
-
const
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
229
|
+
const middlewareEntries = await configInstance.globalMiddlewares();
|
|
230
|
+
for (const entry of middlewareEntries) {
|
|
231
|
+
// Normalize entry to config format (handles backward compatibility)
|
|
232
|
+
const config = this.normalizeMiddlewareEntry(entry);
|
|
233
|
+
// Prepare middleware instances
|
|
234
|
+
const preparedMiddlewares = await this.prepareMiddlewares([config.middleware]);
|
|
235
|
+
// Register with adapter (pass route config)
|
|
236
|
+
for (const middleware of preparedMiddlewares) {
|
|
237
|
+
await this._adapter.use(middleware, config.routes);
|
|
238
|
+
}
|
|
173
239
|
}
|
|
174
240
|
}
|
|
175
241
|
const name = getOwnTypedMetadata(ComponentConstants.NameKey, configInstance.constructor);
|
|
176
242
|
this._logger.info(`Config ${yellow(name)} applied`);
|
|
177
243
|
}
|
|
178
|
-
}
|
|
244
|
+
};
|
|
245
|
+
__decorate([
|
|
246
|
+
Inject(ICoreServiceNames.CORE_CONTAINER),
|
|
247
|
+
__metadata("design:type", Function)
|
|
248
|
+
], AsenaServer.prototype, "_coreContainer", void 0);
|
|
249
|
+
__decorate([
|
|
250
|
+
Inject(ICoreServiceNames.ASENA_ADAPTER),
|
|
251
|
+
__metadata("design:type", Object)
|
|
252
|
+
], AsenaServer.prototype, "_adapter", void 0);
|
|
253
|
+
__decorate([
|
|
254
|
+
Inject(ICoreServiceNames.SERVER_LOGGER),
|
|
255
|
+
__metadata("design:type", Object)
|
|
256
|
+
], AsenaServer.prototype, "_logger", void 0);
|
|
257
|
+
__decorate([
|
|
258
|
+
Inject(ICoreServiceNames.PREPARE_MIDDLEWARE_SERVICE),
|
|
259
|
+
__metadata("design:type", Function)
|
|
260
|
+
], AsenaServer.prototype, "prepareMiddleware", void 0);
|
|
261
|
+
__decorate([
|
|
262
|
+
Inject(ICoreServiceNames.PREPARE_CONFIG_SERVICE),
|
|
263
|
+
__metadata("design:type", Function)
|
|
264
|
+
], AsenaServer.prototype, "prepareConfigService", void 0);
|
|
265
|
+
__decorate([
|
|
266
|
+
Inject(ICoreServiceNames.PREPARE_WEBSOCKET_SERVICE),
|
|
267
|
+
__metadata("design:type", Function)
|
|
268
|
+
], AsenaServer.prototype, "prepareWebsocketService", void 0);
|
|
269
|
+
__decorate([
|
|
270
|
+
Inject(ICoreServiceNames.PREPARE_VALIDATOR_SERVICE),
|
|
271
|
+
__metadata("design:type", Function)
|
|
272
|
+
], AsenaServer.prototype, "prepareValidatorService", void 0);
|
|
273
|
+
__decorate([
|
|
274
|
+
Inject(ICoreServiceNames.PREPARE_STATIC_SERVE_CONFIG_SERVICE),
|
|
275
|
+
__metadata("design:type", Function)
|
|
276
|
+
], AsenaServer.prototype, "prepareStaticServeConfigService", void 0);
|
|
277
|
+
__decorate([
|
|
278
|
+
PostConstruct(),
|
|
279
|
+
__metadata("design:type", Function),
|
|
280
|
+
__metadata("design:paramtypes", []),
|
|
281
|
+
__metadata("design:returntype", void 0)
|
|
282
|
+
], AsenaServer.prototype, "onInit", null);
|
|
283
|
+
AsenaServer = __decorate([
|
|
284
|
+
CoreService(ICoreServiceNames.ASENA_SERVER)
|
|
285
|
+
], AsenaServer);
|
|
286
|
+
export { AsenaServer };
|
|
179
287
|
//# sourceMappingURL=AsenaServer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsenaServer.js","sourceRoot":"","sources":["../../../lib/server/AsenaServer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AsenaServer.js","sourceRoot":"","sources":["../../../lib/server/AsenaServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AsenaServer } from './AsenaServer';
|
|
2
|
+
import type { AsenaAdapter } from '../adapter';
|
|
3
|
+
import type { ServerLogger } from '../logger';
|
|
4
|
+
import type { Class } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* @description Configuration options for AsenaServer creation
|
|
7
|
+
*/
|
|
8
|
+
export interface AsenaServerOptions<A extends AsenaAdapter<any, any>> {
|
|
9
|
+
adapter: A;
|
|
10
|
+
logger: ServerLogger;
|
|
11
|
+
port?: number;
|
|
12
|
+
components?: Class[];
|
|
13
|
+
gc?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* @description Factory for creating AsenaServer instances
|
|
17
|
+
* Handles IoC bootstrap and dependency injection
|
|
18
|
+
*/
|
|
19
|
+
export declare class AsenaServerFactory {
|
|
20
|
+
/**
|
|
21
|
+
* @description Create and configure AsenaServer instance
|
|
22
|
+
* @param {AsenaServerOptions<A>} options - Server configuration options
|
|
23
|
+
* @returns {Promise<AsenaServer<A>>} Fully configured AsenaServer instance
|
|
24
|
+
*/
|
|
25
|
+
static create<A extends AsenaAdapter<any, any>>(options: AsenaServerOptions<A>): Promise<AsenaServer<A>>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { CoreBootstrapPhase, CoreContainer, ICoreServiceNames } from '../ioc';
|
|
2
|
+
import { readConfigFile } from '../ioc/helper/fileHelper';
|
|
3
|
+
import { ComponentConstants } from '../ioc/constants';
|
|
4
|
+
import { getTypedMetadata } from '../utils/typedMetadata';
|
|
5
|
+
/**
|
|
6
|
+
* @description Factory for creating AsenaServer instances
|
|
7
|
+
* Handles IoC bootstrap and dependency injection
|
|
8
|
+
*/
|
|
9
|
+
export class AsenaServerFactory {
|
|
10
|
+
/**
|
|
11
|
+
* @description Create and configure AsenaServer instance
|
|
12
|
+
* @param {AsenaServerOptions<A>} options - Server configuration options
|
|
13
|
+
* @returns {Promise<AsenaServer<A>>} Fully configured AsenaServer instance
|
|
14
|
+
*/
|
|
15
|
+
static async create(options) {
|
|
16
|
+
const { adapter, logger, port, components, gc } = options;
|
|
17
|
+
logger.info(`
|
|
18
|
+
___ _____ ______ _ __ ___
|
|
19
|
+
/ | / ___/ / ____// | / // |
|
|
20
|
+
/ /| | \\__ \\ / __/ / |/ // /| |
|
|
21
|
+
/ ___ | ___/ // /___ / /| // ___ |
|
|
22
|
+
/_/ |_|/____//_____//_/ |_//_/ |_|
|
|
23
|
+
------------------------------------------------------------
|
|
24
|
+
`);
|
|
25
|
+
// Read config file
|
|
26
|
+
const config = await readConfigFile();
|
|
27
|
+
if (!config) {
|
|
28
|
+
logger.warn('asena-config file not found');
|
|
29
|
+
}
|
|
30
|
+
// Create CoreContainer
|
|
31
|
+
const coreContainer = new CoreContainer();
|
|
32
|
+
// Phase 1-5: Bootstrap core services
|
|
33
|
+
await coreContainer.bootstrap(adapter, logger);
|
|
34
|
+
// Register CoreContainer itself for AsenaServer injection
|
|
35
|
+
await coreContainer.container.registerInstance(ICoreServiceNames.CORE_CONTAINER, coreContainer);
|
|
36
|
+
// Phase 6: Register user components
|
|
37
|
+
const iocEngine = await coreContainer.resolve(ICoreServiceNames.IOC_ENGINE);
|
|
38
|
+
iocEngine.setConfig(config);
|
|
39
|
+
if (components?.length) {
|
|
40
|
+
const injectableComponents = components.map((comp) => {
|
|
41
|
+
const face = getTypedMetadata(ComponentConstants.InterfaceKey, comp);
|
|
42
|
+
return {
|
|
43
|
+
Class: comp,
|
|
44
|
+
interface: face,
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
await iocEngine.searchAndRegister(injectableComponents);
|
|
48
|
+
}
|
|
49
|
+
else if (config) {
|
|
50
|
+
await iocEngine.searchAndRegister();
|
|
51
|
+
}
|
|
52
|
+
coreContainer.setPhase(CoreBootstrapPhase.USER_COMPONENTS_INIT);
|
|
53
|
+
// Register AsenaServer as core service
|
|
54
|
+
const { AsenaServer } = await import('./AsenaServer');
|
|
55
|
+
await coreContainer.container.register(ICoreServiceNames.ASENA_SERVER, AsenaServer, true);
|
|
56
|
+
// Resolve AsenaServer (with all dependencies injected)
|
|
57
|
+
const server = await coreContainer.resolve(ICoreServiceNames.ASENA_SERVER);
|
|
58
|
+
// Configure server
|
|
59
|
+
if (port)
|
|
60
|
+
server.port(port);
|
|
61
|
+
if (gc !== undefined)
|
|
62
|
+
server._gc = gc;
|
|
63
|
+
return server;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=AsenaServerFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsenaServerFactory.js","sourceRoot":"","sources":["../../../lib/server/AsenaServerFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAK9E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAa1D;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAE7B;;;;OAIG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CACxB,OAA8B;QAE9B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;QAE1D,MAAM,CAAC,IAAI,CAAC;;;;;;;KAOX,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QAEtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;QAED,uBAAuB;QACvB,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QAE1C,qCAAqC;QACrC,MAAM,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE/C,0DAA0D;QAC1D,MAAM,aAAa,CAAC,SAAS,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QAEhG,oCAAoC;QACpC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAY,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEvF,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE5B,IAAI,UAAU,EAAE,MAAM,EAAE,CAAC;YACvB,MAAM,oBAAoB,GAA0B,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC1E,MAAM,IAAI,GAAW,gBAAgB,CAAS,kBAAkB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;gBAErF,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,SAAS,EAAE,IAAI;iBAChB,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,SAAS,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,MAAM,SAAS,CAAC,iBAAiB,EAAE,CAAC;QACtC,CAAC;QAED,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;QAEhE,uCAAuC;QACvC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAEtD,MAAM,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAE1F,uDAAuD;QACvD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAiB,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAE3F,mBAAmB;QACnB,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5B,IAAI,EAAE,KAAK,SAAS;YAAG,MAAc,CAAC,GAAG,GAAG,EAAE,CAAC;QAE/C,OAAO,MAAM,CAAC;IAChB,CAAC;CAEF"}
|
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
import type { AsenaContext, AsenaServeOptions } from '../../adapter';
|
|
2
|
-
import type { MiddlewareClass } from
|
|
2
|
+
import type { MiddlewareClass } from '../web/middleware';
|
|
3
|
+
/**
|
|
4
|
+
* Route configuration for global middleware
|
|
5
|
+
*/
|
|
6
|
+
export interface GlobalMiddlewareRouteConfig {
|
|
7
|
+
/**
|
|
8
|
+
* Paths to include. Supports glob patterns.
|
|
9
|
+
* Default: ['*'] (all routes)
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* include: ['/api/*', '/admin/*']
|
|
13
|
+
* include: ['/users/:id', '/posts/:id']
|
|
14
|
+
*/
|
|
15
|
+
include?: string[];
|
|
16
|
+
/**
|
|
17
|
+
* Paths to exclude. Supports glob patterns.
|
|
18
|
+
* Exclusions take precedence over inclusions.
|
|
19
|
+
* Default: []
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* exclude: ['/health', '/metrics']
|
|
23
|
+
* exclude: ['/api/public/*']
|
|
24
|
+
*/
|
|
25
|
+
exclude?: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Global middleware configuration
|
|
29
|
+
*/
|
|
30
|
+
export interface GlobalMiddlewareConfig {
|
|
31
|
+
/**
|
|
32
|
+
* Middleware class to apply
|
|
33
|
+
*/
|
|
34
|
+
middleware: MiddlewareClass;
|
|
35
|
+
/**
|
|
36
|
+
* Route configuration for this middleware
|
|
37
|
+
* If not specified, middleware applies to all routes
|
|
38
|
+
*/
|
|
39
|
+
routes?: GlobalMiddlewareRouteConfig;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Union type for backward compatibility
|
|
43
|
+
* - MiddlewareClass: Apply to all routes (old behavior)
|
|
44
|
+
* - GlobalMiddlewareConfig: Apply with pattern matching (new behavior)
|
|
45
|
+
*/
|
|
46
|
+
export type GlobalMiddlewareEntry = MiddlewareClass | GlobalMiddlewareConfig;
|
|
3
47
|
/**
|
|
4
48
|
* Configuration interface for Asena framework
|
|
5
49
|
* @template C - Extends AsenaContext type with generic parameters
|
|
@@ -18,26 +62,55 @@ export interface AsenaConfig<C extends AsenaContext<any, any> = AsenaContext<any
|
|
|
18
62
|
*/
|
|
19
63
|
serveOptions?(): AsenaServeOptions;
|
|
20
64
|
/**
|
|
21
|
-
* Global middleware configuration for applying middleware across
|
|
22
|
-
*
|
|
65
|
+
* Global middleware configuration for applying middleware across routes.
|
|
66
|
+
*
|
|
67
|
+
* Supports two formats:
|
|
68
|
+
* 1. Simple: MiddlewareClass (applies to all routes)
|
|
69
|
+
* 2. Advanced: GlobalMiddlewareConfig (pattern-based filtering)
|
|
70
|
+
*
|
|
23
71
|
* @example
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
72
|
+
* ```typescript
|
|
73
|
+
* // Simple format (backward compatible)
|
|
74
|
+
* globalMiddlewares() {
|
|
75
|
+
* return [LoggerMiddleware, CorsMiddleware];
|
|
76
|
+
* }
|
|
77
|
+
*
|
|
78
|
+
* // Advanced format with pattern matching
|
|
79
|
+
* globalMiddlewares() {
|
|
80
|
+
* return [
|
|
81
|
+
* // Apply to all routes
|
|
82
|
+
* LoggerMiddleware,
|
|
83
|
+
*
|
|
84
|
+
* // Apply only to /api/* and /admin/*
|
|
85
|
+
* {
|
|
86
|
+
* middleware: AuthMiddleware,
|
|
87
|
+
* routes: {
|
|
88
|
+
* include: ['/api/*', '/admin/*']
|
|
89
|
+
* }
|
|
90
|
+
* },
|
|
91
|
+
*
|
|
92
|
+
* // Apply to all routes except /health
|
|
93
|
+
* {
|
|
94
|
+
* middleware: RateLimitMiddleware,
|
|
95
|
+
* routes: {
|
|
96
|
+
* exclude: ['/health', '/metrics']
|
|
97
|
+
* }
|
|
98
|
+
* },
|
|
99
|
+
*
|
|
100
|
+
* // Advanced: include + exclude
|
|
101
|
+
* {
|
|
102
|
+
* middleware: AuditMiddleware,
|
|
103
|
+
* routes: {
|
|
104
|
+
* include: ['/api/*'],
|
|
105
|
+
* exclude: ['/api/health']
|
|
106
|
+
* }
|
|
107
|
+
* }
|
|
108
|
+
* ];
|
|
37
109
|
* }
|
|
110
|
+
* ```
|
|
38
111
|
*
|
|
39
|
-
* @returns Array of middleware
|
|
112
|
+
* @returns Array of middleware configurations
|
|
40
113
|
*/
|
|
41
|
-
globalMiddlewares?(): Promise<
|
|
114
|
+
globalMiddlewares?(): Promise<GlobalMiddlewareEntry[]> | GlobalMiddlewareEntry[];
|
|
42
115
|
}
|
|
43
116
|
export type AsenaConfigFunctions = 'onError' | 'serveOptions' | 'globalMiddlewares';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Override.js","sourceRoot":"","sources":["../../../../lib/server/decorators/Override.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Override.js","sourceRoot":"","sources":["../../../../lib/server/decorators/Override.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAsB,EAAE;IAC9C,OAAO,CAAC,MAAc,EAAE,WAAmB,EAAE,EAAE;QAC7C,MAAM,SAAS,GAAa,mBAAmB,CAAW,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAExG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9B,CAAC;QAED,mBAAmB,CAAW,kBAAkB,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACnF,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../../../../../lib/server/decorators/components/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../../../../../lib/server/decorators/components/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,aAAa,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,MAAiC,EAAkB,EAAE;IAC1E,OAAO,eAAe,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { ComponentType } from '../../../ioc
|
|
1
|
+
import { ComponentConstants, ComponentType } from '../../../ioc';
|
|
2
2
|
import { defineComponent } from '../../../ioc/component';
|
|
3
|
-
import { ComponentConstants } from '../../../ioc/constants';
|
|
4
3
|
import { defineMiddleware } from '../../web/helper';
|
|
5
4
|
import { defineTypedMetadata } from '../../../utils/typedMetadata';
|
|
6
5
|
/**
|