/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using QuantConnect.Logging; using WebSocketSharp; namespace QuantConnect.Brokerages { /// /// Wrapper for WebSocket4Net to enhance testability /// public class WebSocketWrapper : IWebSocket { private WebSocket _wrapped; private string _url; /// /// Wraps constructor /// /// public void Initialize(string url) { if (_wrapped != null) { throw new InvalidOperationException("WebSocketWrapper has already been initialized for: " + _url); } _url = url; _wrapped = new WebSocket(url) { Log = { Output = (data, file) => { Log.Trace(data.Message); } } }; _wrapped.OnOpen += (sender, args) => OnOpen(); _wrapped.OnMessage += (sender, args) => OnMessage(new WebSocketMessage(args.Data)); _wrapped.OnError += (sender, args) => OnError(new WebSocketError(args.Message, args.Exception)); _wrapped.OnClose += (sender, args) => OnClose(); } /// /// Wraps send method /// /// public void Send(string data) { _wrapped.Send(data); } /// /// Wraps Connect method /// public void Connect() { if (!IsOpen) { _wrapped.Connect(); } } /// /// Wraps Close method /// public void Close() { _wrapped.Close(); } /// /// Wraps IsAlive /// public bool IsOpen => _wrapped.IsAlive; /// /// Wraps ReadyState /// public WebSocketState ReadyState => _wrapped.ReadyState; /// /// Wraps message event /// public event EventHandler Message; /// /// Wraps error event /// public event EventHandler Error; /// /// Wraps open method /// public event EventHandler Open; /// /// Wraps close method /// public event EventHandler Closed; /// /// Event invocator for the event /// protected virtual void OnMessage(WebSocketMessage e) { //Logging.Log.Trace("WebSocketWrapper.OnMessage(): " + e.Message); Message?.Invoke(this, e); } /// /// Event invocator for the event /// /// protected virtual void OnError(WebSocketError e) { Log.Error(e.Exception, "WebSocketWrapper.OnError(): " + e.Message); Error?.Invoke(this, e); } /// /// Event invocator for the event /// protected virtual void OnOpen() { Log.Trace($"WebSocketWrapper.OnOpen(): Connection opened (IsOpen:{IsOpen}): {_url}"); Open?.Invoke(this, EventArgs.Empty); } /// /// Event invocator for the event /// protected virtual void OnClose() { Log.Trace($"WebSocketWrapper.OnClose(): Connection closed (IsOpen:{IsOpen}): {_url}"); Closed?.Invoke(this, EventArgs.Empty); } } }