Skip to content

Stockage persistant : dataStorage / userDataStorage / logsStorage

Trois stockages propres à l'appli (absents en widget), persistés côté serveur. Choisis selon la granularité.

ServiceGranularitéFormeUsage
kapp.dataStorage1 par app+channelobjet mutableétat global du jeu/outil
kapp.userDataStorage1 par viewerobjet mutableprogression/inventaire d'un viewer
kapp.logsStorageliste empiléeappend-onlyhistorique (scores, événements)

kapp.dataStorage (état global)

  • await get(): Promise<Record<string, any> | null> — l'état (ou null si jamais écrit).
  • await set(data): Promise<Record<string, any>>remplace l'état complet (pas de merge).
  • await delete(): Promise<void> — efface.
js
const state = (await kapp.dataStorage.get()) ?? { rounds: 0 };
state.rounds += 1;
await kapp.dataStorage.set(state);   // relis + fusionne toi-même : set() écrase tout

kapp.userDataStorage (état par viewer)

  • await set(user_id: number, data): Promise<void> — sauvegarde l'état d'un viewer.
  • await reset(labels: string[] = []): Promise<void> — efface (tout si labels vide).
  • Plus pratique : passer par l'objet User
    • await user.getAppData(): Promise<AppDataData | null>
    • await user.setAppData(data): Promise<this> (chaînable)
js
const user = await kapp.users.get('toto');
const data = (await user.getAppData()) ?? { score: 0 };
data.score += 10;
await user.setAppData(data);

kapp.logsStorage (historique)

  • await get(count = 100): Promise<Record<string, any>[]> — les N entrées les plus récentes.
  • await add(data): Promise<void> — ajoute une entrée.
  • await clear(): Promise<void> — vide tout.
js
await kapp.logsStorage.add({ at: Date.now(), winner: user.login, points: 50 });

Pièges

  • dataStorage.set() écrase : toujours get() → muter → set().
  • userDataStorage / getAppData / setAppData lèvent AppMethodError hors contexte appli (n'existent pas en widget).
  • logsStorage est append-only : pour de l'état mutable, utilise dataStorage / userDataStorage.