import { controlRequest, cookiePairFor, fetchWorker } from "@tests/worker/helpers/http"; export interface OidcLoginResult { loginResponse: Response; authorizationUrl: URL; callbackUrl: URL; callbackResponse: Response; sessionCookie: string; transactionCookie: string; } async function requiredHeader(response: Response, name: string): Promise { const value = response.headers.get(name); if (!value) { throw new Error(`Missing ${name} header on ${response.status}: ${await response.clone().text()}`); } return value; } export async function startOidcLogin(returnTo = "/"): Promise<{ loginResponse: Response; authorizationUrl: URL; transactionCookie: string; }> { const loginResponse = await fetchWorker( controlRequest(`/api/v1/auth/oidc/login?return_to=${encodeURIComponent(returnTo)}`, { redirect: "manual" }), ); const authorizationUrl = new URL(await requiredHeader(loginResponse, "location")); return { loginResponse, authorizationUrl, transactionCookie: cookiePairFor(loginResponse, "__Host-dab_oidc_tx"), }; } export async function completeOidcLogin(returnTo = "/"): Promise { const { loginResponse, authorizationUrl, transactionCookie } = await startOidcLogin(returnTo); const providerResponse = await fetch(authorizationUrl, { redirect: "manual" }); const callbackUrl = new URL(await requiredHeader(providerResponse, "location")); const callbackResponse = await fetchWorker( controlRequest(callbackUrl.toString(), { headers: { accept: "application/json", cookie: transactionCookie, }, }), ); return { loginResponse, authorizationUrl, callbackUrl, callbackResponse, sessionCookie: cookiePairFor(callbackResponse, "__Host-dab_session"), transactionCookie, }; }