vafast 0.4.6 → 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-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 +6 -1
- 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
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
//#region src/utils/route-registry.ts
|
|
2
|
+
/**
|
|
3
|
+
* 路由注册表
|
|
4
|
+
*
|
|
5
|
+
* 泛型 T 用于定义扩展字段的类型
|
|
6
|
+
*/
|
|
7
|
+
var RouteRegistry = class {
|
|
8
|
+
/** 所有路由元信息 */
|
|
9
|
+
routes = [];
|
|
10
|
+
/** 路由映射表:METHOD:fullPath -> RouteMeta */
|
|
11
|
+
routeMap = /* @__PURE__ */ new Map();
|
|
12
|
+
/** 分类映射表:category -> RouteMeta[] */
|
|
13
|
+
categoryMap = /* @__PURE__ */ new Map();
|
|
14
|
+
constructor(routes) {
|
|
15
|
+
this.buildRegistry(routes);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 构建注册表
|
|
19
|
+
*/
|
|
20
|
+
buildRegistry(routes) {
|
|
21
|
+
for (const route of routes) {
|
|
22
|
+
const meta = {
|
|
23
|
+
method: route.method,
|
|
24
|
+
path: route.path,
|
|
25
|
+
fullPath: route.fullPath,
|
|
26
|
+
name: route.name,
|
|
27
|
+
description: route.description
|
|
28
|
+
};
|
|
29
|
+
for (const key of Object.keys(route)) if (![
|
|
30
|
+
"method",
|
|
31
|
+
"path",
|
|
32
|
+
"fullPath",
|
|
33
|
+
"name",
|
|
34
|
+
"description",
|
|
35
|
+
"handler",
|
|
36
|
+
"middleware",
|
|
37
|
+
"middlewareChain"
|
|
38
|
+
].includes(key)) meta[key] = route[key];
|
|
39
|
+
this.routes.push(meta);
|
|
40
|
+
this.routeMap.set(`${route.method}:${route.fullPath}`, meta);
|
|
41
|
+
const category = this.extractCategory(route.fullPath);
|
|
42
|
+
if (!this.categoryMap.has(category)) this.categoryMap.set(category, []);
|
|
43
|
+
this.categoryMap.get(category).push(meta);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 提取分类(第一段路径)
|
|
48
|
+
*/
|
|
49
|
+
extractCategory(path) {
|
|
50
|
+
return path.split("/").filter(Boolean)[0] || "root";
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 获取所有路由元信息
|
|
54
|
+
*/
|
|
55
|
+
getAll() {
|
|
56
|
+
return [...this.routes];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 按 method + path 查询路由
|
|
60
|
+
*/
|
|
61
|
+
get(method, path) {
|
|
62
|
+
return this.routeMap.get(`${method}:${path}`);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 检查路由是否存在
|
|
66
|
+
*/
|
|
67
|
+
has(method, path) {
|
|
68
|
+
return this.routeMap.has(`${method}:${path}`);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 按分类获取路由
|
|
72
|
+
*/
|
|
73
|
+
getByCategory(category) {
|
|
74
|
+
return this.categoryMap.get(category) || [];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 获取所有分类
|
|
78
|
+
*/
|
|
79
|
+
getCategories() {
|
|
80
|
+
return Array.from(this.categoryMap.keys()).sort();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 筛选有特定字段的路由
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* // 获取所有配置了 webhook 的路由
|
|
88
|
+
* const webhookRoutes = registry.filter('webhook')
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
filter(field) {
|
|
92
|
+
return this.routes.filter((r) => field in r && r[field] !== void 0);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 按条件筛选路由
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* // 获取所有 POST 请求
|
|
100
|
+
* const postRoutes = registry.filterBy(r => r.method === 'POST')
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
filterBy(predicate) {
|
|
104
|
+
return this.routes.filter(predicate);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 获取路由数量
|
|
108
|
+
*/
|
|
109
|
+
get size() {
|
|
110
|
+
return this.routes.length;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 遍历所有路由
|
|
114
|
+
*/
|
|
115
|
+
forEach(callback) {
|
|
116
|
+
this.routes.forEach(callback);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 映射所有路由
|
|
120
|
+
*/
|
|
121
|
+
map(callback) {
|
|
122
|
+
return this.routes.map(callback);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* 创建路由注册表
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* // 定义扩展字段类型
|
|
131
|
+
* interface MyRouteMeta {
|
|
132
|
+
* webhook?: { eventKey: string }
|
|
133
|
+
* permission?: string
|
|
134
|
+
* }
|
|
135
|
+
*
|
|
136
|
+
* // 创建带类型的注册表
|
|
137
|
+
* const registry = createRouteRegistry<MyRouteMeta>(server.getRoutes())
|
|
138
|
+
*
|
|
139
|
+
* // 类型安全的查询
|
|
140
|
+
* const route = registry.get('POST', '/auth/signIn')
|
|
141
|
+
* if (route?.webhook) {
|
|
142
|
+
* console.log(route.webhook.eventKey)
|
|
143
|
+
* }
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
function createRouteRegistry(routes) {
|
|
147
|
+
return new RouteRegistry(routes);
|
|
148
|
+
}
|
|
149
|
+
/** 全局 registry 实例 */
|
|
150
|
+
let globalRegistry = null;
|
|
151
|
+
/**
|
|
152
|
+
* 设置全局 registry(框架内部使用)
|
|
153
|
+
* @internal
|
|
154
|
+
*/
|
|
155
|
+
function setGlobalRegistry(registry) {
|
|
156
|
+
globalRegistry = registry;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 获取全局路由注册表
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```typescript
|
|
163
|
+
* // 在任意文件中
|
|
164
|
+
* import { getRouteRegistry } from 'vafast'
|
|
165
|
+
*
|
|
166
|
+
* const registry = getRouteRegistry()
|
|
167
|
+
* const webhookRoutes = registry.filter('webhook')
|
|
168
|
+
* ```
|
|
169
|
+
*
|
|
170
|
+
* @throws 如果 Server 尚未创建
|
|
171
|
+
*/
|
|
172
|
+
function getRouteRegistry() {
|
|
173
|
+
if (!globalRegistry) throw new Error("RouteRegistry not initialized. Make sure Server is created first.");
|
|
174
|
+
return globalRegistry;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 按 method + path 获取单个路由
|
|
178
|
+
*
|
|
179
|
+
* 便捷函数,无需先获取 registry
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* // 在中间件或接口中
|
|
184
|
+
* import { getRoute } from 'vafast'
|
|
185
|
+
*
|
|
186
|
+
* const route = getRoute('POST', '/auth/signIn')
|
|
187
|
+
* if (route?.webhook) {
|
|
188
|
+
* console.log('This route has webhook:', route.webhook)
|
|
189
|
+
* }
|
|
190
|
+
* ```
|
|
191
|
+
*/
|
|
192
|
+
function getRoute(method, path) {
|
|
193
|
+
return getRouteRegistry().get(method, path);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 获取所有路由
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* import { getAllRoutes } from 'vafast'
|
|
201
|
+
*
|
|
202
|
+
* const routes = getAllRoutes()
|
|
203
|
+
* console.log(`Total ${routes.length} routes`)
|
|
204
|
+
* ```
|
|
205
|
+
*/
|
|
206
|
+
function getAllRoutes() {
|
|
207
|
+
return getRouteRegistry().getAll();
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* 筛选有特定字段的路由
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```typescript
|
|
214
|
+
* import { filterRoutes } from 'vafast'
|
|
215
|
+
*
|
|
216
|
+
* // 获取所有配置了 webhook 的路由
|
|
217
|
+
* const webhookRoutes = filterRoutes('webhook')
|
|
218
|
+
* ```
|
|
219
|
+
*/
|
|
220
|
+
function filterRoutes(field) {
|
|
221
|
+
return getRouteRegistry().filter(field);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
//#endregion
|
|
225
|
+
export { getRoute as a, getAllRoutes as i, createRouteRegistry as n, getRouteRegistry as o, filterRoutes as r, setGlobalRegistry as s, RouteRegistry as t };
|
|
226
|
+
//# sourceMappingURL=route-registry-emTmRrWQ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-registry-
|
|
1
|
+
{"version":3,"file":"route-registry-emTmRrWQ.mjs","names":[],"sources":["../src/utils/route-registry.ts"],"sourcesContent":["/**\n * 路由注册表\n *\n * 提供路由元信息的收集和查询能力\n * 可用于:API 文档生成、Webhook 事件注册、权限检查、审计日志等\n *\n * @example\n * ```typescript\n * // 创建注册表\n * const registry = createRouteRegistry(server.getRoutes())\n *\n * // 查询路由\n * const route = registry.get('POST', '/auth/signIn')\n *\n * // 筛选有 webhook 配置的路由\n * const webhookRoutes = registry.filter('webhook')\n *\n * // 按分类获取\n * const authRoutes = registry.getByCategory('auth')\n * ```\n */\n\nimport type { FlattenedRoute, Method } from '../types'\n\n/**\n * 路由元信息(不含 handler 和 middleware)\n */\nexport interface RouteMeta {\n method: Method\n path: string\n fullPath: string\n name?: string\n description?: string\n /** 扩展字段 */\n [key: string]: unknown\n}\n\n/**\n * 路由注册表\n *\n * 泛型 T 用于定义扩展字段的类型\n */\nexport class RouteRegistry<T extends Record<string, unknown> = Record<string, unknown>> {\n /** 所有路由元信息 */\n private routes: RouteMeta[] = []\n\n /** 路由映射表:METHOD:fullPath -> RouteMeta */\n private routeMap = new Map<string, RouteMeta>()\n\n /** 分类映射表:category -> RouteMeta[] */\n private categoryMap = new Map<string, RouteMeta[]>()\n\n constructor(routes: FlattenedRoute[]) {\n this.buildRegistry(routes)\n }\n\n /**\n * 构建注册表\n */\n private buildRegistry(routes: FlattenedRoute[]): void {\n for (const route of routes) {\n // 提取元信息(排除 handler 和 middleware)\n const meta: RouteMeta = {\n method: route.method,\n path: route.path,\n fullPath: route.fullPath,\n name: route.name,\n description: route.description,\n }\n\n // 复制扩展字段\n for (const key of Object.keys(route)) {\n if (!['method', 'path', 'fullPath', 'name', 'description', 'handler', 'middleware', 'middlewareChain'].includes(key)) {\n meta[key] = route[key as keyof FlattenedRoute]\n }\n }\n\n this.routes.push(meta)\n this.routeMap.set(`${route.method}:${route.fullPath}`, meta)\n\n // 按分类索引\n const category = this.extractCategory(route.fullPath)\n if (!this.categoryMap.has(category)) {\n this.categoryMap.set(category, [])\n }\n this.categoryMap.get(category)!.push(meta)\n }\n }\n\n /**\n * 提取分类(第一段路径)\n */\n private extractCategory(path: string): string {\n const segments = path.split('/').filter(Boolean)\n return segments[0] || 'root'\n }\n\n // ============================================\n // 查询接口\n // ============================================\n\n /**\n * 获取所有路由元信息\n */\n getAll(): RouteMeta[] {\n return [...this.routes]\n }\n\n /**\n * 按 method + path 查询路由\n */\n get(method: string, path: string): (RouteMeta & T) | undefined {\n return this.routeMap.get(`${method}:${path}`) as (RouteMeta & T) | undefined\n }\n\n /**\n * 检查路由是否存在\n */\n has(method: string, path: string): boolean {\n return this.routeMap.has(`${method}:${path}`)\n }\n\n /**\n * 按分类获取路由\n */\n getByCategory(category: string): RouteMeta[] {\n return this.categoryMap.get(category) || []\n }\n\n /**\n * 获取所有分类\n */\n getCategories(): string[] {\n return Array.from(this.categoryMap.keys()).sort()\n }\n\n /**\n * 筛选有特定字段的路由\n *\n * @example\n * ```typescript\n * // 获取所有配置了 webhook 的路由\n * const webhookRoutes = registry.filter('webhook')\n * ```\n */\n filter<K extends string>(field: K): (RouteMeta & Record<K, unknown>)[] {\n return this.routes.filter((r) => field in r && r[field] !== undefined) as (RouteMeta & Record<K, unknown>)[]\n }\n\n /**\n * 按条件筛选路由\n *\n * @example\n * ```typescript\n * // 获取所有 POST 请求\n * const postRoutes = registry.filterBy(r => r.method === 'POST')\n * ```\n */\n filterBy(predicate: (route: RouteMeta) => boolean): RouteMeta[] {\n return this.routes.filter(predicate)\n }\n\n /**\n * 获取路由数量\n */\n get size(): number {\n return this.routes.length\n }\n\n /**\n * 遍历所有路由\n */\n forEach(callback: (route: RouteMeta, index: number) => void): void {\n this.routes.forEach(callback)\n }\n\n /**\n * 映射所有路由\n */\n map<R>(callback: (route: RouteMeta, index: number) => R): R[] {\n return this.routes.map(callback)\n }\n}\n\n/**\n * 创建路由注册表\n *\n * @example\n * ```typescript\n * // 定义扩展字段类型\n * interface MyRouteMeta {\n * webhook?: { eventKey: string }\n * permission?: string\n * }\n *\n * // 创建带类型的注册表\n * const registry = createRouteRegistry<MyRouteMeta>(server.getRoutes())\n *\n * // 类型安全的查询\n * const route = registry.get('POST', '/auth/signIn')\n * if (route?.webhook) {\n * console.log(route.webhook.eventKey)\n * }\n * ```\n */\nexport function createRouteRegistry<T extends Record<string, unknown> = Record<string, unknown>>(\n routes: FlattenedRoute[]\n): RouteRegistry<T> {\n return new RouteRegistry<T>(routes)\n}\n\n// ============================================\n// 全局 Registry(单例模式)\n// ============================================\n\n/** 全局 registry 实例 */\nlet globalRegistry: RouteRegistry | null = null\n\n/**\n * 设置全局 registry(框架内部使用)\n * @internal\n */\nexport function setGlobalRegistry(registry: RouteRegistry): void {\n globalRegistry = registry\n}\n\n/**\n * 获取全局路由注册表\n *\n * @example\n * ```typescript\n * // 在任意文件中\n * import { getRouteRegistry } from 'vafast'\n *\n * const registry = getRouteRegistry()\n * const webhookRoutes = registry.filter('webhook')\n * ```\n *\n * @throws 如果 Server 尚未创建\n */\nexport function getRouteRegistry<T extends Record<string, unknown> = Record<string, unknown>>(): RouteRegistry<T> {\n if (!globalRegistry) {\n throw new Error('RouteRegistry not initialized. Make sure Server is created first.')\n }\n return globalRegistry as RouteRegistry<T>\n}\n\n/**\n * 按 method + path 获取单个路由\n *\n * 便捷函数,无需先获取 registry\n *\n * @example\n * ```typescript\n * // 在中间件或接口中\n * import { getRoute } from 'vafast'\n *\n * const route = getRoute('POST', '/auth/signIn')\n * if (route?.webhook) {\n * console.log('This route has webhook:', route.webhook)\n * }\n * ```\n */\nexport function getRoute<T extends Record<string, unknown> = Record<string, unknown>>(\n method: string,\n path: string\n): (RouteMeta & T) | undefined {\n return getRouteRegistry<T>().get(method, path)\n}\n\n/**\n * 获取所有路由\n *\n * @example\n * ```typescript\n * import { getAllRoutes } from 'vafast'\n *\n * const routes = getAllRoutes()\n * console.log(`Total ${routes.length} routes`)\n * ```\n */\nexport function getAllRoutes(): RouteMeta[] {\n return getRouteRegistry().getAll()\n}\n\n/**\n * 筛选有特定字段的路由\n *\n * @example\n * ```typescript\n * import { filterRoutes } from 'vafast'\n *\n * // 获取所有配置了 webhook 的路由\n * const webhookRoutes = filterRoutes('webhook')\n * ```\n */\nexport function filterRoutes<K extends string>(field: K): (RouteMeta & Record<K, unknown>)[] {\n return getRouteRegistry().filter(field)\n}\n\n"],"mappings":";;;;;;AA0CA,IAAa,gBAAb,MAAwF;;CAEtF,AAAQ,SAAsB,EAAE;;CAGhC,AAAQ,2BAAW,IAAI,KAAwB;;CAG/C,AAAQ,8BAAc,IAAI,KAA0B;CAEpD,YAAY,QAA0B;AACpC,OAAK,cAAc,OAAO;;;;;CAM5B,AAAQ,cAAc,QAAgC;AACpD,OAAK,MAAM,SAAS,QAAQ;GAE1B,MAAM,OAAkB;IACtB,QAAQ,MAAM;IACd,MAAM,MAAM;IACZ,UAAU,MAAM;IAChB,MAAM,MAAM;IACZ,aAAa,MAAM;IACpB;AAGD,QAAK,MAAM,OAAO,OAAO,KAAK,MAAM,CAClC,KAAI,CAAC;IAAC;IAAU;IAAQ;IAAY;IAAQ;IAAe;IAAW;IAAc;IAAkB,CAAC,SAAS,IAAI,CAClH,MAAK,OAAO,MAAM;AAItB,QAAK,OAAO,KAAK,KAAK;AACtB,QAAK,SAAS,IAAI,GAAG,MAAM,OAAO,GAAG,MAAM,YAAY,KAAK;GAG5D,MAAM,WAAW,KAAK,gBAAgB,MAAM,SAAS;AACrD,OAAI,CAAC,KAAK,YAAY,IAAI,SAAS,CACjC,MAAK,YAAY,IAAI,UAAU,EAAE,CAAC;AAEpC,QAAK,YAAY,IAAI,SAAS,CAAE,KAAK,KAAK;;;;;;CAO9C,AAAQ,gBAAgB,MAAsB;AAE5C,SADiB,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,CAChC,MAAM;;;;;CAUxB,SAAsB;AACpB,SAAO,CAAC,GAAG,KAAK,OAAO;;;;;CAMzB,IAAI,QAAgB,MAA2C;AAC7D,SAAO,KAAK,SAAS,IAAI,GAAG,OAAO,GAAG,OAAO;;;;;CAM/C,IAAI,QAAgB,MAAuB;AACzC,SAAO,KAAK,SAAS,IAAI,GAAG,OAAO,GAAG,OAAO;;;;;CAM/C,cAAc,UAA+B;AAC3C,SAAO,KAAK,YAAY,IAAI,SAAS,IAAI,EAAE;;;;;CAM7C,gBAA0B;AACxB,SAAO,MAAM,KAAK,KAAK,YAAY,MAAM,CAAC,CAAC,MAAM;;;;;;;;;;;CAYnD,OAAyB,OAA8C;AACrE,SAAO,KAAK,OAAO,QAAQ,MAAM,SAAS,KAAK,EAAE,WAAW,OAAU;;;;;;;;;;;CAYxE,SAAS,WAAuD;AAC9D,SAAO,KAAK,OAAO,OAAO,UAAU;;;;;CAMtC,IAAI,OAAe;AACjB,SAAO,KAAK,OAAO;;;;;CAMrB,QAAQ,UAA2D;AACjE,OAAK,OAAO,QAAQ,SAAS;;;;;CAM/B,IAAO,UAAuD;AAC5D,SAAO,KAAK,OAAO,IAAI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;AAyBpC,SAAgB,oBACd,QACkB;AAClB,QAAO,IAAI,cAAiB,OAAO;;;AAQrC,IAAI,iBAAuC;;;;;AAM3C,SAAgB,kBAAkB,UAA+B;AAC/D,kBAAiB;;;;;;;;;;;;;;;;AAiBnB,SAAgB,mBAAkG;AAChH,KAAI,CAAC,eACH,OAAM,IAAI,MAAM,oEAAoE;AAEtF,QAAO;;;;;;;;;;;;;;;;;;AAmBT,SAAgB,SACd,QACA,MAC6B;AAC7B,QAAO,kBAAqB,CAAC,IAAI,QAAQ,KAAK;;;;;;;;;;;;;AAchD,SAAgB,eAA4B;AAC1C,QAAO,kBAAkB,CAAC,QAAQ;;;;;;;;;;;;;AAcpC,SAAgB,aAA+B,OAA8C;AAC3F,QAAO,kBAAkB,CAAC,OAAO,MAAM"}
|
package/dist/router/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
1
|
+
import "../schema-B6DFN5c2.mjs";
|
|
2
|
+
import "../index-CREkvfw9.mjs";
|
|
3
3
|
import { flattenNestedRoutes, normalizePath } from "../router.mjs";
|
|
4
4
|
import { RadixRouter } from "./radix-tree.mjs";
|
|
5
5
|
export { RadixRouter, flattenNestedRoutes, normalizePath };
|
package/dist/router/index.mjs
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
import { n as
|
|
2
|
-
import {
|
|
1
|
+
import { n as normalizePath, t as flattenNestedRoutes } from "../router-xWzwz_1a.mjs";
|
|
2
|
+
import { t as RadixRouter } from "../radix-tree-qqSjnVXF.mjs";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
init_radix_tree();
|
|
6
|
-
init_router();
|
|
7
|
-
|
|
8
|
-
//#endregion
|
|
9
|
-
export { RadixRouter, flattenNestedRoutes, normalizePath };
|
|
10
|
-
//# sourceMappingURL=index.mjs.map
|
|
4
|
+
export { RadixRouter, flattenNestedRoutes, normalizePath };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as Method, o as Middleware, r as Handler } from "../types-
|
|
2
|
-
import "../schema-
|
|
3
|
-
import "../index-
|
|
1
|
+
import { a as Method, o as Middleware, r as Handler } from "../types-D1PUFkda.mjs";
|
|
2
|
+
import "../schema-B6DFN5c2.mjs";
|
|
3
|
+
import "../index-CREkvfw9.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/router/radix-tree.d.ts
|
|
6
6
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
|
|
2
|
-
|
|
3
1
|
//#region src/router.ts
|
|
4
2
|
/**
|
|
5
3
|
* 扁平化嵌套路由
|
|
@@ -64,8 +62,7 @@ function normalizePath(path) {
|
|
|
64
62
|
if (normalized !== "/" && normalized.endsWith("/")) normalized = normalized.slice(0, -1);
|
|
65
63
|
return normalized;
|
|
66
64
|
}
|
|
67
|
-
var init_router = __esmMin((() => {}));
|
|
68
65
|
|
|
69
66
|
//#endregion
|
|
70
|
-
export {
|
|
71
|
-
//# sourceMappingURL=router-
|
|
67
|
+
export { normalizePath as n, flattenNestedRoutes as t };
|
|
68
|
+
//# sourceMappingURL=router-xWzwz_1a.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-
|
|
1
|
+
{"version":3,"file":"router-xWzwz_1a.mjs","names":[],"sources":["../src/router.ts"],"sourcesContent":["/**\n * 路由工具函数\n *\n * 提供路由处理的基础工具\n */\n\nimport type { Route, NestedRoute, FlattenedRoute, Middleware } from \"./types\";\n\n/**\n * 扁平化嵌套路由\n *\n * 将嵌套路由结构转换为扁平数组,计算完整路径和中间件链\n *\n * @example\n * ```typescript\n * const routes = flattenNestedRoutes([\n * {\n * path: \"/api\",\n * middleware: [authMiddleware],\n * children: [\n * { path: \"/users\", method: \"GET\", handler: getUsers },\n * { path: \"/users/:id\", method: \"GET\", handler: getUser },\n * ],\n * },\n * ]);\n * // 结果:\n * // [\n * // { fullPath: \"/api/users\", method: \"GET\", ... },\n * // { fullPath: \"/api/users/:id\", method: \"GET\", ... },\n * // ]\n * ```\n */\nexport function flattenNestedRoutes(\n routes: (Route | NestedRoute)[],\n): FlattenedRoute[] {\n const flattened: FlattenedRoute[] = [];\n\n function processRoute(\n route: Route | NestedRoute,\n parentPath = \"\",\n parentMiddleware: Middleware[] = [],\n parentName?: string,\n ): void {\n // 计算当前完整路径\n const currentPath = normalizePath(parentPath + route.path);\n // 合并中间件链\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\n // 当前路由的 name(用于传递给子路由)\n const currentName = route.name || parentName;\n\n if (\"method\" in route && \"handler\" in route) {\n // 叶子路由(有处理函数)\n const leafRoute = route as Route;\n flattened.push({\n ...leafRoute,\n fullPath: currentPath,\n middlewareChain: currentMiddleware,\n parentName: parentName, // 保存父级名称\n });\n } else if (\"children\" in route && route.children) {\n // 分组路由,递归处理子路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware, currentName);\n }\n }\n }\n\n for (const route of routes) {\n processRoute(route);\n }\n\n return flattened;\n}\n\n/**\n * 标准化路径\n *\n * - 解码 URL 编码字符\n * - 去除重复斜杠\n * - 处理结尾斜杠\n *\n * @example\n * ```typescript\n * normalizePath(\"//api//users/\") // \"/api/users\"\n * normalizePath(\"/api/%20test\") // \"/api/ test\"\n * ```\n */\nexport function normalizePath(path: string): string {\n // 解码 URL 编码\n let normalized = decodeURIComponent(path);\n\n // 去除重复斜杠\n normalized = normalized.replace(/\\/+/g, \"/\");\n\n // 空路径转为根路径\n if (normalized === \"\") return \"/\";\n\n // 去除结尾斜杠(根路径除外)\n if (normalized !== \"/\" && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,oBACd,QACkB;CAClB,MAAM,YAA8B,EAAE;CAEtC,SAAS,aACP,OACA,aAAa,IACb,mBAAiC,EAAE,EACnC,YACM;EAEN,MAAM,cAAc,cAAc,aAAa,MAAM,KAAK;EAE1D,MAAM,oBAAoB,CACxB,GAAG,kBACH,GAAI,MAAM,cAAc,EAAE,CAC3B;EAED,MAAM,cAAc,MAAM,QAAQ;AAElC,MAAI,YAAY,SAAS,aAAa,OAAO;GAE3C,MAAM,YAAY;AAClB,aAAU,KAAK;IACb,GAAG;IACH,UAAU;IACV,iBAAiB;IACL;IACb,CAAC;aACO,cAAc,SAAS,MAAM,SAEtC,MAAK,MAAM,SAAS,MAAM,SACxB,cAAa,OAAO,aAAa,mBAAmB,YAAY;;AAKtE,MAAK,MAAM,SAAS,OAClB,cAAa,MAAM;AAGrB,QAAO;;;;;;;;;;;;;;;AAgBT,SAAgB,cAAc,MAAsB;CAElD,IAAI,aAAa,mBAAmB,KAAK;AAGzC,cAAa,WAAW,QAAQ,QAAQ,IAAI;AAG5C,KAAI,eAAe,GAAI,QAAO;AAG9B,KAAI,eAAe,OAAO,WAAW,SAAS,IAAI,CAChD,cAAa,WAAW,MAAM,GAAG,GAAG;AAGtC,QAAO"}
|
package/dist/router.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { l as Route, n as FlattenedRoute, s as NestedRoute } from "./types-
|
|
2
|
-
import "./schema-
|
|
3
|
-
import "./index-
|
|
1
|
+
import { l as Route, n as FlattenedRoute, s as NestedRoute } from "./types-D1PUFkda.mjs";
|
|
2
|
+
import "./schema-B6DFN5c2.mjs";
|
|
3
|
+
import "./index-CREkvfw9.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/router.d.ts
|
|
6
6
|
|
package/dist/router.mjs
CHANGED
|
@@ -78,4 +78,4 @@ interface TypedRouteConfig<T extends RouteSchema = RouteSchema> {
|
|
|
78
78
|
}
|
|
79
79
|
//#endregion
|
|
80
80
|
export { TypedHandler as a, RouteSchema as i, HandlerContextWithExtra as n, TypedRouteConfig as o, InferSchema as r, HandlerContext as t };
|
|
81
|
-
//# sourceMappingURL=schema-
|
|
81
|
+
//# sourceMappingURL=schema-B6DFN5c2.d.mts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as createProxyRequest } from "./request-
|
|
2
|
-
import { t as writeResponse } from "./response-
|
|
1
|
+
import { t as createProxyRequest } from "./request-B-Nct5f7.mjs";
|
|
2
|
+
import { t as writeResponse } from "./response-BnkYA4pj.mjs";
|
|
3
3
|
import { createServer } from "node:http";
|
|
4
4
|
|
|
5
5
|
//#region src/node-server/serve.ts
|
|
@@ -104,4 +104,4 @@ function createAdaptorServer(fetch, onError) {
|
|
|
104
104
|
|
|
105
105
|
//#endregion
|
|
106
106
|
export { serve as n, createAdaptorServer as t };
|
|
107
|
-
//# sourceMappingURL=serve-
|
|
107
|
+
//# sourceMappingURL=serve-48LEIkPa.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve-
|
|
1
|
+
{"version":3,"file":"serve-48LEIkPa.mjs","names":[],"sources":["../src/node-server/serve.ts"],"sourcesContent":["/**\n * Node.js 服务器适配器\n * 提供类似 Bun.serve 的 API\n */\n\nimport {\n createServer,\n type Server as HttpServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { createProxyRequest } from \"./request\";\nimport { writeResponse } from \"./response\";\n\n/** fetch 函数类型 */\nexport type FetchHandler = (request: Request) => Response | Promise<Response>;\n\n/** 优雅关闭配置 */\nexport interface GracefulShutdownOptions {\n /** 关闭超时时间(毫秒),默认 30000 */\n timeout?: number;\n /** 关闭前回调 */\n onShutdown?: () => void | Promise<void>;\n /** 关闭完成回调 */\n onShutdownComplete?: () => void;\n /** 监听的信号,默认 ['SIGINT', 'SIGTERM'] */\n signals?: NodeJS.Signals[];\n}\n\n/** serve 配置选项 */\nexport interface ServeOptions {\n /** fetch 处理函数 */\n fetch: FetchHandler;\n /** 端口号,默认 3000 */\n port?: number;\n /** 主机名,默认 0.0.0.0 */\n hostname?: string;\n /** 错误处理函数 */\n onError?: (error: Error) => Response | Promise<Response>;\n /** 优雅关闭配置,设置为 true 使用默认配置 */\n gracefulShutdown?: boolean | GracefulShutdownOptions;\n}\n\n/** serve 返回的服务器信息 */\nexport interface ServeResult {\n /** Node.js HTTP Server 实例 */\n server: HttpServer;\n /** 服务器端口 */\n port: number;\n /** 服务器主机名 */\n hostname: string;\n /** 关闭服务器 */\n stop: () => Promise<void>;\n /** 优雅关闭(等待现有请求完成) */\n shutdown: () => Promise<void>;\n}\n\n/**\n * 创建请求处理函数\n */\nfunction createRequestHandler(\n fetch: FetchHandler,\n defaultHost: string,\n onError?: (error: Error) => Response | Promise<Response>,\n) {\n return async (incoming: IncomingMessage, outgoing: ServerResponse) => {\n try {\n // 创建代理 Request(延迟创建真实 Request)\n const request = createProxyRequest(incoming, defaultHost);\n\n // 调用 fetch handler\n const response = await fetch(request);\n\n // 流式写入 Response\n await writeResponse(response, outgoing);\n } catch (error) {\n // 错误处理\n const err = error instanceof Error ? error : new Error(String(error));\n\n if (onError) {\n try {\n const errorResponse = await onError(err);\n await writeResponse(errorResponse, outgoing);\n return;\n } catch {\n // onError 也失败了,返回 500\n }\n }\n\n // 默认错误响应\n if (!outgoing.headersSent) {\n outgoing.statusCode = 500;\n outgoing.setHeader(\"Content-Type\", \"text/plain\");\n outgoing.end(\"Internal Server Error\");\n }\n }\n };\n}\n\n/**\n * 启动 HTTP 服务器\n *\n * @example\n * ```ts\n * import { serve } from \"@vafast/node-server\";\n * import { Server } from \"vafast\";\n *\n * const app = new Server([\n * { method: \"GET\", path: \"/\", handler: () => \"Hello World\" },\n * ]);\n *\n * serve({ fetch: app.fetch, port: 3000 }, () => {\n * console.log(\"Server running on http://localhost:3000\");\n * });\n * ```\n */\nexport function serve(\n options: ServeOptions,\n callback?: () => void,\n): ServeResult {\n const { fetch, port = 3000, hostname = \"0.0.0.0\", onError, gracefulShutdown } = options;\n\n const defaultHost = `${hostname === \"0.0.0.0\" ? \"localhost\" : hostname}:${port}`;\n const handler = createRequestHandler(fetch, defaultHost, onError);\n\n const server = createServer(handler);\n\n // 追踪活跃连接\n const connections = new Set<import(\"node:net\").Socket>();\n\n server.on(\"connection\", (socket) => {\n connections.add(socket);\n socket.on(\"close\", () => connections.delete(socket));\n });\n\n // 优雅关闭函数\n let isShuttingDown = false;\n\n const shutdown = async (): Promise<void> => {\n if (isShuttingDown) return;\n isShuttingDown = true;\n\n const shutdownOptions: GracefulShutdownOptions =\n typeof gracefulShutdown === \"object\" ? gracefulShutdown : {};\n\n const timeout = shutdownOptions.timeout ?? 30000;\n\n // 执行关闭前回调\n if (shutdownOptions.onShutdown) {\n await shutdownOptions.onShutdown();\n }\n\n return new Promise<void>((resolve) => {\n // 设置超时强制关闭\n const forceCloseTimer = setTimeout(() => {\n // 强制关闭所有连接\n for (const socket of connections) {\n socket.destroy();\n }\n connections.clear();\n resolve();\n }, timeout);\n\n // 停止接受新连接\n server.close(() => {\n clearTimeout(forceCloseTimer);\n shutdownOptions.onShutdownComplete?.();\n resolve();\n });\n\n // 关闭空闲连接\n for (const socket of connections) {\n // 如果连接空闲,立即关闭\n if (!socket.writableLength) {\n socket.end();\n }\n }\n });\n };\n\n // 注册信号处理\n if (gracefulShutdown) {\n const shutdownOptions: GracefulShutdownOptions =\n typeof gracefulShutdown === \"object\" ? gracefulShutdown : {};\n\n const signals = shutdownOptions.signals ?? [\"SIGINT\", \"SIGTERM\"];\n\n for (const signal of signals) {\n process.on(signal, () => {\n shutdown().then(() => process.exit(0));\n });\n }\n }\n\n // 启动服务器\n server.listen(port, hostname, callback);\n\n return {\n server,\n port,\n hostname,\n stop: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n }),\n shutdown,\n };\n}\n\n/**\n * 创建适配器服务器(不自动启动)\n * 用于需要更多控制的场景\n */\nexport function createAdaptorServer(\n fetch: FetchHandler,\n onError?: (error: Error) => Response | Promise<Response>,\n): HttpServer {\n const handler = createRequestHandler(fetch, \"localhost\", onError);\n return createServer(handler);\n}\n"],"mappings":";;;;;;;;;;;;AA4DA,SAAS,qBACP,OACA,aACA,SACA;AACA,QAAO,OAAO,UAA2B,aAA6B;AACpE,MAAI;AAQF,SAAM,cAHW,MAAM,MAHP,mBAAmB,UAAU,YAAY,CAGpB,EAGP,SAAS;WAChC,OAAO;GAEd,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;AAErE,OAAI,QACF,KAAI;AAEF,UAAM,cADgB,MAAM,QAAQ,IAAI,EACL,SAAS;AAC5C;WACM;AAMV,OAAI,CAAC,SAAS,aAAa;AACzB,aAAS,aAAa;AACtB,aAAS,UAAU,gBAAgB,aAAa;AAChD,aAAS,IAAI,wBAAwB;;;;;;;;;;;;;;;;;;;;;;AAuB7C,SAAgB,MACd,SACA,UACa;CACb,MAAM,EAAE,OAAO,OAAO,KAAM,WAAW,WAAW,SAAS,qBAAqB;CAKhF,MAAM,SAAS,aAFC,qBAAqB,OADjB,GAAG,aAAa,YAAY,cAAc,SAAS,GAAG,QACjB,QAAQ,CAE7B;CAGpC,MAAM,8BAAc,IAAI,KAAgC;AAExD,QAAO,GAAG,eAAe,WAAW;AAClC,cAAY,IAAI,OAAO;AACvB,SAAO,GAAG,eAAe,YAAY,OAAO,OAAO,CAAC;GACpD;CAGF,IAAI,iBAAiB;CAErB,MAAM,WAAW,YAA2B;AAC1C,MAAI,eAAgB;AACpB,mBAAiB;EAEjB,MAAM,kBACJ,OAAO,qBAAqB,WAAW,mBAAmB,EAAE;EAE9D,MAAM,UAAU,gBAAgB,WAAW;AAG3C,MAAI,gBAAgB,WAClB,OAAM,gBAAgB,YAAY;AAGpC,SAAO,IAAI,SAAe,YAAY;GAEpC,MAAM,kBAAkB,iBAAiB;AAEvC,SAAK,MAAM,UAAU,YACnB,QAAO,SAAS;AAElB,gBAAY,OAAO;AACnB,aAAS;MACR,QAAQ;AAGX,UAAO,YAAY;AACjB,iBAAa,gBAAgB;AAC7B,oBAAgB,sBAAsB;AACtC,aAAS;KACT;AAGF,QAAK,MAAM,UAAU,YAEnB,KAAI,CAAC,OAAO,eACV,QAAO,KAAK;IAGhB;;AAIJ,KAAI,kBAAkB;EAIpB,MAAM,WAFJ,OAAO,qBAAqB,WAAW,mBAAmB,EAAE,EAE9B,WAAW,CAAC,UAAU,UAAU;AAEhE,OAAK,MAAM,UAAU,QACnB,SAAQ,GAAG,cAAc;AACvB,aAAU,CAAC,WAAW,QAAQ,KAAK,EAAE,CAAC;IACtC;;AAKN,QAAO,OAAO,MAAM,UAAU,SAAS;AAEvC,QAAO;EACL;EACA;EACA;EACA,YACE,IAAI,SAAe,SAAS,WAAW;AACrC,UAAO,OAAO,QAAQ;AACpB,QAAI,IAAK,QAAO,IAAI;QACf,UAAS;KACd;IACF;EACJ;EACD;;;;;;AAOH,SAAgB,oBACd,OACA,SACY;AAEZ,QAAO,aADS,qBAAqB,OAAO,aAAa,QAAQ,CACrC"}
|
|
@@ -66,4 +66,4 @@ declare function serve(options: ServeOptions, callback?: () => void): ServeResul
|
|
|
66
66
|
declare function createAdaptorServer(fetch: FetchHandler, onError?: (error: Error) => Response | Promise<Response>): Server;
|
|
67
67
|
//#endregion
|
|
68
68
|
export { createAdaptorServer as a, ServeResult as i, GracefulShutdownOptions as n, serve as o, ServeOptions as r, FetchHandler as t };
|
|
69
|
-
//# sourceMappingURL=serve-
|
|
69
|
+
//# sourceMappingURL=serve-AG80VaIr.d.mts.map
|
package/dist/serve.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as createAdaptorServer, i as ServeResult, o as serve, r as ServeOptions, t as FetchHandler } from "./serve-
|
|
1
|
+
import { a as createAdaptorServer, i as ServeResult, o as serve, r as ServeOptions, t as FetchHandler } from "./serve-AG80VaIr.mjs";
|
|
2
2
|
export { type FetchHandler, type ServeOptions, type ServeResult, createAdaptorServer, serve };
|
package/dist/serve.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import { t as BaseServer } from "../base-server-
|
|
1
|
+
import "../schema-B6DFN5c2.mjs";
|
|
2
|
+
import "../index-CREkvfw9.mjs";
|
|
3
|
+
import { t as BaseServer } from "../base-server-DLxtulAO.mjs";
|
|
4
4
|
export { BaseServer };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import "../base-server-
|
|
4
|
-
import { t as ComponentServer } from "../component-server-
|
|
1
|
+
import "../schema-B6DFN5c2.mjs";
|
|
2
|
+
import "../index-CREkvfw9.mjs";
|
|
3
|
+
import "../base-server-DLxtulAO.mjs";
|
|
4
|
+
import { t as ComponentServer } from "../component-server-JqpDC7wy.mjs";
|
|
5
5
|
export { ComponentServer };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import "../dependency-manager-
|
|
2
|
-
import {
|
|
1
|
+
import "../dependency-manager-DCmh7xFc.mjs";
|
|
2
|
+
import { t as ComponentServer } from "../component-server-DomPJ_7S.mjs";
|
|
3
3
|
|
|
4
|
-
init_component_server();
|
|
5
4
|
export { ComponentServer };
|
package/dist/server/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import { t as BaseServer } from "../base-server-
|
|
4
|
-
import { t as Server } from "../server-
|
|
5
|
-
import { t as ComponentServer } from "../component-server-
|
|
6
|
-
import { t as ServerFactory } from "../index-
|
|
1
|
+
import "../schema-B6DFN5c2.mjs";
|
|
2
|
+
import "../index-CREkvfw9.mjs";
|
|
3
|
+
import { t as BaseServer } from "../base-server-DLxtulAO.mjs";
|
|
4
|
+
import { t as Server } from "../server-DGA3dd5s.mjs";
|
|
5
|
+
import { t as ComponentServer } from "../component-server-JqpDC7wy.mjs";
|
|
6
|
+
import { t as ServerFactory } from "../index-CEfOqqvd.mjs";
|
|
7
7
|
export { BaseServer, ComponentServer, Server, ServerFactory };
|
package/dist/server/index.mjs
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import "../middleware-
|
|
2
|
-
import { t as BaseServer } from "../base-server-
|
|
3
|
-
import { t as Server } from "../server-
|
|
4
|
-
import "../dependency-manager-
|
|
5
|
-
import { t as ComponentServer } from "../component-server-
|
|
6
|
-
import {
|
|
1
|
+
import "../middleware-CewKbtb4.mjs";
|
|
2
|
+
import { t as BaseServer } from "../base-server-B7MYJNsl.mjs";
|
|
3
|
+
import { t as Server } from "../server-L_FNwdap.mjs";
|
|
4
|
+
import "../dependency-manager-DCmh7xFc.mjs";
|
|
5
|
+
import { t as ComponentServer } from "../component-server-DomPJ_7S.mjs";
|
|
6
|
+
import { t as ServerFactory } from "../server-C75o1b-a.mjs";
|
|
7
7
|
|
|
8
|
-
init_server();
|
|
9
8
|
export { BaseServer, ComponentServer, Server, ServerFactory };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import "../base-server-
|
|
4
|
-
import "../server-
|
|
5
|
-
import "../component-server-
|
|
6
|
-
import { t as ServerFactory } from "../index-
|
|
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 { t as ServerFactory } from "../index-CEfOqqvd.mjs";
|
|
7
7
|
export { ServerFactory };
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import "../middleware-
|
|
2
|
-
import "../server-
|
|
3
|
-
import "../dependency-manager-
|
|
4
|
-
import "../component-server-
|
|
5
|
-
import {
|
|
1
|
+
import "../middleware-CewKbtb4.mjs";
|
|
2
|
+
import "../server-L_FNwdap.mjs";
|
|
3
|
+
import "../dependency-manager-DCmh7xFc.mjs";
|
|
4
|
+
import "../component-server-DomPJ_7S.mjs";
|
|
5
|
+
import { t as ServerFactory } from "../server-C75o1b-a.mjs";
|
|
6
6
|
|
|
7
|
-
init_server_factory();
|
|
8
7
|
export { ServerFactory };
|
package/dist/server/server.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../schema-
|
|
2
|
-
import "../index-
|
|
3
|
-
import "../base-server-
|
|
4
|
-
import { t as Server } from "../server-
|
|
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
5
|
export { Server };
|
package/dist/server/server.mjs
CHANGED