Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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();
            }
        }