vafast 0.4.3 → 0.4.6

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 (170) hide show
  1. package/dist/{base-server-Gakrozqk.d.mts → base-server-CtA1bZSg.d.mts} +2 -2
  2. package/dist/{base-server-Bq4_lJWK.mjs → base-server-DMhpmq5v.mjs} +2 -2
  3. package/dist/{base-server-Bq4_lJWK.mjs.map → base-server-DMhpmq5v.mjs.map} +1 -1
  4. package/dist/{base64url-BY-HBSpL.d.mts → base64url-0N9uQPjZ.d.mts} +1 -1
  5. package/dist/{base64url-DLDOeXsk.mjs → base64url-DUtluDF0.mjs} +1 -1
  6. package/dist/{base64url-DLDOeXsk.mjs.map → base64url-DUtluDF0.mjs.map} +1 -1
  7. package/dist/{component-route-BYV_X1rA.d.mts → component-route-DF5feXJI.d.mts} +2 -2
  8. package/dist/{component-router-DXUXLp1R.mjs → component-router-uSylkByf.mjs} +2 -2
  9. package/dist/{component-router-DXUXLp1R.mjs.map → component-router-uSylkByf.mjs.map} +1 -1
  10. package/dist/{component-server-ARXvZJUQ.mjs → component-server-DIgykV0F.mjs} +7 -7
  11. package/dist/{component-server-ARXvZJUQ.mjs.map → component-server-DIgykV0F.mjs.map} +1 -1
  12. package/dist/{component-server-BOz4Q-Qt.d.mts → component-server-DvcPVnL4.d.mts} +4 -4
  13. package/dist/{create-handler-Dtt0xv6g.d.mts → create-handler-DRcJRkx9.d.mts} +2 -2
  14. package/dist/{create-handler-CbSoroA1.mjs → create-handler-IzOE24L5.mjs} +5 -5
  15. package/dist/{create-handler-CbSoroA1.mjs.map → create-handler-IzOE24L5.mjs.map} +1 -1
  16. package/dist/defineRoute.d.mts +3 -3
  17. package/dist/{dependency-manager-CPkwMI7J.mjs → dependency-manager-BpN2YufZ.mjs} +2 -2
  18. package/dist/{dependency-manager-CPkwMI7J.mjs.map → dependency-manager-BpN2YufZ.mjs.map} +1 -1
  19. package/dist/{dependency-manager-Dbug5INp.d.mts → dependency-manager-C_qZvkaw.d.mts} +1 -1
  20. package/dist/{formats-BSqJWCsG.d.mts → formats-CYLwo9GJ.d.mts} +1 -1
  21. package/dist/{go-await-B-KP-K8x.mjs → go-await-2Pzj4snS.mjs} +1 -1
  22. package/dist/{go-await-B-KP-K8x.mjs.map → go-await-2Pzj4snS.mjs.map} +1 -1
  23. package/dist/{go-await-CqPx9dVQ.d.mts → go-await-DRItVwwh.d.mts} +1 -1
  24. package/dist/{handle-DOidKTI-.d.mts → handle-D0TFoOiX.d.mts} +1 -1
  25. package/dist/{handle-BhpqNgGf.mjs → handle-s4V-E2RE.mjs} +2 -2
  26. package/dist/{handle-BhpqNgGf.mjs.map → handle-s4V-E2RE.mjs.map} +1 -1
  27. package/dist/{html-renderer-C3LKTLme.d.mts → html-renderer-CMGKJoIy.d.mts} +1 -1
  28. package/dist/{html-renderer-CJ3B2Hft.mjs → html-renderer-CuakkPIt.mjs} +2 -2
  29. package/dist/{html-renderer-CJ3B2Hft.mjs.map → html-renderer-CuakkPIt.mjs.map} +1 -1
  30. package/dist/{index-DFsQyT61.d.mts → index-CdOYxwDQ.d.mts} +5 -5
  31. package/dist/index.d.mts +25 -30
  32. package/dist/index.mjs +21 -27
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/middleware/component-router.d.mts +1 -1
  35. package/dist/middleware/component-router.mjs +1 -1
  36. package/dist/middleware-5PjaxPMA.d.mts +23 -0
  37. package/dist/middleware-CV5o-4wk.mjs +189 -0
  38. package/dist/middleware-CV5o-4wk.mjs.map +1 -0
  39. package/dist/middleware.d.mts +4 -25
  40. package/dist/middleware.mjs +1 -1
  41. package/dist/monitoring/index.d.mts +6 -6
  42. package/dist/monitoring/index.mjs +5 -3
  43. package/dist/monitoring/index.mjs.map +1 -1
  44. package/dist/monitoring/native-monitor.d.mts +6 -6
  45. package/dist/monitoring/native-monitor.mjs +6 -4
  46. package/dist/monitoring/native-monitor.mjs.map +1 -1
  47. package/dist/node-server/index.d.mts +1 -1
  48. package/dist/node-server/index.mjs +3 -3
  49. package/dist/node-server/request.mjs +1 -1
  50. package/dist/node-server/response.mjs +1 -1
  51. package/dist/node-server/serve.d.mts +1 -1
  52. package/dist/node-server/serve.mjs +2 -2
  53. package/dist/{parsers-CodQFP1Z.d.mts → parsers-7lvt3Oss.d.mts} +1 -1
  54. package/dist/{parsers-ROIZWSGI.mjs → parsers-BQ63b0YE.mjs} +1 -1
  55. package/dist/{parsers-ROIZWSGI.mjs.map → parsers-BQ63b0YE.mjs.map} +1 -1
  56. package/dist/{path-matcher-CXMJ-IrG.mjs → path-matcher-BNaaJgI3.mjs} +2 -2
  57. package/dist/{path-matcher-CXMJ-IrG.mjs.map → path-matcher-BNaaJgI3.mjs.map} +1 -1
  58. package/dist/{radix-tree-BWmhTLhT.mjs → radix-tree-Qxr-QpCx.mjs} +2 -2
  59. package/dist/{radix-tree-BWmhTLhT.mjs.map → radix-tree-Qxr-QpCx.mjs.map} +1 -1
  60. package/dist/{request-B2BkUecT.mjs → request-B886yCvG.mjs} +1 -1
  61. package/dist/{request-B2BkUecT.mjs.map → request-B886yCvG.mjs.map} +1 -1
  62. package/dist/{request-validator-u2Ccj3_x.d.mts → request-validator-42lY21gn.d.mts} +2 -2
  63. package/dist/{request-validator-Dyqng-H_.mjs → request-validator-DLFtm4uV.mjs} +3 -3
  64. package/dist/{request-validator-Dyqng-H_.mjs.map → request-validator-DLFtm4uV.mjs.map} +1 -1
  65. package/dist/{response-BhFKEphr.mjs → response-30WnzABq.mjs} +1 -1
  66. package/dist/{response-BhFKEphr.mjs.map → response-30WnzABq.mjs.map} +1 -1
  67. package/dist/response-CxYf6Ep3.d.mts +48 -0
  68. package/dist/{route-BRR15b-p.mjs → route-B3ONOzxQ.mjs} +1 -1
  69. package/dist/{route-BRR15b-p.mjs.map → route-B3ONOzxQ.mjs.map} +1 -1
  70. package/dist/{route-BqmWCG4e.d.mts → route-CUbNpSwz.d.mts} +2 -2
  71. package/dist/{route-registry-AlkDgbcE.mjs → route-registry-BVvbghgH.mjs} +2 -2
  72. package/dist/{route-registry-AlkDgbcE.mjs.map → route-registry-BVvbghgH.mjs.map} +1 -1
  73. package/dist/{route-registry-ykzRmaHB.d.mts → route-registry-CYD7m6QP.d.mts} +2 -2
  74. package/dist/router/index.d.mts +2 -2
  75. package/dist/router/index.mjs +2 -2
  76. package/dist/router/radix-tree.d.mts +3 -3
  77. package/dist/router/radix-tree.mjs +1 -1
  78. package/dist/{router-BOeVQrjz.mjs → router-B9HUUCkR.mjs} +2 -2
  79. package/dist/{router-BOeVQrjz.mjs.map → router-B9HUUCkR.mjs.map} +1 -1
  80. package/dist/router.d.mts +3 -3
  81. package/dist/router.mjs +1 -1
  82. package/dist/{schema-CVuttFSw.d.mts → schema-DOKg31ZX.d.mts} +1 -1
  83. package/dist/{serve-BQQ2JzIH.d.mts → serve-B5WmhK6m.d.mts} +1 -1
  84. package/dist/{serve-MRGGK7-q.mjs → serve-DgWBnexE.mjs} +3 -3
  85. package/dist/{serve-MRGGK7-q.mjs.map → serve-DgWBnexE.mjs.map} +1 -1
  86. package/dist/serve.d.mts +1 -1
  87. package/dist/serve.mjs +2 -2
  88. package/dist/server/base-server.d.mts +3 -3
  89. package/dist/server/base-server.mjs +1 -1
  90. package/dist/server/component-server.d.mts +4 -4
  91. package/dist/server/component-server.mjs +2 -2
  92. package/dist/server/index.d.mts +6 -6
  93. package/dist/server/index.mjs +6 -5
  94. package/dist/server/server-factory.d.mts +6 -6
  95. package/dist/server/server-factory.mjs +5 -3
  96. package/dist/server/server.d.mts +4 -4
  97. package/dist/server/server.mjs +2 -1
  98. package/dist/{server-B0nzGCG5.mjs → server-BttM6Ssc.mjs} +5 -5
  99. package/dist/{server-B0nzGCG5.mjs.map → server-BttM6Ssc.mjs.map} +1 -1
  100. package/dist/{server-C8WCshmG.mjs → server-C3yoZXNs.mjs} +7 -8
  101. package/dist/{server-C8WCshmG.mjs.map → server-C3yoZXNs.mjs.map} +1 -1
  102. package/dist/{server-Drc2kSxp.d.mts → server-CWIZP6nb.d.mts} +3 -3
  103. package/dist/{sse-BOd2pvUK.d.mts → sse-BDIptC85.d.mts} +2 -2
  104. package/dist/{sse-US5D9mgE.mjs → sse-CCVfFW6s.mjs} +3 -3
  105. package/dist/{sse-US5D9mgE.mjs.map → sse-CCVfFW6s.mjs.map} +1 -1
  106. package/dist/types/component-route.d.mts +1 -1
  107. package/dist/types/index.d.mts +5 -5
  108. package/dist/types/index.mjs +1 -1
  109. package/dist/types/route.d.mts +1 -1
  110. package/dist/types/route.mjs +1 -1
  111. package/dist/types/schema.d.mts +1 -1
  112. package/dist/types/types.d.mts +1 -1
  113. package/dist/{types-Cb7_2VSt.d.mts → types-mpeSaHdI.d.mts} +1 -1
  114. package/dist/utils/base64url.d.mts +1 -1
  115. package/dist/utils/base64url.mjs +1 -1
  116. package/dist/utils/create-handler.d.mts +2 -2
  117. package/dist/utils/create-handler.mjs +4 -3
  118. package/dist/utils/dependency-manager.d.mts +1 -1
  119. package/dist/utils/dependency-manager.mjs +1 -1
  120. package/dist/utils/formats.d.mts +1 -1
  121. package/dist/utils/go-await.d.mts +1 -1
  122. package/dist/utils/go-await.mjs +1 -1
  123. package/dist/utils/handle.d.mts +1 -1
  124. package/dist/utils/handle.mjs +2 -2
  125. package/dist/utils/html-renderer.d.mts +1 -1
  126. package/dist/utils/html-renderer.mjs +1 -1
  127. package/dist/utils/index.d.mts +17 -16
  128. package/dist/utils/index.mjs +13 -13
  129. package/dist/utils/index.mjs.map +1 -1
  130. package/dist/utils/parsers.d.mts +1 -1
  131. package/dist/utils/parsers.mjs +1 -1
  132. package/dist/utils/path-matcher.mjs +1 -1
  133. package/dist/utils/request-validator.d.mts +2 -2
  134. package/dist/utils/request-validator.mjs +3 -3
  135. package/dist/utils/response.d.mts +5 -2
  136. package/dist/utils/response.mjs +2 -2
  137. package/dist/utils/route-registry.d.mts +3 -3
  138. package/dist/utils/route-registry.mjs +1 -1
  139. package/dist/utils/sse.d.mts +2 -2
  140. package/dist/utils/sse.mjs +3 -3
  141. package/dist/utils/validators/validators.d.mts +1 -1
  142. package/dist/utils/validators/validators.mjs +1 -1
  143. package/dist/{validators-C0eZyxPh.d.mts → validators-CPmnj_y9.d.mts} +1 -1
  144. package/dist/{validators-CbCLj0Rc.mjs → validators-WXQ49LcR.mjs} +1 -1
  145. package/dist/{validators-CbCLj0Rc.mjs.map → validators-WXQ49LcR.mjs.map} +1 -1
  146. package/package.json +1 -1
  147. package/dist/auth/token.d.mts +0 -44
  148. package/dist/auth/token.mjs +0 -105
  149. package/dist/auth/token.mjs.map +0 -1
  150. package/dist/middleware/auth.d.mts +0 -20
  151. package/dist/middleware/auth.mjs +0 -98
  152. package/dist/middleware/auth.mjs.map +0 -1
  153. package/dist/middleware/authMiddleware.d.mts +0 -9
  154. package/dist/middleware/authMiddleware.mjs +0 -19
  155. package/dist/middleware/authMiddleware.mjs.map +0 -1
  156. package/dist/middleware/cors.d.mts +0 -16
  157. package/dist/middleware/cors.mjs +0 -38
  158. package/dist/middleware/cors.mjs.map +0 -1
  159. package/dist/middleware/rateLimit.d.mts +0 -14
  160. package/dist/middleware/rateLimit.mjs +0 -34
  161. package/dist/middleware/rateLimit.mjs.map +0 -1
  162. package/dist/middleware-3ShRJyd1.mjs +0 -59
  163. package/dist/middleware-3ShRJyd1.mjs.map +0 -1
  164. package/dist/response-CSKW5hsS.mjs +0 -97
  165. package/dist/response-CSKW5hsS.mjs.map +0 -1
  166. package/dist/response-CUyV5FIm.d.mts +0 -21
  167. /package/dist/{chunk-67U6L5Jh.mjs → chunk-DW4-Jl94.mjs} +0 -0
  168. /package/dist/{component-route-Do2yyYTi.mjs → component-route-BKUFoJ5P.mjs} +0 -0
  169. /package/dist/{index-DXJd7-2Z.d.mts → index-CTHojwxd.d.mts} +0 -0
  170. /package/dist/{schema-CbAaktsZ.mjs → schema-CflsMJuG.mjs} +0 -0
