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);
        }
示例#2
0
        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);
        }