/// <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); }
/// <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); } }