@@ -1,4 +1,4 @@
1
- import { a as mapResponse, c as text, i as json, n as html, o as redirect, r as init_response, s as stream, t as empty } from "../response-CSKW5hsS.mjs";
1
+ import { a as err, c as json, d as stream, f as text, i as empty, l as mapResponse, o as html, s as init_response, u as redirect } from "../middleware-CV5o-4wk.mjs";
2
2
 
3
3
  init_response();
4
- export { empty, html, json, mapResponse, redirect, stream, text };
4
+ export { empty, err, html, json, mapResponse, redirect, stream, text };
@@ -1,4 +1,4 @@
1
- import "../schema-CVuttFSw.mjs";
2
- import "../index-DXJd7-2Z.mjs";
3
- import { a as getAllRoutes, c as setGlobalRegistry, i as filterRoutes, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "../route-registry-ykzRmaHB.mjs";
1
+ import "../schema-DOKg31ZX.mjs";
2
+ import "../index-CTHojwxd.mjs";
3
+ import { a as getAllRoutes, c as setGlobalRegistry, i as filterRoutes, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "../route-registry-CYD7m6QP.mjs";
4
4
  export { RouteMeta, RouteRegistry, createRouteRegistry, filterRoutes, getAllRoutes, getRoute, getRouteRegistry, setGlobalRegistry };
@@ -1,4 +1,4 @@
1
- import { a as getRoute, c as setGlobalRegistry, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as init_route_registry, t as RouteRegistry } from "../route-registry-AlkDgbcE.mjs";
1
+ import { a as getRoute, c as setGlobalRegistry, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as init_route_registry, t as RouteRegistry } from "../route-registry-BVvbghgH.mjs";
2
2
 
3
3
  init_route_registry();
4
4
  export { RouteRegistry, createRouteRegistry, filterRoutes, getAllRoutes, getRoute, getRouteRegistry, setGlobalRegistry };
@@ -1,3 +1,3 @@
1
- import "../schema-CVuttFSw.mjs";
2
- import { a as createSSEHandler, i as SSEMarker, n as SSEGenerator, r as SSEHandler, t as SSEEvent } from "../sse-BOd2pvUK.mjs";
1
+ import "../schema-DOKg31ZX.mjs";
2
+ import { a as createSSEHandler, i as SSEMarker, n as SSEGenerator, r as SSEHandler, t as SSEEvent } from "../sse-BDIptC85.mjs";
3
3
  export { SSEEvent, SSEGenerator, SSEHandler, SSEMarker, createSSEHandler };
@@ -1,5 +1,5 @@
1
- import "../parsers-ROIZWSGI.mjs";
2
- import "../validators-CbCLj0Rc.mjs";
3
- import { t as createSSEHandler } from "../sse-US5D9mgE.mjs";
1
+ import "../parsers-BQ63b0YE.mjs";
2
+ import "../validators-WXQ49LcR.mjs";
3
+ import { t as createSSEHandler } from "../sse-CCVfFW6s.mjs";
4
4
 
5
5
  export { createSSEHandler };
@@ -1,2 +1,2 @@
1
- import { a as ValidationError, c as getValidatorCacheStats, d as validateFast, f as validateSchema, i as Type, l as precompileSchemas, n as Static, o as ValidationResult, p as validateSchemaOrThrow, r as TSchema, s as createValidator, t as SchemaConfig, u as validateAllSchemas } from "../../validators-C0eZyxPh.mjs";
1
+ import { a as ValidationError, c as getValidatorCacheStats, d as validateFast, f as validateSchema, i as Type, l as precompileSchemas, n as Static, o as ValidationResult, p as validateSchemaOrThrow, r as TSchema, s as createValidator, t as SchemaConfig, u as validateAllSchemas } from "../../validators-CPmnj_y9.mjs";
2
2
  export { SchemaConfig, Static, TSchema, Type, ValidationError, ValidationResult, createValidator, getValidatorCacheStats, precompileSchemas, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow };
@@ -1,3 +1,3 @@
1
- import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema, t as Type } from "../../validators-CbCLj0Rc.mjs";
1
+ import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema, t as Type } from "../../validators-WXQ49LcR.mjs";
2
2
 
3
3
  export { Type, createValidator, getValidatorCacheStats, precompileSchemas, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow };
@@ -64,4 +64,4 @@ declare function getValidatorCacheStats(): {
64
64
  };
65
65
  //#endregion
66
66
  export { ValidationError as a, getValidatorCacheStats as c, validateFast as d, validateSchema as f, Type as i, precompileSchemas as l, Static$1 as n, ValidationResult as o, validateSchemaOrThrow as p, TSchema$1 as r, createValidator as s, SchemaConfig as t, validateAllSchemas as u };
