in src/DotPulsar/Extensions/StateExtensions.cs [73:102]
public static async ValueTask<TState> OnStateChangeFrom<TState>(
this IState<TState> stateChanged,
TState state,
TimeSpan delay,
CancellationToken cancellationToken = default) where TState : notnull
{
while (true)
{
var currentState = await stateChanged.OnStateChangeFrom(state, cancellationToken).ConfigureAwait(false);
if (stateChanged.IsFinalState(currentState))
return currentState;
using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
cts.CancelAfter(delay);
try
{
currentState = await stateChanged.OnStateChangeTo(state, cts.Token).ConfigureAwait(false);
if (stateChanged.IsFinalState(currentState))
return currentState;
}
catch (OperationCanceledException)
{
if (cancellationToken.IsCancellationRequested)
throw;
return currentState;
}
}
}