WebStorageCacheStrategy
Cosa fa
WebStorageCacheStrategy e una classe astratta che incapsula la logica condivisa tra LocalStorageCacheStrategy e SessionStorageCacheStrategy. Le due classi concrete differiscono solo per:
- Tipo di
Storageiniettato (localStoragevssessionStorage) - Discriminator
type(LOCALSTORAGEvsSESSIONSTORAGE) - Implementazione di
isPersistent()(truevsfalse) - Prefix default
Tutto il resto della logica e qui.
CacheStrategyFactory. Questa pagina e documentazione di riferimento per chi vuole capire il comportamento condiviso o estenderlo (es. cifratura, compressione, storage custom).Costruttore (protected)
abstract class WebStorageCacheStrategy implements ICacheStrategy {
abstract readonly type: CacheStrategyType
protected constructor(storage: Storage, prefix: string)
abstract isPersistent(): boolean
}
| Parametro | Tipo | Descrizione |
|---|---|---|
storage | Storage | localStorage o sessionStorage (interfaccia Web Storage API) |
prefix | string | Prefisso usato per evitare collisioni con altre chiavi dell'app |
Le sottoclassi devono dichiarare:
readonly type: CacheStrategyTypeisPersistent(): boolean
Logica condivisa
Prefix scoping
Tutte le chiavi sono prefissate. Le query rispettano questo prefix:
private getKey(key: string): string {
return `${this.prefix}${key}`
}
getAllKeys() itera storage.length e filtra per key.startsWith(this.prefix), restituendo i nomi senza prefix.
Schema entry
interface CacheItem<T> {
data: T
timestamp: number
expiry: number | null
}
Serializzato con JSON.stringify in scrittura, JSON.parse in lettura.
Quota handling
async setItem<T>(key: string, value: T, ttl?: number): Promise<void> {
try {
this.storage.setItem(this.getKey(key), JSON.stringify(item))
} catch (error) {
if ((error as Error).name === 'QuotaExceededError') {
await this.cleanExpired()
try {
this.storage.setItem(this.getKey(key), JSON.stringify(item))
} catch {
console.warn(`${this.type} quota exceeded, cache item not saved`)
}
}
}
}
In caso di QuotaExceededError:
- Esegue
cleanExpired()per liberare spazio - Ritenta la
setItem - Se anche il retry fallisce, silenzia l'errore con
console.warn(la mancata persistenza non deve far fallire la request applicativa)
Recupero robusto
getItem gestisce due edge case:
- Entry scaduta →
removeItem+ ritornonull - Entry corrotta (JSON non parsabile) →
removeItem+ ritornonull
cleanExpired rimuove anche le entry corrotte (defensive cleanup).
API ereditata
Tutti i metodi di ICacheStrategy sono implementati nella classe base:
setItem,getItem,removeItemclear(prefix?)— filtra ulteriormente le chiavi del prefix interno perkeyPrefixse passatohasItem,getAllValues,getAllKeyscleanExpired,getStatssupportsTTL()→true(Web Storage supporta TTL via timestamp + expiry serializzati)
Estendere la classe
Esempio: strategy con compressione LZ-string sopra localStorage.
import { WebStorageCacheStrategy } from '@pzeta/postgrest'
import { CacheStrategyType } from '@pzeta/postgrest'
class CompressedLocalStorageStrategy extends WebStorageCacheStrategy {
readonly type = CacheStrategyType.LOCALSTORAGE
constructor() {
super(localStorage, 'pzeta_compressed_')
}
isPersistent() {
return true
}
// ... override setItem/getItem con compressione
}
Vedi anche
SessionStorageCacheStrategy
Strategia di cache basata su sessionStorage. ~5-10MB, persistente solo durante la sessione del tab. Isolata per tab del browser.
Logging & Utils
Logger configurabili (ConsoleLogger, NullLogger) per iniettare il logging della libreria e FilterUtils — utility statiche per convertire FilterCriteria type-safe nella sintassi query PostgREST.