import { type IActivity, type IEither, type ITraceable, JsonResponse, LogLevel, type Mapper, Metric, type PenguenoRequest, type ServerTrace, TraceUtil, } from "@emprespresso/pengueno"; export enum HealthCheckInput { CHECK, } export enum HealthCheckOutput { YAASSSLAYQUEEN, } export interface IHealthCheckActivity { checkHealth: IActivity; } const healthCheckMetric = Metric.fromName("Health"); export interface HealthChecker extends Mapper< ITraceable, Promise> > {} export class HealthCheckActivityImpl implements IHealthCheckActivity { constructor(private readonly check: HealthChecker) {} public checkHealth(req: ITraceable) { return req .bimap(TraceUtil.withFunctionTrace(this.checkHealth)) .bimap(TraceUtil.withMetricTrace(healthCheckMetric)) .flatMap((r) => r.move(HealthCheckInput.CHECK).map(this.check)) .peek( TraceUtil.promiseify((h) => h.get().fold((err) => { if (err) { h.trace.trace(healthCheckMetric.failure); h.trace.addTrace(LogLevel.ERROR).trace(`${err}`); return; } h.trace.trace(healthCheckMetric.success); }), ), ) .map( TraceUtil.promiseify((h) => h .get() .mapBoth( () => "oh no, i need to eat more vegetables (。•́︿•̀。)...", () => "think im healthy!! (✿˘◡˘) ready to do work~", ) .fold( (errMsg, okMsg) => new JsonResponse(req, errMsg ?? okMsg, { status: errMsg ? 500 : 200, }), ), ), ) .get(); } }