vafast 0.4.2 → 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 -25
  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 -2578
  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 -1487
  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 -1454
  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 -232
  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 -44
  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 -1159
  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 -1156
  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 -737
  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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-monitor.mjs","names":[],"sources":["../../src/monitoring/native-monitor.ts"],"sourcesContent":["/**\n * 原生监控装饰器\n *\n * 通过装饰器模式为 Server 添加监控能力,完全不入侵原类\n *\n * @author Framework Team\n * @version 2.0.0\n * @license MIT\n */\n\nimport type { Server } from \"../server\";\n\n// 监控配置接口\nexport interface NativeMonitoringConfig {\n enabled?: boolean;\n console?: boolean;\n slowThreshold?: number; // 毫秒\n errorThreshold?: number;\n tags?: Record<string, string>;\n}\n\n// 监控指标接口\nexport interface NativeMonitoringMetrics {\n requestId: string;\n method: string;\n path: string;\n statusCode: number;\n totalTime: number;\n timestamp: number;\n memoryUsage: {\n heapUsed: number;\n heapTotal: number;\n };\n}\n\n// 带监控的 Server 接口\nexport interface MonitoredServer extends Server {\n // 监控相关方法\n getMonitoringStatus(): any;\n getMonitoringMetrics(): NativeMonitoringMetrics[];\n resetMonitoring(): void;\n\n // 原始方法保持不变\n fetch: (req: Request) => Promise<Response>;\n use: (mw: any) => void;\n}\n\n// 原生监控器\nclass NativeMonitor {\n private config: NativeMonitoringConfig;\n private metrics: NativeMonitoringMetrics[] = [];\n private isEnabled = false;\n\n constructor(config: NativeMonitoringConfig = {}) {\n this.config = {\n enabled: true,\n console: true,\n slowThreshold: 1000,\n errorThreshold: 0.05,\n tags: { framework: \"vafast\" },\n ...config,\n };\n\n this.isEnabled = this.config.enabled ?? true;\n\n if (this.isEnabled && this.config.console) {\n console.log(\"✅ 原生监控已启用\");\n console.log(`📊 监控配置:`, {\n 慢请求阈值: `${this.config.slowThreshold}ms`,\n 错误率阈值: `${(this.config.errorThreshold! * 100).toFixed(1)}%`,\n 标签: this.config.tags,\n });\n }\n }\n\n // 记录监控指标\n recordMetrics(metrics: NativeMonitoringMetrics): void {\n if (!this.isEnabled) return;\n\n this.metrics.push(metrics);\n\n // 保持最近1000条记录\n if (this.metrics.length > 1000) {\n this.metrics = this.metrics.slice(-1000);\n }\n\n // 控制台输出\n if (this.config.console) {\n const status = metrics.statusCode < 400 ? \"✅\" : \"❌\";\n const timeColor =\n metrics.totalTime > this.config.slowThreshold! ? \"🐌\" : \"⚡\";\n\n console.log(\n `${status} ${metrics.method} ${metrics.path} - ${\n metrics.statusCode\n } (${timeColor} ${metrics.totalTime.toFixed(2)}ms)`,\n );\n\n // 慢请求警告\n if (metrics.totalTime > this.config.slowThreshold!) {\n console.warn(\n `🐌 慢请求警告: ${metrics.path} 耗时 ${metrics.totalTime.toFixed(\n 2,\n )}ms`,\n );\n }\n }\n }\n\n // 获取监控状态\n getStatus() {\n if (!this.isEnabled) {\n return { enabled: false, message: \"监控未启用\" };\n }\n\n const totalRequests = this.metrics.length;\n const successfulRequests = this.metrics.filter(\n (m) => m.statusCode < 400,\n ).length;\n const failedRequests = totalRequests - successfulRequests;\n const avgResponseTime =\n totalRequests > 0\n ? this.metrics.reduce((sum, m) => sum + m.totalTime, 0) / totalRequests\n : 0;\n\n return {\n enabled: true,\n totalRequests,\n successfulRequests,\n failedRequests,\n errorRate: totalRequests > 0 ? failedRequests / totalRequests : 0,\n avgResponseTime: avgResponseTime.toFixed(2) + \"ms\",\n memoryUsage: this.getMemoryUsage(),\n recentRequests: this.metrics.slice(-5),\n };\n }\n\n // 获取监控指标\n getMetrics() {\n return this.metrics;\n }\n\n // 重置监控数据\n reset() {\n this.metrics = [];\n console.log(\"🔄 监控数据已重置\");\n }\n\n // 获取内存使用情况\n private getMemoryUsage() {\n if (typeof process !== \"undefined\" && process.memoryUsage) {\n const mem = process.memoryUsage();\n return {\n heapUsed: (mem.heapUsed / 1024 / 1024).toFixed(2) + \"MB\",\n heapTotal: (mem.heapTotal / 1024 / 1024).toFixed(2) + \"MB\",\n external: (mem.external / 1024 / 1024).toFixed(2) + \"MB\",\n };\n }\n return { message: \"内存信息不可用\" };\n }\n}\n\n// 纯函数:为 Server 添加监控能力\nexport function withMonitoring(\n server: Server,\n config: NativeMonitoringConfig = {},\n): MonitoredServer {\n const monitor = new NativeMonitor(config);\n\n // 保存原始的 fetch 方法\n const originalFetch = server.fetch.bind(server);\n\n // 创建带监控的 fetch 方法\n const monitoredFetch = async (req: Request): Promise<Response> => {\n const startTime = performance.now();\n const requestId = `req_${Date.now()}_${Math.random()\n .toString(36)\n .substr(2, 9)}`;\n const { pathname } = new URL(req.url);\n const method = req.method;\n\n try {\n // 调用原始 fetch\n const response = await originalFetch(req);\n\n // 记录监控指标\n const totalTime = performance.now() - startTime;\n monitor.recordMetrics({\n requestId,\n method,\n path: pathname,\n statusCode: response.status,\n totalTime,\n timestamp: Date.now(),\n memoryUsage: (() => {\n if (typeof process !== \"undefined\" && process.memoryUsage) {\n const mem = process.memoryUsage();\n return {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n };\n }\n return { heapUsed: 0, heapTotal: 0 };\n })(),\n });\n\n return response;\n } catch (error) {\n // 记录错误监控指标\n const totalTime = performance.now() - startTime;\n monitor.recordMetrics({\n requestId,\n method,\n path: pathname,\n statusCode: 500,\n totalTime,\n timestamp: Date.now(),\n memoryUsage: (() => {\n if (typeof process !== \"undefined\" && process.memoryUsage) {\n const mem = process.memoryUsage();\n return {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n };\n }\n return { heapUsed: 0, heapTotal: 0 };\n })(),\n });\n\n throw error;\n }\n };\n\n // 创建带监控的 Server 对象\n const monitoredServer = {\n ...server,\n fetch: monitoredFetch,\n\n // 监控方法\n getMonitoringStatus: () => monitor.getStatus(),\n getMonitoringMetrics: () => monitor.getMetrics(),\n resetMonitoring: () => monitor.reset(),\n } as MonitoredServer;\n\n return monitoredServer;\n}\n\n// 便捷函数:创建带监控的 Server\nexport function createMonitoredServer(\n routes: any[],\n config?: NativeMonitoringConfig,\n): MonitoredServer {\n const { Server } = require(\"../server\");\n const server = new Server(routes);\n return withMonitoring(server, config);\n}\n"],"mappings":";;;;;;AAgDA,IAAM,gBAAN,MAAoB;CAClB,AAAQ;CACR,AAAQ,UAAqC,EAAE;CAC/C,AAAQ,YAAY;CAEpB,YAAY,SAAiC,EAAE,EAAE;AAC/C,OAAK,SAAS;GACZ,SAAS;GACT,SAAS;GACT,eAAe;GACf,gBAAgB;GAChB,MAAM,EAAE,WAAW,UAAU;GAC7B,GAAG;GACJ;AAED,OAAK,YAAY,KAAK,OAAO,WAAW;AAExC,MAAI,KAAK,aAAa,KAAK,OAAO,SAAS;AACzC,WAAQ,IAAI,YAAY;AACxB,WAAQ,IAAI,YAAY;IACtB,OAAO,GAAG,KAAK,OAAO,cAAc;IACpC,OAAO,IAAI,KAAK,OAAO,iBAAkB,KAAK,QAAQ,EAAE,CAAC;IACzD,IAAI,KAAK,OAAO;IACjB,CAAC;;;CAKN,cAAc,SAAwC;AACpD,MAAI,CAAC,KAAK,UAAW;AAErB,OAAK,QAAQ,KAAK,QAAQ;AAG1B,MAAI,KAAK,QAAQ,SAAS,IACxB,MAAK,UAAU,KAAK,QAAQ,MAAM,KAAM;AAI1C,MAAI,KAAK,OAAO,SAAS;GACvB,MAAM,SAAS,QAAQ,aAAa,MAAM,MAAM;GAChD,MAAM,YACJ,QAAQ,YAAY,KAAK,OAAO,gBAAiB,OAAO;AAE1D,WAAQ,IACN,GAAG,OAAO,GAAG,QAAQ,OAAO,GAAG,QAAQ,KAAK,KAC1C,QAAQ,WACT,IAAI,UAAU,GAAG,QAAQ,UAAU,QAAQ,EAAE,CAAC,KAChD;AAGD,OAAI,QAAQ,YAAY,KAAK,OAAO,cAClC,SAAQ,KACN,aAAa,QAAQ,KAAK,MAAM,QAAQ,UAAU,QAChD,EACD,CAAC,IACH;;;CAMP,YAAY;AACV,MAAI,CAAC,KAAK,UACR,QAAO;GAAE,SAAS;GAAO,SAAS;GAAS;EAG7C,MAAM,gBAAgB,KAAK,QAAQ;EACnC,MAAM,qBAAqB,KAAK,QAAQ,QACrC,MAAM,EAAE,aAAa,IACvB,CAAC;EACF,MAAM,iBAAiB,gBAAgB;EACvC,MAAM,kBACJ,gBAAgB,IACZ,KAAK,QAAQ,QAAQ,KAAK,MAAM,MAAM,EAAE,WAAW,EAAE,GAAG,gBACxD;AAEN,SAAO;GACL,SAAS;GACT;GACA;GACA;GACA,WAAW,gBAAgB,IAAI,iBAAiB,gBAAgB;GAChE,iBAAiB,gBAAgB,QAAQ,EAAE,GAAG;GAC9C,aAAa,KAAK,gBAAgB;GAClC,gBAAgB,KAAK,QAAQ,MAAM,GAAG;GACvC;;CAIH,aAAa;AACX,SAAO,KAAK;;CAId,QAAQ;AACN,OAAK,UAAU,EAAE;AACjB,UAAQ,IAAI,aAAa;;CAI3B,AAAQ,iBAAiB;AACvB,MAAI,OAAO,YAAY,eAAe,QAAQ,aAAa;GACzD,MAAM,MAAM,QAAQ,aAAa;AACjC,UAAO;IACL,WAAW,IAAI,WAAW,OAAO,MAAM,QAAQ,EAAE,GAAG;IACpD,YAAY,IAAI,YAAY,OAAO,MAAM,QAAQ,EAAE,GAAG;IACtD,WAAW,IAAI,WAAW,OAAO,MAAM,QAAQ,EAAE,GAAG;IACrD;;AAEH,SAAO,EAAE,SAAS,WAAW;;;AAKjC,SAAgB,eACd,QACA,SAAiC,EAAE,EAClB;CACjB,MAAM,UAAU,IAAI,cAAc,OAAO;CAGzC,MAAM,gBAAgB,OAAO,MAAM,KAAK,OAAO;CAG/C,MAAM,iBAAiB,OAAO,QAAoC;EAChE,MAAM,YAAY,YAAY,KAAK;EACnC,MAAM,YAAY,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CACjD,SAAS,GAAG,CACZ,OAAO,GAAG,EAAE;EACf,MAAM,EAAE,aAAa,IAAI,IAAI,IAAI,IAAI;EACrC,MAAM,SAAS,IAAI;AAEnB,MAAI;GAEF,MAAM,WAAW,MAAM,cAAc,IAAI;GAGzC,MAAM,YAAY,YAAY,KAAK,GAAG;AACtC,WAAQ,cAAc;IACpB;IACA;IACA,MAAM;IACN,YAAY,SAAS;IACrB;IACA,WAAW,KAAK,KAAK;IACrB,oBAAoB;AAClB,SAAI,OAAO,YAAY,eAAe,QAAQ,aAAa;MACzD,MAAM,MAAM,QAAQ,aAAa;AACjC,aAAO;OACL,UAAU,IAAI;OACd,WAAW,IAAI;OAChB;;AAEH,YAAO;MAAE,UAAU;MAAG,WAAW;MAAG;QAClC;IACL,CAAC;AAEF,UAAO;WACA,OAAO;GAEd,MAAM,YAAY,YAAY,KAAK,GAAG;AACtC,WAAQ,cAAc;IACpB;IACA;IACA,MAAM;IACN,YAAY;IACZ;IACA,WAAW,KAAK,KAAK;IACrB,oBAAoB;AAClB,SAAI,OAAO,YAAY,eAAe,QAAQ,aAAa;MACzD,MAAM,MAAM,QAAQ,aAAa;AACjC,aAAO;OACL,UAAU,IAAI;OACd,WAAW,IAAI;OAChB;;AAEH,YAAO;MAAE,UAAU;MAAG,WAAW;MAAG;QAClC;IACL,CAAC;AAEF,SAAM;;;AAeV,QAVwB;EACtB,GAAG;EACH,OAAO;EAGP,2BAA2B,QAAQ,WAAW;EAC9C,4BAA4B,QAAQ,YAAY;EAChD,uBAAuB,QAAQ,OAAO;EACvC;;AAMH,SAAgB,sBACd,QACA,QACiB;CACjB,MAAM,EAAE;AAER,QAAO,eADQ,IAAI,OAAO,OAAO,EACH,OAAO"}
