From 5fc746cd8c426eb5530ee8276a088fda46e2d06b Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Thu, 11 Dec 2025 10:41:49 +0100 Subject: [PATCH 1/2] Add interrupt to workflow proxy and server --- packages/workflow/src/WorkflowProxy.ts | 23 ++++++++++++++++++- packages/workflow/src/WorkflowProxyServer.ts | 24 +++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/packages/workflow/src/WorkflowProxy.ts b/packages/workflow/src/WorkflowProxy.ts index e3bd027a048..3767dc8a4e3 100644 --- a/packages/workflow/src/WorkflowProxy.ts +++ b/packages/workflow/src/WorkflowProxy.ts @@ -64,7 +64,10 @@ export const toRpcGroup = < payload: workflow.payloadSchema }).annotateContext(workflow.annotations), Rpc.make(`${prefix}${workflow.name}Resume`, { payload: ResumePayload }) - .annotateContext(workflow.annotations) + .annotateContext(workflow.annotations), + Rpc.make(`${prefix}${workflow.name}Interrupt`, { + payload: InterruptPayload + }).annotateContext(workflow.annotations) ) } return RpcGroup.make(...rpcs) as any @@ -82,6 +85,7 @@ export type ConvertRpcs = | Rpc.Rpc<`${Prefix}${_Name}`, _Payload, _Success, _Error> | Rpc.Rpc<`${Prefix}${_Name}Discard`, _Payload> | Rpc.Rpc<`${Prefix}${_Name}Resume`, typeof ResumePayload> + | Rpc.Rpc<`${Prefix}${_Name}Interrupt`, typeof InterruptPayload> : never /** @@ -140,6 +144,10 @@ export const toHttpApiGroup = = Workflows extends W void, never, typeof ResumePayload.Context + > + | HttpApiEndpoint.HttpApiEndpoint< + `${_Name}Interrupt`, + "POST", + never, + never, + typeof InterruptPayload.Type, + never, + void, + never, + typeof InterruptPayload.Context > : never const ResumePayload = Schema.Struct({ executionId: Schema.String }) + +const InterruptPayload = Schema.Struct({ executionId: Schema.String }) diff --git a/packages/workflow/src/WorkflowProxyServer.ts b/packages/workflow/src/WorkflowProxyServer.ts index c3088705317..ce14287aadd 100644 --- a/packages/workflow/src/WorkflowProxyServer.ts +++ b/packages/workflow/src/WorkflowProxyServer.ts @@ -73,6 +73,17 @@ export const layerHttpApi = < }) ) ) + .handle( + workflow.name + "Interrupt" as any, + ({ payload }: { payload: any }) => + workflow.interrupt(payload.executionId).pipe( + Effect.tapDefect(Effect.logError), + Effect.annotateLogs({ + module: "WorkflowProxyServer", + method: workflow.name + "Interrupt" + }) + ) + ) } return handlers as HttpApiBuilder.Handlers }) @@ -101,9 +112,11 @@ export const layerRpcHandlers = < const tag = `${prefix}${workflow.name}` const tagDiscard = `${tag}Discard` const tagResume = `${tag}Resume` + const tagInterrupt = `${tag}Interrupt` const key = `@effect/rpc/Rpc/${tag}` const keyDiscard = `${key}Discard` const keyResume = `${key}Resume` + const keyInterrupt = `${key}Interrupt` handlers.set(key, { context, tag, @@ -119,6 +132,11 @@ export const layerRpcHandlers = < tag: tagResume, handler: (payload: any) => workflow.resume(payload.executionId) as any } as any) + handlers.set(keyInterrupt, { + context, + tag: tagInterrupt, + handler: (payload: any) => workflow.interrupt(payload.executionId) as any + } as any) } return Context.unsafeMake(handlers) })) @@ -131,5 +149,9 @@ export type RpcHandlers = infer _Payload, infer _Success, infer _Error -> ? Rpc.Handler<`${Prefix}${_Name}`> | Rpc.Handler<`${Prefix}${_Name}Discard`> | Rpc.Handler<`${Prefix}${_Name}Resume`> +> ? + | Rpc.Handler<`${Prefix}${_Name}`> + | Rpc.Handler<`${Prefix}${_Name}Discard`> + | Rpc.Handler<`${Prefix}${_Name}Resume`> + | Rpc.Handler<`${Prefix}${_Name}Interrupt`> : never From 9fc932b98d47e8e33893cc166a21d03535ca4066 Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Thu, 11 Dec 2025 10:45:18 +0100 Subject: [PATCH 2/2] Add changeset --- .changeset/chubby-keys-decide.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/chubby-keys-decide.md diff --git a/.changeset/chubby-keys-decide.md b/.changeset/chubby-keys-decide.md new file mode 100644 index 00000000000..404887b9f07 --- /dev/null +++ b/.changeset/chubby-keys-decide.md @@ -0,0 +1,5 @@ +--- +"@effect/workflow": minor +--- + +Expose interrupt method to proxy