/// <summary>
        /// The DI constructor.
        /// </summary>
        /// <param name="api"></param>
        /// <param name="stream"></param>
        /// <param name="onError"></param>
        public BinanceWebSocketStreamController(IBinanceApi api, IWebSocketStream stream, Action <Exception> onError = null)
            : base(stream, onError)
        {
            Throw.IfNull(api, nameof(api));

            _api = api;
        }
Пример #2
0
 private async Task WriteMultipleAsync(IWebSocketStream stream)
 {
     while (MoveNext(out var memory))
     {
         await stream.WriteAsync(memory);
     }
 }
Пример #3
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="api">The Binance API.</param>
        /// <param name="client">The WebSocket client.</param>
        /// <param name="options">The options.</param>
        /// <param name="logger">The logger.</param>
        public UserDataWebSocketClient(IBinanceApi api, IWebSocketStream webSocket, IOptions <UserDataWebSocketClientOptions> options = null, ILogger <UserDataWebSocketClient> logger = null)
            : base(webSocket, logger)
        {
            Throw.IfNull(api, nameof(api));
            Throw.IfNull(webSocket, nameof(webSocket));

            _api     = api;
            _options = options?.Value;

            webSocket.Client.Open += (s, e) =>
            {
                var period = _options?.KeepAliveTimerPeriod ?? KeepAliveTimerPeriodDefault;
                period = Math.Min(Math.Max(period, KeepAliveTimerPeriodMin), KeepAliveTimerPeriodMax);

                _keepAliveTimer = new Timer(OnKeepAliveTimer, CancellationToken.None, period, period);
            };

            webSocket.Client.Close += async(s, e) =>
            {
                _keepAliveTimer.Dispose();

                foreach (var _ in _listenKeys)
                {
                    await _api.UserStreamCloseAsync(_.Key, _.Value, CancellationToken.None)
                    .ConfigureAwait(false);
                }
            };
        }
        /// <summary>
        /// The DI constructor.
        /// </summary>
        /// <param name="api"></param>
        /// <param name="stream"></param>
        /// <param name="logger"></param>
        public BinanceWebSocketStreamController(IBinanceApi api, IWebSocketStream stream, ILogger <BinanceWebSocketStreamController> logger = null)
            : base(stream, logger)
        {
            Throw.IfNull(api, nameof(api));

            _api = api;
        }
Пример #5
0
        public WebSocket(IWebSocketStream stream, WebSocketFlags flags, IPAddress remoteIpAddress) : base(flags)
        {
            RemoteIpAddress = remoteIpAddress ?? throw new ArgumentNullException(nameof(remoteIpAddress));
            m_stream        = stream ?? throw new ArgumentNullException(nameof(stream));

            WebSocketsEventSource.Log.CreateSocket(Id, flags, remoteIpAddress);
        }
Пример #6
0
        /// <summary>
        /// Contstructor.
        /// </summary>
        /// <param name="webSocket"></param>
        /// <param name="onError"></param>
        public WebSocketStreamController(IWebSocketStream webSocket, Action <Exception> onError = null)
            : base(webSocket.StreamAsync, onError)
        {
            Throw.IfNull(webSocket, nameof(webSocket));

            WebSocket = webSocket;
        }
Пример #7
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="webSocket"></param>
        /// <param name="logger"></param>
        protected BinanceWebSocketClient(IWebSocketStream webSocket, ILogger logger = null)
        {
            Throw.IfNull(webSocket, nameof(webSocket));

            WebSocket = webSocket;
            Logger    = logger;

            Subscribers = new Dictionary <string, IList <Action <TEventArgs> > >();
        }
Пример #8
0
        internal override ValueTask WriteAsync(IWebSocketStream stream)
        {
            if (Buffer.IsSingleSegment)
            {
                return(stream.WriteAsync(Buffer.First));
            }

            return(new ValueTask(WriteMultipleAsync(stream)));
        }
