vafast 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/README.md +6 -10
  2. package/dist/auth/{token.d.ts → token.d.mts} +21 -19
  3. package/dist/auth/token.mjs +105 -0
  4. package/dist/auth/token.mjs.map +1 -0
  5. package/dist/base-server-Bq4_lJWK.mjs +113 -0
  6. package/dist/base-server-Bq4_lJWK.mjs.map +1 -0
  7. package/dist/base-server-Gakrozqk.d.mts +40 -0
  8. package/dist/base64url-BY-HBSpL.d.mts +6 -0
  9. package/dist/base64url-DLDOeXsk.mjs +13 -0
  10. package/dist/base64url-DLDOeXsk.mjs.map +1 -0
  11. package/dist/chunk-67U6L5Jh.mjs +37 -0
  12. package/dist/component-route-BYV_X1rA.d.mts +31 -0
  13. package/dist/component-route-Do2yyYTi.mjs +1 -0
  14. package/dist/component-router-DXUXLp1R.mjs +33 -0
  15. package/dist/component-router-DXUXLp1R.mjs.map +1 -0
  16. package/dist/component-server-ARXvZJUQ.mjs +124 -0
  17. package/dist/component-server-ARXvZJUQ.mjs.map +1 -0
  18. package/dist/component-server-BOz4Q-Qt.d.mts +38 -0
  19. package/dist/create-handler-CbSoroA1.mjs +166 -0
  20. package/dist/create-handler-CbSoroA1.mjs.map +1 -0
  21. package/dist/{utils/create-handler.d.ts → create-handler-Dtt0xv6g.d.mts} +24 -24
  22. package/dist/{defineRoute.d.ts → defineRoute.d.mts} +20 -17
  23. package/dist/defineRoute.mjs +93 -0
  24. package/dist/defineRoute.mjs.map +1 -0
  25. package/dist/dependency-manager-CPkwMI7J.mjs +61 -0
  26. package/dist/dependency-manager-CPkwMI7J.mjs.map +1 -0
  27. package/dist/dependency-manager-Dbug5INp.d.mts +27 -0
  28. package/dist/formats-BSqJWCsG.d.mts +42 -0
  29. package/dist/go-await-B-KP-K8x.mjs +33 -0
  30. package/dist/go-await-B-KP-K8x.mjs.map +1 -0
  31. package/dist/{utils/go-await.d.ts → go-await-CqPx9dVQ.d.mts} +4 -2
  32. package/dist/handle-BhpqNgGf.mjs +30 -0
  33. package/dist/handle-BhpqNgGf.mjs.map +1 -0
  34. package/dist/{utils/handle.d.ts → handle-DOidKTI-.d.mts} +8 -6
  35. package/dist/html-renderer-C3LKTLme.d.mts +22 -0
  36. package/dist/{utils/html-renderer.js → html-renderer-CJ3B2Hft.mjs} +34 -29
  37. package/dist/html-renderer-CJ3B2Hft.mjs.map +1 -0
  38. package/dist/index-DFsQyT61.d.mts +48 -0
  39. package/dist/index-DXJd7-2Z.d.mts +1 -0
  40. package/dist/index.d.mts +35 -0
  41. package/dist/index.mjs +42 -0
  42. package/dist/index.mjs.map +1 -0
  43. package/dist/middleware/{auth.d.ts → auth.d.mts} +12 -8
  44. package/dist/middleware/auth.mjs +98 -0
  45. package/dist/middleware/auth.mjs.map +1 -0
  46. package/dist/middleware/authMiddleware.d.mts +9 -0
  47. package/dist/middleware/authMiddleware.mjs +19 -0
  48. package/dist/middleware/authMiddleware.mjs.map +1 -0
  49. package/dist/middleware/{component-renderer.d.ts → component-renderer.d.mts} +3 -1
  50. package/dist/middleware/component-renderer.mjs +119 -0
  51. package/dist/middleware/component-renderer.mjs.map +1 -0
  52. package/dist/middleware/{component-router.d.ts → component-router.d.mts} +5 -4
  53. package/dist/middleware/component-router.mjs +4 -0
  54. package/dist/middleware/cors.d.mts +16 -0
  55. package/dist/middleware/cors.mjs +38 -0
  56. package/dist/middleware/cors.mjs.map +1 -0
  57. package/dist/middleware/rateLimit.d.mts +14 -0
  58. package/dist/middleware/rateLimit.mjs +34 -0
  59. package/dist/middleware/rateLimit.mjs.map +1 -0
  60. package/dist/middleware-3ShRJyd1.mjs +59 -0
  61. package/dist/middleware-3ShRJyd1.mjs.map +1 -0
  62. package/dist/middleware.d.mts +25 -0
  63. package/dist/middleware.mjs +4 -0
  64. package/dist/monitoring/index.d.mts +33 -0
  65. package/dist/monitoring/index.mjs +27 -0
  66. package/dist/monitoring/index.mjs.map +1 -0
  67. package/dist/monitoring/native-monitor.d.mts +48 -0
  68. package/dist/monitoring/native-monitor.mjs +154 -0
  69. package/dist/monitoring/native-monitor.mjs.map +1 -0
  70. package/dist/monitoring/types.d.mts +150 -0
  71. package/dist/monitoring/types.mjs +1 -0
  72. package/dist/node-server/index.d.mts +4 -0
  73. package/dist/node-server/index.mjs +5 -0
  74. package/dist/node-server/{request.d.ts → request.d.mts} +4 -6
  75. package/dist/node-server/request.mjs +3 -0
  76. package/dist/node-server/{response.d.ts → response.d.mts} +4 -6
  77. package/dist/node-server/response.mjs +3 -0
  78. package/dist/node-server/serve.d.mts +2 -0
  79. package/dist/node-server/serve.mjs +4 -0
  80. package/dist/{utils/parsers.d.ts → parsers-CodQFP1Z.d.mts} +10 -8
  81. package/dist/parsers-ROIZWSGI.mjs +168 -0
  82. package/dist/parsers-ROIZWSGI.mjs.map +1 -0
  83. package/dist/path-matcher-CXMJ-IrG.mjs +62 -0
  84. package/dist/path-matcher-CXMJ-IrG.mjs.map +1 -0
  85. package/dist/radix-tree-BWmhTLhT.mjs +157 -0
  86. package/dist/radix-tree-BWmhTLhT.mjs.map +1 -0
  87. package/dist/request-B2BkUecT.mjs +133 -0
  88. package/dist/request-B2BkUecT.mjs.map +1 -0
  89. package/dist/request-validator-Dyqng-H_.mjs +77 -0
  90. package/dist/request-validator-Dyqng-H_.mjs.map +1 -0
  91. package/dist/request-validator-u2Ccj3_x.d.mts +67 -0
  92. package/dist/response-BhFKEphr.mjs +72 -0
  93. package/dist/response-BhFKEphr.mjs.map +1 -0
  94. package/dist/response-CSKW5hsS.mjs +97 -0
  95. package/dist/response-CSKW5hsS.mjs.map +1 -0
  96. package/dist/{utils/response.d.ts → response-CUyV5FIm.d.mts} +4 -2
  97. package/dist/route-BRR15b-p.mjs +11 -0
  98. package/dist/route-BRR15b-p.mjs.map +1 -0
  99. package/dist/route-BqmWCG4e.d.mts +44 -0
  100. package/dist/route-registry-AlkDgbcE.mjs +225 -0
  101. package/dist/route-registry-AlkDgbcE.mjs.map +1 -0
  102. package/dist/route-registry-ykzRmaHB.d.mts +176 -0
  103. package/dist/router/index.d.mts +5 -0
  104. package/dist/router/index.mjs +10 -0
  105. package/dist/router/index.mjs.map +1 -0
  106. package/dist/router/radix-tree.d.mts +60 -0
  107. package/dist/router/radix-tree.mjs +4 -0
  108. package/dist/router-BOeVQrjz.mjs +71 -0
  109. package/dist/router-BOeVQrjz.mjs.map +1 -0
  110. package/dist/{router.d.ts → router.d.mts} +6 -7
  111. package/dist/router.mjs +4 -0
  112. package/dist/schema-CVuttFSw.d.mts +81 -0
  113. package/dist/schema-CbAaktsZ.mjs +1 -0
  114. package/dist/serve-BQQ2JzIH.d.mts +69 -0
  115. package/dist/serve-MRGGK7-q.mjs +107 -0
  116. package/dist/serve-MRGGK7-q.mjs.map +1 -0
  117. package/dist/serve.d.mts +2 -0
  118. package/dist/serve.mjs +4 -0
  119. package/dist/server/base-server.d.mts +4 -0
  120. package/dist/server/base-server.mjs +4 -0
  121. package/dist/server/component-server.d.mts +5 -0
  122. package/dist/server/component-server.mjs +5 -0
  123. package/dist/server/index.d.mts +7 -0
  124. package/dist/server/index.mjs +8 -0
  125. package/dist/server/server-factory.d.mts +7 -0
  126. package/dist/server/server-factory.mjs +6 -0
  127. package/dist/server/server.d.mts +5 -0
  128. package/dist/server/server.mjs +4 -0
  129. package/dist/server-B0nzGCG5.mjs +88 -0
  130. package/dist/server-B0nzGCG5.mjs.map +1 -0
  131. package/dist/server-C8WCshmG.mjs +137 -0
  132. package/dist/server-C8WCshmG.mjs.map +1 -0
  133. package/dist/server-Drc2kSxp.d.mts +60 -0
  134. package/dist/sse-BOd2pvUK.d.mts +65 -0
  135. package/dist/sse-US5D9mgE.mjs +87 -0
  136. package/dist/sse-US5D9mgE.mjs.map +1 -0
  137. package/dist/types/component-route.d.mts +2 -0
  138. package/dist/types/component-route.mjs +1 -0
  139. package/dist/types/index.d.mts +6 -0
  140. package/dist/types/index.mjs +3 -0
  141. package/dist/types/route.d.mts +2 -0
  142. package/dist/types/route.mjs +3 -0
  143. package/dist/types/schema.d.mts +2 -0
  144. package/dist/types/schema.mjs +1 -0
  145. package/dist/types/types.d.mts +2 -0
  146. package/dist/types/types.mjs +1 -0
  147. package/dist/{types/types.d.ts → types-Cb7_2VSt.d.mts} +27 -23
  148. package/dist/utils/base64url.d.mts +2 -0
  149. package/dist/utils/base64url.mjs +3 -0
  150. package/dist/utils/create-handler.d.mts +3 -0
  151. package/dist/utils/create-handler.mjs +5 -0
  152. package/dist/utils/dependency-manager.d.mts +2 -0
  153. package/dist/utils/dependency-manager.mjs +4 -0
  154. package/dist/utils/formats.d.mts +2 -0
  155. package/dist/utils/formats.mjs +129 -0
  156. package/dist/utils/formats.mjs.map +1 -0
  157. package/dist/utils/go-await.d.mts +2 -0
  158. package/dist/utils/go-await.mjs +3 -0
  159. package/dist/utils/handle.d.mts +2 -0
  160. package/dist/utils/handle.mjs +4 -0
  161. package/dist/utils/html-renderer.d.mts +2 -0
  162. package/dist/utils/html-renderer.mjs +4 -0
  163. package/dist/utils/index.d.mts +16 -0
  164. package/dist/utils/index.mjs +23 -0
  165. package/dist/utils/index.mjs.map +1 -0
  166. package/dist/utils/parsers.d.mts +2 -0
  167. package/dist/utils/parsers.mjs +3 -0
  168. package/dist/utils/path-matcher.d.mts +27 -0
  169. package/dist/utils/path-matcher.mjs +4 -0
  170. package/dist/utils/request-validator.d.mts +3 -0
  171. package/dist/utils/request-validator.mjs +5 -0
  172. package/dist/utils/response.d.mts +2 -0
  173. package/dist/utils/response.mjs +4 -0
  174. package/dist/utils/route-registry.d.mts +4 -0
  175. package/dist/utils/route-registry.mjs +4 -0
  176. package/dist/utils/sse.d.mts +3 -0
  177. package/dist/utils/sse.mjs +5 -0
  178. package/dist/utils/validators/validators.d.mts +2 -0
  179. package/dist/utils/validators/validators.mjs +3 -0
  180. package/dist/validators-C0eZyxPh.d.mts +67 -0
  181. package/dist/validators-CbCLj0Rc.mjs +112 -0
  182. package/dist/validators-CbCLj0Rc.mjs.map +1 -0
  183. package/package.json +16 -18
  184. package/dist/auth/token.js +0 -131
  185. package/dist/auth/token.js.map +0 -1
  186. package/dist/defineRoute.js +0 -37
  187. package/dist/defineRoute.js.map +0 -1
  188. package/dist/index.d.ts +0 -32
  189. package/dist/index.js +0 -2575
  190. package/dist/index.js.map +0 -1
  191. package/dist/middleware/auth.js +0 -205
  192. package/dist/middleware/auth.js.map +0 -1
  193. package/dist/middleware/authMiddleware.d.ts +0 -5
  194. package/dist/middleware/authMiddleware.js +0 -57
  195. package/dist/middleware/authMiddleware.js.map +0 -1
  196. package/dist/middleware/component-renderer.js +0 -139
  197. package/dist/middleware/component-renderer.js.map +0 -1
  198. package/dist/middleware/component-router.js +0 -36
  199. package/dist/middleware/component-router.js.map +0 -1
  200. package/dist/middleware/cors.d.ts +0 -12
  201. package/dist/middleware/cors.js +0 -43
  202. package/dist/middleware/cors.js.map +0 -1
  203. package/dist/middleware/rateLimit.d.ts +0 -10
  204. package/dist/middleware/rateLimit.js +0 -49
  205. package/dist/middleware/rateLimit.js.map +0 -1
  206. package/dist/middleware.d.ts +0 -21
  207. package/dist/middleware.js +0 -102
  208. package/dist/middleware.js.map +0 -1
  209. package/dist/monitoring/index.d.ts +0 -36
  210. package/dist/monitoring/index.js +0 -1484
  211. package/dist/monitoring/index.js.map +0 -1
  212. package/dist/monitoring/native-monitor.d.ts +0 -44
  213. package/dist/monitoring/native-monitor.js +0 -1451
  214. package/dist/monitoring/native-monitor.js.map +0 -1
  215. package/dist/monitoring/types.d.ts +0 -148
  216. package/dist/monitoring/types.js +0 -8
  217. package/dist/monitoring/types.js.map +0 -1
  218. package/dist/node-server/index.d.ts +0 -4
  219. package/dist/node-server/index.js +0 -298
  220. package/dist/node-server/index.js.map +0 -1
  221. package/dist/node-server/request.js +0 -125
  222. package/dist/node-server/request.js.map +0 -1
  223. package/dist/node-server/response.js +0 -76
  224. package/dist/node-server/response.js.map +0 -1
  225. package/dist/node-server/serve.d.ts +0 -71
  226. package/dist/node-server/serve.js +0 -281
  227. package/dist/node-server/serve.js.map +0 -1
  228. package/dist/router/index.d.ts +0 -3
  229. package/dist/router/index.js +0 -229
  230. package/dist/router/index.js.map +0 -1
  231. package/dist/router/radix-tree.d.ts +0 -66
  232. package/dist/router/radix-tree.js +0 -190
  233. package/dist/router/radix-tree.js.map +0 -1
  234. package/dist/router.js +0 -41
  235. package/dist/router.js.map +0 -1
  236. package/dist/serve.d.ts +0 -2
  237. package/dist/serve.js +0 -281
  238. package/dist/serve.js.map +0 -1
  239. package/dist/server/base-server.d.ts +0 -37
  240. package/dist/server/base-server.js +0 -134
  241. package/dist/server/base-server.js.map +0 -1
  242. package/dist/server/component-server.d.ts +0 -37
  243. package/dist/server/component-server.js +0 -488
  244. package/dist/server/component-server.js.map +0 -1
  245. package/dist/server/index.d.ts +0 -8
  246. package/dist/server/index.js +0 -1156
  247. package/dist/server/index.js.map +0 -1
  248. package/dist/server/server-factory.d.ts +0 -48
  249. package/dist/server/server-factory.js +0 -1153
  250. package/dist/server/server-factory.js.map +0 -1
  251. package/dist/server/server.d.ts +0 -64
  252. package/dist/server/server.js +0 -734
  253. package/dist/server/server.js.map +0 -1
  254. package/dist/types/component-route.d.ts +0 -29
  255. package/dist/types/component-route.js +0 -1
  256. package/dist/types/component-route.js.map +0 -1
  257. package/dist/types/index.d.ts +0 -5
  258. package/dist/types/index.js +0 -21
  259. package/dist/types/index.js.map +0 -1
  260. package/dist/types/route.d.ts +0 -42
  261. package/dist/types/route.js +0 -12
  262. package/dist/types/route.js.map +0 -1
  263. package/dist/types/schema.d.ts +0 -79
  264. package/dist/types/schema.js +0 -10
  265. package/dist/types/schema.js.map +0 -1
  266. package/dist/types/types.js +0 -1
  267. package/dist/types/types.js.map +0 -1
  268. package/dist/utils/base64url.d.ts +0 -4
  269. package/dist/utils/base64url.js +0 -14
  270. package/dist/utils/base64url.js.map +0 -1
  271. package/dist/utils/create-handler.js +0 -299
  272. package/dist/utils/create-handler.js.map +0 -1
  273. package/dist/utils/dependency-manager.d.ts +0 -25
  274. package/dist/utils/dependency-manager.js +0 -71
  275. package/dist/utils/dependency-manager.js.map +0 -1
  276. package/dist/utils/formats.d.ts +0 -40
  277. package/dist/utils/formats.js +0 -116
  278. package/dist/utils/formats.js.map +0 -1
  279. package/dist/utils/go-await.js +0 -16
  280. package/dist/utils/go-await.js.map +0 -1
  281. package/dist/utils/handle.js +0 -48
  282. package/dist/utils/handle.js.map +0 -1
  283. package/dist/utils/html-renderer.d.ts +0 -20
  284. package/dist/utils/html-renderer.js.map +0 -1
  285. package/dist/utils/index.d.ts +0 -16
  286. package/dist/utils/index.js +0 -1038
  287. package/dist/utils/index.js.map +0 -1
  288. package/dist/utils/parsers.js +0 -160
  289. package/dist/utils/parsers.js.map +0 -1
  290. package/dist/utils/path-matcher.d.ts +0 -25
  291. package/dist/utils/path-matcher.js +0 -73
  292. package/dist/utils/path-matcher.js.map +0 -1
  293. package/dist/utils/request-validator.d.ts +0 -66
  294. package/dist/utils/request-validator.js +0 -158
  295. package/dist/utils/request-validator.js.map +0 -1
  296. package/dist/utils/response.js +0 -102
  297. package/dist/utils/response.js.map +0 -1
  298. package/dist/utils/route-registry.d.ts +0 -195
  299. package/dist/utils/route-registry.js +0 -152
  300. package/dist/utils/route-registry.js.map +0 -1
  301. package/dist/utils/sse.d.ts +0 -87
  302. package/dist/utils/sse.js +0 -181
  303. package/dist/utils/sse.js.map +0 -1
  304. package/dist/utils/validators/validators.d.ts +0 -76
  305. package/dist/utils/validators/validators.js +0 -97
  306. package/dist/utils/validators/validators.js.map +0 -1
