import { ExportedHandlerFetchHandler, PagesFunction, ExecutionContext, EventContext } from '@cloudflare/workers-types';
import { UniversalFn, UniversalHandler, contextSymbol, UniversalMiddleware, Get, RuntimeAdapter, EnhancedMiddleware } from '@universal-middleware/core';

type CloudflareHandler<In extends Universal.Context> = {
    fetch: UniversalFn<UniversalHandler<In>, ExportedHandlerFetchHandler<{
        [contextSymbol]: In;
    }>>;
};
type CloudflarePagesFunction<In extends Universal.Context, Out extends Universal.Context> = UniversalFn<UniversalMiddleware<In, Out>, PagesFunction<{
    [contextSymbol]: In;
}>>;
/**
 * Creates a request handler for Cloudflare Worker. Should be used as dist/_worker.js
 */
declare function createHandler<T extends unknown[], InContext extends Universal.Context>(handlerFactory: Get<T, UniversalHandler<InContext>>): Get<T, CloudflareHandler<InContext>>;
/**
 * Creates a function handler for Cloudflare Pages
 */
declare function createPagesFunction<T extends unknown[], InContext extends Universal.Context, OutContext extends Universal.Context>(middlewareFactory: Get<T, UniversalHandler<InContext>>): Get<T, CloudflarePagesFunction<InContext, OutContext>>;
declare function createPagesFunction<T extends unknown[], InContext extends Universal.Context, OutContext extends Universal.Context>(middlewareFactory: Get<T, UniversalMiddleware<InContext, OutContext>>): Get<T, CloudflarePagesFunction<InContext, OutContext>>;
declare function getContext<Context extends Universal.Context = Universal.Context>(env: {
    [contextSymbol]: Context;
}): Context;
declare function getRuntime(env: unknown, ctx: ExecutionContext): RuntimeAdapter;
declare function getRuntime(context: EventContext<unknown, string, unknown>): RuntimeAdapter;

type EnhancedMiddlewareCloudflare = EnhancedMiddleware | EnhancedMiddleware<Universal.Context, Universal.Context, "cloudflare-worker">;
declare function apply(middlewares: EnhancedMiddlewareCloudflare[]): CloudflareHandler<Universal.Context>;

export { type CloudflareHandler, type CloudflarePagesFunction, apply, createHandler, createPagesFunction, getContext, getRuntime };
