Beispiel #1
0
        /// <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();
        }
Beispiel #2
0
        /// <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 {