@asenajs/asena 0.7.1 → 0.8.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 (129) hide show
  1. package/README.md +2 -2
  2. package/dist/lib/adapter/AsenaAdapter.d.ts +2 -2
  3. package/dist/lib/adapter/AsenaAdapter.js.map +1 -1
  4. package/dist/lib/adapter/types/ServeOptions.d.ts +16 -0
  5. package/dist/lib/ioc/Container.d.ts +25 -0
  6. package/dist/lib/ioc/Container.js +47 -0
  7. package/dist/lib/ioc/Container.js.map +1 -1
  8. package/dist/lib/ioc/CoreContainer.d.ts +5 -3
  9. package/dist/lib/ioc/CoreContainer.js +9 -3
  10. package/dist/lib/ioc/CoreContainer.js.map +1 -1
  11. package/dist/lib/ioc/IocEngine.js +3 -1
  12. package/dist/lib/ioc/IocEngine.js.map +1 -1
  13. package/dist/lib/ioc/component/decorators/Inject.js +16 -0
  14. package/dist/lib/ioc/component/decorators/Inject.js.map +1 -1
  15. package/dist/lib/ioc/constants/ComponentConstants.d.ts +4 -0
  16. package/dist/lib/ioc/constants/ComponentConstants.js +5 -0
  17. package/dist/lib/ioc/constants/ComponentConstants.js.map +1 -1
  18. package/dist/lib/ioc/types/ICoreServiceNamesType.d.ts +1 -0
  19. package/dist/lib/ioc/types/ICoreServiceNamesType.js +1 -0
  20. package/dist/lib/ioc/types/ICoreServiceNamesType.js.map +1 -1
  21. package/dist/lib/ioc/types/InjectableComponent.d.ts +10 -0
  22. package/dist/lib/ioc/types/decorators/ComponentType.d.ts +2 -1
  23. package/dist/lib/ioc/types/decorators/ComponentType.js +1 -0
  24. package/dist/lib/ioc/types/decorators/ComponentType.js.map +1 -1
  25. package/dist/lib/server/AsenaServer.d.ts +46 -3
  26. package/dist/lib/server/AsenaServer.js +158 -28
  27. package/dist/lib/server/AsenaServer.js.map +1 -1
  28. package/dist/lib/server/AsenaServerFactory.d.ts +38 -3
  29. package/dist/lib/server/AsenaServerFactory.js +21 -2
  30. package/dist/lib/server/AsenaServerFactory.js.map +1 -1
  31. package/dist/lib/server/config/AsenaConfig.d.ts +82 -4
  32. package/dist/lib/server/config/AsenaConfig.js +39 -1
  33. package/dist/lib/server/config/AsenaConfig.js.map +1 -1
  34. package/dist/lib/server/decorators/components/MessageController.d.ts +49 -0
  35. package/dist/lib/server/decorators/components/MessageController.js +62 -0
  36. package/dist/lib/server/decorators/components/MessageController.js.map +1 -0
  37. package/dist/lib/server/decorators/components/index.d.ts +1 -0
  38. package/dist/lib/server/decorators/components/index.js +1 -0
  39. package/dist/lib/server/decorators/components/index.js.map +1 -1
  40. package/dist/lib/server/event/EventDispatchService.d.ts +3 -7
  41. package/dist/lib/server/event/EventDispatchService.js +9 -40
  42. package/dist/lib/server/event/EventDispatchService.js.map +1 -1
  43. package/dist/lib/server/event/PatternHandlerIndex.d.ts +53 -0
  44. package/dist/lib/server/event/PatternHandlerIndex.js +100 -0
  45. package/dist/lib/server/event/PatternHandlerIndex.js.map +1 -0
  46. package/dist/lib/server/event/decorators/On.d.ts +4 -0
  47. package/dist/lib/server/event/decorators/On.js +6 -0
  48. package/dist/lib/server/event/decorators/On.js.map +1 -1
  49. package/dist/lib/server/event/index.d.ts +1 -0
  50. package/dist/lib/server/event/index.js +2 -0
  51. package/dist/lib/server/event/index.js.map +1 -1
  52. package/dist/lib/server/event/types.d.ts +12 -0
  53. package/dist/lib/server/health/HealthServer.d.ts +26 -0
  54. package/dist/lib/server/health/HealthServer.js +63 -0
  55. package/dist/lib/server/health/HealthServer.js.map +1 -0
  56. package/dist/lib/server/health/index.d.ts +1 -0
  57. package/dist/lib/server/health/index.js +2 -0
  58. package/dist/lib/server/health/index.js.map +1 -0
  59. package/dist/lib/server/messaging/Ulak.d.ts +156 -0
  60. package/dist/lib/server/messaging/Ulak.js +174 -0
  61. package/dist/lib/server/messaging/Ulak.js.map +1 -1
  62. package/dist/lib/server/messaging/types.d.ts +5 -1
  63. package/dist/lib/server/messaging/types.js +5 -0
  64. package/dist/lib/server/messaging/types.js.map +1 -1
  65. package/dist/lib/server/microservice/InMemoryTransport.d.ts +45 -0
  66. package/dist/lib/server/microservice/InMemoryTransport.js +124 -0
  67. package/dist/lib/server/microservice/InMemoryTransport.js.map +1 -0
  68. package/dist/lib/server/microservice/MicroserviceTransport.d.ts +132 -0
  69. package/dist/lib/server/microservice/MicroserviceTransport.js +2 -0
  70. package/dist/lib/server/microservice/MicroserviceTransport.js.map +1 -0
  71. package/dist/lib/server/microservice/decorators/EventPattern.d.ts +38 -0
  72. package/dist/lib/server/microservice/decorators/EventPattern.js +59 -0
  73. package/dist/lib/server/microservice/decorators/EventPattern.js.map +1 -0
  74. package/dist/lib/server/microservice/decorators/MessagePattern.d.ts +31 -0
  75. package/dist/lib/server/microservice/decorators/MessagePattern.js +55 -0
  76. package/dist/lib/server/microservice/decorators/MessagePattern.js.map +1 -0
  77. package/dist/lib/server/microservice/decorators/index.d.ts +2 -0
  78. package/dist/lib/server/microservice/decorators/index.js +3 -0
  79. package/dist/lib/server/microservice/decorators/index.js.map +1 -0
  80. package/dist/lib/server/microservice/index.d.ts +5 -0
  81. package/dist/lib/server/microservice/index.js +11 -0
  82. package/dist/lib/server/microservice/index.js.map +1 -0
  83. package/dist/lib/server/microservice/interceptorChain.d.ts +20 -0
  84. package/dist/lib/server/microservice/interceptorChain.js +39 -0
  85. package/dist/lib/server/microservice/interceptorChain.js.map +1 -0
  86. package/dist/lib/server/microservice/types.d.ts +142 -0
  87. package/dist/lib/server/microservice/types.js +5 -0
  88. package/dist/lib/server/microservice/types.js.map +1 -0
  89. package/dist/lib/server/src/services/PrepareEventService.d.ts +4 -1
  90. package/dist/lib/server/src/services/PrepareEventService.js +10 -3
  91. package/dist/lib/server/src/services/PrepareEventService.js.map +1 -1
  92. package/dist/lib/server/src/services/PrepareMicroserviceService.d.ts +66 -0
  93. package/dist/lib/server/src/services/PrepareMicroserviceService.js +193 -0
  94. package/dist/lib/server/src/services/PrepareMicroserviceService.js.map +1 -0
  95. package/dist/lib/test/factory/deepMock.d.ts +25 -0
  96. package/dist/lib/test/factory/deepMock.js +105 -0
  97. package/dist/lib/test/factory/deepMock.js.map +1 -0
  98. package/dist/lib/test/factory/ulakStub.d.ts +44 -0
  99. package/dist/lib/test/factory/ulakStub.js +40 -0
  100. package/dist/lib/test/factory/ulakStub.js.map +1 -0
  101. package/dist/lib/test/harness/createTestApp.d.ts +33 -0
  102. package/dist/lib/test/harness/createTestApp.js +105 -0
  103. package/dist/lib/test/harness/createTestApp.js.map +1 -0
  104. package/dist/lib/test/harness/createWebTest.d.ts +28 -0
  105. package/dist/lib/test/harness/createWebTest.js +127 -0
  106. package/dist/lib/test/harness/createWebTest.js.map +1 -0
  107. package/dist/lib/test/harness/silentLogger.d.ts +27 -0
  108. package/dist/lib/test/harness/silentLogger.js +54 -0
  109. package/dist/lib/test/harness/silentLogger.js.map +1 -0
  110. package/dist/lib/test/harness/types.d.ts +147 -0
  111. package/dist/lib/test/harness/types.js +2 -0
  112. package/dist/lib/test/harness/types.js.map +1 -0
  113. package/dist/lib/test/http/TestHttpCall.d.ts +78 -0
  114. package/dist/lib/test/http/TestHttpCall.js +149 -0
  115. package/dist/lib/test/http/TestHttpCall.js.map +1 -0
  116. package/dist/lib/test/http/TestHttpResponse.d.ts +46 -0
  117. package/dist/lib/test/http/TestHttpResponse.js +70 -0
  118. package/dist/lib/test/http/TestHttpResponse.js.map +1 -0
  119. package/dist/lib/test/index.d.ts +9 -0
  120. package/dist/lib/test/index.js +8 -0
  121. package/dist/lib/test/index.js.map +1 -1
  122. package/dist/lib/test/metadata/discovery.d.ts +21 -0
  123. package/dist/lib/test/metadata/discovery.js +37 -8
  124. package/dist/lib/test/metadata/discovery.js.map +1 -1
  125. package/dist/lib/test/mockComponent.d.ts +25 -0
  126. package/dist/lib/test/mockComponent.js +39 -6
  127. package/dist/lib/test/mockComponent.js.map +1 -1
  128. package/dist/lib/test/types.d.ts +13 -0
  129. package/package.json +11 -7
