public async Task SimpleNamedPipes()
        {
            Func <MemoryStream> memoryStreamFactory = () => new MemoryStream();
            string pipeName = Guid.NewGuid().ToString();

            using (var clientPipe = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.Asynchronous))
                using (var serverPipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous))
                {
                    Task clientConnectTask = clientPipe.ConnectAsync();
                    Task serverConnectTask = serverPipe.WaitForConnectionAsync();
                    Task.WaitAll(clientConnectTask, serverConnectTask);

                    var webSocketClient = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, clientPipe, TimeSpan.Zero, null, false, true, null);
                    var webSocketServer = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, serverPipe, TimeSpan.Zero, null, false, false, null);
                    CancellationTokenSource tokenSource = new CancellationTokenSource();

                    var clientReceiveTask = Task.Run <string[]>(() => ReceiveClient(webSocketClient, tokenSource.Token));
                    var serverReceiveTask = Task.Run(() => ReceiveServer(webSocketServer, tokenSource.Token));

                    ArraySegment <byte> message1 = GetBuffer("Hi");
                    ArraySegment <byte> message2 = GetBuffer("There");

                    await webSocketClient.SendAsync(message1, WebSocketMessageType.Binary, true, tokenSource.Token);

                    await webSocketClient.SendAsync(message2, WebSocketMessageType.Binary, true, tokenSource.Token);

                    await webSocketClient.CloseAsync(WebSocketCloseStatus.NormalClosure, null, tokenSource.Token);

                    string[] replies = await clientReceiveTask;
                    foreach (string reply in replies)
                    {
                        Console.WriteLine(reply);
                    }
                }
        }
        public async Task SimpleSend()
        {
            Func <MemoryStream> memoryStreamFactory = () => new MemoryStream();
            var theInternet     = new TheInternet();
            var webSocketClient = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, theInternet.ClientNetworkStream, TimeSpan.Zero, null, false, true, null);
            var webSocketServer = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, theInternet.ServerNetworkStream, TimeSpan.Zero, null, false, false, null);
            CancellationTokenSource tokenSource = new CancellationTokenSource();

            var clientReceiveTask = Task.Run <string[]>(() => ReceiveClient(webSocketClient, tokenSource.Token));
            var serverReceiveTask = Task.Run(() => ReceiveServer(webSocketServer, tokenSource.Token));

            ArraySegment <byte> message1 = GetBuffer("Hi");
            ArraySegment <byte> message2 = GetBuffer("There");

            await webSocketClient.SendAsync(message1, WebSocketMessageType.Binary, true, tokenSource.Token);

            await webSocketClient.SendAsync(message2, WebSocketMessageType.Binary, true, tokenSource.Token);

            await webSocketClient.CloseAsync(WebSocketCloseStatus.NormalClosure, null, tokenSource.Token);

            string[] replies = await clientReceiveTask;
            foreach (string reply in replies)
            {
                Console.WriteLine(reply);
            }
        }
        public async Task CanCancelSend()
        {
            Func <MemoryStream> memoryStreamFactory = () => new MemoryStream();
            var theInternet     = new TheInternet();
            var webSocketClient = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, theInternet.ClientNetworkStream, TimeSpan.Zero, null, false, true, null);
            CancellationTokenSource tokenSource = new CancellationTokenSource();
            ArraySegment <byte>     buffer      = new ArraySegment <byte>(new byte[10]);

            tokenSource.Cancel();

            await Assert.ThrowsAnyAsync <OperationCanceledException>(() => webSocketClient.SendAsync(buffer, WebSocketMessageType.Binary, true, tokenSource.Token));
        }
        public async Task ReceiveBufferTooSmallToFitWebsocketFrameTest()
        {
            Func <MemoryStream> memoryStreamFactory = () => new MemoryStream();
            string pipeName = Guid.NewGuid().ToString();

            using (var clientPipe = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.Asynchronous))
                using (var serverPipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous))
                {
                    Task clientConnectTask = clientPipe.ConnectAsync();
                    Task serverConnectTask = serverPipe.WaitForConnectionAsync();
                    Task.WaitAll(clientConnectTask, serverConnectTask);

                    var webSocketClient = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, clientPipe, TimeSpan.Zero, null, false, true, null);
                    var webSocketServer = new WebSocketImplementation(Guid.NewGuid(), memoryStreamFactory, serverPipe, TimeSpan.Zero, null, false, false, null);
                    CancellationTokenSource tokenSource = new CancellationTokenSource();

                    var clientReceiveTask = Task.Run <string[]>(() => ReceiveClient(webSocketClient, tokenSource.Token));

                    // here we use a server with a buffer size of 10 which is smaller than the websocket frame
                    var serverReceiveTask        = Task.Run(() => ReceiveServer(webSocketServer, 10, tokenSource.Token));
                    ArraySegment <byte> message1 = GetBuffer("This is a test message");

                    await webSocketClient.SendAsync(message1, WebSocketMessageType.Binary, true, tokenSource.Token);

                    await webSocketClient.CloseAsync(WebSocketCloseStatus.NormalClosure, null, tokenSource.Token);

                    await    serverReceiveTask;
                    string[] replies = await clientReceiveTask;
                    foreach (string reply in replies)
                    {
                        Console.WriteLine(reply);
                    }

                    Assert.Equal(3, replies.Length);
                    Assert.Equal("Server: This is ", replies[0]);
                    Assert.Equal("Server: a test m", replies[1]);
                    Assert.Equal("Server: essage", replies[2]);
                }
        }