vafast 0.3.1 → 0.3.4

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 (136) hide show
  1. package/dist/auth/token.d.ts +13 -11
  2. package/dist/auth/token.js +118 -111
  3. package/dist/auth/token.js.map +1 -0
  4. package/dist/defineRoute.d.ts +5 -2
  5. package/dist/defineRoute.js +7 -2
  6. package/dist/defineRoute.js.map +1 -0
  7. package/dist/index.d.ts +30 -14
  8. package/dist/index.js +2247 -15
  9. package/dist/index.js.map +1 -0
  10. package/dist/middleware/auth.d.ts +8 -6
  11. package/dist/middleware/auth.js +198 -99
  12. package/dist/middleware/auth.js.map +1 -0
  13. package/dist/middleware/authMiddleware.d.ts +5 -2
  14. package/dist/middleware/authMiddleware.js +55 -11
  15. package/dist/middleware/authMiddleware.js.map +1 -0
  16. package/dist/middleware/component-renderer.d.ts +4 -2
  17. package/dist/middleware/component-renderer.js +87 -80
  18. package/dist/middleware/component-renderer.js.map +1 -0
  19. package/dist/middleware/component-router.d.ts +8 -3
  20. package/dist/middleware/component-router.js +33 -39
  21. package/dist/middleware/component-router.js.map +1 -0
  22. package/dist/middleware/cors.d.ts +6 -3
  23. package/dist/middleware/cors.js +42 -29
  24. package/dist/middleware/cors.js.map +1 -0
  25. package/dist/middleware/rateLimit.d.ts +5 -3
  26. package/dist/middleware/rateLimit.js +45 -29
  27. package/dist/middleware/rateLimit.js.map +1 -0
  28. package/dist/middleware.d.ts +6 -3
  29. package/dist/middleware.js +97 -51
  30. package/dist/middleware.js.map +1 -0
  31. package/dist/monitoring/index.d.ts +11 -4
  32. package/dist/monitoring/index.js +1299 -17
  33. package/dist/monitoring/index.js.map +1 -0
  34. package/dist/monitoring/native-monitor.d.ts +12 -6
  35. package/dist/monitoring/native-monitor.js +1258 -161
  36. package/dist/monitoring/native-monitor.js.map +1 -0
  37. package/dist/monitoring/types.d.ts +8 -6
  38. package/dist/monitoring/types.js +1 -1
  39. package/dist/monitoring/types.js.map +1 -0
  40. package/dist/node-server/index.d.ts +4 -22
  41. package/dist/node-server/index.js +254 -21
  42. package/dist/node-server/index.js.map +1 -0
  43. package/dist/node-server/request.d.ts +6 -2
  44. package/dist/node-server/request.js +102 -134
  45. package/dist/node-server/request.js.map +1 -0
  46. package/dist/node-server/response.d.ts +7 -3
  47. package/dist/node-server/response.js +67 -89
  48. package/dist/node-server/response.js.map +1 -0
  49. package/dist/node-server/serve.d.ts +11 -7
  50. package/dist/node-server/serve.js +231 -82
  51. package/dist/node-server/serve.js.map +1 -0
  52. package/dist/router/index.d.ts +3 -5
  53. package/dist/router/index.js +228 -7
  54. package/dist/router/index.js.map +1 -0
  55. package/dist/router/radix-tree.d.ts +7 -4
  56. package/dist/router/radix-tree.js +186 -218
  57. package/dist/router/radix-tree.js.map +1 -0
  58. package/dist/router.d.ts +7 -3
  59. package/dist/router.js +37 -83
  60. package/dist/router.js.map +1 -0
  61. package/dist/serve.d.ts +2 -12
  62. package/dist/serve.js +237 -11
  63. package/dist/serve.js.map +1 -0
  64. package/dist/server/base-server.d.ts +5 -2
  65. package/dist/server/base-server.js +124 -135
  66. package/dist/server/base-server.js.map +1 -0
  67. package/dist/server/component-server.d.ts +9 -4
  68. package/dist/server/component-server.js +481 -139
  69. package/dist/server/component-server.js.map +1 -0
  70. package/dist/server/index.d.ts +8 -7
  71. package/dist/server/index.js +985 -11
  72. package/dist/server/index.js.map +1 -0
  73. package/dist/server/server-factory.d.ts +11 -5
  74. package/dist/server/server-factory.js +979 -67
  75. package/dist/server/server-factory.js.map +1 -0
  76. package/dist/server/server.d.ts +7 -3
  77. package/dist/server/server.js +553 -112
  78. package/dist/server/server.js.map +1 -0
  79. package/dist/types/component-route.d.ts +8 -4
  80. package/dist/types/component-route.js +1 -1
  81. package/dist/types/component-route.js.map +1 -0
  82. package/dist/types/index.d.ts +5 -5
  83. package/dist/types/index.js +21 -4
  84. package/dist/types/index.js.map +1 -0
  85. package/dist/types/route.d.ts +13 -10
  86. package/dist/types/route.js +10 -9
  87. package/dist/types/route.js.map +1 -0
  88. package/dist/types/schema.d.ts +11 -7
  89. package/dist/types/schema.js +1 -1
  90. package/dist/types/schema.js.map +1 -0
  91. package/dist/types/types.d.ts +11 -9
  92. package/dist/types/types.js +1 -1
  93. package/dist/types/types.js.map +1 -0
  94. package/dist/utils/base64url.d.ts +4 -2
  95. package/dist/utils/base64url.js +12 -9
  96. package/dist/utils/base64url.js.map +1 -0
  97. package/dist/utils/create-handler.d.ts +11 -7
  98. package/dist/utils/create-handler.js +393 -217
  99. package/dist/utils/create-handler.js.map +1 -0
  100. package/dist/utils/dependency-manager.d.ts +3 -1
  101. package/dist/utils/dependency-manager.js +67 -69
  102. package/dist/utils/dependency-manager.js.map +1 -0
  103. package/dist/utils/go-await.d.ts +3 -1
  104. package/dist/utils/go-await.js +8 -22
  105. package/dist/utils/go-await.js.map +1 -0
  106. package/dist/utils/handle.d.ts +6 -4
  107. package/dist/utils/handle.js +44 -25
  108. package/dist/utils/handle.js.map +1 -0
  109. package/dist/utils/html-renderer.d.ts +3 -1
  110. package/dist/utils/html-renderer.js +25 -24
  111. package/dist/utils/html-renderer.js.map +1 -0
  112. package/dist/utils/index.d.ts +13 -13
  113. package/dist/utils/index.js +832 -21
  114. package/dist/utils/index.js.map +1 -0
  115. package/dist/utils/parsers.d.ts +15 -13
  116. package/dist/utils/parsers.js +138 -188
  117. package/dist/utils/parsers.js.map +1 -0
  118. package/dist/utils/path-matcher.d.ts +3 -1
  119. package/dist/utils/path-matcher.js +68 -78
  120. package/dist/utils/path-matcher.js.map +1 -0
  121. package/dist/utils/request-validator.d.ts +13 -10
  122. package/dist/utils/request-validator.js +234 -84
  123. package/dist/utils/request-validator.js.map +1 -0
  124. package/dist/utils/response.d.ts +9 -7
  125. package/dist/utils/response.js +93 -102
  126. package/dist/utils/response.js.map +1 -0
  127. package/dist/utils/validators/schema-validator.d.ts +13 -9
  128. package/dist/utils/validators/schema-validator.js +228 -209
  129. package/dist/utils/validators/schema-validator.js.map +1 -0
  130. package/dist/utils/validators/schema-validators-ultra.d.ts +15 -12
  131. package/dist/utils/validators/schema-validators-ultra.js +233 -256
  132. package/dist/utils/validators/schema-validators-ultra.js.map +1 -0
  133. package/dist/utils/validators/validators.d.ts +15 -12
  134. package/dist/utils/validators/validators.js +81 -122
  135. package/dist/utils/validators/validators.js.map +1 -0
  136. package/package.json +5 -4
