import type { MaybePromise } from './types'; import type { Data } from './data'; import { type RepliesType, type Reply, type ReplyFrom } from './reply'; import type { Logger } from './logger'; export type MiddlewareHandler = (input: { event: any; env: Environment; logger: Logger; }) => MaybePromise; export interface Middleware { name?: string; requires?: MiddlewareList; handler: (input: { event: any; env: Environment; ctx: ExecutionContext | DurableObjectState; logger: Logger; }) => MaybePromise; replies?: RepliesType; } export type MiddlewareList = readonly [...readonly Middleware[]]; export type ExtensionFrom = MW extends Middleware ? Extension : never; export type ExtensionsFrom = MWs extends readonly [infer Current, ...infer Rest] ? ExtensionsFrom> : Accumulator; export type MiddlewareContext = { isDurableObject: true; /** * @deprecated */ state: DurableObjectState; } | { isDurableObject: false; /** * @deprecated */ ctx: ExecutionContext; }; declare class NextData = Record> { data: T; constructor(data?: T); } type NextFn = = Record>(data?: T) => NextData; export declare const next: NextFn; export declare function middleware = Record>(handler: (input: { event: Data & { reply: Reply; next: NextFn; } & MiddlewareContext; env: Environment; ctx: ExecutionContext | DurableObjectState; logger: Logger; }) => MaybePromise | Reply>): Middleware ? Extension : unknown>; export declare function middleware = Record>(options: { name?: string; requires?: Requires; replies?: Replies; }, handler: (input: { event: Data & { reply: ReplyFrom; next: NextFn; body: unknown; } & MiddlewareContext & ExtensionsFrom; env: Environment; ctx: ExecutionContext | DurableObjectState; logger: Logger; }) => MaybePromise | Reply>): Middleware ? Extension : unknown>; export {};