@dangao/bun-server 3.2.0 → 3.3.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 (131) hide show
  1. package/dist/ai/types.d.ts +4 -0
  2. package/dist/ai/types.d.ts.map +1 -1
  3. package/dist/auth/types.d.ts +4 -0
  4. package/dist/auth/types.d.ts.map +1 -1
  5. package/dist/cache/interceptors.d.ts +3 -3
  6. package/dist/cache/interceptors.d.ts.map +1 -1
  7. package/dist/cache/service.d.ts +6 -6
  8. package/dist/cache/service.d.ts.map +1 -1
  9. package/dist/cache/types.d.ts +12 -12
  10. package/dist/cache/types.d.ts.map +1 -1
  11. package/dist/config/service.d.ts +6 -4
  12. package/dist/config/service.d.ts.map +1 -1
  13. package/dist/core/application.d.ts +4 -0
  14. package/dist/core/application.d.ts.map +1 -1
  15. package/dist/core/context.d.ts +4 -2
  16. package/dist/core/context.d.ts.map +1 -1
  17. package/dist/database/sqlite-adapter.d.ts +4 -2
  18. package/dist/database/sqlite-adapter.d.ts.map +1 -1
  19. package/dist/di/container.d.ts +2 -0
  20. package/dist/di/container.d.ts.map +1 -1
  21. package/dist/di/module-registry.d.ts.map +1 -1
  22. package/dist/di/module.d.ts +11 -1
  23. package/dist/di/module.d.ts.map +1 -1
  24. package/dist/di/types.d.ts +1 -1
  25. package/dist/di/types.d.ts.map +1 -1
  26. package/dist/error/handler.d.ts.map +1 -1
  27. package/dist/error/http-exception.d.ts +8 -8
  28. package/dist/error/http-exception.d.ts.map +1 -1
  29. package/dist/error/index.d.ts +1 -0
  30. package/dist/error/index.d.ts.map +1 -1
  31. package/dist/events/service.d.ts +2 -2
  32. package/dist/events/service.d.ts.map +1 -1
  33. package/dist/events/types.d.ts +12 -3
  34. package/dist/events/types.d.ts.map +1 -1
  35. package/dist/index.js +63 -25
  36. package/dist/index.node.mjs +63 -25
  37. package/dist/interceptor/base-interceptor.d.ts +3 -3
  38. package/dist/interceptor/base-interceptor.d.ts.map +1 -1
  39. package/dist/interceptor/builtin/log-interceptor.d.ts +1 -1
  40. package/dist/interceptor/builtin/log-interceptor.d.ts.map +1 -1
  41. package/dist/interceptor/builtin/permission-interceptor.d.ts +1 -1
  42. package/dist/interceptor/builtin/permission-interceptor.d.ts.map +1 -1
  43. package/dist/interceptor/interceptor-chain.d.ts +1 -1
  44. package/dist/interceptor/interceptor-chain.d.ts.map +1 -1
  45. package/dist/interceptor/interceptor-registry.d.ts +3 -1
  46. package/dist/interceptor/interceptor-registry.d.ts.map +1 -1
  47. package/dist/interceptor/types.d.ts +6 -1
  48. package/dist/interceptor/types.d.ts.map +1 -1
  49. package/dist/microservice/service-client/types.d.ts +1 -0
  50. package/dist/microservice/service-client/types.d.ts.map +1 -1
  51. package/dist/microservice/tracing/tracer.d.ts +1 -0
  52. package/dist/microservice/tracing/tracer.d.ts.map +1 -1
  53. package/dist/middleware/builtin/file-upload.d.ts +2 -0
  54. package/dist/middleware/builtin/file-upload.d.ts.map +1 -1
  55. package/dist/middleware/builtin/rate-limit.d.ts +9 -1
  56. package/dist/middleware/builtin/rate-limit.d.ts.map +1 -1
  57. package/dist/queue/service.d.ts +2 -2
  58. package/dist/queue/service.d.ts.map +1 -1
  59. package/dist/queue/types.d.ts +25 -1
  60. package/dist/queue/types.d.ts.map +1 -1
  61. package/dist/router/decorators.d.ts +1 -2
  62. package/dist/router/decorators.d.ts.map +1 -1
  63. package/dist/security/guards/types.d.ts +1 -0
  64. package/dist/security/guards/types.d.ts.map +1 -1
  65. package/dist/security/types.d.ts +1 -1
  66. package/dist/security/types.d.ts.map +1 -1
  67. package/dist/session/types.d.ts +8 -0
  68. package/dist/session/types.d.ts.map +1 -1
  69. package/dist/swagger/decorators.d.ts +1 -1
  70. package/dist/swagger/decorators.d.ts.map +1 -1
  71. package/dist/swagger/types.d.ts +1 -1
  72. package/dist/swagger/types.d.ts.map +1 -1
  73. package/dist/testing/harness.d.ts +1 -1
  74. package/dist/testing/harness.d.ts.map +1 -1
  75. package/dist/testing/test-client.d.ts +1 -1
  76. package/dist/testing/test-client.d.ts.map +1 -1
  77. package/dist/testing/testing-module.d.ts +2 -2
  78. package/dist/testing/testing-module.d.ts.map +1 -1
  79. package/dist/validation/errors.d.ts +5 -1
  80. package/dist/validation/errors.d.ts.map +1 -1
  81. package/package.json +3 -3
  82. package/src/ai/types.ts +5 -0
  83. package/src/auth/types.ts +4 -1
  84. package/src/cache/interceptors.ts +6 -6
  85. package/src/cache/service-proxy.ts +2 -2
  86. package/src/cache/service.ts +17 -8
  87. package/src/cache/types.ts +12 -12
  88. package/src/config/service.ts +8 -6
  89. package/src/core/application.ts +7 -1
  90. package/src/core/context.ts +6 -3
  91. package/src/database/sqlite-adapter.ts +4 -3
  92. package/src/di/container.ts +13 -0
  93. package/src/di/module-registry.ts +2 -3
  94. package/src/di/module.ts +21 -2
  95. package/src/di/types.ts +1 -2
  96. package/src/error/handler.ts +3 -4
  97. package/src/error/http-exception.ts +11 -11
  98. package/src/error/index.ts +1 -1
  99. package/src/events/service.ts +4 -2
  100. package/src/events/types.ts +14 -3
  101. package/src/interceptor/base-interceptor.ts +5 -6
  102. package/src/interceptor/builtin/log-interceptor.ts +2 -3
  103. package/src/interceptor/builtin/permission-interceptor.ts +2 -3
  104. package/src/interceptor/interceptor-chain.ts +6 -7
  105. package/src/interceptor/interceptor-registry.ts +5 -3
  106. package/src/interceptor/types.ts +9 -4
  107. package/src/microservice/service-client/types.ts +1 -1
  108. package/src/microservice/tracing/tracer.ts +15 -3
  109. package/src/middleware/builtin/file-upload.ts +3 -2
  110. package/src/middleware/builtin/rate-limit.ts +22 -5
  111. package/src/queue/service.ts +1 -1
  112. package/src/queue/types.ts +40 -1
  113. package/src/router/decorators.ts +2 -3
  114. package/src/security/guards/types.ts +2 -1
  115. package/src/security/types.ts +1 -2
  116. package/src/session/service.ts +1 -1
  117. package/src/session/types.ts +10 -0
  118. package/src/swagger/decorators.ts +15 -4
  119. package/src/swagger/generator.ts +2 -3
  120. package/src/swagger/types.ts +1 -2
  121. package/src/testing/harness.ts +1 -2
  122. package/src/testing/test-client.ts +2 -2
  123. package/src/testing/testing-module.ts +5 -5
  124. package/src/validation/errors.ts +6 -2
  125. package/tests/bun-test-shim.d.ts +11 -0
  126. package/tests/controller/context-decorator.test.ts +1 -2
  127. package/tests/di/module.test.ts +199 -1
  128. package/tests/events/event-emitter.test.ts +2 -2
  129. package/tests/global.d.ts +30 -0
  130. package/tests/queue/queue-service.test.ts +14 -0
  131. package/tests/testing/testing-module.test.ts +20 -0
