Skip to content

Changelog

New updates and improvements at Cloudflare.

hero image

Additional step context and ReadableStream support now available in Workflows step.do()

Workflows now provides additional context inside step.do() callbacks and supports returning ReadableStream to handle larger step outputs.

Step context properties

The step.do() callback receives a context object with new properties alongside attempt:

  • step.name — The name passed to step.do()
  • step.count — How many times a step with that name has been invoked in this instance (1-indexed)
    • Useful when running the same step in a loop.
  • config — The resolved step configuration, including timeout and retries with defaults applied
TypeScript
type ResolvedStepConfig = {
retries: {
limit: number;
delay: WorkflowDelayDuration | number;
backoff?: "constant" | "linear" | "exponential";
};
timeout: WorkflowTimeoutDuration | number;
};
type WorkflowStepContext = {
step: {
name: string;
count: number;
};
attempt: number;
config: ResolvedStepConfig;
};

ReadableStream support in step.do()

Steps can now return a ReadableStream directly. Although non-stream step outputs are limited to 1 MiB, streamed outputs support much larger payloads.

TypeScript
const largePayload = await step.do("fetch-large-file", async () => {
const object = await env.MY_BUCKET.get("large-file.bin");
return object.body;
});

Note that streamed outputs are still considered part of the Workflow instance storage limit.