type AnyFunc = (...args: unknown) => unknown; type Gateway = (req: Request, res: Response, next: AnyFunc) => Promise; interface GatewayOptions { redirect_url: string; use_stored_sessions?: boolean; } class GatewayClass { private options: GatewayOptions; public constructor (options: GatewayOptions) { this.options = options; } private redirect (res): void { res.statusCode = 302; res.setHeader ('Location', this.options.redirect_url); res.end (); } private async authenticate (req): Promise { return false; } public async process_request (req: Request, res: Response, next: AnyFunc): Promise { if (await this.authenticate (req)) next (); else this.redirect (res); } } export default function create_gateway (options: GatewayOptions): Gateway { const g = new GatewayClass (options); return g.process_request; }