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.
- package/README.md +70 -8
- package/dist/base-server-B7MYJNsl.mjs +112 -0
- package/dist/{base-server-DMhpmq5v.mjs.map → base-server-B7MYJNsl.mjs.map} +1 -1
- package/dist/{base-server-CtA1bZSg.d.mts → base-server-DLxtulAO.d.mts} +2 -2
- package/dist/{base64url-DUtluDF0.mjs → base64url-C2zopQdH.mjs} +1 -1
- package/dist/{base64url-DUtluDF0.mjs.map → base64url-C2zopQdH.mjs.map} +1 -1
- package/dist/{base64url-0N9uQPjZ.d.mts → base64url-Dwi2Afhc.d.mts} +1 -1
- package/dist/{component-route-DF5feXJI.d.mts → component-route-nrrO0iSI.d.mts} +2 -2
- package/dist/{component-router-uSylkByf.mjs → component-router-RwPL20vN.mjs} +10 -11
- package/dist/{component-router-uSylkByf.mjs.map → component-router-RwPL20vN.mjs.map} +1 -1
- package/dist/component-server-DomPJ_7S.mjs +119 -0
- package/dist/{component-server-DIgykV0F.mjs.map → component-server-DomPJ_7S.mjs.map} +1 -1
- package/dist/{component-server-DvcPVnL4.d.mts → component-server-JqpDC7wy.d.mts} +4 -4
- package/dist/{create-handler-DRcJRkx9.d.mts → create-handler-DKw-sQOV.d.mts} +2 -2
- package/dist/{create-handler-IzOE24L5.mjs → create-handler-RconAcAB.mjs} +5 -6
- package/dist/{create-handler-IzOE24L5.mjs.map → create-handler-RconAcAB.mjs.map} +1 -1
- package/dist/defineRoute.d.mts +3 -3
- package/dist/{dependency-manager-C_qZvkaw.d.mts → dependency-manager-C3_7ic4h.d.mts} +1 -1
- package/dist/dependency-manager-DCmh7xFc.mjs +60 -0
- package/dist/{dependency-manager-BpN2YufZ.mjs.map → dependency-manager-DCmh7xFc.mjs.map} +1 -1
- package/dist/{formats-CYLwo9GJ.d.mts → formats-Dk-DSBY4.d.mts} +1 -1
- package/dist/{go-await-2Pzj4snS.mjs → go-await-C4ZdEUwY.mjs} +1 -1
- package/dist/{go-await-2Pzj4snS.mjs.map → go-await-C4ZdEUwY.mjs.map} +1 -1
- package/dist/{go-await-DRItVwwh.d.mts → go-await-DL1A_-4X.d.mts} +1 -1
- package/dist/{handle-D0TFoOiX.d.mts → handle-BhR3oyky.d.mts} +1 -1
- package/dist/{handle-s4V-E2RE.mjs → handle-BxJwSvV0.mjs} +2 -2
- package/dist/{handle-s4V-E2RE.mjs.map → handle-BxJwSvV0.mjs.map} +1 -1
- package/dist/{html-renderer-CMGKJoIy.d.mts → html-renderer-CfKK2BrP.d.mts} +1 -1
- package/dist/{html-renderer-CuakkPIt.mjs → html-renderer-DTtJ_Yic.mjs} +26 -27
- package/dist/{html-renderer-CuakkPIt.mjs.map → html-renderer-DTtJ_Yic.mjs.map} +1 -1
- package/dist/{index-CdOYxwDQ.d.mts → index-CEfOqqvd.d.mts} +5 -5
- package/dist/index.d.mts +24 -24
- package/dist/index.mjs +20 -23
- package/dist/index.mjs.map +1 -1
- package/dist/middleware/component-router.d.mts +1 -1
- package/dist/middleware/component-router.mjs +1 -2
- package/dist/{middleware-CV5o-4wk.mjs → middleware-CewKbtb4.mjs} +51 -58
- package/dist/{middleware-CV5o-4wk.mjs.map → middleware-CewKbtb4.mjs.map} +1 -1
- package/dist/{middleware-5PjaxPMA.d.mts → middleware-KXEoefLX.d.mts} +2 -2
- package/dist/middleware.d.mts +3 -3
- package/dist/middleware.mjs +1 -2
- package/dist/monitoring/index.d.mts +8 -33
- package/dist/monitoring/index.mjs +1 -27
- package/dist/monitoring/native-monitor.d.mts +148 -27
- package/dist/monitoring/native-monitor.mjs +320 -116
- package/dist/monitoring/native-monitor.mjs.map +1 -1
- package/dist/node-server/index.d.mts +1 -1
- package/dist/node-server/index.mjs +3 -3
- package/dist/node-server/request.mjs +1 -1
- package/dist/node-server/response.mjs +1 -1
- package/dist/node-server/serve.d.mts +1 -1
- package/dist/node-server/serve.mjs +2 -2
- package/dist/{parsers-7lvt3Oss.d.mts → parsers-BerGr2_q.d.mts} +1 -1
- package/dist/{parsers-BQ63b0YE.mjs → parsers-DpH_mD0H.mjs} +1 -1
- package/dist/{parsers-BQ63b0YE.mjs.map → parsers-DpH_mD0H.mjs.map} +1 -1
- package/dist/path-matcher-CGczAIl_.mjs +61 -0
- package/dist/{path-matcher-BNaaJgI3.mjs.map → path-matcher-CGczAIl_.mjs.map} +1 -1
- package/dist/radix-tree-qqSjnVXF.mjs +163 -0
- package/dist/{radix-tree-Qxr-QpCx.mjs.map → radix-tree-qqSjnVXF.mjs.map} +1 -1
- package/dist/{request-B886yCvG.mjs → request-B-Nct5f7.mjs} +1 -1
- package/dist/{request-B886yCvG.mjs.map → request-B-Nct5f7.mjs.map} +1 -1
- package/dist/{request-validator-DLFtm4uV.mjs → request-validator-Bz9X48FX.mjs} +3 -3
- package/dist/{request-validator-DLFtm4uV.mjs.map → request-validator-Bz9X48FX.mjs.map} +1 -1
- package/dist/{request-validator-42lY21gn.d.mts → request-validator-Coo8dI-p.d.mts} +2 -2
- package/dist/{response-CxYf6Ep3.d.mts → response-BMfdEcTm.d.mts} +2 -2
- package/dist/{response-30WnzABq.mjs → response-BnkYA4pj.mjs} +1 -1
- package/dist/{response-30WnzABq.mjs.map → response-BnkYA4pj.mjs.map} +1 -1
- package/dist/{route-CUbNpSwz.d.mts → route-6A7umH7b.d.mts} +2 -2
- package/dist/{route-B3ONOzxQ.mjs → route-Ds53PR4M.mjs} +1 -1
- package/dist/{route-B3ONOzxQ.mjs.map → route-Ds53PR4M.mjs.map} +1 -1
- package/dist/{route-registry-CYD7m6QP.d.mts → route-registry-CmABJA2V.d.mts} +2 -2
- package/dist/route-registry-emTmRrWQ.mjs +226 -0
- package/dist/{route-registry-BVvbghgH.mjs.map → route-registry-emTmRrWQ.mjs.map} +1 -1
- package/dist/router/index.d.mts +2 -2
- package/dist/router/index.mjs +3 -9
- package/dist/router/radix-tree.d.mts +3 -3
- package/dist/router/radix-tree.mjs +1 -2
- package/dist/{router-B9HUUCkR.mjs → router-xWzwz_1a.mjs} +2 -5
- package/dist/{router-B9HUUCkR.mjs.map → router-xWzwz_1a.mjs.map} +1 -1
- package/dist/router.d.mts +3 -3
- package/dist/router.mjs +1 -2
- package/dist/{schema-DOKg31ZX.d.mts → schema-B6DFN5c2.d.mts} +1 -1
- package/dist/{serve-DgWBnexE.mjs → serve-48LEIkPa.mjs} +3 -3
- package/dist/{serve-DgWBnexE.mjs.map → serve-48LEIkPa.mjs.map} +1 -1
- package/dist/{serve-B5WmhK6m.d.mts → serve-AG80VaIr.d.mts} +1 -1
- package/dist/serve.d.mts +1 -1
- package/dist/serve.mjs +2 -2
- package/dist/server/base-server.d.mts +3 -3
- package/dist/server/base-server.mjs +1 -2
- package/dist/server/component-server.d.mts +4 -4
- package/dist/server/component-server.mjs +2 -3
- package/dist/server/index.d.mts +6 -6
- package/dist/server/index.mjs +6 -7
- package/dist/server/server-factory.d.mts +6 -6
- package/dist/server/server-factory.mjs +5 -6
- package/dist/server/server.d.mts +4 -4
- package/dist/server/server.mjs +2 -3
- package/dist/server-C75o1b-a.mjs +70 -0
- package/dist/server-C75o1b-a.mjs.map +1 -0
- package/dist/{server-CWIZP6nb.d.mts → server-DGA3dd5s.d.mts} +3 -3
- package/dist/server-L_FNwdap.mjs +137 -0
- package/dist/{server-C3yoZXNs.mjs.map → server-L_FNwdap.mjs.map} +1 -1
- package/dist/{sse-BDIptC85.d.mts → sse-BgLhEo43.d.mts} +2 -2
- package/dist/{sse-CCVfFW6s.mjs → sse-CBl-szg1.mjs} +3 -3
- package/dist/{sse-CCVfFW6s.mjs.map → sse-CBl-szg1.mjs.map} +1 -1
- package/dist/types/component-route.d.mts +1 -1
- package/dist/types/index.d.mts +5 -5
- package/dist/types/index.mjs +1 -1
- package/dist/types/route.d.mts +1 -1
- package/dist/types/route.mjs +1 -1
- package/dist/types/schema.d.mts +1 -1
- package/dist/types/types.d.mts +1 -1
- package/dist/{types-mpeSaHdI.d.mts → types-D1PUFkda.d.mts} +1 -1
- package/dist/utils/base64url.d.mts +1 -1
- package/dist/utils/base64url.mjs +1 -1
- package/dist/utils/create-handler.d.mts +2 -2
- package/dist/utils/create-handler.mjs +4 -4
- package/dist/utils/dependency-manager.d.mts +1 -1
- package/dist/utils/dependency-manager.mjs +1 -2
- package/dist/utils/formats.d.mts +1 -1
- package/dist/utils/go-await.d.mts +1 -1
- package/dist/utils/go-await.mjs +1 -1
- package/dist/utils/handle.d.mts +1 -1
- package/dist/utils/handle.mjs +2 -2
- package/dist/utils/html-renderer.d.mts +1 -1
- package/dist/utils/html-renderer.mjs +1 -2
- package/dist/utils/index.d.mts +16 -16
- package/dist/utils/index.mjs +13 -21
- package/dist/utils/parsers.d.mts +1 -1
- package/dist/utils/parsers.mjs +1 -1
- package/dist/utils/path-matcher.mjs +1 -2
- package/dist/utils/request-validator.d.mts +2 -2
- package/dist/utils/request-validator.mjs +3 -3
- package/dist/utils/response.d.mts +4 -4
- package/dist/utils/response.mjs +1 -2
- package/dist/utils/route-registry.d.mts +3 -3
- package/dist/utils/route-registry.mjs +1 -2
- package/dist/utils/sse.d.mts +2 -2
- package/dist/utils/sse.mjs +3 -3
- package/dist/utils/validators/validators.d.mts +1 -1
- package/dist/utils/validators/validators.mjs +1 -1
- package/dist/{validators-CPmnj_y9.d.mts → validators-Ch71zkT8.d.mts} +1 -1
- package/dist/{validators-WXQ49LcR.mjs → validators-DBkyw6BG.mjs} +1 -1
- package/dist/{validators-WXQ49LcR.mjs.map → validators-DBkyw6BG.mjs.map} +1 -1
- package/package.json +7 -2
- package/dist/base-server-DMhpmq5v.mjs +0 -113
- package/dist/chunk-DW4-Jl94.mjs +0 -37
- package/dist/component-server-DIgykV0F.mjs +0 -124
- package/dist/dependency-manager-BpN2YufZ.mjs +0 -61
- package/dist/monitoring/index.mjs.map +0 -1
- package/dist/monitoring/types.d.mts +0 -150
- package/dist/path-matcher-BNaaJgI3.mjs +0 -62
- package/dist/radix-tree-Qxr-QpCx.mjs +0 -157
- package/dist/route-registry-BVvbghgH.mjs +0 -225
- package/dist/router/index.mjs.map +0 -1
- package/dist/schema-CflsMJuG.mjs +0 -1
- package/dist/server-BttM6Ssc.mjs +0 -88
- package/dist/server-BttM6Ssc.mjs.map +0 -1
- package/dist/server-C3yoZXNs.mjs +0 -136
- package/dist/utils/index.mjs.map +0 -1
- /package/dist/{component-route-BKUFoJ5P.mjs → component-route-DNgAj6VC.mjs} +0 -0
- /package/dist/{index-CTHojwxd.d.mts → index-CREkvfw9.d.mts} +0 -0
- /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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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 {
|
|
189
|
-
//# sourceMappingURL=middleware-
|
|
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-
|
|
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":";;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;;AAIJ,MAAM,eAAe,EAAE,gBAAgB,oBAAoB;AAC3D,MAAM,eAAe,EAAE,gBAAgB,cAAc;;;;;AAMrD,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;;;AAIjE,IAAI,cAAc,UAAU,aAC1B,IAAI,SAAS,KAAK,cAAc;;AAGlC,IAAI,gBAAgB,UAAU,UAC5B,IAAI,SAAS,KAAK,eAAe;;AAGnC,IAAI,aAAa,UAAU,WACzB,IAAI,SAAS,KAAK,YAAY;;AAGhC,IAAI,YAAY,UAAU,YACxB,IAAI,SAAS,KAAK,YAAY;;AAGhC,IAAI,YAAY,UAAU,WACxB,IAAI,SAAS,KAAK,WAAW;;AAG/B,IAAI,iBAAiB,UAAU,cAC7B,IAAI,SAAS,KAAK,uBAAuB;;AAG3C,IAAI,WAAW,UAAU,aACvB,IAAI,SAAS,KAAK,oBAAoB;;AAGxC,IAAI,YAAY,UAAU,cACxB,IAAI,SAAS,KAAK,iBAAiB;;;;;;AClMrC,IAAa,cAAb,cAAiC,MAAM;CACrC;CACA;CACA;CAEA,YACE,SACA,UAKI,EAAE,EACN;AACA,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,SAAS,QAAQ,UAAU;AAChC,OAAK,OAAO,QAAQ,QAAQ;AAC5B,OAAK,SAAS,QAAQ,UAAU;AAChC,MAAI,QAAQ,MAAO,CAAC,KAAa,QAAQ,QAAQ;;;;;;AAOrD,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;;;;AAKtB,MAAM,eAA2B,OAAO,KAAK,SAAS;AACpD,KAAI;AACF,SAAO,MAAM,MAAM;UACZC,OAAK;AACZ,UAAQ,MAAM,WAAWA,MAAI;AAE7B,MAAIA,iBAAe,YACjB,QAAO,KACL;GACE,OAAOA,MAAI;GACX,SAASA,MAAI,SAASA,MAAI,UAAU;GACrC,EACDA,MAAI,OACL;AAGH,SAAO,KAAK;GAAE,OAAO;GAAkB,SAAS;GAAW,EAAE,IAAI"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as Middleware, r as Handler } from "./types-
|
|
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-
|
|
23
|
+
//# sourceMappingURL=middleware-KXEoefLX.d.mts.map
|
package/dist/middleware.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "./schema-
|
|
2
|
-
import "./index-
|
|
3
|
-
import { n as composeMiddleware, t as VafastError } from "./middleware-
|
|
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 };
|
package/dist/middleware.mjs
CHANGED
|
@@ -1,33 +1,8 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import "../base-server-
|
|
4
|
-
import "../server-
|
|
5
|
-
import "../component-server-
|
|
6
|
-
import "../index-
|
|
7
|
-
import {
|
|
8
|
-
|
|
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
|
-
|
|
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-
|
|
2
|
-
import "../index-
|
|
3
|
-
import "../base-server-
|
|
4
|
-
import { t as Server } from "../server-
|
|
5
|
-
import "../component-server-
|
|
6
|
-
import "../index-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
34
|
-
heapTotal:
|
|
121
|
+
heapUsed: string;
|
|
122
|
+
heapTotal: string;
|
|
35
123
|
};
|
|
124
|
+
/** 最近请求 */
|
|
125
|
+
recentRequests: MonitoringMetrics[];
|
|
36
126
|
}
|
|
127
|
+
/** 带监控的 Server */
|
|
37
128
|
interface MonitoredServer extends Server {
|
|
38
|
-
getMonitoringStatus():
|
|
39
|
-
getMonitoringMetrics():
|
|
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
|
-
|
|
45
|
-
|
|
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,
|
|
168
|
+
export { MemoryInfo, MonitoredServer, MonitoringConfig, MonitoringMetrics, MonitoringStatus, PathStats, StatusCodeDistribution, TimeWindowStats, createMonitoredServer, withMonitoring };
|
|
48
169
|
//# sourceMappingURL=native-monitor.d.mts.map
|