/// <summary>
 /// Получение сообщения от пользователя. Если от пользователя нет сообщений, то ждёт <see cref="Timeout"/>.
 /// </summary>
 /// <param name="userId">Идентификатор пользователя, от которого мы ждём сообщение.</param>
 /// <param name="token">Билет отмены ожидания.</param>
 /// <returns>Прочитанный объект.</returns>
 /// <exception cref="System.OperationCanceledException">Происходит, когда превышено время <see cref="Timeout"/>.</exception>
 public dynamic Read(ulong userId, CancellationToken token = default)
 {
     server.DebugInfo($"{this}.Read = {userId}, {token}");
     if (token == default)
     {
         token = new CancellationTokenSource(Timeout).Token;
     }
     return(GetUserMessages(userId).Take(token));
 }
 /// <summary>
 /// Создаёт новый экземпляр клиента получателя и отправителя сообщений.
 /// </summary>
 /// <param name="server">Сервер, с помощью которого отправляются и получаются пакеты.</param>
 /// <param name="timeout">Максимальный интервал ожидания для получения пакета.</param>
 public SimpleWriterReader(P2PClient server, TimeSpan timeout = default)
 {
     server.DebugInfo($"{this}.SimpleWriterReader = {server}, {timeout}");
     if (timeout != default)
     {
         Timeout = timeout;
     }
     this.server           = server;
     server.OnMessageSend += OnMessageSend;
     server.OnDisconnect  += OnUserDisconnect;
 }
 private void OnMessageSend(P2PClient server, ulong userId, Memory <byte> Package)
 {
     server.DebugInfo($"{this}.OnMessageSend = {server}, {userId}, {string.Join(", ", Package)}");
     GetUserMessages(userId).Add(Package);
 }