private static async Task <byte[]> GetLengthBytes(BufferStreamAsyncDelegate sourceStreamReader, CancellationToken cancellationToken) { var lengthBytes = new List <byte>(); var firstLengthByte = await sourceStreamReader(1, cancellationToken); lengthBytes.AddRange(firstLengthByte); var lengthByteValue = firstLengthByte[0] & LengthBitMask; if (lengthByteValue <= 125) { return(lengthBytes.ToArray()); } switch (lengthByteValue) { case 126: { var secondLengthBytes = await sourceStreamReader(2, cancellationToken); lengthBytes.AddRange(secondLengthBytes); return(lengthBytes.ToArray()); } case 127: { var secondLengthBytes = await sourceStreamReader(8, cancellationToken); lengthBytes.AddRange(secondLengthBytes); return(lengthBytes.ToArray()); } default: throw new Exception($"Unexpected first length byte value: {lengthByteValue}"); } }
private static async Task ListenForMessages(BufferStreamAsyncDelegate sourceStreamReader, WriteStreamAsyncDelegate destinationStreamWriter, CancellationToken cancellationToken) { var messageBuilder = new List <byte>(); var firstByte = await sourceStreamReader(1, cancellationToken); messageBuilder.AddRange(firstByte); var lengthBytes = await GetLengthBytes(sourceStreamReader, cancellationToken); messageBuilder.AddRange(lengthBytes); var isMaskBitSet = (lengthBytes[0] & MaskBitMask) != 0; var length = GetMessageLength(lengthBytes); if (isMaskBitSet) { var maskBytes = await sourceStreamReader(4, cancellationToken); messageBuilder.AddRange(maskBytes); } var messagePayloadBytes = await sourceStreamReader(length, cancellationToken); messageBuilder.AddRange(messagePayloadBytes); await destinationStreamWriter(messageBuilder.ToArray(), 0, messageBuilder.Count, cancellationToken); }