@asenajs/asena 0.5.0 → 0.6.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 (104) hide show
  1. package/dist/index.d.ts +0 -1
  2. package/dist/index.js +0 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/adapter/AsenaAdapter.js.map +1 -1
  5. package/dist/lib/adapter/AsenaWebsocketAdapter.js.map +1 -1
  6. package/dist/lib/ioc/CircularDependencyDetector.js.map +1 -1
  7. package/dist/lib/ioc/Container.js +4 -4
  8. package/dist/lib/ioc/Container.js.map +1 -1
  9. package/dist/lib/ioc/CoreContainer.js +7 -0
  10. package/dist/lib/ioc/CoreContainer.js.map +1 -1
  11. package/dist/lib/ioc/IocEngine.js +0 -2
  12. package/dist/lib/ioc/IocEngine.js.map +1 -1
  13. package/dist/lib/ioc/component/componentUtils.js.map +1 -1
  14. package/dist/lib/ioc/constants/ComponentConstants.d.ts +2 -0
  15. package/dist/lib/ioc/constants/ComponentConstants.js +3 -0
  16. package/dist/lib/ioc/constants/ComponentConstants.js.map +1 -1
  17. package/dist/lib/ioc/types/ICoreServiceNamesType.d.ts +3 -0
  18. package/dist/lib/ioc/types/ICoreServiceNamesType.js +4 -0
  19. package/dist/lib/ioc/types/ICoreServiceNamesType.js.map +1 -1
  20. package/dist/lib/ioc/types/decorators/ComponentType.d.ts +2 -1
  21. package/dist/lib/ioc/types/decorators/ComponentType.js +1 -0
  22. package/dist/lib/ioc/types/decorators/ComponentType.js.map +1 -1
  23. package/dist/lib/server/AsenaServer.d.ts +1 -0
  24. package/dist/lib/server/AsenaServer.js +7 -1
  25. package/dist/lib/server/AsenaServer.js.map +1 -1
  26. package/dist/lib/server/AsenaServerFactory.js.map +1 -1
  27. package/dist/lib/server/decorators/components/Controller.js.map +1 -1
  28. package/dist/lib/server/decorators/components/EventService.d.ts +37 -0
  29. package/dist/lib/server/decorators/components/EventService.js +47 -0
  30. package/dist/lib/server/decorators/components/EventService.js.map +1 -0
  31. package/dist/lib/server/decorators/components/Schedule.js.map +1 -1
  32. package/dist/lib/server/decorators/components/StaticServe.js +1 -1
  33. package/dist/lib/server/decorators/components/StaticServe.js.map +1 -1
  34. package/dist/lib/server/decorators/components/index.d.ts +1 -0
  35. package/dist/lib/server/decorators/components/index.js +1 -0
  36. package/dist/lib/server/decorators/components/index.js.map +1 -1
  37. package/dist/lib/server/decorators/index.d.ts +1 -0
  38. package/dist/lib/server/decorators/index.js +1 -0
  39. package/dist/lib/server/decorators/index.js.map +1 -1
  40. package/dist/lib/server/event/EventDispatchService.d.ts +104 -0
  41. package/dist/lib/server/event/EventDispatchService.js +203 -0
  42. package/dist/lib/server/event/EventDispatchService.js.map +1 -0
  43. package/dist/lib/server/event/EventEmitter.d.ts +67 -0
  44. package/dist/lib/server/event/EventEmitter.js +88 -0
  45. package/dist/lib/server/event/EventEmitter.js.map +1 -0
  46. package/dist/lib/server/event/EventService.d.ts +5 -0
  47. package/dist/lib/server/event/EventService.js +6 -0
  48. package/dist/lib/server/event/EventService.js.map +1 -0
  49. package/dist/lib/server/event/decorators/On.d.ts +38 -0
  50. package/dist/lib/server/event/decorators/On.js +56 -0
  51. package/dist/lib/server/event/decorators/On.js.map +1 -0
  52. package/dist/lib/server/event/decorators/index.d.ts +1 -0
  53. package/dist/lib/server/event/decorators/index.js +2 -0
  54. package/dist/lib/server/event/decorators/index.js.map +1 -0
  55. package/dist/lib/server/event/emitter.d.ts +21 -0
  56. package/dist/lib/server/event/emitter.js +25 -0
  57. package/dist/lib/server/event/emitter.js.map +1 -0
  58. package/dist/lib/server/event/eventPatternMatcher.d.ts +24 -0
  59. package/dist/lib/server/event/eventPatternMatcher.js +112 -0
  60. package/dist/lib/server/event/eventPatternMatcher.js.map +1 -0
  61. package/dist/lib/server/event/index.d.ts +6 -0
  62. package/dist/lib/server/event/index.js +12 -0
  63. package/dist/lib/server/event/index.js.map +1 -0
  64. package/dist/lib/server/event/types.d.ts +70 -0
  65. package/dist/lib/server/event/types.js +2 -0
  66. package/dist/lib/server/event/types.js.map +1 -0
  67. package/dist/lib/server/index.d.ts +0 -2
  68. package/dist/lib/server/index.js +0 -3
  69. package/dist/lib/server/index.js.map +1 -1
  70. package/dist/lib/server/messaging/Ulak.js.map +1 -1
  71. package/dist/lib/server/messaging/types.js.map +1 -1
  72. package/dist/lib/server/src/services/PrepareConfigService.js.map +1 -1
  73. package/dist/lib/server/src/services/PrepareEventService.d.ts +40 -0
  74. package/dist/lib/server/src/services/PrepareEventService.js +103 -0
  75. package/dist/lib/server/src/services/PrepareEventService.js.map +1 -0
  76. package/dist/lib/server/src/services/PrepareMiddlewareService.js.map +1 -1
  77. package/dist/lib/server/src/services/PrepareStaticServeConfigService.js +3 -3
  78. package/dist/lib/server/src/services/PrepareStaticServeConfigService.js.map +1 -1
  79. package/dist/lib/server/src/services/PrepareValidatorService.js.map +1 -1
  80. package/dist/lib/server/src/services/PrepareWebsocketService.d.ts +1 -1
  81. package/dist/lib/server/src/services/PrepareWebsocketService.js +2 -2
  82. package/dist/lib/server/src/services/PrepareWebsocketService.js.map +1 -1
  83. package/dist/lib/server/web/decorators/http.base.d.ts +1 -1
  84. package/dist/lib/server/web/decorators/http.base.js +1 -1
  85. package/dist/lib/server/web/decorators/http.base.js.map +1 -1
  86. package/dist/lib/server/web/helper/middlewareHelper.d.ts +1 -1
  87. package/dist/lib/server/web/helper/middlewareHelper.js +1 -1
  88. package/dist/lib/server/web/helper/middlewareHelper.js.map +1 -1
  89. package/dist/lib/server/web/middleware/AsenaMiddlewareService.js.map +1 -1
  90. package/dist/lib/server/web/middleware/AsenaStaticServeService.d.ts +1 -1
  91. package/dist/lib/server/web/middleware/AsenaStaticServeService.js.map +1 -1
  92. package/dist/lib/server/web/websocket/AsenaSocket.d.ts +237 -4
  93. package/dist/lib/server/web/websocket/AsenaSocket.js +234 -32
  94. package/dist/lib/server/web/websocket/AsenaSocket.js.map +1 -1
  95. package/dist/lib/server/web/websocket/AsenaWebSocketServer.js.map +1 -1
  96. package/dist/lib/server/web/websocket/AsenaWebSocketService.d.ts +0 -13
  97. package/dist/lib/server/web/websocket/AsenaWebSocketService.js +1 -21
  98. package/dist/lib/server/web/websocket/AsenaWebSocketService.js.map +1 -1
  99. package/dist/lib/utils/index.d.ts +2 -0
  100. package/dist/lib/utils/index.js +3 -0
  101. package/dist/lib/utils/index.js.map +1 -0
  102. package/dist/lib/utils/typedMetadata.js +0 -1
  103. package/dist/lib/utils/typedMetadata.js.map +1 -1
  104. package/package.json +25 -14
