private void OnWebsocketMessageReceived(object sender, WebSocket4Net.MessageReceivedEventArgs e) { if (e.Message == "\r\n" || e.Message == "\n") { Log.Trace("EOL received"); this.StompHeartbeatReceiveTimer?.Stop(); this.StompHeartbeatReceiveTimer?.Start(); return; } Log.Info($"Websocket message received: {e.Message}"); var stompFrame = IStompFrame.Deserialize(e.Message); switch (stompFrame) { case ConnectedFrame frame: if (frame.ServerExpectedHeartbeatInterval.TotalMilliseconds != 0) { this.StompHeartbeatSendTimer = new System.Timers.Timer(frame.ServerExpectedHeartbeatInterval.TotalMilliseconds); this.StompHeartbeatSendTimer.Elapsed += this.HeartbeatSendTimerElapsed; this.StompHeartbeatSendTimer.Start(); } if (frame.ServerSendingHeartbeatInterval.TotalMilliseconds != 0) { this.StompHeartbeatReceiveTimer = new System.Timers.Timer((this.StompHeartbeatIntervalFromServerToClient + this.StompHeartbeatTimeout).TotalMilliseconds); this.StompHeartbeatReceiveTimer.Elapsed += this.HeartbeatReceivedTimerElapsed; this.StompHeartbeatReceiveTimer.Start(); } this.InvokeConnectedEvent(new ConnectedEventArgs(frame)); break; case ErrorFrame frame: this.InvokeErrorReceivedEvent(new ErrorReceivedEventArgs(frame)); break; case ReceiptFrame frame: this.InvokeReceiptReceivedEvent(new ReceiptReceivedEventArgs(frame)); break; case MessageFrame frame: var eventArguments = new EventArguments.MessageReceivedEventArgs(frame); if (this.subscriptionCallbacks.ContainsKey(frame.Headers.Destination)) { var parameters = new object[] { this, eventArguments, }; this.subscriptionCallbacks[frame.Headers.Destination].DynamicInvoke(parameters); } else { this.InvokeMessageReceivedEvent(eventArguments); } break; default: Log.Info($"Unkown stomp frame: {stompFrame.Body}"); break; } this.StompHeartbeatReceiveTimer?.Stop(); this.StompHeartbeatReceiveTimer?.Start(); }
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(); } }