import { Request, Response, RequestHandler } from 'express';

type TransformJson<T = unknown, R = T> = (body: T, request: Request, response: Response) => R | Promise<R>;
declare const jsonMiddleware: <T = unknown>(fn: TransformJson<T>) => RequestHandler;

type TransformEnd<T = unknown> = (request: Request, response: Response) => T | Promise<T>;
declare const endMiddleware: <T = unknown>(fn: TransformEnd<T>) => RequestHandler;

type TransformChunk = (chunk: string | Buffer, encoding: string | null, request: Request, response: Response) => void | string | Buffer | Promise<void> | Promise<string> | Promise<Buffer>;
declare const writeMiddleware: (fn: TransformChunk) => RequestHandler;

type TransformJsonp<T = unknown, R = T> = (body: T, request: Request, response: Response) => R | Promise<R>;
declare const jsonpMiddleware: <T = unknown>(fn: TransformJsonp<T>) => RequestHandler;

declare global {
    namespace Express {
        interface Response {
            __isEnd?: boolean;
        }
    }
}

export { endMiddleware, jsonMiddleware, jsonpMiddleware, writeMiddleware };
export type { TransformChunk, TransformEnd, TransformJson, TransformJsonp };