Пример #9
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="webSocket"></param>
 /// <param name="logger"></param>
 public TradeWebSocketClient(IWebSocketStream webSocket, ILogger <TradeWebSocketClient> logger = null)
     : base(webSocket, logger)
 {
 }
Пример #10
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="logger"></param>
 public AggregateTradeWebSocketClient(IWebSocketStream stream, ILogger <AggregateTradeWebSocketClient> logger = null)
     : base(stream, logger)
 {
 }
Пример #11
0
 /// <summary>
 /// Wait until web socket is open.
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="token"></param>
 /// <returns></returns>
 public static Task WaitUntilWebSocketOpenAsync(this IWebSocketStream stream, CancellationToken token = default)
 => stream.WebSocket.WaitUntilOpenAsync(token);
Пример #12
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="webSocket"></param>
 /// <param name="logger"></param>
 public SymbolStatisticsWebSocketClient(IWebSocketStream webSocket, ILogger <SymbolStatisticsWebSocketClient> logger = null)
     : base(webSocket, logger)
 {
 }
Пример #13
0
        protected WebSocketBase(Stream innerStream,
            string subProtocol,
            TimeSpan keepAliveInterval,
            WebSocketBuffer internalBuffer)
        {
            Contract.Assert(internalBuffer != null, "'internalBuffer' MUST NOT be NULL.");
            WebSocketHelpers.ValidateInnerStream(innerStream);
            WebSocketHelpers.ValidateOptions(subProtocol, internalBuffer.ReceiveBufferSize,
                internalBuffer.SendBufferSize, keepAliveInterval);

            s_LoggingEnabled = Logging.On && Logging.WebSockets.Switch.ShouldTrace(TraceEventType.Critical);
            string parameters = string.Empty;

            if (s_LoggingEnabled)
            {
                parameters = string.Format(CultureInfo.InvariantCulture,
                    "ReceiveBufferSize: {0}, SendBufferSize: {1},  Protocols: {2}, KeepAliveInterval: {3}, innerStream: {4}, internalBuffer: {5}",
                    internalBuffer.ReceiveBufferSize,
                    internalBuffer.SendBufferSize,
                    subProtocol,
                    keepAliveInterval,
                    Logging.GetObjectLogHash(innerStream),
                    Logging.GetObjectLogHash(internalBuffer));

                Logging.Enter(Logging.WebSockets, this, Methods.Initialize, parameters);
            }

            m_ThisLock = new object();

            try
            {
                m_InnerStream = innerStream;
                m_InternalBuffer = internalBuffer;
                if (s_LoggingEnabled)
                {
                    Logging.Associate(Logging.WebSockets, this, m_InnerStream);
                    Logging.Associate(Logging.WebSockets, this, m_InternalBuffer);
                }

                m_CloseOutstandingOperationHelper = new OutstandingOperationHelper();
                m_CloseOutputOutstandingOperationHelper = new OutstandingOperationHelper();
                m_ReceiveOutstandingOperationHelper = new OutstandingOperationHelper();
                m_SendOutstandingOperationHelper = new OutstandingOperationHelper();
                m_State = WebSocketState.Open;
                m_SubProtocol = subProtocol;
                m_SendFrameThrottle = new SemaphoreSlim(1, 1);
                m_CloseStatus = null;
                m_CloseStatusDescription = null;
                m_InnerStreamAsWebSocketStream = innerStream as IWebSocketStream;
                if (m_InnerStreamAsWebSocketStream != null)
                {
                    m_InnerStreamAsWebSocketStream.SwitchToOpaqueMode(this);
                }
                m_KeepAliveTracker = KeepAliveTracker.Create(keepAliveInterval);
            }
            finally
            {
                if (s_LoggingEnabled)
                {
                    Logging.Exit(Logging.WebSockets, this, Methods.Initialize, parameters);
                }
            }
        }
