vafast 0.4.6 → 0.4.19

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 (163) hide show
  1. package/README.md +70 -8
  2. package/dist/base-server-B7MYJNsl.mjs +112 -0
  3. package/dist/{base-server-DMhpmq5v.mjs.map → base-server-B7MYJNsl.mjs.map} +1 -1
  4. package/dist/{base-server-CtA1bZSg.d.mts → base-server-DLxtulAO.d.mts} +2 -2
  5. package/dist/{base64url-DUtluDF0.mjs → base64url-C2zopQdH.mjs} +1 -1
  6. package/dist/{base64url-DUtluDF0.mjs.map → base64url-C2zopQdH.mjs.map} +1 -1
  7. package/dist/{base64url-0N9uQPjZ.d.mts → base64url-Dwi2Afhc.d.mts} +1 -1
  8. package/dist/{component-route-DF5feXJI.d.mts → component-route-nrrO0iSI.d.mts} +2 -2
  9. package/dist/{component-router-uSylkByf.mjs → component-router-RwPL20vN.mjs} +10 -11
  10. package/dist/{component-router-uSylkByf.mjs.map → component-router-RwPL20vN.mjs.map} +1 -1
  11. package/dist/component-server-DomPJ_7S.mjs +119 -0
  12. package/dist/{component-server-DIgykV0F.mjs.map → component-server-DomPJ_7S.mjs.map} +1 -1
  13. package/dist/{component-server-DvcPVnL4.d.mts → component-server-JqpDC7wy.d.mts} +4 -4
  14. package/dist/{create-handler-DRcJRkx9.d.mts → create-handler-DKw-sQOV.d.mts} +2 -2
  15. package/dist/{create-handler-IzOE24L5.mjs → create-handler-RconAcAB.mjs} +5 -6
  16. package/dist/{create-handler-IzOE24L5.mjs.map → create-handler-RconAcAB.mjs.map} +1 -1
  17. package/dist/defineRoute.d.mts +3 -3
  18. package/dist/{dependency-manager-C_qZvkaw.d.mts → dependency-manager-C3_7ic4h.d.mts} +1 -1
  19. package/dist/dependency-manager-DCmh7xFc.mjs +60 -0
  20. package/dist/{dependency-manager-BpN2YufZ.mjs.map → dependency-manager-DCmh7xFc.mjs.map} +1 -1
  21. package/dist/{formats-CYLwo9GJ.d.mts → formats-Dk-DSBY4.d.mts} +1 -1
  22. package/dist/{go-await-2Pzj4snS.mjs → go-await-C4ZdEUwY.mjs} +1 -1
  23. package/dist/{go-await-2Pzj4snS.mjs.map → go-await-C4ZdEUwY.mjs.map} +1 -1
  24. package/dist/{go-await-DRItVwwh.d.mts → go-await-DL1A_-4X.d.mts} +1 -1
  25. package/dist/{handle-D0TFoOiX.d.mts → handle-BhR3oyky.d.mts} +1 -1
  26. package/dist/{handle-s4V-E2RE.mjs → handle-BxJwSvV0.mjs} +2 -2
  27. package/dist/{handle-s4V-E2RE.mjs.map → handle-BxJwSvV0.mjs.map} +1 -1
  28. package/dist/{html-renderer-CMGKJoIy.d.mts → html-renderer-CfKK2BrP.d.mts} +1 -1
  29. package/dist/{html-renderer-CuakkPIt.mjs → html-renderer-DTtJ_Yic.mjs} +26 -27
  30. package/dist/{html-renderer-CuakkPIt.mjs.map → html-renderer-DTtJ_Yic.mjs.map} +1 -1
  31. package/dist/{index-CdOYxwDQ.d.mts → index-CEfOqqvd.d.mts} +5 -5
  32. package/dist/index.d.mts +24 -24
  33. package/dist/index.mjs +20 -23
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/middleware/component-router.d.mts +1 -1
  36. package/dist/middleware/component-router.mjs +1 -2
  37. package/dist/{middleware-CV5o-4wk.mjs → middleware-CewKbtb4.mjs} +51 -58
  38. package/dist/{middleware-CV5o-4wk.mjs.map → middleware-CewKbtb4.mjs.map} +1 -1
  39. package/dist/{middleware-5PjaxPMA.d.mts → middleware-KXEoefLX.d.mts} +2 -2
  40. package/dist/middleware.d.mts +3 -3
  41. package/dist/middleware.mjs +1 -2
  42. package/dist/monitoring/index.d.mts +8 -33
  43. package/dist/monitoring/index.mjs +1 -27
  44. package/dist/monitoring/native-monitor.d.mts +148 -27
  45. package/dist/monitoring/native-monitor.mjs +320 -116
  46. package/dist/monitoring/native-monitor.mjs.map +1 -1
  47. package/dist/node-server/index.d.mts +1 -1
  48. package/dist/node-server/index.mjs +3 -3
  49. package/dist/node-server/request.mjs +1 -1
  50. package/dist/node-server/response.mjs +1 -1
  51. package/dist/node-server/serve.d.mts +1 -1
  52. package/dist/node-server/serve.mjs +2 -2
  53. package/dist/{parsers-7lvt3Oss.d.mts → parsers-BerGr2_q.d.mts} +1 -1
  54. package/dist/{parsers-BQ63b0YE.mjs → parsers-DpH_mD0H.mjs} +1 -1
  55. package/dist/{parsers-BQ63b0YE.mjs.map → parsers-DpH_mD0H.mjs.map} +1 -1
  56. package/dist/path-matcher-CGczAIl_.mjs +61 -0
  57. package/dist/{path-matcher-BNaaJgI3.mjs.map → path-matcher-CGczAIl_.mjs.map} +1 -1
  58. package/dist/radix-tree-qqSjnVXF.mjs +163 -0
  59. package/dist/{radix-tree-Qxr-QpCx.mjs.map → radix-tree-qqSjnVXF.mjs.map} +1 -1
  60. package/dist/{request-B886yCvG.mjs → request-B-Nct5f7.mjs} +1 -1
  61. package/dist/{request-B886yCvG.mjs.map → request-B-Nct5f7.mjs.map} +1 -1
  62. package/dist/{request-validator-DLFtm4uV.mjs → request-validator-Bz9X48FX.mjs} +3 -3
  63. package/dist/{request-validator-DLFtm4uV.mjs.map → request-validator-Bz9X48FX.mjs.map} +1 -1
  64. package/dist/{request-validator-42lY21gn.d.mts → request-validator-Coo8dI-p.d.mts} +2 -2
  65. package/dist/{response-CxYf6Ep3.d.mts → response-BMfdEcTm.d.mts} +2 -2
  66. package/dist/{response-30WnzABq.mjs → response-BnkYA4pj.mjs} +1 -1
  67. package/dist/{response-30WnzABq.mjs.map → response-BnkYA4pj.mjs.map} +1 -1
  68. package/dist/{route-CUbNpSwz.d.mts → route-6A7umH7b.d.mts} +2 -2
  69. package/dist/{route-B3ONOzxQ.mjs → route-Ds53PR4M.mjs} +1 -1
  70. package/dist/{route-B3ONOzxQ.mjs.map → route-Ds53PR4M.mjs.map} +1 -1
  71. package/dist/{route-registry-CYD7m6QP.d.mts → route-registry-CmABJA2V.d.mts} +2 -2
  72. package/dist/route-registry-emTmRrWQ.mjs +226 -0
  73. package/dist/{route-registry-BVvbghgH.mjs.map → route-registry-emTmRrWQ.mjs.map} +1 -1
  74. package/dist/router/index.d.mts +2 -2
  75. package/dist/router/index.mjs +3 -9
  76. package/dist/router/radix-tree.d.mts +3 -3
  77. package/dist/router/radix-tree.mjs +1 -2
  78. package/dist/{router-B9HUUCkR.mjs → router-xWzwz_1a.mjs} +2 -5
  79. package/dist/{router-B9HUUCkR.mjs.map → router-xWzwz_1a.mjs.map} +1 -1
  80. package/dist/router.d.mts +3 -3
  81. package/dist/router.mjs +1 -2
  82. package/dist/{schema-DOKg31ZX.d.mts → schema-B6DFN5c2.d.mts} +1 -1
  83. package/dist/{serve-DgWBnexE.mjs → serve-48LEIkPa.mjs} +3 -3
  84. package/dist/{serve-DgWBnexE.mjs.map → serve-48LEIkPa.mjs.map} +1 -1
  85. package/dist/{serve-B5WmhK6m.d.mts → serve-AG80VaIr.d.mts} +1 -1
  86. package/dist/serve.d.mts +1 -1
  87. package/dist/serve.mjs +2 -2
  88. package/dist/server/base-server.d.mts +3 -3
  89. package/dist/server/base-server.mjs +1 -2
  90. package/dist/server/component-server.d.mts +4 -4
  91. package/dist/server/component-server.mjs +2 -3
  92. package/dist/server/index.d.mts +6 -6
  93. package/dist/server/index.mjs +6 -7
  94. package/dist/server/server-factory.d.mts +6 -6
  95. package/dist/server/server-factory.mjs +5 -6
  96. package/dist/server/server.d.mts +4 -4
  97. package/dist/server/server.mjs +2 -3
  98. package/dist/server-C75o1b-a.mjs +70 -0
  99. package/dist/server-C75o1b-a.mjs.map +1 -0
  100. package/dist/{server-CWIZP6nb.d.mts → server-DGA3dd5s.d.mts} +3 -3
  101. package/dist/server-L_FNwdap.mjs +137 -0
  102. package/dist/{server-C3yoZXNs.mjs.map → server-L_FNwdap.mjs.map} +1 -1
  103. package/dist/{sse-BDIptC85.d.mts → sse-BgLhEo43.d.mts} +2 -2
  104. package/dist/{sse-CCVfFW6s.mjs → sse-CBl-szg1.mjs} +3 -3
  105. package/dist/{sse-CCVfFW6s.mjs.map → sse-CBl-szg1.mjs.map} +1 -1
  106. package/dist/types/component-route.d.mts +1 -1
  107. package/dist/types/index.d.mts +5 -5
  108. package/dist/types/index.mjs +1 -1
  109. package/dist/types/route.d.mts +1 -1
  110. package/dist/types/route.mjs +1 -1
  111. package/dist/types/schema.d.mts +1 -1
  112. package/dist/types/types.d.mts +1 -1
  113. package/dist/{types-mpeSaHdI.d.mts → types-D1PUFkda.d.mts} +1 -1
  114. package/dist/utils/base64url.d.mts +1 -1
  115. package/dist/utils/base64url.mjs +1 -1
  116. package/dist/utils/create-handler.d.mts +2 -2
  117. package/dist/utils/create-handler.mjs +4 -4
  118. package/dist/utils/dependency-manager.d.mts +1 -1
  119. package/dist/utils/dependency-manager.mjs +1 -2
  120. package/dist/utils/formats.d.mts +1 -1
  121. package/dist/utils/go-await.d.mts +1 -1
  122. package/dist/utils/go-await.mjs +1 -1
  123. package/dist/utils/handle.d.mts +1 -1
  124. package/dist/utils/handle.mjs +2 -2
  125. package/dist/utils/html-renderer.d.mts +1 -1
  126. package/dist/utils/html-renderer.mjs +1 -2
  127. package/dist/utils/index.d.mts +16 -16
  128. package/dist/utils/index.mjs +13 -21
  129. package/dist/utils/parsers.d.mts +1 -1
  130. package/dist/utils/parsers.mjs +1 -1
  131. package/dist/utils/path-matcher.mjs +1 -2
  132. package/dist/utils/request-validator.d.mts +2 -2
  133. package/dist/utils/request-validator.mjs +3 -3
  134. package/dist/utils/response.d.mts +4 -4
  135. package/dist/utils/response.mjs +1 -2
  136. package/dist/utils/route-registry.d.mts +3 -3
  137. package/dist/utils/route-registry.mjs +1 -2
  138. package/dist/utils/sse.d.mts +2 -2
  139. package/dist/utils/sse.mjs +3 -3
  140. package/dist/utils/validators/validators.d.mts +1 -1
  141. package/dist/utils/validators/validators.mjs +1 -1
  142. package/dist/{validators-CPmnj_y9.d.mts → validators-Ch71zkT8.d.mts} +1 -1
  143. package/dist/{validators-WXQ49LcR.mjs → validators-DBkyw6BG.mjs} +1 -1
  144. package/dist/{validators-WXQ49LcR.mjs.map → validators-DBkyw6BG.mjs.map} +1 -1
  145. package/package.json +7 -2
  146. package/dist/base-server-DMhpmq5v.mjs +0 -113
  147. package/dist/chunk-DW4-Jl94.mjs +0 -37
  148. package/dist/component-server-DIgykV0F.mjs +0 -124
  149. package/dist/dependency-manager-BpN2YufZ.mjs +0 -61
  150. package/dist/monitoring/index.mjs.map +0 -1
  151. package/dist/monitoring/types.d.mts +0 -150
  152. package/dist/path-matcher-BNaaJgI3.mjs +0 -62
  153. package/dist/radix-tree-Qxr-QpCx.mjs +0 -157
  154. package/dist/route-registry-BVvbghgH.mjs +0 -225
  155. package/dist/router/index.mjs.map +0 -1
  156. package/dist/schema-CflsMJuG.mjs +0 -1
  157. package/dist/server-BttM6Ssc.mjs +0 -88
  158. package/dist/server-BttM6Ssc.mjs.map +0 -1
  159. package/dist/server-C3yoZXNs.mjs +0 -136
  160. package/dist/utils/index.mjs.map +0 -1
  161. /package/dist/{component-route-BKUFoJ5P.mjs → component-route-DNgAj6VC.mjs} +0 -0
  162. /package/dist/{index-CTHojwxd.d.mts → index-CREkvfw9.d.mts} +0 -0
  163. /package/dist/{monitoring/types.mjs → schema-1fwiv7cm.mjs} +0 -0
