public async Task SendMessage(string message, string orgName, string senderConnectionID, HubConnection hubConnection) { try { if (await MessageLock.WaitAsync(30000)) { ChatSession chatSession; if (!ChatClients.Contains(senderConnectionID)) { var rcBinaryPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ScreenCast", OSUtils.ScreenCastExecutableFileName); var procID = await AppLauncher.LaunchChatService(orgName, senderConnectionID, hubConnection); var clientPipe = new NamedPipeClientStream(".", "Remotely_Chat" + senderConnectionID, PipeDirection.InOut, PipeOptions.Asynchronous); clientPipe.Connect(15000); if (!clientPipe.IsConnected) { Logger.Write("Failed to connect to chat host."); return; } chatSession = new ChatSession() { PipeStream = clientPipe, ProcessID = procID }; ChatClients.Add(senderConnectionID, chatSession, CacheItemPolicy); } chatSession = (ChatSession)ChatClients.Get(senderConnectionID); if (!chatSession.PipeStream.IsConnected) { ChatClients.Remove(senderConnectionID); await hubConnection.SendAsync("DisplayMessage", "Chat disconnected. Please try again.", "Chat disconnected."); return; } using (var sw = new StreamWriter(chatSession.PipeStream, leaveOpen: true)) { await sw.WriteLineAsync(message); await sw.FlushAsync(); } _ = Task.Run(async() => { await ReadFromStream(chatSession.PipeStream, senderConnectionID, hubConnection); }); } } catch (Exception ex) { Logger.Write(ex); } finally { MessageLock.Release(); } }
public async Task SendMessage(string senderName, string message, string orgName, bool disconnected, string senderConnectionID, HubConnection hubConnection) { if (!await MessageLock.WaitAsync(30000)) { Logger.Write("Timed out waiting for chat message lock.", Shared.Enums.EventType.Warning); return; } try { ChatSession chatSession; if (!ChatClients.Contains(senderConnectionID)) { if (disconnected) { // Don't start a new session just to show a disconnected message. return; } var procID = await AppLauncher.LaunchChatService(orgName, senderConnectionID, hubConnection); if (procID > 0) { Logger.Write($"Chat app started. Process ID: {procID}"); } else { Logger.Write($"Chat app did not start successfully."); return; } var clientPipe = new NamedPipeClientStream(".", "Remotely_Chat" + senderConnectionID, PipeDirection.InOut, PipeOptions.Asynchronous); clientPipe.Connect(15000); if (!clientPipe.IsConnected) { Logger.Write("Failed to connect to chat host."); return; } chatSession = new ChatSession() { PipeStream = clientPipe, ProcessID = procID }; _ = Task.Run(async() => { await ReadFromStream(chatSession.PipeStream, senderConnectionID, hubConnection); }); ChatClients.Add(senderConnectionID, chatSession, CacheItemPolicy); } chatSession = (ChatSession)ChatClients.Get(senderConnectionID); if (!chatSession.PipeStream.IsConnected) { ChatClients.Remove(senderConnectionID); await hubConnection.SendAsync("DisplayMessage", "Chat disconnected. Please try again.", "Chat disconnected.", senderConnectionID); return; } using var sw = new StreamWriter(chatSession.PipeStream, leaveOpen: true); var chatMessage = new ChatMessage(senderName, message, disconnected); await sw.WriteLineAsync(JsonSerializer.Serialize(chatMessage)); await sw.FlushAsync(); } catch (Exception ex) { Logger.Write(ex); } finally { MessageLock.Release(); } }