Example #1
0
        /// <inheritdoc/>
        public virtual async IAsyncEnumerable <V1RuntimeSignal> Connect(string runtimeId)
        {
            if (string.IsNullOrWhiteSpace(runtimeId))
            {
                throw new ArgumentNullException(nameof(runtimeId));
            }
            var stream       = Channel.CreateUnbounded <V1RuntimeSignal>();
            var streamWriter = new AsyncStreamWriter <V1RuntimeSignal>(stream.Writer);
            var runtime      = RuntimeProxyManager.Register(RuntimeProxyFactory.CreateProxy(runtimeId, streamWriter));

            await foreach (var message in stream.Reader.ReadAllAsync())
            {
                yield return(message);
            }
            runtime.Dispose();
        }
        public async Task AsyncStreamWriterBasicTests(string input, string[] expects)
        {
            var             size     = 4;
            var             encoding = Console.OutputEncoding;
            var             actual   = new List <string>();
            Action <string> onWrite  = data => actual.Add(data);

            // Test
            using (var writer = new AsyncStreamWriter(onWrite, encoding))
            {
                var bytes = encoding.GetBytes(input);
                for (int i = 0; i < bytes.Length; i += size)
                {
                    await writer.WriteAsync(bytes, i, Math.Min(size, bytes.Length - i), default(CancellationToken));
                }
            }

            // Assert
            Assert.Equal(expects, actual);
        }
Example #3
0
        /// <inheritdoc/>
        public virtual async IAsyncEnumerable <V1RuntimeSignal> Connect(string runtimeId, CallContext context = default)
        {
            var stream       = Channel.CreateUnbounded <V1RuntimeSignal>();
            var streamWriter = new AsyncStreamWriter <V1RuntimeSignal>(stream.Writer);
            var runtime      = RuntimeProxyManager.Register(this.RuntimeProxyFactory.CreateProxy(runtimeId, streamWriter));
            var messages     = stream.Reader.ReadAllAsync(context.CancellationToken);

            await using var messageEnumerator = messages.GetAsyncEnumerator();
            for (var canRead = true; canRead;)
            {
                try
                {
                    canRead = await messageEnumerator.MoveNextAsync();
                }
                catch (Exception ex)
                    when(ex is TaskCanceledException || ex is OperationCanceledException)
                    {
                        runtime.Dispose();
                        break;
                    }
                yield return(messageEnumerator.Current);
            }
        }