@@ -3,7 +3,7 @@
3
3
  * @template T - 事件负载类型
4
4
  */
5
5
  export interface EventListener<T = unknown> {
6
- (payload: T): void | Promise<void>;
6
+ (payload: T): unknown | Promise<unknown>;
7
7
  }
8
8
  /**
9
9
  * 事件元数据
@@ -54,13 +54,13 @@ export interface EventEmitter {
54
54
  * @param event - 事件名称或标识符
55
55
  * @param payload - 事件负载
56
56
  */
57
- emit<T>(event: string | symbol, payload: T): void;
57
+ emit<T = undefined>(event: string | symbol, payload?: T): void;
58
58
  /**
59
59
  * 异步发布事件(等待所有监听器完成)
60
60
  * @param event - 事件名称或标识符
61
61
  * @param payload - 事件负载
62
62
  */
63
- emitAsync<T>(event: string | symbol, payload: T): Promise<void>;
63
+ emitAsync<T = undefined>(event: string | symbol, payload?: T): Promise<void>;
64
64
  /**
65
65
  * 订阅事件
66
66
  * @param event - 事件名称或标识符
@@ -136,6 +136,11 @@ export interface EventModuleOptions {
136
136
  * @default 10
137
137
  */
138
138
  maxListeners?: number;
139
+ /**
140
+ * 默认是否异步处理监听器,兼容早期模块配置。
141
+ * @default false
142
+ */
143
+ async?: boolean;
139
144
  /**
140
145
  * 错误处理函数
141
146
  * @param error - 错误对象
@@ -143,6 +148,10 @@ export interface EventModuleOptions {
143
148
  * @param payload - 事件负载
144
149
  */
145
150
  onError?: (error: Error, event: string | symbol, payload: unknown) => void;
