public static async Task CreateStatus(Microsoft.AspNetCore.Http.HttpContext context) { //Add CORS headers context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); //Create status Status status = new Status { streams = new List <StatusStream>(), total_streams = Program.streams.Count, last_refresh = Program.last_refresh }; foreach (var s in Program.streams.Values) { if (s.finished) { status.finished_streams++; } long length; if (s.output_video_length_finished.HasValue) { length = s.output_video_length_finished.Value; //Has finished } else { length = s.outputVideo.Length; //Has not finished } status.total_size += length; StatusStream os = new StatusStream { author = s.author_name, completed = s.finished, fatal_errored = s.failed, failed_chunks = s.failed_chunks.Count, id = s.id, size = length, thumbnail = s.thumbnail, title = s.name, total_chunks = s.chunk_count, completed_chunks = s.progress, last_chunk = s.last_chunk_time, last_thumbnail = s.last_thumbnail_time, latest_thumbnail_hash = s.latest_thumbnail_hash, thumbnail_count = s.thumbnail_index, thumbnail_fails = s.thumbnail_fails }; status.streams.Add(os); } //Now, serialize and write string data = JsonConvert.SerializeObject(status, Formatting.Indented); byte[] bdata = Encoding.UTF8.GetBytes(data); await context.Response.Body.WriteAsync(bdata, 0, bdata.Length); }
public TradeObserver() { // Create the StatusStream observable (cold) as soon as someone subscribes to the StatusStream StatusStream = Observable.Create <SocketEvent>(statusObserver => { Task.Delay(500).Wait(); var socket = IO.Socket("http://socket.coincap.io"); socket.On(Socket.EVENT_CONNECT, data => statusObserver.OnNext(new SocketEvent { Status = "Connected", Exception = data as Exception })); socket.On(Socket.EVENT_CONNECT_ERROR, data => statusObserver.OnNext(new SocketEvent { Status = "Socket Connect Error", Exception = data as Exception })); socket.On(Socket.EVENT_CONNECT_TIMEOUT, data => statusObserver.OnNext(new SocketEvent { Status = "Socket Connect Timeout", Exception = data as Exception })); socket.On(Socket.EVENT_DISCONNECT, data => statusObserver.OnNext(new SocketEvent { Status = "Socket Disconnected", Exception = data as Exception })); socket.On(Socket.EVENT_ERROR, data => statusObserver.OnNext(new SocketEvent { Status = "Socket Error", Exception = data as Exception })); socket.On(Socket.EVENT_RECONNECT, data => statusObserver.OnNext(new SocketEvent { Status = "Socket Reconnected", Exception = data as Exception })); socket.On(Socket.EVENT_RECONNECT_ATTEMPT, data => statusObserver.OnNext(new SocketEvent { Status = "Socket Reconnect Attempt", Exception = data as Exception })); socket.On(Socket.EVENT_RECONNECTING, data => statusObserver.OnNext(new SocketEvent { Status = "Socket Reconnecting", Exception = data as Exception })); socket.On(Socket.EVENT_RECONNECT_ERROR, data => statusObserver.OnNext(new SocketEvent { Status = "Socket Reconnect Error", Exception = data as Exception })); socket.On(Socket.EVENT_RECONNECT_FAILED, data => statusObserver.OnNext(new SocketEvent { Status = "Socket Reconnect Failed", Exception = data as Exception })); socket.Open(); TradeStream = Observable.Create <CoinCapTradeEvent>(tradesObserver => { socket.On("trades", data => { var tradeObject = data as JObject; if (tradeObject == null) { return; } var message = tradeObject["message"] as JObject; if (message == null) { return; } var messageJson = message.ToString(Formatting.None); var te = JsonConvert.DeserializeObject <CoinCapTradeEvent>(messageJson); tradesObserver.OnNext(te); }); return(Disposable.Create(() => { socket.Off("trades"); })); }) .Publish() .RefCount(); return(Disposable.Create(() => { socket.Close(); })); }) .Do(e => Logger.Debug(e.Status, e.Exception)) .Publish() .RefCount(); StatusStream.Subscribe(ss => Status = ss); }