summaryrefslogtreecommitdiff
path: root/server/ci.ts
diff options
context:
space:
mode:
Diffstat (limited to 'server/ci.ts')
-rw-r--r--server/ci.ts56
1 files changed, 56 insertions, 0 deletions
diff --git a/server/ci.ts b/server/ci.ts
new file mode 100644
index 0000000..e1a9ca7
--- /dev/null
+++ b/server/ci.ts
@@ -0,0 +1,56 @@
+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_server";
+
+export class CiHookServer {
+ constructor(
+ healthCheck: HealthChecker = _healthCheck,
+ jobQueuer: IJobQueuer<ITraceable<Job, ServerTrace>> = 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<PenguenoRequest, ServerTrace>) {
+ 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<Response> {
+ return PenguenoRequest.from(req)
+ .bimap(TraceUtil.withClassTrace(this))
+ .map((req) => this.route(req))
+ .get();
+ }
+}