@@ -1,4 +1,4 @@
1
- export interface TokenPayload {
1
+ interface TokenPayload {
2
2
  [key: string]: any;
3
3
  exp?: number;
4
4
  iat?: number;
@@ -6,35 +6,37 @@ export interface TokenPayload {
6
6
  aud?: string;
7
7
  iss?: string;
8
8
  }
9
- export interface TokenResult {
9
+ interface TokenResult {
10
10
  payload: TokenPayload;
11
11
  token: string;
12
12
  expiresAt: number;
13
13
  }
14
- export interface TokenOptions {
14
+ interface TokenOptions {
15
15
  expiresIn?: number;
16
16
  issuer?: string;
17
17
  audience?: string;
18
18
  subject?: string;
19
19
  }
20
- export declare class TokenError extends Error {
20
+ declare class TokenError extends Error {
21
21
  code: "INVALID_TOKEN" | "EXPIRED_TOKEN" | "INVALID_SIGNATURE" | "MALFORMED_TOKEN" | "INVALID_PAYLOAD";
22
22
  constructor(message: string, code: "INVALID_TOKEN" | "EXPIRED_TOKEN" | "INVALID_SIGNATURE" | "MALFORMED_TOKEN" | "INVALID_PAYLOAD");
23
23
  }
24
24
  /** 生成令牌 */
25
- export declare function generateToken(payload: TokenPayload, secret: string, options?: TokenOptions): Promise<TokenResult>;
25
+ declare function generateToken(payload: TokenPayload, secret: string, options?: TokenOptions): Promise<TokenResult>;
26
26
  /** 验证令牌 */
27
- export declare function verifyToken(token: string, secret: string): Promise<TokenPayload | null>;
27
+ declare function verifyToken(token: string, secret: string): Promise<TokenPayload | null>;
28
28
  /** 解析令牌(不验证签名) */
29
- export declare function parseToken(token: string): TokenPayload | null;
29
+ declare function parseToken(token: string): TokenPayload | null;
30
30
  /** 检查令牌是否过期 */
31
- export declare function isTokenExpired(token: string): boolean;
31
+ declare function isTokenExpired(token: string): boolean;
32
32
  /** 获取令牌剩余有效时间(秒) */
33
- export declare function getTokenTimeRemaining(token: string): number;
33
+ declare function getTokenTimeRemaining(token: string): number;
34
34
  /** 刷新令牌 */
35
- export declare function refreshToken(token: string, secret: string, options?: TokenOptions): Promise<TokenResult | null>;
35
+ declare function refreshToken(token: string, secret: string, options?: TokenOptions): Promise<TokenResult | null>;
36
36
  /** 创建访问令牌和刷新令牌对 */
37
- export declare function createTokenPair(payload: TokenPayload, secret: string, options?: TokenOptions): Promise<{
37
+ declare function createTokenPair(payload: TokenPayload, secret: string, options?: TokenOptions): Promise<{
38
38
  accessToken: TokenResult;
39
39
  refreshToken: TokenResult;
40
40
  }>;
41
+
42
+ export { TokenError, type TokenOptions, type TokenPayload, type TokenResult, createTokenPair, generateToken, getTokenTimeRemaining, isTokenExpired, parseToken, refreshToken, verifyToken };
@@ -1,124 +1,131 @@
1
- // src/auth/token.ts
2
- import { base64urlEncode, base64urlDecode } from "../utils/base64url";
3
- export class TokenError extends Error {
4
- code;
5
- constructor(message, code) {
6
- super(message);
7
- this.code = code;
8
- this.name = "TokenError";
9
- }
1
+ // src/utils/base64url.ts
2
+ function base64urlEncode(str) {
3
+ return btoa(str).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
10
4
  }
11
- const encoder = new TextEncoder();
12
- /** 使用 HMAC-SHA256 进行签名 */
5
+ function base64urlDecode(str) {
6
+ const pad = str.length % 4 === 0 ? "" : "=".repeat(4 - str.length % 4);
7
+ const base64 = str.replace(/-/g, "+").replace(/_/g, "/") + pad;
8
+ return atob(base64);
9
+ }
10
+
11
+ // src/auth/token.ts
12
+ var TokenError = class extends Error {
13
+ constructor(message, code) {
14
+ super(message);
15
+ this.code = code;
16
+ this.name = "TokenError";
17
+ }
18
+ };
19
+ var encoder = new TextEncoder();
13
20
  async function sign(data, secret) {
14
- const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
15
- const signature = await crypto.subtle.sign("HMAC", key, encoder.encode(data));
16
- return btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(signature))));
21
+ const key = await crypto.subtle.importKey(
22
+ "raw",
23
+ encoder.encode(secret),
24
+ { name: "HMAC", hash: "SHA-256" },
25
+ false,
26
+ ["sign"]
27
+ );
28
+ const signature = await crypto.subtle.sign("HMAC", key, encoder.encode(data));
29
+ return btoa(
30
+ String.fromCharCode.apply(null, Array.from(new Uint8Array(signature)))
31
+ );
17
32
  }
18
- /** 生成令牌 */
19
- export async function generateToken(payload, secret, options = {}) {
20
- const { expiresIn = 3600, issuer, audience, subject } = options;
21
- // 创建令牌载荷,强制使用当前时间
22
- const now = Math.floor(Date.now() / 1000);
23
- const tokenPayload = {
24
- ...payload,
25
- iat: now,
26
- exp: now + expiresIn,
27
- };
28
- // 添加可选字段
29
- if (issuer)
30
- tokenPayload.iss = issuer;
31
- if (audience)
32
- tokenPayload.aud = audience;
33
- if (subject)
34
- tokenPayload.sub = subject;
35
- const data = base64urlEncode(JSON.stringify(tokenPayload));
36
- const sig = await sign(data, secret);
37
- const token = `${data}.${base64urlEncode(sig)}`;
38
- return {
39
- payload: tokenPayload,
40
- token,
41
- expiresAt: tokenPayload.exp * 1000, // 转换为毫秒
42
- };
33
+ async function generateToken(payload, secret, options = {}) {
34
+ const { expiresIn = 3600, issuer, audience, subject } = options;
35
+ const now = Math.floor(Date.now() / 1e3);
36
+ const tokenPayload = {
37
+ ...payload,
38
+ iat: now,
39
+ exp: now + expiresIn
40
+ };
41
+ if (issuer) tokenPayload.iss = issuer;
42
+ if (audience) tokenPayload.aud = audience;
43
+ if (subject) tokenPayload.sub = subject;
44
+ const data = base64urlEncode(JSON.stringify(tokenPayload));
45
+ const sig = await sign(data, secret);
46
+ const token = `${data}.${base64urlEncode(sig)}`;
47
+ return {
48
+ payload: tokenPayload,
49
+ token,
50
+ expiresAt: tokenPayload.exp * 1e3
51
+ // 转换为毫秒
52
+ };
43
53
  }
44
- /** 验证令牌 */
45
- export async function verifyToken(token, secret) {
46
- try {
47
- const [data, sig] = token.split(".");
48
- if (!data || !sig) {
49
- throw new TokenError("令牌格式无效", "MALFORMED_TOKEN");
50
- }
51
- const expectedSig = await sign(data, secret);
52
- const expected = base64urlEncode(expectedSig);
53
- if (sig !== expected) {
54
- throw new TokenError("令牌签名无效", "INVALID_SIGNATURE");
55
- }
56
- const payload = JSON.parse(base64urlDecode(data));
57
- // 检查过期时间
58
- if (payload.exp && Date.now() / 1000 > payload.exp) {
59
- throw new TokenError("令牌已过期", "EXPIRED_TOKEN");
60
- }
61
- return payload;
54
+ async function verifyToken(token, secret) {
55
+ try {
56
+ const [data, sig] = token.split(".");
57
+ if (!data || !sig) {
58
+ throw new TokenError("\u4EE4\u724C\u683C\u5F0F\u65E0\u6548", "MALFORMED_TOKEN");
62
59
  }
63
- catch (error) {
64
- if (error instanceof TokenError) {
65
- throw error;
66
- }
67
- throw new TokenError("令牌验证失败", "INVALID_TOKEN");
60
+ const expectedSig = await sign(data, secret);
61
+ const expected = base64urlEncode(expectedSig);
62
+ if (sig !== expected) {
63
+ throw new TokenError("\u4EE4\u724C\u7B7E\u540D\u65E0\u6548", "INVALID_SIGNATURE");
68
64
  }
69
- }
70
- /** 解析令牌(不验证签名) */
71
- export function parseToken(token) {
72
- try {
73
- const [data] = token.split(".");
74
- if (!data)
75
- return null;
76
- return JSON.parse(base64urlDecode(data));
65
+ const payload = JSON.parse(base64urlDecode(data));
66
+ if (payload.exp && Date.now() / 1e3 > payload.exp) {
67
+ throw new TokenError("\u4EE4\u724C\u5DF2\u8FC7\u671F", "EXPIRED_TOKEN");
77
68
  }
78
- catch {
79
- return null;
69
+ return payload;
70
+ } catch (error) {
71
+ if (error instanceof TokenError) {
72
+ throw error;
80
73
  }
74
+ throw new TokenError("\u4EE4\u724C\u9A8C\u8BC1\u5931\u8D25", "INVALID_TOKEN");
75
+ }
81
76
  }
82
- /** 检查令牌是否过期 */
83
- export function isTokenExpired(token) {
84
- const payload = parseToken(token);
85
- if (!payload || !payload.exp)
86
- return true;
87
- return Date.now() / 1000 > payload.exp;
77
+ function parseToken(token) {
78
+ try {
79
+ const [data] = token.split(".");
80
+ if (!data) return null;
81
+ return JSON.parse(base64urlDecode(data));
82
+ } catch {
83
+ return null;
84
+ }
88
85
  }
89
- /** 获取令牌剩余有效时间(秒) */
90
- export function getTokenTimeRemaining(token) {
91
- const payload = parseToken(token);
92
- if (!payload || !payload.exp)
93
- return 0;
94
- const remaining = payload.exp - Date.now() / 1000;
95
- return Math.max(0, Math.floor(remaining));
86
+ function isTokenExpired(token) {
87
+ const payload = parseToken(token);
88
+ if (!payload || !payload.exp) return true;
89
+ return Date.now() / 1e3 > payload.exp;
96
90
  }
97
- /** 刷新令牌 */
98
- export async function refreshToken(token, secret, options = {}) {
99
- try {
100
- const payload = await verifyToken(token, secret);
101
- if (!payload)
102
- return null;
103
- // 移除时间相关字段,重新生成
104
- const { exp, iat, ...cleanPayload } = payload;
105
- // 添加延迟确保时间戳不同
106
- await new Promise((resolve) => setTimeout(resolve, 10));
107
- return await generateToken(cleanPayload, secret, options);
108
- }
109
- catch {
110
- return null;
111
- }
91
+ function getTokenTimeRemaining(token) {
92
+ const payload = parseToken(token);
93
+ if (!payload || !payload.exp) return 0;
94
+ const remaining = payload.exp - Date.now() / 1e3;
95
+ return Math.max(0, Math.floor(remaining));
96
+ }
97
+ async function refreshToken(token, secret, options = {}) {
98
+ try {
99
+ const payload = await verifyToken(token, secret);
100
+ if (!payload) return null;
101
+ const { exp, iat, ...cleanPayload } = payload;
102
+ await new Promise((resolve) => setTimeout(resolve, 10));
103
+ return await generateToken(cleanPayload, secret, options);
104
+ } catch {
105
+ return null;
106
+ }
112
107
  }
113
- /** 创建访问令牌和刷新令牌对 */
114
- export async function createTokenPair(payload, secret, options = {}) {
115
- const accessToken = await generateToken(payload, secret, {
116
- ...options,
117
- expiresIn: options.expiresIn || 3600, // 1小时
118
- });
119
- const refreshToken = await generateToken(payload, secret, {
120
- ...options,
121
- expiresIn: 7 * 24 * 3600, // 7天
122
- });
123
- return { accessToken, refreshToken };
108
+ async function createTokenPair(payload, secret, options = {}) {
109
+ const accessToken = await generateToken(payload, secret, {
110
+ ...options,
111
+ expiresIn: options.expiresIn || 3600
112
+ // 1小时
113
+ });
114
+ const refreshToken2 = await generateToken(payload, secret, {
115
+ ...options,
116
+ expiresIn: 7 * 24 * 3600
117
+ // 7天
118
+ });
119
+ return { accessToken, refreshToken: refreshToken2 };
124
120
  }
121
+ export {
122
+ TokenError,
123
+ createTokenPair,
124
+ generateToken,
125
+ getTokenTimeRemaining,
126
+ isTokenExpired,
127
+ parseToken,
128
+ refreshToken,
129
+ verifyToken
130
+ };
131
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/base64url.ts","../../src/auth/token.ts"],"sourcesContent":["export function base64urlEncode(str: string): string {\n return btoa(str)\n .replace(/=/g, \"\") // ✅ 删除填充\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\");\n}\n\nexport function base64urlDecode(str: string): string {\n const pad = str.length % 4 === 0 ? \"\" : \"=\".repeat(4 - (str.length % 4));\n const base64 = str.replace(/-/g, \"+\").replace(/_/g, \"/\") + pad;\n return atob(base64);\n}\n","// 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":"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","names":["refreshToken"]}
@@ -1,2 +1,5 @@
1
- import type { Route } from "./types";
2
- export declare function defineRoutes(routes: Route[]): Route[];
1
+ import { Route } from './types/types.js';
2
+
3
+ declare function defineRoutes(routes: Route[]): Route[];
4
+
5
+ export { defineRoutes };
@@ -1,3 +1,8 @@
1
- export function defineRoutes(routes) {
2
- return routes;
1
+ // src/defineRoute.ts
2
+ function defineRoutes(routes) {
3
+ return routes;
3
4
  }
5
+ export {
6
+ defineRoutes
7
+ };
8
+ //# sourceMappingURL=defineRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/defineRoute.ts"],"sourcesContent":["import type { Route } from \"./types\";\n\nexport function defineRoutes(routes: Route[]): Route[] {\n return routes;\n}\n"],"mappings":";AAEO,SAAS,aAAa,QAA0B;AACrD,SAAO;AACT;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,14 +1,30 @@
1
- export * from "./server";
2
- export * from "./middleware";
3
- export * from "./utils";
4
- export * from "./router";
5
- export * from "./middleware/authMiddleware";
6
- export * from "./middleware/rateLimit";
7
- export * from "./middleware/cors";
8
- export * from "./auth/token";
9
- export * from "./middleware/auth";
10
- export * from "./defineRoute";
11
- export * from "./types/index";
12
- export { serve } from "./serve";
13
- export type { ServeOptions, ServeResult, FetchHandler } from "./serve";
14
- export { Type } from "@sinclair/typebox";
1
+ export { Server } from './server/server.js';
2
+ export { ComponentServer } from './server/component-server.js';
3
+ export { ServerFactory } from './server/server-factory.js';
4
+ export { BaseServer } from './server/base-server.js';
5
+ export { VafastError, composeMiddleware } from './middleware.js';
6
+ export { createHandler, createHandlerWithExtra, simpleHandler } from './utils/create-handler.js';
7
+ export { getCookie, getHeader, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast } from './utils/parsers.js';
8
+ export { empty, html, json, redirect, stream, text } from './utils/response.js';
9
+ export { goAwait } from './utils/go-await.js';
10
+ export { base64urlDecode, base64urlEncode } from './utils/base64url.js';
11
+ export { getLocals, setLocals } from './utils/handle.js';
12
+ export { createRequestValidator, parseAndValidateRequest, parseRequest, validateRequest } from './utils/request-validator.js';
13
+ export { HtmlRenderer } from './utils/html-renderer.js';
14
+ export { DependencyManager } from './utils/dependency-manager.js';
15
+ export { createValidator, getValidatorCacheStats, precompileSchemas, validateFast, validateSchema } from './utils/validators/validators.js';
16
+ export { flattenNestedRoutes, normalizePath } from './router.js';
17
+ export { requireAuth } from './middleware/authMiddleware.js';
18
+ export { rateLimit } from './middleware/rateLimit.js';
19
+ export { CORSOptions, createCORS } from './middleware/cors.js';
20
+ export { TokenError, TokenOptions, TokenPayload, TokenResult, createTokenPair, generateToken, getTokenTimeRemaining, isTokenExpired, parseToken, refreshToken, verifyToken } from './auth/token.js';
21
+ export { createAuth, createOptionalAuth, createPermissionAuth, createRoleAuth } from './middleware/auth.js';
22
+ export { defineRoutes } from './defineRoute.js';
23
+ export { FlattenedRoute, Handler, Method, Middleware, NestedRoute, ResponseBody, Route } from './types/types.js';
24
+ export { BaseRouteConfig, CompatibleRoute, ExtendedRouteConfig, NestedRouteConfig, TypedRoute, createTypedRoute, isTypedRoute } from './types/route.js';
25
+ export { ComponentRoute, FlattenedComponentRoute, NestedComponentRoute } from './types/component-route.js';
26
+ export { HandlerContext, HandlerContextWithExtra, InferSchema, RouteSchema, TypedHandler, TypedRouteConfig } from './types/schema.js';
27
+ export { FetchHandler, ServeOptions, ServeResult, serve } from './node-server/serve.js';
28
+ export { Type } from '@sinclair/typebox';
29
+ import './utils/validators/schema-validators-ultra.js';
30
+ import 'node:http';