@@ -1,5 +1,3 @@
1
- import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
2
-
3
1
  //#region src/utils/response.ts
4
2
  /** 生成 JSON 响应 */
5
3
  function json(data, status = 200, headers = {}) {
@@ -17,6 +15,8 @@ function json(data, status = 200, headers = {}) {
17
15
  headers: h
18
16
  });
19
17
  }
18
+ const JSON_HEADERS = { "Content-Type": "application/json" };
19
+ const TEXT_HEADERS = { "Content-Type": "text/plain" };
20
20
  /**
21
21
  * 类型特化的响应映射
22
22
  * 根据返回值类型直接生成 Response,避免不必要的检查
@@ -107,31 +107,40 @@ function err(message, status = 500, type = "ERROR") {
107
107
  expose: true
108
108
  });
109
109
  }
110
- var JSON_HEADERS, TEXT_HEADERS;
111
- var init_response = __esmMin((() => {
112
- init_middleware();
113
- JSON_HEADERS = { "Content-Type": "application/json" };
114
- TEXT_HEADERS = { "Content-Type": "text/plain" };
115
- /** 400 Bad Request */
116
- err.badRequest = (message = "请求参数错误") => err(message, 400, "BAD_REQUEST");
117
- /** 401 Unauthorized */
118
- err.unauthorized = (message = "未授权") => err(message, 401, "UNAUTHORIZED");
119
- /** 403 Forbidden */
120
- err.forbidden = (message = "禁止访问") => err(message, 403, "FORBIDDEN");
121
- /** 404 Not Found */
122
- err.notFound = (message = "资源不存在") => err(message, 404, "NOT_FOUND");
123
- /** 409 Conflict */
124
- err.conflict = (message = "资源冲突") => err(message, 409, "CONFLICT");
125
- /** 422 Unprocessable Entity */
126
- err.unprocessable = (message = "无法处理的实体") => err(message, 422, "UNPROCESSABLE_ENTITY");
127
- /** 429 Too Many Requests */
128
- err.tooMany = (message = "请求过于频繁") => err(message, 429, "TOO_MANY_REQUESTS");
129
- /** 500 Internal Server Error */
130
- err.internal = (message = "服务器内部错误") => err(message, 500, "INTERNAL_ERROR");
131
- }));
110
+ /** 400 Bad Request */
111
+ err.badRequest = (message = "请求参数错误") => err(message, 400, "BAD_REQUEST");
112
+ /** 401 Unauthorized */
113
+ err.unauthorized = (message = "未授权") => err(message, 401, "UNAUTHORIZED");
114
+ /** 403 Forbidden */
115
+ err.forbidden = (message = "禁止访问") => err(message, 403, "FORBIDDEN");
116
+ /** 404 Not Found */
117
+ err.notFound = (message = "资源不存在") => err(message, 404, "NOT_FOUND");
118
+ /** 409 Conflict */
119
+ err.conflict = (message = "资源冲突") => err(message, 409, "CONFLICT");
120
+ /** 422 Unprocessable Entity */
121
+ err.unprocessable = (message = "无法处理的实体") => err(message, 422, "UNPROCESSABLE_ENTITY");
122
+ /** 429 Too Many Requests */
123
+ err.tooMany = (message = "请求过于频繁") => err(message, 429, "TOO_MANY_REQUESTS");
124
+ /** 500 Internal Server Error */
125
+ err.internal = (message = "服务器内部错误") => err(message, 500, "INTERNAL_ERROR");
132
126
 