@@ -0,0 +1,104 @@
1
+ import type { ICoreService } from '../../ioc';
2
+ import type { EventHandler, EventSubscription } from './types';
3
+ /**
4
+ * @description Internal event dispatch service
5
+ * Handles pattern matching, storage, and dispatching of events
6
+ *
7
+ * Architecture:
8
+ * - EventEmitter (public API) → EventDispatchService (internal logic)
9
+ * - Similar to: AsenaWebSocketService → AsenaWebSocketServer
10
+ *
11
+ * Performance:
12
+ * - Exact patterns: O(1) lookup via Map
13
+ * - Wildcard patterns: O(n) check via Array
14
+ * - Lazy warmup: Indexes built on first dispatch
15
+ *
16
+ * @internal This service should not be used directly by users
17
+ */
18
+ export declare class EventDispatchService implements ICoreService {
19
+ readonly serviceName = "EventDispatchService";
20
+ /**
21
+ * All registered event subscriptions
22
+ */
23
+ private handlers;
24
+ /**
25
+ * Warmup state - lazy initialization on first dispatch
26
+ */
27
+ private warmedUp;
28
+ /**
29
+ * Exact pattern cache for O(1) lookup
30
+ * Key: exact event pattern, Value: handlers for that pattern
31
+ */
32
+ private exactMatches;
33
+ /**
34
+ * Wildcard patterns that need O(n) matching
35
+ */
36
+ private wildcardPatterns;
37
+ /**
38
+ * Register a handler for an event pattern
39
+ *
40
+ * @param pattern - Event pattern (supports wildcards: 'user.*', '*.error')
41
+ * @param handler - Handler function to execute
42
+ * @param once - If true, handler will be removed after first execution
43
+ *
44
+ * @example
45
+ * registerHandler('user.created', (eventName, data) => { ... });
46
+ * registerHandler('download.*', (eventName, data) => { ... });
47
+ */
48
+ registerHandler(pattern: string, handler: EventHandler, once?: boolean): void;
49
+ /**
50
+ * Unregister a specific handler for a pattern
51
+ *
52
+ * @param pattern - Event pattern to unregister from
53
+ * @param handler - Handler function to remove
54
+ * @returns true if handler was found and removed, false otherwise
55
+ */
56
+ unregisterHandler(pattern: string, handler: EventHandler): boolean;
57
+ /**
58
+ * Dispatch an event to all matching handlers
59
+ *
60
+ * Fire-and-forget pattern:
61
+ * - Returns immediately, doesn't wait for async handlers
62
+ * - Async handler errors are caught and logged
63
+ * - Handlers are isolated (one error doesn't affect others)
64
+ *
65
+ * @param eventName - Event name to dispatch
66
+ * @param data - Optional data to pass to handlers
67
+ * @returns true if any handler was called, false if no handlers matched
68
+ *
69
+ * @example
70
+ * dispatch('user.created', { id: 123, name: 'John' }); // Returns true/false
71
+ */
72
+ dispatch(eventName: string, data?: any): boolean;
73
+ /**
74
+ * Warmup - Build indexes for faster lookup
75
+ *
76
+ * Strategy (Hybrid):
77
+ * - Exact patterns → Map (O(1) lookup)
78
+ * - Wildcard patterns → Array (O(n) check needed)
79
+ *
80
+ * This is lazy initialization:
81
+ * - Called automatically on first dispatch
82
+ * - Invalidated when handlers change
83
+ *
84
+ * Performance:
85
+ * - Exact patterns: O(1) - Most common case
86
+ * - Wildcard patterns: O(n) - Less common, smaller n
87
+ *
88
+ * @private
89
+ */
90
+ private warmup;
91
+ /**
92
+ * Get all registered handlers (for debugging/testing)
93
+ *
94
+ * @returns Array of all event subscriptions
95
+ * @internal
96
+ */
97
+ getHandlers(): EventSubscription[];
98
+ /**
99
+ * Clear all registered handlers
100
+ *
101
+ * @internal Used for testing and cleanup
102
+ */
103
+ clearHandlers(): void;
104
+ }
@@ -0,0 +1,203 @@
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
+ import { CoreService } from '../../ioc';
8
+ import { ICoreServiceNames } from '../../ioc';
9
+ import { matchesEventPattern } from './eventPatternMatcher';
10
+ /**
11
+ * @description Internal event dispatch service
12
+ * Handles pattern matching, storage, and dispatching of events
13
+ *
14
+ * Architecture:
15
+ * - EventEmitter (public API) → EventDispatchService (internal logic)
16
+ * - Similar to: AsenaWebSocketService → AsenaWebSocketServer
17
+ *
18
+ * Performance:
19
+ * - Exact patterns: O(1) lookup via Map
20
+ * - Wildcard patterns: O(n) check via Array
21
+ * - Lazy warmup: Indexes built on first dispatch
22
+ *
23
+ * @internal This service should not be used directly by users
24
+ */
25
+ let EventDispatchService = class EventDispatchService {
26
+ serviceName = 'EventDispatchService';
27
+ /**
28
+ * All registered event subscriptions
29
+ */
30
+ handlers = [];
31
+ /**
32
+ * Warmup state - lazy initialization on first dispatch
33
+ */
34
+ warmedUp = false;
35
+ /**
36
+ * Exact pattern cache for O(1) lookup
37
+ * Key: exact event pattern, Value: handlers for that pattern
38
+ */
39
+ exactMatches = new Map();
40
+ /**
41
+ * Wildcard patterns that need O(n) matching
42
+ */
43
+ wildcardPatterns = [];
44
+ /**
45
+ * Register a handler for an event pattern
46
+ *
47
+ * @param pattern - Event pattern (supports wildcards: 'user.*', '*.error')
48
+ * @param handler - Handler function to execute
49
+ * @param once - If true, handler will be removed after first execution
50
+ *
51
+ * @example
52
+ * registerHandler('user.created', (eventName, data) => { ... });
53
+ * registerHandler('download.*', (eventName, data) => { ... });
54
+ */
55
+ registerHandler(pattern, handler, once = false) {
56
+ this.handlers.push({ pattern, handler, once });
57
+ // Invalidate warmup cache - will rebuild on next dispatch
58
+ this.warmedUp = false;
59
+ }
60
+ /**
61
+ * Unregister a specific handler for a pattern
62
+ *
63
+ * @param pattern - Event pattern to unregister from
64
+ * @param handler - Handler function to remove
65
+ * @returns true if handler was found and removed, false otherwise
66
+ */
67
+ unregisterHandler(pattern, handler) {
68
+ const index = this.handlers.findIndex((sub) => sub.pattern === pattern && sub.handler === handler);
69
+ if (index !== -1) {
70
+ this.handlers.splice(index, 1);
71
+ // Invalidate warmup cache
72
+ this.warmedUp = false;
73
+ return true;
74
+ }
75
+ return false;
76
+ }
77
+ /**
78
+ * Dispatch an event to all matching handlers
79
+ *
80
+ * Fire-and-forget pattern:
81
+ * - Returns immediately, doesn't wait for async handlers
82
+ * - Async handler errors are caught and logged
83
+ * - Handlers are isolated (one error doesn't affect others)
84
+ *
85
+ * @param eventName - Event name to dispatch
86
+ * @param data - Optional data to pass to handlers
87
+ * @returns true if any handler was called, false if no handlers matched
88
+ *
89
+ * @example
90
+ * dispatch('user.created', { id: 123, name: 'John' }); // Returns true/false
91
+ */
92
+ dispatch(eventName, data) {
93
+ // Lazy warmup - build indexes on first dispatch
94
+ if (!this.warmedUp) {
95
+ this.warmup();
96
+ }
97
+ const handlersToCall = [];
98
+ // 1. Check exact match cache - O(1)
99
+ const exactHandlers = this.exactMatches.get(eventName);
100
+ if (exactHandlers) {
101
+ for (const handler of exactHandlers) {
102
+ // Find full subscription info (for 'once' support)
103
+ const sub = this.handlers.find((s) => s.handler === handler && s.pattern === eventName);
104
+ if (sub) {
105
+ handlersToCall.push(sub);
106
+ }
107
+ }
108
+ }
109
+ // 2. Check wildcard patterns - O(n) but smaller n
110
+ for (const sub of this.wildcardPatterns) {
111
+ if (matchesEventPattern(eventName, sub.pattern)) {
112
+ handlersToCall.push(sub);
113
+ }
114
+ }
115
+ // 3. No handlers matched
116
+ if (handlersToCall.length === 0) {
117
+ return false;
118
+ }
119
+ // 4. Call all matching handlers (fire-and-forget, error isolation)
120
+ for (const sub of handlersToCall) {
121
+ try {
122
+ const result = sub.handler(eventName, data);
123
+ // Smart async detection: If Promise, handle errors but DON'T await
124
+ // Benchmark showed await Promise.resolve(syncHandler()) is 13x slower!
125
+ if (result instanceof Promise) {
126
+ result.catch((error) => {
127
+ console.error(`[EventDispatchService] Async error in handler for event "${eventName}":`, error);
128
+ });
129
+ }
130
+ }
131
+ catch (error) {
132
+ // Sync handler error - log but continue with other handlers
133
+ console.error(`[EventDispatchService] Sync error in handler for event "${eventName}":`, error);
134
+ }
135
+ }
136
+ // 5. Remove 'once' handlers
137
+ for (const sub of handlersToCall) {
138
+ if (sub.once) {
139
+ this.unregisterHandler(sub.pattern, sub.handler);
140
+ }
141
+ }
142
+ return true;
143
+ }
144
+ /**
145
+ * Warmup - Build indexes for faster lookup
146
+ *
147
+ * Strategy (Hybrid):
148
+ * - Exact patterns → Map (O(1) lookup)
149
+ * - Wildcard patterns → Array (O(n) check needed)
150
+ *
151
+ * This is lazy initialization:
152
+ * - Called automatically on first dispatch
153
+ * - Invalidated when handlers change
154
+ *
155
+ * Performance:
156
+ * - Exact patterns: O(1) - Most common case
157
+ * - Wildcard patterns: O(n) - Less common, smaller n
158
+ *
159
+ * @private
160
+ */
161
+ warmup() {
162
+ this.exactMatches.clear();
163
+ this.wildcardPatterns = [];
164
+ for (const sub of this.handlers) {
165
+ if (sub.pattern.includes('*')) {
166
+ // Wildcard pattern - needs O(n) matching on dispatch
167
+ this.wildcardPatterns.push(sub);
168
+ }
169
+ else {
170
+ // Exact pattern - O(1) lookup on dispatch
171
+ const handlers = this.exactMatches.get(sub.pattern) || [];
172
+ handlers.push(sub.handler);
173
+ this.exactMatches.set(sub.pattern, handlers);
174
+ }
175
+ }
176
+ this.warmedUp = true;
177
+ }
178
+ /**
179
+ * Get all registered handlers (for debugging/testing)
180
+ *
181
+ * @returns Array of all event subscriptions
182
+ * @internal
183
+ */
184
+ getHandlers() {
185
+ return [...this.handlers];
186
+ }
187
+ /**
188
+ * Clear all registered handlers
189
+ *
190
+ * @internal Used for testing and cleanup
191
+ */
192
+ clearHandlers() {
193
+ this.handlers = [];
194
+ this.exactMatches.clear();
195
+ this.wildcardPatterns = [];
196
+ this.warmedUp = false;
197
+ }
198
+ };
199
+ EventDispatchService = __decorate([
200
+ CoreService(ICoreServiceNames.EVENT_DISPATCH_SERVICE)
201
+ ], EventDispatchService);
202
+ export { EventDispatchService };
203
+ //# sourceMappingURL=EventDispatchService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventDispatchService.js","sourceRoot":"","sources":["../../../../lib/server/event/EventDispatchService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { ICoreService } from '../../ioc';
2
+ /**
3
+ * @description Event Emitter - Public API for event-driven architecture
4
+ *
5
+ * Architecture:
6
+ * - EventEmitter (public API) → EventDispatchService (internal logic)
7
+ * - Similar pattern to: AsenaWebSocketService → AsenaWebSocketServer
8
+ *
9
+ * Usage:
10
+ * ```typescript
11
+ * // In your code
12
+ * @Inject(emitter())
13
+ * private emitter!: EventEmitter;
14
+ *
15
+ * // Emit events
16
+ * this.emitter.emit('user.created', { id: 123, name: 'John' });
17
+ * ```
18
+ *
19
+ * Event handlers are registered via decorators:
20
+ * ```typescript
21
+ * @EventService({ prefix: 'user' })
22
+ * export class UserEventService {
23
+ * @On('created')
24
+ * handleUserCreated(eventName: string, data: any) {
25
+ * // Handle event
26
+ * }
27
+ * }
28
+ * ```
29
+ *
30
+ * Fire-and-Forget Pattern:
31
+ * - emit() returns immediately (doesn't wait for handlers)
32
+ * - Async handlers are executed without blocking
33
+ * - Handler errors are isolated and logged
34
+ *
35
+ * @see EventDispatchService for internal implementation details
36
+ */
37
+ export declare class EventEmitter implements ICoreService {
38
+ readonly serviceName = "EventEmitter";
39
+ private dispatcher;
40
+ /**
41
+ * Emit an event to all registered handlers
42
+ *
43
+ * Fire-and-forget pattern (Spring style):
44
+ * - Returns immediately without waiting for handlers
45
+ * - Async handlers execute in background
46
+ * - Handler errors are caught and logged
47
+ *
48
+ * @param eventName - Event name to emit (e.g., 'user.created', 'download.complete')
49
+ * @param data - Optional data to pass to handlers
50
+ * @returns true if any handler was called, false if no handlers matched
51
+ *
52
+ * @example
53
+ * // Emit event with data
54
+ * const success = this.emitter.emit('user.created', { id: 123, name: 'John' });
55
+ *
56
+ * @example
57
+ * // Emit event without data
58
+ * this.emitter.emit('app.started');
59
+ *
60
+ * @example
61
+ * // Check if event was handled
62
+ * if (!this.emitter.emit('user.created', data)) {
63
+ * console.warn('No handlers registered for user.created event');
64
+ * }
65
+ */
66
+ emit(eventName: string, data?: any): boolean;
67
+ }
@@ -0,0 +1,88 @@
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 { CoreService, ICoreServiceNames } from '../../ioc';
11
+ import { Inject } from '../../ioc/component';
12
+ /**
13
+ * @description Event Emitter - Public API for event-driven architecture
14
+ *
15
+ * Architecture:
16
+ * - EventEmitter (public API) → EventDispatchService (internal logic)
17
+ * - Similar pattern to: AsenaWebSocketService → AsenaWebSocketServer
18
+ *
19
+ * Usage:
20
+ * ```typescript
21
+ * // In your code
22
+ * @Inject(emitter())
23
+ * private emitter!: EventEmitter;
24
+ *
25
+ * // Emit events
26
+ * this.emitter.emit('user.created', { id: 123, name: 'John' });
27
+ * ```
28
+ *
29
+ * Event handlers are registered via decorators:
30
+ * ```typescript
31
+ * @EventService({ prefix: 'user' })
32
+ * export class UserEventService {
33
+ * @On('created')
34
+ * handleUserCreated(eventName: string, data: any) {
35
+ * // Handle event
36
+ * }
37
+ * }
38
+ * ```
39
+ *
40
+ * Fire-and-Forget Pattern:
41
+ * - emit() returns immediately (doesn't wait for handlers)
42
+ * - Async handlers are executed without blocking
43
+ * - Handler errors are isolated and logged
44
+ *
45
+ * @see EventDispatchService for internal implementation details
46
+ */
47
+ let EventEmitter = class EventEmitter {
48
+ serviceName = 'EventEmitter';
49
+ dispatcher;
50
+ /**
51
+ * Emit an event to all registered handlers
52
+ *
53
+ * Fire-and-forget pattern (Spring style):
54
+ * - Returns immediately without waiting for handlers
55
+ * - Async handlers execute in background
56
+ * - Handler errors are caught and logged
57
+ *
58
+ * @param eventName - Event name to emit (e.g., 'user.created', 'download.complete')
59
+ * @param data - Optional data to pass to handlers
60
+ * @returns true if any handler was called, false if no handlers matched
61
+ *
62
+ * @example
63
+ * // Emit event with data
64
+ * const success = this.emitter.emit('user.created', { id: 123, name: 'John' });
65
+ *
66
+ * @example
67
+ * // Emit event without data
68
+ * this.emitter.emit('app.started');
69
+ *
70
+ * @example
71
+ * // Check if event was handled
72
+ * if (!this.emitter.emit('user.created', data)) {
73
+ * console.warn('No handlers registered for user.created event');
74
+ * }
75
+ */
76
+ emit(eventName, data) {
77
+ return this.dispatcher.dispatch(eventName, data);
78
+ }
79
+ };
80
+ __decorate([
81
+ Inject(ICoreServiceNames.EVENT_DISPATCH_SERVICE),
82
+ __metadata("design:type", Function)
83
+ ], EventEmitter.prototype, "dispatcher", void 0);
84
+ EventEmitter = __decorate([
85
+ CoreService(ICoreServiceNames.EVENT_EMITTER)
86
+ ], EventEmitter);
87
+ export { EventEmitter };
88
+ //# sourceMappingURL=EventEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../../../../lib/server/event/EventEmitter.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAY;IACP,WAAW,GAAG,cAAc,CAAC;IAGrC,UAAU,CAAwB;IAE1C;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACI,IAAI,CAAC,SAAiB,EAAE,IAAU;QACvC,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;CACF,CAAA;AA/BS;IADP,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;;gDACP;AAJ/B,YAAY;IADxB,WAAW,CAAC,iBAAiB,CAAC,aAAa,CAAC;GAChC,YAAY,CAmCxB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * A service class for handling Events.
3
+ */
4
+ export declare class AsenaEventHandler {
5
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * A service class for handling Events.
3
+ */
4
+ export class AsenaEventHandler {
5
+ }
6
+ //# sourceMappingURL=EventService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventService.js","sourceRoot":"","sources":["../../../../lib/server/event/EventService.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,iBAAiB;CAAG"}
@@ -0,0 +1,38 @@
1
+ import type { OnParams } from '../types';
2
+ /**
3
+ * @description On decorator - Marks a method as an event handler
4
+ *
5
+ * Methods decorated with @On will be automatically registered when
6
+ * the event system boots up (via PrepareEventService).
7
+ *
8
+ * @param params - Event pattern or configuration object
9
+ *
10
+ * @example
11
+ * @EventService({ prefix: 'user' })
12
+ * export class UserEventService {
13
+ * @On('created') // Handles 'user.created'
14
+ * handleCreated(eventName: string, data: any) {
15
+ * console.log('User created:', data);
16
+ * }
17
+ *
18
+ * @On('*.updated') // Handles 'user.*.updated'
19
+ * handleUpdated(eventName: string, data: any) { }
20
+ *
21
+ * @On({ event: 'deleted', skip: true }) // Temporarily disabled
22
+ * handleDeleted(eventName: string, data: any) { }
23
+ * }
24
+ *
25
+ * @example
26
+ * // Without prefix (absolute pattern)
27
+ * @EventService()
28
+ * export class GlobalEventService {
29
+ * @On('*') // Handles ALL events
30
+ * handleAll(eventName: string, data: any) {
31
+ * console.log('Event:', eventName);
32
+ * }
33
+ *
34
+ * @On('*.error') // Handles all error events
35
+ * handleErrors(eventName: string, data: any) { }
36
+ * }
37
+ */
38
+ export declare function On(params: OnParams | string): MethodDecorator;
@@ -0,0 +1,56 @@
1
+ import { ComponentConstants } from '../../../ioc';
2
+ import { defineTypedMetadata, getOwnTypedMetadata } from '../../../utils';
3
+ /**
4
+ * @description On decorator - Marks a method as an event handler
5
+ *
6
+ * Methods decorated with @On will be automatically registered when
7
+ * the event system boots up (via PrepareEventService).
8
+ *
9
+ * @param params - Event pattern or configuration object
10
+ *
11
+ * @example
12
+ * @EventService({ prefix: 'user' })
13
+ * export class UserEventService {
14
+ * @On('created') // Handles 'user.created'
15
+ * handleCreated(eventName: string, data: any) {
16
+ * console.log('User created:', data);
17
+ * }
18
+ *
19
+ * @On('*.updated') // Handles 'user.*.updated'
20
+ * handleUpdated(eventName: string, data: any) { }
21
+ *
22
+ * @On({ event: 'deleted', skip: true }) // Temporarily disabled
23
+ * handleDeleted(eventName: string, data: any) { }
24
+ * }
25
+ *
26
+ * @example
27
+ * // Without prefix (absolute pattern)
28
+ * @EventService()
29
+ * export class GlobalEventService {
30
+ * @On('*') // Handles ALL events
31
+ * handleAll(eventName: string, data: any) {
32
+ * console.log('Event:', eventName);
33
+ * }
34
+ *
35
+ * @On('*.error') // Handles all error events
36
+ * handleErrors(eventName: string, data: any) { }
37
+ * }
38
+ */
39
+ export function On(params) {
40
+ // Normalize params - support both object and string
41
+ const _params = typeof params === 'string' ? { event: params, skip: false } : params;
42
+ return function (target, propertyKey, descriptor) {
43
+ // Get existing handlers metadata (other @On methods)
44
+ const handlers = getOwnTypedMetadata(ComponentConstants.EventHandlersKey, target.constructor) || {};
45
+ // Add this handler's metadata
46
+ handlers[propertyKey.toString()] = {
47
+ pattern: _params.event,
48
+ methodName: propertyKey.toString(),
49
+ skip: _params.skip || false,
50
+ };
51
+ // Store updated metadata
52
+ defineTypedMetadata(ComponentConstants.EventHandlersKey, handlers, target.constructor);
53
+ return descriptor;
54
+ };
55
+ }
56
+ //# sourceMappingURL=On.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"On.js","sourceRoot":"","sources":["../../../../../lib/server/event/decorators/On.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,UAAU,EAAE,CAAC,MAAyB;IAC1C,oDAAoD;IACpD,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAErF,OAAO,UAAU,MAAc,EAAE,WAA4B,EAAE,UAA8B;QAC3F,qDAAqD;QACrD,MAAM,QAAQ,GACZ,mBAAmB,CACjB,kBAAkB,CAAC,gBAAgB,EACnC,MAAM,CAAC,WAAW,CACnB,IAAI,EAAE,CAAC;QAEV,8BAA8B;QAC9B,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,GAAG;YACjC,OAAO,EAAE,OAAO,CAAC,KAAK;YACtB,UAAU,EAAE,WAAW,CAAC,QAAQ,EAAE;YAClC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;SAC5B,CAAC;QAEF,yBAAyB;QACzB,mBAAmB,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAEvF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './On';
@@ -0,0 +1,2 @@
1
+ export * from './On';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../lib/server/event/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @description Utility for injecting EventEmitter
3
+ *
4
+ * Returns the EventEmitter service key for use with @Inject decorator.
5
+ *
6
+ * @returns The EventEmitter service key
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * @Service()
11
+ * export class UserService {
12
+ * @Inject(emitter())
13
+ * private emitter!: EventEmitter;
14
+ *
15
+ * createUser(name: string) {
16
+ * this.emitter.emit('user.created', { name });
17
+ * }
18
+ * }
19
+ * ```
20
+ */
21
+ export declare function emitter(): string;
@@ -0,0 +1,25 @@
1
+ import { ICoreServiceNames } from '../../ioc';
2
+ /**
3
+ * @description Utility for injecting EventEmitter
4
+ *
5
+ * Returns the EventEmitter service key for use with @Inject decorator.
6
+ *
7
+ * @returns The EventEmitter service key
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * @Service()
12
+ * export class UserService {
13
+ * @Inject(emitter())
14
+ * private emitter!: EventEmitter;
15
+ *
16
+ * createUser(name: string) {
17
+ * this.emitter.emit('user.created', { name });
18
+ * }
19
+ * }
20
+ * ```
21
+ */
22
+ export function emitter() {
23
+ return ICoreServiceNames.EVENT_EMITTER;
24
+ }
25
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../../../lib/server/event/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,OAAO;IACrB,OAAO,iBAAiB,CAAC,aAAa,CAAC;AACzC,CAAC"}