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