This repository has been archived on 2020-08-13. You can view files and clone it, but cannot push or open issues or pull requests.
requestor/lib/classes/Handler.ts
2020-04-09 12:29:30 +02:00

42 lines
1.4 KiB
TypeScript

import { Request, Response } from 'express';
import { http } from '@scode/consts';
import Transaction from './Transaction';
export default abstract class Handler {
private _handlers: Array<Function> = [];
private _method_handlers: Record<string, Function> = {};
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<void> {
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<void> {
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;
}