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.
- package/dist/auth/token.d.ts +13 -11
- package/dist/auth/token.js +118 -111
- package/dist/auth/token.js.map +1 -0
- package/dist/defineRoute.d.ts +5 -2
- package/dist/defineRoute.js +7 -2
- package/dist/defineRoute.js.map +1 -0
- package/dist/index.d.ts +30 -14
- package/dist/index.js +2247 -15
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +8 -6
- package/dist/middleware/auth.js +198 -99
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/authMiddleware.d.ts +5 -2
- package/dist/middleware/authMiddleware.js +55 -11
- package/dist/middleware/authMiddleware.js.map +1 -0
- package/dist/middleware/component-renderer.d.ts +4 -2
- package/dist/middleware/component-renderer.js +87 -80
- package/dist/middleware/component-renderer.js.map +1 -0
- package/dist/middleware/component-router.d.ts +8 -3
- package/dist/middleware/component-router.js +33 -39
- package/dist/middleware/component-router.js.map +1 -0
- package/dist/middleware/cors.d.ts +6 -3
- package/dist/middleware/cors.js +42 -29
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/rateLimit.d.ts +5 -3
- package/dist/middleware/rateLimit.js +45 -29
- package/dist/middleware/rateLimit.js.map +1 -0
- package/dist/middleware.d.ts +6 -3
- package/dist/middleware.js +97 -51
- package/dist/middleware.js.map +1 -0
- package/dist/monitoring/index.d.ts +11 -4
- package/dist/monitoring/index.js +1299 -17
- package/dist/monitoring/index.js.map +1 -0
- package/dist/monitoring/native-monitor.d.ts +12 -6
- package/dist/monitoring/native-monitor.js +1258 -161
- package/dist/monitoring/native-monitor.js.map +1 -0
- package/dist/monitoring/types.d.ts +8 -6
- package/dist/monitoring/types.js +1 -1
- package/dist/monitoring/types.js.map +1 -0
- package/dist/node-server/index.d.ts +4 -22
- package/dist/node-server/index.js +254 -21
- package/dist/node-server/index.js.map +1 -0
- package/dist/node-server/request.d.ts +6 -2
- package/dist/node-server/request.js +102 -134
- package/dist/node-server/request.js.map +1 -0
- package/dist/node-server/response.d.ts +7 -3
- package/dist/node-server/response.js +67 -89
- package/dist/node-server/response.js.map +1 -0
- package/dist/node-server/serve.d.ts +11 -7
- package/dist/node-server/serve.js +231 -82
- package/dist/node-server/serve.js.map +1 -0
- package/dist/router/index.d.ts +3 -5
- package/dist/router/index.js +228 -7
- package/dist/router/index.js.map +1 -0
- package/dist/router/radix-tree.d.ts +7 -4
- package/dist/router/radix-tree.js +186 -218
- package/dist/router/radix-tree.js.map +1 -0
- package/dist/router.d.ts +7 -3
- package/dist/router.js +37 -83
- package/dist/router.js.map +1 -0
- package/dist/serve.d.ts +2 -12
- package/dist/serve.js +237 -11
- package/dist/serve.js.map +1 -0
- package/dist/server/base-server.d.ts +5 -2
- package/dist/server/base-server.js +124 -135
- package/dist/server/base-server.js.map +1 -0
- package/dist/server/component-server.d.ts +9 -4
- package/dist/server/component-server.js +481 -139
- package/dist/server/component-server.js.map +1 -0
- package/dist/server/index.d.ts +8 -7
- package/dist/server/index.js +985 -11
- package/dist/server/index.js.map +1 -0
- package/dist/server/server-factory.d.ts +11 -5
- package/dist/server/server-factory.js +979 -67
- package/dist/server/server-factory.js.map +1 -0
- package/dist/server/server.d.ts +7 -3
- package/dist/server/server.js +553 -112
- package/dist/server/server.js.map +1 -0
- package/dist/types/component-route.d.ts +8 -4
- package/dist/types/component-route.js +1 -1
- package/dist/types/component-route.js.map +1 -0
- package/dist/types/index.d.ts +5 -5
- package/dist/types/index.js +21 -4
- package/dist/types/index.js.map +1 -0
- package/dist/types/route.d.ts +13 -10
- package/dist/types/route.js +10 -9
- package/dist/types/route.js.map +1 -0
- package/dist/types/schema.d.ts +11 -7
- package/dist/types/schema.js +1 -1
- package/dist/types/schema.js.map +1 -0
- package/dist/types/types.d.ts +11 -9
- package/dist/types/types.js +1 -1
- package/dist/types/types.js.map +1 -0
- package/dist/utils/base64url.d.ts +4 -2
- package/dist/utils/base64url.js +12 -9
- package/dist/utils/base64url.js.map +1 -0
- package/dist/utils/create-handler.d.ts +11 -7
- package/dist/utils/create-handler.js +393 -217
- package/dist/utils/create-handler.js.map +1 -0
- package/dist/utils/dependency-manager.d.ts +3 -1
- package/dist/utils/dependency-manager.js +67 -69
- package/dist/utils/dependency-manager.js.map +1 -0
- package/dist/utils/go-await.d.ts +3 -1
- package/dist/utils/go-await.js +8 -22
- package/dist/utils/go-await.js.map +1 -0
- package/dist/utils/handle.d.ts +6 -4
- package/dist/utils/handle.js +44 -25
- package/dist/utils/handle.js.map +1 -0
- package/dist/utils/html-renderer.d.ts +3 -1
- package/dist/utils/html-renderer.js +25 -24
- package/dist/utils/html-renderer.js.map +1 -0
- package/dist/utils/index.d.ts +13 -13
- package/dist/utils/index.js +832 -21
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/parsers.d.ts +15 -13
- package/dist/utils/parsers.js +138 -188
- package/dist/utils/parsers.js.map +1 -0
- package/dist/utils/path-matcher.d.ts +3 -1
- package/dist/utils/path-matcher.js +68 -78
- package/dist/utils/path-matcher.js.map +1 -0
- package/dist/utils/request-validator.d.ts +13 -10
- package/dist/utils/request-validator.js +234 -84
- package/dist/utils/request-validator.js.map +1 -0
- package/dist/utils/response.d.ts +9 -7
- package/dist/utils/response.js +93 -102
- package/dist/utils/response.js.map +1 -0
- package/dist/utils/validators/schema-validator.d.ts +13 -9
- package/dist/utils/validators/schema-validator.js +228 -209
- package/dist/utils/validators/schema-validator.js.map +1 -0
- package/dist/utils/validators/schema-validators-ultra.d.ts +15 -12
- package/dist/utils/validators/schema-validators-ultra.js +233 -256
- package/dist/utils/validators/schema-validators-ultra.js.map +1 -0
- package/dist/utils/validators/validators.d.ts +15 -12
- package/dist/utils/validators/validators.js +81 -122
- package/dist/utils/validators/validators.js.map +1 -0
- package/package.json +5 -4
package/dist/auth/token.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
9
|
+
interface TokenResult {
|
|
10
10
|
payload: TokenPayload;
|
|
11
11
|
token: string;
|
|
12
12
|
expiresAt: number;
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
interface TokenOptions {
|
|
15
15
|
expiresIn?: number;
|
|
16
16
|
issuer?: string;
|
|
17
17
|
audience?: string;
|
|
18
18
|
subject?: string;
|
|
19
19
|
}
|
|
20
|
-
|
|
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
|
-
|
|
25
|
+
declare function generateToken(payload: TokenPayload, secret: string, options?: TokenOptions): Promise<TokenResult>;
|
|
26
26
|
/** 验证令牌 */
|
|
27
|
-
|
|
27
|
+
declare function verifyToken(token: string, secret: string): Promise<TokenPayload | null>;
|
|
28
28
|
/** 解析令牌(不验证签名) */
|
|
29
|
-
|
|
29
|
+
declare function parseToken(token: string): TokenPayload | null;
|
|
30
30
|
/** 检查令牌是否过期 */
|
|
31
|
-
|
|
31
|
+
declare function isTokenExpired(token: string): boolean;
|
|
32
32
|
/** 获取令牌剩余有效时间(秒) */
|
|
33
|
-
|
|
33
|
+
declare function getTokenTimeRemaining(token: string): number;
|
|
34
34
|
/** 刷新令牌 */
|
|
35
|
-
|
|
35
|
+
declare function refreshToken(token: string, secret: string, options?: TokenOptions): Promise<TokenResult | null>;
|
|
36
36
|
/** 创建访问令牌和刷新令牌对 */
|
|
37
|
-
|
|
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 };
|
package/dist/auth/token.js
CHANGED
|
@@ -1,124 +1,131 @@
|
|
|
1
|
-
// src/
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
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
|
-
|
|
79
|
-
|
|
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
|
-
|
|
84
|
-
const
|
|
85
|
-
if (!
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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"]}
|
package/dist/defineRoute.d.ts
CHANGED
package/dist/defineRoute.js
CHANGED
|
@@ -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
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export {
|
|
13
|
-
export
|
|
14
|
-
export {
|
|
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';
|