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. |
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.setpour faire expirer une clé. - Listing par préfixe —
list/entriesacceptent unprefixet unelimit.
Le piège du double encodage
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.kvest 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 appliquerJSON.parsevous-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 |