public ConnectedEventArgs(ConnectedFrame connectedFrame) { this.ConnectedFrame = connectedFrame; }
public void ProcessMessage(string sessionId, string messageString) { if (messageString == "\r\n") { Log.Trace("EOL received"); if (this.sessionIdToHeartbeatReceivedTimers.ContainsKey(sessionId)) { var heartbeatReceiveTimerToResett = this.sessionIdToHeartbeatReceivedTimers[sessionId]; heartbeatReceiveTimerToResett.Stop(); heartbeatReceiveTimerToResett.Start(); } return; } Log.Debug($"Message received from client '{sessionId}': {messageString}"); var stompFrame = IStompFrame.Deserialize(messageString); switch (stompFrame) { case ConnectFrame frame: var version = "1.2"; var connectedFrame = new ConnectedFrame(version) { Headers = new ConnectedFrameHeaders() { Version = version, Session = sessionId, Server = "Stomp4Net/1.0.0", Heartbeat = $"{this.StompHeartbeatIntervalFromServerToClient.TotalMilliseconds},{this.StompHeartbeatIntervalFromClientToServer.TotalMilliseconds}", }, }; if (frame.ClientExpectedHeartbeatInterval.TotalMilliseconds != 0) { var heartbeatSendTimer = new Timer(this.StompHeartbeatIntervalFromServerToClient.TotalMilliseconds); heartbeatSendTimer.Elapsed += this.SendHeartbeatTimerElapsed; heartbeatSendTimer.Start(); this.sessionIdToHeartbeatSendTimers.Add(sessionId, heartbeatSendTimer); this.heartbeatSendTimersToSessionId.Add(heartbeatSendTimer, sessionId); } if (frame.ClientExpectedHeartbeatInterval.TotalMilliseconds != 0) { var heartbeatReceiveTimer = new Timer( (this.StompHeartbeatIntervalFromServerToClient + this.StompHeartbeatTimeout).TotalMilliseconds); heartbeatReceiveTimer.Elapsed += this.ReceiveHeartbeatTimerElapsed; heartbeatReceiveTimer.Start(); this.sessionIdToHeartbeatReceivedTimers.Add(sessionId, heartbeatReceiveTimer); this.heartbeatReceivedTimersToSessionId.Add(heartbeatReceiveTimer, sessionId); } this.SendStompFrame(sessionId, connectedFrame); this.ClientConnected?.Invoke(this, new ClientConnectedEventArgs(sessionId)); break; case StompFrame frame: version = "1.2"; connectedFrame = new ConnectedFrame(version) { Headers = new ConnectedFrameHeaders() { Version = version, Session = sessionId, Server = "Stomp4Net/1.0.0", Heartbeat = $"{this.StompHeartbeatIntervalFromServerToClient.TotalMilliseconds},{this.StompHeartbeatIntervalFromClientToServer.TotalMilliseconds}", }, }; if (frame.ClientExpectedHeartbeatInterval.TotalMilliseconds != 0) { var heartbeatSendTimer = new Timer(this.StompHeartbeatIntervalFromServerToClient.TotalMilliseconds); heartbeatSendTimer.Elapsed += this.SendHeartbeatTimerElapsed; heartbeatSendTimer.Start(); this.sessionIdToHeartbeatSendTimers.Add(sessionId, heartbeatSendTimer); this.heartbeatSendTimersToSessionId.Add(heartbeatSendTimer, sessionId); } if (frame.ClientExpectedHeartbeatInterval.TotalMilliseconds != 0) { var heartbeatReceiveTimer = new Timer( (this.StompHeartbeatIntervalFromServerToClient + this.StompHeartbeatTimeout).TotalMilliseconds); heartbeatReceiveTimer.Elapsed += this.ReceiveHeartbeatTimerElapsed; heartbeatReceiveTimer.Start(); this.sessionIdToHeartbeatReceivedTimers.Add(sessionId, heartbeatReceiveTimer); this.heartbeatReceivedTimersToSessionId.Add(heartbeatReceiveTimer, sessionId); } this.SendStompFrame(sessionId, connectedFrame); this.ClientConnected?.Invoke(this, new ClientConnectedEventArgs(sessionId)); break; case SendFrame frame: var eventArguments = new EventArguments.SendReceivedEventArgs(sessionId, frame); if (this.notificationForDestinationCallbacks.ContainsKey(frame.Headers.Destination)) { var parameters = new object[] { this, eventArguments, }; this.notificationForDestinationCallbacks[frame.Headers.Destination].DynamicInvoke(parameters); } else { this.SendReceived?.Invoke( this, eventArguments); } if (this.stompSubscriptions.ContainsKey(frame.Headers.Destination)) { var subscriptionsToNotify = this.stompSubscriptions[frame.Headers.Destination]; foreach (var subscriptionToNotify in subscriptionsToNotify) { var messageFrame = new MessageFrame(frame.Headers.Destination, subscriptionToNotify.Id, frame.Body, frame.Headers.ContentType); this.SendStompFrame(subscriptionToNotify.SessionId, messageFrame); } } break; case SubscribeFrame frame: List <StompSubscription> stompSubscriptionsForDestination; if (this.stompSubscriptions.ContainsKey(frame.Headers.Id)) { stompSubscriptionsForDestination = this.stompSubscriptions[frame.Headers.Destination]; } else { stompSubscriptionsForDestination = new List <StompSubscription>(); } stompSubscriptionsForDestination.Add(new StompSubscription(frame.Headers.Id, sessionId)); this.stompSubscriptions[frame.Headers.Destination] = stompSubscriptionsForDestination; break; case DisconnectFrame frame: this.ClientDisconnected?.Invoke(this, new ClientDisconnectedEventArgs(sessionId)); break; default: Log.Warn($"Unkown frame: {messageString}"); break; } if (this.sessionIdToHeartbeatReceivedTimers.ContainsKey(sessionId)) { var heartbeatReceiveTimerToReset = this.sessionIdToHeartbeatReceivedTimers[sessionId]; heartbeatReceiveTimerToReset.Stop(); heartbeatReceiveTimerToReset.Start(); } }