import { IncomingMessage, ServerResponse } from 'http';
import { UserinfoResponse } from 'openid-client';

type Session = Record<string, unknown> & {
    save: () => Promise<void>;
    destroy: () => Promise<void>;
};
type SessionGetter = (req: IncomingMessage, res: ServerResponse) => Promise<Session>;
type OIDCClientConfig = {
    serverUrl: string;
    clientId: string;
    clientSecret: string;
    scope?: string;
    clientOptions?: Record<string, unknown>;
    issuerOptions?: Record<string, unknown>;
};
type LoggerType = {
    info: (data: unknown) => void;
    error: (data: unknown) => void;
};
type OIDCCallbackData<UserInfo extends Record<string, unknown> = Record<string, never>> = {
    accessToken?: string;
    refreshToken?: string;
    idToken?: string;
    userInfo?: UserinfoResponse<UserInfo>;
};
type ErrorHandler = (err: unknown, req: IncomingMessage, res: ServerResponse, next: NextFunction) => void;
interface AbstractApp {
    get(endpoint: string, ...handlers: Array<RequestHandler | ErrorHandler>): void;
}
type MiddlewareOptions = {
    app: AbstractApp;
    apiPrefix?: string;
};
type OnAuthSuccessHandler<UserInfo extends Record<string, unknown> = Record<string, never>> = (req: IncomingMessage, res: ServerResponse, data: OIDCCallbackData<UserInfo>) => void | Promise<void>;
type OIDCMiddlewareOptions<UserInfo extends Record<string, unknown> = Record<string, never>> = {
    getSession: SessionGetter;
    oidcConfig: OIDCClientConfig;
    redirectUri: string | Array<string>;
    onAuthSuccess?: OnAuthSuccessHandler<UserInfo>;
    middlewareOptions?: MiddlewareOptions;
    onError?: ErrorHandler;
    logger?: LoggerType;
};
type NextFunction = (err?: unknown) => void;
type RequestHandler = (req: IncomingMessage, res: ServerResponse, next?: NextFunction) => void | Promise<void>;
declare class OIDCMiddleware<UserInfo extends Record<string, unknown> = Record<string, never>> {
    private static OIDC_ID_TOKEN_KEY;
    private static OIDC_ACCESS_TOKEN_KEY;
    private static OIDC_REFRESH_TOKEN_KEY;
    private static OIDC_NEXT_URL_KEY;
    private static OIDC_CHECKS_KEY;
    private static OIDC_REDIRECT_URI_KEY;
    private static CHECK_SCHEMA;
    private readonly getSession;
    private readonly client;
    private readonly logger;
    private readonly redirectUris;
    private readonly onAuthSuccess?;
    private readonly onError?;
    private readonly middlewareOptions;
    private readonly scope?;
    static getQueryParams(req: IncomingMessage): URLSearchParams;
    constructor({ getSession, oidcConfig, redirectUri, logger, onAuthSuccess, onError, middlewareOptions, }: OIDCMiddlewareOptions<UserInfo>);
    private sendError;
    getAuthHandler(): RequestHandler;
    getCallbackHandler(): RequestHandler;
    prepareMiddleware(): AbstractApp | null;
}

export { OIDCMiddleware };
