1.7 KiB
1.7 KiB
Durable Execution
Fetch https://developers.cloudflare.com/agents/api-reference/durable-execution/ for complete documentation.
Fibers let agent work survive Durable Object eviction. Progress is checkpointed to SQLite; on recovery, you decide what to do.
runFiber
export class MyAgent extends Agent<Env, State> {
async onRequest(request: Request) {
await this.runFiber("process-data", async (ctx) => {
const step1 = await fetchData();
ctx.stash({ step: 1, data: step1 });
const step2 = await transform(step1);
ctx.stash({ step: 2, result: step2 });
this.setState({ result: step2 });
});
return new Response("Started");
}
async onFiberRecovered(ctx) {
const checkpoint = ctx.stash;
if (checkpoint.step === 1) {
const step2 = await transform(checkpoint.data);
this.setState({ result: step2 });
}
}
}
Key APIs
| API | Purpose |
|---|---|
this.runFiber(name, fn) |
Start a named fiber |
ctx.stash / this.stash |
Read latest checkpoint |
ctx.stash = data |
Write checkpoint (JSON-serializable) |
onFiberRecovered(ctx) |
Called on DO restart if fiber was in-flight |
keepAlive() |
Prevent hibernation while fiber runs |
keepAliveWhile(fn) |
Keep alive for duration of async function |
Important
stashreplaces the entire checkpoint — not a merge- The lambda is NOT restored on recovery — only the stash data is. You must re-derive what to do in
onFiberRecovered - No auto-retry on throw — handle errors yourself
- For long-running pipelines with automatic retries, use Workflows instead
- Filter concurrent fibers by
ctx.nameinonFiberRecovered