import { Request, Response } from 'express'; import { http } from '@scode/consts'; import Transaction from './Transaction'; export default abstract class Handler { private _handlers: Array = []; private _method_handlers: Record = {}; protected register_handler (f: Function, method?: string): void { if (typeof method === 'undefined') { this._handlers.push (f); } else { const m = method.toUpperCase (); if (typeof this._method_handlers[m] !== 'undefined') throw new Error (`Handler for ${m} already registered`); this._method_handlers[m] = f; } } private async run_method_handler ( method: string, t: Transaction ): Promise { const m = method.toUpperCase (); if (typeof this._method_handlers[m] !== 'undefined') await this._method_handlers[m] (t); } public async run_http_handler (req: Request, res: Response): Promise { const t = new Transaction (req, res); for (const handler of this._handlers) { // eslint-disable-next-line no-await-in-loop if (await handler (t) === false) { if (!t.has_status) t.status = http.status_internal_server_error; t.finalize (); return; } } await this.run_method_handler ('ALL', t); await this.run_method_handler (t.req.method, t); } public abstract get path(): string; }