diff options
Diffstat (limited to 'lib/server/activity/health.ts')
-rw-r--r-- | lib/server/activity/health.ts | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/server/activity/health.ts b/lib/server/activity/health.ts new file mode 100644 index 0000000..9396490 --- /dev/null +++ b/lib/server/activity/health.ts @@ -0,0 +1,49 @@ +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<ITraceable<HealthCheckInput, ServerTrace>, Promise<IEither<Error, HealthCheckOutput>>> {} +export class HealthCheckActivityImpl implements IHealthCheckActivity { + constructor(private readonly check: HealthChecker) {} + + public checkHealth(req: ITraceable<PenguenoRequest, ServerTrace>) { + 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(); + } +} |