/// <summary> /// Process messages received and takes proper action, all messages are json objects as string /// </summary> protected override void OnMessage(DiPSWebSockets.MessageEventArgs e) { try { base.OnMessage(e); //The clientId must be sent by the client var dEvent = JsonConvert.DeserializeObject<DiPSEvent>(e.Data); var clientId = Context.QueryString["clientid"]; switch (dEvent.MessageType) { case MessageType.Subscribe: if (!_EventsAndSubscribers.ContainsKey(dEvent.EventName)) _EventsAndSubscribers.Add(dEvent.EventName, new List<string>()); if (!_EventsAndSubscribers[dEvent.EventName].Contains(dEvent.ClientId)) _EventsAndSubscribers[dEvent.EventName].Add(dEvent.ClientId); break; case MessageType.Unsubscribe: if (_EventsAndSubscribers.ContainsKey(dEvent.EventName) && _EventsAndSubscribers[dEvent.EventName].Contains(dEvent.ClientId)) _EventsAndSubscribers[dEvent.EventName].Remove(dEvent.ClientId); break; case MessageType.Publish: if (!_EventsAndSubscribers.ContainsKey(dEvent.EventName)) return; var clients = _EventsAndSubscribers[dEvent.EventName]; clients.ForEach((c) => { //match the session id with the clientid var session = Sessions.Sessions.FirstOrDefault(s => s.Context.QueryString["clientid"] == c); //if the session was found, send the message dEvent.MessageType = MessageType.EventFired; if (session != null) //send it in another thread, this is helpful when we have many subscribers ThreadPool.QueueUserWorkItem(new WaitCallback(SendInThreadAsync), new AsyncMessage { Event = dEvent, SessionId = session.ID }); }); break; } } catch (Exception ex) { Console.WriteLine(ex); } }
/// <summary> /// Do nothing for now, TODO: log the errors /// </summary> protected override void OnError(DiPSWebSockets.ErrorEventArgs e) { base.OnError(e); }
/// <summary> /// We dont want to remove the subscriptions on close, because the client may reconnect, and when it does, it uses the same clientid /// </summary> /// <param name="e"></param> protected override void OnClose(DiPSWebSockets.CloseEventArgs e) { base.OnClose(e); }