@@ -0,0 +1,150 @@
1
+ //#region src/monitoring/types.d.ts
2
+ /**
3
+ * 性能监控系统类型定义
4
+ *
5
+ * @author Framework Team
6
+ * @version 1.0.0
7
+ * @license MIT
8
+ */
9
+ interface BaseMetrics {
10
+ timestamp: number;
11
+ requestId: string;
12
+ method: string;
13
+ path: string;
14
+ statusCode: number;
15
+ userAgent?: string;
16
+ ip?: string;
17
+ }
18
+ interface PerformanceMetrics extends BaseMetrics {
19
+ totalTime: number;
20
+ routeMatchTime: number;
21
+ validationTime: number;
22
+ handlerTime: number;
23
+ responseTime: number;
24
+ memoryUsage: {
25
+ heapUsed: number;
26
+ heapTotal: number;
27
+ external: number;
28
+ rss: number;
29
+ };
30
+ validation: {
31
+ bodyValidated: boolean;
32
+ queryValidated: boolean;
33
+ paramsValidated: boolean;
34
+ headersValidated: boolean;
35
+ cookiesValidated: boolean;
36
+ validationErrors: number;
37
+ };
38
+ routing: {
39
+ routeFound: boolean;
40
+ middlewareCount: number;
41
+ dynamicParams: number;
42
+ };
43
+ error?: {
44
+ type: string;
45
+ message: string;
46
+ stack?: string;
47
+ };
48
+ }
49
+ interface AggregatedMetrics {
50
+ timeRange: {
51
+ start: number;
52
+ end: number;
53
+ };
54
+ requests: {
55
+ total: number;
56
+ successful: number;
57
+ failed: number;
58
+ byMethod: Record<string, number>;
59
+ byPath: Record<string, number>;
60
+ byStatusCode: Record<number, number>;
61
+ };
62
+ performance: {
63
+ avgTotalTime: number;
64
+ avgRouteMatchTime: number;
65
+ avgValidationTime: number;
66
+ avgHandlerTime: number;
67
+ avgResponseTime: number;
68
+ p50TotalTime: number;
69
+ p90TotalTime: number;
70
+ p95TotalTime: number;
71
+ p99TotalTime: number;
72
+ minTotalTime: number;
73
+ maxTotalTime: number;
74
+ };
75
+ memory: {
76
+ avgHeapUsed: number;
77
+ avgHeapTotal: number;
78
+ maxHeapUsed: number;
79
+ maxHeapTotal: number;
80
+ };
81
+ validation: {
82
+ totalValidations: number;
83
+ validationErrors: number;
84
+ validationSuccessRate: number;
85
+ };
86
+ routing: {
87
+ totalRoutes: number;
88
+ routesWithMiddleware: number;
89
+ dynamicRoutes: number;
90
+ routeHitCount: Record<string, number>;
91
+ };
92
+ }
93
+ interface MonitoringConfig {
94
+ enabled: boolean;
95
+ retention: {
96
+ maxRecords: number;
97
+ maxAge: number;
98
+ cleanupInterval: number;
99
+ };
100
+ samplingRate: number;
101
+ recordErrors: boolean;
102
+ recordBodySize: boolean;
103
+ recordResponseSize: boolean;
104
+ thresholds: {
105
+ slowRequest: number;
106
+ highMemoryUsage: number;
107
+ errorRate: number;
108
+ };
109
+ }
110
+ interface MonitoringEvent {
111
+ type: "request_start" | "request_end" | "validation_start" | "validation_end" | "error";
112
+ timestamp: number;
113
+ requestId: string;
114
+ data: any;
115
+ }
116
+ interface PerformanceReport {
117
+ id: string;
118
+ timestamp: number;
119
+ timeRange: {
120
+ start: number;
121
+ end: number;
122
+ };
123
+ summary: {
124
+ totalRequests: number;
125
+ avgResponseTime: number;
126
+ errorRate: number;
127
+ memoryUsage: number;
128
+ };
129
+ details: {
130
+ topSlowestRoutes: Array<{
131
+ path: string;
132
+ avgTime: number;
133
+ count: number;
134
+ }>;
135
+ topErrorRoutes: Array<{
136
+ path: string;
137
+ errorCount: number;
138
+ errorRate: number;
139
+ }>;
140
+ memoryTrend: Array<{
141
+ timestamp: number;
142
+ heapUsed: number;
143
+ }>;
144
+ responseTimeDistribution: Record<string, number>;
145
+ };
146
+ recommendations: string[];
147
+ }
148
+ //#endregion
149
+ export { AggregatedMetrics, BaseMetrics, MonitoringConfig, MonitoringEvent, PerformanceMetrics, PerformanceReport };
150
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,4 @@
1
+ import { a as createAdaptorServer, i as ServeResult, o as serve, r as ServeOptions, t as FetchHandler } from "../serve-BQQ2JzIH.mjs";
2
+ import { createProxyRequest } from "./request.mjs";
3
+ import { writeResponse, writeResponseSimple } from "./response.mjs";
4
+ export { type FetchHandler, type ServeOptions, type ServeResult, createAdaptorServer, createProxyRequest, serve, writeResponse, writeResponseSimple };
@@ -0,0 +1,5 @@
1
+ import { t as createProxyRequest } from "../request-B2BkUecT.mjs";
2
+ import { n as writeResponseSimple, t as writeResponse } from "../response-BhFKEphr.mjs";
3
+ import { n as serve, t as createAdaptorServer } from "../serve-MRGGK7-q.mjs";
4
+
5
+ export { createAdaptorServer, createProxyRequest, serve, writeResponse, writeResponseSimple };
@@ -1,9 +1,6 @@
1
- import { IncomingMessage } from 'node:http';
1
+ import { IncomingMessage } from "node:http";
2
2
 
