axios-miniprogram/src/core/MiddlewareManager.ts

87 lines
1.7 KiB
TypeScript
Raw Normal View History

2023-04-23 23:05:30 +08:00
import { assert } from '../helpers/error';
2023-04-25 23:02:05 +08:00
import { isFunction } from '../helpers/isTypes';
import { AxiosRequestConfig, AxiosResponse } from './Axios';
2023-04-23 23:05:30 +08:00
export interface MiddlewareNext {
(): Promise<void>;
}
2023-04-26 21:03:00 +08:00
/**
*
*/
export interface MiddlewareContext {
2023-04-26 21:03:00 +08:00
/**
*
*
*
*/
req: AxiosRequestConfig;
2023-04-26 21:03:00 +08:00
/**
*
*/
res: null | AxiosResponse;
2023-04-23 23:05:30 +08:00
}
2023-04-26 21:03:00 +08:00
/**
*
*/
export interface MiddlewareCallback {
(ctx: MiddlewareContext, next: MiddlewareNext): Promise<void>;
}
2023-04-26 21:03:00 +08:00
/**
*
*/
export default class MiddlewareManager {
/**
2023-04-26 21:03:00 +08:00
*
*/
#middlewares: MiddlewareCallback[] = [];
2023-04-25 14:28:28 +08:00
/**
2023-04-26 21:03:00 +08:00
*
*
* @param middleware
2023-04-25 14:28:28 +08:00
*/
2023-04-26 21:03:00 +08:00
use = (middleware: MiddlewareCallback) => {
2023-04-28 15:35:54 +08:00
assert(isFunction(middleware), 'middleware 不是一个 function');
2023-04-26 21:03:00 +08:00
this.#middlewares.push(middleware);
2023-04-23 23:05:30 +08:00
return this;
2023-04-25 14:28:28 +08:00
};
2023-04-23 23:05:30 +08:00
/**
2023-04-26 21:03:00 +08:00
*
*/
createContext(config: AxiosRequestConfig): MiddlewareContext {
return {
req: config,
res: null,
};
}
/**
*
*
* @param ctx
2023-04-26 21:03:00 +08:00
* @param respond
*/
run(ctx: MiddlewareContext, respond: MiddlewareCallback) {
const middlewares = [...this.#middlewares, respond];
async function next() {
await middlewares.shift()!(ctx, next);
}
return next();
}
/**
*
*
* @param enhancer
*/
2023-04-26 21:03:00 +08:00
enhanceRun(enhancer: MiddlewareManager['run']): MiddlewareManager['run'] {
return (ctx, respond) => {
return enhancer(ctx, () => this.run(ctx, respond));
};
2023-04-23 23:05:30 +08:00
}
}