@@ -1,5 +1,7 @@
1
1
  import { type CoreContainer, type ICoreService } from '../ioc';
2
- import type { AsenaAdapter } from '../adapter';
2
+ import type { AsenaAdapter, AsenaStartOptions } from '../adapter';
3
+ import * as bun from 'bun';
4
+ import type { HealthOptions } from './AsenaServerFactory';
3
5
  /**
4
6
  * @description AsenaServer - Main server class for Asena framework
5
7
  * Now a core service managed by IoC container with field injection
@@ -7,8 +9,9 @@ import type { AsenaAdapter } from '../adapter';
7
9
  export declare class AsenaServer<A extends AsenaAdapter<any, any>> implements ICoreService {
8
10
  serviceName: string;
9
11
  private _coreContainer;
10
- private _adapter;
12
+ private _adapter?;
11
13
  private _logger;
14
+ private _ulak;
12
15
  private prepareMiddleware;
13
16
  private prepareConfigService;
14
17
  private prepareWebsocketService;
@@ -17,10 +20,16 @@ export declare class AsenaServer<A extends AsenaAdapter<any, any>> implements IC
17
20
  private prepareEventService;
18
21
  private prepareScheduleService;
19
22
  private prepareFrontendControllerService;
23
+ private prepareMicroserviceService;
20
24
  private cronRunner;
21
25
  private _port;
22
26
  private _gc;
23
27
  private controllers;
28
+ private microserviceTransports;
29
+ private messagingInterceptors;
30
+ private _health?;
31
+ private healthServer?;
32
+ private _httpServer?;
24
33
  /**
25
34
  * @description Lifecycle hook - called after dependencies are injected
26
35
  * @returns {void}
@@ -29,9 +38,10 @@ export declare class AsenaServer<A extends AsenaAdapter<any, any>> implements IC
29
38
  /**
30
39
  * @description Start the server
31
40
  * Main entry point after factory creation
41
+ * @param {AsenaStartOptions} options - Optional transport overrides forwarded to the adapter
32
42
  * @returns {Promise<void>}
33
43
  */
