public async Task<Message> WaitForMessage(Func<Message, bool> predicate, TimeSpan timeout)
{
var messageTcs = new TaskCompletionSource<Message>();
Action<Peer, Message> handler =
(_, message) =>
{
if (predicate(message))
messageTcs.SetResult(message);
};
OnMessage += handler;
try
{
if (await Task.WhenAny(messageTcs.Task, Task.Delay(timeout)) == messageTcs.Task)
{
return await messageTcs.Task;
}
else
{
throw new TimeoutException();
}
}
finally
{
OnMessage -= handler;
}
}