3
- /**
4
- * 优化的 Request 代理
5
- * 延迟创建真实 Request,减少不必要的对象分配
6
- */
3
+ //#region src/node-server/request.d.ts
7
4
 
8
5
  /**
9
6
  * 创建代理 Request
@@ -11,5 +8,6 @@ import { IncomingMessage } from 'node:http';
11
8
  * @param defaultHost 默认主机名
12
9
  */
13
10
  declare function createProxyRequest(incoming: IncomingMessage, defaultHost: string): Request;
14
-
11
+ //#endregion
15
12
  export { createProxyRequest };
13
+ //# sourceMappingURL=request.d.mts.map
@@ -0,0 +1,3 @@
1
+ import { t as createProxyRequest } from "../request-B2BkUecT.mjs";
2
+
3
+ export { createProxyRequest };
@@ -1,9 +1,6 @@
1
- import { ServerResponse } from 'node:http';
1
+ import { ServerResponse } from "node:http";
2
2
 
3
- /**
4
- * 优化的 Response 写入
5
- * 流式写入,避免内存拷贝
6
- */
3
+ //#region src/node-server/response.d.ts
7
4
 
8
5
  /**
9
6
  * 将 Web Response 写入 Node.js ServerResponse
@@ -15,5 +12,6 @@ declare function writeResponse(response: Response, outgoing: ServerResponse): Pr
15
12
  * 直接 arrayBuffer 转换,适用于确定的小响应
16
13
  */
