import { Context } from "./context.js"; export type Next = (i?: number) => any; export type Middleware = ( ctx: ContextT, next: Next, ) => Promise; export type ErrorMiddleware = ( err: Error, ctx: ContextT, next: Next, ) => Promise; export function compose( middleware: Middleware[], ): Middleware { return async function (ctx: T, next: Next = () => {}): Promise { async function callNext(i: number): Promise { if (i === middleware.length) { return next(); } let fn = middleware[i]; return fn(ctx, callNext.bind(null, i + 1)); } return callNext(0); }; } // error middleware. TODO: cleanup export function composeError( middleware: ErrorMiddleware[], ): ErrorMiddleware { return async function ( err: Error, ctx: T, next: Next = () => {}, ): Promise { async function callNext(i: number): Promise { if (i === middleware.length) { return next(); } const fn = middleware[i]; return fn(err, ctx, callNext.bind(null, i + 1)); } return callNext(0); }; } export function isErrorMiddlewareList( list: any[], ): list is ErrorMiddleware[] { return list.every(f => { return f.length > 2; }); }