private static void EmitEvent(string eventName, IEventBinder binder, string jsonMessage, Dictionary <string, object> message) { if (binder.HasListeners) { if (binder is PusherEventEmitter pusherEventEmitter) { PusherEvent pusherEvent = new PusherEvent(message, jsonMessage); if (pusherEvent != null) { pusherEventEmitter.EmitEvent(eventName, pusherEvent); } } else if (binder is TextEventEmitter textEventEmitter) { string textEvent = jsonMessage; if (textEvent != null) { textEventEmitter.EmitEvent(eventName, textEvent); } } else if (binder is DynamicEventEmitter dynamicEventEmitter) { var template = new { @event = string.Empty, data = string.Empty, channel = string.Empty, user_id = string.Empty }; dynamic dynamicEvent = JsonConvert.DeserializeAnonymousType(jsonMessage, template); if (dynamicEvent != null) { dynamicEventEmitter.EmitEvent(eventName, dynamicEvent); } } } }
void IPusher.EmitChannelEvent(string channelName, string eventName, PusherEvent data) { if (Channels.ContainsKey(channelName)) { Channels[channelName].EmitEvent(eventName, data); } }
internal void EmitEvent(string eventName, PusherEvent data) { var stringData = data.ToString(); ActionData(_rawGeneralListeners, _rawEventListeners, eventName, stringData); EmitDynamicEvent(eventName, stringData); ActionData(_pusherEventGeneralListeners, _pusherEventEventListeners, eventName, data); }
private async Task OnPusherEventReceptionAsync(PusherEventConfig config, PusherClient.PusherEvent rawEvent) { Debug.WriteLine(config.ChannelName); Debug.WriteLine(config.EventName); var pusherEvent = PusherEvent.From(rawEvent); Debug.WriteLine(pusherEvent.EventData.Message); await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Events.Add(pusherEvent); }); SpawnEventToast(pusherEvent); }
private void websocket_MessageReceived(object sender, MessageReceivedEventArgs e) { Pusher.Trace.TraceEvent(TraceEventType.Information, 0, "Websocket message received: " + e.Message); Debug.WriteLine(e.Message); // DeserializeAnonymousType will throw and error when an error comes back from pusher // It stems from the fact that the data object is a string normally except when an error is sent back // then it's an object. // bad: "{\"event\":\"pusher:error\",\"data\":{\"code\":4201,\"message\":\"Pong reply not received\"}}" // good: "{\"event\":\"pusher:error\",\"data\":\"{\\\"code\\\":4201,\\\"message\\\":\\\"Pong reply not received\\\"}\"}"; var jObject = JObject.Parse(e.Message); if (jObject["data"] != null && jObject["data"].Type != JTokenType.String) { jObject["data"] = jObject["data"].ToString(Formatting.None); } var jsonMessage = jObject.ToString(Formatting.None); var template = new { @event = string.Empty, data = string.Empty, channel = string.Empty }; var message = JsonConvert.DeserializeAnonymousType(jsonMessage, template); var eventData = JsonConvert.DeserializeObject <Dictionary <string, object> >(jsonMessage); if (jObject["data"] != null) { eventData["data"] = jObject["data"].ToString(); // undo any kind of deserialisation of the data property } var receivedEvent = new PusherEvent(eventData, jsonMessage); _pusher.EmitPusherEvent(message.@event, receivedEvent); if ([email protected](Constants.PUSHER_MESSAGE_PREFIX)) { // Assume Pusher event switch (message.@event) { // TODO - Need to handle Error on subscribing to a channel case Constants.ERROR: ParseError(message.data); break; case Constants.CONNECTION_ESTABLISHED: ParseConnectionEstablished(message.data); break; case Constants.CHANNEL_SUBSCRIPTION_SUCCEEDED: _pusher.SubscriptionSuceeded(message.channel, message.data); break; case Constants.CHANNEL_SUBSCRIPTION_ERROR: RaiseError(new PusherException("Error received on channel subscriptions: " + e.Message, ErrorCodes.SubscriptionError)); break; case Constants.CHANNEL_MEMBER_ADDED: _pusher.AddMember(message.channel, message.data); Pusher.Trace.TraceEvent(TraceEventType.Warning, 0, "Received a presence event on channel '" + message.channel + "', however there is no presence channel which matches."); break; case Constants.CHANNEL_MEMBER_REMOVED: _pusher.RemoveMember(message.channel, message.data); Pusher.Trace.TraceEvent(TraceEventType.Warning, 0, "Received a presence event on channel '" + message.channel + "', however there is no presence channel which matches."); break; } } else // Assume channel event { _pusher.EmitChannelEvent(message.channel, message.@event, receivedEvent); } }
void IPusher.EmitPusherEvent(string eventName, PusherEvent data) { EmitEvent(eventName, data); }