67
- //# sourceMappingURL=validators-C0eZyxPh.d.mts.map
67
+ //# sourceMappingURL=validators-CPmnj_y9.d.mts.map
@@ -109,4 +109,4 @@ function getValidatorCacheStats() {
109
109
 
110
110
  //#endregion
111
111
  export { validateAllSchemas as a, validateSchemaOrThrow as c, precompileSchemas as i, createValidator as n, validateFast as o, getValidatorCacheStats as r, validateSchema as s, Type as t };
112
- //# sourceMappingURL=validators-CbCLj0Rc.mjs.map
112
+ //# sourceMappingURL=validators-WXQ49LcR.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators-CbCLj0Rc.mjs","names":[],"sources":["../src/utils/validators/validators.ts"],"sourcesContent":["/**\n * Schema 验证器 - 简洁版\n *\n * 特点:\n * - WeakMap 缓存避免内存泄漏\n * - TypeCompiler JIT 编译,性能最佳\n * - 支持 FormatRegistry(需确保同一实例)\n *\n * @version 7.0.0\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Static, TSchema } from \"@sinclair/typebox\";\nimport { TypeCompiler, type TypeCheck } from \"@sinclair/typebox/compiler\";\nimport { Value } from \"@sinclair/typebox/value\";\n\n// ============== 类型定义 ==============\n\n/** Schema 配置接口 */\nexport interface SchemaConfig {\n body?: TSchema;\n query?: TSchema;\n params?: TSchema;\n headers?: TSchema;\n cookies?: TSchema;\n}\n\n/** 验证错误接口 */\nexport interface ValidationError {\n path: string;\n message: string;\n code: string;\n value?: unknown;\n}\n\n/** 验证结果 */\nexport type ValidationResult<T = unknown> =\n | { success: true; data: T }\n | { success: false; errors: ValidationError[] };\n\n// ============== 缓存 ==============\n\n/** 编译器缓存 - WeakMap 避免内存泄漏 */\nconst compilerCache = new WeakMap<TSchema, TypeCheck<TSchema>>();\n\n// ============== 核心函数 ==============\n\n/**\n * 获取或创建编译后的验证器\n */\nfunction getCompiledValidator<T extends TSchema>(schema: T): TypeCheck<T> {\n let compiler = compilerCache.get(schema);\n if (!compiler) {\n compiler = TypeCompiler.Compile(schema);\n compilerCache.set(schema, compiler);\n }\n return compiler as TypeCheck<T>;\n}\n\n/**\n * 验证单个 Schema(返回结果对象)\n */\nexport function validateSchema<T extends TSchema>(\n schema: T,\n data: unknown,\n): ValidationResult<Static<T>> {\n try {\n const compiler = getCompiledValidator(schema);\n\n if (compiler.Check(data)) {\n return { success: true, data: data as Static<T> };\n }\n\n // 收集错误\n const errors: ValidationError[] = [];\n for (const error of compiler.Errors(data)) {\n errors.push({\n path: error.path,\n message: error.message,\n code: \"VALIDATION_FAILED\",\n value: error.value,\n });\n }\n return { success: false, errors };\n } catch (error) {\n return {\n success: false,\n errors: [\n {\n path: \"\",\n message: error instanceof Error ? error.message : \"验证异常\",\n code: \"VALIDATION_EXCEPTION\",\n },\n ],\n };\n }\n}\n\n/**\n * 验证 Schema(抛出异常版本,用于框架内部)\n */\nexport function validateSchemaOrThrow<T extends TSchema>(\n schema: T,\n data: unknown,\n context: string,\n): Static<T> {\n const compiler = getCompiledValidator(schema);\n\n if (!compiler.Check(data)) {\n throw new Error(`${context}验证失败`);\n }\n\n return data as Static<T>;\n}\n\n/**\n * 快速验证(只返回布尔值)\n */\nexport function validateFast<T extends TSchema>(\n schema: T,\n data: unknown,\n): data is Static<T> {\n const compiler = getCompiledValidator(schema);\n return compiler.Check(data);\n}\n\n/**\n * 批量验证所有 Schema(用于请求验证)\n */\nexport function validateAllSchemas(\n config: SchemaConfig,\n data: {\n body: unknown;\n query: unknown;\n params: unknown;\n headers: unknown;\n cookies: unknown;\n },\n): typeof data {\n if (config.body) {\n validateSchemaOrThrow(config.body, data.body, \"请求体\");\n }\n if (config.query) {\n validateSchemaOrThrow(config.query, data.query, \"Query参数\");\n }\n if (config.params) {\n validateSchemaOrThrow(config.params, data.params, \"路径参数\");\n }\n if (config.headers) {\n validateSchemaOrThrow(config.headers, data.headers, \"请求头\");\n }\n if (config.cookies) {\n validateSchemaOrThrow(config.cookies, data.cookies, \"Cookie\");\n }\n return data;\n}\n\n/**\n * 预编译 Schema(启动时调用,避免首次请求开销)\n */\nexport function precompileSchemas(config: SchemaConfig): void {\n if (config.body) getCompiledValidator(config.body);\n if (config.query) getCompiledValidator(config.query);\n if (config.params) getCompiledValidator(config.params);\n if (config.headers) getCompiledValidator(config.headers);\n if (config.cookies) getCompiledValidator(config.cookies);\n}\n\n/**\n * 创建类型特化的验证器(高频使用场景)\n */\nexport function createValidator<T extends TSchema>(\n schema: T,\n): (data: unknown) => ValidationResult<Static<T>> {\n return (data: unknown) => validateSchema(schema, data);\n}\n\n/**\n * 获取缓存统计(调试用)\n */\nexport function getValidatorCacheStats(): { cacheType: string; note: string } {\n return {\n cacheType: \"WeakMap\",\n note: \"WeakMap 缓存会随 Schema 对象自动清理,无内存泄漏风险\",\n };\n}\n\n// 导出 TypeBox 类型\nexport { Type, Static, TSchema };\n"],"mappings":";;;;;;;;;;;;;;;AA2CA,MAAM,gCAAgB,IAAI,SAAsC;;;;AAOhE,SAAS,qBAAwC,QAAyB;CACxE,IAAI,WAAW,cAAc,IAAI,OAAO;AACxC,KAAI,CAAC,UAAU;AACb,aAAW,aAAa,QAAQ,OAAO;AACvC,gBAAc,IAAI,QAAQ,SAAS;;AAErC,QAAO;;;;;AAMT,SAAgB,eACd,QACA,MAC6B;AAC7B,KAAI;EACF,MAAM,WAAW,qBAAqB,OAAO;AAE7C,MAAI,SAAS,MAAM,KAAK,CACtB,QAAO;GAAE,SAAS;GAAY;GAAmB;EAInD,MAAM,SAA4B,EAAE;AACpC,OAAK,MAAM,SAAS,SAAS,OAAO,KAAK,CACvC,QAAO,KAAK;GACV,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,MAAM;GACN,OAAO,MAAM;GACd,CAAC;AAEJ,SAAO;GAAE,SAAS;GAAO;GAAQ;UAC1B,OAAO;AACd,SAAO;GACL,SAAS;GACT,QAAQ,CACN;IACE,MAAM;IACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU;IAClD,MAAM;IACP,CACF;GACF;;;;;;AAOL,SAAgB,sBACd,QACA,MACA,SACW;AAGX,KAAI,CAFa,qBAAqB,OAAO,CAE/B,MAAM,KAAK,CACvB,OAAM,IAAI,MAAM,GAAG,QAAQ,MAAM;AAGnC,QAAO;;;;;AAMT,SAAgB,aACd,QACA,MACmB;AAEnB,QADiB,qBAAqB,OAAO,CAC7B,MAAM,KAAK;;;;;AAM7B,SAAgB,mBACd,QACA,MAOa;AACb,KAAI,OAAO,KACT,uBAAsB,OAAO,MAAM,KAAK,MAAM,MAAM;AAEtD,KAAI,OAAO,MACT,uBAAsB,OAAO,OAAO,KAAK,OAAO,UAAU;AAE5D,KAAI,OAAO,OACT,uBAAsB,OAAO,QAAQ,KAAK,QAAQ,OAAO;AAE3D,KAAI,OAAO,QACT,uBAAsB,OAAO,SAAS,KAAK,SAAS,MAAM;AAE5D,KAAI,OAAO,QACT,uBAAsB,OAAO,SAAS,KAAK,SAAS,SAAS;AAE/D,QAAO;;;;;AAMT,SAAgB,kBAAkB,QAA4B;AAC5D,KAAI,OAAO,KAAM,sBAAqB,OAAO,KAAK;AAClD,KAAI,OAAO,MAAO,sBAAqB,OAAO,MAAM;AACpD,KAAI,OAAO,OAAQ,sBAAqB,OAAO,OAAO;AACtD,KAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;AACxD,KAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;;;;;AAM1D,SAAgB,gBACd,QACgD;AAChD,SAAQ,SAAkB,eAAe,QAAQ,KAAK;;;;;AAMxD,SAAgB,yBAA8D;AAC5E,QAAO;EACL,WAAW;EACX,MAAM;EACP"}
1
+ {"version":3,"file":"validators-WXQ49LcR.mjs","names":[],"sources":["../src/utils/validators/validators.ts"],"sourcesContent":["/**\n * Schema 验证器 - 简洁版\n *\n * 特点:\n * - WeakMap 缓存避免内存泄漏\n * - TypeCompiler JIT 编译,性能最佳\n * - 支持 FormatRegistry(需确保同一实例)\n *\n * @version 7.0.0\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Static, TSchema } from \"@sinclair/typebox\";\nimport { TypeCompiler, type TypeCheck } from \"@sinclair/typebox/compiler\";\nimport { Value } from \"@sinclair/typebox/value\";\n\n// ============== 类型定义 ==============\n\n/** Schema 配置接口 */\nexport interface SchemaConfig {\n body?: TSchema;\n query?: TSchema;\n params?: TSchema;\n headers?: TSchema;\n cookies?: TSchema;\n}\n\n/** 验证错误接口 */\nexport interface ValidationError {\n path: string;\n message: string;\n code: string;\n value?: unknown;\n}\n\n/** 验证结果 */\nexport type ValidationResult<T = unknown> =\n | { success: true; data: T }\n | { success: false; errors: ValidationError[] };\n\n// ============== 缓存 ==============\n\n/** 编译器缓存 - WeakMap 避免内存泄漏 */\nconst compilerCache = new WeakMap<TSchema, TypeCheck<TSchema>>();\n\n// ============== 核心函数 ==============\n\n/**\n * 获取或创建编译后的验证器\n */\nfunction getCompiledValidator<T extends TSchema>(schema: T): TypeCheck<T> {\n let compiler = compilerCache.get(schema);\n if (!compiler) {\n compiler = TypeCompiler.Compile(schema);\n compilerCache.set(schema, compiler);\n }\n return compiler as TypeCheck<T>;\n}\n\n/**\n * 验证单个 Schema(返回结果对象)\n */\nexport function validateSchema<T extends TSchema>(\n schema: T,\n data: unknown,\n): ValidationResult<Static<T>> {\n try {\n const compiler = getCompiledValidator(schema);\n\n if (compiler.Check(data)) {\n return { success: true, data: data as Static<T> };\n }\n\n // 收集错误\n const errors: ValidationError[] = [];\n for (const error of compiler.Errors(data)) {\n errors.push({\n path: error.path,\n message: error.message,\n code: \"VALIDATION_FAILED\",\n value: error.value,\n });\n }\n return { success: false, errors };\n } catch (error) {\n return {\n success: false,\n errors: [\n {\n path: \"\",\n message: error instanceof Error ? error.message : \"验证异常\",\n code: \"VALIDATION_EXCEPTION\",\n },\n ],\n };\n }\n}\n\n/**\n * 验证 Schema(抛出异常版本,用于框架内部)\n */\nexport function validateSchemaOrThrow<T extends TSchema>(\n schema: T,\n data: unknown,\n context: string,\n): Static<T> {\n const compiler = getCompiledValidator(schema);\n\n if (!compiler.Check(data)) {\n throw new Error(`${context}验证失败`);\n }\n\n return data as Static<T>;\n}\n\n/**\n * 快速验证(只返回布尔值)\n */\nexport function validateFast<T extends TSchema>(\n schema: T,\n data: unknown,\n): data is Static<T> {\n const compiler = getCompiledValidator(schema);\n return compiler.Check(data);\n}\n\n/**\n * 批量验证所有 Schema(用于请求验证)\n */\nexport function validateAllSchemas(\n config: SchemaConfig,\n data: {\n body: unknown;\n query: unknown;\n params: unknown;\n headers: unknown;\n cookies: unknown;\n },\n): typeof data {\n if (config.body) {\n validateSchemaOrThrow(config.body, data.body, \"请求体\");\n }\n if (config.query) {\n validateSchemaOrThrow(config.query, data.query, \"Query参数\");\n }\n if (config.params) {\n validateSchemaOrThrow(config.params, data.params, \"路径参数\");\n }\n if (config.headers) {\n validateSchemaOrThrow(config.headers, data.headers, \"请求头\");\n }\n if (config.cookies) {\n validateSchemaOrThrow(config.cookies, data.cookies, \"Cookie\");\n }\n return data;\n}\n\n/**\n * 预编译 Schema(启动时调用,避免首次请求开销)\n */\nexport function precompileSchemas(config: SchemaConfig): void {\n if (config.body) getCompiledValidator(config.body);\n if (config.query) getCompiledValidator(config.query);\n if (config.params) getCompiledValidator(config.params);\n if (config.headers) getCompiledValidator(config.headers);\n if (config.cookies) getCompiledValidator(config.cookies);\n}\n\n/**\n * 创建类型特化的验证器(高频使用场景)\n */\nexport function createValidator<T extends TSchema>(\n schema: T,\n): (data: unknown) => ValidationResult<Static<T>> {\n return (data: unknown) => validateSchema(schema, data);\n}\n\n/**\n * 获取缓存统计(调试用)\n */\nexport function getValidatorCacheStats(): { cacheType: string; note: string } {\n return {\n cacheType: \"WeakMap\",\n note: \"WeakMap 缓存会随 Schema 对象自动清理,无内存泄漏风险\",\n };\n}\n\n// 导出 TypeBox 类型\nexport { Type, Static, TSchema };\n"],"mappings":";;;;;;;;;;;;;;;AA2CA,MAAM,gCAAgB,IAAI,SAAsC;;;;AAOhE,SAAS,qBAAwC,QAAyB;CACxE,IAAI,WAAW,cAAc,IAAI,OAAO;AACxC,KAAI,CAAC,UAAU;AACb,aAAW,aAAa,QAAQ,OAAO;AACvC,gBAAc,IAAI,QAAQ,SAAS;;AAErC,QAAO;;;;;AAMT,SAAgB,eACd,QACA,MAC6B;AAC7B,KAAI;EACF,MAAM,WAAW,qBAAqB,OAAO;AAE7C,MAAI,SAAS,MAAM,KAAK,CACtB,QAAO;GAAE,SAAS;GAAY;GAAmB;EAInD,MAAM,SAA4B,EAAE;AACpC,OAAK,MAAM,SAAS,SAAS,OAAO,KAAK,CACvC,QAAO,KAAK;GACV,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,MAAM;GACN,OAAO,MAAM;GACd,CAAC;AAEJ,SAAO;GAAE,SAAS;GAAO;GAAQ;UAC1B,OAAO;AACd,SAAO;GACL,SAAS;GACT,QAAQ,CACN;IACE,MAAM;IACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU;IAClD,MAAM;IACP,CACF;GACF;;;;;;AAOL,SAAgB,sBACd,QACA,MACA,SACW;AAGX,KAAI,CAFa,qBAAqB,OAAO,CAE/B,MAAM,KAAK,CACvB,OAAM,IAAI,MAAM,GAAG,QAAQ,MAAM;AAGnC,QAAO;;;;;AAMT,SAAgB,aACd,QACA,MACmB;AAEnB,QADiB,qBAAqB,OAAO,CAC7B,MAAM,KAAK;;;;;AAM7B,SAAgB,mBACd,QACA,MAOa;AACb,KAAI,OAAO,KACT,uBAAsB,OAAO,MAAM,KAAK,MAAM,MAAM;AAEtD,KAAI,OAAO,MACT,uBAAsB,OAAO,OAAO,KAAK,OAAO,UAAU;AAE5D,KAAI,OAAO,OACT,uBAAsB,OAAO,QAAQ,KAAK,QAAQ,OAAO;AAE3D,KAAI,OAAO,QACT,uBAAsB,OAAO,SAAS,KAAK,SAAS,MAAM;AAE5D,KAAI,OAAO,QACT,uBAAsB,OAAO,SAAS,KAAK,SAAS,SAAS;AAE/D,QAAO;;;;;AAMT,SAAgB,kBAAkB,QAA4B;AAC5D,KAAI,OAAO,KAAM,sBAAqB,OAAO,KAAK;AAClD,KAAI,OAAO,MAAO,sBAAqB,OAAO,MAAM;AACpD,KAAI,OAAO,OAAQ,sBAAqB,OAAO,OAAO;AACtD,KAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;AACxD,KAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;;;;;AAM1D,SAAgB,gBACd,QACgD;AAChD,SAAQ,SAAkB,eAAe,QAAQ,KAAK;;;;;AAMxD,SAAgB,yBAA8D;AAC5E,QAAO;EACL,WAAW;EACX,MAAM;EACP"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vafast",
3
- "version": "0.4.3",
3
+ "version": "0.4.6",
4
4
  "description": "极简结构化Web框架,支持 Bun 和 Node.js。Go风格,函数优先。",
5
5
  "type": "module",
6
6
  "repository": {
@@ -1,44 +0,0 @@
1
- //#region src/auth/token.d.ts
2
- interface TokenPayload {
3
- [key: string]: any;
4
- exp?: number;
5
- iat?: number;
6
- sub?: string;
7
- aud?: string;
8
- iss?: string;
9
- }
10
- interface TokenResult {
11
- payload: TokenPayload;
12
- token: string;
13
- expiresAt: number;
14
- }
15
- interface TokenOptions {
16
- expiresIn?: number;
17
- issuer?: string;
18
- audience?: string;
19
- subject?: string;
20
- }
21
- declare class TokenError extends Error {
22
- code: "INVALID_TOKEN" | "EXPIRED_TOKEN" | "INVALID_SIGNATURE" | "MALFORMED_TOKEN" | "INVALID_PAYLOAD";
23
- constructor(message: string, code: "INVALID_TOKEN" | "EXPIRED_TOKEN" | "INVALID_SIGNATURE" | "MALFORMED_TOKEN" | "INVALID_PAYLOAD");
24
- }
25
- /** 生成令牌 */
26
- declare function generateToken(payload: TokenPayload, secret: string, options?: TokenOptions): Promise<TokenResult>;
27
- /** 验证令牌 */
28
- declare function verifyToken(token: string, secret: string): Promise<TokenPayload | null>;
29
- /** 解析令牌(不验证签名) */
30
- declare function parseToken(token: string): TokenPayload | null;
31
- /** 检查令牌是否过期 */
32
- declare function isTokenExpired(token: string): boolean;
33
- /** 获取令牌剩余有效时间(秒) */
34
- declare function getTokenTimeRemaining(token: string): number;
35
- /** 刷新令牌 */
36
- declare function refreshToken(token: string, secret: string, options?: TokenOptions): Promise<TokenResult | null>;
37
- /** 创建访问令牌和刷新令牌对 */
38
- declare function createTokenPair(payload: TokenPayload, secret: string, options?: TokenOptions): Promise<{
39
- accessToken: TokenResult;
40
- refreshToken: TokenResult;
41
- }>;
42
- //#endregion
43
- export { TokenError, TokenOptions, TokenPayload, TokenResult, createTokenPair, generateToken, getTokenTimeRemaining, isTokenExpired, parseToken, refreshToken, verifyToken };
44
- //# sourceMappingURL=token.d.mts.map
@@ -1,105 +0,0 @@
1
- import { n as base64urlEncode, t as base64urlDecode } from "../base64url-DLDOeXsk.mjs";
2
-
3
- //#region src/auth/token.ts
4
- var TokenError = class extends Error {
5
- constructor(message, code) {
6
- super(message);
7
- this.code = code;
8
- this.name = "TokenError";
9
- }
10
- };
11
- const encoder = new TextEncoder();
12
- /** 使用 HMAC-SHA256 进行签名 */
13
- async function sign(data, secret) {
14
- const key = await crypto.subtle.importKey("raw", encoder.encode(secret), {
15
- name: "HMAC",
16
- hash: "SHA-256"
17
- }, false, ["sign"]);
18
- const signature = await crypto.subtle.sign("HMAC", key, encoder.encode(data));
19
- return btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(signature))));
20
- }
21
- /** 生成令牌 */
22
- async function generateToken(payload, secret, options = {}) {
23
- const { expiresIn = 3600, issuer, audience, subject } = options;
24
- const now = Math.floor(Date.now() / 1e3);
25
- const tokenPayload = {
26
- ...payload,
27
- iat: now,
28
- exp: now + expiresIn
29
- };
30
- if (issuer) tokenPayload.iss = issuer;
31
- if (audience) tokenPayload.aud = audience;
32
- if (subject) tokenPayload.sub = subject;
33
- const data = base64urlEncode(JSON.stringify(tokenPayload));
34
- return {
35
- payload: tokenPayload,
36
- token: `${data}.${base64urlEncode(await sign(data, secret))}`,
37
- expiresAt: tokenPayload.exp * 1e3
38
- };
39
- }
40
- /** 验证令牌 */
41
- async function verifyToken(token, secret) {
42
- try {
43
- const [data, sig] = token.split(".");
44
- if (!data || !sig) throw new TokenError("令牌格式无效", "MALFORMED_TOKEN");
45
- if (sig !== base64urlEncode(await sign(data, secret))) throw new TokenError("令牌签名无效", "INVALID_SIGNATURE");
46
- const payload = JSON.parse(base64urlDecode(data));
47
- if (payload.exp && Date.now() / 1e3 > payload.exp) throw new TokenError("令牌已过期", "EXPIRED_TOKEN");
48
- return payload;
49
- } catch (error) {
50
- if (error instanceof TokenError) throw error;
51
- throw new TokenError("令牌验证失败", "INVALID_TOKEN");
52
- }
53
- }
54
- /** 解析令牌(不验证签名) */
55
- function parseToken(token) {
56
- try {
57
- const [data] = token.split(".");
58
- if (!data) return null;
59
- return JSON.parse(base64urlDecode(data));
60
- } catch {
61
- return null;
62
- }
63
- }
64
- /** 检查令牌是否过期 */
65
- function isTokenExpired(token) {
66
- const payload = parseToken(token);
67
- if (!payload || !payload.exp) return true;
68
- return Date.now() / 1e3 > payload.exp;
69
- }
70
- /** 获取令牌剩余有效时间(秒) */
71
- function getTokenTimeRemaining(token) {
72
- const payload = parseToken(token);
73
- if (!payload || !payload.exp) return 0;
74
- const remaining = payload.exp - Date.now() / 1e3;
75
- return Math.max(0, Math.floor(remaining));
76
- }
77
- /** 刷新令牌 */
78
- async function refreshToken(token, secret, options = {}) {
79
- try {
80
- const payload = await verifyToken(token, secret);
81
- if (!payload) return null;
82
- const { exp, iat, ...cleanPayload } = payload;
83
- await new Promise((resolve) => setTimeout(resolve, 10));
84
- return await generateToken(cleanPayload, secret, options);
85
- } catch {
86
- return null;
87
- }
88
- }
89
- /** 创建访问令牌和刷新令牌对 */
90
- async function createTokenPair(payload, secret, options = {}) {
91
- return {
92
- accessToken: await generateToken(payload, secret, {
93
- ...options,
94
- expiresIn: options.expiresIn || 3600
95
- }),
96
- refreshToken: await generateToken(payload, secret, {
97
- ...options,
98
- expiresIn: 168 * 3600
99
- })
100
- };
101
- }
102
-
103
- //#endregion
104
- export { TokenError, createTokenPair, generateToken, getTokenTimeRemaining, isTokenExpired, parseToken, refreshToken, verifyToken };
105
- //# sourceMappingURL=token.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"token.mjs","names":[],"sources":["../../src/auth/token.ts"],"sourcesContent":["// src/auth/token.ts\nimport { base64urlEncode, base64urlDecode } from \"../utils/base64url\";\n\n// 类型定义\nexport interface TokenPayload {\n [key: string]: any;\n exp?: number; // 过期时间戳\n iat?: number; // 签发时间戳\n sub?: string; // 主题(通常是用户ID)\n aud?: string; // 受众\n iss?: string; // 签发者\n}\n\nexport interface TokenResult {\n payload: TokenPayload;\n token: string;\n expiresAt: number;\n}\n\nexport interface TokenOptions {\n expiresIn?: number; // 过期时间(秒)\n issuer?: string; // 签发者\n audience?: string; // 受众\n subject?: string; // 主题\n}\n\nexport class TokenError extends Error {\n constructor(\n message: string,\n public code:\n | \"INVALID_TOKEN\"\n | \"EXPIRED_TOKEN\"\n | \"INVALID_SIGNATURE\"\n | \"MALFORMED_TOKEN\"\n | \"INVALID_PAYLOAD\",\n ) {\n super(message);\n this.name = \"TokenError\";\n }\n}\n\nconst encoder = new TextEncoder();\n\n/** 使用 HMAC-SHA256 进行签名 */\nasync function sign(data: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n\n const signature = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(data));\n return btoa(\n String.fromCharCode.apply(null, Array.from(new Uint8Array(signature))),\n );\n}\n\n/** 生成令牌 */\nexport async function generateToken(\n payload: TokenPayload,\n secret: string,\n options: TokenOptions = {},\n): Promise<TokenResult> {\n const { expiresIn = 3600, issuer, audience, subject } = options;\n\n // 创建令牌载荷,强制使用当前时间\n const now = Math.floor(Date.now() / 1000);\n const tokenPayload: TokenPayload = {\n ...payload,\n iat: now,\n exp: now + expiresIn,\n };\n\n // 添加可选字段\n if (issuer) tokenPayload.iss = issuer;\n if (audience) tokenPayload.aud = audience;\n if (subject) tokenPayload.sub = subject;\n\n const data = base64urlEncode(JSON.stringify(tokenPayload));\n const sig = await sign(data, secret);\n const token = `${data}.${base64urlEncode(sig)}`;\n\n return {\n payload: tokenPayload,\n token,\n expiresAt: tokenPayload.exp! * 1000, // 转换为毫秒\n };\n}\n\n/** 验证令牌 */\nexport async function verifyToken(\n token: string,\n secret: string,\n): Promise<TokenPayload | null> {\n try {\n const [data, sig] = token.split(\".\");\n if (!data || !sig) {\n throw new TokenError(\"令牌格式无效\", \"MALFORMED_TOKEN\");\n }\n\n const expectedSig = await sign(data, secret);\n const expected = base64urlEncode(expectedSig);\n\n if (sig !== expected) {\n throw new TokenError(\"令牌签名无效\", \"INVALID_SIGNATURE\");\n }\n\n const payload = JSON.parse(base64urlDecode(data)) as TokenPayload;\n\n // 检查过期时间\n if (payload.exp && Date.now() / 1000 > payload.exp) {\n throw new TokenError(\"令牌已过期\", \"EXPIRED_TOKEN\");\n }\n\n return payload;\n } catch (error) {\n if (error instanceof TokenError) {\n throw error;\n }\n throw new TokenError(\"令牌验证失败\", \"INVALID_TOKEN\");\n }\n}\n\n/** 解析令牌(不验证签名) */\nexport function parseToken(token: string): TokenPayload | null {\n try {\n const [data] = token.split(\".\");\n if (!data) return null;\n\n return JSON.parse(base64urlDecode(data));\n } catch {\n return null;\n }\n}\n\n/** 检查令牌是否过期 */\nexport function isTokenExpired(token: string): boolean {\n const payload = parseToken(token);\n if (!payload || !payload.exp) return true;\n\n return Date.now() / 1000 > payload.exp;\n}\n\n/** 获取令牌剩余有效时间(秒) */\nexport function getTokenTimeRemaining(token: string): number {\n const payload = parseToken(token);\n if (!payload || !payload.exp) return 0;\n\n const remaining = payload.exp - Date.now() / 1000;\n return Math.max(0, Math.floor(remaining));\n}\n\n/** 刷新令牌 */\nexport async function refreshToken(\n token: string,\n secret: string,\n options: TokenOptions = {},\n): Promise<TokenResult | null> {\n try {\n const payload = await verifyToken(token, secret);\n if (!payload) return null;\n\n // 移除时间相关字段,重新生成\n const { exp, iat, ...cleanPayload } = payload;\n\n // 添加延迟确保时间戳不同\n await new Promise((resolve) => setTimeout(resolve, 10));\n\n return await generateToken(cleanPayload, secret, options);\n } catch {\n return null;\n }\n}\n\n/** 创建访问令牌和刷新令牌对 */\nexport async function createTokenPair(\n payload: TokenPayload,\n secret: string,\n options: TokenOptions = {},\n): Promise<{\n accessToken: TokenResult;\n refreshToken: TokenResult;\n}> {\n const accessToken = await generateToken(payload, secret, {\n ...options,\n expiresIn: options.expiresIn || 3600, // 1小时\n });\n\n const refreshToken = await generateToken(payload, secret, {\n ...options,\n expiresIn: 7 * 24 * 3600, // 7天\n });\n\n return { accessToken, refreshToken };\n}\n"],"mappings":";;;AA0BA,IAAa,aAAb,cAAgC,MAAM;CACpC,YACE,SACA,AAAO,MAMP;AACA,QAAM,QAAQ;EAPP;AAQP,OAAK,OAAO;;;AAIhB,MAAM,UAAU,IAAI,aAAa;;AAGjC,eAAe,KAAK,MAAc,QAAiC;CACjE,MAAM,MAAM,MAAM,OAAO,OAAO,UAC9B,OACA,QAAQ,OAAO,OAAO,EACtB;EAAE,MAAM;EAAQ,MAAM;EAAW,EACjC,OACA,CAAC,OAAO,CACT;CAED,MAAM,YAAY,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAO,KAAK,CAAC;AAC7E,QAAO,KACL,OAAO,aAAa,MAAM,MAAM,MAAM,KAAK,IAAI,WAAW,UAAU,CAAC,CAAC,CACvE;;;AAIH,eAAsB,cACpB,SACA,QACA,UAAwB,EAAE,EACJ;CACtB,MAAM,EAAE,YAAY,MAAM,QAAQ,UAAU,YAAY;CAGxD,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;CACzC,MAAM,eAA6B;EACjC,GAAG;EACH,KAAK;EACL,KAAK,MAAM;EACZ;AAGD,KAAI,OAAQ,cAAa,MAAM;AAC/B,KAAI,SAAU,cAAa,MAAM;AACjC,KAAI,QAAS,cAAa,MAAM;CAEhC,MAAM,OAAO,gBAAgB,KAAK,UAAU,aAAa,CAAC;AAI1D,QAAO;EACL,SAAS;EACT,OAJY,GAAG,KAAK,GAAG,gBADb,MAAM,KAAK,MAAM,OAAO,CACS;EAK3C,WAAW,aAAa,MAAO;EAChC;;;AAIH,eAAsB,YACpB,OACA,QAC8B;AAC9B,KAAI;EACF,MAAM,CAAC,MAAM,OAAO,MAAM,MAAM,IAAI;AACpC,MAAI,CAAC,QAAQ,CAAC,IACZ,OAAM,IAAI,WAAW,UAAU,kBAAkB;AAMnD,MAAI,QAFa,gBADG,MAAM,KAAK,MAAM,OAAO,CACC,CAG3C,OAAM,IAAI,WAAW,UAAU,oBAAoB;EAGrD,MAAM,UAAU,KAAK,MAAM,gBAAgB,KAAK,CAAC;AAGjD,MAAI,QAAQ,OAAO,KAAK,KAAK,GAAG,MAAO,QAAQ,IAC7C,OAAM,IAAI,WAAW,SAAS,gBAAgB;AAGhD,SAAO;UACA,OAAO;AACd,MAAI,iBAAiB,WACnB,OAAM;AAER,QAAM,IAAI,WAAW,UAAU,gBAAgB;;;;AAKnD,SAAgB,WAAW,OAAoC;AAC7D,KAAI;EACF,MAAM,CAAC,QAAQ,MAAM,MAAM,IAAI;AAC/B,MAAI,CAAC,KAAM,QAAO;AAElB,SAAO,KAAK,MAAM,gBAAgB,KAAK,CAAC;SAClC;AACN,SAAO;;;;AAKX,SAAgB,eAAe,OAAwB;CACrD,MAAM,UAAU,WAAW,MAAM;AACjC,KAAI,CAAC,WAAW,CAAC,QAAQ,IAAK,QAAO;AAErC,QAAO,KAAK,KAAK,GAAG,MAAO,QAAQ;;;AAIrC,SAAgB,sBAAsB,OAAuB;CAC3D,MAAM,UAAU,WAAW,MAAM;AACjC,KAAI,CAAC,WAAW,CAAC,QAAQ,IAAK,QAAO;CAErC,MAAM,YAAY,QAAQ,MAAM,KAAK,KAAK,GAAG;AAC7C,QAAO,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,CAAC;;;AAI3C,eAAsB,aACpB,OACA,QACA,UAAwB,EAAE,EACG;AAC7B,KAAI;EACF,MAAM,UAAU,MAAM,YAAY,OAAO,OAAO;AAChD,MAAI,CAAC,QAAS,QAAO;EAGrB,MAAM,EAAE,KAAK,KAAK,GAAG,iBAAiB;AAGtC,QAAM,IAAI,SAAS,YAAY,WAAW,SAAS,GAAG,CAAC;AAEvD,SAAO,MAAM,cAAc,cAAc,QAAQ,QAAQ;SACnD;AACN,SAAO;;;;AAKX,eAAsB,gBACpB,SACA,QACA,UAAwB,EAAE,EAIzB;AAWD,QAAO;EAAE,aAVW,MAAM,cAAc,SAAS,QAAQ;GACvD,GAAG;GACH,WAAW,QAAQ,aAAa;GACjC,CAAC;EAOoB,cALD,MAAM,cAAc,SAAS,QAAQ;GACxD,GAAG;GACH,WAAW,MAAS;GACrB,CAAC;EAEkC"}
@@ -1,20 +0,0 @@
1
- import { o as Middleware } from "../types-Cb7_2VSt.mjs";
2
- import "../schema-CVuttFSw.mjs";
3
- import "../index-DXJd7-2Z.mjs";
4
-
5
- //#region src/middleware/auth.d.ts
6
- interface AuthOptions {
7
- secret: string;
8
- cookieName?: string;
9
- headerName?: string;
10
- required?: boolean;
11
- roles?: string[];
12
- permissions?: string[];
13
- }
14
- declare function createAuth(options: AuthOptions): Middleware;
15
- declare function createOptionalAuth(options: Omit<AuthOptions, "required">): Middleware;
16
- declare function createRoleAuth(roles: string[], options: Omit<AuthOptions, "roles">): Middleware;
17
- declare function createPermissionAuth(permissions: string[], options: Omit<AuthOptions, "permissions">): Middleware;
18
- //#endregion
19
- export { createAuth, createOptionalAuth, createPermissionAuth, createRoleAuth };
20
- //# sourceMappingURL=auth.d.mts.map
@@ -1,98 +0,0 @@
1
- import { r as init_middleware, t as VafastError } from "../middleware-3ShRJyd1.mjs";
2
- import "../parsers-ROIZWSGI.mjs";
3
- import { t as getCookie } from "../handle-BhpqNgGf.mjs";
4
- import { TokenError, verifyToken } from "../auth/token.mjs";
5
-
6
- //#region src/middleware/auth.ts
7
- init_middleware();
8
- function createAuth(options) {
9
- const { secret, cookieName = "auth", headerName = "authorization", required = true, roles = [], permissions = [] } = options;
10
- return async (req, next) => {
11
- const token = getCookie(req, cookieName) || req.headers.get(headerName)?.replace("Bearer ", "") || "";
12
- if (!token && required) throw new VafastError("缺少认证令牌", {
13
- status: 401,
14
- type: "unauthorized",
15
- expose: true
16
- });
17
- if (!token && !required) return next();
18
- try {
19
- const user = await verifyToken(token, secret);
20
- if (!user) throw new VafastError("令牌验证失败", {
21
- status: 401,
22
- type: "unauthorized",
23
- expose: true
24
- });
25
- if (roles.length > 0 && user.role && !roles.includes(user.role)) throw new VafastError("权限不足", {
26
- status: 403,
27
- type: "forbidden",
28
- expose: true
29
- });
30
- if (permissions.length > 0 && user.permissions) {
31
- const userPermissions = Array.isArray(user.permissions) ? user.permissions : [user.permissions];
32
- if (!permissions.some((permission) => userPermissions.includes(permission))) throw new VafastError("权限不足", {
33
- status: 403,
34
- type: "forbidden",
35
- expose: true
36
- });
37
- }
38
- req.user = user;
39
- req.token = token;
40
- return next();
41
- } catch (error) {
42
- if (error instanceof TokenError) {
43
- let status = 401;
44
- let message = "认证失败";
45
- switch (error.code) {
46
- case "EXPIRED_TOKEN":
47
- status = 401;
48
- message = "令牌已过期";
49
- break;
50
- case "INVALID_SIGNATURE":
51
- status = 401;
52
- message = "令牌签名无效";
53
- break;
54
- case "MALFORMED_TOKEN":
55
- status = 400;
56
- message = "令牌格式错误";
57
- break;
58
- default:
59
- status = 401;
60
- message = "令牌验证失败";
61
- }
62
- throw new VafastError(message, {
63
- status,
64
- type: "unauthorized",
65
- expose: true
66
- });
67
- }
68
- if (error instanceof VafastError) throw error;
69
- throw new VafastError("认证过程中发生错误", {
70
- status: 500,
71
- type: "internal_error",
72
- expose: false
73
- });
74
- }
75
- };
76
- }
77
- function createOptionalAuth(options) {
78
- return createAuth({
79
- ...options,
80
- required: false
81
- });
82
- }
83
- function createRoleAuth(roles, options) {
84
- return createAuth({
85
- ...options,
86
- roles
87
- });
88
- }
89
- function createPermissionAuth(permissions, options) {
90
- return createAuth({
91
- ...options,
92
- permissions
93
- });
94
- }
95
-
96
- //#endregion
97
- export { createAuth, createOptionalAuth, createPermissionAuth, createRoleAuth };
98
- //# sourceMappingURL=auth.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.mjs","names":[],"sources":["../../src/middleware/auth.ts"],"sourcesContent":["// src/middleware/auth.ts\n\nimport type { Middleware } from \"../types\";\nimport { VafastError } from \"../middleware\";\nimport { getCookie } from \"../utils/handle\";\nimport { verifyToken, TokenError, type TokenPayload } from \"../auth/token\";\n\ninterface AuthOptions {\n secret: string;\n cookieName?: string;\n headerName?: string;\n required?: boolean; // 是否必需认证\n roles?: string[]; // 允许的角色\n permissions?: string[]; // 允许的权限\n}\n\nexport function createAuth(options: AuthOptions): Middleware {\n const {\n secret,\n cookieName = \"auth\",\n headerName = \"authorization\",\n required = true,\n roles = [],\n permissions = [],\n } = options;\n\n return async (req, next) => {\n const token =\n getCookie(req, cookieName) ||\n req.headers.get(headerName)?.replace(\"Bearer \", \"\") ||\n \"\";\n\n if (!token && required) {\n throw new VafastError(\"缺少认证令牌\", {\n status: 401,\n type: \"unauthorized\",\n expose: true,\n });\n }\n\n if (!token && !required) {\n return next();\n }\n\n try {\n const user = (await verifyToken(token, secret)) as TokenPayload;\n\n if (!user) {\n throw new VafastError(\"令牌验证失败\", {\n status: 401,\n type: \"unauthorized\",\n expose: true,\n });\n }\n\n // 检查角色权限\n if (roles.length > 0 && user.role && !roles.includes(user.role)) {\n throw new VafastError(\"权限不足\", {\n status: 403,\n type: \"forbidden\",\n expose: true,\n });\n }\n\n // 检查具体权限\n if (permissions.length > 0 && user.permissions) {\n const userPermissions = Array.isArray(user.permissions)\n ? user.permissions\n : [user.permissions];\n\n const hasPermission = permissions.some((permission) =>\n userPermissions.includes(permission),\n );\n\n if (!hasPermission) {\n throw new VafastError(\"权限不足\", {\n status: 403,\n type: \"forbidden\",\n expose: true,\n });\n }\n }\n\n // 🪄 在这里扩展 Request 对象\n (req as any).user = user;\n (req as any).token = token;\n\n return next();\n } catch (error) {\n if (error instanceof TokenError) {\n let status = 401;\n let message = \"认证失败\";\n\n switch (error.code) {\n case \"EXPIRED_TOKEN\":\n status = 401;\n message = \"令牌已过期\";\n break;\n case \"INVALID_SIGNATURE\":\n status = 401;\n message = \"令牌签名无效\";\n break;\n case \"MALFORMED_TOKEN\":\n status = 400;\n message = \"令牌格式错误\";\n break;\n default:\n status = 401;\n message = \"令牌验证失败\";\n }\n\n throw new VafastError(message, {\n status,\n type: \"unauthorized\",\n expose: true,\n });\n }\n\n if (error instanceof VafastError) {\n throw error;\n }\n\n throw new VafastError(\"认证过程中发生错误\", {\n status: 500,\n type: \"internal_error\",\n expose: false,\n });\n }\n };\n}\n\n// 可选认证中间件\nexport function createOptionalAuth(\n options: Omit<AuthOptions, \"required\">,\n): Middleware {\n return createAuth({ ...options, required: false });\n}\n\n// 角色验证中间件\nexport function createRoleAuth(\n roles: string[],\n options: Omit<AuthOptions, \"roles\">,\n): Middleware {\n return createAuth({ ...options, roles });\n}\n\n// 权限验证中间件\nexport function createPermissionAuth(\n permissions: string[],\n options: Omit<AuthOptions, \"permissions\">,\n): Middleware {\n return createAuth({ ...options, permissions });\n}\n"],"mappings":";;;;;;iBAG4C;AAa5C,SAAgB,WAAW,SAAkC;CAC3D,MAAM,EACJ,QACA,aAAa,QACb,aAAa,iBACb,WAAW,MACX,QAAQ,EAAE,EACV,cAAc,EAAE,KACd;AAEJ,QAAO,OAAO,KAAK,SAAS;EAC1B,MAAM,QACJ,UAAU,KAAK,WAAW,IAC1B,IAAI,QAAQ,IAAI,WAAW,EAAE,QAAQ,WAAW,GAAG,IACnD;AAEF,MAAI,CAAC,SAAS,SACZ,OAAM,IAAI,YAAY,UAAU;GAC9B,QAAQ;GACR,MAAM;GACN,QAAQ;GACT,CAAC;AAGJ,MAAI,CAAC,SAAS,CAAC,SACb,QAAO,MAAM;AAGf,MAAI;GACF,MAAM,OAAQ,MAAM,YAAY,OAAO,OAAO;AAE9C,OAAI,CAAC,KACH,OAAM,IAAI,YAAY,UAAU;IAC9B,QAAQ;IACR,MAAM;IACN,QAAQ;IACT,CAAC;AAIJ,OAAI,MAAM,SAAS,KAAK,KAAK,QAAQ,CAAC,MAAM,SAAS,KAAK,KAAK,CAC7D,OAAM,IAAI,YAAY,QAAQ;IAC5B,QAAQ;IACR,MAAM;IACN,QAAQ;IACT,CAAC;AAIJ,OAAI,YAAY,SAAS,KAAK,KAAK,aAAa;IAC9C,MAAM,kBAAkB,MAAM,QAAQ,KAAK,YAAY,GACnD,KAAK,cACL,CAAC,KAAK,YAAY;AAMtB,QAAI,CAJkB,YAAY,MAAM,eACtC,gBAAgB,SAAS,WAAW,CACrC,CAGC,OAAM,IAAI,YAAY,QAAQ;KAC5B,QAAQ;KACR,MAAM;KACN,QAAQ;KACT,CAAC;;AAKN,GAAC,IAAY,OAAO;AACpB,GAAC,IAAY,QAAQ;AAErB,UAAO,MAAM;WACN,OAAO;AACd,OAAI,iBAAiB,YAAY;IAC/B,IAAI,SAAS;IACb,IAAI,UAAU;AAEd,YAAQ,MAAM,MAAd;KACE,KAAK;AACH,eAAS;AACT,gBAAU;AACV;KACF,KAAK;AACH,eAAS;AACT,gBAAU;AACV;KACF,KAAK;AACH,eAAS;AACT,gBAAU;AACV;KACF;AACE,eAAS;AACT,gBAAU;;AAGd,UAAM,IAAI,YAAY,SAAS;KAC7B;KACA,MAAM;KACN,QAAQ;KACT,CAAC;;AAGJ,OAAI,iBAAiB,YACnB,OAAM;AAGR,SAAM,IAAI,YAAY,aAAa;IACjC,QAAQ;IACR,MAAM;IACN,QAAQ;IACT,CAAC;;;;AAMR,SAAgB,mBACd,SACY;AACZ,QAAO,WAAW;EAAE,GAAG;EAAS,UAAU;EAAO,CAAC;;AAIpD,SAAgB,eACd,OACA,SACY;AACZ,QAAO,WAAW;EAAE,GAAG;EAAS;EAAO,CAAC;;AAI1C,SAAgB,qBACd,aACA,SACY;AACZ,QAAO,WAAW;EAAE,GAAG;EAAS;EAAa,CAAC"}
@@ -1,9 +0,0 @@
1
- import { o as Middleware } from "../types-Cb7_2VSt.mjs";
2
- import "../schema-CVuttFSw.mjs";
3
- import "../index-DXJd7-2Z.mjs";
4
-
5
- //#region src/middleware/authMiddleware.d.ts
6
- declare const requireAuth: Middleware;
7
- //#endregion
8
- export { requireAuth };
9
- //# sourceMappingURL=authMiddleware.d.mts.map
@@ -1,19 +0,0 @@
1
- import { r as init_middleware, t as VafastError } from "../middleware-3ShRJyd1.mjs";
2
- import "../parsers-ROIZWSGI.mjs";
3
- import { t as getCookie } from "../handle-BhpqNgGf.mjs";
4
-
5
- //#region src/middleware/authMiddleware.ts
6
- init_middleware();
7
- const requireAuth = async (req, next) => {
8
- const token = getCookie(req, "auth");
9
- if (!token || token !== "valid-token") throw new VafastError("Unauthorized", {
10
- status: 401,
11
- type: "unauthorized",
12
- expose: true
13
- });
14
- return next();
15
- };
16
-
17
- //#endregion
18
- export { requireAuth };
19
- //# sourceMappingURL=authMiddleware.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authMiddleware.mjs","names":[],"sources":["../../src/middleware/authMiddleware.ts"],"sourcesContent":["// src/middleware/authMiddleware.ts\nimport type { Middleware } from \"../types\";\nimport { VafastError } from \"../middleware\";\nimport { getCookie } from \"../utils/handle\";\n\nexport const requireAuth: Middleware = async (req, next) => {\n const token = getCookie(req, \"auth\");\n\n if (!token || token !== \"valid-token\") {\n throw new VafastError(\"Unauthorized\", {\n status: 401,\n type: \"unauthorized\",\n expose: true,\n });\n }\n\n return next();\n};\n"],"mappings":";;;;;iBAE4C;AAG5C,MAAa,cAA0B,OAAO,KAAK,SAAS;CAC1D,MAAM,QAAQ,UAAU,KAAK,OAAO;AAEpC,KAAI,CAAC,SAAS,UAAU,cACtB,OAAM,IAAI,YAAY,gBAAgB;EACpC,QAAQ;EACR,MAAM;EACN,QAAQ;EACT,CAAC;AAGJ,QAAO,MAAM"}
@@ -1,16 +0,0 @@
1
- import { o as Middleware } from "../types-Cb7_2VSt.mjs";
2
- import "../schema-CVuttFSw.mjs";
3
- import "../index-DXJd7-2Z.mjs";
4
-
5
- //#region src/middleware/cors.d.ts
6
- interface CORSOptions {
7
- origin?: string[] | "*";
8
- methods?: string[];
9
- headers?: string[];
10
- credentials?: boolean;
11
- maxAge?: number;
12
- }
13
- declare function createCORS(options?: CORSOptions): Middleware;
14
- //#endregion
15
- export { CORSOptions, createCORS };
16
- //# sourceMappingURL=cors.d.mts.map
@@ -1,38 +0,0 @@
1
- //#region src/middleware/cors.ts
2
- function createCORS(options = {}) {
3
- const { origin = [], methods = [
4
- "GET",
5
- "POST",
6
- "PUT",
7
- "DELETE",
8
- "OPTIONS"
9
- ], headers = [], credentials = false, maxAge } = options;
10
- return async (req, next) => {
11
- const reqOrigin = req.headers.get("Origin") || "";
12
- const isAllowedOrigin = origin === "*" || origin.includes(reqOrigin);
13
- if (req.method === "OPTIONS") {
14
- const resHeaders = new Headers();
15
- if (isAllowedOrigin) {
16
- resHeaders.set("Access-Control-Allow-Origin", origin === "*" ? "*" : reqOrigin);
17
- resHeaders.set("Access-Control-Allow-Methods", methods.join(","));
18
- resHeaders.set("Access-Control-Allow-Headers", headers.join(","));
19
- if (credentials) resHeaders.set("Access-Control-Allow-Credentials", "true");
20
- if (maxAge) resHeaders.set("Access-Control-Max-Age", maxAge.toString());
21
- }
22
- return new Response(null, {
23
- status: 204,
24
- headers: resHeaders
25
- });
26
- }
27
- const res = await next();
28
- if (isAllowedOrigin) {
29
- res.headers.set("Access-Control-Allow-Origin", origin === "*" ? "*" : reqOrigin);
30
- if (credentials) res.headers.set("Access-Control-Allow-Credentials", "true");
31
- }
32
- return res;
33
- };
34
- }
35
-
36
- //#endregion
37
- export { createCORS };
38
- //# sourceMappingURL=cors.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cors.mjs","names":[],"sources":["../../src/middleware/cors.ts"],"sourcesContent":["import type { Middleware } from \"../types\";\n\nexport interface CORSOptions {\n origin?: string[] | \"*\";\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n maxAge?: number;\n}\n\nexport function createCORS(options: CORSOptions = {}): Middleware {\n const {\n origin = [],\n methods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n headers = [],\n credentials = false,\n maxAge,\n } = options;\n\n return async (req, next) => {\n const reqOrigin = req.headers.get(\"Origin\") || \"\";\n\n // 判断:是否为允许的 Origin?\n const isAllowedOrigin = origin === \"*\" || origin.includes(reqOrigin);\n\n // 预检 (OPTIONS) 请求处理\n if (req.method === \"OPTIONS\") {\n const resHeaders = new Headers();\n\n if (isAllowedOrigin) {\n resHeaders.set(\n \"Access-Control-Allow-Origin\",\n origin === \"*\" ? \"*\" : reqOrigin,\n );\n resHeaders.set(\"Access-Control-Allow-Methods\", methods.join(\",\"));\n resHeaders.set(\"Access-Control-Allow-Headers\", headers.join(\",\"));\n if (credentials)\n resHeaders.set(\"Access-Control-Allow-Credentials\", \"true\");\n if (maxAge) resHeaders.set(\"Access-Control-Max-Age\", maxAge.toString());\n }\n\n return new Response(null, { status: 204, headers: resHeaders });\n }\n\n // 正常请求:在 next 后添加头部\n const res = await next();\n\n if (isAllowedOrigin) {\n res.headers.set(\n \"Access-Control-Allow-Origin\",\n origin === \"*\" ? \"*\" : reqOrigin,\n );\n if (credentials)\n res.headers.set(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n return res;\n };\n}\n"],"mappings":";AAUA,SAAgB,WAAW,UAAuB,EAAE,EAAc;CAChE,MAAM,EACJ,SAAS,EAAE,EACX,UAAU;EAAC;EAAO;EAAQ;EAAO;EAAU;EAAU,EACrD,UAAU,EAAE,EACZ,cAAc,OACd,WACE;AAEJ,QAAO,OAAO,KAAK,SAAS;EAC1B,MAAM,YAAY,IAAI,QAAQ,IAAI,SAAS,IAAI;EAG/C,MAAM,kBAAkB,WAAW,OAAO,OAAO,SAAS,UAAU;AAGpE,MAAI,IAAI,WAAW,WAAW;GAC5B,MAAM,aAAa,IAAI,SAAS;AAEhC,OAAI,iBAAiB;AACnB,eAAW,IACT,+BACA,WAAW,MAAM,MAAM,UACxB;AACD,eAAW,IAAI,gCAAgC,QAAQ,KAAK,IAAI,CAAC;AACjE,eAAW,IAAI,gCAAgC,QAAQ,KAAK,IAAI,CAAC;AACjE,QAAI,YACF,YAAW,IAAI,oCAAoC,OAAO;AAC5D,QAAI,OAAQ,YAAW,IAAI,0BAA0B,OAAO,UAAU,CAAC;;AAGzE,UAAO,IAAI,SAAS,MAAM;IAAE,QAAQ;IAAK,SAAS;IAAY,CAAC;;EAIjE,MAAM,MAAM,MAAM,MAAM;AAExB,MAAI,iBAAiB;AACnB,OAAI,QAAQ,IACV,+BACA,WAAW,MAAM,MAAM,UACxB;AACD,OAAI,YACF,KAAI,QAAQ,IAAI,oCAAoC,OAAO;;AAG/D,SAAO"}
@@ -1,14 +0,0 @@
1
- import { o as Middleware } from "../types-Cb7_2VSt.mjs";
2
- import "../schema-CVuttFSw.mjs";
3
- import "../index-DXJd7-2Z.mjs";
4
-
5
- //#region src/middleware/rateLimit.d.ts
6
- interface RateLimitOptions {
7
- windowMs?: number;
8
- max?: number;
9
- keyFn?: (req: Request) => string;
10
- }
11
- declare function rateLimit(options?: RateLimitOptions): Middleware;
12
- //#endregion
13
- export { rateLimit };
14
- //# sourceMappingURL=rateLimit.d.mts.map
@@ -1,34 +0,0 @@
1
- import { r as init_middleware, t as VafastError } from "../middleware-3ShRJyd1.mjs";
2
-
3
- //#region src/middleware/rateLimit.ts
4
- init_middleware();
5
- const store = /* @__PURE__ */ new Map();
6
- function rateLimit(options = {}) {
7
- const windowMs = options.windowMs ?? 6e4;
8
- const max = options.max ?? 30;
9
- const keyFn = options.keyFn ?? getIP;
10
- return async (req, next) => {
11
- const key = keyFn(req);
12
- const now = Date.now();
13
- const entry = store.get(key);
14
- if (entry && entry.expires > now) {
15
- if (entry.count >= max) throw new VafastError("Too many requests", {
16
- status: 429,
17
- type: "rate_limit",
18
- expose: true
19
- });
20
- entry.count += 1;
21
- } else store.set(key, {
22
- count: 1,
23
- expires: now + windowMs
24
- });
25
- return next();
26
- };
27
- }
28
- function getIP(req) {
29
- return req.headers.get("cf-connecting-ip") || req.headers.get("x-forwarded-for")?.split(",")[0]?.trim() || "unknown";
30
- }
31
-
32
- //#endregion
33
- export { rateLimit };
34
- //# sourceMappingURL=rateLimit.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rateLimit.mjs","names":[],"sources":["../../src/middleware/rateLimit.ts"],"sourcesContent":["// src/middleware/rateLimit.ts\n\nimport type { Middleware } from \"../types\";\nimport { VafastError } from \"../middleware\";\n\ninterface RateLimitOptions {\n windowMs?: number; // 限制窗口(毫秒)\n max?: number; // 最大请求数\n keyFn?: (req: Request) => string;\n}\n\ntype Entry = {\n count: number;\n expires: number;\n};\n\nconst store = new Map<string, Entry>();\n\nexport function rateLimit(options: RateLimitOptions = {}): Middleware {\n const windowMs = options.windowMs ?? 60_000; // 默认: 1分钟\n const max = options.max ?? 30;\n const keyFn = options.keyFn ?? getIP;\n\n return async (req, next) => {\n const key = keyFn(req);\n const now = Date.now();\n\n const entry = store.get(key);\n if (entry && entry.expires > now) {\n if (entry.count >= max) {\n throw new VafastError(\"Too many requests\", {\n status: 429,\n type: \"rate_limit\",\n expose: true,\n });\n }\n entry.count += 1;\n } else {\n store.set(key, { count: 1, expires: now + windowMs });\n }\n\n return next();\n };\n}\n\n// Edge 安全的 IP 获取\nfunction getIP(req: Request): string {\n return (\n req.headers.get(\"cf-connecting-ip\") || // Cloudflare\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() || // Vercel\n \"unknown\"\n );\n}\n"],"mappings":";;;iBAG4C;AAa5C,MAAM,wBAAQ,IAAI,KAAoB;AAEtC,SAAgB,UAAU,UAA4B,EAAE,EAAc;CACpE,MAAM,WAAW,QAAQ,YAAY;CACrC,MAAM,MAAM,QAAQ,OAAO;CAC3B,MAAM,QAAQ,QAAQ,SAAS;AAE/B,QAAO,OAAO,KAAK,SAAS;EAC1B,MAAM,MAAM,MAAM,IAAI;EACtB,MAAM,MAAM,KAAK,KAAK;EAEtB,MAAM,QAAQ,MAAM,IAAI,IAAI;AAC5B,MAAI,SAAS,MAAM,UAAU,KAAK;AAChC,OAAI,MAAM,SAAS,IACjB,OAAM,IAAI,YAAY,qBAAqB;IACzC,QAAQ;IACR,MAAM;IACN,QAAQ;IACT,CAAC;AAEJ,SAAM,SAAS;QAEf,OAAM,IAAI,KAAK;GAAE,OAAO;GAAG,SAAS,MAAM;GAAU,CAAC;AAGvD,SAAO,MAAM;;;AAKjB,SAAS,MAAM,KAAsB;AACnC,QACE,IAAI,QAAQ,IAAI,mBAAmB,IACnC,IAAI,QAAQ,IAAI,kBAAkB,EAAE,MAAM,IAAI,CAAC,IAAI,MAAM,IACzD"}
@@ -1,59 +0,0 @@
1
- import { t as __esmMin } from "./chunk-67U6L5Jh.mjs";
2
- import { a as mapResponse, i as json, r as init_response } from "./response-CSKW5hsS.mjs";
3
-
4
- //#region src/middleware.ts
5
- /**
6
- * 组合类型: 自动注入错误处理器进行中间件组合
7
- */
8
- function composeMiddleware(middleware, finalHandler) {
9
- const all = [errorHandler, ...middleware];
10
- return function composedHandler(req) {
11
- let i = -1;
12
- const dispatch = (index) => {
13
- if (index <= i) return Promise.reject(/* @__PURE__ */ new Error("next() called multiple times"));
14
- i = index;
15
- if (index < all.length) {
16
- const mw = all[index];
17
- return Promise.resolve(mw(req, () => dispatch(index + 1)));
18
- }
19
- return Promise.resolve(finalHandler(req)).then(mapResponse);
20
- };
21
- return dispatch(0);
22
- };
23
- }
24
- var VafastError, errorHandler;
25
- var init_middleware = __esmMin((() => {
26
- init_response();
27
- VafastError = class extends Error {
28
- status;
29
- type;
30
- expose;
31
- constructor(message, options = {}) {
32
- super(message);
33
- this.name = "VafastError";
34
- this.status = options.status ?? 500;
35
- this.type = options.type ?? "internal_error";
36
- this.expose = options.expose ?? false;
37
- if (options.cause) this.cause = options.cause;
38
- }
39
- };
40
- errorHandler = async (req, next) => {
41
- try {
42
- return await next();
43
- } catch (err) {
44
- console.error("未处理的错误:", err);
45
- if (err instanceof VafastError) return json({
46
- error: err.type,
47
- message: err.expose ? err.message : "发生了一个错误"
48
- }, err.status);
49
- return json({
50
- error: "internal_error",
51
- message: "出现了一些问题"
52
- }, 500);
53
- }
54
- };
55
- }));
56
-
57
- //#endregion
58
- export { composeMiddleware as n, init_middleware as r, VafastError as t };
59
- //# sourceMappingURL=middleware-3ShRJyd1.mjs.map