@lytjs/middleware 6.8.0 → 6.9.1
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/index.cjs +11 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +143 -0
- package/dist/index.d.ts +89 -78
- package/dist/index.js +11 -6
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -80,17 +80,19 @@ var MiddlewareComposer = class {
|
|
|
80
80
|
const ctx = createContext(request, extra);
|
|
81
81
|
try {
|
|
82
82
|
await combined(ctx, async () => {
|
|
83
|
-
|
|
83
|
+
const result = await handler(request, ctx);
|
|
84
|
+
ctx.response = result;
|
|
84
85
|
});
|
|
85
86
|
return ctx.response || new Response("\u672A\u627E\u5230", { status: 404 });
|
|
86
87
|
} catch (error) {
|
|
87
88
|
if (this.config.throwOnError) {
|
|
88
89
|
throw error;
|
|
89
90
|
}
|
|
90
|
-
|
|
91
|
+
const errorResult = await this.config.errorHandler(
|
|
91
92
|
error instanceof Error ? error : new Error(String(error)),
|
|
92
93
|
ctx
|
|
93
94
|
);
|
|
95
|
+
ctx.response = errorResult;
|
|
94
96
|
return ctx.response;
|
|
95
97
|
}
|
|
96
98
|
};
|
|
@@ -132,12 +134,15 @@ var MiddlewareChain = class {
|
|
|
132
134
|
const middlewares = this.middlewares;
|
|
133
135
|
const dispatch = async (i) => {
|
|
134
136
|
if (i >= middlewares.length) {
|
|
135
|
-
|
|
137
|
+
const result = await finalHandler(request, context);
|
|
138
|
+
return result;
|
|
136
139
|
}
|
|
137
140
|
const middleware = middlewares[i];
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
+
if (middleware) {
|
|
142
|
+
const result = await middleware(request, context, () => dispatch(i + 1));
|
|
143
|
+
if (result !== void 0 && result !== null) {
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
141
146
|
}
|
|
142
147
|
return dispatch(i + 1);
|
|
143
148
|
};
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware.ts","../src/context.ts","../src/composer.ts","../src/chain.ts"],"names":["isArray"],"mappings":";;;;;AASO,SAAS,iBAAiB,EAAA,EAAgC;AAC/D,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,sBAAsB,WAAA,EAA2C;AAC/E,EAAA,OAAO,OAAO,KAAwB,IAAA,KAA8B;AAClE,IAAA,MAAM,KAAA,GAAQ,CAAA;AAEd,IAAA,MAAM,QAAA,GAAW,OAAO,CAAA,KAA6B;AACnD,MAAA,IAAI,CAAA,IAAK,YAAY,MAAA,EAAQ;AAC3B,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAEA,MAAA,MAAM,UAAA,GAAa,YAAY,CAAC,CAAA;AAChC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,WAAW,GAAA,EAAK,MAAM,QAAA,CAAS,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAS,KAAK,CAAA;AAAA,EACtB,CAAA;AACF;AAKO,SAAS,qBAAA,CACd,SAAA,EACA,UAAA,EACA,QAAA,EACc;AACd,EAAA,OAAO,OAAO,KAAwB,IAAA,KAA8B;AAClE,IAAA,IAAI,SAAA,CAAU,GAAG,CAAA,EAAG;AAClB,MAAA,OAAO,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IAC7B,WAAW,QAAA,EAAU;AACnB,MAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,IAAA,EAAK;AAAA,EACd,CAAA;AACF;;;AC5CO,SAAS,aAAA,CACd,SACA,KAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,GAAG;AAAA,GACL;AACF;AAKO,SAAS,YAAA,CACd,KACA,IAAA,EACmB;AACnB,EAAA,OAAO,EAAE,GAAG,GAAA,EAAK,GAAG,IAAA,EAAK;AAC3B;;;ACnBO,IAAM,qBAAN,MAAyB;AAAA,EAI9B,YAAY,MAAA,EAAmC;AAH/C,IAAA,IAAA,CAAQ,cAA8B,EAAC;AAIrC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,YAAA,EAAc,CAAC,GAAA,KACb,IAAI,SAAS,CAAA,4CAAA,EAAY,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI;AAAA,QACtC,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,MACH,YAAA,EAAc,KAAA;AAAA,MACd,GAAG;AAAA,KACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,EAAgC;AAClC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,WAAA,EAAmC;AAC5C,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,GAAG,WAAW,CAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QACE,OAAA,EAC0E;AAC1E,IAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,GAAG,IAAA,CAAK,WAAW,CAAA;AAEvD,IAAA,OAAO,OAAO,SAAkB,KAAA,KAAuD;AACrF,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAExC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,CAAS,KAAK,YAAY;AAC9B,UAAA,
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts","../src/context.ts","../src/composer.ts","../src/chain.ts"],"names":["isArray"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 中间件工具函数\n */\n\nimport type { MiddlewareFn, MiddlewareContext } from './types';\n\n/**\n * 创建中间件函数\n */\nexport function createMiddleware(fn: MiddlewareFn): MiddlewareFn {\n return fn;\n}\n\n/**\n * 将多个中间件合并为一个\n */\nexport function combineMiddlewares(...middlewares: MiddlewareFn[]): MiddlewareFn {\n return async (ctx: MiddlewareContext, next: () => Promise<void>) => {\n const index = 0;\n\n const dispatch = async (i: number): Promise<void> => {\n if (i >= middlewares.length) {\n return next();\n }\n\n const middleware = middlewares[i];\n if (middleware) {\n await middleware(ctx, () => dispatch(i + 1));\n } else {\n await dispatch(i + 1);\n }\n };\n\n await dispatch(index);\n };\n}\n\n/**\n * 条件中间件执行\n */\nexport function conditionalMiddleware(\n condition: (ctx: MiddlewareContext) => boolean,\n middleware: MiddlewareFn,\n fallback?: MiddlewareFn,\n): MiddlewareFn {\n return async (ctx: MiddlewareContext, next: () => Promise<void>) => {\n if (condition(ctx)) {\n return middleware(ctx, next);\n } else if (fallback) {\n return fallback(ctx, next);\n }\n return next();\n };\n}\n","/**\n * 中间件上下文实现\n */\n\nimport type { MiddlewareContext } from './types';\n\n/**\n * 创建新的中间件上下文\n */\nexport function createContext(\n request: Request,\n extra?: Record<string, unknown>,\n): MiddlewareContext {\n return {\n request,\n ...extra,\n };\n}\n\n/**\n * 将额外数据合并到上下文中\n */\nexport function mergeContext(\n ctx: MiddlewareContext,\n data: Record<string, unknown>,\n): MiddlewareContext {\n return { ...ctx, ...data };\n}\n","/**\n * 中间件组合器 - 洋葱模型实现\n */\n\nimport type { MiddlewareFn, MiddlewareComposerConfig, HandlerFn } from './types';\nimport { createContext } from './context';\nimport { combineMiddlewares } from './middleware';\n\nexport class MiddlewareComposer {\n private middlewares: MiddlewareFn[] = [];\n private config: Required<MiddlewareComposerConfig>;\n\n constructor(config?: MiddlewareComposerConfig) {\n this.config = {\n errorHandler: (err: Error) =>\n new Response(`内部服务器错误: ${err.message}`, {\n status: 500,\n }),\n throwOnError: false,\n ...config,\n };\n }\n\n /**\n * 向链中添加中间件\n */\n use(middleware: MiddlewareFn): this {\n this.middlewares.push(middleware);\n return this;\n }\n\n /**\n * 添加多个中间件\n */\n useMany(...middlewares: MiddlewareFn[]): this {\n this.middlewares.push(...middlewares);\n return this;\n }\n\n /**\n * 使用最终处理器组合中间件链\n */\n compose(\n handler: HandlerFn,\n ): (request: Request, extra?: Record<string, unknown>) => Promise<Response> {\n const combined = combineMiddlewares(...this.middlewares);\n\n return async (request: Request, extra?: Record<string, unknown>): Promise<Response> => {\n const ctx = createContext(request, extra);\n\n try {\n await combined(ctx, async () => {\n const result = await handler(request, ctx);\n ctx.response = result as Response;\n });\n\n return (ctx.response as Response) || (new Response('未找到', { status: 404 }) as unknown as Response);\n } catch (error) {\n if (this.config.throwOnError) {\n throw error;\n }\n\n const errorResult = await this.config.errorHandler(\n error instanceof Error ? error : new Error(String(error)),\n ctx,\n );\n ctx.response = errorResult as Response;\n\n return ctx.response as Response;\n }\n };\n }\n\n /**\n * 清除所有中间件\n */\n clear(): this {\n this.middlewares = [];\n return this;\n }\n\n /**\n * 获取中间件数量\n */\n get count(): number {\n return this.middlewares.length;\n }\n}\n\n/**\n * 创建新的中间件组合器\n */\nexport function createComposer(config?: MiddlewareComposerConfig): MiddlewareComposer {\n return new MiddlewareComposer(config);\n}\n","/**\n * 中间件链实现 - 洋葱圈模型\n */\nimport { isArray } from '@lytjs/common-is';\nimport type { Middleware, MiddlewareContext, FinalHandler } from './types';\n\n/**\n * 中间件链类\n */\nexport class MiddlewareChain {\n private middlewares: Middleware[] = [];\n\n /**\n * 添加中间件\n */\n use(middleware: Middleware): this;\n use(middlewares: Middleware[]): this;\n use(middlewareOrMiddlewares: Middleware | Middleware[]): this {\n if (isArray(middlewareOrMiddlewares)) {\n this.middlewares.push(...middlewareOrMiddlewares);\n } else {\n this.middlewares.push(middlewareOrMiddlewares);\n }\n return this;\n }\n\n /**\n * 执行中间件链\n */\n async execute(\n request: Request,\n context: MiddlewareContext,\n finalHandler: FinalHandler,\n ): Promise<Response> {\n const index = 0;\n const middlewares = this.middlewares;\n\n const dispatch = async (i: number): Promise<Response> => {\n if (i >= middlewares.length) {\n const result = await finalHandler(request, context);\n return result as unknown as Response;\n }\n\n const middleware = middlewares[i];\n if (middleware) {\n const result = await middleware(request, context, () => dispatch(i + 1) as unknown as Promise<void>);\n if (result !== undefined && result !== null) {\n return result as Response;\n }\n }\n return dispatch(i + 1);\n };\n\n return dispatch(index);\n }\n\n /**\n * 获取中间件数量\n */\n get size(): number {\n return this.middlewares.length;\n }\n\n /**\n * 清空中间件链\n */\n clear(): this {\n this.middlewares = [];\n return this;\n }\n}\n\n/**\n * 创建中间件链\n */\nexport function createMiddlewareChain(): MiddlewareChain {\n return new MiddlewareChain();\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 中间件类型定义
|
|
3
|
+
*/
|
|
4
|
+
type Request$1 = unknown;
|
|
5
|
+
type Response$1 = unknown;
|
|
6
|
+
/**
|
|
7
|
+
* 中间件链中传递的请求上下文
|
|
8
|
+
*/
|
|
9
|
+
interface MiddlewareContext {
|
|
10
|
+
/** 请求对象 */
|
|
11
|
+
request: Request$1;
|
|
12
|
+
/** 响应对象(初始为 undefined,由处理器设置) */
|
|
13
|
+
response?: Response$1;
|
|
14
|
+
/** 额外的上下文属性 */
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 中间件函数类型 - 传统的 (request, context, next) 签名
|
|
19
|
+
*/
|
|
20
|
+
type Middleware = (request: Request$1, context: MiddlewareContext, next: () => Promise<void>) => Promise<Response$1 | void | undefined>;
|
|
21
|
+
/**
|
|
22
|
+
* 中间件函数类型 - 洋葱圈模型签名
|
|
23
|
+
*
|
|
24
|
+
* @param ctx - 当前中间件上下文
|
|
25
|
+
* @param next - 调用链中下一个中间件的函数
|
|
26
|
+
* @returns 中间件完成时的 Promise
|
|
27
|
+
*/
|
|
28
|
+
type MiddlewareFn = (ctx: MiddlewareContext, next: () => Promise<void>) => Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* 最终处理器函数
|
|
31
|
+
*/
|
|
32
|
+
type FinalHandler = (request: Request$1, context: MiddlewareContext) => Promise<Response$1>;
|
|
33
|
+
/**
|
|
34
|
+
* 中间件处理器函数
|
|
35
|
+
*/
|
|
36
|
+
type HandlerFn = (request: Request$1, ctx: Record<string, unknown>) => Promise<Response$1> | Response$1;
|
|
37
|
+
/**
|
|
38
|
+
* 错误处理函数
|
|
39
|
+
*/
|
|
40
|
+
type ErrorHandlerFn = (error: Error, ctx: MiddlewareContext) => Promise<Response$1> | Response$1;
|
|
41
|
+
/**
|
|
42
|
+
* 中间件组合器配置
|
|
43
|
+
*/
|
|
44
|
+
interface MiddlewareComposerConfig {
|
|
45
|
+
/** 中间件链的错误处理器 */
|
|
46
|
+
errorHandler?: ErrorHandlerFn;
|
|
47
|
+
/** 是否抛出错误或调用错误处理器 */
|
|
48
|
+
throwOnError?: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 中间件工具函数
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 创建中间件函数
|
|
57
|
+
*/
|
|
58
|
+
declare function createMiddleware(fn: MiddlewareFn): MiddlewareFn;
|
|
59
|
+
/**
|
|
60
|
+
* 将多个中间件合并为一个
|
|
61
|
+
*/
|
|
62
|
+
declare function combineMiddlewares(...middlewares: MiddlewareFn[]): MiddlewareFn;
|
|
63
|
+
/**
|
|
64
|
+
* 条件中间件执行
|
|
65
|
+
*/
|
|
66
|
+
declare function conditionalMiddleware(condition: (ctx: MiddlewareContext) => boolean, middleware: MiddlewareFn, fallback?: MiddlewareFn): MiddlewareFn;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 中间件组合器 - 洋葱模型实现
|
|
70
|
+
*/
|
|
71
|
+
|
|
72
|
+
declare class MiddlewareComposer {
|
|
73
|
+
private middlewares;
|
|
74
|
+
private config;
|
|
75
|
+
constructor(config?: MiddlewareComposerConfig);
|
|
76
|
+
/**
|
|
77
|
+
* 向链中添加中间件
|
|
78
|
+
*/
|
|
79
|
+
use(middleware: MiddlewareFn): this;
|
|
80
|
+
/**
|
|
81
|
+
* 添加多个中间件
|
|
82
|
+
*/
|
|
83
|
+
useMany(...middlewares: MiddlewareFn[]): this;
|
|
84
|
+
/**
|
|
85
|
+
* 使用最终处理器组合中间件链
|
|
86
|
+
*/
|
|
87
|
+
compose(handler: HandlerFn): (request: Request, extra?: Record<string, unknown>) => Promise<Response>;
|
|
88
|
+
/**
|
|
89
|
+
* 清除所有中间件
|
|
90
|
+
*/
|
|
91
|
+
clear(): this;
|
|
92
|
+
/**
|
|
93
|
+
* 获取中间件数量
|
|
94
|
+
*/
|
|
95
|
+
get count(): number;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 创建新的中间件组合器
|
|
99
|
+
*/
|
|
100
|
+
declare function createComposer(config?: MiddlewareComposerConfig): MiddlewareComposer;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* 中间件上下文实现
|
|
104
|
+
*/
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 创建新的中间件上下文
|
|
108
|
+
*/
|
|
109
|
+
declare function createContext(request: Request, extra?: Record<string, unknown>): MiddlewareContext;
|
|
110
|
+
/**
|
|
111
|
+
* 将额外数据合并到上下文中
|
|
112
|
+
*/
|
|
113
|
+
declare function mergeContext(ctx: MiddlewareContext, data: Record<string, unknown>): MiddlewareContext;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* 中间件链类
|
|
117
|
+
*/
|
|
118
|
+
declare class MiddlewareChain {
|
|
119
|
+
private middlewares;
|
|
120
|
+
/**
|
|
121
|
+
* 添加中间件
|
|
122
|
+
*/
|
|
123
|
+
use(middleware: Middleware): this;
|
|
124
|
+
use(middlewares: Middleware[]): this;
|
|
125
|
+
/**
|
|
126
|
+
* 执行中间件链
|
|
127
|
+
*/
|
|
128
|
+
execute(request: Request, context: MiddlewareContext, finalHandler: FinalHandler): Promise<Response>;
|
|
129
|
+
/**
|
|
130
|
+
* 获取中间件数量
|
|
131
|
+
*/
|
|
132
|
+
get size(): number;
|
|
133
|
+
/**
|
|
134
|
+
* 清空中间件链
|
|
135
|
+
*/
|
|
136
|
+
clear(): this;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 创建中间件链
|
|
140
|
+
*/
|
|
141
|
+
declare function createMiddlewareChain(): MiddlewareChain;
|
|
142
|
+
|
|
143
|
+
export { type ErrorHandlerFn, type FinalHandler, type HandlerFn, type Middleware, MiddlewareChain, MiddlewareComposer, type MiddlewareComposerConfig, type MiddlewareContext, type MiddlewareFn, combineMiddlewares, conditionalMiddleware, createComposer, createContext, createMiddleware, createMiddlewareChain, mergeContext };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,132 +1,143 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 中间件类型定义
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
type Request$1 = unknown;
|
|
5
|
+
type Response$1 = unknown;
|
|
7
6
|
/**
|
|
8
7
|
* 中间件链中传递的请求上下文
|
|
9
8
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
interface MiddlewareContext {
|
|
10
|
+
/** 请求对象 */
|
|
11
|
+
request: Request$1;
|
|
12
|
+
/** 响应对象(初始为 undefined,由处理器设置) */
|
|
13
|
+
response?: Response$1;
|
|
14
|
+
/** 额外的上下文属性 */
|
|
15
|
+
[key: string]: unknown;
|
|
17
16
|
}
|
|
18
|
-
|
|
19
17
|
/**
|
|
20
18
|
* 中间件函数类型 - 传统的 (request, context, next) 签名
|
|
21
19
|
*/
|
|
22
|
-
|
|
23
|
-
request: Request,
|
|
24
|
-
context: MiddlewareContext,
|
|
25
|
-
next: () => Promise<void>,
|
|
26
|
-
) => Promise<Response | void | undefined>;
|
|
27
|
-
|
|
20
|
+
type Middleware = (request: Request$1, context: MiddlewareContext, next: () => Promise<void>) => Promise<Response$1 | void | undefined>;
|
|
28
21
|
/**
|
|
29
22
|
* 中间件函数类型 - 洋葱圈模型签名
|
|
23
|
+
*
|
|
24
|
+
* @param ctx - 当前中间件上下文
|
|
25
|
+
* @param next - 调用链中下一个中间件的函数
|
|
26
|
+
* @returns 中间件完成时的 Promise
|
|
30
27
|
*/
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
type MiddlewareFn = (ctx: MiddlewareContext, next: () => Promise<void>) => Promise<void>;
|
|
33
29
|
/**
|
|
34
30
|
* 最终处理器函数
|
|
35
31
|
*/
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
type FinalHandler = (request: Request$1, context: MiddlewareContext) => Promise<Response$1>;
|
|
38
33
|
/**
|
|
39
34
|
* 中间件处理器函数
|
|
40
35
|
*/
|
|
41
|
-
|
|
42
|
-
request: Request,
|
|
43
|
-
ctx: Record<string, unknown>,
|
|
44
|
-
) => Promise<Response> | Response;
|
|
45
|
-
|
|
36
|
+
type HandlerFn = (request: Request$1, ctx: Record<string, unknown>) => Promise<Response$1> | Response$1;
|
|
46
37
|
/**
|
|
47
38
|
* 错误处理函数
|
|
48
39
|
*/
|
|
49
|
-
|
|
50
|
-
|
|
40
|
+
type ErrorHandlerFn = (error: Error, ctx: MiddlewareContext) => Promise<Response$1> | Response$1;
|
|
51
41
|
/**
|
|
52
42
|
* 中间件组合器配置
|
|
53
43
|
*/
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
44
|
+
interface MiddlewareComposerConfig {
|
|
45
|
+
/** 中间件链的错误处理器 */
|
|
46
|
+
errorHandler?: ErrorHandlerFn;
|
|
47
|
+
/** 是否抛出错误或调用错误处理器 */
|
|
48
|
+
throwOnError?: boolean;
|
|
57
49
|
}
|
|
58
50
|
|
|
59
51
|
/**
|
|
60
|
-
*
|
|
52
|
+
* 中间件工具函数
|
|
61
53
|
*/
|
|
62
|
-
export function createMiddleware(fn: MiddlewareFn): MiddlewareFn;
|
|
63
54
|
|
|
55
|
+
/**
|
|
56
|
+
* 创建中间件函数
|
|
57
|
+
*/
|
|
58
|
+
declare function createMiddleware(fn: MiddlewareFn): MiddlewareFn;
|
|
64
59
|
/**
|
|
65
60
|
* 将多个中间件合并为一个
|
|
66
61
|
*/
|
|
67
|
-
|
|
68
|
-
|
|
62
|
+
declare function combineMiddlewares(...middlewares: MiddlewareFn[]): MiddlewareFn;
|
|
69
63
|
/**
|
|
70
64
|
* 条件中间件执行
|
|
71
65
|
*/
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
66
|
+
declare function conditionalMiddleware(condition: (ctx: MiddlewareContext) => boolean, middleware: MiddlewareFn, fallback?: MiddlewareFn): MiddlewareFn;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 中间件组合器 - 洋葱模型实现
|
|
70
|
+
*/
|
|
71
|
+
|
|
72
|
+
declare class MiddlewareComposer {
|
|
73
|
+
private middlewares;
|
|
74
|
+
private config;
|
|
75
|
+
constructor(config?: MiddlewareComposerConfig);
|
|
76
|
+
/**
|
|
77
|
+
* 向链中添加中间件
|
|
78
|
+
*/
|
|
79
|
+
use(middleware: MiddlewareFn): this;
|
|
80
|
+
/**
|
|
81
|
+
* 添加多个中间件
|
|
82
|
+
*/
|
|
83
|
+
useMany(...middlewares: MiddlewareFn[]): this;
|
|
84
|
+
/**
|
|
85
|
+
* 使用最终处理器组合中间件链
|
|
86
|
+
*/
|
|
87
|
+
compose(handler: HandlerFn): (request: Request, extra?: Record<string, unknown>) => Promise<Response>;
|
|
88
|
+
/**
|
|
89
|
+
* 清除所有中间件
|
|
90
|
+
*/
|
|
91
|
+
clear(): this;
|
|
92
|
+
/**
|
|
93
|
+
* 获取中间件数量
|
|
94
|
+
*/
|
|
95
|
+
get count(): number;
|
|
96
|
+
}
|
|
78
97
|
/**
|
|
79
|
-
*
|
|
98
|
+
* 创建新的中间件组合器
|
|
80
99
|
*/
|
|
81
|
-
|
|
100
|
+
declare function createComposer(config?: MiddlewareComposerConfig): MiddlewareComposer;
|
|
82
101
|
|
|
83
102
|
/**
|
|
84
|
-
*
|
|
103
|
+
* 中间件上下文实现
|
|
85
104
|
*/
|
|
86
|
-
export function mergeContext(
|
|
87
|
-
ctx: MiddlewareContext,
|
|
88
|
-
data: Record<string, unknown>,
|
|
89
|
-
): MiddlewareContext;
|
|
90
105
|
|
|
91
106
|
/**
|
|
92
|
-
*
|
|
107
|
+
* 创建新的中间件上下文
|
|
93
108
|
*/
|
|
94
|
-
|
|
95
|
-
constructor(config?: MiddlewareComposerConfig);
|
|
96
|
-
use(middleware: MiddlewareFn): this;
|
|
97
|
-
useMany(...middlewares: MiddlewareFn[]): this;
|
|
98
|
-
compose(handler: HandlerFn): (request: Request, extra?: Record<string, unknown>) => Promise<Response>;
|
|
99
|
-
clear(): this;
|
|
100
|
-
get count(): number;
|
|
101
|
-
}
|
|
102
|
-
|
|
109
|
+
declare function createContext(request: Request, extra?: Record<string, unknown>): MiddlewareContext;
|
|
103
110
|
/**
|
|
104
|
-
*
|
|
111
|
+
* 将额外数据合并到上下文中
|
|
105
112
|
*/
|
|
106
|
-
|
|
113
|
+
declare function mergeContext(ctx: MiddlewareContext, data: Record<string, unknown>): MiddlewareContext;
|
|
107
114
|
|
|
108
115
|
/**
|
|
109
116
|
* 中间件链类
|
|
110
117
|
*/
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
118
|
+
declare class MiddlewareChain {
|
|
119
|
+
private middlewares;
|
|
120
|
+
/**
|
|
121
|
+
* 添加中间件
|
|
122
|
+
*/
|
|
123
|
+
use(middleware: Middleware): this;
|
|
124
|
+
use(middlewares: Middleware[]): this;
|
|
125
|
+
/**
|
|
126
|
+
* 执行中间件链
|
|
127
|
+
*/
|
|
128
|
+
execute(request: Request, context: MiddlewareContext, finalHandler: FinalHandler): Promise<Response>;
|
|
129
|
+
/**
|
|
130
|
+
* 获取中间件数量
|
|
131
|
+
*/
|
|
132
|
+
get size(): number;
|
|
133
|
+
/**
|
|
134
|
+
* 清空中间件链
|
|
135
|
+
*/
|
|
136
|
+
clear(): this;
|
|
117
137
|
}
|
|
118
|
-
|
|
119
138
|
/**
|
|
120
139
|
* 创建中间件链
|
|
121
140
|
*/
|
|
122
|
-
|
|
141
|
+
declare function createMiddlewareChain(): MiddlewareChain;
|
|
123
142
|
|
|
124
|
-
export {
|
|
125
|
-
Middleware,
|
|
126
|
-
MiddlewareFn,
|
|
127
|
-
MiddlewareContext,
|
|
128
|
-
FinalHandler,
|
|
129
|
-
HandlerFn,
|
|
130
|
-
ErrorHandlerFn,
|
|
131
|
-
MiddlewareComposerConfig,
|
|
132
|
-
};
|
|
143
|
+
export { type ErrorHandlerFn, type FinalHandler, type HandlerFn, type Middleware, MiddlewareChain, MiddlewareComposer, type MiddlewareComposerConfig, type MiddlewareContext, type MiddlewareFn, combineMiddlewares, conditionalMiddleware, createComposer, createContext, createMiddleware, createMiddlewareChain, mergeContext };
|
package/dist/index.js
CHANGED
|
@@ -78,17 +78,19 @@ var MiddlewareComposer = class {
|
|
|
78
78
|
const ctx = createContext(request, extra);
|
|
79
79
|
try {
|
|
80
80
|
await combined(ctx, async () => {
|
|
81
|
-
|
|
81
|
+
const result = await handler(request, ctx);
|
|
82
|
+
ctx.response = result;
|
|
82
83
|
});
|
|
83
84
|
return ctx.response || new Response("\u672A\u627E\u5230", { status: 404 });
|
|
84
85
|
} catch (error) {
|
|
85
86
|
if (this.config.throwOnError) {
|
|
86
87
|
throw error;
|
|
87
88
|
}
|
|
88
|
-
|
|
89
|
+
const errorResult = await this.config.errorHandler(
|
|
89
90
|
error instanceof Error ? error : new Error(String(error)),
|
|
90
91
|
ctx
|
|
91
92
|
);
|
|
93
|
+
ctx.response = errorResult;
|
|
92
94
|
return ctx.response;
|
|
93
95
|
}
|
|
94
96
|
};
|
|
@@ -130,12 +132,15 @@ var MiddlewareChain = class {
|
|
|
130
132
|
const middlewares = this.middlewares;
|
|
131
133
|
const dispatch = async (i) => {
|
|
132
134
|
if (i >= middlewares.length) {
|
|
133
|
-
|
|
135
|
+
const result = await finalHandler(request, context);
|
|
136
|
+
return result;
|
|
134
137
|
}
|
|
135
138
|
const middleware = middlewares[i];
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
+
if (middleware) {
|
|
140
|
+
const result = await middleware(request, context, () => dispatch(i + 1));
|
|
141
|
+
if (result !== void 0 && result !== null) {
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
139
144
|
}
|
|
140
145
|
return dispatch(i + 1);
|
|
141
146
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware.ts","../src/context.ts","../src/composer.ts","../src/chain.ts"],"names":[],"mappings":";;;AASO,SAAS,iBAAiB,EAAA,EAAgC;AAC/D,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,sBAAsB,WAAA,EAA2C;AAC/E,EAAA,OAAO,OAAO,KAAwB,IAAA,KAA8B;AAClE,IAAA,MAAM,KAAA,GAAQ,CAAA;AAEd,IAAA,MAAM,QAAA,GAAW,OAAO,CAAA,KAA6B;AACnD,MAAA,IAAI,CAAA,IAAK,YAAY,MAAA,EAAQ;AAC3B,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAEA,MAAA,MAAM,UAAA,GAAa,YAAY,CAAC,CAAA;AAChC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,WAAW,GAAA,EAAK,MAAM,QAAA,CAAS,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAS,KAAK,CAAA;AAAA,EACtB,CAAA;AACF;AAKO,SAAS,qBAAA,CACd,SAAA,EACA,UAAA,EACA,QAAA,EACc;AACd,EAAA,OAAO,OAAO,KAAwB,IAAA,KAA8B;AAClE,IAAA,IAAI,SAAA,CAAU,GAAG,CAAA,EAAG;AAClB,MAAA,OAAO,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IAC7B,WAAW,QAAA,EAAU;AACnB,MAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,IAAA,EAAK;AAAA,EACd,CAAA;AACF;;;AC5CO,SAAS,aAAA,CACd,SACA,KAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,GAAG;AAAA,GACL;AACF;AAKO,SAAS,YAAA,CACd,KACA,IAAA,EACmB;AACnB,EAAA,OAAO,EAAE,GAAG,GAAA,EAAK,GAAG,IAAA,EAAK;AAC3B;;;ACnBO,IAAM,qBAAN,MAAyB;AAAA,EAI9B,YAAY,MAAA,EAAmC;AAH/C,IAAA,IAAA,CAAQ,cAA8B,EAAC;AAIrC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,YAAA,EAAc,CAAC,GAAA,KACb,IAAI,SAAS,CAAA,4CAAA,EAAY,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI;AAAA,QACtC,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,MACH,YAAA,EAAc,KAAA;AAAA,MACd,GAAG;AAAA,KACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,EAAgC;AAClC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,WAAA,EAAmC;AAC5C,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,GAAG,WAAW,CAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QACE,OAAA,EAC0E;AAC1E,IAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,GAAG,IAAA,CAAK,WAAW,CAAA;AAEvD,IAAA,OAAO,OAAO,SAAkB,KAAA,KAAuD;AACrF,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAExC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,CAAS,KAAK,YAAY;AAC9B,UAAA,
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts","../src/context.ts","../src/composer.ts","../src/chain.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 中间件工具函数\n */\n\nimport type { MiddlewareFn, MiddlewareContext } from './types';\n\n/**\n * 创建中间件函数\n */\nexport function createMiddleware(fn: MiddlewareFn): MiddlewareFn {\n return fn;\n}\n\n/**\n * 将多个中间件合并为一个\n */\nexport function combineMiddlewares(...middlewares: MiddlewareFn[]): MiddlewareFn {\n return async (ctx: MiddlewareContext, next: () => Promise<void>) => {\n const index = 0;\n\n const dispatch = async (i: number): Promise<void> => {\n if (i >= middlewares.length) {\n return next();\n }\n\n const middleware = middlewares[i];\n if (middleware) {\n await middleware(ctx, () => dispatch(i + 1));\n } else {\n await dispatch(i + 1);\n }\n };\n\n await dispatch(index);\n };\n}\n\n/**\n * 条件中间件执行\n */\nexport function conditionalMiddleware(\n condition: (ctx: MiddlewareContext) => boolean,\n middleware: MiddlewareFn,\n fallback?: MiddlewareFn,\n): MiddlewareFn {\n return async (ctx: MiddlewareContext, next: () => Promise<void>) => {\n if (condition(ctx)) {\n return middleware(ctx, next);\n } else if (fallback) {\n return fallback(ctx, next);\n }\n return next();\n };\n}\n","/**\n * 中间件上下文实现\n */\n\nimport type { MiddlewareContext } from './types';\n\n/**\n * 创建新的中间件上下文\n */\nexport function createContext(\n request: Request,\n extra?: Record<string, unknown>,\n): MiddlewareContext {\n return {\n request,\n ...extra,\n };\n}\n\n/**\n * 将额外数据合并到上下文中\n */\nexport function mergeContext(\n ctx: MiddlewareContext,\n data: Record<string, unknown>,\n): MiddlewareContext {\n return { ...ctx, ...data };\n}\n","/**\n * 中间件组合器 - 洋葱模型实现\n */\n\nimport type { MiddlewareFn, MiddlewareComposerConfig, HandlerFn } from './types';\nimport { createContext } from './context';\nimport { combineMiddlewares } from './middleware';\n\nexport class MiddlewareComposer {\n private middlewares: MiddlewareFn[] = [];\n private config: Required<MiddlewareComposerConfig>;\n\n constructor(config?: MiddlewareComposerConfig) {\n this.config = {\n errorHandler: (err: Error) =>\n new Response(`内部服务器错误: ${err.message}`, {\n status: 500,\n }),\n throwOnError: false,\n ...config,\n };\n }\n\n /**\n * 向链中添加中间件\n */\n use(middleware: MiddlewareFn): this {\n this.middlewares.push(middleware);\n return this;\n }\n\n /**\n * 添加多个中间件\n */\n useMany(...middlewares: MiddlewareFn[]): this {\n this.middlewares.push(...middlewares);\n return this;\n }\n\n /**\n * 使用最终处理器组合中间件链\n */\n compose(\n handler: HandlerFn,\n ): (request: Request, extra?: Record<string, unknown>) => Promise<Response> {\n const combined = combineMiddlewares(...this.middlewares);\n\n return async (request: Request, extra?: Record<string, unknown>): Promise<Response> => {\n const ctx = createContext(request, extra);\n\n try {\n await combined(ctx, async () => {\n const result = await handler(request, ctx);\n ctx.response = result as Response;\n });\n\n return (ctx.response as Response) || (new Response('未找到', { status: 404 }) as unknown as Response);\n } catch (error) {\n if (this.config.throwOnError) {\n throw error;\n }\n\n const errorResult = await this.config.errorHandler(\n error instanceof Error ? error : new Error(String(error)),\n ctx,\n );\n ctx.response = errorResult as Response;\n\n return ctx.response as Response;\n }\n };\n }\n\n /**\n * 清除所有中间件\n */\n clear(): this {\n this.middlewares = [];\n return this;\n }\n\n /**\n * 获取中间件数量\n */\n get count(): number {\n return this.middlewares.length;\n }\n}\n\n/**\n * 创建新的中间件组合器\n */\nexport function createComposer(config?: MiddlewareComposerConfig): MiddlewareComposer {\n return new MiddlewareComposer(config);\n}\n","/**\n * 中间件链实现 - 洋葱圈模型\n */\nimport { isArray } from '@lytjs/common-is';\nimport type { Middleware, MiddlewareContext, FinalHandler } from './types';\n\n/**\n * 中间件链类\n */\nexport class MiddlewareChain {\n private middlewares: Middleware[] = [];\n\n /**\n * 添加中间件\n */\n use(middleware: Middleware): this;\n use(middlewares: Middleware[]): this;\n use(middlewareOrMiddlewares: Middleware | Middleware[]): this {\n if (isArray(middlewareOrMiddlewares)) {\n this.middlewares.push(...middlewareOrMiddlewares);\n } else {\n this.middlewares.push(middlewareOrMiddlewares);\n }\n return this;\n }\n\n /**\n * 执行中间件链\n */\n async execute(\n request: Request,\n context: MiddlewareContext,\n finalHandler: FinalHandler,\n ): Promise<Response> {\n const index = 0;\n const middlewares = this.middlewares;\n\n const dispatch = async (i: number): Promise<Response> => {\n if (i >= middlewares.length) {\n const result = await finalHandler(request, context);\n return result as unknown as Response;\n }\n\n const middleware = middlewares[i];\n if (middleware) {\n const result = await middleware(request, context, () => dispatch(i + 1) as unknown as Promise<void>);\n if (result !== undefined && result !== null) {\n return result as Response;\n }\n }\n return dispatch(i + 1);\n };\n\n return dispatch(index);\n }\n\n /**\n * 获取中间件数量\n */\n get size(): number {\n return this.middlewares.length;\n }\n\n /**\n * 清空中间件链\n */\n clear(): this {\n this.middlewares = [];\n return this;\n }\n}\n\n/**\n * 创建中间件链\n */\nexport function createMiddlewareChain(): MiddlewareChain {\n return new MiddlewareChain();\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lytjs/middleware",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.9.1",
|
|
4
4
|
"description": "LytJS Middleware Core System - Onion model middleware architecture",
|
|
5
5
|
"author": "lytjs",
|
|
6
6
|
"license": "MIT",
|
|
@@ -32,9 +32,9 @@
|
|
|
32
32
|
"clean": "rm -rf dist node_modules .turbo"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@lytjs/common-error": "
|
|
36
|
-
"@lytjs/common-events": "
|
|
37
|
-
"@lytjs/shared-types": "
|
|
35
|
+
"@lytjs/common-error": "workspace:*",
|
|
36
|
+
"@lytjs/common-events": "workspace:*",
|
|
37
|
+
"@lytjs/shared-types": "workspace:*"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^22.13.10",
|