Пример #14
0
 public IRetryTaskController GetController(IWebSocketStream webSocket)
 => _controllers.ContainsKey(webSocket) ? _controllers[webSocket] : null;
        public JsonStreamPublisherTest()
        {
            _webSocketStream = new BinanceWebSocketStream(DefaultWebSocketClientTest.CreateMockWebSocketClient(_json, _streamName));

            _publisher = new MockJsonStreamPublisher(_webSocketStream);
        }
Пример #16
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="client"></param>
 /// <param name="logger"></param>
 public CandlestickWebSocketClient(IWebSocketStream webSocket, ILogger <CandlestickWebSocketClient> logger = null)
     : base(webSocket, logger)
 {
 }
Пример #17
0
        protected WebSocketBase(Stream innerStream,
            string subProtocol,
            TimeSpan keepAliveInterval,
            WebSocketBuffer internalBuffer)
        {
            Debug.Assert(internalBuffer != null, "'internalBuffer' MUST NOT be NULL.");
            WebSocketValidate.ValidateInnerStream(innerStream);
            WebSocketValidate.ValidateOptions(subProtocol, internalBuffer.ReceiveBufferSize,
                internalBuffer.SendBufferSize, keepAliveInterval);

            string parameters = string.Empty;

            if (NetEventSource.IsEnabled)
            {
                parameters = string.Format(CultureInfo.InvariantCulture,
                    "ReceiveBufferSize: {0}, SendBufferSize: {1},  Protocols: {2}, KeepAliveInterval: {3}, innerStream: {4}, internalBuffer: {5}",
                    internalBuffer.ReceiveBufferSize,
                    internalBuffer.SendBufferSize,
                    subProtocol,
                    keepAliveInterval,
                    NetEventSource.GetHashCode(innerStream),
                    NetEventSource.GetHashCode(internalBuffer));

                NetEventSource.Enter(this, parameters);
            }

            _thisLock = new object();

            try
            {
                _innerStream = innerStream;
                _internalBuffer = internalBuffer;
                if (NetEventSource.IsEnabled)
                {
                    NetEventSource.Associate(this, _innerStream);
                    NetEventSource.Associate(this, _internalBuffer);
                }

                _closeOutstandingOperationHelper = new OutstandingOperationHelper();
                _closeOutputOutstandingOperationHelper = new OutstandingOperationHelper();
                _receiveOutstandingOperationHelper = new OutstandingOperationHelper();
                _sendOutstandingOperationHelper = new OutstandingOperationHelper();
                _state = WebSocketState.Open;
                _subProtocol = subProtocol;
                _sendFrameThrottle = new SemaphoreSlim(1, 1);
                _closeStatus = null;
                _closeStatusDescription = null;
                _innerStreamAsWebSocketStream = innerStream as IWebSocketStream;
                if (_innerStreamAsWebSocketStream != null)
                {
                    _innerStreamAsWebSocketStream.SwitchToOpaqueMode(this);
                }
                _keepAliveTracker = KeepAliveTracker.Create(keepAliveInterval);
            }
            finally
            {
                if (NetEventSource.IsEnabled)
                {
                    NetEventSource.Exit(this, parameters);
                }
            }
        }
Пример #18
0
 internal override ValueTask WriteAsync(IWebSocketStream stream) => stream.WriteAsync(Buffer.First);
Пример #19
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="logger"></param>
 public DepthWebSocketClient(IWebSocketStream stream, ILogger <DepthWebSocketClient> logger = null)
     : base(stream, logger)
 {
 }
Пример #20
0
 /// <summary>
 /// Get flag indicating if using combined streams.
 /// </summary>
 /// <param name="webSocket"></param>
 /// <returns></returns>
 public static bool IsCombined(this IWebSocketStream webSocket)
 {
     return(webSocket is BinanceWebSocketStream binanceWebSocketStream &&
            binanceWebSocketStream.IsCombined);
 }
Пример #21
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="webSocket">The WebSocket stream.</param>
 /// <param name="logger">The logger.</param>
 protected UserDataWebSocketClient(IWebSocketStream webSocket, ILogger <UserDataWebSocketClient> logger = null)
     : base(webSocket, logger)
 {
 }