17
14
  declare function writeResponseSimple(response: Response, outgoing: ServerResponse): Promise<void>;
18
-
15
+ //#endregion
19
16
  export { writeResponse, writeResponseSimple };
17
+ //# sourceMappingURL=response.d.mts.map
@@ -0,0 +1,3 @@
1
+ import { n as writeResponseSimple, t as writeResponse } from "../response-BhFKEphr.mjs";
2
+
3
+ export { writeResponse, writeResponseSimple };
@@ -0,0 +1,2 @@
1
+ import { a as createAdaptorServer, i as ServeResult, n as GracefulShutdownOptions, o as serve, r as ServeOptions, t as FetchHandler } from "../serve-BQQ2JzIH.mjs";
2
+ export { FetchHandler, GracefulShutdownOptions, ServeOptions, ServeResult, createAdaptorServer, serve };
@@ -0,0 +1,4 @@
1
+ import "../request-B2BkUecT.mjs";
2
+ import { n as serve, t as createAdaptorServer } from "../serve-MRGGK7-q.mjs";
3
+
4
+ export { createAdaptorServer, serve };
@@ -1,12 +1,13 @@
1
+ //#region src/utils/parsers.d.ts
1
2
  interface FileInfo {
2
- name: string;
3
- type: string;
4
- size: number;
5
- data: ArrayBuffer;
3
+ name: string;
4
+ type: string;
5
+ size: number;
6
+ data: ArrayBuffer;
6
7
  }
