private async Task ReceiveSynchronizationMessage(IWebSocketConnection webSocketConnection, ClientSynchronizationMessage message) { string publicKey; if (!_mapConnectionsToPublicKey.TryGetValue(webSocketConnection.ConnectionId, out publicKey)) { return; } var messages = _messageStore.Get( e => e.Timestamp <= message.TimestampTo && e.Timestamp > message.TimestampFrom && (e.To == publicKey || e.From == publicKey) ); //var tasks = messages.Select(e => SendAsync(e));//TODO Synchro also SENT msges not only INBOX var tasks = messages.Select(async(encryptedMessage) => { var publicKeyIsReciever = encryptedMessage.To == publicKey; var decryptedMessage = _messageDecryptor.Decrypt( encryptedMessage, GetPrivateKeyFromPublicKey(publicKeyIsReciever ? encryptedMessage.To : encryptedMessage.From) , publicKeyIsReciever); var internalMessage = _mapper.Map <InternalMessage>(decryptedMessage); internalMessage.DateTime = DateTimeOffset.FromUnixTimeSeconds(internalMessage.Timestamp).ToString(); internalMessage.Title = internalMessage.Title; internalMessage.Content = internalMessage.Content; internalMessage.Id = internalMessage.Id.GetHashCode().ToString(); await _internalMessageSender.SendAsync(webSocketConnection, new WebSocketMessageContract() { Type = WebSocketMessageResponseTypes.INTERNAL_MESSAGE, Data = internalMessage }); }); await Task.WhenAll(tasks); await _internalMessageSender.SendAsync(webSocketConnection, new WebSocketMessageContract() { Type = WebSocketMessageResponseTypes.END_OF_SYNCHRONIZATION, Data = message }); }