vafast 0.4.4 → 0.4.8
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 +43 -8
- package/dist/base-server-B7MYJNsl.mjs +112 -0
- package/dist/{base-server-CSkyjEaY.mjs.map → base-server-B7MYJNsl.mjs.map} +1 -1
- package/dist/{base-server-DvGS6ATg.d.mts → base-server-DLxtulAO.d.mts} +2 -2
- package/dist/{base64url-CwQnvZyp.mjs → base64url-C2zopQdH.mjs} +1 -1
- package/dist/{base64url-CwQnvZyp.mjs.map → base64url-C2zopQdH.mjs.map} +1 -1
- package/dist/{base64url-0N9uQPjZ.d.mts → base64url-Dwi2Afhc.d.mts} +1 -1
- package/dist/{component-route-CZawYn61.d.mts → component-route-nrrO0iSI.d.mts} +2 -2
- package/dist/{component-router-CErbGh2A.mjs → component-router-RwPL20vN.mjs} +10 -11
- package/dist/{component-router-CErbGh2A.mjs.map → component-router-RwPL20vN.mjs.map} +1 -1
- package/dist/component-server-DomPJ_7S.mjs +119 -0
- package/dist/{component-server-DAbIyIPI.mjs.map → component-server-DomPJ_7S.mjs.map} +1 -1
- package/dist/{component-server-CGzU4bss.d.mts → component-server-JqpDC7wy.d.mts} +4 -4
- package/dist/{create-handler-Bo-hvWp-.d.mts → create-handler-DKw-sQOV.d.mts} +2 -2
- package/dist/{create-handler-B_pfxh3m.mjs → create-handler-RconAcAB.mjs} +5 -6
- package/dist/{create-handler-B_pfxh3m.mjs.map → create-handler-RconAcAB.mjs.map} +1 -1
- package/dist/defineRoute.d.mts +3 -3
- package/dist/{dependency-manager-C6vFWP2L.d.mts → dependency-manager-C3_7ic4h.d.mts} +1 -1
- package/dist/dependency-manager-DCmh7xFc.mjs +60 -0
- package/dist/{dependency-manager-Czg7Po2j.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-BGAGJfrB.mjs → go-await-C4ZdEUwY.mjs} +1 -1
- package/dist/{go-await-BGAGJfrB.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-Csjtywdc.mjs → handle-BxJwSvV0.mjs} +2 -2
- package/dist/{handle-Csjtywdc.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-CczE8mwC.mjs → html-renderer-DTtJ_Yic.mjs} +26 -27
- package/dist/{html-renderer-CczE8mwC.mjs.map → html-renderer-DTtJ_Yic.mjs.map} +1 -1
- package/dist/{index-Ci52vt55.d.mts → index-CEfOqqvd.d.mts} +5 -5
- package/dist/index.d.mts +25 -25
- package/dist/index.mjs +21 -25
- 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-CewKbtb4.mjs +182 -0
- package/dist/middleware-CewKbtb4.mjs.map +1 -0
- package/dist/middleware-KXEoefLX.d.mts +23 -0
- package/dist/middleware.d.mts +4 -25
- package/dist/middleware.mjs +1 -2
- package/dist/monitoring/index.d.mts +8 -33
- package/dist/monitoring/index.mjs +1 -25
- package/dist/monitoring/native-monitor.d.mts +148 -27
- package/dist/monitoring/native-monitor.mjs +320 -114
- 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-CI_TZ7pO.mjs → parsers-DpH_mD0H.mjs} +1 -1
- package/dist/{parsers-CI_TZ7pO.mjs.map → parsers-DpH_mD0H.mjs.map} +1 -1
- package/dist/path-matcher-CGczAIl_.mjs +61 -0
- package/dist/{path-matcher-73cJd5Y7.mjs.map → path-matcher-CGczAIl_.mjs.map} +1 -1
- package/dist/radix-tree-qqSjnVXF.mjs +163 -0
- package/dist/{radix-tree-D0XYaJKb.mjs.map → radix-tree-qqSjnVXF.mjs.map} +1 -1
- package/dist/{request-CKC3Ox6M.mjs → request-B-Nct5f7.mjs} +1 -1
- package/dist/{request-CKC3Ox6M.mjs.map → request-B-Nct5f7.mjs.map} +1 -1
- package/dist/{request-validator-_J5HloRq.mjs → request-validator-Bz9X48FX.mjs} +3 -3
- package/dist/{request-validator-_J5HloRq.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-BMfdEcTm.d.mts +48 -0
- package/dist/{response-Cf5FgtmE.mjs → response-BnkYA4pj.mjs} +1 -1
- package/dist/{response-Cf5FgtmE.mjs.map → response-BnkYA4pj.mjs.map} +1 -1
- package/dist/{route-BJ-40LNI.d.mts → route-6A7umH7b.d.mts} +2 -2
- package/dist/{route-9pAVP1GC.mjs → route-Ds53PR4M.mjs} +1 -1
- package/dist/{route-9pAVP1GC.mjs.map → route-Ds53PR4M.mjs.map} +1 -1
- package/dist/{route-registry--tx1PNui.d.mts → route-registry-CmABJA2V.d.mts} +2 -2
- package/dist/route-registry-emTmRrWQ.mjs +226 -0
- package/dist/{route-registry-mcTG0M-t.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-CPQudJpE.d.mts → schema-B6DFN5c2.d.mts} +1 -1
- package/dist/{serve-Be6NvuQk.mjs → serve-48LEIkPa.mjs} +3 -3
- package/dist/{serve-Be6NvuQk.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 -6
- package/dist/server/server-factory.d.mts +6 -6
- package/dist/server/server-factory.mjs +5 -4
- package/dist/server/server.d.mts +4 -4
- package/dist/server/server.mjs +2 -2
- package/dist/server-C75o1b-a.mjs +70 -0
- package/dist/server-C75o1b-a.mjs.map +1 -0
- package/dist/{server-D9gjszHe.d.mts → server-DGA3dd5s.d.mts} +3 -3
- package/dist/server-L_FNwdap.mjs +137 -0
- package/dist/{server-BmPKs8oM.mjs.map → server-L_FNwdap.mjs.map} +1 -1
- package/dist/{sse-BMM6KTfy.d.mts → sse-BgLhEo43.d.mts} +2 -2
- package/dist/{sse-BT5yyLgX.mjs → sse-CBl-szg1.mjs} +3 -3
- package/dist/{sse-BT5yyLgX.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-DuTa8AVN.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 -3
- 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 +17 -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 +5 -2
- package/dist/utils/response.mjs +2 -3
- 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-BBrGePBr.mjs → validators-DBkyw6BG.mjs} +1 -1
- package/dist/{validators-BBrGePBr.mjs.map → validators-DBkyw6BG.mjs.map} +1 -1
- package/package.json +6 -1
- package/dist/base-server-CSkyjEaY.mjs +0 -113
- package/dist/chunk-DW4-Jl94.mjs +0 -37
- package/dist/component-server-DAbIyIPI.mjs +0 -124
- package/dist/dependency-manager-Czg7Po2j.mjs +0 -61
- package/dist/middleware-Byp3Hjae.mjs +0 -59
- package/dist/middleware-Byp3Hjae.mjs.map +0 -1
- package/dist/monitoring/index.mjs.map +0 -1
- package/dist/monitoring/types.d.mts +0 -150
- package/dist/path-matcher-73cJd5Y7.mjs +0 -62
- package/dist/radix-tree-D0XYaJKb.mjs +0 -157
- package/dist/response-A-sZZiJ7.d.mts +0 -21
- package/dist/response-DXg4i_yh.mjs +0 -97
- package/dist/response-DXg4i_yh.mjs.map +0 -1
- package/dist/route-registry-mcTG0M-t.mjs +0 -225
- package/dist/router/index.mjs.map +0 -1
- package/dist/schema-CtVBNfnQ.mjs +0 -1
- package/dist/server-BmPKs8oM.mjs +0 -137
- package/dist/server-Cbd3Ia51.mjs +0 -88
- package/dist/server-Cbd3Ia51.mjs.map +0 -1
- package/dist/utils/index.mjs.map +0 -1
- /package/dist/{component-route-CYxLOnci.mjs → component-route-DNgAj6VC.mjs} +0 -0
- /package/dist/{index-CzItj62a.d.mts → index-CREkvfw9.d.mts} +0 -0
- /package/dist/{monitoring/types.mjs → schema-1fwiv7cm.mjs} +0 -0
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
//#region src/monitoring/types.d.ts
|
|
2
|
-
/**
|
|
3
|
-
* 性能监控系统类型定义
|
|
4
|
-
*
|
|
5
|
-
* @author Framework Team
|
|
6
|
-
* @version 1.0.0
|
|
7
|
-
* @license MIT
|
|
8
|
-
*/
|
|
9
|
-
interface BaseMetrics {
|
|
10
|
-
timestamp: number;
|
|
11
|
-
requestId: string;
|
|
12
|
-
method: string;
|
|
13
|
-
path: string;
|
|
14
|
-
statusCode: number;
|
|
15
|
-
userAgent?: string;
|
|
16
|
-
ip?: string;
|
|
17
|
-
}
|
|
18
|
-
interface PerformanceMetrics extends BaseMetrics {
|
|
19
|
-
totalTime: number;
|
|
20
|
-
routeMatchTime: number;
|
|
21
|
-
validationTime: number;
|
|
22
|
-
handlerTime: number;
|
|
23
|
-
responseTime: number;
|
|
24
|
-
memoryUsage: {
|
|
25
|
-
heapUsed: number;
|
|
26
|
-
heapTotal: number;
|
|
27
|
-
external: number;
|
|
28
|
-
rss: number;
|
|
29
|
-
};
|
|
30
|
-
validation: {
|
|
31
|
-
bodyValidated: boolean;
|
|
32
|
-
queryValidated: boolean;
|
|
33
|
-
paramsValidated: boolean;
|
|
34
|
-
headersValidated: boolean;
|
|
35
|
-
cookiesValidated: boolean;
|
|
36
|
-
validationErrors: number;
|
|
37
|
-
};
|
|
38
|
-
routing: {
|
|
39
|
-
routeFound: boolean;
|
|
40
|
-
middlewareCount: number;
|
|
41
|
-
dynamicParams: number;
|
|
42
|
-
};
|
|
43
|
-
error?: {
|
|
44
|
-
type: string;
|
|
45
|
-
message: string;
|
|
46
|
-
stack?: string;
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
interface AggregatedMetrics {
|
|
50
|
-
timeRange: {
|
|
51
|
-
start: number;
|
|
52
|
-
end: number;
|
|
53
|
-
};
|
|
54
|
-
requests: {
|
|
55
|
-
total: number;
|
|
56
|
-
successful: number;
|
|
57
|
-
failed: number;
|
|
58
|
-
byMethod: Record<string, number>;
|
|
59
|
-
byPath: Record<string, number>;
|
|
60
|
-
byStatusCode: Record<number, number>;
|
|
61
|
-
};
|
|
62
|
-
performance: {
|
|
63
|
-
avgTotalTime: number;
|
|
64
|
-
avgRouteMatchTime: number;
|
|
65
|
-
avgValidationTime: number;
|
|
66
|
-
avgHandlerTime: number;
|
|
67
|
-
avgResponseTime: number;
|
|
68
|
-
p50TotalTime: number;
|
|
69
|
-
p90TotalTime: number;
|
|
70
|
-
p95TotalTime: number;
|
|
71
|
-
p99TotalTime: number;
|
|
72
|
-
minTotalTime: number;
|
|
73
|
-
maxTotalTime: number;
|
|
74
|
-
};
|
|
75
|
-
memory: {
|
|
76
|
-
avgHeapUsed: number;
|
|
77
|
-
avgHeapTotal: number;
|
|
78
|
-
maxHeapUsed: number;
|
|
79
|
-
maxHeapTotal: number;
|
|
80
|
-
};
|
|
81
|
-
validation: {
|
|
82
|
-
totalValidations: number;
|
|
83
|
-
validationErrors: number;
|
|
84
|
-
validationSuccessRate: number;
|
|
85
|
-
};
|
|
86
|
-
routing: {
|
|
87
|
-
totalRoutes: number;
|
|
88
|
-
routesWithMiddleware: number;
|
|
89
|
-
dynamicRoutes: number;
|
|
90
|
-
routeHitCount: Record<string, number>;
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
interface MonitoringConfig {
|
|
94
|
-
enabled: boolean;
|
|
95
|
-
retention: {
|
|
96
|
-
maxRecords: number;
|
|
97
|
-
maxAge: number;
|
|
98
|
-
cleanupInterval: number;
|
|
99
|
-
};
|
|
100
|
-
samplingRate: number;
|
|
101
|
-
recordErrors: boolean;
|
|
102
|
-
recordBodySize: boolean;
|
|
103
|
-
recordResponseSize: boolean;
|
|
104
|
-
thresholds: {
|
|
105
|
-
slowRequest: number;
|
|
106
|
-
highMemoryUsage: number;
|
|
107
|
-
errorRate: number;
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
interface MonitoringEvent {
|
|
111
|
-
type: "request_start" | "request_end" | "validation_start" | "validation_end" | "error";
|
|
112
|
-
timestamp: number;
|
|
113
|
-
requestId: string;
|
|
114
|
-
data: any;
|
|
115
|
-
}
|
|
116
|
-
interface PerformanceReport {
|
|
117
|
-
id: string;
|
|
118
|
-
timestamp: number;
|
|
119
|
-
timeRange: {
|
|
120
|
-
start: number;
|
|
121
|
-
end: number;
|
|
122
|
-
};
|
|
123
|
-
summary: {
|
|
124
|
-
totalRequests: number;
|
|
125
|
-
avgResponseTime: number;
|
|
126
|
-
errorRate: number;
|
|
127
|
-
memoryUsage: number;
|
|
128
|
-
};
|
|
129
|
-
details: {
|
|
130
|
-
topSlowestRoutes: Array<{
|
|
131
|
-
path: string;
|
|
132
|
-
avgTime: number;
|
|
133
|
-
count: number;
|
|
134
|
-
}>;
|
|
135
|
-
topErrorRoutes: Array<{
|
|
136
|
-
path: string;
|
|
137
|
-
errorCount: number;
|
|
138
|
-
errorRate: number;
|
|
139
|
-
}>;
|
|
140
|
-
memoryTrend: Array<{
|
|
141
|
-
timestamp: number;
|
|
142
|
-
heapUsed: number;
|
|
143
|
-
}>;
|
|
144
|
-
responseTimeDistribution: Record<string, number>;
|
|
145
|
-
};
|
|
146
|
-
recommendations: string[];
|
|
147
|
-
}
|
|
148
|
-
//#endregion
|
|
149
|
-
export { AggregatedMetrics, BaseMetrics, MonitoringConfig, MonitoringEvent, PerformanceMetrics, PerformanceReport };
|
|
150
|
-
//# sourceMappingURL=types.d.mts.map
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/utils/path-matcher.ts
|
|
4
|
-
var PathMatcher;
|
|
5
|
-
var init_path_matcher = __esmMin((() => {
|
|
6
|
-
PathMatcher = class {
|
|
7
|
-
/**
|
|
8
|
-
* 路径匹配
|
|
9
|
-
*/
|
|
10
|
-
static matchPath(pattern, path) {
|
|
11
|
-
const patternParts = pattern.split("/").filter(Boolean);
|
|
12
|
-
const pathParts = path.split("/").filter(Boolean);
|
|
13
|
-
if (patternParts.length !== pathParts.length) return false;
|
|
14
|
-
for (let i = 0; i < patternParts.length; i++) if (patternParts[i] !== pathParts[i] && !patternParts[i].startsWith(":")) return false;
|
|
15
|
-
return true;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* 提取路径参数
|
|
19
|
-
*/
|
|
20
|
-
static extractParams(pattern, path) {
|
|
21
|
-
const params = {};
|
|
22
|
-
const patternParts = pattern.split("/").filter(Boolean);
|
|
23
|
-
const pathParts = path.split("/").filter(Boolean);
|
|
24
|
-
for (let i = 0; i < patternParts.length; i++) if (patternParts[i].startsWith(":")) {
|
|
25
|
-
const paramName = patternParts[i].slice(1);
|
|
26
|
-
params[paramName] = pathParts[i];
|
|
27
|
-
}
|
|
28
|
-
return params;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* 计算路径特异性分数
|
|
32
|
-
* 用于路由排序:静态 > 动态(:param) > 通配符(*)
|
|
33
|
-
*/
|
|
34
|
-
static calculatePathScore(path) {
|
|
35
|
-
const parts = path.split("/").filter(Boolean);
|
|
36
|
-
let score = 0;
|
|
37
|
-
for (const p of parts) if (p === "*") score += 1;
|
|
38
|
-
else if (p.startsWith(":")) score += 2;
|
|
39
|
-
else score += 3;
|
|
40
|
-
return score * 10 + parts.length;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* 判断两个路径是否可能冲突
|
|
44
|
-
*/
|
|
45
|
-
static pathsMayConflict(path1, path2) {
|
|
46
|
-
const parts1 = path1.split("/").filter(Boolean);
|
|
47
|
-
const parts2 = path2.split("/").filter(Boolean);
|
|
48
|
-
if (parts1.length !== parts2.length) return false;
|
|
49
|
-
for (let i = 0; i < parts1.length; i++) {
|
|
50
|
-
const p1 = parts1[i];
|
|
51
|
-
const p2 = parts2[i];
|
|
52
|
-
if (!p1.startsWith(":") && !p1.startsWith("*") && !p2.startsWith(":") && !p2.startsWith("*") && p1 !== p2) return false;
|
|
53
|
-
if (p1 === "*" && p2.startsWith(":") || p2 === "*" && p1.startsWith(":")) return true;
|
|
54
|
-
}
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
}));
|
|
59
|
-
|
|
60
|
-
//#endregion
|
|
61
|
-
export { init_path_matcher as n, PathMatcher as t };
|
|
62
|
-
//# sourceMappingURL=path-matcher-73cJd5Y7.mjs.map
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/router/radix-tree.ts
|
|
4
|
-
var RadixRouter;
|
|
5
|
-
var init_radix_tree = __esmMin((() => {
|
|
6
|
-
RadixRouter = class {
|
|
7
|
-
root;
|
|
8
|
-
constructor() {
|
|
9
|
-
this.root = this.createNode("");
|
|
10
|
-
}
|
|
11
|
-
createNode(path) {
|
|
12
|
-
return {
|
|
13
|
-
path,
|
|
14
|
-
children: Object.create(null),
|
|
15
|
-
handlers: Object.create(null)
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
/** 分割路径 */
|
|
19
|
-
splitPath(path) {
|
|
20
|
-
return path.split("/").filter(Boolean);
|
|
21
|
-
}
|
|
22
|
-
/** 编译器函数 - 用于预编译中间件链 */
|
|
23
|
-
compiler;
|
|
24
|
-
/** 设置中间件编译器 */
|
|
25
|
-
setCompiler(compiler) {
|
|
26
|
-
this.compiler = compiler;
|
|
27
|
-
}
|
|
28
|
-
/** 注册路由 */
|
|
29
|
-
register(method, pattern, handler, middleware = []) {
|
|
30
|
-
const segments = this.splitPath(pattern);
|
|
31
|
-
let node = this.root;
|
|
32
|
-
for (const segment of segments) {
|
|
33
|
-
const firstChar = segment[0];
|
|
34
|
-
if (firstChar === ":") {
|
|
35
|
-
if (!node.paramChild) {
|
|
36
|
-
node.paramChild = this.createNode(segment);
|
|
37
|
-
node.paramChild.paramName = segment.substring(1);
|
|
38
|
-
}
|
|
39
|
-
node = node.paramChild;
|
|
40
|
-
} else if (firstChar === "*") {
|
|
41
|
-
if (!node.wildcardChild) {
|
|
42
|
-
node.wildcardChild = this.createNode(segment);
|
|
43
|
-
node.wildcardChild.paramName = segment.length > 1 ? segment.substring(1) : "*";
|
|
44
|
-
}
|
|
45
|
-
node = node.wildcardChild;
|
|
46
|
-
break;
|
|
47
|
-
} else {
|
|
48
|
-
if (!node.children[segment]) node.children[segment] = this.createNode(segment);
|
|
49
|
-
node = node.children[segment];
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
const routeHandler = {
|
|
53
|
-
handler,
|
|
54
|
-
middleware
|
|
55
|
-
};
|
|
56
|
-
if (this.compiler && middleware.length === 0) routeHandler.compiled = this.compiler([], handler);
|
|
57
|
-
node.handlers[method] = routeHandler;
|
|
58
|
-
}
|
|
59
|
-
/** 预编译所有路由(在添加全局中间件后调用) */
|
|
60
|
-
precompileAll(globalMiddleware) {
|
|
61
|
-
if (!this.compiler) return;
|
|
62
|
-
this.precompileNode(this.root, globalMiddleware);
|
|
63
|
-
}
|
|
64
|
-
precompileNode(node, globalMiddleware) {
|
|
65
|
-
for (const method in node.handlers) {
|
|
66
|
-
const routeHandler = node.handlers[method];
|
|
67
|
-
if (routeHandler) {
|
|
68
|
-
const allMiddleware = [...globalMiddleware, ...routeHandler.middleware];
|
|
69
|
-
routeHandler.compiled = this.compiler(allMiddleware, routeHandler.handler);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
for (const key in node.children) this.precompileNode(node.children[key], globalMiddleware);
|
|
73
|
-
if (node.paramChild) this.precompileNode(node.paramChild, globalMiddleware);
|
|
74
|
-
if (node.wildcardChild) this.precompileNode(node.wildcardChild, globalMiddleware);
|
|
75
|
-
}
|
|
76
|
-
/** 匹配路由 */
|
|
77
|
-
match(method, path) {
|
|
78
|
-
const segments = this.splitPath(path);
|
|
79
|
-
const params = Object.create(null);
|
|
80
|
-
const node = this.matchNode(this.root, segments, 0, params);
|
|
81
|
-
if (!node) return null;
|
|
82
|
-
const routeHandler = node.handlers[method];
|
|
83
|
-
if (!routeHandler) return null;
|
|
84
|
-
return {
|
|
85
|
-
handler: routeHandler.handler,
|
|
86
|
-
middleware: routeHandler.middleware,
|
|
87
|
-
params,
|
|
88
|
-
compiled: routeHandler.compiled
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
/** 递归匹配节点 (优先级: 静态 > 动态参数 > 通配符) */
|
|
92
|
-
matchNode(node, segments, index, params) {
|
|
93
|
-
if (index === segments.length) {
|
|
94
|
-
for (const method in node.handlers) if (node.handlers[method]) return node;
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
const segment = segments[index];
|
|
98
|
-
const staticChild = node.children[segment];
|
|
99
|
-
if (staticChild) {
|
|
100
|
-
const result = this.matchNode(staticChild, segments, index + 1, params);
|
|
101
|
-
if (result) return result;
|
|
102
|
-
}
|
|
103
|
-
if (node.paramChild) {
|
|
104
|
-
const paramName = node.paramChild.paramName;
|
|
105
|
-
const oldValue = params[paramName];
|
|
106
|
-
params[paramName] = segment;
|
|
107
|
-
const result = this.matchNode(node.paramChild, segments, index + 1, params);
|
|
108
|
-
if (result) return result;
|
|
109
|
-
if (oldValue === void 0) delete params[paramName];
|
|
110
|
-
else params[paramName] = oldValue;
|
|
111
|
-
}
|
|
112
|
-
if (node.wildcardChild) {
|
|
113
|
-
params[node.wildcardChild.paramName || "*"] = segments.slice(index).join("/");
|
|
114
|
-
return node.wildcardChild;
|
|
115
|
-
}
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
/** 获取路径允许的 HTTP 方法 */
|
|
119
|
-
getAllowedMethods(path) {
|
|
120
|
-
const segments = this.splitPath(path);
|
|
121
|
-
const node = this.findNode(segments);
|
|
122
|
-
if (!node) return [];
|
|
123
|
-
const methods = [];
|
|
124
|
-
for (const method in node.handlers) if (node.handlers[method]) methods.push(method);
|
|
125
|
-
return methods;
|
|
126
|
-
}
|
|
127
|
-
/** 查找节点(不提取参数) */
|
|
128
|
-
findNode(segments) {
|
|
129
|
-
let node = this.root;
|
|
130
|
-
for (const segment of segments) if (node.children[segment]) node = node.children[segment];
|
|
131
|
-
else if (node.paramChild) node = node.paramChild;
|
|
132
|
-
else if (node.wildcardChild) return node.wildcardChild;
|
|
133
|
-
else return null;
|
|
134
|
-
return node;
|
|
135
|
-
}
|
|
136
|
-
/** 获取所有已注册的路由 */
|
|
137
|
-
getRoutes() {
|
|
138
|
-
const routes = [];
|
|
139
|
-
this.collectRoutes(this.root, "", routes);
|
|
140
|
-
return routes;
|
|
141
|
-
}
|
|
142
|
-
collectRoutes(node, prefix, routes) {
|
|
143
|
-
const currentPath = prefix + (node.path ? "/" + node.path : "");
|
|
144
|
-
for (const method in node.handlers) if (node.handlers[method]) routes.push({
|
|
145
|
-
method,
|
|
146
|
-
path: currentPath || "/"
|
|
147
|
-
});
|
|
148
|
-
for (const key in node.children) this.collectRoutes(node.children[key], currentPath, routes);
|
|
149
|
-
if (node.paramChild) this.collectRoutes(node.paramChild, currentPath, routes);
|
|
150
|
-
if (node.wildcardChild) this.collectRoutes(node.wildcardChild, currentPath, routes);
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
}));
|
|
154
|
-
|
|
155
|
-
//#endregion
|
|
156
|
-
export { init_radix_tree as n, RadixRouter as t };
|
|
157
|
-
//# sourceMappingURL=radix-tree-D0XYaJKb.mjs.map
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
//#region src/utils/response.d.ts
|
|
2
|
-
/** 生成 JSON 响应 */
|
|
3
|
-
declare function json(data: unknown, status?: number, headers?: HeadersInit): Response;
|
|
4
|
-
/**
|
|
5
|
-
* 类型特化的响应映射
|
|
6
|
-
* 根据返回值类型直接生成 Response,避免不必要的检查
|
|
7
|
-
*/
|
|
8
|
-
declare function mapResponse(response: unknown): Response;
|
|
9
|
-
/** 生成重定向响应 */
|
|
10
|
-
declare function redirect(location: string, status?: 301 | 302): Response;
|
|
11
|
-
/** 生成纯文本响应 */
|
|
12
|
-
declare function text(content: string, status?: number, headers?: HeadersInit): Response;
|
|
13
|
-
/** 生成HTML响应 */
|
|
14
|
-
declare function html(content: string, status?: number, headers?: HeadersInit): Response;
|
|
15
|
-
/** 生成空响应(204 No Content) */
|
|
16
|
-
declare function empty(status?: number, headers?: HeadersInit): Response;
|
|
17
|
-
/** 生成流式响应 */
|
|
18
|
-
declare function stream(stream: ReadableStream, status?: number, headers?: HeadersInit): Response;
|
|
19
|
-
//#endregion
|
|
20
|
-
export { redirect as a, mapResponse as i, html as n, stream as o, json as r, text as s, empty as t };
|
|
21
|
-
//# sourceMappingURL=response-A-sZZiJ7.d.mts.map
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/utils/response.ts
|
|
4
|
-
/** 生成 JSON 响应 */
|
|
5
|
-
function json(data, status = 200, headers = {}) {
|
|
6
|
-
const body = JSON.stringify(data);
|
|
7
|
-
if (Object.keys(headers).length === 0) return new Response(body, {
|
|
8
|
-
status,
|
|
9
|
-
headers: { "Content-Type": "application/json" }
|
|
10
|
-
});
|
|
11
|
-
const h = new Headers({
|
|
12
|
-
"Content-Type": "application/json",
|
|
13
|
-
...headers
|
|
14
|
-
});
|
|
15
|
-
return new Response(body, {
|
|
16
|
-
status,
|
|
17
|
-
headers: h
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* 类型特化的响应映射
|
|
22
|
-
* 根据返回值类型直接生成 Response,避免不必要的检查
|
|
23
|
-
*/
|
|
24
|
-
function mapResponse(response) {
|
|
25
|
-
if (response instanceof Response) return response;
|
|
26
|
-
switch (response?.constructor?.name) {
|
|
27
|
-
case "String": return new Response(response, { headers: TEXT_HEADERS });
|
|
28
|
-
case "Object":
|
|
29
|
-
case "Array": return new Response(JSON.stringify(response), { headers: JSON_HEADERS });
|
|
30
|
-
case "Number":
|
|
31
|
-
case "Boolean": return new Response(String(response), { headers: TEXT_HEADERS });
|
|
32
|
-
case void 0: return new Response(null, { status: 204 });
|
|
33
|
-
case "ReadableStream": return new Response(response);
|
|
34
|
-
case "Blob": return new Response(response);
|
|
35
|
-
case "ArrayBuffer": return new Response(response);
|
|
36
|
-
case "Uint8Array": return new Response(response);
|
|
37
|
-
default:
|
|
38
|
-
if (response instanceof Promise) return response.then(mapResponse);
|
|
39
|
-
return new Response(JSON.stringify(response), { headers: JSON_HEADERS });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/** 生成重定向响应 */
|
|
43
|
-
function redirect(location, status = 302) {
|
|
44
|
-
return new Response(null, {
|
|
45
|
-
status,
|
|
46
|
-
headers: { Location: location }
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
/** 生成纯文本响应 */
|
|
50
|
-
function text(content, status = 200, headers = {}) {
|
|
51
|
-
const h = new Headers({
|
|
52
|
-
"Content-Type": "text/plain; charset=utf-8",
|
|
53
|
-
...headers
|
|
54
|
-
});
|
|
55
|
-
return new Response(content, {
|
|
56
|
-
status,
|
|
57
|
-
headers: h
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
/** 生成HTML响应 */
|
|
61
|
-
function html(content, status = 200, headers = {}) {
|
|
62
|
-
const h = new Headers({
|
|
63
|
-
"Content-Type": "text/html; charset=utf-8",
|
|
64
|
-
...headers
|
|
65
|
-
});
|
|
66
|
-
return new Response(content, {
|
|
67
|
-
status,
|
|
68
|
-
headers: h
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
/** 生成空响应(204 No Content) */
|
|
72
|
-
function empty(status = 204, headers = {}) {
|
|
73
|
-
return new Response(null, {
|
|
74
|
-
status,
|
|
75
|
-
headers
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
/** 生成流式响应 */
|
|
79
|
-
function stream(stream$1, status = 200, headers = {}) {
|
|
80
|
-
const h = new Headers({
|
|
81
|
-
"Content-Type": "application/octet-stream",
|
|
82
|
-
...headers
|
|
83
|
-
});
|
|
84
|
-
return new Response(stream$1, {
|
|
85
|
-
status,
|
|
86
|
-
headers: h
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
var JSON_HEADERS, TEXT_HEADERS;
|
|
90
|
-
var init_response = __esmMin((() => {
|
|
91
|
-
JSON_HEADERS = { "Content-Type": "application/json" };
|
|
92
|
-
TEXT_HEADERS = { "Content-Type": "text/plain" };
|
|
93
|
-
}));
|
|
94
|
-
|
|
95
|
-
//#endregion
|
|
96
|
-
export { mapResponse as a, text as c, json as i, html as n, redirect as o, init_response as r, stream as s, empty as t };
|
|
97
|
-
//# sourceMappingURL=response-DXg4i_yh.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"response-DXg4i_yh.mjs","names":["stream"],"sources":["../src/utils/response.ts"],"sourcesContent":["// src/response.ts\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"],"mappings":";;;;AAGA,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;;;;CApHE,eAAe,EAAE,gBAAgB,oBAAoB;CACrD,eAAe,EAAE,gBAAgB,cAAc"}
|