/// <summary> /// Remove listener by type and callback instance /// </summary> /// /// <param name="type">event type</param> /// <param name="callback">callback instance</param> public void Off(string type, Action <IEnumerable <object> > callback) { if (EventListenersDict.ContainsKey(type)) { EventListenersDict[type].Remove(callback); } }
/// <summary> /// Remove listeners by event type and index position /// </summary> /// <param name="type">event type</param> /// <param name="index">position</param> public void Off(string type, int index) { if (EventListenersDict.ContainsKey(type)) { EventListenersDict[type].RemoveAt(index); } }
/// <summary> /// Remove listeners by event type /// </summary> /// <param name="type">event type</param> public void Off(string type) { if (EventListenersDict.ContainsKey(type)) { EventListenersDict[type].Clear(); } }
/// <summary> /// Method for callback to receive message and emit information to listners /// </summary> /// <param name="result"></param> private void ReceiveMessage(byte[] result) { if (result == null) { return; } using (MemoryStream ms = new MemoryStream()) { string jsonStr = null; ms.Write(result, 0, result.Length); ms.Seek(0, SeekOrigin.Begin); var iop = ms.ReadByte() - '0'; if (iop == (byte)EngineIOPacketOp.OPEN) { using (var sr = new StreamReader(ms)) { jsonStr = sr.ReadToEnd(); } ParseEngineIOInitValues(jsonStr); } else if (iop == (byte)EngineIOPacketOp.MESSAGE) { var siop = ms.ReadByte() - '0'; if (siop == (byte)SocketIOPacketOp.EVENT) { //skip "," from packet ms.Seek(ms.Position + Namespace.Length + 2, SeekOrigin.Begin); using (var sr = new StreamReader(ms)) { jsonStr = sr.ReadToEnd(); } EmitToEventListeners(jsonStr); } else if (!isConnected && siop == (byte)SocketIOPacketOp.CONNECT) { //connect to socket.io Socket.SendAsync(string.Format("{0}/{1}", IOConnectOpcode, Namespace)); isConnected = true; } } else if (iop == (byte)EngineIOPacketOp.PONG) { List <Action <IEnumerable <object> > > eventListeners = null; if (EventListenersDict.TryGetValue("pong", out eventListeners)) { foreach (var listener in eventListeners) { listener(new List <object>()); } } } } }
/// <summary> /// Create Listener to a socket io event /// </summary> /// <param name="type">event type</param> /// <param name="callback">callback with event arguments</param> public void On(string type, Action <IEnumerable <object> > callback) { if (callback == null) { return; } List <Action <IEnumerable <object> > > eventListeners = null; if (EventListenersDict.TryGetValue(type, out eventListeners)) { eventListeners.Add(callback); } else { EventListenersDict.Add(type, new List <Action <IEnumerable <object> > >() { callback }); } }
protected override void EmitToEventListeners(string jsonStr) { var jArr = JArray.Parse(jsonStr); if (jArr.Count == 0) { return; } string type = jArr[0].ToObject <string>(); List <Action <IEnumerable <object> > > eventListeners = null; if (EventListenersDict.TryGetValue(type, out eventListeners)) { var args = jArr.Skip(1); foreach (var listener in eventListeners) { listener(args); } } }
protected override void HandleEventResponse(IEnumerable <object> args) { var data = args.Cast <JToken>().First(); var eventToken = data.SelectToken("event"); if (eventToken == null) { throw new Exception("event type not found."); } string type = eventToken.ToObject <string>(); List <Action <object> > eventListeners = null; if (EventListenersDict.TryGetValue(type, out eventListeners)) { foreach (var listener in eventListeners) { listener(data.SelectToken("payload")); } } }