2023-05-05 10:59:37 +08:00
|
|
|
import { assert } from '../helpers/error';
|
|
|
|
import { isFunction } from '../helpers/isTypes';
|
|
|
|
import { AxiosRequestConfig, AxiosResponse } from './Axios';
|
2023-04-23 23:05:30 +08:00
|
|
|
|
|
|
|
export interface MiddlewareNext {
|
2023-05-05 10:59:37 +08:00
|
|
|
(): Promise<void>;
|
2023-04-23 23:05:30 +08:00
|
|
|
}
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
/**
|
|
|
|
* 中间件上下文
|
|
|
|
*/
|
2023-04-25 22:18:08 +08:00
|
|
|
export interface MiddlewareContext {
|
2023-05-05 10:59:37 +08:00
|
|
|
/**
|
|
|
|
* 请求体
|
|
|
|
*
|
|
|
|
* 同于请求配置
|
|
|
|
*/
|
|
|
|
req: AxiosRequestConfig;
|
|
|
|
/**
|
|
|
|
* 响应体
|
|
|
|
*/
|
|
|
|
res: null | AxiosResponse;
|
2023-04-23 23:05:30 +08:00
|
|
|
}
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
/**
|
|
|
|
* 中间件
|
|
|
|
*/
|
2023-04-25 22:18:08 +08:00
|
|
|
export interface MiddlewareCallback {
|
2023-05-05 10:59:37 +08:00
|
|
|
(ctx: MiddlewareContext, next: MiddlewareNext): Promise<void>;
|
2023-04-25 22:18:08 +08:00
|
|
|
}
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
/**
|
|
|
|
* 中间件管理器
|
|
|
|
*/
|
2023-04-25 22:18:08 +08:00
|
|
|
export default class MiddlewareManager {
|
2023-05-05 10:59:37 +08:00
|
|
|
/**
|
|
|
|
* 中间件缓存池
|
|
|
|
*/
|
|
|
|
#middlewares: MiddlewareCallback[] = [];
|
2023-04-25 11:54:10 +08:00
|
|
|
|
2023-05-05 10:59:37 +08:00
|
|
|
/**
|
|
|
|
* 注册中间件
|
|
|
|
*
|
|
|
|
* @param middleware 中间件
|
|
|
|
*/
|
|
|
|
use(middleware: MiddlewareCallback) {
|
|
|
|
assert(isFunction(middleware), 'middleware 不是一个 function');
|
|
|
|
this.#middlewares.push(middleware);
|
|
|
|
}
|
2023-04-23 23:05:30 +08:00
|
|
|
|
2023-05-05 10:59:37 +08:00
|
|
|
/**
|
|
|
|
* 创建中间件上下文
|
|
|
|
*/
|
|
|
|
createContext(config: AxiosRequestConfig): MiddlewareContext {
|
|
|
|
return {
|
|
|
|
req: config,
|
|
|
|
res: null,
|
|
|
|
};
|
|
|
|
}
|
2023-04-26 21:03:00 +08:00
|
|
|
|
2023-05-05 10:59:37 +08:00
|
|
|
/**
|
|
|
|
* 中间件执行器
|
|
|
|
*
|
|
|
|
* @param ctx 中间件上下文
|
|
|
|
* @param respond 目标函数
|
|
|
|
*/
|
|
|
|
run(ctx: MiddlewareContext, respond: MiddlewareCallback) {
|
|
|
|
const middlewares = [...this.#middlewares, respond];
|
|
|
|
async function next() {
|
|
|
|
await middlewares.shift()!(ctx, next);
|
|
|
|
}
|
|
|
|
return next();
|
|
|
|
}
|
2023-04-26 21:03:00 +08:00
|
|
|
|
2023-05-05 10:59:37 +08:00
|
|
|
/**
|
|
|
|
* 强化中间件执行器
|
|
|
|
*
|
|
|
|
* @param enhancer 强化器
|
|
|
|
*/
|
|
|
|
enhanceRun(enhancer: MiddlewareManager['run']): MiddlewareManager['run'] {
|
|
|
|
return (ctx, respond) => {
|
|
|
|
return enhancer(ctx, () => this.run(ctx, respond));
|
|
|
|
};
|
|
|
|
}
|
2023-04-23 23:05:30 +08:00
|
|
|
}
|