import { type IActivity, type IEither, IMetric, 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').asResult(); export interface HealthChecker extends Mapper, Promise>> {} export class HealthCheckActivityImpl implements IHealthCheckActivity { constructor(private readonly check: HealthChecker) {} public checkHealth(req: ITraceable) { return req .flatMap(TraceUtil.withFunctionTrace(this.checkHealth)) .flatMap(TraceUtil.withMetricTrace(healthCheckMetric)) .flatMap((r) => r.move(HealthCheckInput.CHECK).map((input) => this.check(input))) .peek(TraceUtil.promiseify(TraceUtil.traceResultingEither(healthCheckMetric))) .map( TraceUtil.promiseify((h) => { const { status, message } = h.get().fold( () => ({ status: 500, message: 'err' }), () => ({ status: 200, message: 'ok' }), ); return new JsonResponse(req, message, { status }); }), ) .get(); } }