34
- start(): Promise<void>;
44
+ start(options?: AsenaStartOptions): Promise<void>;
35
45
  /**
36
46
  * @description Stop the server and release resources
37
47
  * @param {boolean} closeActiveConnections - Whether to close active connections immediately
@@ -45,11 +55,37 @@ export declare class AsenaServer<A extends AsenaAdapter<any, any>> implements IC
45
55
  * @returns {this}
46
56
  */
47
57
  port(port: number): this;
58
+ /**
59
+ * @description Configure the optional health endpoint (mainly for headless/K8s probes)
60
+ * Builder pattern for API compatibility
61
+ * @param {HealthOptions} options - Health endpoint options
62
+ * @returns {this}
63
+ */
64
+ health(options: HealthOptions): this;
65
+ /**
66
+ * @description Lazily resolve the HTTP adapter if one was registered.
67
+ * Headless mode (no adapter) is valid - all adapter-dependent steps are skipped.
68
+ * @returns {Promise<void>}
69
+ */
70
+ private resolveAdapter;
71
+ /**
72
+ * @description Warn about HTTP-only components that cannot work without an adapter
73
+ * @returns {void}
74
+ */
75
+ private warnAdapterlessComponents;
48
76
  /**
49
77
  * @description Get current CoreContainer instance
50
78
  * @returns {CoreContainer}
51
79
  */
52
80
  get coreContainer(): CoreContainer;
81
+ /**
82
+ * @description The Bun server the adapter is listening on, once start() has run.
83
+ *
84
+ * Undefined in headless mode and before start(). Read `httpServer.port` to learn the
85
+ * actually bound port - the only way to find it out when starting on port 0.
86
+ * @returns {bun.Server | undefined}
87
+ */
88
+ get httpServer(): bun.Server<any> | undefined;
53
89
  /**
54
90
  * @description Initialize and register all controllers
55
91
  * @returns {Promise<void>}
@@ -119,4 +155,11 @@ export declare class AsenaServer<A extends AsenaAdapter<any, any>> implements IC
119
155
  * @returns {Promise<void>}
120
156
  */
121
157
  private prepareConfigs;
158
+ /**
159
+ * @description Prepare microservice message handlers and transports
160
+ * Runs before the HTTP adapter starts so handlers are live before HTTP goes up.
161
+ * Also validates that @MessageController components have a configured transport (fail fast).
162
+ * @returns {Promise<void>}
163
+ */
164
+ private prepareMicroservices;
122
165
  }
@@ -14,6 +14,8 @@ import * as bun from 'bun';
14
14
  import { blue, green, yellow } from '../logger';
15
15
  import { getOwnTypedMetadata, getTypedMetadata } from '../utils/typedMetadata';
16
16
  import { Inject, PostConstruct } from '../ioc/component';
