@@ -27,7 +27,7 @@ import {
2727import { AUTH_FAIL_MESSAGE , processOptions } from "./options" ;
2828import { WorkflowLogger } from "../logger" ;
2929import { z } from "zod" ;
30- import { WorkflowNonRetryableError } from "../error" ;
30+ import { WorkflowNonRetryableError , WorkflowRetryAfterError } from "../error" ;
3131
3232const someWork = ( input : string ) => {
3333 return `processed '${ input } '` ;
@@ -913,6 +913,41 @@ describe("serve", () => {
913913 expect ( called ) . toBeTrue ( ) ;
914914 } ) ;
915915
916+ test ( "should call qstash to retry workflow on WorkflowRetryAfterError" , async ( ) => {
917+ const request = getRequest ( WORKFLOW_ENDPOINT , "wfr-foo-3" , "my-payload" , [ ] ) ;
918+ let called = false ;
919+ const { handler : endpoint } = serve (
920+ async ( context ) => {
921+ called = true ;
922+ throw new WorkflowRetryAfterError ( "This is a retry-after error" , 30 ) ;
923+ } ,
924+ {
925+ qstashClient,
926+ receiver : undefined ,
927+ verbose : true ,
928+ }
929+ ) ;
930+
931+ await mockQStashServer ( {
932+ execute : async ( ) => {
933+ const response = await endpoint ( request ) ;
934+
935+ expect ( response . status ) . toBe ( 429 ) ;
936+ expect ( response . headers . get ( "Retry-After" ) ) . toBe ( "30" ) ;
937+
938+ const body = await response . json ( ) ;
939+ expect ( body ) . toEqual ( {
940+ error : "WorkflowRetryAfterError" ,
941+ message : "This is a retry-after error" ,
942+ stack : expect . any ( String ) ,
943+ } ) ;
944+ } ,
945+ responseFields : { body : undefined , status : 429 } ,
946+ receivesRequest : false ,
947+ } ) ;
948+ expect ( called ) . toBeTrue ( ) ;
949+ } ) ;
950+
916951 test ( "should send waitForEvent" , async ( ) => {
917952 const request = getRequest ( WORKFLOW_ENDPOINT , "wfr-bar" , "my-payload" , [ ] ) ;
918953 const { handler : endpoint } = serve (
0 commit comments