/// <summary> /// Opens an agent-to-client asynchronous message channel. This method will block/await /// for the lifetime of the connection to the agent. Messages sent by the client will /// be passed to <see cref="AgentMessageHandler"/>. Does not make use of the session /// cancellation token. /// </summary> public async Task OpenAgentMessageChannel( CancellationToken cancellationToken = default(CancellationToken)) { var request = new OpenMessageChannelRequest(Process.GetCurrentProcess().Id); var response = new MessageChannelClosedResponse(request.MessageId); try { await Task.Run(() => { SendAsync(request, message => { switch (message) { case LogEntry logEntry: Log.Commit(logEntry); break; case MessageChannel.Ping ping: break; default: try { messages.Observers.OnNext(message); } catch (Exception e) { Log.Error(TAG, "Exception in message channel observer", e); } break; } if (message is IXipResponseMessage responseMessage && messageChannelAwaiters.TryRemove(responseMessage.RequestId, out var awaiter)) { awaiter.SetResult(); } }, cancellationToken).GetAwaiter().GetResult(); }, cancellationToken); } catch {
/// <summary> /// Opens an agent-to-client asynchronous message channel. This method will block/await /// for the lifetime of the connection to the agent. Messages sent by the client will /// be passed to <see cref="AgentMessageHandler"/>. Does not make use of the session /// cancellation token. /// </summary> public async Task OpenAgentMessageChannel( CancellationToken cancellationToken = default(CancellationToken)) { var request = new OpenMessageChannelRequest(Process.GetCurrentProcess().Id); var response = new MessageChannelClosedResponse(request.MessageId); try { await Task.Run(() => { SendAsync(request, message => { switch (message) { case LogEntry logEntry: Log.Commit(logEntry); break; case MessageChannel.Ping ping: break; default: messages.Observers.OnNext(message); break; } }, cancellationToken).GetAwaiter().GetResult(); }, cancellationToken); } catch { } messages.Observers.OnCompleted(); }
/// <summary> /// Opens an agent-to-client asynchronous message channel. This method will block/await /// for the lifetime of the connection to the agent. Messages sent by the client will /// be passed to <see cref="AgentMessageHandler"/>. Does not make use of the session /// cancellation token. /// </summary> public async Task OpenAgentMessageChannel( CancellationToken cancellationToken = default(CancellationToken)) { var request = new OpenMessageChannelRequest( Guid.NewGuid(), Process.GetCurrentProcess().Id); try { await Task.Run(() => { SendAsync(request, message => { switch (message) { case LogEntry logEntry: Log.Commit(logEntry); break; case MessageChannel.Ping ping: break; case ICodeCellEvent evnt: try { evaluationContextManager.PostEvent(evnt); } catch (Exception e) { Log.Error(TAG, $"Exception in {nameof (ICodeCellEvent)} observer", e); } break; default: try { messages.Observers.OnNext(message); } catch (Exception e) { Log.Error(TAG, "Exception in message channel observer", e); } break; } }, cancellationToken).GetAwaiter().GetResult(); }, cancellationToken); } catch { } messages.Observers.OnCompleted(); }