1 import express, { Request, Response } from 'express';
2 import { join } from 'path';
3 import { isString } from 'lodash';
4 import { HttpError } from '../errors';
5 import { merge } from 'lodash';
6 import bodyParser from 'body-parser';
7 import { ExpressAdapter } from '@bull-board/express';
16 export type HttpHandler<I, O> = (params: I & AuthInfo, rawReq: Request, rawRes: Response) => Promise<O>;
18 export class HttpServer {
19 server: express.Application;
20 port: string | number;
21 bullAdapter: ExpressAdapter;
22 constructor(port: string | number) {
24 this.bullAdapter = new ExpressAdapter()
25 this.server = express();
26 this.configureMiddleWare();
29 configureMiddleWare() {
30 this.server.use(express.json());
31 this.server.use(bodyParser());
32 this.server.use(express.static(join(__dirname, '..', '..', 'public')));
34 this.bullAdapter.setBasePath('/admin/queues');
35 this.server.use('/admin/queues', this.bullAdapter.getRouter());
38 wrap<I, O>(handler: HttpHandler<I, O>, hxEvents: string) {
39 return async function (req: Request, res: Response) {
41 const start = Date.now();
42 console.log(`Req: ${req.method.toUpperCase()} ${req.path}`);
44 // extract hx game vars (token, id);
45 let url = new URL('http://localhost.com?id=null&token=null');
47 url = new URL(req.headers['hx-current-url'].toString());
54 token: url.searchParams.get('token'),
55 accountId: url.searchParams.get('id')
59 const output: O = await handler(merge(req, headerData) as unknown as (I & AuthInfo), req, res);
60 console.log(`Runtime: ${Date.now() - start}ms`);
62 res.setHeader('hx-trigger', hxEvents);
63 if(output === undefined) {
66 else if(isString(output)) {
75 //res.statusCode = (e as HttpError).statusCode || 500;
77 <div class="alert danger">${e.message}</div>
86 get<I, O>(endpoint: string, handler: HttpHandler<I, O>, hxEvents: string = ''): void {
87 console.log(`Mapped GET ${endpoint}`);
88 this.server.get(endpoint, this.wrap(handler, hxEvents));
91 post<I, O>(endpoint: string, handler: HttpHandler<I, O>, hxEvents: string = ''): void {
92 console.log(`Mapped POST ${endpoint}`);
93 this.server.post(endpoint, this.wrap(handler, hxEvents));
96 start(fn?: any): void {
97 console.log(`Listening on port ${this.port}`);
98 this.server.listen(this.port, fn?.bind(this));