133
127
  //#endregion
134
128
  //#region src/middleware.ts
129
+ /** 中间件类型:使用 next() 传递给下一个处理 */
130
+ /** Vafast 自定义错误类型 */
131
+ var VafastError = class extends Error {
132
+ status;
133
+ type;
134
+ expose;
135
+ constructor(message, options = {}) {
136
+ super(message);
137
+ this.name = "VafastError";
138
+ this.status = options.status ?? 500;
139
+ this.type = options.type ?? "internal_error";
140
+ this.expose = options.expose ?? false;
141
+ if (options.cause) this.cause = options.cause;
142
+ }
143
+ };
135
144
  /**
136
145
  * 组合类型: 自动注入错误处理器进行中间件组合
137
146
  */
@@ -151,39 +160,23 @@ function composeMiddleware(middleware, finalHandler) {
151
160
  return dispatch(0);
152
161
  };
153
162
  }
154
- var VafastError, errorHandler;
155
- var init_middleware = __esmMin((() => {
156
- init_response();
157
- VafastError = class extends Error {
158
- status;
159
- type;
160
- expose;
161
- constructor(message, options = {}) {
162
- super(message);
163
- this.name = "VafastError";
164
- this.status = options.status ?? 500;
165
- this.type = options.type ?? "internal_error";
166
- this.expose = options.expose ?? false;
167
- if (options.cause) this.cause = options.cause;
168
- }
169
- };
170
- errorHandler = async (req, next) => {
171
- try {
172
- return await next();
173
- } catch (err$1) {
174
- console.error("未处理的错误:", err$1);
175
- if (err$1 instanceof VafastError) return json({
176
- error: err$1.type,
177
- message: err$1.expose ? err$1.message : "发生了一个错误"
178
- }, err$1.status);
179
- return json({
180
- error: "internal_error",
181
- message: "出现了一些问题"
182
- }, 500);
183
- }
184
- };
185
- }));
163
+ /** 默认包含的全局错误处理器 */
164
+ const errorHandler = async (req, next) => {
165
+ try {
166
+ return await next();
167
+ } catch (err$1) {
168
+ console.error("未处理的错误:", err$1);
169
+ if (err$1 instanceof VafastError) return json({
170
+ error: err$1.type,
171
+ message: err$1.expose ? err$1.message : "发生了一个错误"
172
+ }, err$1.status);
173
+ return json({
174
+ error: "internal_error",
175
+ message: "出现了一些问题"
176
+ }, 500);
177
+ }
178
+ };
186
179
 
187
180
  //#endregion
