Example #1
0
            public bool Register(string connectionId, Action <string[]> onChanged)
            {
                ConcurrentDictionary <string, IDisposable> dict;

                if (!Listeners.TryGetValue(typeof(TDomainObject), out dict))
                {
                    dict = new ConcurrentDictionary <string, IDisposable>();
                    if (!Listeners.TryAdd(typeof(TDomainObject), dict))
                    {
                        return(false);
                    }
                }
                var name     = typeof(TDomainObject).FullName;
                var listener = ChangeNotification.Track <TDomainObject>().Subscribe(kv => onChanged(kv.Key));

                if (!dict.TryAdd(connectionId, listener))
                {
                    listener.Dispose();
                }
                else
                {
                    ConcurrentBag <Type> bag;
                    if (!Connections.TryGetValue(connectionId, out bag))
                    {
                        bag = new ConcurrentBag <Type>();
                        Connections.TryAdd(connectionId, bag);
                    }
                    bag.Add(typeof(TDomainObject));
                }
                return(true);
            }
Example #2
0
        public async Task SendAsync(MessageRequest msg, Func <MessageResponse, bool?> callback, TimeSpan?timeout = null)
        {
            var callbackStruct = new MessageCallback
            {
                TaskCompleter = new TaskCompletionSource <bool>(),
                Expires       = Clock.Now.Add(timeout ?? TimeSpan.FromMinutes(1)),
                Callback      = callback
            };

            Listeners.TryAdd(msg.Id, callbackStruct);
            await SendAsync(msg);

            await callbackStruct.TaskCompleter.Task;
        }
Example #3
0
            public bool Register(string connectionId, Type type, string specificationJson, Action <string> onMatched)
            {
                Func <TDomainObject, bool> isMatched;

                try
                {
                    ISpecification <TDomainObject> specification = (ISpecification <TDomainObject>)Newtonsoft.Json.JsonConvert.DeserializeObject(specificationJson, type);
                    isMatched = specification.IsSatisfied.Compile();
                }
                catch { return(false); }
                ConcurrentDictionary <string, IDisposable> dict;

                if (!Listeners.TryGetValue(typeof(TDomainObject), out dict))
                {
                    dict = new ConcurrentDictionary <string, IDisposable>();
                    if (!Listeners.TryAdd(typeof(TDomainObject), dict))
                    {
                        return(false);
                    }
                }
                var name     = typeof(TDomainObject).FullName;
                var listener = ChangeNotification.Track <TDomainObject>().Subscribe(kv =>
                {
                    foreach (var v in kv.Value.Value)
                    {
                        if (isMatched(v))
                        {
                            onMatched(v.URI);
                        }
                    }
                });

                if (!dict.TryAdd(connectionId, listener))
                {
                    listener.Dispose();
                }
                else
                {
                    ConcurrentBag <Type> bag;
                    if (!Connections.TryGetValue(connectionId, out bag))
                    {
                        bag = new ConcurrentBag <Type>();
                        Connections.TryAdd(connectionId, bag);
                    }
                    bag.Add(typeof(TDomainObject));
                }
                return(true);
            }
        private Boolean setupListeners()
        {
            authListener    = new AuthentificationListener();
            channelListener = new ChannelListener();

            if (!Listeners.TryAdd(typeof(LoginResponsePacket), authListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(WelcomePacket), authListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(RegisterResponsePacket), authListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(LoginTokenResponsePacket), authListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(GetChannelResponsePacket), channelListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(MessagePacket), channelListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(PresencePacket), channelListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(RenameChannelResponsePacket), channelListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(CreateChannelResponsePacket), channelListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(DeleteChannelResponsePacket), channelListener))
            {
                return(false);
            }

            return(true);
        }
        private Boolean setupListeners()
        {
            AuthentificationListener auth             = new AuthentificationListener();
            ChannelListener          channelsListener = new ChannelListener();

            if (!Listeners.TryAdd(typeof(LoginPacket), auth))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(WelcomePacket), auth))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(RegisterPacket), auth))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(LoginTokenPacket), auth))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(GetChannelPacket), channelsListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(NewMessagePacket), channelsListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(RenameChannelPacket), channelsListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(CreateChannelPacket), channelsListener))
            {
                return(false);
            }
            if (!Listeners.TryAdd(typeof(DeleteChannelPacket), channelsListener))
            {
                return(false);
            }

            return(true);
        }
        private void AddListener(IEventListener listener, Type eventType)
        {
            var dlist = new List <IEventListener>();

            if (Listeners.TryGetValue(eventType, out dlist))
            {
                if (!dlist.Contains(listener))
                {
                    dlist.Add(listener);
                }
            }
            else
            {
                dlist = new List <IEventListener> {
                    listener
                };
                Listeners.TryAdd(eventType, dlist);
            }
        }