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()); }
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()); }
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()); }
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); } }