2023-03-23 20:09:00 +08:00
|
|
|
export interface InterceptorResolved<T = unknown> {
|
|
|
|
(value: T): T | Promise<T>;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface InterceptorRejected {
|
|
|
|
(error: unknown): unknown | Promise<unknown>;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface Interceptor<T = unknown> {
|
|
|
|
resolved: InterceptorResolved<T>;
|
|
|
|
rejected?: InterceptorRejected;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface InterceptorExecutor {
|
|
|
|
(interceptor: Interceptor): void;
|
|
|
|
}
|
|
|
|
|
|
|
|
export default class InterceptorManager<T = unknown> {
|
2023-04-06 16:00:04 +08:00
|
|
|
#id = 0;
|
2023-03-23 20:09:00 +08:00
|
|
|
|
2023-04-06 16:00:04 +08:00
|
|
|
#interceptors: AnyObject<Interceptor<T>> = {};
|
2023-03-23 20:09:00 +08:00
|
|
|
|
2023-04-06 16:00:04 +08:00
|
|
|
use(
|
2023-03-23 20:09:00 +08:00
|
|
|
resolved: InterceptorResolved<T>,
|
|
|
|
rejected?: InterceptorRejected,
|
|
|
|
): number {
|
2023-04-06 16:00:04 +08:00
|
|
|
this.#interceptors[++this.#id] = {
|
2023-03-23 20:09:00 +08:00
|
|
|
resolved,
|
|
|
|
rejected,
|
|
|
|
};
|
|
|
|
|
2023-04-06 16:00:04 +08:00
|
|
|
return this.#id;
|
2023-03-23 20:09:00 +08:00
|
|
|
}
|
|
|
|
|
2023-04-06 16:00:04 +08:00
|
|
|
eject(id: number): void {
|
|
|
|
delete this.#interceptors[id];
|
2023-03-23 20:09:00 +08:00
|
|
|
}
|
|
|
|
|
2023-04-06 16:00:04 +08:00
|
|
|
forEach(executor: InterceptorExecutor, reverse?: boolean): void {
|
|
|
|
let interceptors: Interceptor<any>[] = Object.values(this.#interceptors);
|
2023-04-05 08:40:00 +08:00
|
|
|
if (reverse) interceptors = interceptors.reverse();
|
2023-03-23 20:09:00 +08:00
|
|
|
interceptors.forEach(executor);
|
|
|
|
}
|
|
|
|
}
|