From 65248aa5451c46f670f2c7227359d062c4479606 Mon Sep 17 00:00:00 2001 From: Tyler Edwards Date: Fri, 5 Feb 2016 10:09:31 -0800 Subject: [PATCH] no message --- FireSharp.Test.Console/Program.cs | 4 +- FireSharp/EventStreaming/TemporaryCache.cs | 24 ++++++++- .../EventStreaming/ValueAddedEventArgs.cs | 4 +- .../EventStreaming/ValueChangedEventArgs.cs | 6 +-- FireSharp/FirebaseClient.cs | 6 +-- FireSharp/Interfaces/IFirebaseClient.cs | 2 +- FireSharp/Response/EventStreamResponse.cs | 50 +++++++++++++++---- 7 files changed, 73 insertions(+), 23 deletions(-) diff --git a/FireSharp.Test.Console/Program.cs b/FireSharp.Test.Console/Program.cs index 537b074..a51e658 100644 --- a/FireSharp.Test.Console/Program.cs +++ b/FireSharp.Test.Console/Program.cs @@ -35,7 +35,7 @@ private static async void EventStreaming() { await _client.DeleteAsync("chat"); - await _client.OnAsync("chat", + await _client.OnAsync("chat", string.Empty, added: async (sender, args) => { System.Console.WriteLine(args.Data + "-> 1\n"); @@ -48,7 +48,7 @@ await _client.OnAsync("chat", changed: (sender, args) => { System.Console.WriteLine(args.Data); }, removed: (sender, args) => { System.Console.WriteLine(args.Path); }); - await _client.OnAsync("chat", + await _client.OnAsync("chat",string.Empty, added: (sender, args) => { System.Console.WriteLine(args.Data + " -> 2\n"); }, changed: (sender, args) => { System.Console.WriteLine(args.Data); }, removed: (sender, args) => { System.Console.WriteLine(args.Path); }); diff --git a/FireSharp/EventStreaming/TemporaryCache.cs b/FireSharp/EventStreaming/TemporaryCache.cs index a6979fa..eca92cf 100644 --- a/FireSharp/EventStreaming/TemporaryCache.cs +++ b/FireSharp/EventStreaming/TemporaryCache.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace FireSharp.EventStreaming { @@ -13,8 +14,11 @@ internal sealed class TemporaryCache private readonly SimpleCacheItem _tree = new SimpleCacheItem(); private readonly object _treeLock = new object(); - public TemporaryCache() + private bool _objectChanged; + + public TemporaryCache(bool objectChanged) { + _objectChanged = objectChanged; _tree.Name = string.Empty; _tree.Created = false; _tree.Parent = null; @@ -44,6 +48,23 @@ public void Update(string path, JsonReader data) } } + public void Replace(string path,JObject o) + { + if (o != null) + { + OnAdded(new ValueAddedEventArgs(path, o)); + } + else + { + OnRemoved(new ValueRemovedEventArgs(path)); + } + } + + public void Update(string path, JObject o) + { + OnUpdated(new ValueChangedEventArgs(path,o,o)); + } + private SimpleCacheItem FindRoot(string path) { var segments = path.Split(_seperator, StringSplitOptions.RemoveEmptyEntries); @@ -111,6 +132,7 @@ private void UpdateChildren(SimpleCacheItem root, JsonReader reader, bool replac case JsonToken.Null: DeleteChild(root); return; + case JsonToken.EndObject: return; } } } diff --git a/FireSharp/EventStreaming/ValueAddedEventArgs.cs b/FireSharp/EventStreaming/ValueAddedEventArgs.cs index 53f9da3..7bd8a2e 100644 --- a/FireSharp/EventStreaming/ValueAddedEventArgs.cs +++ b/FireSharp/EventStreaming/ValueAddedEventArgs.cs @@ -4,13 +4,13 @@ namespace FireSharp.EventStreaming { public class ValueAddedEventArgs : EventArgs { - public ValueAddedEventArgs(string path, string data) + public ValueAddedEventArgs(string path, object data) { Path = path; Data = data; } public string Path { get; private set; } - public string Data { get; private set; } + public object Data { get; private set; } } } \ No newline at end of file diff --git a/FireSharp/EventStreaming/ValueChangedEventArgs.cs b/FireSharp/EventStreaming/ValueChangedEventArgs.cs index 14016c4..27b5351 100644 --- a/FireSharp/EventStreaming/ValueChangedEventArgs.cs +++ b/FireSharp/EventStreaming/ValueChangedEventArgs.cs @@ -4,7 +4,7 @@ namespace FireSharp.EventStreaming { public class ValueChangedEventArgs : EventArgs { - public ValueChangedEventArgs(string path, string data, string oldData) + public ValueChangedEventArgs(string path, object data, object oldData) { Path = path; Data = data; @@ -12,7 +12,7 @@ public ValueChangedEventArgs(string path, string data, string oldData) } public string Path { get; private set; } - public string Data { get; private set; } - public string OldData { get; private set; } + public object Data { get; private set; } + public object OldData { get; private set; } } } \ No newline at end of file diff --git a/FireSharp/FirebaseClient.cs b/FireSharp/FirebaseClient.cs index f1cd73d..ffb687a 100644 --- a/FireSharp/FirebaseClient.cs +++ b/FireSharp/FirebaseClient.cs @@ -329,7 +329,7 @@ public async Task ListenAsync(string path, ValueAddedEventH ValueChangedEventHandler changed = null, ValueRemovedEventHandler removed = null) { - return new EventStreamResponse(await _requestManager.ListenAsync(path).ConfigureAwait(false), added, changed, removed); + return new EventStreamResponse(await _requestManager.ListenAsync(path).ConfigureAwait(false), false, added, changed, removed); } public async Task> OnChangeGetAsync(string path, ValueRootAddedEventHandler added = null) @@ -337,10 +337,10 @@ public async Task> OnChangeGetAsync(string path, ValueRo return new EventRootResponse(await _requestManager.ListenAsync(path).ConfigureAwait(false), added, _requestManager, path); } - public async Task OnAsync(string path, ValueAddedEventHandler added = null, ValueChangedEventHandler changed = null, + public async Task OnAsync(string path, string query, bool objectChanged=false, ValueAddedEventHandler added = null, ValueChangedEventHandler changed = null, ValueRemovedEventHandler removed = null) { - return new EventStreamResponse(await _requestManager.ListenAsync(path).ConfigureAwait(false), added, changed, removed); + return new EventStreamResponse(await _requestManager.ListenAsync(path, query).ConfigureAwait(false), objectChanged, added, changed, removed); } private void HandleIfErrorResponse(HttpStatusCode statusCode, string content, Action errorHandler = null) diff --git a/FireSharp/Interfaces/IFirebaseClient.cs b/FireSharp/Interfaces/IFirebaseClient.cs index 5d11362..e99f587 100644 --- a/FireSharp/Interfaces/IFirebaseClient.cs +++ b/FireSharp/Interfaces/IFirebaseClient.cs @@ -33,7 +33,7 @@ Task ListenAsync(string path, ValueChangedEventHandler changed = null, ValueRemovedEventHandler removed = null); - Task OnAsync(string path, + Task OnAsync(string path, string query, bool objectChanged = false, ValueAddedEventHandler added = null, ValueChangedEventHandler changed = null, ValueRemovedEventHandler removed = null); diff --git a/FireSharp/Response/EventStreamResponse.cs b/FireSharp/Response/EventStreamResponse.cs index 6ec700a..bbd13bd 100644 --- a/FireSharp/Response/EventStreamResponse.cs +++ b/FireSharp/Response/EventStreamResponse.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using FireSharp.EventStreaming; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace FireSharp.Response { @@ -14,15 +15,17 @@ public class EventStreamResponse private readonly TemporaryCache _cache; private readonly CancellationTokenSource _cancel; private readonly Task _pollingTask; - + private bool _objectChanged; internal EventStreamResponse(HttpResponseMessage httpResponse, + bool objectChanged=false, ValueAddedEventHandler added = null, ValueChangedEventHandler changed = null, ValueRemovedEventHandler removed = null) { + _objectChanged = objectChanged; _cancel = new CancellationTokenSource(); - _cache = new TemporaryCache(); + _cache = new TemporaryCache(objectChanged); if (added != null) { @@ -65,6 +68,9 @@ await Task.Factory.StartNew(async () => if (read.StartsWith("data: ")) { + if (eventName == "keep-alive") + continue; + if (string.IsNullOrEmpty(eventName)) { throw new InvalidOperationException("Payload data was received but an event did not preceed it."); @@ -89,26 +95,48 @@ public void Cancel() _cancel.Cancel(); } - private void Update(string eventName, string p) + private async Task Update(string eventName, string p) { switch (eventName) { case "put": case "patch": using (var r = new StringReader(p)) - using (JsonReader reader = new JsonTextReader(r)) { - ReadToNamedPropertyValue(reader, "path"); - reader.Read(); - var path = reader.Value.ToString(); - - if (eventName == "put") + if (_objectChanged) { - _cache.Replace(path, ReadToNamedPropertyValue(reader, "data")); + string s = await r.ReadToEndAsync(); + JObject j=JObject.Parse(s); + if (j != null) + { + string path = j.GetValue("path").ToString(); + if (eventName == "put") + { + _cache.Replace(path, j.GetValue("data") as JObject); + } + else + { + _cache.Update(path, j.GetValue("data") as JObject); + } + } } else { - _cache.Update(path, ReadToNamedPropertyValue(reader, "data")); + using (JsonReader reader = new JsonTextReader(r)) + { + ReadToNamedPropertyValue(reader, "path"); + reader.Read(); + var path = reader.Value.ToString(); + + if (eventName == "put") + { + _cache.Replace(path, ReadToNamedPropertyValue(reader, "data")); + } + else + { + _cache.Update(path, ReadToNamedPropertyValue(reader, "data")); + } + } } } break;