axios-miniprogram/src/core/MiddlewareManager.ts

55 lines
1.2 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>;
}
export interface MiddlewareContext {
req: AxiosRequestConfig;
res: null | AxiosResponse;
2023-04-23 23:05:30 +08:00
}
export interface MiddlewareCallback {
(ctx: MiddlewareContext, next: MiddlewareNext): Promise<void>;
}
export interface MiddlewareUse {
2023-04-25 14:28:28 +08:00
/**
*
*
* @param callback
*/
(callback: MiddlewareCallback): MiddlewareManager;
2023-04-23 23:05:30 +08:00
}
export default class MiddlewareManager {
/**
*
*/
#middlewares: MiddlewareCallback[] = [];
2023-04-25 14:28:28 +08:00
/**
*
*/
use: MiddlewareUse = (callback: MiddlewareCallback) => {
assert(isFunction(callback), 'callback 不是一个 function');
this.#middlewares.push(callback!);
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
/**
*
*
* @param ctx
* @param flush
*/
wrap(ctx: MiddlewareContext, flush: MiddlewareNext) {
const runners = [...this.#middlewares, flush];
2023-04-25 14:28:28 +08:00
return (function next(): Promise<void> {
return runners.shift()!(ctx, next);
2023-04-25 14:28:28 +08:00
})();
2023-04-23 23:05:30 +08:00
}
}