17
+ import { normalizeTransportConfig } from './config/AsenaConfig';
18
+ import { HealthServer } from './health/HealthServer';
17
19
  /**
18
20
  * @description AsenaServer - Main server class for Asena framework
19
21
  * Now a core service managed by IoC container with field injection
@@ -21,8 +23,11 @@ import { Inject, PostConstruct } from '../ioc/component';
21
23
  let AsenaServer = class AsenaServer {
22
24
  serviceName = 'AsenaServer';
23
25
  _coreContainer;
26
+ // NOT injected eagerly: resolved lazily in start() via container.has()
27
+ // so the server can boot in headless mode without an HTTP adapter
24
28
  _adapter;
25
29
  _logger;
30
+ _ulak;
26
31
  prepareMiddleware;
27
32
  prepareConfigService;
28
33
  prepareWebsocketService;
@@ -31,11 +36,21 @@ let AsenaServer = class AsenaServer {
31
36
  prepareEventService;
32
37
  prepareScheduleService;
33
38
  prepareFrontendControllerService;
39
+ prepareMicroserviceService;
34
40
  cronRunner;
35
41
  // Instance state
36
42
  _port;
37
43
  _gc = false;
38
44
  controllers = [];
45
+ // Microservice transports collected from the transport() config hook
46
+ microserviceTransports = new Map();
47
+ messagingInterceptors = [];
48
+ // Optional health endpoint (mainly for headless deployments / K8s probes)
49
+ _health;
50
+ healthServer;
51
+ // The Bun server returned by the adapter - exposes the actually bound port, which is
52
+ // what a caller needs when starting on port 0 or on a unix socket
53
+ _httpServer;
39
54
  /**
40
55
  * @description Lifecycle hook - called after dependencies are injected
41
56
  * @returns {void}
@@ -46,25 +61,42 @@ let AsenaServer = class AsenaServer {
46
61
  /**
47
62
  * @description Start the server
48
63
  * Main entry point after factory creation
64
+ * @param {AsenaStartOptions} options - Optional transport overrides forwarded to the adapter
49
65
  * @returns {Promise<void>}
50
66
  */