7
8
  interface FormData {
8
- fields: Record<string, string>;
9
- files: Record<string, FileInfo>;
9
+ fields: Record<string, string>;
10
+ files: Record<string, FileInfo>;
10
11
  }
11
12
  /**
12
13
  * 简化的请求体解析函数
@@ -52,5 +53,6 @@ declare function parseCookiesFast(req: Request): Record<string, string>;
52
53
  * 获取单个 Cookie 值(避免解析全部)
53
54
  */
54
55
  declare function getCookie(req: Request, name: string): string | null;
55
-
56
- export { type FileInfo, type FormData, getCookie, getHeader, parseBody, parseBodyAs, parseCookies, parseCookiesFast, parseFile, parseFormData, parseHeaders, parseQuery, parseQueryFast };
56
+ //#endregion
57
+ export { parseBody as a, parseCookiesFast as c, parseHeaders as d, parseQuery as f, getHeader as i, parseFile as l, FormData as n, parseBodyAs as o, parseQueryFast as p, getCookie as r, parseCookies as s, FileInfo as t, parseFormData as u };
58
+ //# sourceMappingURL=parsers-CodQFP1Z.d.mts.map
@@ -0,0 +1,168 @@
1
+ import qs from "qs";
2
+ import cookie from "cookie";
3
+
4
+ //#region src/utils/parsers.ts
5
+ /**
6
+ * 简化的请求体解析函数
7
+ * 优先简洁性,处理最常见的场景
8
+ */
9
+ async function parseBody(req) {
10
+ const contentType = req.headers.get("content-type") || "";
11
+ if (contentType.includes("application/json")) return await req.json();
12
+ if (contentType.includes("application/x-www-form-urlencoded")) {
13
+ const text = await req.text();
14
+ return Object.fromEntries(new URLSearchParams(text));
15
+ }
16
+ return await req.text();
17
+ }
18
+ /**
19
+ * 解析 multipart/form-data 格式
20
+ * 支持文件上传和普通表单字段
21
+ */
22
+ async function parseMultipartFormData(req) {
23
+ const formData = await req.formData();
24
+ const result = {
25
+ fields: {},
26
+ files: {}
27
+ };
28
+ for (const [key, value] of formData.entries()) if (typeof value === "object" && value !== null && "name" in value && "type" in value && "size" in value) {
29
+ const file = value;
30
+ const arrayBuffer = await file.arrayBuffer();
31
+ result.files[key] = {
32
+ name: file.name,
33
+ type: file.type,
34
+ size: file.size,
35
+ data: arrayBuffer
36
+ };
37
+ } else result.fields[key] = value;
38
+ return result;
39
+ }
40
+ /**
41
+ * 解析请求体为特定类型
42
+ * 提供类型安全的解析方法
43
+ */
44
+ async function parseBodyAs(req) {
45
+ return await parseBody(req);
46
+ }
47
+ /**
48
+ * 解析请求体为表单数据
49
+ * 专门用于处理 multipart/form-data
50
+ */
51
+ async function parseFormData(req) {
52
+ if (!(req.headers.get("content-type") || "").includes("multipart/form-data")) throw new Error("请求不是 multipart/form-data 格式");
53
+ return await parseMultipartFormData(req);
54
+ }
55
+ /**
56
+ * 解析请求体为文件
57
+ * 专门用于处理文件上传
58
+ */
59
+ async function parseFile(req) {
60
+ if (!(req.headers.get("content-type") || "").includes("multipart/form-data")) throw new Error("请求不是 multipart/form-data 格式");
61
+ const formData = await parseMultipartFormData(req);
62
+ const fileKeys = Object.keys(formData.files);
63
+ if (fileKeys.length === 0) throw new Error("请求中没有文件");
64
+ if (fileKeys.length > 1) throw new Error("请求中包含多个文件,请使用 parseFormData");
65
+ return formData.files[fileKeys[0]];
66
+ }
67
+ /**
68
+ * 快速提取 query string(避免创建 URL 对象)
69
+ */
70
+ function extractQueryString(url) {
71
+ const qIndex = url.indexOf("?");
72
+ if (qIndex === -1) return "";
73
+ const hashIndex = url.indexOf("#", qIndex);
74
+ return hashIndex === -1 ? url.substring(qIndex + 1) : url.substring(qIndex + 1, hashIndex);
75
+ }
76
+ /** 获取查询字符串,直接返回对象 */
77
+ function parseQuery(req) {
78
+ const queryString = extractQueryString(req.url);
79
+ if (!queryString) return {};
80
+ return qs.parse(queryString);
81
+ }
82
+ /**
83
+ * 快速解析简单查询字符串(不支持嵌套,但更快)
84
+ * 适用于简单的 key=value&key2=value2 场景
85
+ */
86
+ function parseQueryFast(req) {
87
+ const queryString = extractQueryString(req.url);
88
+ if (!queryString) return {};
89
+ const result = Object.create(null);
90
+ const pairs = queryString.split("&");
91
+ for (const pair of pairs) {
92
+ const eqIndex = pair.indexOf("=");
93
+ if (eqIndex === -1) result[decodeURIComponent(pair)] = "";
94
+ else {
95
+ const key = decodeURIComponent(pair.substring(0, eqIndex));
96
+ result[key] = decodeURIComponent(pair.substring(eqIndex + 1));
97
+ }
98
+ }
99
+ return result;
100
+ }
101
+ /** 解析请求头,返回对象 */
102
+ function parseHeaders(req) {
103
+ const headers = Object.create(null);
104
+ req.headers.forEach((value, key) => {
105
+ headers[key] = value;
106
+ });
107
+ return headers;
108
+ }
109
+ /**
110
+ * 获取单个请求头(避免解析全部)
111
+ */
112
+ function getHeader(req, name) {
113
+ return req.headers.get(name);
114
+ }
115
+ /** 使用cookie库解析Cookie,保证可靠性 */
116
+ function parseCookies(req) {
117
+ const cookieHeader = req.headers.get("cookie");
118
+ if (!cookieHeader) return {};
119
+ try {
120
+ const parsed = cookie.parse(cookieHeader);
121
+ const result = {};
122
+ for (const [key, value] of Object.entries(parsed)) if (value !== void 0 && value !== null) result[key] = value;
123
+ return result;
124
+ } catch {
125
+ return {};
126
+ }
127
+ }
128
+ /**
129
+ * 快速解析 Cookie(简化版,不使用外部库)
130
+ * 适用于简单的 cookie 场景
131
+ */
132
+ function parseCookiesFast(req) {
133
+ const cookieHeader = req.headers.get("cookie");
134
+ if (!cookieHeader) return {};
135
+ const result = Object.create(null);
136
+ const pairs = cookieHeader.split(";");
137
+ for (const pair of pairs) {
138
+ const trimmed = pair.trim();
139
+ const eqIndex = trimmed.indexOf("=");
140
+ if (eqIndex > 0) {
141
+ const key = trimmed.substring(0, eqIndex).trim();
142
+ const value = trimmed.substring(eqIndex + 1).trim();
143
+ result[key] = value.startsWith("\"") && value.endsWith("\"") ? value.slice(1, -1) : value;
144
+ }
145
+ }
146
+ return result;
147
+ }
148
+ /**
149
+ * 获取单个 Cookie 值(避免解析全部)
150
+ */
151
+ function getCookie(req, name) {
152
+ const cookieHeader = req.headers.get("cookie");
153
+ if (!cookieHeader) return null;
154
+ const prefix = `${name}=`;
155
+ const pairs = cookieHeader.split(";");
156
+ for (const pair of pairs) {
157
+ const trimmed = pair.trim();
158
+ if (trimmed.startsWith(prefix)) {
159
+ const value = trimmed.substring(prefix.length).trim();
160
+ return value.startsWith("\"") && value.endsWith("\"") ? value.slice(1, -1) : value;
161
+ }
162
+ }
163
+ return null;
164
+ }
165
+
166
+ //#endregion
167
+ export { parseCookies as a, parseFormData as c, parseQueryFast as d, parseBodyAs as i, parseHeaders as l, getHeader as n, parseCookiesFast as o, parseBody as r, parseFile as s, getCookie as t, parseQuery as u };
168
+ //# sourceMappingURL=parsers-ROIZWSGI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsers-ROIZWSGI.mjs","names":[],"sources":["../src/utils/parsers.ts"],"sourcesContent":["// src/parsers.ts\nimport qs from \"qs\";\nimport cookie from \"cookie\";\n\n// 文件信息接口\nexport interface FileInfo {\n name: string;\n type: string;\n size: number;\n data: ArrayBuffer;\n}\n\n// 表单数据接口\nexport interface FormData {\n fields: Record<string, string>;\n files: Record<string, FileInfo>;\n}\n\n/**\n * 简化的请求体解析函数\n * 优先简洁性,处理最常见的场景\n */\nexport async function parseBody(req: Request): Promise<unknown> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n return await req.json();\n }\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n const text = await req.text();\n return Object.fromEntries(new URLSearchParams(text));\n }\n return await req.text(); // fallback\n}\n\n/**\n * 解析 multipart/form-data 格式\n * 支持文件上传和普通表单字段\n */\nasync function parseMultipartFormData(req: Request): Promise<FormData> {\n const formData = await req.formData();\n const result: FormData = {\n fields: {},\n files: {},\n };\n\n for (const [key, value] of formData.entries()) {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n \"type\" in value &&\n \"size\" in value\n ) {\n // 处理文件\n const file = value as any;\n const arrayBuffer = await file.arrayBuffer();\n result.files[key] = {\n name: file.name,\n type: file.type,\n size: file.size,\n data: arrayBuffer,\n };\n } else {\n // 处理普通字段\n result.fields[key] = value as string;\n }\n }\n\n return result;\n}\n\n/**\n * 解析请求体为特定类型\n * 提供类型安全的解析方法\n */\nexport async function parseBodyAs<T>(req: Request): Promise<T> {\n const body = await parseBody(req);\n return body as T;\n}\n\n/**\n * 解析请求体为表单数据\n * 专门用于处理 multipart/form-data\n */\nexport async function parseFormData(req: Request): Promise<FormData> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n\n if (!contentType.includes(\"multipart/form-data\")) {\n throw new Error(\"请求不是 multipart/form-data 格式\");\n }\n\n return await parseMultipartFormData(req);\n}\n\n/**\n * 解析请求体为文件\n * 专门用于处理文件上传\n */\nexport async function parseFile(req: Request): Promise<FileInfo> {\n const contentType = req.headers.get(\"content-type\") || \"\";\n\n if (!contentType.includes(\"multipart/form-data\")) {\n throw new Error(\"请求不是 multipart/form-data 格式\");\n }\n\n const formData = await parseMultipartFormData(req);\n const fileKeys = Object.keys(formData.files);\n\n if (fileKeys.length === 0) {\n throw new Error(\"请求中没有文件\");\n }\n\n if (fileKeys.length > 1) {\n throw new Error(\"请求中包含多个文件,请使用 parseFormData\");\n }\n\n return formData.files[fileKeys[0]];\n}\n\n/**\n * 快速提取 query string(避免创建 URL 对象)\n */\nfunction extractQueryString(url: string): string {\n const qIndex = url.indexOf(\"?\");\n if (qIndex === -1) return \"\";\n\n const hashIndex = url.indexOf(\"#\", qIndex);\n return hashIndex === -1\n ? url.substring(qIndex + 1)\n : url.substring(qIndex + 1, hashIndex);\n}\n\n/** 获取查询字符串,直接返回对象 */\nexport function parseQuery(req: Request): Record<string, unknown> {\n const queryString = extractQueryString(req.url);\n if (!queryString) return {};\n return qs.parse(queryString);\n}\n\n/**\n * 快速解析简单查询字符串(不支持嵌套,但更快)\n * 适用于简单的 key=value&key2=value2 场景\n */\nexport function parseQueryFast(req: Request): Record<string, string> {\n const queryString = extractQueryString(req.url);\n if (!queryString) return {};\n\n const result: Record<string, string> = Object.create(null);\n const pairs = queryString.split(\"&\");\n\n for (const pair of pairs) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n result[decodeURIComponent(pair)] = \"\";\n } else {\n const key = decodeURIComponent(pair.substring(0, eqIndex));\n const value = decodeURIComponent(pair.substring(eqIndex + 1));\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/** 解析请求头,返回对象 */\nexport function parseHeaders(req: Request): Record<string, string> {\n const headers: Record<string, string> = Object.create(null);\n req.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n\n/**\n * 获取单个请求头(避免解析全部)\n */\nexport function getHeader(req: Request, name: string): string | null {\n return req.headers.get(name);\n}\n\n/** 使用cookie库解析Cookie,保证可靠性 */\nexport function parseCookies(req: Request): Record<string, string> {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return {};\n\n try {\n const parsed = cookie.parse(cookieHeader);\n // 过滤掉undefined和null值\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * 快速解析 Cookie(简化版,不使用外部库)\n * 适用于简单的 cookie 场景\n */\nexport function parseCookiesFast(req: Request): Record<string, string> {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return {};\n\n const result: Record<string, string> = Object.create(null);\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const trimmed = pair.trim();\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex > 0) {\n const key = trimmed.substring(0, eqIndex).trim();\n const value = trimmed.substring(eqIndex + 1).trim();\n // 移除引号\n result[key] =\n value.startsWith('\"') && value.endsWith('\"')\n ? value.slice(1, -1)\n : value;\n }\n }\n\n return result;\n}\n\n/**\n * 获取单个 Cookie 值(避免解析全部)\n */\nexport function getCookie(req: Request, name: string): string | null {\n const cookieHeader = req.headers.get(\"cookie\");\n if (!cookieHeader) return null;\n\n const prefix = `${name}=`;\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const trimmed = pair.trim();\n if (trimmed.startsWith(prefix)) {\n const value = trimmed.substring(prefix.length).trim();\n return value.startsWith('\"') && value.endsWith('\"')\n ? value.slice(1, -1)\n : value;\n }\n }\n\n return null;\n}\n"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { t as __esmMin } from "./chunk-67U6L5Jh.mjs";
2
+
3
+ //#region src/utils/path-matcher.ts
4
+ var PathMatcher;
5
+ var init_path_matcher = __esmMin((() => {
6
+ PathMatcher = class {
7
+ /**
8
+ * 路径匹配
9
+ */
10
+ static matchPath(pattern, path) {
11
+ const patternParts = pattern.split("/").filter(Boolean);
12
+ const pathParts = path.split("/").filter(Boolean);
13
+ if (patternParts.length !== pathParts.length) return false;
14
+ for (let i = 0; i < patternParts.length; i++) if (patternParts[i] !== pathParts[i] && !patternParts[i].startsWith(":")) return false;
15
+ return true;
16
+ }
17
+ /**
18
+ * 提取路径参数
19
+ */
20
+ static extractParams(pattern, path) {
21
+ const params = {};
22
+ const patternParts = pattern.split("/").filter(Boolean);
23
+ const pathParts = path.split("/").filter(Boolean);
24
+ for (let i = 0; i < patternParts.length; i++) if (patternParts[i].startsWith(":")) {
25
+ const paramName = patternParts[i].slice(1);
26
+ params[paramName] = pathParts[i];
27
+ }
28
+ return params;
29
+ }
30
+ /**
31
+ * 计算路径特异性分数
32
+ * 用于路由排序:静态 > 动态(:param) > 通配符(*)
33
+ */
34
+ static calculatePathScore(path) {
35
+ const parts = path.split("/").filter(Boolean);
36
+ let score = 0;
37
+ for (const p of parts) if (p === "*") score += 1;
38
+ else if (p.startsWith(":")) score += 2;
39
+ else score += 3;
40
+ return score * 10 + parts.length;
41
+ }
42
+ /**
43
+ * 判断两个路径是否可能冲突
44
+ */
45
+ static pathsMayConflict(path1, path2) {
46
+ const parts1 = path1.split("/").filter(Boolean);
47
+ const parts2 = path2.split("/").filter(Boolean);
48
+ if (parts1.length !== parts2.length) return false;
49
+ for (let i = 0; i < parts1.length; i++) {
50
+ const p1 = parts1[i];
51
+ const p2 = parts2[i];
52
+ if (!p1.startsWith(":") && !p1.startsWith("*") && !p2.startsWith(":") && !p2.startsWith("*") && p1 !== p2) return false;
53
+ if (p1 === "*" && p2.startsWith(":") || p2 === "*" && p1.startsWith(":")) return true;
54
+ }
55
+ return false;
56
+ }
57
+ };
58
+ }));
59
+
60
+ //#endregion
61
+ export { init_path_matcher as n, PathMatcher as t };
62
+ //# sourceMappingURL=path-matcher-CXMJ-IrG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-matcher-CXMJ-IrG.mjs","names":[],"sources":["../src/utils/path-matcher.ts"],"sourcesContent":["/**\n * 路径匹配工具类\n * 提供统一的路径匹配和参数提取功能\n */\nexport class PathMatcher {\n /**\n * 路径匹配\n */\n static matchPath(pattern: string, path: string): boolean {\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return false;\n }\n\n for (let i = 0; i < patternParts.length; i++) {\n if (\n patternParts[i] !== pathParts[i] &&\n !patternParts[i].startsWith(\":\")\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 提取路径参数\n */\n static extractParams(pattern: string, path: string): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i].startsWith(\":\")) {\n const paramName = patternParts[i].slice(1);\n params[paramName] = pathParts[i];\n }\n }\n\n return params;\n }\n\n /**\n * 计算路径特异性分数\n * 用于路由排序:静态 > 动态(:param) > 通配符(*)\n */\n static calculatePathScore(path: string): number {\n const parts = path.split(\"/\").filter(Boolean);\n let score = 0;\n for (const p of parts) {\n if (p === \"*\")\n score += 1; // 最弱\n else if (p.startsWith(\":\"))\n score += 2; // 中等\n else score += 3; // 静态最强\n }\n // 更长的路径更具体,略微提升\n return score * 10 + parts.length;\n }\n\n /**\n * 判断两个路径是否可能冲突\n */\n static pathsMayConflict(path1: string, path2: string): boolean {\n const parts1 = path1.split(\"/\").filter(Boolean);\n const parts2 = path2.split(\"/\").filter(Boolean);\n\n if (parts1.length !== parts2.length) return false;\n\n for (let i = 0; i < parts1.length; i++) {\n const p1 = parts1[i];\n const p2 = parts2[i];\n\n // 如果两个部分都是静态的且不同,则不会冲突\n if (\n !p1.startsWith(\":\") &&\n !p1.startsWith(\"*\") &&\n !p2.startsWith(\":\") &&\n !p2.startsWith(\"*\") &&\n p1 !== p2\n ) {\n return false;\n }\n\n // 如果一个是通配符,另一个是动态参数,可能冲突\n if (\n (p1 === \"*\" && p2.startsWith(\":\")) ||\n (p2 === \"*\" && p1.startsWith(\":\"))\n ) {\n return true;\n }\n }\n\n return false;\n }\n}\n"],"mappings":";;;;;CAIa,cAAb,MAAyB;;;;EAIvB,OAAO,UAAU,SAAiB,MAAuB;GACvD,MAAM,eAAe,QAAQ,MAAM,IAAI,CAAC,OAAO,QAAQ;GACvD,MAAM,YAAY,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;AAEjD,OAAI,aAAa,WAAW,UAAU,OACpC,QAAO;AAGT,QAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,IACvC,KACE,aAAa,OAAO,UAAU,MAC9B,CAAC,aAAa,GAAG,WAAW,IAAI,CAEhC,QAAO;AAIX,UAAO;;;;;EAMT,OAAO,cAAc,SAAiB,MAAsC;GAC1E,MAAM,SAAiC,EAAE;GACzC,MAAM,eAAe,QAAQ,MAAM,IAAI,CAAC,OAAO,QAAQ;GACvD,MAAM,YAAY,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;AAEjD,QAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,IACvC,KAAI,aAAa,GAAG,WAAW,IAAI,EAAE;IACnC,MAAM,YAAY,aAAa,GAAG,MAAM,EAAE;AAC1C,WAAO,aAAa,UAAU;;AAIlC,UAAO;;;;;;EAOT,OAAO,mBAAmB,MAAsB;GAC9C,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;GAC7C,IAAI,QAAQ;AACZ,QAAK,MAAM,KAAK,MACd,KAAI,MAAM,IACR,UAAS;YACF,EAAE,WAAW,IAAI,CACxB,UAAS;OACN,UAAS;AAGhB,UAAO,QAAQ,KAAK,MAAM;;;;;EAM5B,OAAO,iBAAiB,OAAe,OAAwB;GAC7D,MAAM,SAAS,MAAM,MAAM,IAAI,CAAC,OAAO,QAAQ;GAC/C,MAAM,SAAS,MAAM,MAAM,IAAI,CAAC,OAAO,QAAQ;AAE/C,OAAI,OAAO,WAAW,OAAO,OAAQ,QAAO;AAE5C,QAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACtC,MAAM,KAAK,OAAO;IAClB,MAAM,KAAK,OAAO;AAGlB,QACE,CAAC,GAAG,WAAW,IAAI,IACnB,CAAC,GAAG,WAAW,IAAI,IACnB,CAAC,GAAG,WAAW,IAAI,IACnB,CAAC,GAAG,WAAW,IAAI,IACnB,OAAO,GAEP,QAAO;AAIT,QACG,OAAO,OAAO,GAAG,WAAW,IAAI,IAChC,OAAO,OAAO,GAAG,WAAW,IAAI,CAEjC,QAAO;;AAIX,UAAO"}