151
+ /**
152
+ * 错误处理函数别名,参数顺序为 (event, error)。
153
+ */
154
+ errorHandler?: (event: string, error: Error, payload: unknown) => void;
146
155
  /**
147
156
  * 是否自动扫描和注册事件监听器
148
157
  * 当设置为 true 时,框架会在应用启动时自动扫描所有模块中使用 @OnEvent 装饰器的类
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -13131,8 +13131,9 @@ var init_http_exception = __esm(() => {
13131
13131
  this.messageParams = messageParams;
13132
13132
  }
13133
13133
  static withCode(code, message, details, messageParams) {
13134
- const status = ERROR_CODE_TO_STATUS[code] || 500;
13135
- const finalMessage = message || ERROR_CODE_MESSAGES[code] || "Internal Server Error";
13134
+ const knownCode = code;
13135
+ const status = ERROR_CODE_TO_STATUS[knownCode] || 500;
13136
+ const finalMessage = message || ERROR_CODE_MESSAGES[knownCode] || "Internal Server Error";
13136
13137
  return new HttpException(status, finalMessage, details, code, messageParams);
13137
13138
  }
13138
13139
  };
@@ -14156,7 +14157,7 @@ async function handleError(error, context) {
14156
14157
  });
14157
14158
  }
14158
14159
  let errorMessage = error.message;
14159
- if (error.code) {
14160
+ if (error.code && error.code in ERROR_CODE_MESSAGES) {
14160
14161
  const acceptLanguage = context.getHeader("accept-language");
14161
14162
  const language = ErrorMessageI18n.parseLanguageFromHeader(acceptLanguage);
14162
14163
  errorMessage = ErrorMessageI18n.getMessage(error.code, language, error.messageParams);
@@ -14198,6 +14199,7 @@ var init_handler = __esm(() => {
14198
14199
  init_http_exception();
14199
14200
  init_validation();
14200
14201
  init_i18n();
14202
+ init_error_codes();
14201
14203
  });
14202
14204
 
14203
14205
  // src/error/index.ts
@@ -14578,7 +14580,8 @@ class Container {
14578
14580
  typeToToken = new Map;
14579
14581
  dependencyPlans = new Map;
14580
14582
  postProcessors = [];
14581
- register(token, config) {
14583
+ register(token, configOrImplementation) {
14584
+ const config = typeof configOrImplementation === "function" ? { implementation: configOrImplementation } : configOrImplementation;
14582
14585
  const tokenKey = this.getTokenKey(token);
14583
14586
  let lifecycle = config?.lifecycle;
14584
14587
  if (!lifecycle && typeof token === "function") {
@@ -15324,9 +15327,11 @@ function defaultKeyGenerator(context) {
15324
15327
  function createRateLimitMiddleware(options) {
15325
15328
  const {
15326
15329
  max,
15330
+ limit,
15327
15331
  windowMs = 60000,
15328
15332
  store = new MemoryRateLimitStore,
15329
15333
  keyGenerator = defaultKeyGenerator,
15334
+ skip,
15330
15335
  skipSuccessfulRequests = false,
15331
15336
  skipFailedRequests = false,
15332
15337
  message = "Too Many Requests",
@@ -15334,22 +15339,26 @@ function createRateLimitMiddleware(options) {
15334
15339
  standardHeaders = true,
15335
15340
  legacyHeaders = true
15336
15341
  } = options;
15342
+ const requestLimit = limit ?? max ?? 100;
15337
15343
  return async (context, next) => {
15344
+ if (skip && await skip(context)) {
15345
+ return await next();
15346
+ }
15338
15347
  const key = await keyGenerator(context);
15339
15348
  const currentCount = await store.increment(key, windowMs);
15340
- const remaining = Math.max(0, max - currentCount);
15349
+ const remaining = Math.max(0, requestLimit - currentCount);
15341
15350
  const resetTime = Date.now() + windowMs;
15342
15351
  if (standardHeaders) {
15343
- context.setHeader("RateLimit-Limit", max.toString());
15352
+ context.setHeader("RateLimit-Limit", requestLimit.toString());
15344
15353
  context.setHeader("RateLimit-Remaining", remaining.toString());
15345
15354
  context.setHeader("RateLimit-Reset", Math.ceil(resetTime / 1000).toString());
15346
15355
  }
15347
15356
  if (legacyHeaders) {
15348
- context.setHeader("X-RateLimit-Limit", max.toString());
15357
+ context.setHeader("X-RateLimit-Limit", requestLimit.toString());
15349
15358
  context.setHeader("X-RateLimit-Remaining", remaining.toString());
15350
15359
  context.setHeader("X-RateLimit-Reset", Math.ceil(resetTime / 1000).toString());
15351
15360
  }
15352
- if (currentCount > max) {
15361
+ if (currentCount > requestLimit) {
15353
15362
  context.setStatus(statusCode);
15354
15363
  return context.createErrorResponse({
15355
15364
  error: message,
@@ -15627,7 +15636,7 @@ var init_file_handler = __esm(() => {
15627
15636
 
15628
15637
  // src/middleware/builtin/file-upload.ts
15629
15638
  function createFileUploadMiddleware(options = {}) {
15630
- const maxSize = options.maxSize ?? 10 * 1024 * 1024;
15639
+ const maxSize = options.maxSize ?? options.maxFileSize ?? 10 * 1024 * 1024;
15631
15640
  return async (context, next) => {
15632
15641
  const contentType = context.getHeader("Content-Type");
15633
15642
  if (!contentType || !contentType.includes("multipart/form-data")) {
@@ -15743,6 +15752,7 @@ var init_types3 = __esm(() => {
15743
15752
  class InterceptorRegistry {
15744
15753
  interceptors = new Map;
15745
15754
  register(metadataKey, interceptor, priority = 100) {
15755
+ const resolvedPriority = typeof priority === "number" ? priority : priority.priority ?? 100;
15746
15756
  if (!this.interceptors.has(metadataKey)) {
15747
15757
  this.interceptors.set(metadataKey, []);
15748
15758
  }
@@ -15752,7 +15762,7 @@ class InterceptorRegistry {
15752
15762
  metadataList.push({
15753
15763
  metadataKey,
15754
15764
  interceptor,
15755
- priority
15765
+ priority: resolvedPriority
15756
15766
  });
15757
15767
  metadataList.sort((a, b2) => a.priority - b2.priority);
15758
15768
  }
@@ -16050,6 +16060,13 @@ var init_logger_extension = __esm(() => {
16050
16060
 
16051
16061
  // src/di/module.ts
16052
16062
  import"reflect-metadata";
16063
+ function invokeFactoryProvider(provider, container) {
16064
+ const inject = provider.inject ?? [];
16065
+ if (inject.length > 0) {
16066
+ return provider.useFactory(...inject.map((token) => container.resolve(token)));
16067
+ }
16068
+ return provider.useFactory(container);
16069
+ }
16053
16070
  function Module(metadata) {
16054
16071
  return (target) => {
16055
16072
  Reflect.defineMetadata(MODULE_METADATA_KEY, metadata, target);
@@ -39999,8 +40016,10 @@ class Context {
39999
40016
  _body;
40000
40017
  _bodyParsed = false;
40001
40018
  signal;
40002
- constructor(request) {
40019
+ container;
40020
+ constructor(request, container) {
40003
40021
  this.request = request;
40022
+ this.container = container;
40004
40023
  this.url = new URL2(request.url);
40005
40024
  this.method = request.method;
40006
40025
  this.path = this.url.pathname;
@@ -40713,7 +40732,7 @@ class ModuleRegistry {
40713
40732
  if ("useFactory" in provider) {
40714
40733
  container.register(provider.provide, {
40715
40734
  lifecycle: provider.lifecycle ?? "singleton" /* Singleton */,
