KV Store

KV est un store clé/valeur durable et restreint à l'application. C'est un store de chaînes : chaque valeur est persistée sous forme de chaîne. Les clés et les valeurs sont restreintes à l'identifiant de votre application (voir le modèle loopback dans la Présentation du SDK).

API JS

import { createSdk } from "@bext-stack/framework";

const sdk = createSdk("<app-id>");

await sdk.kv.set("greeting", { hello: "world" }, 3600); // optional TTL in seconds
const value = await sdk.kv.get<{ hello: string }>("greeting");
await sdk.kv.delete("greeting");
const keys = await sdk.kv.list("post:", 100);           // prefix + limit
Méthode Description
get<T>(key) Lire et décoder une valeur.
set(key, value, ttlSecs?) Écrire une valeur, avec expiration optionnelle après ttlSecs.
delete(key) Supprimer une clé.
list(prefix?, limit?) Lister les clés, éventuellement par préfixe et plafonnées par limit.
Astuce

Les lectures KV en cours de rendu sont court-circuitées en processus (~20 µs) — lire du KV depuis un loader ou un composant ne paie pas un aller-retour loopback complet.

Endpoints

Tous les endpoints sont en POST et restreints par X-Bext-App-Id (voir Présentation du SDK) :

Endpoint Corps Retourne
/kv/get { key } { value }
/kv/set { key, value, ttl? }
/kv/delete { key } { deleted }
/kv/list { prefix?, limit? } { keys }
/kv/entries { prefix?, limit? } clés et valeurs
curl -s http://127.0.0.1/__bext/sdk/kv/set \
  -H "X-Bext-App-Id: <app-id>" \
  -H "Content-Type: application/json" \
  -d '{"key":"greeting","value":"hi","ttl":3600}'

Sémantique

  • Store de chaînes — les valeurs sont stockées sous forme de chaînes.
  • TTL — passez ttl (secondes) à set / ttlSecs à kv.set pour faire expirer une clé.
  • Listing par préfixelist / entries acceptent un prefix et une limit.

Le piège du double encodage

Attention

Le client JS sérialise en JSON (JSON.stringify) la valeur que vous passez à set, et le serveur stocke cette chaîne. Comme une valeur peut être sérialisée plusieurs fois en chemin, une valeur stockée peut se retrouver enveloppée en JSON jusqu'à ~3×. À la lecture, le client l'« épluche » en appelant JSON.parse jusqu'à 3 fois pour récupérer la valeur d'origine.

Conséquences pratiques :

  • Faire un aller-retour via sdk.kv est sûr — le client re-parse à la lecture.
  • Si vous lisez la chaîne brute d'une autre manière (par ex. directement via /kv/entries, ou depuis un runtime différent), vous pouvez voir une valeur enveloppée en JSON une à trois fois et devrez appliquer JSON.parse vous-même le même nombre de fois.

Motif : enregistrement de job durable en KV

La Queue n'a pas de store de résultats — elle est fire-and-forget, sans statut par message. Quand vous devez suivre le résultat d'un job, superposez un enregistrement de job durable en KV :

// Store a record when you enqueue…
await sdk.kv.set(`job:${id}`, { status: "queued", submittedAt: Date.now() });

// …the worker updates it as it progresses…
await sdk.kv.set(`job:${id}`, { status: "running" });

// …and on completion or failure.
await sdk.kv.set(`job:${id}`, { status: "complete", result });

Utilisez des clés comme job:<id> avec de petits helpers submit / get / complete / fail autour d'elles. Voir Queue pour le côté enqueue, ou Tasks & Planificateur dont le task-executor suit déjà le statut pour vous.

Et ensuite

Page Ce qu'elle couvre
Cache Cache éphémère à TTL — en quoi il diffère de KV
Queue Jobs fire-and-forget ; le motif d'enregistrement de job en KV
Tasks & Planificateur Traitements longs avec statut/progression intégrés
Présentation du SDK Le SDK en loopback et l'interface BextSdk