public WebSocketClient(
            Uri url,
            WebSocketMessageSender sender       = null,
            ReceiverMemoryConfig receiverConfig = null,
            ILogger logger                       = null,
            string name                          = "CLIENT",
            Encoding messageEncoding             = null,
            Func <ClientWebSocket> clientFactory = null)
        {
            if (!ValidationUtils.ValidateInput(url))
            {
                throw new ArgumentNullException(nameof(url));
            }

            Url             = url;
            Name            = name;
            _logger         = logger;
            MessageEncoding = messageEncoding ?? Encoding.UTF8;

            receiverConfig = receiverConfig ?? ReceiverMemoryConfig.Default; //cannot use =?? in unity
            _memoryPool    = new MemoryPool(receiverConfig.InitialMemorySize, receiverConfig.MarginSize, logger);

            _clientFactory = clientFactory ?? DefaultClientFactory;

            _webSocketMessageSender = sender?.AsCore() ?? new SingleQueueSenderCore();
            _webSocketMessageSender.SetConfig(MessageEncoding, logger, Name);

            _webSocketMessageSender
            .ExceptionHappenedInSending
            .Subscribe(x =>
            {
                _backgroundExceptionQueue.Enqueue(x);
                Dispose();
            });
        }
        public WebSocketClient(
            WebSocket connectedSocket,
            WebSocketMessageSender sender       = null,
            ReceiverMemoryConfig receiverConfig = null,
            ILogger logger           = null,
            string name              = "CLIENT",
            Encoding messageEncoding = null)
        {
            _socket = connectedSocket ?? throw new ArgumentNullException(nameof(connectedSocket));

            Url            = null;
            _clientFactory = null;

            Name            = name;
            _logger         = logger;
            MessageEncoding = messageEncoding ?? Encoding.UTF8;

            receiverConfig = receiverConfig ?? ReceiverMemoryConfig.Default;
            _memoryPool    = new MemoryPool(receiverConfig.InitialMemorySize, receiverConfig.MarginSize, logger);

            _webSocketMessageSender = sender?.AsCore() ?? new SingleQueueSenderCore();
            _webSocketMessageSender.SetConfig(MessageEncoding, logger, Name);

            _webSocketMessageSender
            .ExceptionHappenedInSending
            .Subscribe(x =>
            {
                _backgroundExceptionQueue.Enqueue(x);
                Dispose();
            });
        }