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))),
);
}),
};
}