@dangao/bun-server 1.7.0 → 1.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 (144) hide show
  1. package/README.md +196 -19
  2. package/dist/cache/cache-module.d.ts +18 -0
  3. package/dist/cache/cache-module.d.ts.map +1 -1
  4. package/dist/cache/index.d.ts +3 -1
  5. package/dist/cache/index.d.ts.map +1 -1
  6. package/dist/cache/interceptors.d.ts +41 -0
  7. package/dist/cache/interceptors.d.ts.map +1 -0
  8. package/dist/cache/service-proxy.d.ts +62 -0
  9. package/dist/cache/service-proxy.d.ts.map +1 -0
  10. package/dist/controller/controller.d.ts +8 -0
  11. package/dist/controller/controller.d.ts.map +1 -1
  12. package/dist/core/application.d.ts +5 -0
  13. package/dist/core/application.d.ts.map +1 -1
  14. package/dist/di/container.d.ts +18 -1
  15. package/dist/di/container.d.ts.map +1 -1
  16. package/dist/di/decorators.d.ts +37 -0
  17. package/dist/di/decorators.d.ts.map +1 -1
  18. package/dist/di/index.d.ts +2 -2
  19. package/dist/di/index.d.ts.map +1 -1
  20. package/dist/di/module-registry.d.ts +17 -0
  21. package/dist/di/module-registry.d.ts.map +1 -1
  22. package/dist/di/types.d.ts +22 -0
  23. package/dist/di/types.d.ts.map +1 -1
  24. package/dist/events/decorators.d.ts +52 -0
  25. package/dist/events/decorators.d.ts.map +1 -0
  26. package/dist/events/event-module.d.ts +97 -0
  27. package/dist/events/event-module.d.ts.map +1 -0
  28. package/dist/events/index.d.ts +5 -0
  29. package/dist/events/index.d.ts.map +1 -0
  30. package/dist/events/service.d.ts +76 -0
  31. package/dist/events/service.d.ts.map +1 -0
  32. package/dist/events/types.d.ts +184 -0
  33. package/dist/events/types.d.ts.map +1 -0
  34. package/dist/index.d.ts +6 -4
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +4641 -2840
  37. package/dist/security/filter.d.ts +23 -0
  38. package/dist/security/filter.d.ts.map +1 -1
  39. package/dist/security/guards/builtin/auth-guard.d.ts +44 -0
  40. package/dist/security/guards/builtin/auth-guard.d.ts.map +1 -0
  41. package/dist/security/guards/builtin/index.d.ts +3 -0
  42. package/dist/security/guards/builtin/index.d.ts.map +1 -0
  43. package/dist/security/guards/builtin/roles-guard.d.ts +66 -0
  44. package/dist/security/guards/builtin/roles-guard.d.ts.map +1 -0
  45. package/dist/security/guards/decorators.d.ts +50 -0
  46. package/dist/security/guards/decorators.d.ts.map +1 -0
  47. package/dist/security/guards/execution-context.d.ts +56 -0
  48. package/dist/security/guards/execution-context.d.ts.map +1 -0
  49. package/dist/security/guards/guard-registry.d.ts +67 -0
  50. package/dist/security/guards/guard-registry.d.ts.map +1 -0
  51. package/dist/security/guards/index.d.ts +7 -0
  52. package/dist/security/guards/index.d.ts.map +1 -0
  53. package/dist/security/guards/reflector.d.ts +57 -0
  54. package/dist/security/guards/reflector.d.ts.map +1 -0
  55. package/dist/security/guards/types.d.ts +126 -0
  56. package/dist/security/guards/types.d.ts.map +1 -0
  57. package/dist/security/index.d.ts +1 -0
  58. package/dist/security/index.d.ts.map +1 -1
  59. package/dist/security/security-module.d.ts +20 -0
  60. package/dist/security/security-module.d.ts.map +1 -1
  61. package/dist/validation/class-validator.d.ts +108 -0
  62. package/dist/validation/class-validator.d.ts.map +1 -0
  63. package/dist/validation/custom-validator.d.ts +130 -0
  64. package/dist/validation/custom-validator.d.ts.map +1 -0
  65. package/dist/validation/errors.d.ts +22 -2
  66. package/dist/validation/errors.d.ts.map +1 -1
  67. package/dist/validation/index.d.ts +7 -1
  68. package/dist/validation/index.d.ts.map +1 -1
  69. package/dist/validation/rules/array.d.ts +33 -0
  70. package/dist/validation/rules/array.d.ts.map +1 -0
  71. package/dist/validation/rules/common.d.ts +90 -0
  72. package/dist/validation/rules/common.d.ts.map +1 -0
  73. package/dist/validation/rules/conditional.d.ts +30 -0
  74. package/dist/validation/rules/conditional.d.ts.map +1 -0
  75. package/dist/validation/rules/index.d.ts +5 -0
  76. package/dist/validation/rules/index.d.ts.map +1 -0
  77. package/dist/validation/rules/object.d.ts +30 -0
  78. package/dist/validation/rules/object.d.ts.map +1 -0
  79. package/dist/validation/types.d.ts +52 -1
  80. package/dist/validation/types.d.ts.map +1 -1
  81. package/docs/events.md +494 -0
  82. package/docs/guards.md +376 -0
  83. package/docs/guide.md +309 -1
  84. package/docs/request-lifecycle.md +444 -0
  85. package/docs/symbol-interface-pattern.md +431 -0
  86. package/docs/validation.md +407 -0
  87. package/docs/zh/events.md +494 -0
  88. package/docs/zh/guards.md +376 -0
  89. package/docs/zh/guide.md +309 -1
  90. package/docs/zh/request-lifecycle.md +444 -0
  91. package/docs/zh/symbol-interface-pattern.md +431 -0
  92. package/docs/zh/validation.md +407 -0
  93. package/package.json +1 -1
  94. package/src/cache/cache-module.ts +37 -0
  95. package/src/cache/index.ts +16 -1
  96. package/src/cache/interceptors.ts +295 -0
  97. package/src/cache/service-proxy.ts +219 -0
  98. package/src/controller/controller.ts +30 -6
  99. package/src/core/application.ts +25 -1
  100. package/src/di/container.ts +57 -7
  101. package/src/di/decorators.ts +46 -0
  102. package/src/di/index.ts +17 -2
  103. package/src/di/module-registry.ts +39 -0
  104. package/src/di/types.ts +29 -0
  105. package/src/events/decorators.ts +103 -0
  106. package/src/events/event-module.ts +272 -0
  107. package/src/events/index.ts +32 -0
  108. package/src/events/service.ts +352 -0
  109. package/src/events/types.ts +223 -0
  110. package/src/index.ts +140 -1
  111. package/src/security/filter.ts +88 -8
  112. package/src/security/guards/builtin/auth-guard.ts +68 -0
  113. package/src/security/guards/builtin/index.ts +3 -0
  114. package/src/security/guards/builtin/roles-guard.ts +165 -0
  115. package/src/security/guards/decorators.ts +124 -0
  116. package/src/security/guards/execution-context.ts +152 -0
  117. package/src/security/guards/guard-registry.ts +164 -0
  118. package/src/security/guards/index.ts +7 -0
  119. package/src/security/guards/reflector.ts +99 -0
  120. package/src/security/guards/types.ts +144 -0
  121. package/src/security/index.ts +1 -0
  122. package/src/security/security-module.ts +72 -2
  123. package/src/validation/class-validator.ts +322 -0
  124. package/src/validation/custom-validator.ts +289 -0
  125. package/src/validation/errors.ts +50 -2
  126. package/src/validation/index.ts +103 -1
  127. package/src/validation/rules/array.ts +118 -0
  128. package/src/validation/rules/common.ts +286 -0
  129. package/src/validation/rules/conditional.ts +52 -0
  130. package/src/validation/rules/index.ts +51 -0
  131. package/src/validation/rules/object.ts +86 -0
  132. package/src/validation/types.ts +61 -1
  133. package/tests/cache/cache-decorators.test.ts +284 -0
  134. package/tests/controller/path-combination.test.ts +353 -0
  135. package/tests/di/global-module.test.ts +487 -0
  136. package/tests/events/event-decorators.test.ts +173 -0
  137. package/tests/events/event-emitter.test.ts +373 -0
  138. package/tests/events/event-module.test.ts +373 -0
  139. package/tests/security/guards/guards-integration.test.ts +371 -0
  140. package/tests/security/guards/guards.test.ts +775 -0
  141. package/tests/security/security-module.test.ts +2 -2
  142. package/tests/validation/class-validator.test.ts +349 -0
  143. package/tests/validation/custom-validator.test.ts +335 -0
  144. package/tests/validation/rules.test.ts +543 -0
