import { Awaitable } from '../types'; export type AnyFunc = (...args: any[]) => any; export type MiddlewareValue = Awaited>; export type MiddlewareResult = Promise>; type StaircaseParams = A extends [] ? [] : A extends [...infer Rest, any] ? A | StaircaseParams : never; export type MiddlewareNextArgs = StaircaseParams> | []; export type MiddlewareNext = (...args: MiddlewareNextArgs) => MiddlewareResult; export type MiddlewareArgs = [ ...args: Parameters, next: MiddlewareNext ]; export type MiddlewareReturn = Awaitable>; export type Middleware = (...args: MiddlewareArgs) => MiddlewareReturn; export type MiddlewareAcceptResult = (s: MiddlewareValue) => Awaitable; export type MiddlewareErrorHandler = (e: any, args: Parameters, next: MiddlewareNext) => Awaitable>; export interface MiddlewareDispatcherOptions { acceptResult?: MiddlewareAcceptResult; errorHandler?: MiddlewareErrorHandler; } export {};