import { StoredAuthState, GetPermissionsResponse, ValtechAuthConfig } from './types'; import * as i0 from "@angular/core"; /** * Nombre por defecto de la cookie-hint de sesión de familia (espejo JS-readable * del refresh token HttpOnly). Debe coincidir con `HintCookieName` del backend * (`backend/go/services/httpapi/hint_cookie.go`). Override por app vía * `ValtechAuthConfig.loggedInHintCookie`. */ export declare const LOGGED_IN_HINT_COOKIE = "valtech_logged_in"; /** * Servicio para persistencia de estado de autenticación en localStorage. */ export declare class AuthStorageService { private config; private keys; private readonly isBrowser; /** * H-05: modo cookie-only del refresh token. `true` cuando el frontend y la API * comparten site (mismo registrable domain) → la cookie HttpOnly es * first-party y confiable → NO se persiste el refresh en localStorage (un XSS * no puede robarlo). `false` en cross-site (dev `.web.app` vs `.myvaltech.com`) * donde los browsers bloquean la cookie de terceros (Safari ITP, Chrome * 3rd-party phase-out) → fallback transition-safe (refresh en localStorage). */ readonly cookieOnly: boolean; constructor(config: ValtechAuthConfig | null, platformId: Object); /** Same-site check: frontend host vs API host comparten registrable domain. */ private computeCookieOnly; /** * ¿Existe la cookie-hint JS-readable de "sesión activa en la familia"? * * La setea el backend en login/logout (`HttpOnly:false`, `Domain=.myvaltech.com`) * como espejo legible por JS del refresh token HttpOnly (`valtech_refresh`), que * JS no puede leer. Es un hint de UI, no una credencial. Lo usan `initialize()` * (bootstrap cross-origin, gated por `bootstrapSessionFromHint`) y el sitio * público para decidir landing-vs-app sin exponer el token. */ hasLoggedInHint(cookieName?: string): boolean; /** * Guarda la organización activa de esta pestaña/instancia. * * Los tokens viven en localStorage y se comparten entre pestañas. La org activa * es contexto de navegación, por lo que se guarda primero en sessionStorage: * así una pestaña en otra org no pisa el contexto actual al refrescar tokens. * * También mantenemos una copia en localStorage como "org preferida" para * sobrevivir reloads agresivos de PWA/app updates donde sessionStorage puede * desaparecer antes del siguiente /refresh. */ saveActiveOrg(orgId: string | null, options?: { persistPreferred?: boolean; }): void; /** * Obtiene la organización activa de esta pestaña/instancia. Si la pestaña no * conserva sessionStorage, cae a la última org elegida explícitamente. */ getActiveOrg(): string | null; /** * Guarda el estado completo de autenticación. */ saveState(state: StoredAuthState): void; /** * Carga el estado de autenticación desde storage. */ loadState(): Partial; /** * Guarda solo el access token. */ saveAccessToken(token: string, expiresAt?: number): void; /** * Guarda el refresh token (token rotation). */ saveRefreshToken(token: string): void; /** * Guarda los permisos actualizados. */ savePermissions(response: GetPermissionsResponse): void; /** * Carga los permisos desde storage. */ loadPermissions(): { roles: string[]; permissions: string[]; isSuperAdmin: boolean; }; /** * Obtiene el refresh token. */ getRefreshToken(): string | null; /** * Limpia todo el estado de autenticación. */ clear(): void; /** * Verifica si hay estado guardado. */ hasStoredState(): boolean; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵprov: i0.ɵɵInjectableDeclaration; }