Esempio n. 1
0
        public Task <ReadOnlyMemory <byte> > OnRfpMessageAsync(RfpIdentifier identifier, ReadOnlyMemory <byte> data, CancellationToken cancellationToken)
        {
            if (!ShouldHandle(identifier, data))
            {
                return(Task.FromResult(data));
            }
            var message = new OmmMessage(MessageDirection.FromRfp, NextMessageId(), identifier, data);

            return(OnMessageAsync(message, cancellationToken));
        }
Esempio n. 2
0
        private async Task <ReadOnlyMemory <byte> > OnMessageAsync(OmmMessage message, CancellationToken cancellationToken)
        {
            if (HandleMessage)
            {
                var reply = await Client.HandleAsync(message, cancellationToken).ConfigureAwait(false);

                return(reply.Message);
            }
            Client.Send(message, cancellationToken);
            return(message.Message);
        }
Esempio n. 3
0
        public async Task <OmmMessage> HandleAsync(OmmMessage message, CancellationToken cancellationToken)
        {
            if (!_pending.TryAdd(message.MessageId, message))
            {
                throw new ArgumentException("message id must be unique", nameof(message));
            }
            await SendInternalAsync(message, cancellationToken).ConfigureAwait(false);

            var result = await message.WaitForReplyAsync(cancellationToken).ConfigureAwait(false);

            _pending.TryRemove(message.MessageId, out _);
            return(result);
        }
Esempio n. 4
0
        private async Task SendInternalAsync(OmmMessage message, CancellationToken cancellationToken)
        {
            await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                await message.SendAsync(Socket, cancellationToken).ConfigureAwait(false);
            }
            finally
            {
                _writeLock.Release();
            }
        }
Esempio n. 5
0
        private Task OnSubscriptionMessageAsync(OmmMessage message, CancellationToken cancellationToken)
        {
            if (!_connections.TryGetValue(message.Rfp, out var connection))
            {
                return(Task.CompletedTask);
            }
            switch (message.Direction)
            {
            case MessageDirection.FromOmm:
                return(OnServerMessageAsync(connection, message.Message, cancellationToken));

            case MessageDirection.ToOmm:
                return(OnClientMessageAsync(connection, message.Message, cancellationToken));

            default:
                throw new ArgumentOutOfRangeException(nameof(message.Direction), "invalid message direction");
            }
        }
Esempio n. 6
0
 public void Send(OmmMessage message, CancellationToken cancellationToken)
 {
     _ = SendInternalAsync(message, cancellationToken);
 }
Esempio n. 7
0
        private async Task ReadPipeAsync(PipeReader client, CancellationToken cancellationToken)
        {
            try
            {
                var tasks = new List <Task>();
                while (!cancellationToken.IsCancellationRequested)
                {
                    var        read = client.ReadAsync(cancellationToken);
                    ReadResult result;
                    if (read.IsCompleted)
                    {
                        result = await read;
                    }
                    else
                    {
                        var readTask = read.AsTask();
                        tasks.Add(readTask);
                        while (!read.IsCompleted)
                        {
                            var completed = await Task.WhenAny(tasks).ConfigureAwait(false);

                            if (!read.IsCompleted)
                            {
                                tasks.Remove(completed);
                                await completed.ConfigureAwait(false);
                            }
                        }
                        tasks.Remove(readTask);
                        result = await readTask.ConfigureAwait(false);
                    }
                    var buffer = result.Buffer;

                    bool success;
                    do
                    {
                        success = false;
                        if (buffer.Length < 4)
                        {
                            break;
                        }
                        var length = BinaryPrimitives.ReadUInt32BigEndian(buffer.Slice(0, 4).ToMemory().Span);
                        if (buffer.Length >= length + 4)
                        {
                            var data    = buffer.Slice(4, length).ToMemory();
                            var message = new OmmMessage(data);
                            if (message.IsReply)
                            {
                                //dispatch reply
                                if (!_pending.TryGetValue(message.MessageId, out var request))
                                {
                                    throw new InvalidDataException("unexpected reply");
                                }
                                request.Reply = message;
                            }
                            else
                            {
                                tasks.Add(_messageCallback(message, cancellationToken));
                            }
                            buffer  = buffer.Slice(4).Slice(length);
                            success = true;
                        }
                    } while (success && buffer.Length >= 4);
                    if (result.IsCompleted)
                    {
                        break;
                    }
                    client.AdvanceTo(buffer.Start, buffer.End);
                }
                client.Complete();
            }
            catch (OperationCanceledException ex)
            {
                Console.WriteLine("cancelled in ClientConnection.ReadPipeAsync");
                client.Complete(ex);
            }
        }