From b4bf9c02ea34f1f85017a56649b70da15d3b4218 Mon Sep 17 00:00:00 2001 From: vaish Date: Mon, 18 May 2026 20:13:10 +0530 Subject: [PATCH 1/4] Add Workflow step rollback option types --- types/defines/rpc.d.ts | 21 +++++++++++++++++-- .../experimental/index.d.ts | 14 +++++++++++++ .../generated-snapshot/experimental/index.ts | 14 +++++++++++++ types/generated-snapshot/latest/index.d.ts | 14 +++++++++++++ types/generated-snapshot/latest/index.ts | 14 +++++++++++++ 5 files changed, 75 insertions(+), 2 deletions(-) diff --git a/types/defines/rpc.d.ts b/types/defines/rpc.d.ts index 6dcbd72a309..175f84be062 100644 --- a/types/defines/rpc.d.ts +++ b/types/defines/rpc.d.ts @@ -326,15 +326,32 @@ declare namespace CloudflareWorkersModule { config: WorkflowStepConfig; }; + export type WorkflowRollbackContext = { + error: Error; + output: T; + stepName: string; + }; + + export type WorkflowRollbackHandler = ( + ctx: WorkflowRollbackContext + ) => Promise; + + export type WorkflowStepRollbackOptions = { + rollback?: WorkflowRollbackHandler; + rollbackConfig?: WorkflowStepConfig; + }; + export abstract class WorkflowStep { do>( name: string, - callback: (ctx: WorkflowStepContext) => Promise + callback: (ctx: WorkflowStepContext) => Promise, + rollbackOptions?: WorkflowStepRollbackOptions ): Promise; do>( name: string, config: WorkflowStepConfig, - callback: (ctx: WorkflowStepContext) => Promise + callback: (ctx: WorkflowStepContext) => Promise, + rollbackOptions?: WorkflowStepRollbackOptions ): Promise; sleep: (name: string, duration: WorkflowSleepDuration) => Promise; sleepUntil: (name: string, timestamp: Date | number) => Promise; diff --git a/types/generated-snapshot/experimental/index.d.ts b/types/generated-snapshot/experimental/index.d.ts index a24240d382e..9f863e72dfd 100755 --- a/types/generated-snapshot/experimental/index.d.ts +++ b/types/generated-snapshot/experimental/index.d.ts @@ -14420,15 +14420,29 @@ declare namespace CloudflareWorkersModule { attempt: number; config: WorkflowStepConfig; }; + export type WorkflowRollbackContext = { + error: Error; + output: T; + stepName: string; + }; + export type WorkflowRollbackHandler = ( + ctx: WorkflowRollbackContext, + ) => Promise; + export type WorkflowStepRollbackOptions = { + rollback?: WorkflowRollbackHandler; + rollbackConfig?: WorkflowStepConfig; + }; export abstract class WorkflowStep { do>( name: string, callback: (ctx: WorkflowStepContext) => Promise, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; do>( name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; sleep: (name: string, duration: WorkflowSleepDuration) => Promise; sleepUntil: (name: string, timestamp: Date | number) => Promise; diff --git a/types/generated-snapshot/experimental/index.ts b/types/generated-snapshot/experimental/index.ts index a221881cb04..8f3707e0ef6 100755 --- a/types/generated-snapshot/experimental/index.ts +++ b/types/generated-snapshot/experimental/index.ts @@ -14391,15 +14391,29 @@ export declare namespace CloudflareWorkersModule { attempt: number; config: WorkflowStepConfig; }; + export type WorkflowRollbackContext = { + error: Error; + output: T; + stepName: string; + }; + export type WorkflowRollbackHandler = ( + ctx: WorkflowRollbackContext, + ) => Promise; + export type WorkflowStepRollbackOptions = { + rollback?: WorkflowRollbackHandler; + rollbackConfig?: WorkflowStepConfig; + }; export abstract class WorkflowStep { do>( name: string, callback: (ctx: WorkflowStepContext) => Promise, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; do>( name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; sleep: (name: string, duration: WorkflowSleepDuration) => Promise; sleepUntil: (name: string, timestamp: Date | number) => Promise; diff --git a/types/generated-snapshot/latest/index.d.ts b/types/generated-snapshot/latest/index.d.ts index 989b8c88bbf..5a381f36c88 100755 --- a/types/generated-snapshot/latest/index.d.ts +++ b/types/generated-snapshot/latest/index.d.ts @@ -13752,15 +13752,29 @@ declare namespace CloudflareWorkersModule { attempt: number; config: WorkflowStepConfig; }; + export type WorkflowRollbackContext = { + error: Error; + output: T; + stepName: string; + }; + export type WorkflowRollbackHandler = ( + ctx: WorkflowRollbackContext, + ) => Promise; + export type WorkflowStepRollbackOptions = { + rollback?: WorkflowRollbackHandler; + rollbackConfig?: WorkflowStepConfig; + }; export abstract class WorkflowStep { do>( name: string, callback: (ctx: WorkflowStepContext) => Promise, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; do>( name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; sleep: (name: string, duration: WorkflowSleepDuration) => Promise; sleepUntil: (name: string, timestamp: Date | number) => Promise; diff --git a/types/generated-snapshot/latest/index.ts b/types/generated-snapshot/latest/index.ts index ed0c2cd4c74..00a9429175d 100755 --- a/types/generated-snapshot/latest/index.ts +++ b/types/generated-snapshot/latest/index.ts @@ -13723,15 +13723,29 @@ export declare namespace CloudflareWorkersModule { attempt: number; config: WorkflowStepConfig; }; + export type WorkflowRollbackContext = { + error: Error; + output: T; + stepName: string; + }; + export type WorkflowRollbackHandler = ( + ctx: WorkflowRollbackContext, + ) => Promise; + export type WorkflowStepRollbackOptions = { + rollback?: WorkflowRollbackHandler; + rollbackConfig?: WorkflowStepConfig; + }; export abstract class WorkflowStep { do>( name: string, callback: (ctx: WorkflowStepContext) => Promise, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; do>( name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; sleep: (name: string, duration: WorkflowSleepDuration) => Promise; sleepUntil: (name: string, timestamp: Date | number) => Promise; From 93a9443f7e8e6421c9e951fb9d3e9992d4d1ab00 Mon Sep 17 00:00:00 2001 From: vaish Date: Mon, 18 May 2026 20:13:11 +0530 Subject: [PATCH 2/4] Add Workflow step rollback option type tests --- types/test/types/rpc.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/types/test/types/rpc.ts b/types/test/types/rpc.ts index 6d274d52c6a..018fed23798 100644 --- a/types/test/types/rpc.ts +++ b/types/test/types/rpc.ts @@ -9,6 +9,7 @@ import { RpcTarget, WorkerEntrypoint, } from 'cloudflare:workers'; +import type {WorkflowStep} from 'cloudflare:workers'; import { expectTypeOf } from 'expect-type'; // Check `cache` export from `cloudflare:workers` has the expected type. @@ -794,3 +795,29 @@ export default >{ return new Response(); }, }; + +declare const workflowStep: WorkflowStep; + +expectTypeOf( + workflowStep.do('step with rollback', async () => 'ok', { + rollback: async (ctx) => { + expectTypeOf(ctx.error).toEqualTypeOf(); + expectTypeOf(ctx.output).toEqualTypeOf(); + expectTypeOf(ctx.stepName).toEqualTypeOf(); + }, + }) +).toMatchTypeOf>(); + +workflowStep.do( + 'configured rollback', + {retries: {limit: 0, delay: 0}}, + async () => 'ok', + { + rollback: async (ctx) => { + expectTypeOf(ctx.output).toEqualTypeOf(); + }, + rollbackConfig: {retries: {limit: 0, delay: 0}}, + } +); + +workflowStep.do('empty rollback options', async () => 'ok', {}); From 413f49e3ba8be8e0ba65c15717eb68abcd5a07c7 Mon Sep 17 00:00:00 2001 From: vaish Date: Mon, 18 May 2026 20:28:21 +0530 Subject: [PATCH 3/4] Thread Workflow rollback output types --- types/defines/rpc.d.ts | 4 ++-- types/generated-snapshot/experimental/index.d.ts | 4 ++-- types/generated-snapshot/experimental/index.ts | 4 ++-- types/generated-snapshot/latest/index.d.ts | 4 ++-- types/generated-snapshot/latest/index.ts | 4 ++-- types/test/types/rpc.ts | 8 ++++---- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/types/defines/rpc.d.ts b/types/defines/rpc.d.ts index 175f84be062..6b72050ed77 100644 --- a/types/defines/rpc.d.ts +++ b/types/defines/rpc.d.ts @@ -345,13 +345,13 @@ declare namespace CloudflareWorkersModule { do>( name: string, callback: (ctx: WorkflowStepContext) => Promise, - rollbackOptions?: WorkflowStepRollbackOptions + rollbackOptions?: WorkflowStepRollbackOptions ): Promise; do>( name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise, - rollbackOptions?: WorkflowStepRollbackOptions + rollbackOptions?: WorkflowStepRollbackOptions ): Promise; sleep: (name: string, duration: WorkflowSleepDuration) => Promise; sleepUntil: (name: string, timestamp: Date | number) => Promise; diff --git a/types/generated-snapshot/experimental/index.d.ts b/types/generated-snapshot/experimental/index.d.ts index 9f863e72dfd..ebb5903a217 100755 --- a/types/generated-snapshot/experimental/index.d.ts +++ b/types/generated-snapshot/experimental/index.d.ts @@ -14436,13 +14436,13 @@ declare namespace CloudflareWorkersModule { do>( name: string, callback: (ctx: WorkflowStepContext) => Promise, - rollbackOptions?: WorkflowStepRollbackOptions, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; do>( name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise, - rollbackOptions?: WorkflowStepRollbackOptions, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; sleep: (name: string, duration: WorkflowSleepDuration) => Promise; sleepUntil: (name: string, timestamp: Date | number) => Promise; diff --git a/types/generated-snapshot/experimental/index.ts b/types/generated-snapshot/experimental/index.ts index 8f3707e0ef6..fdfc05d7c1f 100755 --- a/types/generated-snapshot/experimental/index.ts +++ b/types/generated-snapshot/experimental/index.ts @@ -14407,13 +14407,13 @@ export declare namespace CloudflareWorkersModule { do>( name: string, callback: (ctx: WorkflowStepContext) => Promise, - rollbackOptions?: WorkflowStepRollbackOptions, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; do>( name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise, - rollbackOptions?: WorkflowStepRollbackOptions, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; sleep: (name: string, duration: WorkflowSleepDuration) => Promise; sleepUntil: (name: string, timestamp: Date | number) => Promise; diff --git a/types/generated-snapshot/latest/index.d.ts b/types/generated-snapshot/latest/index.d.ts index 5a381f36c88..d2be2a2a485 100755 --- a/types/generated-snapshot/latest/index.d.ts +++ b/types/generated-snapshot/latest/index.d.ts @@ -13768,13 +13768,13 @@ declare namespace CloudflareWorkersModule { do>( name: string, callback: (ctx: WorkflowStepContext) => Promise, - rollbackOptions?: WorkflowStepRollbackOptions, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; do>( name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise, - rollbackOptions?: WorkflowStepRollbackOptions, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; sleep: (name: string, duration: WorkflowSleepDuration) => Promise; sleepUntil: (name: string, timestamp: Date | number) => Promise; diff --git a/types/generated-snapshot/latest/index.ts b/types/generated-snapshot/latest/index.ts index 00a9429175d..f03c742bcf5 100755 --- a/types/generated-snapshot/latest/index.ts +++ b/types/generated-snapshot/latest/index.ts @@ -13739,13 +13739,13 @@ export declare namespace CloudflareWorkersModule { do>( name: string, callback: (ctx: WorkflowStepContext) => Promise, - rollbackOptions?: WorkflowStepRollbackOptions, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; do>( name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise, - rollbackOptions?: WorkflowStepRollbackOptions, + rollbackOptions?: WorkflowStepRollbackOptions, ): Promise; sleep: (name: string, duration: WorkflowSleepDuration) => Promise; sleepUntil: (name: string, timestamp: Date | number) => Promise; diff --git a/types/test/types/rpc.ts b/types/test/types/rpc.ts index 018fed23798..9cf737aeef6 100644 --- a/types/test/types/rpc.ts +++ b/types/test/types/rpc.ts @@ -799,10 +799,10 @@ export default >{ declare const workflowStep: WorkflowStep; expectTypeOf( - workflowStep.do('step with rollback', async () => 'ok', { + workflowStep.do('step with rollback', async (): Promise => 'ok', { rollback: async (ctx) => { expectTypeOf(ctx.error).toEqualTypeOf(); - expectTypeOf(ctx.output).toEqualTypeOf(); + expectTypeOf(ctx.output).toEqualTypeOf(); expectTypeOf(ctx.stepName).toEqualTypeOf(); }, }) @@ -811,10 +811,10 @@ expectTypeOf( workflowStep.do( 'configured rollback', {retries: {limit: 0, delay: 0}}, - async () => 'ok', + async (): Promise => 'ok', { rollback: async (ctx) => { - expectTypeOf(ctx.output).toEqualTypeOf(); + expectTypeOf(ctx.output).toEqualTypeOf(); }, rollbackConfig: {retries: {limit: 0, delay: 0}}, } From b1e522de09b430e95e3df26a3897e27bd15fa7ef Mon Sep 17 00:00:00 2001 From: vaish Date: Mon, 18 May 2026 22:51:54 +0530 Subject: [PATCH 4/4] Allow undefined Workflow rollback output --- types/defines/rpc.d.ts | 2 +- types/generated-snapshot/experimental/index.d.ts | 2 +- types/generated-snapshot/experimental/index.ts | 2 +- types/generated-snapshot/latest/index.d.ts | 2 +- types/generated-snapshot/latest/index.ts | 2 +- types/test/types/rpc.ts | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/types/defines/rpc.d.ts b/types/defines/rpc.d.ts index 6b72050ed77..dd08791145b 100644 --- a/types/defines/rpc.d.ts +++ b/types/defines/rpc.d.ts @@ -328,7 +328,7 @@ declare namespace CloudflareWorkersModule { export type WorkflowRollbackContext = { error: Error; - output: T; + output: T | undefined; stepName: string; }; diff --git a/types/generated-snapshot/experimental/index.d.ts b/types/generated-snapshot/experimental/index.d.ts index ebb5903a217..05a7b80f542 100755 --- a/types/generated-snapshot/experimental/index.d.ts +++ b/types/generated-snapshot/experimental/index.d.ts @@ -14422,7 +14422,7 @@ declare namespace CloudflareWorkersModule { }; export type WorkflowRollbackContext = { error: Error; - output: T; + output: T | undefined; stepName: string; }; export type WorkflowRollbackHandler = ( diff --git a/types/generated-snapshot/experimental/index.ts b/types/generated-snapshot/experimental/index.ts index fdfc05d7c1f..f8d6cf276f5 100755 --- a/types/generated-snapshot/experimental/index.ts +++ b/types/generated-snapshot/experimental/index.ts @@ -14393,7 +14393,7 @@ export declare namespace CloudflareWorkersModule { }; export type WorkflowRollbackContext = { error: Error; - output: T; + output: T | undefined; stepName: string; }; export type WorkflowRollbackHandler = ( diff --git a/types/generated-snapshot/latest/index.d.ts b/types/generated-snapshot/latest/index.d.ts index d2be2a2a485..22e027373fe 100755 --- a/types/generated-snapshot/latest/index.d.ts +++ b/types/generated-snapshot/latest/index.d.ts @@ -13754,7 +13754,7 @@ declare namespace CloudflareWorkersModule { }; export type WorkflowRollbackContext = { error: Error; - output: T; + output: T | undefined; stepName: string; }; export type WorkflowRollbackHandler = ( diff --git a/types/generated-snapshot/latest/index.ts b/types/generated-snapshot/latest/index.ts index f03c742bcf5..b1053ace589 100755 --- a/types/generated-snapshot/latest/index.ts +++ b/types/generated-snapshot/latest/index.ts @@ -13725,7 +13725,7 @@ export declare namespace CloudflareWorkersModule { }; export type WorkflowRollbackContext = { error: Error; - output: T; + output: T | undefined; stepName: string; }; export type WorkflowRollbackHandler = ( diff --git a/types/test/types/rpc.ts b/types/test/types/rpc.ts index 9cf737aeef6..01f64c490b6 100644 --- a/types/test/types/rpc.ts +++ b/types/test/types/rpc.ts @@ -802,7 +802,7 @@ expectTypeOf( workflowStep.do('step with rollback', async (): Promise => 'ok', { rollback: async (ctx) => { expectTypeOf(ctx.error).toEqualTypeOf(); - expectTypeOf(ctx.output).toEqualTypeOf(); + expectTypeOf(ctx.output).toEqualTypeOf(); expectTypeOf(ctx.stepName).toEqualTypeOf(); }, }) @@ -814,7 +814,7 @@ workflowStep.do( async (): Promise => 'ok', { rollback: async (ctx) => { - expectTypeOf(ctx.output).toEqualTypeOf(); + expectTypeOf(ctx.output).toEqualTypeOf(); }, rollbackConfig: {retries: {limit: 0, delay: 0}}, }