import { InterfaceReceipt } from "../mainFn/interfaceReceipt"; import { Daemon, Effects } from "../types"; import { CheckResult } from "./checkFns/CheckResult"; import { ReadyReceipt } from "./ReadyProof"; import { HealthReceipt } from "./HealthReceipt"; import { Trigger } from "./trigger"; import { TriggerInput } from "./trigger/TriggerInput"; import { defaultTrigger } from "./trigger/defaultTrigger"; function readReciptOf(a: A) { return a as A & ReadyReceipt; } export function readyCheck(o: { effects: Effects; started(onTerm: () => void): null; interfaceReceipt: InterfaceReceipt; healthReceipts: Iterable; daemonReceipt: Daemon; name: string; trigger?: Trigger; fn(): Promise | CheckResult; onFirstSuccess?: () => () => Promise | unknown; }) { new Promise(async () => { const trigger = (o.trigger ?? defaultTrigger)(); let currentValue: TriggerInput = { lastResult: null, hadSuccess: false, }; for ( let res = await trigger.next(currentValue); !res.done; res = await trigger.next(currentValue) ) { try { const { status, message } = await o.fn(); if (!currentValue.hadSuccess) { await o.started(o?.onFirstSuccess ?? (() => o.daemonReceipt.term())); } await o.effects.setHealth({ name: o.name, status, message, }); currentValue.hadSuccess = true; currentValue.lastResult = "success"; } catch (_) { currentValue.lastResult = "failure"; } } }); return readReciptOf({ daemon: o.daemonReceipt, }); }