@@ -1,190 +0,0 @@
1
- // src/router/radix-tree.ts
2
- var RadixRouter = class {
3
- root;
4
- constructor() {
5
- this.root = this.createNode("");
6
- }
7
- createNode(path) {
8
- return {
9
- path,
10
- children: /* @__PURE__ */ Object.create(null),
11
- handlers: /* @__PURE__ */ Object.create(null)
12
- };
13
- }
14
- /** 分割路径 */
15
- splitPath(path) {
16
- return path.split("/").filter(Boolean);
17
- }
18
- /** 编译器函数 - 用于预编译中间件链 */
19
- compiler;
20
- /** 设置中间件编译器 */
21
- setCompiler(compiler) {
22
- this.compiler = compiler;
23
- }
24
- /** 注册路由 */
25
- register(method, pattern, handler, middleware = []) {
26
- const segments = this.splitPath(pattern);
27
- let node = this.root;
28
- for (const segment of segments) {
29
- const firstChar = segment[0];
30
- if (firstChar === ":") {
31
- if (!node.paramChild) {
32
- node.paramChild = this.createNode(segment);
33
- node.paramChild.paramName = segment.substring(1);
34
- }
35
- node = node.paramChild;
36
- } else if (firstChar === "*") {
37
- if (!node.wildcardChild) {
38
- node.wildcardChild = this.createNode(segment);
39
- node.wildcardChild.paramName = segment.length > 1 ? segment.substring(1) : "*";
40
- }
41
- node = node.wildcardChild;
42
- break;
43
- } else {
44
- if (!node.children[segment]) {
45
- node.children[segment] = this.createNode(segment);
46
- }
47
- node = node.children[segment];
48
- }
49
- }
50
- const routeHandler = { handler, middleware };
51
- if (this.compiler && middleware.length === 0) {
52
- routeHandler.compiled = this.compiler([], handler);
53
- }
54
- node.handlers[method] = routeHandler;
55
- }
56
- /** 预编译所有路由(在添加全局中间件后调用) */
57
- precompileAll(globalMiddleware) {
58
- if (!this.compiler) return;
59
- this.precompileNode(this.root, globalMiddleware);
60
- }
61
- precompileNode(node, globalMiddleware) {
62
- for (const method in node.handlers) {
63
- const routeHandler = node.handlers[method];
64
- if (routeHandler) {
65
- const allMiddleware = [...globalMiddleware, ...routeHandler.middleware];
66
- routeHandler.compiled = this.compiler(
67
- allMiddleware,
68
- routeHandler.handler
69
- );
70
- }
71
- }
72
- for (const key in node.children) {
73
- this.precompileNode(node.children[key], globalMiddleware);
74
- }
75
- if (node.paramChild) {
76
- this.precompileNode(node.paramChild, globalMiddleware);
77
- }
78
- if (node.wildcardChild) {
79
- this.precompileNode(node.wildcardChild, globalMiddleware);
80
- }
81
- }
82
- /** 匹配路由 */
83
- match(method, path) {
84
- const segments = this.splitPath(path);
85
- const params = /* @__PURE__ */ Object.create(null);
86
- const node = this.matchNode(this.root, segments, 0, params);
87
- if (!node) return null;
88
- const routeHandler = node.handlers[method];
89
- if (!routeHandler) return null;
90
- return {
91
- handler: routeHandler.handler,
92
- middleware: routeHandler.middleware,
93
- params,
94
- compiled: routeHandler.compiled
95
- };
96
- }
97
- /** 递归匹配节点 (优先级: 静态 > 动态参数 > 通配符) */
98
- matchNode(node, segments, index, params) {
99
- if (index === segments.length) {
100
- for (const method in node.handlers) {
101
- if (node.handlers[method]) return node;
102
- }
103
- return null;
104
- }
105
- const segment = segments[index];
106
- const staticChild = node.children[segment];
107
- if (staticChild) {
108
- const result = this.matchNode(staticChild, segments, index + 1, params);
109
- if (result) return result;
110
- }
111
- if (node.paramChild) {
112
- const paramName = node.paramChild.paramName;
113
- const oldValue = params[paramName];
114
- params[paramName] = segment;
115
- const result = this.matchNode(
116
- node.paramChild,
117
- segments,
118
- index + 1,
119
- params
120
- );
121
- if (result) return result;
122
- if (oldValue === void 0) {
123
- delete params[paramName];
124
- } else {
125
- params[paramName] = oldValue;
126
- }
127
- }
128
- if (node.wildcardChild) {
129
- params[node.wildcardChild.paramName || "*"] = segments.slice(index).join("/");
130
- return node.wildcardChild;
131
- }
132
- return null;
133
- }
134
- /** 获取路径允许的 HTTP 方法 */
135
- getAllowedMethods(path) {
136
- const segments = this.splitPath(path);
137
- const node = this.findNode(segments);
138
- if (!node) return [];
139
- const methods = [];
140
- for (const method in node.handlers) {
141
- if (node.handlers[method]) {
142
- methods.push(method);
143
- }
144
- }
145
- return methods;
146
- }
147
- /** 查找节点(不提取参数) */
148
- findNode(segments) {
149
- let node = this.root;
150
- for (const segment of segments) {
151
- if (node.children[segment]) {
152
- node = node.children[segment];
153
- } else if (node.paramChild) {
154
- node = node.paramChild;
155
- } else if (node.wildcardChild) {
156
- return node.wildcardChild;
157
- } else {
158
- return null;
159
- }
160
- }
161
- return node;
162
- }
163
- /** 获取所有已注册的路由 */
164
- getRoutes() {
165
- const routes = [];
166
- this.collectRoutes(this.root, "", routes);
167
- return routes;
168
- }
169
- collectRoutes(node, prefix, routes) {
170
- const currentPath = prefix + (node.path ? "/" + node.path : "");
171
- for (const method in node.handlers) {
172
- if (node.handlers[method]) {
173
- routes.push({ method, path: currentPath || "/" });
174
- }
175
- }
176
- for (const key in node.children) {
177
- this.collectRoutes(node.children[key], currentPath, routes);
178
- }
179
- if (node.paramChild) {
180
- this.collectRoutes(node.paramChild, currentPath, routes);
181
- }
182
- if (node.wildcardChild) {
183
- this.collectRoutes(node.wildcardChild, currentPath, routes);
184
- }
185
- }
186
- };
187
- export {
188
- RadixRouter
189
- };
190
- //# sourceMappingURL=radix-tree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/router/radix-tree.ts"],"sourcesContent":["/**\n * Radix Tree 路由匹配器\n *\n * 高性能路由匹配实现,时间复杂度 O(k),k 为路径段数\n *\n * 支持的路由模式:\n * - 静态路径: /users, /api/v1/health\n * - 动态参数: /users/:id, /posts/:postId/comments/:commentId\n * - 通配符: /files/*, /static/*filepath\n */\n\nimport type { Handler, Middleware, Method } from \"../types\";\n\n/** 预编译的处理器类型 */\ntype CompiledHandler = (req: Request) => Promise<Response>;\n\n/** 路由处理信息 */\ninterface RouteHandler {\n handler: Handler;\n middleware: Middleware[];\n /** 预编译后的完整处理链(包含中间件) */\n compiled?: CompiledHandler;\n}\n\n/** Radix Tree 节点 */\ninterface RadixNode {\n path: string;\n children: Record<string, RadixNode>;\n paramChild?: RadixNode;\n wildcardChild?: RadixNode;\n paramName?: string;\n handlers: Record<Method, RouteHandler | undefined>;\n}\n\n/** 路由匹配结果 */\nexport interface MatchResult {\n handler: Handler;\n middleware: Middleware[];\n params: Record<string, string>;\n /** 预编译后的完整处理链 */\n compiled?: CompiledHandler;\n}\n\n/**\n * Radix Tree 路由器\n *\n * @example\n * ```typescript\n * const router = new RadixRouter();\n * router.register(\"GET\", \"/users/:id\", handler);\n * const result = router.match(\"GET\", \"/users/123\");\n * // result.params = { id: \"123\" }\n * ```\n */\nexport class RadixRouter {\n private root: RadixNode;\n\n constructor() {\n this.root = this.createNode(\"\");\n }\n\n private createNode(path: string): RadixNode {\n return {\n path,\n children: Object.create(null),\n handlers: Object.create(null),\n };\n }\n\n /** 分割路径 */\n private splitPath(path: string): string[] {\n return path.split(\"/\").filter(Boolean);\n }\n\n /** 编译器函数 - 用于预编译中间件链 */\n private compiler?: (\n middleware: Middleware[],\n handler: Handler,\n ) => CompiledHandler;\n\n /** 设置中间件编译器 */\n setCompiler(\n compiler: (middleware: Middleware[], handler: Handler) => CompiledHandler,\n ): void {\n this.compiler = compiler;\n }\n\n /** 注册路由 */\n register(\n method: Method,\n pattern: string,\n handler: Handler,\n middleware: Middleware[] = [],\n ): void {\n const segments = this.splitPath(pattern);\n let node = this.root;\n\n for (const segment of segments) {\n const firstChar = segment[0];\n\n if (firstChar === \":\") {\n // 动态参数节点\n if (!node.paramChild) {\n node.paramChild = this.createNode(segment);\n node.paramChild.paramName = segment.substring(1);\n }\n node = node.paramChild;\n } else if (firstChar === \"*\") {\n // 通配符节点\n if (!node.wildcardChild) {\n node.wildcardChild = this.createNode(segment);\n node.wildcardChild.paramName =\n segment.length > 1 ? segment.substring(1) : \"*\";\n }\n node = node.wildcardChild;\n break;\n } else {\n // 静态路径节点\n if (!node.children[segment]) {\n node.children[segment] = this.createNode(segment);\n }\n node = node.children[segment];\n }\n }\n\n const routeHandler: RouteHandler = { handler, middleware };\n\n // 如果没有全局中间件且设置了编译器,预编译处理链\n if (this.compiler && middleware.length === 0) {\n routeHandler.compiled = this.compiler([], handler);\n }\n\n node.handlers[method] = routeHandler;\n }\n\n /** 预编译所有路由(在添加全局中间件后调用) */\n precompileAll(globalMiddleware: Middleware[]): void {\n if (!this.compiler) return;\n this.precompileNode(this.root, globalMiddleware);\n }\n\n private precompileNode(\n node: RadixNode,\n globalMiddleware: Middleware[],\n ): void {\n for (const method in node.handlers) {\n const routeHandler = node.handlers[method as Method];\n if (routeHandler) {\n const allMiddleware = [...globalMiddleware, ...routeHandler.middleware];\n routeHandler.compiled = this.compiler!(\n allMiddleware,\n routeHandler.handler,\n );\n }\n }\n\n for (const key in node.children) {\n this.precompileNode(node.children[key], globalMiddleware);\n }\n\n if (node.paramChild) {\n this.precompileNode(node.paramChild, globalMiddleware);\n }\n\n if (node.wildcardChild) {\n this.precompileNode(node.wildcardChild, globalMiddleware);\n }\n }\n\n /** 匹配路由 */\n match(method: Method, path: string): MatchResult | null {\n const segments = this.splitPath(path);\n const params: Record<string, string> = Object.create(null);\n\n const node = this.matchNode(this.root, segments, 0, params);\n if (!node) return null;\n\n const routeHandler = node.handlers[method];\n if (!routeHandler) return null;\n\n return {\n handler: routeHandler.handler,\n middleware: routeHandler.middleware,\n params,\n compiled: routeHandler.compiled,\n };\n }\n\n /** 递归匹配节点 (优先级: 静态 > 动态参数 > 通配符) */\n private matchNode(\n node: RadixNode,\n segments: string[],\n index: number,\n params: Record<string, string>,\n ): RadixNode | null {\n if (index === segments.length) {\n for (const method in node.handlers) {\n if (node.handlers[method as Method]) return node;\n }\n return null;\n }\n\n const segment = segments[index];\n\n // 1. 静态路径\n const staticChild = node.children[segment];\n if (staticChild) {\n const result = this.matchNode(staticChild, segments, index + 1, params);\n if (result) return result;\n }\n\n // 2. 动态参数\n if (node.paramChild) {\n const paramName = node.paramChild.paramName!;\n const oldValue = params[paramName];\n\n params[paramName] = segment;\n const result = this.matchNode(\n node.paramChild,\n segments,\n index + 1,\n params,\n );\n\n if (result) return result;\n\n // 回溯\n if (oldValue === undefined) {\n delete params[paramName];\n } else {\n params[paramName] = oldValue;\n }\n }\n\n // 3. 通配符\n if (node.wildcardChild) {\n params[node.wildcardChild.paramName || \"*\"] = segments\n .slice(index)\n .join(\"/\");\n return node.wildcardChild;\n }\n\n return null;\n }\n\n /** 获取路径允许的 HTTP 方法 */\n getAllowedMethods(path: string): Method[] {\n const segments = this.splitPath(path);\n const node = this.findNode(segments);\n if (!node) return [];\n\n const methods: Method[] = [];\n for (const method in node.handlers) {\n if (node.handlers[method as Method]) {\n methods.push(method as Method);\n }\n }\n return methods;\n }\n\n /** 查找节点(不提取参数) */\n private findNode(segments: string[]): RadixNode | null {\n let node = this.root;\n\n for (const segment of segments) {\n if (node.children[segment]) {\n node = node.children[segment];\n } else if (node.paramChild) {\n node = node.paramChild;\n } else if (node.wildcardChild) {\n return node.wildcardChild;\n } else {\n return null;\n }\n }\n\n return node;\n }\n\n /** 获取所有已注册的路由 */\n getRoutes(): Array<{ method: Method; path: string }> {\n const routes: Array<{ method: Method; path: string }> = [];\n this.collectRoutes(this.root, \"\", routes);\n return routes;\n }\n\n private collectRoutes(\n node: RadixNode,\n prefix: string,\n routes: Array<{ method: Method; path: string }>,\n ): void {\n const currentPath = prefix + (node.path ? \"/\" + node.path : \"\");\n\n for (const method in node.handlers) {\n if (node.handlers[method as Method]) {\n routes.push({ method: method as Method, path: currentPath || \"/\" });\n }\n }\n\n for (const key in node.children) {\n this.collectRoutes(node.children[key], currentPath, routes);\n }\n\n if (node.paramChild) {\n this.collectRoutes(node.paramChild, currentPath, routes);\n }\n\n if (node.wildcardChild) {\n this.collectRoutes(node.wildcardChild, currentPath, routes);\n }\n }\n}\n"],"mappings":"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","names":[]}
package/dist/router.js DELETED
@@ -1,41 +0,0 @@
1
- // src/router.ts
2
- function flattenNestedRoutes(routes) {
3
- const flattened = [];
4
- function processRoute(route, parentPath = "", parentMiddleware = []) {
5
- const currentPath = normalizePath(parentPath + route.path);
6
- const currentMiddleware = [
7
- ...parentMiddleware,
8
- ...route.middleware || []
9
- ];
10
- if ("method" in route && "handler" in route) {
11
- const leafRoute = route;
12
- flattened.push({
13
- ...leafRoute,
14
- fullPath: currentPath,
15
- middlewareChain: currentMiddleware
16
- });
17
- } else if ("children" in route && route.children) {
18
- for (const child of route.children) {
19
- processRoute(child, currentPath, currentMiddleware);
20
- }
21
- }
22
- }
23
- for (const route of routes) {
24
- processRoute(route);
25
- }
26
- return flattened;
27
- }
28
- function normalizePath(path) {
29
- let normalized = decodeURIComponent(path);
30
- normalized = normalized.replace(/\/+/g, "/");
31
- if (normalized === "") return "/";
32
- if (normalized !== "/" && normalized.endsWith("/")) {
33
- normalized = normalized.slice(0, -1);
34
- }
35
- return normalized;
36
- }
37
- export {
38
- flattenNestedRoutes,
39
- normalizePath
40
- };
41
- //# sourceMappingURL=router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"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 ): void {\n // 计算当前完整路径\n const currentPath = normalizePath(parentPath + route.path);\n // 合并中间件链\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\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 });\n } else if (\"children\" in route && route.children) {\n // 分组路由,递归处理子路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware);\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":";AAgCO,SAAS,oBACd,QACkB;AAClB,QAAM,YAA8B,CAAC;AAErC,WAAS,aACP,OACA,aAAa,IACb,mBAAiC,CAAC,GAC5B;AAEN,UAAM,cAAc,cAAc,aAAa,MAAM,IAAI;AAEzD,UAAM,oBAAoB;AAAA,MACxB,GAAG;AAAA,MACH,GAAI,MAAM,cAAc,CAAC;AAAA,IAC3B;AAEA,QAAI,YAAY,SAAS,aAAa,OAAO;AAE3C,YAAM,YAAY;AAClB,gBAAU,KAAK;AAAA,QACb,GAAG;AAAA,QACH,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,WAAW,cAAc,SAAS,MAAM,UAAU;AAEhD,iBAAW,SAAS,MAAM,UAAU;AAClC,qBAAa,OAAO,aAAa,iBAAiB;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEA,aAAW,SAAS,QAAQ;AAC1B,iBAAa,KAAK;AAAA,EACpB;AAEA,SAAO;AACT;AAeO,SAAS,cAAc,MAAsB;AAElD,MAAI,aAAa,mBAAmB,IAAI;AAGxC,eAAa,WAAW,QAAQ,QAAQ,GAAG;AAG3C,MAAI,eAAe,GAAI,QAAO;AAG9B,MAAI,eAAe,OAAO,WAAW,SAAS,GAAG,GAAG;AAClD,iBAAa,WAAW,MAAM,GAAG,EAAE;AAAA,EACrC;AAEA,SAAO;AACT;","names":[]}
package/dist/serve.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export { FetchHandler, ServeOptions, ServeResult, createAdaptorServer, serve } from './node-server/serve.js';
2
- import 'node:http';
package/dist/serve.js DELETED
@@ -1,281 +0,0 @@
1
- // src/node-server/serve.ts
2
- import {
3
- createServer
4
- } from "http";
5
-
6
- // src/node-server/request.ts
7
- import { Readable } from "stream";
8
- var requestCache = /* @__PURE__ */ Symbol("requestCache");
9
- var incomingKey = /* @__PURE__ */ Symbol("incoming");
10
- var urlKey = /* @__PURE__ */ Symbol("url");
11
- var headersKey = /* @__PURE__ */ Symbol("headers");
12
- function parseHeaders(rawHeaders) {
13
- const headers = new Headers();
14
- for (let i = 0; i < rawHeaders.length; i += 2) {
15
- const key = rawHeaders[i];
16
- const value = rawHeaders[i + 1];
17
- if (key.charCodeAt(0) !== 58) {
18
- headers.append(key, value);
19
- }
20
- }
21
- return headers;
22
- }
23
- function toWebStream(nodeStream) {
24
- return nodeStream;
25
- }
26
- function createRealRequest(proxy) {
27
- const incoming = proxy[incomingKey];
28
- const method = incoming.method || "GET";
29
- const init = {
30
- method,
31
- headers: proxy[headersKey] || parseHeaders(incoming.rawHeaders)
32
- };
33
- if (method !== "GET" && method !== "HEAD") {
34
- const nodeWebStream = Readable.toWeb(
35
- incoming
36
- );
37
- init.body = toWebStream(nodeWebStream);
38
- init.duplex = "half";
39
- }
40
- return new Request(proxy[urlKey], init);
41
- }
42
- var requestPrototype = {};
43
- Object.defineProperty(requestPrototype, "method", {
44
- get() {
45
- const self = this;
46
- return self[incomingKey].method || "GET";
47
- },
48
- enumerable: true
49
- });
50
- Object.defineProperty(requestPrototype, "url", {
51
- get() {
52
- const self = this;
53
- return self[urlKey];
54
- },
55
- enumerable: true
56
- });
57
- Object.defineProperty(requestPrototype, "headers", {
58
- get() {
59
- const self = this;
60
- if (!self[headersKey]) {
61
- self[headersKey] = parseHeaders(self[incomingKey].rawHeaders);
62
- }
63
- return self[headersKey];
64
- },
65
- enumerable: true
66
- });
67
- Object.defineProperty(requestPrototype, "_getRequest", {
68
- value: function() {
69
- const self = this;
70
- if (!self[requestCache]) {
71
- self[requestCache] = createRealRequest(self);
72
- }
73
- return self[requestCache];
74
- },
75
- enumerable: false
76
- });
77
- var proxyGetters = [
78
- "body",
79
- "bodyUsed",
80
- "signal",
81
- "cache",
82
- "credentials",
83
- "destination",
84
- "integrity",
85
- "mode",
86
- "redirect",
87
- "referrer",
88
- "referrerPolicy",
89
- "keepalive"
90
- ];
91
- proxyGetters.forEach((key) => {
92
- Object.defineProperty(requestPrototype, key, {
93
- get() {
94
- const self = this;
95
- return self._getRequest()[key];
96
- },
97
- enumerable: true
98
- });
99
- });
100
- var proxyMethods = [
101
- "arrayBuffer",
102
- "blob",
103
- "clone",
104
- "formData",
105
- "json",
106
- "text"
107
- ];
108
- proxyMethods.forEach((key) => {
109
- Object.defineProperty(requestPrototype, key, {
110
- value: function() {
111
- const self = this;
112
- const req = self._getRequest();
113
- return req[key].call(req);
114
- },
115
- enumerable: true
116
- });
117
- });
118
- Object.setPrototypeOf(requestPrototype, Request.prototype);
119
- function createProxyRequest(incoming, defaultHost) {
120
- const req = Object.create(requestPrototype);
121
- req[incomingKey] = incoming;
122
- const host = incoming.headers.host || defaultHost;
123
- const protocol = incoming.socket.encrypted ? "https" : "http";
124
- req[urlKey] = `${protocol}://${host}${incoming.url || "/"}`;
125
- return req;
126
- }
127
-
128
- // src/node-server/response.ts
129
- function buildOutgoingHeaders(headers) {
130
- const result = {};
131
- const cookies = [];
132
- headers.forEach((value, key) => {
133
- if (key === "set-cookie") {
134
- cookies.push(value);
135
- } else {
136
- result[key] = value;
137
- }
138
- });
139
- if (cookies.length > 0) {
140
- result["set-cookie"] = cookies;
141
- }
142
- return result;
143
- }
144
- async function writeBodyStream(body, outgoing) {
145
- const reader = body.getReader();
146
- try {
147
- while (true) {
148
- const { done, value } = await reader.read();
149
- if (done) {
150
- break;
151
- }
152
- const canContinue = outgoing.write(value);
153
- if (!canContinue) {
154
- await new Promise((resolve) => {
155
- outgoing.once("drain", resolve);
156
- });
157
- }
158
- }
159
- } finally {
160
- reader.releaseLock();
161
- }
162
- }
163
- async function writeResponse(response, outgoing) {
164
- outgoing.statusCode = response.status;
165
- const headers = buildOutgoingHeaders(response.headers);
166
- for (const [key, value] of Object.entries(headers)) {
167
- outgoing.setHeader(key, value);
168
- }
169
- const body = response.body;
170
- if (!body) {
171
- outgoing.end();
172
- return;
173
- }
174
- try {
175
- await writeBodyStream(body, outgoing);
176
- outgoing.end();
177
- } catch (error) {
178
- if (!outgoing.destroyed) {
179
- outgoing.destroy(
180
- error instanceof Error ? error : new Error(String(error))
181
- );
182
- }
183
- }
184
- }
185
-
186
- // src/node-server/serve.ts
187
- function createRequestHandler(fetch, defaultHost, onError) {
188
- return async (incoming, outgoing) => {
189
- try {
190
- const request = createProxyRequest(incoming, defaultHost);
191
- const response = await fetch(request);
192
- await writeResponse(response, outgoing);
193
- } catch (error) {
194
- const err = error instanceof Error ? error : new Error(String(error));
195
- if (onError) {
196
- try {
197
- const errorResponse = await onError(err);
198
- await writeResponse(errorResponse, outgoing);
199
- return;
200
- } catch {
201
- }
202
- }
203
- if (!outgoing.headersSent) {
204
- outgoing.statusCode = 500;
205
- outgoing.setHeader("Content-Type", "text/plain");
206
- outgoing.end("Internal Server Error");
207
- }
208
- }
209
- };
210
- }
211
- function serve(options, callback) {
212
- const { fetch, port = 3e3, hostname = "0.0.0.0", onError, gracefulShutdown } = options;
213
- const defaultHost = `${hostname === "0.0.0.0" ? "localhost" : hostname}:${port}`;
214
- const handler = createRequestHandler(fetch, defaultHost, onError);
215
- const server = createServer(handler);
216
- const connections = /* @__PURE__ */ new Set();
217
- server.on("connection", (socket) => {
218
- connections.add(socket);
219
- socket.on("close", () => connections.delete(socket));
220
- });
221
- let isShuttingDown = false;
222
- const shutdown = async () => {
223
- if (isShuttingDown) return;
224
- isShuttingDown = true;
225
- const shutdownOptions = typeof gracefulShutdown === "object" ? gracefulShutdown : {};
226
- const timeout = shutdownOptions.timeout ?? 3e4;
227
- if (shutdownOptions.onShutdown) {
228
- await shutdownOptions.onShutdown();
229
- }
230
- return new Promise((resolve) => {
231
- const forceCloseTimer = setTimeout(() => {
232
- for (const socket of connections) {
233
- socket.destroy();
234
- }
235
- connections.clear();
236
- resolve();
237
- }, timeout);
238
- server.close(() => {
239
- clearTimeout(forceCloseTimer);
240
- shutdownOptions.onShutdownComplete?.();
241
- resolve();
242
- });
243
- for (const socket of connections) {
244
- if (!socket.writableLength) {
245
- socket.end();
246
- }
247
- }
248
- });
249
- };
250
- if (gracefulShutdown) {
251
- const shutdownOptions = typeof gracefulShutdown === "object" ? gracefulShutdown : {};
252
- const signals = shutdownOptions.signals ?? ["SIGINT", "SIGTERM"];
253
- for (const signal of signals) {
254
- process.on(signal, () => {
255
- shutdown().then(() => process.exit(0));
256
- });
257
- }
258
- }
259
- server.listen(port, hostname, callback);
260
- return {
261
- server,
262
- port,
263
- hostname,
264
- stop: () => new Promise((resolve, reject) => {
265
- server.close((err) => {
266
- if (err) reject(err);
267
- else resolve();
268
- });
269
- }),
270
- shutdown
271
- };
272
- }
273
- function createAdaptorServer(fetch, onError) {
274
- const handler = createRequestHandler(fetch, "localhost", onError);
275
- return createServer(handler);
276
- }
277
- export {
278
- createAdaptorServer,
279
- serve
280
- };
281
- //# sourceMappingURL=serve.js.map
package/dist/serve.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/node-server/serve.ts","../src/node-server/request.ts","../src/node-server/response.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","/**\n * 优化的 Request 代理\n * 延迟创建真实 Request,减少不必要的对象分配\n */\n\nimport { Readable } from \"node:stream\";\nimport type { ReadableStream as NodeReadableStream } from \"node:stream/web\";\nimport type { IncomingMessage } from \"node:http\";\n\n// 内部 Symbol\nconst requestCache = Symbol(\"requestCache\");\nconst incomingKey = Symbol(\"incoming\");\nconst urlKey = Symbol(\"url\");\nconst headersKey = Symbol(\"headers\");\n\n/**\n * 从 rawHeaders 高效解析 Headers\n */\nfunction parseHeaders(rawHeaders: string[]): Headers {\n const headers = new Headers();\n for (let i = 0; i < rawHeaders.length; i += 2) {\n const key = rawHeaders[i];\n const value = rawHeaders[i + 1];\n // 跳过 HTTP/2 伪头 (以 : 开头)\n if (key.charCodeAt(0) !== 58) {\n headers.append(key, value);\n }\n }\n return headers;\n}\n\n/**\n * 将 Node.js ReadableStream 转换为 Web 标准 ReadableStream\n * Node.js 和 Web 标准的 ReadableStream 在运行时兼容,但 TypeScript 类型不同\n */\nfunction toWebStream(\n nodeStream: NodeReadableStream<Uint8Array>,\n): ReadableStream<Uint8Array> {\n // Node.js ReadableStream 和 Web ReadableStream 在运行时是兼容的\n // 这里使用类型断言是安全的,因为 Node.js >= 18 的 stream/web 完全实现了 WHATWG Streams 标准\n return nodeStream as unknown as ReadableStream<Uint8Array>;\n}\n\n/** 代理 Request 内部接口 */\ninterface ProxyRequestInternal {\n [requestCache]?: Request;\n [incomingKey]: IncomingMessage;\n [urlKey]: string;\n [headersKey]?: Headers;\n _getRequest(): Request;\n}\n\n/**\n * 创建真实的 Request 对象\n */\nfunction createRealRequest(proxy: ProxyRequestInternal): Request {\n const incoming = proxy[incomingKey];\n const method = incoming.method || \"GET\";\n const init: RequestInit & { duplex?: string } = {\n method,\n headers: proxy[headersKey] || parseHeaders(incoming.rawHeaders),\n };\n\n // 只有非 GET/HEAD 请求才有 body\n if (method !== \"GET\" && method !== \"HEAD\") {\n // 使用 Node.js 原生流转换,避免收集 chunks\n const nodeWebStream = Readable.toWeb(\n incoming,\n ) as NodeReadableStream<Uint8Array>;\n init.body = toWebStream(nodeWebStream);\n init.duplex = \"half\";\n }\n\n return new Request(proxy[urlKey], init);\n}\n\n/**\n * Request 代理原型\n * 使用 Object.defineProperty 定义属性以支持 this 绑定\n */\nconst requestPrototype: object = {};\n\n// 定义 method 属性\nObject.defineProperty(requestPrototype, \"method\", {\n get() {\n const self = this as ProxyRequestInternal;\n return self[incomingKey].method || \"GET\";\n },\n enumerable: true,\n});\n\n// 定义 url 属性\nObject.defineProperty(requestPrototype, \"url\", {\n get() {\n const self = this as ProxyRequestInternal;\n return self[urlKey];\n },\n enumerable: true,\n});\n\n// 定义 headers 属性(延迟解析)\nObject.defineProperty(requestPrototype, \"headers\", {\n get() {\n const self = this as ProxyRequestInternal;\n if (!self[headersKey]) {\n self[headersKey] = parseHeaders(self[incomingKey].rawHeaders);\n }\n return self[headersKey];\n },\n enumerable: true,\n});\n\n// 定义 _getRequest 方法(获取或创建真实 Request)\nObject.defineProperty(requestPrototype, \"_getRequest\", {\n value: function () {\n const self = this as ProxyRequestInternal;\n if (!self[requestCache]) {\n self[requestCache] = createRealRequest(self);\n }\n return self[requestCache]!;\n },\n enumerable: false,\n});\n\n// 代理需要访问真实 Request 的属性\nconst proxyGetters = [\n \"body\",\n \"bodyUsed\",\n \"signal\",\n \"cache\",\n \"credentials\",\n \"destination\",\n \"integrity\",\n \"mode\",\n \"redirect\",\n \"referrer\",\n \"referrerPolicy\",\n \"keepalive\",\n];\n\nproxyGetters.forEach((key) => {\n Object.defineProperty(requestPrototype, key, {\n get() {\n const self = this as ProxyRequestInternal;\n return self._getRequest()[key as keyof Request];\n },\n enumerable: true,\n });\n});\n\n// 代理需要调用真实 Request 的方法\nconst proxyMethods = [\n \"arrayBuffer\",\n \"blob\",\n \"clone\",\n \"formData\",\n \"json\",\n \"text\",\n];\n\nproxyMethods.forEach((key) => {\n Object.defineProperty(requestPrototype, key, {\n value: function () {\n const self = this as ProxyRequestInternal;\n const req = self._getRequest();\n return (req[key as keyof Request] as () => Promise<unknown>).call(req);\n },\n enumerable: true,\n });\n});\n\n// 设置原型链\nObject.setPrototypeOf(requestPrototype, Request.prototype);\n\n/**\n * 创建代理 Request\n * @param incoming Node.js IncomingMessage\n * @param defaultHost 默认主机名\n */\nexport function createProxyRequest(\n incoming: IncomingMessage,\n defaultHost: string,\n): Request {\n const req = Object.create(requestPrototype) as ProxyRequestInternal;\n req[incomingKey] = incoming;\n\n // 构建 URL\n const host = incoming.headers.host || defaultHost;\n const protocol = (incoming.socket as { encrypted?: boolean }).encrypted\n ? \"https\"\n : \"http\";\n req[urlKey] = `${protocol}://${host}${incoming.url || \"/\"}`;\n\n return req as unknown as Request;\n}\n","/**\n * 优化的 Response 写入\n * 流式写入,避免内存拷贝\n */\n\nimport type { ServerResponse } from \"node:http\";\n\n/**\n * 构建 Node.js 响应头\n * 处理 set-cookie 多值情况\n */\nfunction buildOutgoingHeaders(\n headers: Headers,\n): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n const cookies: string[] = [];\n\n headers.forEach((value, key) => {\n if (key === \"set-cookie\") {\n cookies.push(value);\n } else {\n result[key] = value;\n }\n });\n\n if (cookies.length > 0) {\n result[\"set-cookie\"] = cookies;\n }\n\n return result;\n}\n\n/**\n * 流式写入 Response body 到 ServerResponse\n * 支持背压处理,避免内存溢出\n */\nasync function writeBodyStream(\n body: ReadableStream<Uint8Array>,\n outgoing: ServerResponse,\n): Promise<void> {\n const reader = body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n // 背压处理:如果写入返回 false,等待 drain 事件\n const canContinue = outgoing.write(value);\n if (!canContinue) {\n await new Promise<void>((resolve) => {\n outgoing.once(\"drain\", resolve);\n });\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * 将 Web Response 写入 Node.js ServerResponse\n * 流式写入,零拷贝\n */\nexport async function writeResponse(\n response: Response,\n outgoing: ServerResponse,\n): Promise<void> {\n // 设置状态码\n outgoing.statusCode = response.status;\n\n // 设置响应头\n const headers = buildOutgoingHeaders(response.headers);\n for (const [key, value] of Object.entries(headers)) {\n outgoing.setHeader(key, value);\n }\n\n const body = response.body;\n\n // 无 body 的情况\n if (!body) {\n outgoing.end();\n return;\n }\n\n // 流式写入 body\n try {\n await writeBodyStream(body, outgoing);\n outgoing.end();\n } catch (error) {\n // 处理客户端提前断开等情况\n if (!outgoing.destroyed) {\n outgoing.destroy(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n}\n\n/**\n * 简化版写入(用于已知小体积响应)\n * 直接 arrayBuffer 转换,适用于确定的小响应\n */\nexport async function writeResponseSimple(\n response: Response,\n outgoing: ServerResponse,\n): Promise<void> {\n outgoing.statusCode = response.status;\n\n const headers = buildOutgoingHeaders(response.headers);\n for (const [key, value] of Object.entries(headers)) {\n outgoing.setHeader(key, value);\n }\n\n const body = response.body;\n if (!body) {\n outgoing.end();\n return;\n }\n\n // 对于小响应,直接读取全部内容\n const buffer = await response.arrayBuffer();\n outgoing.end(Buffer.from(buffer));\n}\n"],"mappings":"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","names":[]}
@@ -1,37 +0,0 @@
1
- import { Middleware } from '../types/types.js';
2
-
3
- /**
4
- * 服务器基类
5
- * 包含所有服务器类型的公共逻辑
6
- */
7
- declare abstract class BaseServer {
8
- protected globalMiddleware: Middleware[];
9
- use(mw: Middleware): void;
10
- /**
11
- * 打印扁平化后的路由信息,用于调试
12
- */
13
- protected logFlattenedRoutes(routes: any[], type?: string): void;
14
- /**
15
- * 检测路由冲突
16
- * 检查是否有路径相同但方法不同的路由,以及潜在的路径冲突
17
- */
18
- protected detectRouteConflicts(routes: any[]): void;
19
- /**
20
- * 检测动态路由的潜在冲突
21
- */
22
- private detectDynamicRouteConflicts;
23
- /**
24
- * 判断两个路径是否可能冲突
25
- */
26
- private pathsMayConflict;
27
- /**
28
- * 路径匹配
29
- */
30
- protected matchPath(pattern: string, path: string): boolean;
31
- /**
32
- * 提取路径参数
33
- */
34
- protected extractParams(pattern: string, path: string): Record<string, string>;
35
- }
36
-
37
- export { BaseServer };