Saltar al contenido principal

Referencia de API

ValiStorages

Constructor

new ValiStorages(config?: IValiStoragesConfig, cryptoInstance?: ICrypto)
ParámetroTipoDescripción
configIValiStoragesConfigConfiguración del storage (todos opcionales).
cryptoInstanceICryptoImplementación de crypto personalizada (útil para testing o DI).

Configuración (IValiStoragesConfig)

PropiedadTipoDefaultDescripción
predefinedKeystring""Frase de contraseña para derivar la clave AES.
keySizeAESAES.AES_128Tamaño de clave AES: AES_128, AES_192 o AES_256.
isEncryptbooleanfalseEncripta los valores antes de almacenarlos.
timeExpirationnumberundefinedValor de tiempo de vida del item.
timeUnitTimeUnitundefinedUnidad para timeExpiration: SECONDS, MINUTES, HOURS, DAYS.
useSessionStoragebooleanfalseUsa sessionStorage en lugar de localStorage.
prefixstring""Prefijo de namespace para aislar claves.
slidingExpirationbooleanfalseReinicia el TTL en cada lectura exitosa.
onErrorErrorHandler'throw'Estrategia de error: 'throw', 'silent' o (err, op, clave) => void.
onChange(clave, nuevoValor) => voidundefinedCallback para cambios desde otras pestañas del navegador.

Métodos de instancia

setItem<T>(clave, valor): Promise<void>

Guarda un valor. Si isEncrypt es true, el valor se encripta antes de guardar. Si hay TTL configurado, se adjunta un timestamp de expiración.

await storage.setItem('usuario', { nombre: 'Felipe' });

setItems<T>(items): Promise<void>

Guarda múltiples pares clave-valor en paralelo.

await storage.setItems({ a: 1, b: 2, c: 3 });

getItem<T>(clave): Promise<T | null>

Recupera un valor. Retorna null si la clave no existe o expiró (y la elimina). Si slidingExpiration está activo, reinicia el TTL en cada llamada exitosa.

const usuario = await storage.getItem<{ nombre: string }>('usuario');

getItems<T>(claves): Promise<Record<string, T | null>>

Recupera múltiples valores en paralelo. Las claves faltantes o expiradas retornan null.

const items = await storage.getItems<number>(['a', 'b', 'faltante']);
// → { a: 1, b: 2, faltante: null }

getAll<T>(): Promise<Record<string, T>>

Retorna todos los items no expirados del namespace actual, desencriptados.

const todos = await storage.getAll<unknown>();

getOrSet<T>(clave, factory): Promise<T>

Retorna el valor existente si se encuentra. Si no, ejecuta factory(), guarda el resultado y lo retorna. Ideal para patrones de caché.

const config = await storage.getOrSet('config', async () => {
return await obtenerConfigDesdeAPI();
});

has(clave): boolean

Verifica si una clave existe y no ha expirado. Elimina el item si expiró. No descifra el valor.

if (storage.has('token')) { /* ... */ }

removeItem(clave): void

Elimina un item por clave.

storage.removeItem('sesion');

removeExpired(): void

Recorre todas las claves del namespace y elimina los items expirados.

storage.removeExpired();

updateExpiry(clave): boolean

Reinicia el TTL de un item existente al valor configurado en timeExpiration. Retorna false si la clave no existe o no hay TTL configurado.

const actualizado = storage.updateExpiry('sesion'); // → true | false

clear(): void

  • Con prefix: elimina solo las claves del namespace actual.
  • Sin prefix: limpia todo el storage.
storage.clear();

getAllKeys(): string[]

Retorna todas las claves del namespace actual, sin el prefijo.

const claves = storage.getAllKeys(); // → ['usuario', 'token', ...]

size(): number

Retorna la cantidad de items en el namespace actual.

const cantidad = storage.size(); // → 3

destroy(): void

Elimina el listener del evento storage configurado por onChange. Llámalo cuando la instancia ya no sea necesaria (ej: unmount del componente).

storage.destroy();

Métodos estáticos

ValiStorages.isAvailable(useSessionStorage?): boolean

Retorna true si localStorage (o sessionStorage) está accesible en el entorno actual.

ValiStorages.isAvailable();       // verifica localStorage
ValiStorages.isAvailable(true); // verifica sessionStorage

createTypedStorage<Schema>(config?, cryptoInstance?)

Función factory que retorna un TypedValiStorages<Schema> — un wrapper sobre ValiStorages con claves y valores completamente tipados.

import { createTypedStorage } from 'vali-storages';

interface MiSchema {
contador: number;
etiqueta: string;
}

const storage = createTypedStorage<MiSchema>({ prefix: 'app' });
await storage.setItem('contador', 5); // ✅
await storage.setItem('contador', 'x'); // ❌ Error de TypeScript

El objeto retornado expone los mismos métodos que ValiStorages, todos tipados al Schema.


Enums

AES

AES.AES_128  // 16 bytes — 128 bits (default)
AES.AES_192 // 24 bytes — 192 bits
AES.AES_256 // 32 bytes — 256 bits

TimeUnit

TimeUnit.SECONDS  // segundos
TimeUnit.MINUTES // minutos
TimeUnit.HOURS // horas
TimeUnit.DAYS // días

Tipos exportados

ErrorHandler

type ErrorHandler =
| 'throw'
| 'silent'
| ((error: Error, operation: string, key?: string) => void);

ICrypto

Interfaz para implementaciones de crypto personalizadas (útil para testing):

interface ICrypto {
importKey(): Promise<void>;
encrypt(data: string): Promise<string>;
decrypt(data: string): Promise<string>;
}