Commit ab5a0c05 authored by nanahira's avatar nanahira

Revert "add finalHandler to ProtoMiddlewareDispatcher"

This reverts commit d85606a1.
parent e79bed21
import { import { Middleware, MiddlewareNext, MiddlewareResult } from './types';
AnyFunc,
Middleware,
MiddlewareDispatcherOptions,
MiddlewareResult,
} from './types';
import { AnyClass, ClassType } from '../types'; import { AnyClass, ClassType } from '../types';
import { DynamicMiddlewareDispatcher } from './dynamic-middleware-dispatcher'; import { DynamicMiddlewareDispatcher } from './dynamic-middleware-dispatcher';
type StripLastParam<F extends AnyFunc> = F extends ( export type ProtoMiddlewareArgs<A extends any[], T = any> = [
...args: [...infer A, any] ...args: A,
) => infer R
? (...args: A) => R
: never;
type ProtoMiddlewareArgs<F extends AnyFunc, T = any> = [
...args: Parameters<StripLastParam<F>>,
inst: T, inst: T,
]; ];
export type ProtoMiddlewareFunc<F extends AnyFunc, T = any> = ( export type ProtoMiddlewareFunc<A extends any[], T = any> = (
...args: ProtoMiddlewareArgs<F, T> ...args: ProtoMiddlewareArgs<A, T>
) => Awaited<ReturnType<F>>; ) => T;
type LastParam<F extends AnyFunc> = F extends (
...args: [...any, infer L]
) => any
? L
: never;
export class ProtoMiddlewareDispatcher< export class ProtoMiddlewareDispatcher<
F extends AnyFunc, A extends any[],
> extends DynamicMiddlewareDispatcher<ProtoMiddlewareFunc<F>> { > extends DynamicMiddlewareDispatcher<ProtoMiddlewareFunc<A>> {
constructor(
private finalHandler: F,
options: MiddlewareDispatcherOptions<ProtoMiddlewareFunc<F>> = {},
) {
super(options);
}
private middlewareProtoMap = new Map< private middlewareProtoMap = new Map<
AnyClass, AnyClass,
Middleware<ProtoMiddlewareFunc<F>>[] Middleware<ProtoMiddlewareFunc<A>>[]
>(); >();
private middlewareProtoMapPrior = new Map< private middlewareProtoMapPrior = new Map<
AnyClass, AnyClass,
Middleware<ProtoMiddlewareFunc<F>>[] Middleware<ProtoMiddlewareFunc<A>>[]
>(); >();
middleware<T extends LastParam<F>>( middleware<T>(
cls: ClassType<T>, cls: ClassType<T>,
mw: Middleware<ProtoMiddlewareFunc<F, T>>, mw: Middleware<ProtoMiddlewareFunc<A, T>>,
prior = false, prior = false,
) { ) {
const map = prior ? this.middlewareProtoMapPrior : this.middlewareProtoMap; const map = prior ? this.middlewareProtoMapPrior : this.middlewareProtoMap;
...@@ -58,9 +34,9 @@ export class ProtoMiddlewareDispatcher< ...@@ -58,9 +34,9 @@ export class ProtoMiddlewareDispatcher<
return this; return this;
} }
removeMiddleware<T extends LastParam<F>>( removeMiddleware<T>(
cls: ClassType<T>, cls: ClassType<T>,
mw: Middleware<ProtoMiddlewareFunc<F, T>>, mw: Middleware<ProtoMiddlewareFunc<A, T>>,
) { ) {
for (const map of [this.middlewareProtoMap, this.middlewareProtoMapPrior]) { for (const map of [this.middlewareProtoMap, this.middlewareProtoMapPrior]) {
const mws = map.get(cls); const mws = map.get(cls);
...@@ -74,13 +50,13 @@ export class ProtoMiddlewareDispatcher< ...@@ -74,13 +50,13 @@ export class ProtoMiddlewareDispatcher<
return this; return this;
} }
async dispatch<T extends LastParam<F>>( async dispatch<T>(
...args: ProtoMiddlewareArgs<F, T> ...args: ProtoMiddlewareArgs<A, T>
): MiddlewareResult<ProtoMiddlewareFunc<F, T>> { ): MiddlewareResult<ProtoMiddlewareFunc<A, T>> {
return super.dispatch(...args); return super.dispatch(...args);
} }
async buildMiddlewares(...args: ProtoMiddlewareArgs<F>) { async buildMiddlewares(...args: ProtoMiddlewareArgs<A>) {
// buildMiddlewares 只需要知道 inst // buildMiddlewares 只需要知道 inst
if (args.length === 0) return []; if (args.length === 0) return [];
...@@ -98,13 +74,13 @@ export class ProtoMiddlewareDispatcher< ...@@ -98,13 +74,13 @@ export class ProtoMiddlewareDispatcher<
chain.reverse(); chain.reverse();
const result: Middleware<ProtoMiddlewareFunc<F>>[] = []; const result: Middleware<ProtoMiddlewareFunc<A>>[] = [];
// 2. prior:Base → Sub // 2. prior:Base → Sub
for (const cls of chain) { for (const cls of chain) {
const mws = this.middlewareProtoMapPrior.get(cls); const mws = this.middlewareProtoMapPrior.get(cls);
if (mws) { if (mws) {
result.push(...[...mws].reverse()); result.push(...mws);
} }
} }
...@@ -118,7 +94,7 @@ export class ProtoMiddlewareDispatcher< ...@@ -118,7 +94,7 @@ export class ProtoMiddlewareDispatcher<
} }
result.push((...args) => { result.push((...args) => {
return this.finalHandler(...args.slice(0, -1)); return args[args.length - 2]; // inst
}); });
return result; return result;
......
...@@ -7,23 +7,13 @@ describe('ProtoMiddlewareDispatcher', () => { ...@@ -7,23 +7,13 @@ describe('ProtoMiddlewareDispatcher', () => {
class Sub extends Base {} class Sub extends Base {}
it('builds middlewares by prototype chain (prior: Base->Sub, normal: Sub->Base)', async () => { it('builds middlewares by prototype chain (prior: Base->Sub, normal: Sub->Base)', async () => {
const d = new ProtoMiddlewareDispatcher(async (x: number, inst: Base) => { const d = new ProtoMiddlewareDispatcher<[res: number]>();
return inst;
});
const order: string[] = []; const order: string[] = [];
d.middleware( d.middleware(
Base, Base,
async (x, inst, next) => { async (x, inst, next) => {
order.push('base:prior1'); order.push('base:prior');
return next();
},
true,
);
d.middleware(
Base,
async (x, inst, next) => {
order.push('base:prior2');
return next(); return next();
}, },
true, true,
...@@ -36,10 +26,6 @@ describe('ProtoMiddlewareDispatcher', () => { ...@@ -36,10 +26,6 @@ describe('ProtoMiddlewareDispatcher', () => {
}, },
true, true,
); );
d.middleware(Sub, async (x, inst, next) => {
order.push('sub:normalpre');
return next();
});
d.middleware(Sub, async (x, inst, next) => { d.middleware(Sub, async (x, inst, next) => {
order.push('sub:normal'); order.push('sub:normal');
expect(inst).toBeInstanceOf(Sub); expect(inst).toBeInstanceOf(Sub);
...@@ -61,10 +47,8 @@ describe('ProtoMiddlewareDispatcher', () => { ...@@ -61,10 +47,8 @@ describe('ProtoMiddlewareDispatcher', () => {
sub.value = 5; sub.value = 5;
const res = await d.dispatch(3, sub); const res = await d.dispatch(3, sub);
expect(order).toEqual([ expect(order).toEqual([
'base:prior2', 'base:prior',
'base:prior1',
'sub:prior', 'sub:prior',
'sub:normalpre',
'sub:normal', 'sub:normal',
'base:normal', 'base:normal',
]); ]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment