internal Task SendAsync(long substreamId, byte[] data, CancellationToken cancellation) { return(SendAsync(linked => ProtobufEx.SerializeWithLengthPrefixAsync(Inner, new MultiplexPacket() { SubstreamId = substreamId == OutboundSubstream ? 0 : OutboundSubstream = substreamId, Data = data }, PrefixStyle.Base128, linked), cancellation)); }
internal void QueueClose(long substreamId) { lock (Substreams) Substreams.Remove(substreamId); SendAsync(async linked => { await ProtobufEx.SerializeWithLengthPrefixAsync(Inner, new MultiplexPacket() { SubstreamId = substreamId == OutboundSubstream ? 0 : OutboundSubstream = substreamId, EndOfStream = true }, PrefixStyle.Base128, linked); await Inner.FlushAsync(linked); }, CancellationToken.None).ContinueWith(t => Logger.Error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); }
public async Task <Stream> ConnectAsync(CancellationToken cancellation) { MultiplexSubstream substream; lock (Substreams) { substream = new MultiplexSubstream(this, NextId); Substreams[NextId] = substream; ++NextId; } await SendAsync(linked => ProtobufEx.SerializeWithLengthPrefixAsync(Inner, new MultiplexPacket() { SubstreamId = OutboundSubstream = substream.Id }, PrefixStyle.Base128, linked), cancellation); return(substream); }