import { FourOhFourActivityImpl, getRequiredEnv, HealthCheckActivityImpl, type HealthChecker, type IFourOhFourActivity, type IHealthCheckActivity, type ITraceable, PenguenoRequest, type ServerTrace, TraceUtil, } from '@emprespresso/pengueno'; import type { Job } from '@emprespresso/ci_model'; import { type IJobHookActivity, type IJobQueuer, JobHookActivityImpl, LaminarJobQueuer } from './job'; import { healthCheck as _healthCheck } from '.'; export const DEFAULT_CI_SERVER = 'https://ci.liz.coffee'; export class CiHookServer { constructor( healthCheck: HealthChecker = _healthCheck, jobQueuer: IJobQueuer> = new LaminarJobQueuer( getRequiredEnv('LAMINAR_URL').fold(({ isLeft, value }) => (isLeft ? DEFAULT_CI_SERVER : value)), ), private readonly healthCheckActivity: IHealthCheckActivity = new HealthCheckActivityImpl(healthCheck), private readonly jobHookActivity: IJobHookActivity = new JobHookActivityImpl(jobQueuer), private readonly fourOhFourActivity: IFourOhFourActivity = new FourOhFourActivityImpl(), ) {} private route(req: ITraceable) { const url = new URL(req.get().url); if (url.pathname === '/health') { return this.healthCheckActivity.checkHealth(req); } if (url.pathname === '/job') { return this.jobHookActivity.processHook(req); } return this.fourOhFourActivity.fourOhFour(req); } public serve(req: Request): Promise { return PenguenoRequest.from(req) .bimap(TraceUtil.withClassTrace(this)) .map((req) => this.route(req)) .get(); } }