import { Effect, Fiber, Semaphore } from "effect"; export type OAuthLoopbackLifecycle = { start: (effect: Effect.Effect) => Effect.Effect; cancel: ( invalidation: Effect.Effect, close: Effect.Effect, ) => Effect.Effect; }; export function createOAuthLoopbackLifecycle(): OAuthLoopbackLifecycle { const semaphore = Semaphore.makeUnsafe(1); return { start: (effect) => semaphore.withPermit(effect), cancel: (invalidation, close) => Effect.suspend(() => { const invalidationFiber = Effect.runFork(invalidation); return semaphore.withPermit( close.pipe(Effect.andThen(invalidation), Effect.andThen(Fiber.join(invalidationFiber))), ); }), }; }