@lytjs/middleware 6.6.0
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/README.md +185 -0
- package/dist/index.cjs +175 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +165 -0
- package/dist/index.js.map +1 -0
- package/package.json +66 -0
package/README.md
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# @lytjs/middleware
|
|
2
|
+
|
|
3
|
+
> LytJS 中间件核心系统,支持洋葱圈模型。
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@lytjs/middleware)
|
|
6
|
+
[](https://gitee.com/lytjs/lytjs/blob/main/LICENSE)
|
|
7
|
+
|
|
8
|
+
## 简介
|
|
9
|
+
|
|
10
|
+
`@lytjs/middleware` 是 LytJS 框架的中间件核心系统,提供了洋葱圈模型的中间件处理机制。
|
|
11
|
+
|
|
12
|
+
### 核心特性
|
|
13
|
+
|
|
14
|
+
- **洋葱圈模型**:标准的中间件执行模式
|
|
15
|
+
- **类型安全**:完整的 TypeScript 类型支持
|
|
16
|
+
- **零依赖**:不引入任何外部依赖
|
|
17
|
+
- **灵活的上下文**:支持自定义中间件共享数据
|
|
18
|
+
- **中间件组合**:支持链式调用和组合
|
|
19
|
+
|
|
20
|
+
## 安装
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install @lytjs/middleware
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
或使用 pnpm:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pnpm add @lytjs/middleware
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 快速开始
|
|
33
|
+
|
|
34
|
+
### 创建中间件链
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { createMiddlewareChain } from '@lytjs/middleware';
|
|
38
|
+
|
|
39
|
+
const chain = createMiddlewareChain();
|
|
40
|
+
|
|
41
|
+
// 添加中间件
|
|
42
|
+
chain.use(async (req, ctx, next) => {
|
|
43
|
+
console.log('Before 1');
|
|
44
|
+
const response = await next();
|
|
45
|
+
console.log('After 1');
|
|
46
|
+
return response;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
chain.use(async (req, ctx, next) => {
|
|
50
|
+
console.log('Before 2');
|
|
51
|
+
const response = await next();
|
|
52
|
+
console.log('After 2');
|
|
53
|
+
return response;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// 执行
|
|
57
|
+
const response = await chain.execute(
|
|
58
|
+
new Request('https://example.com'),
|
|
59
|
+
{ params: {}, query: new URLSearchParams() },
|
|
60
|
+
(req, ctx) => {
|
|
61
|
+
return new Response('Hello, World!');
|
|
62
|
+
},
|
|
63
|
+
);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 中间件函数
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import { createMiddlewareChain } from '@lytjs/middleware';
|
|
70
|
+
|
|
71
|
+
const chain = createMiddlewareChain();
|
|
72
|
+
|
|
73
|
+
// 日志中间件
|
|
74
|
+
chain.use((req, ctx, next) => {
|
|
75
|
+
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
|
|
76
|
+
return next();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// 认证中间件
|
|
80
|
+
chain.use((req, ctx, next) => {
|
|
81
|
+
const authHeader = req.headers.get('Authorization');
|
|
82
|
+
if (!authHeader) {
|
|
83
|
+
return new Response('Unauthorized', { status: 401 });
|
|
84
|
+
}
|
|
85
|
+
ctx.user = { id: '123', name: 'Test' };
|
|
86
|
+
return next();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// 错误处理中间件
|
|
90
|
+
chain.use(async (req, ctx, next) => {
|
|
91
|
+
try {
|
|
92
|
+
return await next();
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error('Error:', error);
|
|
95
|
+
return new Response('Internal Server Error', { status: 500 });
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 主要 API
|
|
101
|
+
|
|
102
|
+
### `createMiddlewareChain()`
|
|
103
|
+
|
|
104
|
+
创建中间件链实例。
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
import { createMiddlewareChain } from '@lytjs/middleware';
|
|
108
|
+
|
|
109
|
+
const chain = createMiddlewareChain();
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### `MiddlewareChain` 方法
|
|
113
|
+
|
|
114
|
+
#### `use(middleware | middlewares)`
|
|
115
|
+
|
|
116
|
+
添加中间件到链。
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
chain.use((req, ctx, next) => {
|
|
120
|
+
// 中间件逻辑
|
|
121
|
+
return next();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// 或者添加多个
|
|
125
|
+
chain.use([middleware1, middleware2, middleware3]);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### `execute(request, context, finalHandler)`
|
|
129
|
+
|
|
130
|
+
执行中间件链。
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
const response = await chain.execute(request, context, (req, ctx) => {
|
|
134
|
+
return new Response('Final response');
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### `size`
|
|
139
|
+
|
|
140
|
+
获取中间件数量。
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
console.log(chain.size);
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### `clear()`
|
|
147
|
+
|
|
148
|
+
清空中间件链。
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
chain.clear();
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## 类型定义
|
|
155
|
+
|
|
156
|
+
### 中间件函数
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
type MiddlewareFunction = (
|
|
160
|
+
request: Request,
|
|
161
|
+
context: MiddlewareContext,
|
|
162
|
+
next: () => Promise<Response | null | undefined>,
|
|
163
|
+
) => Response | null | undefined | Promise<Response | null | undefined>;
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### 中间件上下文
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
interface MiddlewareContext {
|
|
170
|
+
params: Record<string, string>;
|
|
171
|
+
query: URLSearchParams;
|
|
172
|
+
[key: string]: any;
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## 许可证
|
|
177
|
+
|
|
178
|
+
MIT License - [查看许可证](https://gitee.com/lytjs/lytjs/blob/main/LICENSE)
|
|
179
|
+
|
|
180
|
+
## 贡献指南
|
|
181
|
+
|
|
182
|
+
欢迎提交 Issue 和 Pull Request!
|
|
183
|
+
|
|
184
|
+
- [Gitee 仓库](https://gitee.com/lytjs/lytjs)
|
|
185
|
+
- [问题反馈](https://gitee.com/lytjs/lytjs/issues)
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var commonIs = require('@lytjs/common-is');
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
8
|
+
|
|
9
|
+
// src/middleware.ts
|
|
10
|
+
function createMiddleware(fn) {
|
|
11
|
+
return fn;
|
|
12
|
+
}
|
|
13
|
+
function combineMiddlewares(...middlewares) {
|
|
14
|
+
return async (ctx, next) => {
|
|
15
|
+
const index = 0;
|
|
16
|
+
const dispatch = async (i) => {
|
|
17
|
+
if (i >= middlewares.length) {
|
|
18
|
+
return next();
|
|
19
|
+
}
|
|
20
|
+
const middleware = middlewares[i];
|
|
21
|
+
await middleware(ctx, () => dispatch(i + 1));
|
|
22
|
+
};
|
|
23
|
+
await dispatch(index);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function conditionalMiddleware(condition, middleware, fallback) {
|
|
27
|
+
return async (ctx, next) => {
|
|
28
|
+
if (condition(ctx)) {
|
|
29
|
+
return middleware(ctx, next);
|
|
30
|
+
} else if (fallback) {
|
|
31
|
+
return fallback(ctx, next);
|
|
32
|
+
}
|
|
33
|
+
return next();
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// src/context.ts
|
|
38
|
+
function createContext(request, extra) {
|
|
39
|
+
return {
|
|
40
|
+
request,
|
|
41
|
+
...extra
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function mergeContext(ctx, data) {
|
|
45
|
+
return { ...ctx, ...data };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/composer.ts
|
|
49
|
+
var MiddlewareComposer = class {
|
|
50
|
+
constructor(config) {
|
|
51
|
+
__publicField(this, "middlewares", []);
|
|
52
|
+
__publicField(this, "config");
|
|
53
|
+
this.config = {
|
|
54
|
+
errorHandler: (err) => new Response(`\u5185\u90E8\u670D\u52A1\u5668\u9519\u8BEF: ${err.message}`, {
|
|
55
|
+
status: 500
|
|
56
|
+
}),
|
|
57
|
+
throwOnError: false,
|
|
58
|
+
...config
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 向链中添加中间件
|
|
63
|
+
*/
|
|
64
|
+
use(middleware) {
|
|
65
|
+
this.middlewares.push(middleware);
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 添加多个中间件
|
|
70
|
+
*/
|
|
71
|
+
useMany(...middlewares) {
|
|
72
|
+
this.middlewares.push(...middlewares);
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 使用最终处理器组合中间件链
|
|
77
|
+
*/
|
|
78
|
+
compose(handler) {
|
|
79
|
+
const combined = combineMiddlewares(...this.middlewares);
|
|
80
|
+
return async (request, extra) => {
|
|
81
|
+
const ctx = createContext(request, extra);
|
|
82
|
+
try {
|
|
83
|
+
await combined(ctx, async () => {
|
|
84
|
+
ctx.response = await handler(request, ctx);
|
|
85
|
+
});
|
|
86
|
+
return ctx.response || new Response("\u672A\u627E\u5230", { status: 404 });
|
|
87
|
+
} catch (error) {
|
|
88
|
+
if (this.config.throwOnError) {
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
ctx.response = await this.config.errorHandler(
|
|
92
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
93
|
+
ctx
|
|
94
|
+
);
|
|
95
|
+
return ctx.response;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 清除所有中间件
|
|
101
|
+
*/
|
|
102
|
+
clear() {
|
|
103
|
+
this.middlewares = [];
|
|
104
|
+
return this;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 获取中间件数量
|
|
108
|
+
*/
|
|
109
|
+
get count() {
|
|
110
|
+
return this.middlewares.length;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
function createComposer(config) {
|
|
114
|
+
return new MiddlewareComposer(config);
|
|
115
|
+
}
|
|
116
|
+
var MiddlewareChain = class {
|
|
117
|
+
constructor() {
|
|
118
|
+
__publicField(this, "middlewares", []);
|
|
119
|
+
}
|
|
120
|
+
use(middlewareOrMiddlewares) {
|
|
121
|
+
if (commonIs.isArray(middlewareOrMiddlewares)) {
|
|
122
|
+
this.middlewares.push(...middlewareOrMiddlewares);
|
|
123
|
+
} else {
|
|
124
|
+
this.middlewares.push(middlewareOrMiddlewares);
|
|
125
|
+
}
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 执行中间件链
|
|
130
|
+
*/
|
|
131
|
+
async execute(request, context, finalHandler) {
|
|
132
|
+
const index = 0;
|
|
133
|
+
const middlewares = this.middlewares;
|
|
134
|
+
const dispatch = async (i) => {
|
|
135
|
+
if (i >= middlewares.length) {
|
|
136
|
+
return finalHandler(request, context);
|
|
137
|
+
}
|
|
138
|
+
const middleware = middlewares[i];
|
|
139
|
+
const result = await middleware(request, context, () => dispatch(i + 1));
|
|
140
|
+
if (result instanceof Response) {
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
return dispatch(i + 1);
|
|
144
|
+
};
|
|
145
|
+
return dispatch(index);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 获取中间件数量
|
|
149
|
+
*/
|
|
150
|
+
get size() {
|
|
151
|
+
return this.middlewares.length;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 清空中间件链
|
|
155
|
+
*/
|
|
156
|
+
clear() {
|
|
157
|
+
this.middlewares = [];
|
|
158
|
+
return this;
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
function createMiddlewareChain() {
|
|
162
|
+
return new MiddlewareChain();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
exports.MiddlewareChain = MiddlewareChain;
|
|
166
|
+
exports.MiddlewareComposer = MiddlewareComposer;
|
|
167
|
+
exports.combineMiddlewares = combineMiddlewares;
|
|
168
|
+
exports.conditionalMiddleware = conditionalMiddleware;
|
|
169
|
+
exports.createComposer = createComposer;
|
|
170
|
+
exports.createContext = createContext;
|
|
171
|
+
exports.createMiddleware = createMiddleware;
|
|
172
|
+
exports.createMiddlewareChain = createMiddlewareChain;
|
|
173
|
+
exports.mergeContext = mergeContext;
|
|
174
|
+
//# sourceMappingURL=index.cjs.map
|
|
175
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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 { 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 await middleware(ctx, () => dispatch(i + 1));\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 { 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 { 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 ctx.response = await handler(request, ctx);\n });\n\n return ctx.response || new Response('未找到', { status: 404 });\n } catch (error) {\n if (this.config.throwOnError) {\n throw error;\n }\n\n ctx.response = await this.config.errorHandler(\n error instanceof Error ? error : new Error(String(error)),\n ctx,\n );\n\n return ctx.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 return finalHandler(request, context);\n }\n\n const middleware = middlewares[i];\n const result = await middleware(request, context, () => dispatch(i + 1));\n\n if (result instanceof Response) {\n return result;\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.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { isArray } from '@lytjs/common-is';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
|
+
|
|
7
|
+
// src/middleware.ts
|
|
8
|
+
function createMiddleware(fn) {
|
|
9
|
+
return fn;
|
|
10
|
+
}
|
|
11
|
+
function combineMiddlewares(...middlewares) {
|
|
12
|
+
return async (ctx, next) => {
|
|
13
|
+
const index = 0;
|
|
14
|
+
const dispatch = async (i) => {
|
|
15
|
+
if (i >= middlewares.length) {
|
|
16
|
+
return next();
|
|
17
|
+
}
|
|
18
|
+
const middleware = middlewares[i];
|
|
19
|
+
await middleware(ctx, () => dispatch(i + 1));
|
|
20
|
+
};
|
|
21
|
+
await dispatch(index);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function conditionalMiddleware(condition, middleware, fallback) {
|
|
25
|
+
return async (ctx, next) => {
|
|
26
|
+
if (condition(ctx)) {
|
|
27
|
+
return middleware(ctx, next);
|
|
28
|
+
} else if (fallback) {
|
|
29
|
+
return fallback(ctx, next);
|
|
30
|
+
}
|
|
31
|
+
return next();
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// src/context.ts
|
|
36
|
+
function createContext(request, extra) {
|
|
37
|
+
return {
|
|
38
|
+
request,
|
|
39
|
+
...extra
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function mergeContext(ctx, data) {
|
|
43
|
+
return { ...ctx, ...data };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// src/composer.ts
|
|
47
|
+
var MiddlewareComposer = class {
|
|
48
|
+
constructor(config) {
|
|
49
|
+
__publicField(this, "middlewares", []);
|
|
50
|
+
__publicField(this, "config");
|
|
51
|
+
this.config = {
|
|
52
|
+
errorHandler: (err) => new Response(`\u5185\u90E8\u670D\u52A1\u5668\u9519\u8BEF: ${err.message}`, {
|
|
53
|
+
status: 500
|
|
54
|
+
}),
|
|
55
|
+
throwOnError: false,
|
|
56
|
+
...config
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 向链中添加中间件
|
|
61
|
+
*/
|
|
62
|
+
use(middleware) {
|
|
63
|
+
this.middlewares.push(middleware);
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 添加多个中间件
|
|
68
|
+
*/
|
|
69
|
+
useMany(...middlewares) {
|
|
70
|
+
this.middlewares.push(...middlewares);
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 使用最终处理器组合中间件链
|
|
75
|
+
*/
|
|
76
|
+
compose(handler) {
|
|
77
|
+
const combined = combineMiddlewares(...this.middlewares);
|
|
78
|
+
return async (request, extra) => {
|
|
79
|
+
const ctx = createContext(request, extra);
|
|
80
|
+
try {
|
|
81
|
+
await combined(ctx, async () => {
|
|
82
|
+
ctx.response = await handler(request, ctx);
|
|
83
|
+
});
|
|
84
|
+
return ctx.response || new Response("\u672A\u627E\u5230", { status: 404 });
|
|
85
|
+
} catch (error) {
|
|
86
|
+
if (this.config.throwOnError) {
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
ctx.response = await this.config.errorHandler(
|
|
90
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
91
|
+
ctx
|
|
92
|
+
);
|
|
93
|
+
return ctx.response;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 清除所有中间件
|
|
99
|
+
*/
|
|
100
|
+
clear() {
|
|
101
|
+
this.middlewares = [];
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 获取中间件数量
|
|
106
|
+
*/
|
|
107
|
+
get count() {
|
|
108
|
+
return this.middlewares.length;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
function createComposer(config) {
|
|
112
|
+
return new MiddlewareComposer(config);
|
|
113
|
+
}
|
|
114
|
+
var MiddlewareChain = class {
|
|
115
|
+
constructor() {
|
|
116
|
+
__publicField(this, "middlewares", []);
|
|
117
|
+
}
|
|
118
|
+
use(middlewareOrMiddlewares) {
|
|
119
|
+
if (isArray(middlewareOrMiddlewares)) {
|
|
120
|
+
this.middlewares.push(...middlewareOrMiddlewares);
|
|
121
|
+
} else {
|
|
122
|
+
this.middlewares.push(middlewareOrMiddlewares);
|
|
123
|
+
}
|
|
124
|
+
return this;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 执行中间件链
|
|
128
|
+
*/
|
|
129
|
+
async execute(request, context, finalHandler) {
|
|
130
|
+
const index = 0;
|
|
131
|
+
const middlewares = this.middlewares;
|
|
132
|
+
const dispatch = async (i) => {
|
|
133
|
+
if (i >= middlewares.length) {
|
|
134
|
+
return finalHandler(request, context);
|
|
135
|
+
}
|
|
136
|
+
const middleware = middlewares[i];
|
|
137
|
+
const result = await middleware(request, context, () => dispatch(i + 1));
|
|
138
|
+
if (result instanceof Response) {
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
return dispatch(i + 1);
|
|
142
|
+
};
|
|
143
|
+
return dispatch(index);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 获取中间件数量
|
|
147
|
+
*/
|
|
148
|
+
get size() {
|
|
149
|
+
return this.middlewares.length;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 清空中间件链
|
|
153
|
+
*/
|
|
154
|
+
clear() {
|
|
155
|
+
this.middlewares = [];
|
|
156
|
+
return this;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
function createMiddlewareChain() {
|
|
160
|
+
return new MiddlewareChain();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export { MiddlewareChain, MiddlewareComposer, combineMiddlewares, conditionalMiddleware, createComposer, createContext, createMiddleware, createMiddlewareChain, mergeContext };
|
|
164
|
+
//# sourceMappingURL=index.js.map
|
|
165
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 { 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 await middleware(ctx, () => dispatch(i + 1));\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 { 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 { 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 ctx.response = await handler(request, ctx);\n });\n\n return ctx.response || new Response('未找到', { status: 404 });\n } catch (error) {\n if (this.config.throwOnError) {\n throw error;\n }\n\n ctx.response = await this.config.errorHandler(\n error instanceof Error ? error : new Error(String(error)),\n ctx,\n );\n\n return ctx.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 return finalHandler(request, context);\n }\n\n const middleware = middlewares[i];\n const result = await middleware(request, context, () => dispatch(i + 1));\n\n if (result instanceof Response) {\n return result;\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
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lytjs/middleware",
|
|
3
|
+
"version": "6.6.0",
|
|
4
|
+
"description": "LytJS Middleware Core System - Onion model middleware architecture",
|
|
5
|
+
"author": "lytjs",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.cjs",
|
|
9
|
+
"module": "./dist/index.mjs",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.mjs",
|
|
15
|
+
"require": "./dist/index.cjs"
|
|
16
|
+
},
|
|
17
|
+
"./package.json": "./package.json"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"scripts": {
|
|
26
|
+
"dev": "tsup --watch",
|
|
27
|
+
"build": "tsup",
|
|
28
|
+
"test": "vitest run",
|
|
29
|
+
"test:watch": "vitest",
|
|
30
|
+
"test:coverage": "vitest run --coverage",
|
|
31
|
+
"type-check": "tsc --noEmit",
|
|
32
|
+
"clean": "rm -rf dist node_modules .turbo"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@lytjs/common-error": "workspace:*",
|
|
36
|
+
"@lytjs/common-events": "workspace:*",
|
|
37
|
+
"@lytjs/shared-types": "workspace:*"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/node": "^22.13.10",
|
|
41
|
+
"@vitest/coverage-v8": "^3.0.7",
|
|
42
|
+
"tsup": "^8.4.0",
|
|
43
|
+
"typescript": "^5.8.2",
|
|
44
|
+
"vitest": "^3.0.7"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public",
|
|
49
|
+
"registry": "https://registry.npmjs.org/"
|
|
50
|
+
},
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "https://gitee.com/lytjs/lytjs.git",
|
|
54
|
+
"directory": "packages/ecosystem/packages/web-framework/packages/middleware"
|
|
55
|
+
},
|
|
56
|
+
"keywords": [
|
|
57
|
+
"lytjs",
|
|
58
|
+
"middleware",
|
|
59
|
+
"onion-model",
|
|
60
|
+
"web-framework"
|
|
61
|
+
],
|
|
62
|
+
"homepage": "https://gitee.com/lytjs/lytjs/tree/develop/packages/ecosystem/packages/web-framework/packages/middleware#readme",
|
|
63
|
+
"bugs": {
|
|
64
|
+
"url": "https://gitee.com/lytjs/lytjs/issues"
|
|
65
|
+
}
|
|
66
|
+
}
|