@@ -0,0 +1,352 @@
1
+ import type {
2
+ EventEmitter,
3
+ EventListener,
4
+ EventModuleOptions,
5
+ ListenerOptions,
6
+ RegisteredListener,
7
+ } from './types';
8
+
9
+ /**
10
+ * 事件发射器服务实现
11
+ */
12
+ export class EventEmitterService implements EventEmitter {
13
+ /**
14
+ * 事件监听器映射
15
+ */
16
+ private listeners: Map<string | symbol, RegisteredListener[]> = new Map();
17
+
18
+ /**
19
+ * 模块选项
20
+ */
21
+ private options: EventModuleOptions;
22
+
23
+ /**
24
+ * 构造函数
25
+ * @param options - 模块选项
26
+ */
27
+ public constructor(options: EventModuleOptions = {}) {
28
+ this.options = {
29
+ wildcard: false,
30
+ delimiter: '.',
31
+ maxListeners: 10,
32
+ ...options,
33
+ };
34
+ }
35
+
36
+ /**
37
+ * 发布事件(同步触发所有监听器,不等待异步监听器完成)
38
+ */
39
+ public emit<T>(event: string | symbol, payload: T): void {
40
+ const eventName = this.resolveEventName(event);
41
+ const matchedListeners = this.getMatchedListeners(eventName);
42
+
43
+ if (matchedListeners.length === 0) {
44
+ return;
45
+ }
46
+
47
+ // 按优先级排序(高优先级先执行)
48
+ const sortedListeners = this.sortListenersByPriority(matchedListeners);
49
+
50
+ for (const { listener, once, async: isAsync } of sortedListeners) {
51
+ try {
52
+ const result = listener(payload);
53
+ // 如果监听器是异步的,不等待完成
54
+ if (isAsync && result instanceof Promise) {
55
+ result.catch((error) => {
56
+ this.handleError(error, eventName, payload);
57
+ });
58
+ }
59
+ } catch (error) {
60
+ this.handleError(error as Error, eventName, payload);
61
+ }
62
+
63
+ // 如果是一次性监听器,移除它
64
+ if (once) {
65
+ this.off(eventName, listener);
66
+ }
67
+ }
68
+ }
69
+
70
+ /**
71
+ * 异步发布事件(等待所有监听器完成)
72
+ */
73
+ public async emitAsync<T>(event: string | symbol, payload: T): Promise<void> {
74
+ const eventName = this.resolveEventName(event);
75
+ const matchedListeners = this.getMatchedListeners(eventName);
76
+
77
+ if (matchedListeners.length === 0) {
78
+ return;
79
+ }
80
+
81
+ // 按优先级排序(高优先级先执行)
82
+ const sortedListeners = this.sortListenersByPriority(matchedListeners);
83
+
84
+ const promises: Promise<void>[] = [];
85
+ const toRemove: EventListener[] = [];
86
+
87
+ for (const { listener, once } of sortedListeners) {
88
+ try {
89
+ const result = listener(payload);
90
+ if (result instanceof Promise) {
91
+ promises.push(
92
+ result.catch((error) => {
93
+ this.handleError(error, eventName, payload);
94
+ }),
95
+ );
96
+ }
97
+ } catch (error) {
98
+ this.handleError(error as Error, eventName, payload);
99
+ }
100
+
101
+ if (once) {
102
+ toRemove.push(listener);
103
+ }
104
+ }
105
+
106
+ // 等待所有异步监听器完成
107
+ if (promises.length > 0) {
108
+ await Promise.all(promises);
109
+ }
110
+
111
+ // 移除一次性监听器
112
+ for (const listener of toRemove) {
113
+ this.off(eventName, listener);
114
+ }
115
+ }
116
+
117
+ /**
118
+ * 订阅事件
119
+ */
120
+ public on<T>(
121
+ event: string | symbol,
122
+ listener: EventListener<T>,
123
+ options: ListenerOptions = {},
124
+ ): () => void {
125
+ const eventName = this.resolveEventName(event);
126
+ return this.addListener(eventName, listener, false, options);
127
+ }
128
+
129
+ /**
130
+ * 一次性订阅
131
+ */
132
+ public once<T>(
133
+ event: string | symbol,
134
+ listener: EventListener<T>,
135
+ options: ListenerOptions = {},
136
+ ): () => void {
137
+ const eventName = this.resolveEventName(event);
138
+ return this.addListener(eventName, listener, true, options);
139
+ }
140
+
141
+ /**
142
+ * 取消订阅
143
+ */
144
+ public off<T>(event: string | symbol, listener: EventListener<T>): void {
145
+ const eventName = this.resolveEventName(event);
146
+ const eventListeners = this.listeners.get(eventName);
147
+
148
+ if (!eventListeners) {
149
+ return;
150
+ }
151
+
152
+ const index = eventListeners.findIndex((l) => l.listener === listener);
153
+ if (index !== -1) {
154
+ eventListeners.splice(index, 1);
155
+ }
156
+
157
+ // 如果没有监听器了,移除事件
158
+ if (eventListeners.length === 0) {
159
+ this.listeners.delete(eventName);
160
+ }
161
+ }
162
+
163
+ /**
164
+ * 移除所有监听器
165
+ */
166
+ public removeAllListeners(event?: string | symbol): void {
167
+ if (event !== undefined) {
168
+ const eventName = this.resolveEventName(event);
169
+ this.listeners.delete(eventName);
170
+ } else {
171
+ this.listeners.clear();
172
+ }
173
+ }
174
+
175
+ /**
176
+ * 获取指定事件的监听器数量
177
+ */
178
+ public listenerCount(event: string | symbol): number {
179
+ const eventName = this.resolveEventName(event);
180
+ const matchedListeners = this.getMatchedListeners(eventName);
181
+ return matchedListeners.length;
182
+ }
183
+
184
+ /**
185
+ * 获取所有已注册的事件名称
186
+ */
187
+ public eventNames(): (string | symbol)[] {
188
+ return Array.from(this.listeners.keys());
189
+ }
190
+
191
+ /**
192
+ * 添加监听器
193
+ */
194
+ private addListener<T>(
195
+ event: string | symbol,
196
+ listener: EventListener<T>,
197
+ once: boolean,
198
+ options: ListenerOptions,
199
+ ): () => void {
200
+ let eventListeners = this.listeners.get(event);
201
+
202
+ if (!eventListeners) {
203
+ eventListeners = [];
204
+ this.listeners.set(event, eventListeners);
205
+ }
206
+
207
+ // 检查监听器数量限制
208
+ if (
209
+ this.options.maxListeners &&
210
+ eventListeners.length >= this.options.maxListeners
211
+ ) {
212
+ console.warn(
213
+ `[EventEmitter] Max listeners (${this.options.maxListeners}) exceeded for event: ${String(event)}. ` +
214
+ 'This may indicate a memory leak.',
215
+ );
216
+ }
217
+
218
+ const registeredListener: RegisteredListener<T> = {
219
+ listener,
220
+ once,
221
+ priority: options.priority ?? 0,
222
+ async: options.async ?? false,
223
+ };
224
+
225
+ eventListeners.push(registeredListener as RegisteredListener);
226
+
227
+ // 返回取消订阅函数
228
+ return () => {
229
+ this.off(event, listener);
230
+ };
231
+ }
232
+
233
+ /**
234
+ * 解析事件名称(添加全局前缀)
235
+ */
236
+ private resolveEventName(event: string | symbol): string | symbol {
237
+ if (typeof event === 'symbol') {
238
+ return event;
239
+ }
240
+
241
+ if (this.options.globalPrefix) {
242
+ return `${this.options.globalPrefix}${this.options.delimiter}${event}`;
243
+ }
244
+
245
+ return event;
246
+ }
247
+
248
+ /**
249
+ * 获取匹配的监听器(支持通配符)
250
+ */
251
+ private getMatchedListeners(event: string | symbol): RegisteredListener[] {
252
+ const result: RegisteredListener[] = [];
253
+
254
+ // 精确匹配
255
+ const exactListeners = this.listeners.get(event);
256
+ if (exactListeners) {
257
+ result.push(...exactListeners);
258
+ }
259
+
260
+ // 通配符匹配
261
+ if (this.options.wildcard && typeof event === 'string') {
262
+ const delimiter = this.options.delimiter ?? '.';
263
+ const eventParts = event.split(delimiter);
264
+
265
+ for (const [key, listeners] of this.listeners.entries()) {
266
+ if (typeof key !== 'string' || key === event) {
267
+ continue;
268
+ }
269
+
270
+ if (this.matchWildcard(eventParts, key.split(delimiter))) {
271
+ result.push(...listeners);
272
+ }
273
+ }
274
+ }
275
+
276
+ return result;
277
+ }
278
+
279
+ /**
280
+ * 匹配通配符模式
281
+ */
282
+ private matchWildcard(eventParts: string[], patternParts: string[]): boolean {
283
+ let eventIndex = 0;
284
+ let patternIndex = 0;
285
+
286
+ while (patternIndex < patternParts.length) {
287
+ const pattern = patternParts[patternIndex];
288
+
289
+ if (pattern === '**') {
290
+ // ** 匹配任意数量的部分
291
+ if (patternIndex === patternParts.length - 1) {
292
+ return true; // ** 在末尾,匹配所有剩余部分
293
+ }
294
+ // 尝试匹配后续部分
295
+ for (let i = eventIndex; i <= eventParts.length; i++) {
296
+ if (
297
+ this.matchWildcard(
298
+ eventParts.slice(i),
299
+ patternParts.slice(patternIndex + 1),
300
+ )
301
+ ) {
302
+ return true;
303
+ }
304
+ }
305
+ return false;
306
+ } else if (pattern === '*') {
307
+ // * 匹配单个部分
308
+ if (eventIndex >= eventParts.length) {
309
+ return false;
310
+ }
311
+ eventIndex++;
312
+ patternIndex++;
313
+ } else {
314
+ // 精确匹配
315
+ if (eventIndex >= eventParts.length || eventParts[eventIndex] !== pattern) {
316
+ return false;
317
+ }
318
+ eventIndex++;
319
+ patternIndex++;
320
+ }
321
+ }
322
+
323
+ return eventIndex === eventParts.length;
324
+ }
325
+
326
+ /**
327
+ * 按优先级排序监听器
328
+ */
329
+ private sortListenersByPriority(
330
+ listeners: RegisteredListener[],
331
+ ): RegisteredListener[] {
332
+ return [...listeners].sort((a, b) => b.priority - a.priority);
333
+ }
334
+
335
+ /**
336
+ * 处理错误
337
+ */
338
+ private handleError(
339
+ error: Error,
340
+ event: string | symbol,
341
+ payload: unknown,
342
+ ): void {
343
+ if (this.options.onError) {
344
+ this.options.onError(error, event, payload);
345
+ } else {
346
+ console.error(
347
+ `[EventEmitter] Error in listener for event "${String(event)}":`,
348
+ error,
349
+ );
350
+ }
351
+ }
352
+ }
@@ -0,0 +1,223 @@
1
+ /**
2
+ * 事件监听器接口
3
+ * @template T - 事件负载类型
4
+ */
5
+ export interface EventListener<T = unknown> {
6
+ (payload: T): void | Promise<void>;
7
+ }
8
+
9
+ /**
10
+ * 事件元数据
11
+ */
12
+ export interface EventMetadata {
13
+ /**
14
+ * 事件名称或标识符
15
+ */
16
+ event: string | symbol;
17
+
18
+ /**
19
+ * 是否异步处理
20
+ * @default false
21
+ */
22
+ async?: boolean;
23
+
24
+ /**
25
+ * 监听器优先级(数值越大优先级越高)
26
+ * @default 0
27
+ */
28
+ priority?: number;
29
+ }
30
+
31
+ /**
32
+ * 已注册的监听器信息
33
+ */
34
+ export interface RegisteredListener<T = unknown> {
35
+ /**
36
+ * 监听器函数
37
+ */
38
+ listener: EventListener<T>;
39
+
40
+ /**
41
+ * 是否一次性监听
42
+ */
43
+ once: boolean;
44
+
45
+ /**
46
+ * 优先级
47
+ */
48
+ priority: number;
49
+
50
+ /**
51
+ * 是否异步处理
52
+ */
53
+ async: boolean;
54
+ }
55
+
56
+ /**
57
+ * EventEmitter 服务接口
58
+ */
59
+ export interface EventEmitter {
60
+ /**
61
+ * 发布事件(同步触发所有监听器,不等待异步监听器完成)
62
+ * @param event - 事件名称或标识符
63
+ * @param payload - 事件负载
64
+ */
65
+ emit<T>(event: string | symbol, payload: T): void;
66
+
67
+ /**
68
+ * 异步发布事件(等待所有监听器完成)
69
+ * @param event - 事件名称或标识符
70
+ * @param payload - 事件负载
71
+ */
72
+ emitAsync<T>(event: string | symbol, payload: T): Promise<void>;
73
+
74
+ /**
75
+ * 订阅事件
76
+ * @param event - 事件名称或标识符
77
+ * @param listener - 监听器函数
78
+ * @param options - 监听选项
79
+ * @returns 取消订阅函数
80
+ */
81
+ on<T>(
82
+ event: string | symbol,
83
+ listener: EventListener<T>,
84
+ options?: ListenerOptions,
85
+ ): () => void;
86
+
87
+ /**
88
+ * 一次性订阅
89
+ * @param event - 事件名称或标识符
90
+ * @param listener - 监听器函数
91
+ * @param options - 监听选项
92
+ * @returns 取消订阅函数
93
+ */
94
+ once<T>(
95
+ event: string | symbol,
96
+ listener: EventListener<T>,
97
+ options?: ListenerOptions,
98
+ ): () => void;
99
+
100
+ /**
101
+ * 取消订阅
102
+ * @param event - 事件名称或标识符
103
+ * @param listener - 监听器函数
104
+ */
105
+ off<T>(event: string | symbol, listener: EventListener<T>): void;
106
+
107
+ /**
108
+ * 移除指定事件的所有监听器,或移除所有事件的所有监听器
109
+ * @param event - 事件名称或标识符(可选)
110
+ */
111
+ removeAllListeners(event?: string | symbol): void;
112
+
113
+ /**
114
+ * 获取指定事件的监听器数量
115
+ * @param event - 事件名称或标识符
116
+ */
117
+ listenerCount(event: string | symbol): number;
118
+
119
+ /**
120
+ * 获取所有已注册的事件名称
121
+ */
122
+ eventNames(): (string | symbol)[];
123
+ }
124
+
125
+ /**
126
+ * 监听器选项
127
+ */
128
+ export interface ListenerOptions {
129
+ /**
130
+ * 优先级(数值越大优先级越高)
131
+ * @default 0
132
+ */
133
+ priority?: number;
134
+
135
+ /**
136
+ * 是否异步处理
137
+ * @default false
138
+ */
139
+ async?: boolean;
140
+ }
141
+
142
+ /**
143
+ * EventModule 配置选项
144
+ */
145
+ export interface EventModuleOptions {
146
+ /**
147
+ * 是否启用通配符事件(如 'user.*')
148
+ * @default false
149
+ */
150
+ wildcard?: boolean;
151
+
152
+ /**
153
+ * 通配符分隔符
154
+ * @default '.'
155
+ */
156
+ delimiter?: string;
157
+
158
+ /**
159
+ * 全局事件前缀
160
+ */
161
+ globalPrefix?: string;
162
+
163
+ /**
164
+ * 最大监听器数量(防止内存泄漏)
165
+ * @default 10
166
+ */
167
+ maxListeners?: number;
168
+
169
+ /**
170
+ * 错误处理函数
171
+ * @param error - 错误对象
172
+ * @param event - 事件名称
173
+ * @param payload - 事件负载
174
+ */
175
+ onError?: (error: Error, event: string | symbol, payload: unknown) => void;
176
+ }
177
+
178
+ /**
179
+ * 装饰器方法元数据
180
+ */
181
+ export interface OnEventMethodMetadata {
182
+ /**
183
+ * 方法名
184
+ */
185
+ methodName: string;
186
+
187
+ /**
188
+ * 事件名称或标识符
189
+ */
190
+ event: string | symbol;
191
+
192
+ /**
193
+ * 是否异步处理
194
+ */
195
+ async: boolean;
196
+
197
+ /**
198
+ * 优先级
199
+ */
200
+ priority: number;
201
+ }
202
+
203
+ /**
204
+ * 事件服务 Token
205
+ */
206
+ export const EVENT_EMITTER_TOKEN = Symbol('@dangao/bun-server:events:emitter');
207
+
208
+ /**
209
+ * 事件模块选项 Token
210
+ */
211
+ export const EVENT_OPTIONS_TOKEN = Symbol('@dangao/bun-server:events:options');
212
+
213
+ /**
214
+ * OnEvent 装饰器元数据 Key
215
+ */
216
+ export const ON_EVENT_METADATA_KEY = Symbol('@dangao/bun-server:events:on-event');
217
+
218
+ /**
219
+ * 事件监听器类元数据 Key
220
+ */
221
+ export const EVENT_LISTENER_CLASS_METADATA_KEY = Symbol(
222
+ '@dangao/bun-server:events:listener-class',
223
+ );