40716
- factory: () => provider.useFactory(container)
40735
+ factory: () => invokeFactoryProvider(provider, container)
40717
40736
  });
40718
40737
  continue;
40719
40738
  }
@@ -41020,7 +41039,7 @@ class ConfigService {
41020
41039
  this.config = newConfig;
41021
41040
  for (const listener of this.configUpdateListeners) {
41022
41041
  try {
41023
- listener(newConfig);
41042
+ listener(this.config);
41024
41043
  } catch (error) {
41025
41044
  console.error("[ConfigService] Error in config update listener:", error);
41026
41045
  }
@@ -41528,9 +41547,10 @@ class CacheService {
41528
41547
  defaultTtl;
41529
41548
  keyPrefix;
41530
41549
  constructor(options) {
41531
- this.store = options.store;
41532
- this.defaultTtl = options.defaultTtl ?? 3600000;
41533
- this.keyPrefix = options.keyPrefix ?? "";
41550
+ const resolvedOptions = isCacheStore(options) ? { store: options } : options;
41551
+ this.store = resolvedOptions.store;
41552
+ this.defaultTtl = resolvedOptions.defaultTtl ?? 3600000;
41553
+ this.keyPrefix = resolvedOptions.keyPrefix ?? "";
41534
41554
  }
41535
41555
  async get(key) {
41536
41556
  return this.store.get(this.getKey(key));
@@ -41587,9 +41607,12 @@ CacheService = __legacyDecorateClassTS([
41587
41607
  Injectable(),
41588
41608
  __legacyDecorateParamTS(0, Inject(CACHE_OPTIONS_TOKEN)),
41589
41609
  __legacyMetadataTS("design:paramtypes", [
41590
- typeof CacheModuleOptions === "undefined" ? Object : CacheModuleOptions
41610
+ Object
41591
41611
  ])
41592
41612
  ], CacheService);
41613
+ function isCacheStore(value) {
41614
+ return typeof value.get === "function" && typeof value.set === "function" && typeof value.delete === "function";
41615
+ }
41593
41616
 
41594
41617
  // src/cache/service-proxy.ts
41595
41618
  import"reflect-metadata";
@@ -42133,6 +42156,8 @@ class EventEmitterService {
42133
42156
  handleError(error, event, payload) {
42134
42157
  if (this.options.onError) {
42135
42158
  this.options.onError(error, event, payload);
42159
+ } else if (this.options.errorHandler) {
42160
+ this.options.errorHandler(String(event), error, payload);
42136
42161
  } else {
42137
42162
  console.error(`[EventEmitter] Error in listener for event "${String(event)}":`, error);
42138
42163
  }
@@ -42777,6 +42802,9 @@ class Application {
42777
42802
  getServer() {
42778
42803
  return this.server;
42779
42804
  }
42805
+ getNativeServer() {
42806
+ return this.server?.getNativeServer();
42807
+ }
42780
42808
  async registerServices(port, hostname) {
42781
42809
  if (ServiceRegistryModule.autoRegister === false) {
42782
42810
  return;
@@ -43277,11 +43305,17 @@ function ApiOperation(metadata) {
43277
43305
  };
43278
43306
  }
43279
43307
  function ApiParam(metadata) {
43280
- return function(target, propertyKey, parameterIndex) {
43308
+ const decorator = (target, propertyKey, descriptorOrParameterIndex) => {
43309
+ const paramMetadata = {
43310
+ in: "path",
43311
+ ...metadata
43312
+ };
43281
43313
  const existingParams = Reflect.getMetadata(API_PARAM_METADATA_KEY, target, propertyKey) || [];
43282
- existingParams.push({ index: parameterIndex, metadata });
43314
+ const index = typeof descriptorOrParameterIndex === "number" ? descriptorOrParameterIndex : -1;
43315
+ existingParams.push({ index, metadata: paramMetadata });
43283
43316
  Reflect.defineMetadata(API_PARAM_METADATA_KEY, existingParams, target, propertyKey);
43284
43317
  };
43318
+ return decorator;
43285
43319
  }
43286
43320
  function ApiBody(metadata) {
43287
43321
  return function(target, propertyKey) {
@@ -43398,7 +43432,7 @@ class SwaggerGenerator {
43398
43432
  const pathParamMatches = fullPath.matchAll(/\{([^}]+)\}/g);
43399
43433
  for (const match of pathParamMatches) {
43400
43434
  const paramName = match[1];
43401
- const existingParam = params.find((p) => p.metadata.name === paramName && p.metadata.in === "path");
43435
+ const existingParam = params.find((p) => p.metadata.name === paramName && (p.metadata.in ?? "path") === "path");
43402
43436
  if (!existingParam) {
43403
43437
  pathParams.push({
43404
43438
  name: paramName,
@@ -43411,7 +43445,7 @@ class SwaggerGenerator {
43411
43445
  for (const param of params) {
43412
43446
  pathParams.push({
43413
43447
  name: param.metadata.name,
43414
- in: param.metadata.in,
43448
+ in: param.metadata.in ?? "path",
43415
43449
  description: param.metadata.description,
43416
43450
  required: param.metadata.required,
43417
43451
  schema: param.metadata.schema
@@ -48032,6 +48066,7 @@ class StressTester {
48032
48066
  }
48033
48067
  // src/testing/testing-module.ts
48034
48068
  import"reflect-metadata";
48069
+ init_module();
48035
48070
 
48036
48071
  // src/testing/test-client.ts
48037
48072
  class TestHttpClient {
@@ -48195,7 +48230,7 @@ class TestingModule {
48195
48230
  container.registerInstance(provider.provide, provider.useValue);
48196
48231
  } else if ("useFactory" in provider && provider.provide) {
48197
48232
  container.register(provider.provide, {
48198
- factory: () => provider.useFactory(container)
48233
+ factory: () => invokeFactoryProvider(provider, container)
48199
48234
  });
48200
48235
  } else if ("useClass" in provider) {
48201
48236
  const token = provider.provide ?? provider.useClass;
@@ -48637,7 +48672,7 @@ class SessionService {
48637
48672
  constructor(options) {
48638
48673
  this.store = options.store;
48639
48674
  this.name = options.name ?? "sessionId";
48640
- this.maxAge = options.maxAge ?? 86400000;
48675
+ this.maxAge = options.maxAge ?? options.ttl ?? 86400000;
48641
48676
  this.rolling = options.rolling ?? true;
48642
48677
  this.cookieOptions = {
48643
48678
  secure: options.cookie?.secure ?? false,
@@ -49347,14 +49382,15 @@ class Tracer {
49347
49382
  Object.assign(span.tags, tags);
49348
49383
  }
49349
49384
  }
49350
- addSpanEvent(spanId, event) {
49385
+ addSpanEvent(spanId, event, attributes) {
49351
49386
  const span = this.activeSpans.get(spanId);
49352
49387
  if (span) {
49353
49388
  if (!span.events) {
49354
49389
  span.events = [];
49355
49390
  }
49391
+ const spanEvent = typeof event === "string" ? { name: event, attributes } : event;
49356
49392
  span.events.push({
49357
- ...event,
49393
+ ...spanEvent,
49358
49394
  timestamp: Date.now()
49359
49395
  });
49360
49396
  }
@@ -50057,6 +50093,7 @@ class ServiceMetricsCollector {
50057
50093
  var AI_SERVICE_TOKEN = Symbol("@dangao/bun-server:ai:service");
50058
50094
  var AI_MODULE_OPTIONS_TOKEN = Symbol("@dangao/bun-server:ai:options");
50059
50095
  var AI_TOOL_REGISTRY_TOKEN = Symbol("@dangao/bun-server:ai:tool-registry");
50096
+ var MODULE_METADATA_KEY3 = "@dangao/bun-server:ai:module";
50060
50097
  var AI_TOOL_METADATA_KEY = "@dangao/bun-server:ai:tool";
50061
50098
  // src/ai/errors.ts
50062
50099
  init_http_exception();
@@ -52840,6 +52877,7 @@ export {
52840
52877
  Max,
52841
52878
  Matches,
52842
52879
  MarkdownChunker,
52880
+ MODULE_METADATA_KEY3 as MODULE_METADATA_KEY,
52843
52881
  METRICS_SERVICE_TOKEN,
52844
52882
  METRICS_OPTIONS_TOKEN,
52845
52883
  MCP_TOOL_METADATA_KEY,
@@ -1125,8 +1125,9 @@ var init_http_exception = __esm(() => {
1125
1125
  this.messageParams = messageParams;
1126
1126
  }
1127
1127
  static withCode(code, message, details, messageParams) {
1128
- const status = ERROR_CODE_TO_STATUS[code] || 500;
1129
- const finalMessage = message || ERROR_CODE_MESSAGES[code] || "Internal Server Error";
1128
+ const knownCode = code;
1129
+ const status = ERROR_CODE_TO_STATUS[knownCode] || 500;
1130
+ const finalMessage = message || ERROR_CODE_MESSAGES[knownCode] || "Internal Server Error";
1130
1131
  return new HttpException(status, finalMessage, details, code, messageParams);
1131
1132
  }
1132
1133
  };
@@ -2150,7 +2151,7 @@ async function handleError(error, context) {
2150
2151
  });
2151
2152
  }
2152
2153
  let errorMessage = error.message;
2153
- if (error.code) {
2154
+ if (error.code && error.code in ERROR_CODE_MESSAGES) {
2154
2155
  const acceptLanguage = context.getHeader("accept-language");
2155
2156
  const language = ErrorMessageI18n.parseLanguageFromHeader(acceptLanguage);
2156
2157
  errorMessage = ErrorMessageI18n.getMessage(error.code, language, error.messageParams);
@@ -2192,6 +2193,7 @@ var init_handler = __esm(() => {
2192
2193
  init_http_exception();
2193
2194
  init_validation();
2194
2195
  init_i18n();
2196
+ init_error_codes();
2195
2197
  });
2196
2198
 
2197
2199
  // src/error/index.ts
@@ -2572,7 +2574,8 @@ class Container {
2572
2574
  typeToToken = new Map;
2573
2575
  dependencyPlans = new Map;
2574
2576
  postProcessors = [];
2575
- register(token, config) {
2577
+ register(token, configOrImplementation) {
2578
+ const config = typeof configOrImplementation === "function" ? { implementation: configOrImplementation } : configOrImplementation;
2576
2579
  const tokenKey = this.getTokenKey(token);
2577
2580
  let lifecycle = config?.lifecycle;
2578
2581
  if (!lifecycle && typeof token === "function") {
@@ -3318,9 +3321,11 @@ function defaultKeyGenerator(context) {
3318
3321
  function createRateLimitMiddleware(options) {
3319
3322
  const {
3320
3323
  max,
3324
+ limit,
3321
3325
  windowMs = 60000,
3322
3326
  store = new MemoryRateLimitStore,
3323
3327
  keyGenerator = defaultKeyGenerator,
3328
+ skip,
3324
3329
  skipSuccessfulRequests = false,
3325
3330
  skipFailedRequests = false,
3326
3331
  message = "Too Many Requests",
@@ -3328,22 +3333,26 @@ function createRateLimitMiddleware(options) {
3328
3333
  standardHeaders = true,
3329
3334
  legacyHeaders = true
3330
3335
  } = options;
3336
+ const requestLimit = limit ?? max ?? 100;
3331
3337
  return async (context, next) => {
3338
+ if (skip && await skip(context)) {
3339
+ return await next();
3340
+ }
3332
3341
  const key = await keyGenerator(context);
3333
3342
  const currentCount = await store.increment(key, windowMs);
3334
- const remaining = Math.max(0, max - currentCount);
3343
+ const remaining = Math.max(0, requestLimit - currentCount);
3335
3344
  const resetTime = Date.now() + windowMs;
3336
3345
  if (standardHeaders) {
3337
- context.setHeader("RateLimit-Limit", max.toString());
3346
+ context.setHeader("RateLimit-Limit", requestLimit.toString());
3338
3347
  context.setHeader("RateLimit-Remaining", remaining.toString());
3339
3348
  context.setHeader("RateLimit-Reset", Math.ceil(resetTime / 1000).toString());
3340
3349
  }
3341
3350
  if (legacyHeaders) {
3342
- context.setHeader("X-RateLimit-Limit", max.toString());
3351
+ context.setHeader("X-RateLimit-Limit", requestLimit.toString());
3343
3352
  context.setHeader("X-RateLimit-Remaining", remaining.toString());
3344
3353
  context.setHeader("X-RateLimit-Reset", Math.ceil(resetTime / 1000).toString());
3345
3354
  }
3346
- if (currentCount > max) {
3355
+ if (currentCount > requestLimit) {
3347
3356
  context.setStatus(statusCode);
3348
3357
  return context.createErrorResponse({
3349
3358
  error: message,
@@ -3621,7 +3630,7 @@ var init_file_handler = __esm(() => {
3621
3630
 
3622
3631
  // src/middleware/builtin/file-upload.ts
3623
3632
  function createFileUploadMiddleware(options = {}) {
3624
- const maxSize = options.maxSize ?? 10 * 1024 * 1024;
3633
+ const maxSize = options.maxSize ?? options.maxFileSize ?? 10 * 1024 * 1024;
3625
3634
  return async (context, next) => {
3626
3635
  const contentType = context.getHeader("Content-Type");
3627
3636
  if (!contentType || !contentType.includes("multipart/form-data")) {
@@ -3737,6 +3746,7 @@ var init_types3 = __esm(() => {
3737
3746
  class InterceptorRegistry {
3738
3747
  interceptors = new Map;
3739
3748
  register(metadataKey, interceptor, priority = 100) {
3749
+ const resolvedPriority = typeof priority === "number" ? priority : priority.priority ?? 100;
3740
3750
  if (!this.interceptors.has(metadataKey)) {
3741
3751
  this.interceptors.set(metadataKey, []);
3742
3752
  }
@@ -3746,7 +3756,7 @@ class InterceptorRegistry {
3746
3756
  metadataList.push({
3747
3757
  metadataKey,
3748
3758
  interceptor,
3749
- priority
3759
+ priority: resolvedPriority
3750
3760
  });
3751
3761
  metadataList.sort((a, b) => a.priority - b.priority);
3752
3762
  }
@@ -4044,6 +4054,13 @@ var init_logger_extension = __esm(() => {
4044
4054
 
4045
4055
  // src/di/module.ts
4046
4056
  import"reflect-metadata";
4057
+ function invokeFactoryProvider(provider, container) {
4058
+ const inject = provider.inject ?? [];
4059
+ if (inject.length > 0) {
4060
+ return provider.useFactory(...inject.map((token) => container.resolve(token)));
4061
+ }
4062
+ return provider.useFactory(container);
4063
+ }
4047
4064
  function Module(metadata) {
4048
4065
  return (target) => {
4049
4066
  Reflect.defineMetadata(MODULE_METADATA_KEY, metadata, target);
@@ -4863,8 +4880,10 @@ class Context {
4863
4880
  _body;
4864
4881
  _bodyParsed = false;
4865
4882
  signal;
4866
- constructor(request) {
4883
+ container;
4884
+ constructor(request, container) {
4867
4885
  this.request = request;
4886
+ this.container = container;
4868
4887
  this.url = new URL2(request.url);
4869
4888
  this.method = request.method;
4870
4889
  this.path = this.url.pathname;
@@ -5577,7 +5596,7 @@ class ModuleRegistry {
5577
5596
  if ("useFactory" in provider) {
5578
5597
  container.register(provider.provide, {
5579
5598
  lifecycle: provider.lifecycle ?? "singleton" /* Singleton */,
5580
- factory: () => provider.useFactory(container)
5599
+ factory: () => invokeFactoryProvider(provider, container)
5581
5600
  });
5582
5601
  continue;
5583
5602
  }
@@ -5884,7 +5903,7 @@ class ConfigService {
5884
5903
  this.config = newConfig;
5885
5904
  for (const listener of this.configUpdateListeners) {
5886
5905
  try {
5887
- listener(newConfig);
5906
+ listener(this.config);
5888
5907
  } catch (error) {
5889
5908
  console.error("[ConfigService] Error in config update listener:", error);
5890
5909
  }
@@ -6392,9 +6411,10 @@ class CacheService {
6392
6411
  defaultTtl;
6393
6412
  keyPrefix;
6394
6413
  constructor(options) {
6395
- this.store = options.store;
6396
- this.defaultTtl = options.defaultTtl ?? 3600000;
6397
- this.keyPrefix = options.keyPrefix ?? "";
6414
+ const resolvedOptions = isCacheStore(options) ? { store: options } : options;
6415
+ this.store = resolvedOptions.store;
6416
+ this.defaultTtl = resolvedOptions.defaultTtl ?? 3600000;
6417
+ this.keyPrefix = resolvedOptions.keyPrefix ?? "";
6398
6418
  }
6399
6419
  async get(key) {
6400
6420
  return this.store.get(this.getKey(key));
@@ -6451,9 +6471,12 @@ CacheService = __legacyDecorateClassTS([
6451
6471
  Injectable(),
6452
6472
  __legacyDecorateParamTS(0, Inject(CACHE_OPTIONS_TOKEN)),
6453
6473
  __legacyMetadataTS("design:paramtypes", [
6454
- typeof CacheModuleOptions === "undefined" ? Object : CacheModuleOptions
6474
+ Object
6455
6475
  ])
6456
6476
  ], CacheService);
6477
+ function isCacheStore(value) {
6478
+ return typeof value.get === "function" && typeof value.set === "function" && typeof value.delete === "function";
6479
+ }
6457
6480
 
6458
6481
  // src/cache/service-proxy.ts
6459
6482
  import"reflect-metadata";
@@ -6997,6 +7020,8 @@ class EventEmitterService {
6997
7020
  handleError(error, event, payload) {
6998
7021
  if (this.options.onError) {
6999
7022
  this.options.onError(error, event, payload);
7023
+ } else if (this.options.errorHandler) {
7024
+ this.options.errorHandler(String(event), error, payload);
7000
7025
  } else {
7001
7026
  console.error(`[EventEmitter] Error in listener for event "${String(event)}":`, error);
7002
7027
  }
@@ -7641,6 +7666,9 @@ class Application {
7641
7666
  getServer() {
7642
7667
  return this.server;
7643
7668
  }
7669
+ getNativeServer() {
7670
+ return this.server?.getNativeServer();
7671
+ }
7644
7672
  async registerServices(port, hostname) {
7645
7673
  if (ServiceRegistryModule.autoRegister === false) {
7646
7674
  return;
@@ -8141,11 +8169,17 @@ function ApiOperation(metadata) {
8141
8169
  };
8142
8170
  }
8143
8171
  function ApiParam(metadata) {
8144
- return function(target, propertyKey, parameterIndex) {
8172
+ const decorator = (target, propertyKey, descriptorOrParameterIndex) => {
8173
+ const paramMetadata = {
8174
+ in: "path",
8175
+ ...metadata
8176
+ };
8145
8177
  const existingParams = Reflect.getMetadata(API_PARAM_METADATA_KEY, target, propertyKey) || [];
8146
- existingParams.push({ index: parameterIndex, metadata });
8178
+ const index = typeof descriptorOrParameterIndex === "number" ? descriptorOrParameterIndex : -1;
8179
+ existingParams.push({ index, metadata: paramMetadata });
8147
8180
  Reflect.defineMetadata(API_PARAM_METADATA_KEY, existingParams, target, propertyKey);
8148
8181
  };
8182
+ return decorator;
8149
8183
  }
8150
8184
  function ApiBody(metadata) {
8151
8185
  return function(target, propertyKey) {
@@ -8262,7 +8296,7 @@ class SwaggerGenerator {
8262
8296
  const pathParamMatches = fullPath.matchAll(/\{([^}]+)\}/g);
8263
8297
  for (const match of pathParamMatches) {
8264
8298
  const paramName = match[1];
8265
- const existingParam = params.find((p) => p.metadata.name === paramName && p.metadata.in === "path");
8299
+ const existingParam = params.find((p) => p.metadata.name === paramName && (p.metadata.in ?? "path") === "path");
8266
8300
  if (!existingParam) {
8267
8301
  pathParams.push({
8268
8302
  name: paramName,
@@ -8275,7 +8309,7 @@ class SwaggerGenerator {
8275
8309
  for (const param of params) {
8276
8310
  pathParams.push({
8277
8311
  name: param.metadata.name,
8278
- in: param.metadata.in,
8312
+ in: param.metadata.in ?? "path",
8279
8313
  description: param.metadata.description,
8280
8314
  required: param.metadata.required,
8281
8315
  schema: param.metadata.schema
@@ -12903,6 +12937,7 @@ class StressTester {
12903
12937
  }
12904
12938
  // src/testing/testing-module.ts
12905
12939
  import"reflect-metadata";
12940
+ init_module();
12906
12941
 
12907
12942
  // src/testing/test-client.ts
12908
12943
  class TestHttpClient {
@@ -13066,7 +13101,7 @@ class TestingModule {
13066
13101
  container.registerInstance(provider.provide, provider.useValue);
13067
13102
  } else if ("useFactory" in provider && provider.provide) {
13068
13103
  container.register(provider.provide, {
13069
- factory: () => provider.useFactory(container)
13104
+ factory: () => invokeFactoryProvider(provider, container)
13070
13105
  });
13071
13106
  } else if ("useClass" in provider) {
13072
13107
  const token = provider.provide ?? provider.useClass;
@@ -13508,7 +13543,7 @@ class SessionService {
13508
13543
  constructor(options) {
13509
13544
  this.store = options.store;
13510
13545
  this.name = options.name ?? "sessionId";
13511
- this.maxAge = options.maxAge ?? 86400000;
13546
+ this.maxAge = options.maxAge ?? options.ttl ?? 86400000;
13512
13547
  this.rolling = options.rolling ?? true;
13513
13548
  this.cookieOptions = {
13514
13549
  secure: options.cookie?.secure ?? false,
@@ -14218,14 +14253,15 @@ class Tracer {
14218
14253
  Object.assign(span.tags, tags);
14219
14254
  }
14220
14255
  }
14221
- addSpanEvent(spanId, event) {
14256
+ addSpanEvent(spanId, event, attributes) {
14222
14257
  const span = this.activeSpans.get(spanId);
14223
14258
  if (span) {
14224
14259
  if (!span.events) {
14225
14260
  span.events = [];
14226
14261
  }
14262
+ const spanEvent = typeof event === "string" ? { name: event, attributes } : event;
14227
14263
  span.events.push({
14228
- ...event,
14264
+ ...spanEvent,
14229
14265
  timestamp: Date.now()
14230
14266
  });
14231
14267
  }
@@ -14928,6 +14964,7 @@ class ServiceMetricsCollector {
14928
14964
  var AI_SERVICE_TOKEN = Symbol("@dangao/bun-server:ai:service");
14929
14965
  var AI_MODULE_OPTIONS_TOKEN = Symbol("@dangao/bun-server:ai:options");
14930
14966
  var AI_TOOL_REGISTRY_TOKEN = Symbol("@dangao/bun-server:ai:tool-registry");
14967
+ var MODULE_METADATA_KEY3 = "@dangao/bun-server:ai:module";
14931
14968
  var AI_TOOL_METADATA_KEY = "@dangao/bun-server:ai:tool";
14932
14969
  // src/ai/errors.ts
14933
14970
  init_http_exception();
@@ -17711,6 +17748,7 @@ export {
17711
17748
  Max,
17712
17749
  Matches,
17713
17750
  MarkdownChunker,
17751
+ MODULE_METADATA_KEY3 as MODULE_METADATA_KEY,
17714
17752
  METRICS_SERVICE_TOKEN,
17715
17753
  METRICS_OPTIONS_TOKEN,
17716
17754
  MCP_TOOL_METADATA_KEY,
@@ -11,7 +11,7 @@ export declare abstract class BaseInterceptor implements Interceptor {
11
11
  * 执行拦截器逻辑
12
12
  * 子类必须实现此方法
13
13
  */
14
- abstract execute<T>(target: unknown, propertyKey: string | symbol, originalMethod: (...args: unknown[]) => T | Promise<T>, args: unknown[], container: Container, context?: Context): Promise<T>;
14
+ abstract execute<T>(target: unknown, propertyKey: string | symbol, originalMethod: (...args: any[]) => T | Promise<T>, args: any[], container: Container, context?: Context): Promise<any>;
15
15
  /**
16
16
  * 前置处理(可选)
17
17
  * 在方法执行前调用,子类可以覆盖此方法
@@ -21,7 +21,7 @@ export declare abstract class BaseInterceptor implements Interceptor {
21
21
  * @param container - DI 容器
22
22
  * @param context - 请求上下文(可选)
23
23
  */
24
- protected before(target: unknown, propertyKey: string | symbol, args: unknown[], container: Container, context?: Context): Promise<void>;
24
+ protected before(target: unknown, propertyKey: string | symbol, args: any[], container: Container, context?: Context): Promise<void>;
25
25
  /**
26
26
  * 后置处理(可选)
27
27
  * 在方法执行后调用,子类可以覆盖此方法
@@ -61,7 +61,7 @@ export declare abstract class BaseInterceptor implements Interceptor {
61
61
  * @param token - 服务标识符
62
62
  * @returns 服务实例
63
63
  */
64
- protected resolveService<T>(container: Container, token: (new (...args: unknown[]) => T) | string | symbol): T;
64
+ protected resolveService<T>(container: Container, token: (new (...args: any[]) => T) | string | symbol): T;
65
65
  /**
66
66
  * 从上下文获取值
67
67
  * @param context - 请求上下文