Skip to content
Effect 4.0 is here. One ecosystem. Zero dependencies.

WorkflowProxy unstable

RPC and HTTP API definitions for workflows.

Given one or more Workflow values, toRpcGroup creates the RPC definitions for clients and servers, while toHttpApiGroup creates HTTP POST endpoints that can be mounted in an API. Each workflow gets execute, discard, and resume operations, so callers can start a workflow or resume a suspended run by executionId without importing the workflow handler directly.

4 exports Since v4.0.0 Source

Constructors

Since v4.0.0

Derives an HttpApiGroup from a list of workflows.

Signature

declare function toHttpApiGroup<Name extends string, Workflows extends readonly [Any, Any]>(name: Name, workflows: Workflows): HttpApiGroup<Name, ConvertHttpApi<Workflows[number]>>

Example Deriving HTTP API endpoints from workflows

import { Layer, Schema } from "effect"
import { HttpApi, HttpApiBuilder } from "effect/http-api"
import { Workflow, WorkflowProxy, WorkflowProxyServer } from "effect/workflow"
const EmailWorkflow = Workflow.make("EmailWorkflow", {
payload: {
id: Schema.String,
to: Schema.String
},
idempotencyKey: ({ id }) => id
})
const myWorkflows = [EmailWorkflow] as const
// Use WorkflowProxy.toHttpApiGroup to create a `HttpApiGroup` from the
// workflows
class MyApi extends HttpApi.make("api")
.add(WorkflowProxy.toHttpApiGroup("workflows", myWorkflows))
{}
// Use WorkflowProxyServer.layerHttpApi to create a layer that implements the
// workflows HttpApiGroup
const ApiLayer = HttpApiBuilder.layer(MyApi).pipe(
Layer.provide(
WorkflowProxyServer.layerHttpApi(MyApi, "workflows", myWorkflows)
)
)
const result = [Object.keys(MyApi.groups.workflows.endpoints).length, Layer.isLayer(ApiLayer)] // => [3, true]

toRpcGroup

unstable
Since v4.0.0

Derives an RpcGroup from a list of workflows.

Signature

declare function toRpcGroup<Workflows extends readonly [Any, Any], Prefix extends string = "">(workflows: Workflows, options?: {
readonly prefix?: Prefix;
}): RpcGroup<ConvertRpcs<Workflows[number], Prefix>>

Example Deriving RPC endpoints from workflows

import { Layer, Schema } from "effect"
import { RpcServer } from "effect/rpc"
import { Workflow, WorkflowProxy, WorkflowProxyServer } from "effect/workflow"
const EmailWorkflow = Workflow.make("EmailWorkflow", {
payload: {
id: Schema.String,
to: Schema.String
},
idempotencyKey: ({ id }) => id
})
const myWorkflows = [EmailWorkflow] as const
// Use WorkflowProxy.toRpcGroup to create a `RpcGroup` from the
// workflows
class MyRpcs extends WorkflowProxy.toRpcGroup(myWorkflows) {}
// Use WorkflowProxyServer.layerRpcHandlers to create a layer that implements
// the rpc handlers
const ApiLayer = RpcServer.layer(MyRpcs).pipe(
Layer.provide(WorkflowProxyServer.layerRpcHandlers(myWorkflows))
)
const result = [MyRpcs.requests.size, Layer.isLayer(ApiLayer)] // => [3, true]

Converting

ConvertHttpApi

type unstable
Since v4.0.0

Maps each workflow to the HTTP API endpoints generated for execute, discard, and resume operations.

Signature

type ConvertHttpApi<Workflows extends Workflow.Any> = Workflows extends Workflow.Workflow<infer _Name, infer _Payload, infer _Success, infer _Error> ? HttpApiEndpoint.HttpApiEndpoint<_Name, "POST", `/${Lowercase<_Name>}`, never, never, _Payload, never, _Success, _Error> | HttpApiEndpoint.HttpApiEndpoint<`${_Name}Discard`, "POST", `/${Lowercase<_Name>}/discard`, never, never, _Payload, never, typeof Schema.String> | HttpApiEndpoint.HttpApiEndpoint<`${_Name}Resume`, "POST", `/${Lowercase<_Name>}/resume`, never, never, typeof ResumePayload> : never

ConvertRpcs

type unstable
Since v4.0.0

Maps each workflow to the RPC definitions generated for execute, discard, and resume operations.

Signature

type ConvertRpcs<Workflows extends Workflow.Any, Prefix extends string> = Workflows extends Workflow.Workflow<infer _Name, infer _Payload, infer _Success, infer _Error> ? Rpc.Rpc<`${Prefix}${_Name}`, _Payload, _Success, _Error> | Rpc.Rpc<`${Prefix}${_Name}Discard`, _Payload, typeof Schema.String> | Rpc.Rpc<`${Prefix}${_Name}Resume`, typeof ResumePayload> : never