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 { healthCheck as _healthCheck, type IJobHookActivity, type IJobQueuer, JobHookActivityImpl, LaminarJobQueuer, } from "@emprespresso/ci-hooks"; export class LizCIServer { constructor( healthCheck: HealthChecker = _healthCheck, jobQueuer: IJobQueuer> = new LaminarJobQueuer( getRequiredEnv("LAMINAR_URL").fold((err, val) => err ? "https://ci.liz.coffee" : val ), ), 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(this.route) .get(); } }