private int _timeout; // In Seconds

        public WebSocketTransportGeneric(string endpoint, IJsonMarshaller marshaller, ILogger logger, int timeout = 60)
        {
            Endpoint       = endpoint;
            _logger        = logger;
            _marshaller    = marshaller;
            _timeout       = timeout;
            _ws            = new WebSocket(endpoint);
            _ws.OnMessage += (sender, e) => {
                if (e.IsPing)
                {
                    logger.Logf(LogLevel.Trace, "WebSocketTransport: Ping received.");
                    return;
                }
                OnMessage(e);
            };
            _ws.OnOpen += (sender, e) => {
                OnOpen();
            };
            _ws.OnError += (sender, e) => {
                OnError(e);
            };
            _ws.OnClose += (sender, e) => {
                OnClose(e);
            };
            _ws.Compression = CompressionMethod.Deflate;
            _ws.EmitOnPing  = true;
            _state          = WebSocketTransportState.Stopped;
            _headersUpdated = true;
            _requests       = new Dictionary <string, WSRequest>();
            _dispatcher     = new Dispatcher <C, string>();
        }
        public void Close()
        {
            if (_state == WebSocketTransportState.Stopped ||
                _state != WebSocketTransportState.Stopping)
            {
                return;
            }

            _state = WebSocketTransportState.Stopping;
            _ws.Close(CloseStatusCode.Away);
        }
        public bool Open()
        {
            if (_state != WebSocketTransportState.Stopped)
            {
                return(false);
            }

            _state = WebSocketTransportState.Connecting;
            _ws.ConnectAsync();
            return(true);
        }
 private void OnOpen()
 {
     _logger.Logf(LogLevel.Debug, "WebSocketTransport: Opened socket.");
     _state = WebSocketTransportState.Connected;
 }
 private void OnClose(CloseEventArgs e)
 {
     _logger.Logf(LogLevel.Debug, "WebSocketTransport: Closed socket. Code: {0} Reason: {1}", e.Code, e.Reason);
     _state = WebSocketTransportState.Stopped;
 }