188
- export { err as a, json as c, stream as d, text as f, empty as i, mapResponse as l, composeMiddleware as n, html as o, init_middleware as r, init_response as s, VafastError as t, redirect as u };
189
- //# sourceMappingURL=middleware-CV5o-4wk.mjs.map
181
+ export { html as a, redirect as c, err as i, stream as l, composeMiddleware as n, json as o, empty as r, mapResponse as s, VafastError as t, text as u };
182
+ //# sourceMappingURL=middleware-CewKbtb4.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware-CV5o-4wk.mjs","names":["stream","err"],"sources":["../src/utils/response.ts","../src/middleware.ts"],"sourcesContent":["// src/response.ts\n\nimport { VafastError } from \"../middleware\";\n\n/** 生成 JSON 响应 */\nexport function json(\n data: unknown,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const body = JSON.stringify(data);\n\n // 优化:只在有自定义 headers 时才创建 Headers 对象\n if (Object.keys(headers).length === 0) {\n return new Response(body, {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // 有自定义 headers 时才创建 Headers 对象\n const h = new Headers({\n \"Content-Type\": \"application/json\",\n ...headers,\n });\n\n return new Response(body, {\n status,\n headers: h,\n });\n}\n\n// JSON 响应的预创建 headers(避免每次创建)\nconst JSON_HEADERS = { \"Content-Type\": \"application/json\" };\nconst TEXT_HEADERS = { \"Content-Type\": \"text/plain\" };\n\n/**\n * 类型特化的响应映射\n * 根据返回值类型直接生成 Response,避免不必要的检查\n */\nexport function mapResponse(response: unknown): Response {\n // 快速路径:已经是 Response\n if (response instanceof Response) return response;\n\n // 使用 constructor.name 进行类型判断(比 instanceof 更快)\n switch (response?.constructor?.name) {\n case \"String\":\n return new Response(response as string, { headers: TEXT_HEADERS });\n\n case \"Object\":\n case \"Array\":\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n\n case \"Number\":\n case \"Boolean\":\n return new Response(String(response), { headers: TEXT_HEADERS });\n\n case undefined:\n // null 或 undefined\n return new Response(null, { status: 204 });\n\n case \"ReadableStream\":\n return new Response(response as ReadableStream);\n\n case \"Blob\":\n return new Response(response as Blob);\n\n case \"ArrayBuffer\":\n return new Response(response as ArrayBuffer);\n\n case \"Uint8Array\":\n return new Response(response as unknown as BodyInit);\n\n default:\n // Promise 处理\n if (response instanceof Promise) {\n return response.then(mapResponse) as unknown as Response;\n }\n // 其他情况使用 JSON 序列化\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n }\n}\n\n/** 生成重定向响应 */\nexport function redirect(location: string, status: 301 | 302 = 302): Response {\n return new Response(null, {\n status,\n headers: {\n Location: location,\n },\n });\n}\n\n/** 生成纯文本响应 */\nexport function text(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成HTML响应 */\nexport function html(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/html; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成空响应(204 No Content) */\nexport function empty(status = 204, headers: HeadersInit = {}): Response {\n return new Response(null, {\n status,\n headers,\n });\n}\n\n/** 生成流式响应 */\nexport function stream(\n stream: ReadableStream,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"application/octet-stream\",\n ...headers,\n });\n\n return new Response(stream, {\n status,\n headers: h,\n });\n}\n\n// ==================== 错误响应工具 ====================\n\n/**\n * 创建错误响应\n *\n * @example\n * ```typescript\n * // 自定义错误\n * throw err('用户不存在', 404, 'NOT_FOUND')\n *\n * // 预定义错误\n * throw err.notFound('用户不存在')\n * throw err.badRequest('参数错误')\n * throw err.unauthorized('请先登录')\n * ```\n */\nexport function err(message: string, status = 500, type = \"ERROR\") {\n return new VafastError(message, { status, type, expose: true });\n}\n\n/** 400 Bad Request */\nerr.badRequest = (message = \"请求参数错误\") =>\n err(message, 400, \"BAD_REQUEST\");\n\n/** 401 Unauthorized */\nerr.unauthorized = (message = \"未授权\") =>\n err(message, 401, \"UNAUTHORIZED\");\n\n/** 403 Forbidden */\nerr.forbidden = (message = \"禁止访问\") =>\n err(message, 403, \"FORBIDDEN\");\n\n/** 404 Not Found */\nerr.notFound = (message = \"资源不存在\") =>\n err(message, 404, \"NOT_FOUND\");\n\n/** 409 Conflict */\nerr.conflict = (message = \"资源冲突\") =>\n err(message, 409, \"CONFLICT\");\n\n/** 422 Unprocessable Entity */\nerr.unprocessable = (message = \"无法处理的实体\") =>\n err(message, 422, \"UNPROCESSABLE_ENTITY\");\n\n/** 429 Too Many Requests */\nerr.tooMany = (message = \"请求过于频繁\") =>\n err(message, 429, \"TOO_MANY_REQUESTS\");\n\n/** 500 Internal Server Error */\nerr.internal = (message = \"服务器内部错误\") =>\n err(message, 500, \"INTERNAL_ERROR\");\n","// src/middleware.ts\n\nimport { json, mapResponse } from \"./utils/response\";\n\nimport type { Handler, Middleware } from \"./types\";\n/** 中间件类型:使用 next() 传递给下一个处理 */\n\n/** Vafast 自定义错误类型 */\nexport class VafastError extends Error {\n status: number;\n type: string;\n expose: boolean;\n\n constructor(\n message: string,\n options: {\n status?: number;\n type?: string;\n expose?: boolean;\n cause?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"VafastError\";\n this.status = options.status ?? 500;\n this.type = options.type ?? \"internal_error\";\n this.expose = options.expose ?? false;\n if (options.cause) (this as any).cause = options.cause;\n }\n}\n\n/**\n * 组合类型: 自动注入错误处理器进行中间件组合\n */\nexport function composeMiddleware(\n middleware: Middleware[],\n finalHandler: Handler,\n): (req: Request) => Promise<Response> {\n const all = [errorHandler, ...middleware];\n\n return function composedHandler(req: Request): Promise<Response> {\n let i = -1;\n\n const dispatch = (index: number): Promise<Response> => {\n if (index <= i)\n return Promise.reject(new Error(\"next() called multiple times\"));\n i = index;\n\n // 中间件阶段\n if (index < all.length) {\n const mw = all[index];\n return Promise.resolve(mw(req, () => dispatch(index + 1)));\n }\n\n // 最终 handler - 使用 mapResponse 转换返回值\n return Promise.resolve(finalHandler(req)).then(mapResponse);\n };\n\n return dispatch(0);\n };\n}\n\n/** 默认包含的全局错误处理器 */\nconst errorHandler: Middleware = async (req, next) => {\n try {\n return await next();\n } catch (err) {\n console.error(\"未处理的错误:\", err);\n\n if (err instanceof VafastError) {\n return json(\n {\n error: err.type,\n message: err.expose ? err.message : \"发生了一个错误\",\n },\n err.status,\n );\n }\n\n return json({ error: \"internal_error\", message: \"出现了一些问题\" }, 500);\n }\n};\n"],"mappings":";;;;AAKA,SAAgB,KACd,MACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,OAAO,KAAK,UAAU,KAAK;AAGjC,KAAI,OAAO,KAAK,QAAQ,CAAC,WAAW,EAClC,QAAO,IAAI,SAAS,MAAM;EACxB;EACA,SAAS,EAAE,gBAAgB,oBAAoB;EAChD,CAAC;CAIJ,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAAS,MAAM;EACxB;EACA,SAAS;EACV,CAAC;;;;;;AAWJ,SAAgB,YAAY,UAA6B;AAEvD,KAAI,oBAAoB,SAAU,QAAO;AAGzC,SAAQ,UAAU,aAAa,MAA/B;EACE,KAAK,SACH,QAAO,IAAI,SAAS,UAAoB,EAAE,SAAS,cAAc,CAAC;EAEpE,KAAK;EACL,KAAK,QACH,QAAO,IAAI,SAAS,KAAK,UAAU,SAAS,EAAE,EAAE,SAAS,cAAc,CAAC;EAE1E,KAAK;EACL,KAAK,UACH,QAAO,IAAI,SAAS,OAAO,SAAS,EAAE,EAAE,SAAS,cAAc,CAAC;EAElE,KAAK,OAEH,QAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,KAAK,CAAC;EAE5C,KAAK,iBACH,QAAO,IAAI,SAAS,SAA2B;EAEjD,KAAK,OACH,QAAO,IAAI,SAAS,SAAiB;EAEvC,KAAK,cACH,QAAO,IAAI,SAAS,SAAwB;EAE9C,KAAK,aACH,QAAO,IAAI,SAAS,SAAgC;EAEtD;AAEE,OAAI,oBAAoB,QACtB,QAAO,SAAS,KAAK,YAAY;AAGnC,UAAO,IAAI,SAAS,KAAK,UAAU,SAAS,EAAE,EAAE,SAAS,cAAc,CAAC;;;;AAK9E,SAAgB,SAAS,UAAkB,SAAoB,KAAe;AAC5E,QAAO,IAAI,SAAS,MAAM;EACxB;EACA,SAAS,EACP,UAAU,UACX;EACF,CAAC;;;AAIJ,SAAgB,KACd,SACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAAS,SAAS;EAC3B;EACA,SAAS;EACV,CAAC;;;AAIJ,SAAgB,KACd,SACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAAS,SAAS;EAC3B;EACA,SAAS;EACV,CAAC;;;AAIJ,SAAgB,MAAM,SAAS,KAAK,UAAuB,EAAE,EAAY;AACvE,QAAO,IAAI,SAAS,MAAM;EACxB;EACA;EACD,CAAC;;;AAIJ,SAAgB,OACd,UACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAASA,UAAQ;EAC1B;EACA,SAAS;EACV,CAAC;;;;;;;;;;;;;;;;AAmBJ,SAAgB,IAAI,SAAiB,SAAS,KAAK,OAAO,SAAS;AACjE,QAAO,IAAI,YAAY,SAAS;EAAE;EAAQ;EAAM,QAAQ;EAAM,CAAC;;;;kBAvKrB;CA+BtC,eAAe,EAAE,gBAAgB,oBAAoB;CACrD,eAAe,EAAE,gBAAgB,cAAc;;AA2IrD,KAAI,cAAc,UAAU,aAC1B,IAAI,SAAS,KAAK,cAAc;;AAGlC,KAAI,gBAAgB,UAAU,UAC5B,IAAI,SAAS,KAAK,eAAe;;AAGnC,KAAI,aAAa,UAAU,WACzB,IAAI,SAAS,KAAK,YAAY;;AAGhC,KAAI,YAAY,UAAU,YACxB,IAAI,SAAS,KAAK,YAAY;;AAGhC,KAAI,YAAY,UAAU,WACxB,IAAI,SAAS,KAAK,WAAW;;AAG/B,KAAI,iBAAiB,UAAU,cAC7B,IAAI,SAAS,KAAK,uBAAuB;;AAG3C,KAAI,WAAW,UAAU,aACvB,IAAI,SAAS,KAAK,oBAAoB;;AAGxC,KAAI,YAAY,UAAU,cACxB,IAAI,SAAS,KAAK,iBAAiB;;;;;;;;ACxKrC,SAAgB,kBACd,YACA,cACqC;CACrC,MAAM,MAAM,CAAC,cAAc,GAAG,WAAW;AAEzC,QAAO,SAAS,gBAAgB,KAAiC;EAC/D,IAAI,IAAI;EAER,MAAM,YAAY,UAAqC;AACrD,OAAI,SAAS,EACX,QAAO,QAAQ,uBAAO,IAAI,MAAM,+BAA+B,CAAC;AAClE,OAAI;AAGJ,OAAI,QAAQ,IAAI,QAAQ;IACtB,MAAM,KAAK,IAAI;AACf,WAAO,QAAQ,QAAQ,GAAG,WAAW,SAAS,QAAQ,EAAE,CAAC,CAAC;;AAI5D,UAAO,QAAQ,QAAQ,aAAa,IAAI,CAAC,CAAC,KAAK,YAAY;;AAG7D,SAAO,SAAS,EAAE;;;;;gBAxD+B;CAMxC,cAAb,cAAiC,MAAM;EACrC;EACA;EACA;EAEA,YACE,SACA,UAKI,EAAE,EACN;AACA,SAAM,QAAQ;AACd,QAAK,OAAO;AACZ,QAAK,SAAS,QAAQ,UAAU;AAChC,QAAK,OAAO,QAAQ,QAAQ;AAC5B,QAAK,SAAS,QAAQ,UAAU;AAChC,OAAI,QAAQ,MAAO,CAAC,KAAa,QAAQ,QAAQ;;;CAoC/C,eAA2B,OAAO,KAAK,SAAS;AACpD,MAAI;AACF,UAAO,MAAM,MAAM;WACZC,OAAK;AACZ,WAAQ,MAAM,WAAWA,MAAI;AAE7B,OAAIA,iBAAe,YACjB,QAAO,KACL;IACE,OAAOA,MAAI;IACX,SAASA,MAAI,SAASA,MAAI,UAAU;IACrC,EACDA,MAAI,OACL;AAGH,UAAO,KAAK;IAAE,OAAO;IAAkB,SAAS;IAAW,EAAE,IAAI"}
1
+ {"version":3,"file":"middleware-CewKbtb4.mjs","names":["stream","err"],"sources":["../src/utils/response.ts","../src/middleware.ts"],"sourcesContent":["// src/response.ts\n\nimport { VafastError } from \"../middleware\";\n\n/** 生成 JSON 响应 */\nexport function json(\n data: unknown,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const body = JSON.stringify(data);\n\n // 优化:只在有自定义 headers 时才创建 Headers 对象\n if (Object.keys(headers).length === 0) {\n return new Response(body, {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // 有自定义 headers 时才创建 Headers 对象\n const h = new Headers({\n \"Content-Type\": \"application/json\",\n ...headers,\n });\n\n return new Response(body, {\n status,\n headers: h,\n });\n}\n\n// JSON 响应的预创建 headers(避免每次创建)\nconst JSON_HEADERS = { \"Content-Type\": \"application/json\" };\nconst TEXT_HEADERS = { \"Content-Type\": \"text/plain\" };\n\n/**\n * 类型特化的响应映射\n * 根据返回值类型直接生成 Response,避免不必要的检查\n */\nexport function mapResponse(response: unknown): Response {\n // 快速路径:已经是 Response\n if (response instanceof Response) return response;\n\n // 使用 constructor.name 进行类型判断(比 instanceof 更快)\n switch (response?.constructor?.name) {\n case \"String\":\n return new Response(response as string, { headers: TEXT_HEADERS });\n\n case \"Object\":\n case \"Array\":\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n\n case \"Number\":\n case \"Boolean\":\n return new Response(String(response), { headers: TEXT_HEADERS });\n\n case undefined:\n // null 或 undefined\n return new Response(null, { status: 204 });\n\n case \"ReadableStream\":\n return new Response(response as ReadableStream);\n\n case \"Blob\":\n return new Response(response as Blob);\n\n case \"ArrayBuffer\":\n return new Response(response as ArrayBuffer);\n\n case \"Uint8Array\":\n return new Response(response as unknown as BodyInit);\n\n default:\n // Promise 处理\n if (response instanceof Promise) {\n return response.then(mapResponse) as unknown as Response;\n }\n // 其他情况使用 JSON 序列化\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n }\n}\n\n/** 生成重定向响应 */\nexport function redirect(location: string, status: 301 | 302 = 302): Response {\n return new Response(null, {\n status,\n headers: {\n Location: location,\n },\n });\n}\n\n/** 生成纯文本响应 */\nexport function text(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成HTML响应 */\nexport function html(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/html; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成空响应(204 No Content) */\nexport function empty(status = 204, headers: HeadersInit = {}): Response {\n return new Response(null, {\n status,\n headers,\n });\n}\n\n/** 生成流式响应 */\nexport function stream(\n stream: ReadableStream,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"application/octet-stream\",\n ...headers,\n });\n\n return new Response(stream, {\n status,\n headers: h,\n });\n}\n\n// ==================== 错误响应工具 ====================\n\n/**\n * 创建错误响应\n *\n * @example\n * ```typescript\n * // 自定义错误\n * throw err('用户不存在', 404, 'NOT_FOUND')\n *\n * // 预定义错误\n * throw err.notFound('用户不存在')\n * throw err.badRequest('参数错误')\n * throw err.unauthorized('请先登录')\n * ```\n */\nexport function err(message: string, status = 500, type = \"ERROR\") {\n return new VafastError(message, { status, type, expose: true });\n}\n\n/** 400 Bad Request */\nerr.badRequest = (message = \"请求参数错误\") =>\n err(message, 400, \"BAD_REQUEST\");\n\n/** 401 Unauthorized */\nerr.unauthorized = (message = \"未授权\") =>\n err(message, 401, \"UNAUTHORIZED\");\n\n/** 403 Forbidden */\nerr.forbidden = (message = \"禁止访问\") =>\n err(message, 403, \"FORBIDDEN\");\n\n/** 404 Not Found */\nerr.notFound = (message = \"资源不存在\") =>\n err(message, 404, \"NOT_FOUND\");\n\n/** 409 Conflict */\nerr.conflict = (message = \"资源冲突\") =>\n err(message, 409, \"CONFLICT\");\n\n/** 422 Unprocessable Entity */\nerr.unprocessable = (message = \"无法处理的实体\") =>\n err(message, 422, \"UNPROCESSABLE_ENTITY\");\n\n/** 429 Too Many Requests */\nerr.tooMany = (message = \"请求过于频繁\") =>\n err(message, 429, \"TOO_MANY_REQUESTS\");\n\n/** 500 Internal Server Error */\nerr.internal = (message = \"服务器内部错误\") =>\n err(message, 500, \"INTERNAL_ERROR\");\n","// src/middleware.ts\n\nimport { json, mapResponse } from \"./utils/response\";\n\nimport type { Handler, Middleware } from \"./types\";\n/** 中间件类型:使用 next() 传递给下一个处理 */\n\n/** Vafast 自定义错误类型 */\nexport class VafastError extends Error {\n status: number;\n type: string;\n expose: boolean;\n\n constructor(\n message: string,\n options: {\n status?: number;\n type?: string;\n expose?: boolean;\n cause?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"VafastError\";\n this.status = options.status ?? 500;\n this.type = options.type ?? \"internal_error\";\n this.expose = options.expose ?? false;\n if (options.cause) (this as any).cause = options.cause;\n }\n}\n\n/**\n * 组合类型: 自动注入错误处理器进行中间件组合\n */\nexport function composeMiddleware(\n middleware: Middleware[],\n finalHandler: Handler,\n): (req: Request) => Promise<Response> {\n const all = [errorHandler, ...middleware];\n\n return function composedHandler(req: Request): Promise<Response> {\n let i = -1;\n\n const dispatch = (index: number): Promise<Response> => {\n if (index <= i)\n return Promise.reject(new Error(\"next() called multiple times\"));\n i = index;\n\n // 中间件阶段\n if (index < all.length) {\n const mw = all[index];\n return Promise.resolve(mw(req, () => dispatch(index + 1)));\n }\n\n // 最终 handler - 使用 mapResponse 转换返回值\n return Promise.resolve(finalHandler(req)).then(mapResponse);\n };\n\n return dispatch(0);\n };\n}\n\n/** 默认包含的全局错误处理器 */\nconst errorHandler: Middleware = async (req, next) => {\n try {\n return await next();\n } catch (err) {\n console.error(\"未处理的错误:\", err);\n\n if (err instanceof VafastError) {\n return json(\n {\n error: err.type,\n message: err.expose ? err.message : \"发生了一个错误\",\n },\n err.status,\n );\n }\n\n return json({ error: \"internal_error\", message: \"出现了一些问题\" }, 500);\n }\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { o as Middleware, r as Handler } from "./types-mpeSaHdI.mjs";
1
+ import { o as Middleware, r as Handler } from "./types-D1PUFkda.mjs";
2
2
 
3
3
  //#region src/middleware.d.ts
4
4
  /** 中间件类型:使用 next() 传递给下一个处理 */
@@ -20,4 +20,4 @@ declare class VafastError extends Error {
20
20
  declare function composeMiddleware(middleware: Middleware[], finalHandler: Handler): (req: Request) => Promise<Response>;
21
21
  //#endregion
22
22
  export { composeMiddleware as n, VafastError as t };
23
- //# sourceMappingURL=middleware-5PjaxPMA.d.mts.map
23
+ //# sourceMappingURL=middleware-KXEoefLX.d.mts.map
@@ -1,4 +1,4 @@
1
- import "./schema-DOKg31ZX.mjs";
2
- import "./index-CTHojwxd.mjs";
3
- import { n as composeMiddleware, t as VafastError } from "./middleware-5PjaxPMA.mjs";
1
+ import "./schema-B6DFN5c2.mjs";
2
+ import "./index-CREkvfw9.mjs";
3
+ import { n as composeMiddleware, t as VafastError } from "./middleware-KXEoefLX.mjs";
4
4
  export { VafastError, composeMiddleware };
@@ -1,4 +1,3 @@
1
- import { n as composeMiddleware, r as init_middleware, t as VafastError } from "./middleware-CV5o-4wk.mjs";
1
+ import { n as composeMiddleware, t as VafastError } from "./middleware-CewKbtb4.mjs";
2
2
 
3
- init_middleware();
4
3
  export { VafastError, composeMiddleware };
@@ -1,33 +1,8 @@
1
- import "../schema-DOKg31ZX.mjs";
2
- import "../index-CTHojwxd.mjs";
3
- import "../base-server-CtA1bZSg.mjs";
4
- import "../server-CWIZP6nb.mjs";
5
- import "../component-server-DvcPVnL4.mjs";
6
- import "../index-CdOYxwDQ.mjs";
7
- import { AggregatedMetrics, BaseMetrics, MonitoringConfig, MonitoringEvent, PerformanceMetrics, PerformanceReport } from "./types.mjs";
8
- import { MonitoredServer, NativeMonitoringConfig, NativeMonitoringMetrics, createMonitoredServer, withMonitoring } from "./native-monitor.mjs";
9
-
10
- //#region src/monitoring/index.d.ts
11
- declare const defaultMonitoringConfig: {
12
- enabled: boolean;
13
- console: boolean;
14
- slowThreshold: number;
15
- errorThreshold: number;
16
- tags: {
17
- framework: string;
18
- version: string;
19
- };
20
- };
21
- declare function createMonitoringConfig(config?: Partial<typeof defaultMonitoringConfig>): {
22
- enabled: boolean;
23
- console: boolean;
24
- slowThreshold: number;
25
- errorThreshold: number;
26
- tags: {
27
- framework: string;
28
- version: string;
29
- };
30
- };
31
- //#endregion
32
- export { AggregatedMetrics, BaseMetrics, MonitoredServer, MonitoringConfig, MonitoringEvent, NativeMonitoringConfig, NativeMonitoringMetrics, PerformanceMetrics, PerformanceReport, createMonitoredServer, createMonitoringConfig, defaultMonitoringConfig, withMonitoring };
33
- //# sourceMappingURL=index.d.mts.map
1
+ import "../schema-B6DFN5c2.mjs";
2
+ import "../index-CREkvfw9.mjs";
3
+ import "../base-server-DLxtulAO.mjs";
4
+ import "../server-DGA3dd5s.mjs";
5
+ import "../component-server-JqpDC7wy.mjs";
6
+ import "../index-CEfOqqvd.mjs";
7
+ import { MemoryInfo, MonitoredServer, MonitoringConfig, MonitoringMetrics, MonitoringStatus, PathStats, StatusCodeDistribution, TimeWindowStats, createMonitoredServer, withMonitoring } from "./native-monitor.mjs";
8
+ export { type MemoryInfo, type MonitoredServer, type MonitoringConfig, type MonitoringMetrics, type MonitoringStatus, type PathStats, type StatusCodeDistribution, type TimeWindowStats, createMonitoredServer, withMonitoring };
@@ -1,29 +1,3 @@
1
- import "../middleware-CV5o-4wk.mjs";
2
- import "../server-C3yoZXNs.mjs";
3
- import "../dependency-manager-BpN2YufZ.mjs";
4
- import "../component-server-DIgykV0F.mjs";
5
- import "../server-BttM6Ssc.mjs";
6
- import "./types.mjs";
7
1
  import { createMonitoredServer, withMonitoring } from "./native-monitor.mjs";
8
2
 
9
- //#region src/monitoring/index.ts
10
- const defaultMonitoringConfig = {
11
- enabled: true,
12
- console: true,
13
- slowThreshold: 1e3,
14
- errorThreshold: .05,
15
- tags: {
16
- framework: "vafast",
17
- version: "2.0.0"
18
- }
19
- };
20
- function createMonitoringConfig(config = {}) {
21
- return {
22
- ...defaultMonitoringConfig,
23
- ...config
24
- };
25
- }
26
-
27
- //#endregion
28
- export { createMonitoredServer, createMonitoringConfig, defaultMonitoringConfig, withMonitoring };
29
- //# sourceMappingURL=index.mjs.map
3
+ export { createMonitoredServer, withMonitoring };
@@ -1,48 +1,169 @@
1
- import "../schema-DOKg31ZX.mjs";
2
- import "../index-CTHojwxd.mjs";
3
- import "../base-server-CtA1bZSg.mjs";
4
- import { t as Server } from "../server-CWIZP6nb.mjs";
5
- import "../component-server-DvcPVnL4.mjs";
6
- import "../index-CdOYxwDQ.mjs";
1
+ import "../schema-B6DFN5c2.mjs";
2
+ import "../index-CREkvfw9.mjs";
3
+ import "../base-server-DLxtulAO.mjs";
4
+ import { t as Server } from "../server-DGA3dd5s.mjs";
5
+ import "../component-server-JqpDC7wy.mjs";
6
+ import "../index-CEfOqqvd.mjs";
7
7
 
8
8
  //#region src/monitoring/native-monitor.d.ts
9
- /**
10
- * 原生监控装饰器
11
- *
12
- * 通过装饰器模式为 Server 添加监控能力,完全不入侵原类
13
- *
14
- * @author Framework Team
15
- * @version 2.0.0
16
- * @license MIT
17
- */
18
- interface NativeMonitoringConfig {
9
+
10
+ /** 监控配置 */
11
+ interface MonitoringConfig {
12
+ /** 是否启用监控,默认 true */
19
13
  enabled?: boolean;
14
+ /** 是否输出到控制台,默认 true */
20
15
  console?: boolean;
16
+ /** 慢请求阈值(毫秒),默认 1000 */
21
17
  slowThreshold?: number;
22
- errorThreshold?: number;
18
+ /** 最大记录数,默认 1000 */
19
+ maxRecords?: number;
20
+ /** 采样率 0-1,默认 1(全部记录) */
21
+ samplingRate?: number;
22
+ /** 排除的路径(不记录) */
23
+ excludePaths?: string[];
24
+ /** 自定义标签 */
23
25
  tags?: Record<string, string>;
26
+ /** 请求完成回调 */
27
+ onRequest?: (metrics: MonitoringMetrics) => void;
28
+ /** 慢请求回调 */
29
+ onSlowRequest?: (metrics: MonitoringMetrics) => void;
24
30
  }
25
- interface NativeMonitoringMetrics {
31
+ /** 监控指标 */
32
+ interface MonitoringMetrics {
26
33
  requestId: string;
27
34
  method: string;
28
35
  path: string;
29
36
  statusCode: number;
30
37
  totalTime: number;
31
38
  timestamp: number;
39
+ memoryUsage: MemoryInfo;
40
+ }
41
+ /** 内存信息 */
42
+ interface MemoryInfo {
43
+ heapUsed: number;
44
+ heapTotal: number;
45
+ }
46
+ /** 路径统计 */
47
+ interface PathStats {
48
+ count: number;
49
+ totalTime: number;
50
+ avgTime: number;
51
+ minTime: number;
52
+ maxTime: number;
53
+ errorCount: number;
54
+ }
55
+ /** 时间窗口统计 */
56
+ interface TimeWindowStats {
57
+ /** 请求数 */
58
+ requests: number;
59
+ /** 成功数 */
60
+ successful: number;
61
+ /** 失败数 */
62
+ failed: number;
63
+ /** 错误率 */
64
+ errorRate: number;
65
+ /** 平均响应时间 */
66
+ avgTime: number;
67
+ /** RPS(每秒请求数) */
68
+ rps: number;
69
+ }
70
+ /** 状态码分布 */
71
+ interface StatusCodeDistribution {
72
+ /** 2xx 成功 */
73
+ "2xx": number;
74
+ /** 3xx 重定向 */
75
+ "3xx": number;
76
+ /** 4xx 客户端错误 */
77
+ "4xx": number;
78
+ /** 5xx 服务器错误 */
79
+ "5xx": number;
80
+ /** 详细分布 */
81
+ detail: Record<number, number>;
82
+ }
83
+ /** 监控状态 */
84
+ interface MonitoringStatus {
85
+ enabled: boolean;
86
+ /** 服务运行时间(毫秒) */
87
+ uptime: number;
88
+ totalRequests: number;
89
+ successfulRequests: number;
90
+ failedRequests: number;
91
+ errorRate: number;
92
+ /** 平均响应时间(毫秒) */
93
+ avgResponseTime: number;
94
+ /** P50 响应时间(毫秒) */
95
+ p50: number;
96
+ /** P95 响应时间(毫秒) */
97
+ p95: number;
98
+ /** P99 响应时间(毫秒) */
99
+ p99: number;
100
+ /** 最小响应时间 */
101
+ minTime: number;
102
+ /** 最大响应时间 */
103
+ maxTime: number;
104
+ /** 当前 RPS */
105
+ rps: number;
106
+ /** 状态码分布 */
107
+ statusCodes: StatusCodeDistribution;
108
+ /** 时间窗口统计 */
109
+ timeWindows: {
110
+ /** 最近 1 分钟 */
111
+ last1min: TimeWindowStats;
112
+ /** 最近 5 分钟 */
113
+ last5min: TimeWindowStats;
114
+ /** 最近 1 小时 */
115
+ last1hour: TimeWindowStats;
116
+ };
117
+ /** 按路径统计 */
118
+ byPath: Record<string, PathStats>;
119
+ /** 内存使用 */
32
120
  memoryUsage: {
33
- heapUsed: number;
34
- heapTotal: number;
121
+ heapUsed: string;
122
+ heapTotal: string;
35
123
  };
124
+ /** 最近请求 */
125
+ recentRequests: MonitoringMetrics[];
36
126
  }
127
+ /** 带监控的 Server */
37
128
  interface MonitoredServer extends Server {
38
- getMonitoringStatus(): any;
39
- getMonitoringMetrics(): NativeMonitoringMetrics[];
129
+ getMonitoringStatus(): MonitoringStatus;
130
+ getMonitoringMetrics(): MonitoringMetrics[];
131
+ getPathStats(path: string): PathStats | undefined;
132
+ getTimeWindowStats(windowMs: number): TimeWindowStats;
133
+ getRPS(): number;
134
+ getStatusCodeDistribution(): StatusCodeDistribution;
40
135
  resetMonitoring(): void;
41
- fetch: (req: Request) => Promise<Response>;
42
- use: (mw: any) => void;
43
136
  }
44
- declare function withMonitoring(server: Server, config?: NativeMonitoringConfig): MonitoredServer;
45
- declare function createMonitoredServer(routes: any[], config?: NativeMonitoringConfig): MonitoredServer;
137
+ /**
138
+ * Server 添加监控能力
139
+ *
140
+ * @example
141
+ * ```ts
142
+ * const server = new Server(routes)
143
+ * const monitored = withMonitoring(server, {
144
+ * slowThreshold: 500,
145
+ * excludePaths: ['/health'],
146
+ * onSlowRequest: (m) => console.warn('Slow!', m.path)
147
+ * })
148
+ *
149
+ * // 获取完整状态
150
+ * const status = monitored.getMonitoringStatus()
151
+ * console.log(`P99: ${status.p99}ms`)
152
+ * console.log(`RPS: ${status.rps}`)
153
+ * console.log(`Last 1min errors: ${status.timeWindows.last1min.errorRate}`)
154
+ *
155
+ * // 单独获取 RPS
156
+ * console.log(`Current RPS: ${monitored.getRPS()}`)
157
+ *
158
+ * // 自定义时间窗口
159
+ * const last30sec = monitored.getTimeWindowStats(30000)
160
+ * ```
161
+ */
162
+ declare function withMonitoring(server: Server, config?: MonitoringConfig): MonitoredServer;
163
+ /**
164
+ * 创建带监控的 Server(便捷函数)
165
+ */
166
+ declare function createMonitoredServer(ServerClass: typeof Server, routes: ConstructorParameters<typeof Server>[0], config?: MonitoringConfig): MonitoredServer;
46
167
  //#endregion
47
- export { MonitoredServer, NativeMonitoringConfig, NativeMonitoringMetrics, createMonitoredServer, withMonitoring };
168
+ export { MemoryInfo, MonitoredServer, MonitoringConfig, MonitoringMetrics, MonitoringStatus, PathStats, StatusCodeDistribution, TimeWindowStats, createMonitoredServer, withMonitoring };
48
169
  //# sourceMappingURL=native-monitor.d.mts.map