Tasks & Planificateur
Le task-executor exécute les traitements longs hors de l'isolat de rendu — il n'y a pas de deadline de rendu et toute la concurrence d'I/O est disponible. Contrairement à la Queue, les tasks disposent d'un statut, d'une progression et de résultats intégrés. Le planificateur déclenche des traitements selon un planning cron.
Le task-executor chaud
Un processus worker est lancé à chaud et réutilisé. Vous écrivez vos tasks avec defineTask et
démarrez le worker avec startTaskWorker depuis @bext-stack/framework/task-worker :
import { defineTask, startTaskWorker } from "@bext-stack/framework/task-worker";
defineTask("generate-report", async (ctx, payload) => {
ctx.log("starting", payload);
const rows = await ctx.db.all("SELECT * FROM sales WHERE month = ?", [payload.month]);
await ctx.progress({ pct: 50 });
const url = await buildPdf(rows);
await ctx.kv.set(`report:${ctx.jobId}`, { url });
return { url }; // becomes the job's `result`
});
startTaskWorker();
Le ctx de la task
ctx étend l'intégralité de BextSdk plus des champs
propres aux tasks :
Sur ctx |
Ce que c'est |
|---|---|
ctx.kv, ctx.db, ctx.queue, … |
L'intégralité de BextSdk (tous les namespaces du SDK). |
ctx.appId |
L'identifiant de l'application propriétaire. |
ctx.jobId |
L'identifiant de ce job. |
ctx.signal |
Un AbortSignal — déclenché en cas d'annulation/timeout. |
ctx.progress(data) |
Rapporter la progression (lisible via /tasks/status). |
ctx.log(...) |
Journaliser depuis la task. |
startTaskWorker() se lie à un port loopback et affiche BEXT_TASK_READY <port> sur stdout ; le
superviseur Rust le lance avec bun run et le maintient à chaud.
Exécuter une task
Invoquez une task depuis une route (ou n'importe où sur l'hôte) avec POST /__bext/sdk/tasks/run :
curl -s http://127.0.0.1/__bext/sdk/tasks/run \
-H "X-Bext-App-Id: <app-id>" \
-H "Content-Type: application/json" \
-d '{"task":"generate-report","payload":{"month":"2026-06"}}'
# -> 202 {"jobId":"…","status":"queued"}
| Endpoint | Corps / query | Notes |
|---|---|---|
/tasks/run |
{ task, payload?, timeout_secs?, trigger? } |
202 { jobId, status: "queued" } |
/tasks/progress |
{ id, data } |
Rapporter la progression (aussi via ctx.progress). |
/tasks/status |
?id= |
Retourne l'enregistrement du job (ci-dessous). |
/tasks/list |
?limit= |
Jobs récents. |
/tasks/cancel |
{ id } |
Annuler un job (déclenche ctx.signal). |
/tasks/worker/register |
— | Enregistrer un task worker. |
/tasks/worker/unregister |
— | Supprimer un task worker. |
/tasks/status?id= retourne :
{
"id": "…", "task": "generate-report", "status": "…", "progress": {},
"result": {}, "error": null, "trigger": "…",
"createdAt": "…", "updatedAt": "…", "finishedAt": "…"
}
Le planificateur (cron)
Le planificateur enregistre des jobs récurrents. Les expressions cron sont validées — une expression
erronée retourne 400.
| Endpoint | Corps / notes |
|---|---|
/scheduler/register |
{ name, schedule|cron, kind?, command|handler_url|task, payload?, cwd?, timeout_secs?, enabled? } |
/scheduler/list |
GET |
/scheduler/cancel |
POST |
kind est déduit de ce que vous fournissez :
| Ce que vous fournissez | kind déduit |
|---|---|
task |
task-executor (exécute un defineTask) |
handler_url |
http (envoie un POST à l'URL) |
| ni l'un ni l'autre | command (exécute une commande shell) |
curl -s http://127.0.0.1/__bext/sdk/scheduler/register \
-H "X-Bext-App-Id: <app-id>" \
-H "Content-Type: application/json" \
-d '{"name":"nightly-report","cron":"0 3 * * *","task":"generate-report","payload":{"month":"current"}}'
Préférez le planificateur bext au cron système. Faites passer les traitements récurrents par le
planificateur (ou le task-executor) plutôt que par un crontab de l'hôte — il est restreint à
l'application, les expressions cron sont validées et les jobs sont visibles via /scheduler/list.
Voir Jobs planifiés.
Tasks vs queue vs planificateur — lequel utiliser
| Utilisez… | Quand |
|---|---|
| Tasks | Un traitement de longue durée que vous voulez suivre — statut, progression et résultat. Pas de deadline de rendu, toute la concurrence d'I/O. |
| Queue | Une livraison à haut volume, fire-and-forget, vers un handler public. At-least-once, pas de store de résultat. |
| Planificateur | Un traitement déclenché par le temps — cron. Déclenche une task, un handler HTTP ou une commande selon un planning. |
Et ensuite
| Page | Ce qu'elle couvre |
|---|---|
| Queue | Livraison fire-and-forget et workers |
| KV Store | Persister des résultats / enregistrements de job |
| Jobs planifiés | Exploiter les jobs cron sur la plateforme |