51
- async start() {
52
- this._logger.info(`Adapter: ${green(this._adapter.name)} implemented`);
53
- this._adapter.setPort(this._port);
67
+ async start(options) {
68
+ await this.resolveAdapter();
69
+ if (this._adapter) {
70
+ this._logger.info(`Adapter: ${green(this._adapter.name)} implemented`);
71
+ this._adapter.setPort(this._port);
72
+ }
73
+ else {
74
+ this._logger.info('Headless mode: no HTTP adapter configured');
75
+ this.warnAdapterlessComponents();
76
+ }
54
77
  this._logger.info('All components registered and ready to use');
55
78
  // Phase 7: Application setup
56
79
  this._coreContainer.setPhase(CoreBootstrapPhase.APPLICATION_SETUP);
57
80
  await this.prepareConfigs();
81
+ await this.prepareMicroservices();
58
82
  await this.prepareEventService.prepare();
59
83
  await this.prepareScheduleService.prepare();
60
- await this.initializeControllers();
61
- await this.prepareFrontendControllers();
62
- await this.prepareWebSocket();
84
+ if (this._adapter) {
85
+ await this.initializeControllers();
86
+ await this.prepareFrontendControllers();
87
+ await this.prepareWebSocket();
88
+ }
63
89
  // Phase 8: Server ready
64
90
  this._coreContainer.setPhase(CoreBootstrapPhase.SERVER_READY);
65
- await this._adapter.start();
91
+ if (this._adapter) {
92
+ this._httpServer = await this._adapter.start(options);
93
+ }
66
94
  // Start scheduled jobs after server is ready
67
95
  this.cronRunner.startAll();
96
+ if (this._health) {
97
+ this.healthServer = new HealthServer(this._health, this._ulak, this._logger);
98
+ this.healthServer.start();
99
+ }
68
100
  if (this._gc) {
69
101
  bun.gc(true);
70
102
  }
@@ -76,7 +108,11 @@ let AsenaServer = class AsenaServer {
76
108
  */
77
109
  async stop(closeActiveConnections = true) {
78
110
  this.cronRunner.stopAll();
79
- await this._adapter.stop(closeActiveConnections);
111
+ this.healthServer?.stop();
112
+ // Adapter first: in-flight HTTP handlers may still call ulak.send(), so
113
+ // transports must outlive the HTTP surface that uses them
114
+ await this._adapter?.stop(closeActiveConnections);
115
+ await this.prepareMicroserviceService.destroy();
80
116
  }
81
117
  /**
82
118
  * @description Configure server port
@@ -88,6 +124,51 @@ let AsenaServer = class AsenaServer {
88
124
  this._port = port;
89
125
  return this;
90
126
  }
127
+ /**
128
+ * @description Configure the optional health endpoint (mainly for headless/K8s probes)
129
+ * Builder pattern for API compatibility
130
+ * @param {HealthOptions} options - Health endpoint options
131
+ * @returns {this}
132
+ */
133
+ health(options) {
134
+ this._health = options;
135
+ return this;
136
+ }
137
+ /**
138
+ * @description Lazily resolve the HTTP adapter if one was registered.
139
+ * Headless mode (no adapter) is valid - all adapter-dependent steps are skipped.
140
+ * @returns {Promise<void>}
141
+ */
142
+ async resolveAdapter() {
143
+ if (this._adapter) {
144
+ return;
145
+ }
146
+ if (this._coreContainer.container.has(ICoreServiceNames.ASENA_ADAPTER)) {
147
+ this._adapter = await this._coreContainer.resolve(ICoreServiceNames.ASENA_ADAPTER);
148
+ }
149
+ }
150
+ /**
151
+ * @description Warn about HTTP-only components that cannot work without an adapter
152
+ * @returns {void}
153
+ */
154
+ warnAdapterlessComponents() {
155
+ const httpOnlyTypes = [ComponentType.CONTROLLER, ComponentType.WEBSOCKET, ComponentType.FRONTEND_CONTROLLER];
156
+ const services = this._coreContainer.container.services;
157
+ for (const type of httpOnlyTypes) {
158
+ const names = [];
159
+ for (const value of Object.values(services)) {
160
+ const entries = Array.isArray(value) ? value : [value];
161
+ for (const entry of entries) {
162
+ if (entry?.Class && getTypedMetadata(type, entry.Class)) {
163
+ names.push(entry.Class.name);
164
+ }
165
+ }
166
+ }
167
+ if (names.length) {
168
+ this._logger.warn(`Headless mode: ${type} component(s) [${names.join(', ')}] require an HTTP adapter and will be ignored`);
169
+ }
170
+ }
171
+ }
91
172
  /**
92
173
  * @description Get current CoreContainer instance
93
174
  * @returns {CoreContainer}
@@ -95,6 +176,16 @@ let AsenaServer = class AsenaServer {
95
176
  get coreContainer() {
96
177
  return this._coreContainer;
97
178
  }
179
+ /**
180
+ * @description The Bun server the adapter is listening on, once start() has run.
181
+ *
182
+ * Undefined in headless mode and before start(). Read `httpServer.port` to learn the
183
+ * actually bound port - the only way to find it out when starting on port 0.
184
+ * @returns {bun.Server | undefined}
185
+ */
186
+ get httpServer() {
187
+ return this._httpServer;
188
+ }
98
189
  /**
99
190
  * @description Initialize and register all controllers
100
191
  * @returns {Promise<void>}
@@ -285,49 +376,84 @@ let AsenaServer = class AsenaServer {
285
376
  return;
286
377
  }
287
378
  if (typeof configInstance.serveOptions === 'function') {
288
- await this._adapter.serveOptions(configInstance.serveOptions.bind(configInstance));
379
+ if (this._adapter) {
380
+ await this._adapter.serveOptions(configInstance.serveOptions.bind(configInstance));
381
+ }
382
+ else {
383
+ this._logger.warn('Headless mode: serveOptions() ignored (no HTTP adapter)');
384
+ }
289
385
  }
290
386
  if (typeof configInstance.onError === 'function') {
291
- await this._adapter.onError(configInstance.onError.bind(configInstance));
387
+ if (this._adapter) {
388
+ await this._adapter.onError(configInstance.onError.bind(configInstance));
389
+ }
390
+ else {
391
+ this._logger.warn('Headless mode: onError() ignored (no HTTP adapter)');
392
+ }
292
393
  }
293
394
  // Pattern-based global middleware registration
294
395
  if (typeof configInstance.globalMiddlewares === 'function') {
295
- const middlewareEntries = await configInstance.globalMiddlewares();
296
- for (const entry of middlewareEntries) {
297
- // Normalize entry to config format (handles backward compatibility)
298
- const config = this.normalizeMiddlewareEntry(entry);
299
- // Prepare middleware instances
300
- const preparedMiddlewares = await this.prepareMiddlewares([config.middleware]);
301
- // Register with adapter (pass route config)
302
- for (const middleware of preparedMiddlewares) {
303
- await this._adapter.use(middleware, config.routes);
396
+ if (this._adapter) {
397
+ const middlewareEntries = await configInstance.globalMiddlewares();
398
+ for (const entry of middlewareEntries) {
399
+ // Normalize entry to config format (handles backward compatibility)
400
+ const config = this.normalizeMiddlewareEntry(entry);
401
+ // Prepare middleware instances
402
+ const preparedMiddlewares = await this.prepareMiddlewares([config.middleware]);
403
+ // Register with adapter (pass route config)
404
+ for (const middleware of preparedMiddlewares) {
405
+ await this._adapter.use(middleware, config.routes);
406
+ }
304
407
  }
305
408
  }
409
+ else {
410
+ this._logger.warn('Headless mode: globalMiddlewares() ignored (no HTTP adapter)');
411
+ }
306
412
  }
307
- // WebSocket transport configuration
413
+ // Transport configuration (WebSocket + microservice)
308
414
  if (typeof configInstance.transport === 'function') {
309
- const transport = await configInstance.transport();
310
- const wsAdapter = this._adapter.getWebsocketAdapter();
311
- if (wsAdapter) {
312
- wsAdapter.transport = transport;
415
+ const result = await configInstance.transport();
416
+ const normalized = await normalizeTransportConfig(result);
417
+ if (normalized.websocket) {
418
+ if (this._adapter) {
419
+ const wsAdapter = this._adapter.getWebsocketAdapter();
420
+ if (wsAdapter) {
421
+ wsAdapter.transport = normalized.websocket;
422
+ }
423
+ }
424
+ else {
425
+ this._logger.warn('Headless mode: websocket transport ignored (no HTTP adapter)');
426
+ }
313
427
  }
428
+ // Microservice part works in BOTH modes - consumed by prepareMicroservices()
429
+ this.microserviceTransports = normalized.microservices;
430
+ this.messagingInterceptors = normalized.interceptors;
314
431
  }
315
432
  const name = getOwnTypedMetadata(ComponentConstants.NameKey, configInstance.constructor);
316
433
  this._logger.info(`Config ${yellow(name)} applied`);
317
434
  }
435
+ /**
436
+ * @description Prepare microservice message handlers and transports
437
+ * Runs before the HTTP adapter starts so handlers are live before HTTP goes up.
438
+ * Also validates that @MessageController components have a configured transport (fail fast).
439
+ * @returns {Promise<void>}
440
+ */
441
+ async prepareMicroservices() {
442
+ await this.prepareMicroserviceService.prepare(this.microserviceTransports, this.messagingInterceptors);
443
+ }
318
444
  };
319
445
  __decorate([
320
446
  Inject(ICoreServiceNames.CORE_CONTAINER),
321
447
  __metadata("design:type", Function)
322
448
  ], AsenaServer.prototype, "_coreContainer", void 0);
323
- __decorate([
324
- Inject(ICoreServiceNames.ASENA_ADAPTER),
325
- __metadata("design:type", Object)
326
- ], AsenaServer.prototype, "_adapter", void 0);
327
449
  __decorate([
328
450
  Inject(ICoreServiceNames.SERVER_LOGGER),
329
451
  __metadata("design:type", Object)
330
452
  ], AsenaServer.prototype, "_logger", void 0);
453
+ __decorate([
454
+ Inject(ICoreServiceNames.__ULAK__),
455
+ __metadata("design:type", Function)
456
+ ], AsenaServer.prototype, "_ulak", void 0);
331
457
  __decorate([
332
458
  Inject(ICoreServiceNames.PREPARE_MIDDLEWARE_SERVICE),
333
459
  __metadata("design:type", Function)
@@ -360,6 +486,10 @@ __decorate([
360
486
  Inject(ICoreServiceNames.PREPARE_FRONTEND_CONTROLLER_SERVICE),
361
487
  __metadata("design:type", Function)
362
488
  ], AsenaServer.prototype, "prepareFrontendControllerService", void 0);
489
+ __decorate([
490
+ Inject(ICoreServiceNames.PREPARE_MICROSERVICE_SERVICE),
491
+ __metadata("design:type", Function)
492
+ ], AsenaServer.prototype, "prepareMicroserviceService", void 0);
363
493
  __decorate([
364
494
  Inject(ICoreServiceNames.CRON_RUNNER),
365
495
  __metadata("design:type", Function)
@@ -1 +1 @@
1
- {"version":3,"file":"AsenaServer.js","sourceRoot":"","sources":["../../../lib/server/AsenaServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AsenaServer.js","sourceRoot":"","sources":["../../../lib/server/AsenaServer.ts"],"names":[],"mappings":"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"}
@@ -2,15 +2,50 @@ import type { AsenaServer } from './AsenaServer';
2
2
  import type { AsenaAdapter } from '../adapter';
3
3
  import type { ServerLogger } from '../logger';
4
4
  import type { Class } from './types';
5
+ /**
6
+ * @description Health endpoint options for headless/hybrid deployments
7
+ */
8
+ export interface HealthOptions {
9
+ /**
10
+ * Port for the health endpoint mini server
11
+ */
12
+ port: number;
13
+ /**
14
+ * Endpoint path
15
+ * @default '/healthz'
16
+ */
17
+ path?: string;
18
+ }
5
19
  /**
6
20
  * @description Configuration options for AsenaServer creation
21
+ *
22
+ * `adapter` is required unless `headless: true` is set. HEADLESS mode opens
23
+ * no HTTP server, but microservice transports, events, schedules and configs
24
+ * still run - useful for internal services driven purely by microservice
25
+ * messages.
7
26
  */
8
- export interface AsenaServerOptions<A extends AsenaAdapter<any, any>> {
9
- adapter: A;
27
+ export interface AsenaServerOptions<A extends AsenaAdapter<any, any> = AsenaAdapter<any, any>> {
28
+ adapter?: A;
29
+ /**
30
+ * Explicit opt-in for booting without an HTTP adapter. Required when
31
+ * `adapter` is omitted, so a wiring bug that yields an undefined adapter
32
+ * fails fast instead of silently starting an HTTP-less application.
33
+ */
34
+ headless?: boolean;
10
35
  logger: ServerLogger;
11
36
  port?: number;
12
37
  components?: Class[];
13
38
  gc?: boolean;
39
+ health?: HealthOptions;
40
+ /**
41
+ * Replace registered components with pre-created test doubles, keyed by service name
42
+ * (Spring's `@MockBean`).
43
+ *
44
+ * Seeded before user components are registered, so the real class is never constructed
45
+ * and every dependent captures the double. Core services cannot be overridden - they
46
+ * have already resolved their dependencies during bootstrap phases 1-5.
47
+ */
48
+ overrides?: Record<string, object>;
14
49
  }
15
50
  /**
16
51
  * @description Factory for creating AsenaServer instances
@@ -22,5 +57,5 @@ export declare class AsenaServerFactory {
22
57
  * @param {AsenaServerOptions<A>} options - Server configuration options
23
58
  * @returns {Promise<AsenaServer<A>>} Fully configured AsenaServer instance
24
59
  */
25
- static create<A extends AsenaAdapter<any, any>>(options: AsenaServerOptions<A>): Promise<AsenaServer<A>>;
60
+ static create<A extends AsenaAdapter<any, any> = AsenaAdapter<any, any>>(options: AsenaServerOptions<A>): Promise<AsenaServer<A>>;
26
61
  }
@@ -13,7 +13,11 @@ export class AsenaServerFactory {
13
13
  * @returns {Promise<AsenaServer<A>>} Fully configured AsenaServer instance
14
14
  */
15
15
  static async create(options) {
16
- const { adapter, logger, port, components, gc } = options;
16
+ const { adapter, logger, port, components, gc, health, overrides } = options;
17
+ if (!adapter && !options.headless) {
18
+ throw new Error("AsenaServerFactory.create: no 'adapter' provided - pass an HTTP adapter, " +
19
+ "or set 'headless: true' to intentionally start without one");
20
+ }
17
21
  logger.info(`
18
22
  ___ _____ ______ _ __ ___
19
23
  / | / ___/ / ____// | / // |
@@ -36,6 +40,18 @@ export class AsenaServerFactory {
36
40
  // Phase 6: Register user components
37
41
  const iocEngine = await coreContainer.resolve(ICoreServiceNames.IOC_ENGINE);
38
42
  iocEngine.setConfig(config);
43
+ // Seed overrides before any user component is registered: Container builds injection
44
+ // closures eagerly, so a double added later would be missed by existing dependents
45
+ if (overrides) {
46
+ const coreServiceNames = new Set(Object.values(ICoreServiceNames));
47
+ for (const [name, instance] of Object.entries(overrides)) {
48
+ if (coreServiceNames.has(name)) {
49
+ throw new Error(`Cannot override core service '${name}' - core services are wired during bootstrap ` +
50
+ 'phases 1-5 and have already captured their dependencies by this point.');
51
+ }
52
+ coreContainer.container.overrideInstance(name, instance);
53
+ }
54
+ }
39
55
  if (components?.length) {
40
56
  const injectableComponents = components.map((comp) => {
41
57
  const face = getTypedMetadata(ComponentConstants.InterfaceKey, comp);
@@ -56,8 +72,11 @@ export class AsenaServerFactory {
56
72
  // Resolve AsenaServer (with all dependencies injected)
57
73
  const server = await coreContainer.resolve(ICoreServiceNames.ASENA_SERVER);
58
74
  // Configure server
59
- if (port)
75
+ // Explicit !== undefined: port 0 is meaningful (let Bun pick a free ephemeral port)
76
+ if (port !== undefined)
60
77
  server.port(port);
78
+ if (health)
79
+ server.health(health);
61
80
  if (gc !== undefined)
62
81
  server._gc = gc;
63
82
  return server;
@@ -1 +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;IAC7B;;;;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;CACF"}
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;AAqD1D;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAC7B;;;;OAIG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CACxB,OAA8B;QAE9B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAE7E,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,2EAA2E;gBACzE,4DAA4D,CAC/D,CAAC;QACJ,CAAC;QAED,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,qFAAqF;QACrF,mFAAmF;QACnF,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAE3E,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzD,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,+CAA+C;wBAClF,wEAAwE,CAC3E,CAAC;gBACJ,CAAC;gBAED,aAAa,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,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,oFAAoF;QACpF,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1C,IAAI,MAAM;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAElC,IAAI,EAAE,KAAK,SAAS;YAAG,MAAc,CAAC,GAAG,GAAG,EAAE,CAAC;QAE/C,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -1,6 +1,57 @@
1
1
  import type { AsenaContext, AsenaServeOptions } from '../../adapter';
2
2
  import type { WebSocketTransport } from '../web/websocket';
3
3
  import type { MiddlewareClass } from '../web/middleware';
4
+ import type { MessagingInterceptor } from '../microservice/types';
5
+ import type { MicroserviceTransport } from '../microservice/MicroserviceTransport';
6
+ /**
7
+ * Object form of the transport() hook - configures WebSocket and microservice
8
+ * transports separately (all fields optional)
9
+ */
10
+ export interface AsenaTransportConfig {
11
+ /**
12
+ * WebSocket transport for cross-pod messaging (same as the bare return form)
13
+ */
14
+ websocket?: WebSocketTransport | Promise<WebSocketTransport>;
15
+ /**
16
+ * Microservice transport(s). A single transport is registered under the
17
+ * name 'default'; a named map allows multiple brokers in one project
18
+ * (e.g. part on Redis, part on NATS).
19
+ *
20
+ * @example
21
+ * microservice: new RedisMicroserviceTransport({ ... })
22
+ * @example
23
+ * microservice: { default: redisTransport, analytics: natsTransport }
24
+ */
25
+ microservice?: MicroserviceTransport | Record<string, MicroserviceTransport> | Promise<MicroserviceTransport | Record<string, MicroserviceTransport>>;
26
+ /**
27
+ * Messaging interceptors applied to all microservice transports
28
+ * (e.g. OpenTelemetry trace propagation)
29
+ */
30
+ interceptors?: MessagingInterceptor[];
31
+ }
32
+ /**
33
+ * Normalized result of the transport() hook
34
+ */
35
+ export interface NormalizedTransportConfig {
36
+ websocket?: WebSocketTransport;
37
+ microservices: Map<string, MicroserviceTransport>;
38
+ interceptors: MessagingInterceptor[];
39
+ }
40
+ /**
41
+ * Normalize the transport() hook result into a single shape.
42
+ *
43
+ * - A bare WebSocketTransport (has a publish function) is the legacy form → { websocket }
44
+ * - An object form is discriminated per field; a single MicroserviceTransport
45
+ * (has a send function) becomes the 'default' named transport
46
+ * - An object with none of the known fields throws (catches accidentally
47
+ * returning a bare MicroserviceTransport, which would otherwise be a silent no-op)
48
+ *
49
+ * CAVEAT: the legacy detection is duck-typed on `publish`. A custom
50
+ * MicroserviceTransport that also defines a `publish` method would be
51
+ * mistaken for a bare WebSocketTransport when returned bare - such
52
+ * transports must use the explicit `{ microservice: ... }` object form.
53
+ */
54
+ export declare function normalizeTransportConfig(result: WebSocketTransport | AsenaTransportConfig): Promise<NormalizedTransportConfig>;
4
55
  /**
5
56
  * Route configuration for global middleware
6
57
  */
@@ -114,18 +165,45 @@ export interface AsenaConfig<C extends AsenaContext<any, any> = AsenaContext<any
114
165
  */
115
166
  globalMiddlewares?(): Promise<GlobalMiddlewareEntry[]> | GlobalMiddlewareEntry[];
116
167
  /**
117
- * WebSocket transport for cross-pod messaging.
168
+ * Transport configuration for cross-pod WebSocket messaging and
169
+ * microservice messaging.
118
170
  *
119
- * When not specified, BunLocalTransport is used (single-pod, zero overhead).
120
- * For multi-pod deployments, return a custom transport (e.g., RedisTransport).
171
+ * Two return forms are supported:
172
+ * 1. Bare WebSocketTransport (legacy, backward compatible) - configures
173
+ * only the WebSocket transport. When not specified, BunLocalTransport
174
+ * is used (single-pod, zero overhead).
175
+ * 2. AsenaTransportConfig object - configures WebSocket and microservice
176
+ * transports separately, plus messaging interceptors.
121
177
  *
122
178
  * @example
123
179
  * ```typescript
180
+ * // Legacy form - WebSocket only
124
181
  * transport() {
125
182
  * return new RedisTransport(this.redis);
126
183
  * }
184
+ *
185
+ * // Object form - WebSocket + microservice
186
+ * transport() {
187
+ * return {
188
+ * websocket: new RedisTransport(this.redis),
189
+ * microservice: new RedisMicroserviceTransport({
190
+ * url: 'redis://localhost:6379',
191
+ * serviceName: 'order-service',
192
+ * }),
193
+ * };
194
+ * }
195
+ *
196
+ * // Multiple named microservice transports (multi-broker projects)
197
+ * transport() {
198
+ * return {
199
+ * microservice: {
200
+ * default: new RedisMicroserviceTransport({ ... }),
201
+ * analytics: new NatsMicroserviceTransport({ ... }),
202
+ * },
203
+ * };
204
+ * }
127
205
  * ```
128
206
  */
129
- transport?(): WebSocketTransport | Promise<WebSocketTransport>;
207
+ transport?(): WebSocketTransport | AsenaTransportConfig | Promise<WebSocketTransport | AsenaTransportConfig>;
130
208
  }
131
209
  export type AsenaConfigFunctions = 'onError' | 'serveOptions' | 'globalMiddlewares' | 'transport';