/// <summary> /// Starts the Twitter stream. /// </summary> /// <param name="type">Type of streaming.</param> /// <param name="parameters">The parameters of streaming.</param> /// <returns>The stream messages.</returns> public IEnumerable <StreamingMessage> StartStream(StreamingType type, StreamingParameters parameters = null) { if (parameters == null) { parameters = new StreamingParameters(); } var url = type == StreamingType.User ? "https://userstream.twitter.com/1.1/user.json" : type == StreamingType.Site ? " https://sitestream.twitter.com/1.1/site.json " : type == StreamingType.Filter ? "https://stream.twitter.com/1.1/statuses/filter.json" : type == StreamingType.Sample ? "https://stream.twitter.com/1.1/statuses/sample.json" : type == StreamingType.Firehose ? "https://stream.twitter.com/1.1/statuses/firehose.json" : ""; var str = this.Connect(parameters, type == StreamingType.Filter ? MethodType.Post : MethodType.Get, url) .Where(x => !string.IsNullOrEmpty(x)); foreach (var s in str) { StreamingMessage m; #if !DEBUG try { #endif m = StreamingMessage.Parse(s); #if !DEBUG } catch { m = RawJsonMessage.Create(s); } #endif yield return(m); } }
public async void Start(IObserver <StreamingMessage> observer, StreamingApi client, StreamingType type, KeyValuePair <string, object>[] parameters) { var token = this.cancel.Token; try { // Make sure that all the operations are run in background var firstTask = Task.Run(() => client.IncludedTokens.SendStreamingRequestAsync(GetMethodType(type), client.GetUrl(type), parameters, token), token); // Setting the buffer size is a workaround for streaming delay // https://github.com/CoreTweet/CoreTweet/pull/155 using (var res = await firstTask.ConfigureAwait(false)) using (var reader = new StreamReader(await res.GetResponseStreamAsync().ConfigureAwait(false), Encoding.UTF8, true, 16384)) { while (!reader.EndOfStream) { if (token.IsCancellationRequested) { return; } var line = await reader.ReadLineAsync().ConfigureAwait(false); if (!string.IsNullOrEmpty(line)) { StreamingMessage message; try { message = StreamingMessage.Parse(line); } catch (ParsingException ex) { message = RawJsonMessage.Create(line, ex); } if (token.IsCancellationRequested) { return; } observer.OnNext(message); } } } observer.OnCompleted(); } catch (Exception ex) { if (!token.IsCancellationRequested) { observer.OnError(ex); } } }
public void Start(IObserver <StreamingMessage> observer, StreamingApi client, StreamingType type, KeyValuePair <string, object>[] parameters) { var token = this.cancel.Token; client.IncludedTokens.SendStreamingRequestAsync(GetMethodType(type), client.GetUrl(type), parameters, token) .Done(res => res.GetResponseStreamAsync(), token) .Unwrap() .Done(stream => { using (var reader = new StreamReader(stream)) using (token.Register(reader.Dispose)) { foreach (var s in reader.EnumerateLines().Where(x => !string.IsNullOrEmpty(x))) { try { observer.OnNext(StreamingMessage.Parse(s)); } catch (ParsingException ex) { observer.OnNext(RawJsonMessage.Create(s, ex)); } } } observer.OnCompleted(); }, token, true) .ContinueWith(t => { if (!token.IsCancellationRequested) { if (t.Exception != null) { observer.OnError(t.Exception.InnerExceptions.Count == 1 ? t.Exception.InnerException : t.Exception); } else if (t.IsCanceled) { observer.OnError(new TaskCanceledException(t)); } } }); }
private static IEnumerable <StreamingMessage> EnumerateMessages(Stream stream) { using (var reader = new StreamReader(stream)) { foreach (var s in reader.EnumerateLines()) { if (!string.IsNullOrEmpty(s)) { StreamingMessage m; try { m = StreamingMessage.Parse(s); } catch (ParsingException ex) { m = RawJsonMessage.Create(s, ex); } yield return(m); } } } }