Workflow
Un pipeline durable multi-étapes composé à partir des primitives file d'attente et KV.
L'état d'exécution vit dans le KV ; la file porte des pointeurs { runId, step }. Chaque livraison par le worker avance exactement
une étape et met en file la suivante (espacées de 2s), donc une exécution survit aux
redémarrages de l'isolat et chaque transition est observable. Le stepper ci-dessous
est maintenu en direct par l'interrogation d'un endpoint de statut JSON (~1,2s), avec une
notification à chaque étape & à la complétion.
Astuce
Le délai de 2s entre les étapes est intentionnel (troisième argument de queuePush). En production, utilisez-le pour espacer les appels à des API tierces avec limites de débit, ou supprimez-le pour une exécution aussi rapide que possible.
Démarrer une exécution
pipeline : validate → charge → ship → notify
Exécutions (0)
aucune exécution — démarrez-en une ci-dessus.
// src/app/api/workflow/jobs/route.ts
// A durable multi-step pipeline on top of queue + KV.
// The worker advances ONE step per delivery, then enqueues the next.
export async function POST(req) {
const { payload: { runId, step } } = await req.json();
const run = await kvGet("run:" + runId);
run.steps[step].status = "done";
if (step + 1 < STEPS.length) {
run.steps[step + 1].status = "running";
await kvSet("run:" + runId, run);
await queuePush("demo-flow", { runId, step: step + 1 }, 2); // 2s pacing
} else {
run.status = "completed";
await kvSet("run:" + runId, run);
}
return Response.json({ ok: true });
}
// src/app/api/workflow/status/route.ts — snapshot the page polls ~1.2s:
// returns { runs: Run[] }; the page re-renders steppers in place and
// toasts each transition by diffing against the previous snapshot.
setInterval(async function () {
var runs = (await (await fetch("/api/workflow/status")).json()).runs || [];
renderRuns(runs);
runs.forEach(diffAndToast); // "✓ charge", "order completed", ...
}, 1200);