private ViewState ReplayStarted(bool shouldAwait)
{
return new ViewState("replay started", true, (receive, message) =>
{
if (message is ReplayedMessage)
{
var replayedMessage = (ReplayedMessage)message;
try
{
UpdateLastSequenceNr(replayedMessage.Persistent);
base.AroundReceive(receive, replayedMessage.Persistent.Payload);
}
catch (Exception ex)
{
ChangeState(IgnoreRemainingReplay(ex));
}
}
else if (message is RecoverySuccess)
{
OnReplayComplete();
}
else if (message is ReplayMessagesFailure)
{
var replayFailureMessage = (ReplayMessagesFailure)message;
try
{
OnReplayError(replayFailureMessage.Cause);
}
finally
{
OnReplayComplete();
}
}
else if (message is ScheduledUpdate)
{
// ignore
}
else if (message is Update)
{
var u = (Update) message;
if (u.IsAwait)
{
_internalStash.Stash();
}
}
else
{
if (shouldAwait)
{
_internalStash.Stash();
}
else
{
try
{
base.AroundReceive(receive, message);
}
catch (Exception ex)
{
ChangeState(IgnoreRemainingReplay(ex));
}
}
}
});
}