private async Task KeepALiveLoop(SocketAdapter adapter, CancellationToken token)
        {
            while (!token.IsCancellationRequested)
            {
                await adapter.Socket.SendAsync($"ping {DateTime.UtcNow.ToString("o")}", token);

                await Task.Delay(TimeSpan.FromSeconds(30));
            }
        }
        public async Task Start(WsConnection webSocket, CancellationTokenSource cancellation)
        {
            _cancellation = cancellation;

            using var connection = await _connector.ConnectAsync(EndPoint);

            var token         = _cancellation.Token;
            var adapter       = SocketAdapter.Create(webSocket, connection);
            var receiveLoop   = ReceiveLoop(adapter, token);
            var handshakeLoop = KeepALiveLoop(adapter, token);

            // Create class to loop over taks until cancel or exception
            await new TaskRunner(new[] { receiveLoop, handshakeLoop }, token).Start();
        }
        private async Task ReceiveLoop(SocketAdapter adapter, CancellationToken token)
        {
            while (!token.IsCancellationRequested)
            {
                try
                {
                    var content = await adapter.Socket.ReceiveAsync(512, TimeSpan.FromSeconds(15), token);

                    await adapter.WebSocket.SendAsync("Update", content, token);
                }
                catch (TaskCanceledException)
                {
                    break;
                }
                catch (SocketException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Something went wrong while receiving a message");
                }
            }
        }