Beispiel #1
0
        private Task Run(IObserver <ReadOnlySequence <byte> > observer, CancellationToken cancellationToken)
        {
            return(Task.Factory.StartNew(() =>
            {
                try
                {
                    while (true)
                    {
                        Task <ReadResult> readTask = this.PipeReader.ReadAsync(cancellationToken).AsTask();

                        ReadResult readResult = readTask.Result;

                        if (readResult.IsCompleted == true ||
                            readResult.IsCanceled == true)
                        {
                            this.OnCompleted(observer);

                            break;
                        }

                        ReadOnlySequence <byte> buffer = readResult.Buffer;
                        ITokenReaderState tokenReaderState = this.CreateTokenReaderState();

                        long offset = 0;

                        while (this.TryRead(ref buffer,
                                            ref tokenReaderState,
                                            out ReadOnlySequence <byte> token,
                                            out long consumedBytes) == true)
                        {
                            offset = consumedBytes;

                            this.OnNext(observer, token);
                        }

                        if (readResult.IsCanceled == false &&
                            readResult.IsCompleted == false)
                        {
                            SequencePosition position = new SequencePosition();

                            if (buffer.Length >= offset)
                            {
                                position = buffer.GetPosition(offset);
                            }

                            this.PipeReader.AdvanceTo(position, buffer.End);
                        }
                    }
                }catch (Exception ex)
                {
                    this.OnError(observer, ex);
                }finally
                {
                    this.Finished.Set();
                }
            },
                                         cancellationToken,
                                         TaskCreationOptions.LongRunning,
                                         TaskScheduler.Default));
        }
Beispiel #2
0
        public bool Read(ref ITokenReaderState state,
                         ref ReadOnlySequence <byte> buffer,
                         out ReadOnlySequence <byte> token,
                         out long consumedBytes)
        {
            token         = new ReadOnlySequence <byte>();
            consumedBytes = 0;

            bool messageFound = false;

            ITokenState tokenState = state.GetTokenState();

            Stack <ITokenStateTransition> transitions = state.Transitions;
            long position = state.Position;

            ITokenStateTransition?currentTransition = null;

            do
            {
                currentTransition = this.GetNextTransition(currentTransition,
                                                           tokenState,
                                                           transitions,
                                                           ref buffer,
                                                           ref position);

                if (currentTransition is not null)
                {
                    ExecutionLogProvider.Log.LogTrace(currentTransition.ToString());

                    tokenState = currentTransition.To;

                    messageFound = this.HandleTransition(currentTransition, transitions, ref buffer, ref token, out consumedBytes);
                }
            }while(currentTransition is not null && messageFound == false);

            state = this.CreateTokenReaderState(position, transitions);

            return(messageFound);
        }
Beispiel #3
0
        private bool TryRead(ref ReadOnlySequence <byte> buffer,
                             ref ITokenReaderState tokenReaderState,
                             out ReadOnlySequence <byte> token,
                             out long consumedBytes)
        {
            token         = new ReadOnlySequence <byte>();
            consumedBytes = 0;

            long bufferLength = buffer.Length;

            if (bufferLength < this.MaximumMessageSize)
            {
                ITokenReader tokenReader = this.CreateTokenReader();

                return(tokenReader.Read(ref tokenReaderState,
                                        ref buffer,
                                        out token,
                                        out consumedBytes));
            }
            else
            {
                throw Assert.Exception(new InvalidOperationException($"Maximum message size exceeded."));
            }
        }