@univ-lehavre/atlas-cache
v0.1.0
Published
Cache de flux partagé : interface unique, back-ends fichier et Postgres (ADR 0085)
Readme
@univ-lehavre/atlas-cache
Cache de flux partagé : une interface unique, deux back-ends sélectionnés à l'exécution. Acté par ADR 0085 (exécution de ADR 0040).
Interface
Un service Effect CacheStore (Context.Tag) clé-valeur :
import {
CacheStore,
selectCacheLayer,
isStale,
} from "@univ-lehavre/atlas-cache";
import { Effect } from "effect";
const program = Effect.gen(function* () {
const store = yield* CacheStore;
yield* store.set("atlas-stats", { releases: [] });
const entry = yield* store.get<{ releases: unknown[] }>("atlas-stats");
if (entry && !isStale(entry, Date.now())) return entry.data;
return null;
});
// Sélection explicite du back-end (jamais magique) :
// - une DSN `postgres://…` → back-end Postgres (CNPG du cluster, ADR 0093) ;
// - sinon → répertoire de cache fichier (local mono-instance).
Effect.runPromise(
program.pipe(Effect.scoped, Effect.provide(selectCacheLayer(resource))),
);Le store horodate chaque entrée (savedAt) — source unique du TTL, jugé via
isStale. Le payload est opaque (JSON) ; chaque consommateur range le sien sous
une clé stable.
Back-ends
- Fichier (
FileCacheLayer(dir)) : un fichier<dir>/<key>.jsonpar clé, écriture atomique (tmp +rename). Fallback local mono-instance uniquement. - Postgres (
PostgresCacheLayer(dsn)) : tableflux_cache(key, value JSONB, saved_at), UPSERT atomiqueON CONFLICT, DDL idempotente souspg_advisory_xact_lock. DSN composée desPOSTGRES_CACHE_*viadsnFromEnv(nom courtpg-rw.postgres, jamais le FQDN).
Tests
pnpm test couvre le back-end fichier et le sélecteur sans dépendance externe.
Le back-end Postgres a un test d'intégration hermétique (image PostgreSQL
épinglée par digest, self-skip si Docker est absent — ADR 0057).
