Example #1
0
        private void HandleUnsubscribeEventMessage(UnsubscribeEventMessage unsubscribeEventMessage,
                                                   IInputContext context)
        {
            if (!_objectsRepository.TryGetObject(unsubscribeEventMessage.ObjectId, out var objectAdapter) || objectAdapter == null)
            {
                WriteObjectNotFoundError(context, unsubscribeEventMessage.ObjectId);
                return;
            }

            if (!objectAdapter.Events.TryGetValue(unsubscribeEventMessage.EventName, out var ev))
            {
                WriteEventNotFoundError(context, unsubscribeEventMessage.ObjectId, unsubscribeEventMessage.EventName);
                return;
            }

            ISubscription subscription;

            lock (_subscriptions)
            {
                if (!_subscriptions.TryGetValue(ev, out subscription))
                {
                    //No exception or error is needed (same as for standard c# events when unsubscribed from a delegate that was not subscribed before).
                    return;
                }

                _subscriptions.Remove(ev);
            }

            subscription.Dispose();

            var ackMessage = new AckMessage(unsubscribeEventMessage.ClientHostAddress);

            context.Write(ackMessage.ToFrame());
        }
Example #2
0
        private void HandleSubscribeEventMessage(SubscribeEventMessage subscribeEventMessage, IInputContext context)
        {
            if (!_objectsRepository.TryGetObject(subscribeEventMessage.ObjectId, out var objectAdapter) || objectAdapter == null)
            {
                WriteObjectNotFoundError(context, subscribeEventMessage.ObjectId);
                return;
            }

            if (!objectAdapter.Events.TryGetValue(subscribeEventMessage.EventName, out var ev))
            {
                WriteEventNotFoundError(context, subscribeEventMessage.ObjectId, subscribeEventMessage.EventName);
                return;
            }

            var subscription = new Subscription(subscribeEventMessage.ObjectId, subscribeEventMessage.EventName,
                                                subscribeEventMessage.ClientHostAddress, _outputChannel, ev);

            lock (_subscriptions)
            {
                if (_subscriptions.ContainsKey(ev))
                {
                    WriteEventAlreadySubscribedError(context, subscribeEventMessage.ObjectId, subscribeEventMessage.EventName);
                    return;
                }
                _subscriptions.Add(ev, subscription);
            }

            var ackMessage = new AckMessage(subscribeEventMessage.ClientHostAddress);

            context.Write(ackMessage.ToFrame());
        }
Example #3
0
        private void HandleConnect(ConnectMessage connectMessage, IInputContext context)
        {
            if (!_objectsRepository.TryGetObject(connectMessage.ObjectId, out _))
            {
                WriteObjectNotFoundError(context, connectMessage.ObjectId);
                return;
            }

            var ackMessage = new AckMessage(connectMessage.ClientHostAddress);

            context.Write(ackMessage.ToFrame());
        }
Example #4
0
        private void HandleHello(Message helloMessage, IInputContext context)
        {
            var clientHostAddress = helloMessage.ClientHostAddress;

            lock (_sessions)
            {
                if (_sessions.ContainsKey(clientHostAddress))
                {
                    return;
                }

                var outputChannel = _binding.CreateOutputChannel(clientHostAddress);

                var session = new Session(_binding, clientHostAddress, _objectsRepository, outputChannel);

                session.Terminated += SessionOnTerminated;

                var helloAck = new AckMessage(clientHostAddress);
                context.Write(helloAck.ToFrame());

                _sessions.Add(clientHostAddress, session);
            }
        }