Table of Contents

Interface IFlowSignalStore

Namespace
FlowOrchestrator.Core.Storage
Assembly
FlowOrchestrator.Core.dll

Persistence contract for WaitForSignal step waiters: parked steps that resume only when an external signal is delivered via the dashboard signal endpoint or programmatic call.

public interface IFlowSignalStore

Remarks

Backends must guarantee atomic delivery semantics: a single signal is either persisted exactly once on the matching waiter row, or rejected as AlreadyDelivered. The in-memory backend uses TryUpdate(TKey, TValue, TValue); SQL backends use a conditional UPDATE … WHERE DeliveredAt IS NULL with row-count detection.

Methods

DeliverSignalAsync(Guid, string, string, CancellationToken)

Atomically attempts to deliver a payload to the waiter matching (runId, signalName).

ValueTask<SignalDeliveryResult> DeliverSignalAsync(Guid runId, string signalName, string payloadJson, CancellationToken ct = default)

Parameters

runId Guid

The run whose waiter should receive the payload.

signalName string

Signal name to look up.

payloadJson string

Pre-serialised JSON payload supplied by the caller.

ct CancellationToken

Cancellation token.

Returns

ValueTask<SignalDeliveryResult>

Delivered with the resolved StepKey on success; NotFound when no waiter matches; AlreadyDelivered when a payload is already recorded.

GetWaiterAsync(Guid, string, CancellationToken)

Returns the waiter for the given run + step key, or null if none is registered.

ValueTask<FlowSignalWaiter?> GetWaiterAsync(Guid runId, string stepKey, CancellationToken ct = default)

Parameters

runId Guid
stepKey string
ct CancellationToken

Returns

ValueTask<FlowSignalWaiter>

RegisterWaiterAsync(Guid, string, string, DateTimeOffset?, CancellationToken)

Registers a new waiter for runId + stepKey. Idempotent — a duplicate register on the same key updates the signal name / expiry without resetting CreatedAt.

ValueTask RegisterWaiterAsync(Guid runId, string stepKey, string signalName, DateTimeOffset? expiresAt, CancellationToken ct = default)

Parameters

runId Guid

The run that owns the parked step.

stepKey string

The step key as authored in the flow manifest.

signalName string

Logical signal name to address the waiter from the signal endpoint.

expiresAt DateTimeOffset?

Optional absolute deadline; null waits indefinitely.

ct CancellationToken

Cancellation token.

Returns

ValueTask

RemoveWaiterAsync(Guid, string, CancellationToken)

Removes the waiter row. Called by the handler when the wait is over (delivered, expired, or cancelled).

ValueTask RemoveWaiterAsync(Guid runId, string stepKey, CancellationToken ct = default)

Parameters

runId Guid
stepKey string
ct CancellationToken

Returns

ValueTask