File d'attente

Une file FIFO durable avec visibilité différée, reprises automatiques et état de lettres mortes, via le SDK loopback à /__bext/sdk/queue/*. Un worker enregistré est simplement une route HTTP à laquelle bext envoie chaque message par POST — ici /api/queue/jobs, qui met le texte en majuscules & l'inverse et écrit le résultat dans le KV. Cette page interroge un endpoint de statut JSON (~1,2s) pour mettre à jour les compteurs et le tableau des résultats en place, et notifier chaque job terminé — sans rechargement.

Astuce
Un message qui dépasse maxAttempts atterrit dans la dead-letter queue (DLQ) — il ne bloque pas le reste. Consultez /__bext/sdk/queue/dead/list pour inspecter les messages morts et les rejouer avec /dead/retry.

Profondeur de la file

0
en attente
0
en cours
0
morts
0
résultats

Mettre un travail en file

Résultats traités (0)

entréesortietentativestraité

rien de traité — poussez un job ci-dessus.

src/app/api/queue/jobs/route.tsTypeScript
// src/app/api/queue/status/route.ts — JSON snapshot the page polls:
export async function GET() {
  const stats = await queueStats(APP, "demo-jobs");
  const results = await kvEntries(APP, "result:", 12);
  return Response.json({ stats, results });
}

// page client — poll every 1.2s, update DOM + toast completed jobs:
var seen = {};
setInterval(async function () {
  var d = await (await fetch("/api/queue/status")).json();
  renderStats(d.stats);
  renderResults(d.results);
  d.results.forEach(function (r) {
    if (!seen[r.id]) { seen[r.id] = true; bextToast("done: " + r.output, "success"); }
  });
}, 1200);

// pushing a job is a fetch (no reload); the next poll shows it complete:
form.addEventListener("submit", async function (ev) {
  ev.preventDefault();
  await fetch(location.pathname, {
    method: "POST",
    body: new FormData(form),
    headers: { accept: "application/json" },
  });
  bextToast("job queued", "info");
});