export type SessionArea = 'master' | 'tenant'; /** * Cookie de sinalização para o middleware do Next.js (Etapa 13). * * O refresh token real fica em cookie httpOnly setado pelo **backend**, * com `Path=/auth` — ou seja, só é enviado para o próprio backend, nunca * para o Next.js. O middleware roda no servidor do frontend e não tem * acesso a esse cookie (nem deveria: são origens diferentes). Por isso * existe este segundo cookie, **não sensível** (só diz "há uma sessão * ativa, tipo master/tenant"), setado pelo próprio frontend depois de um * login bem-sucedido — só para o middleware decidir bloquear/redirecionar * *antes* de renderizar a página (evita "flash" de conteúdo protegido). * * Isso é uma verificação otimista, não uma fronteira de segurança: a * autorização de verdade acontece no backend, em toda chamada de API, via * o access token real (que nunca fica em cookie, só em memória). */ const SESSION_COOKIE = 'sc_session'; const MAX_AGE_SECONDS = 30 * 24 * 60 * 60; export function setSessionCookie(area: SessionArea): void { document.cookie = `${SESSION_COOKIE}=${area}; Path=/; Max-Age=${MAX_AGE_SECONDS}; SameSite=Lax`; } export function clearSessionCookie(): void { document.cookie = `${SESSION_COOKIE}=; Path=/; Max-Age=0; SameSite=Lax`; } export function readSessionCookieValue(cookieHeader: string | undefined): SessionArea | null { if (!cookieHeader) return null; const match = cookieHeader.match(new RegExp(`${SESSION_COOKIE}=(master|tenant)`)); return (match?.[1] as SessionArea | undefined) ?? null; } export { SESSION_COOKIE };