import { Deferred, Effect } from "effect"; export interface ServerReadiness { readonly awaitServerReady: Effect.Effect; readonly markHttpListening: Effect.Effect; readonly markPushBusReady: Effect.Effect; readonly markKeybindingsReady: Effect.Effect; readonly markTerminalSubscriptionsReady: Effect.Effect; readonly markOrchestrationSubscriptionsReady: Effect.Effect; } export const makeServerReadiness = Effect.gen(function* () { const httpListening = yield* Deferred.make(); const pushBusReady = yield* Deferred.make(); const keybindingsReady = yield* Deferred.make(); const terminalSubscriptionsReady = yield* Deferred.make(); const orchestrationSubscriptionsReady = yield* Deferred.make(); const complete = (deferred: Deferred.Deferred) => Deferred.succeed(deferred, undefined).pipe(Effect.orDie); return { awaitServerReady: Effect.all([ Deferred.await(httpListening), Deferred.await(pushBusReady), Deferred.await(keybindingsReady), Deferred.await(terminalSubscriptionsReady), Deferred.await(orchestrationSubscriptionsReady), ]).pipe(Effect.asVoid), markHttpListening: complete(httpListening), markPushBusReady: complete(pushBusReady), markKeybindingsReady: complete(keybindingsReady), markTerminalSubscriptionsReady: complete(terminalSubscriptionsReady), markOrchestrationSubscriptionsReady: complete(orchestrationSubscriptionsReady), } satisfies ServerReadiness; });