static async Task <bool> connectAsync(string uri, CancellationToken token, Action <WebSocketWrapper> onConnection, Action <ClientWebSocketOptions> setOptions = null)
        {
            ClientWebSocket webSocket            = null;
            var             isClosedSuccessfully = true;

            try
            {
                webSocket = new ClientWebSocket();
                setOptions?.Invoke(webSocket.Options);
                await webSocket.ConnectAsync(new Uri(uri), token);
            }
            catch (Exception)
            {
                webSocket?.Dispose();
                throw;
            }

            var connection = new WebSocketWrapper(webSocket, CookieUtils.GetCookies(webSocket.Options.Cookies?.GetCookies(new Uri(uri))));

            try
            {
                onConnection(connection);
                await connection.ListenReceiveAsync(token);
            }
            finally
            {
                isClosedSuccessfully = webSocket.State != WebSocketState.Aborted;
                webSocket?.Dispose();
            }

            return(isClosedSuccessfully);
        }