Beispiel #1
0
        public bool AddMethod <TParam, TResult>(WapEndPoint ep, Func <ClientConnection, TParam, Task <MethodResult <TResult> > > func)
        {
            if (HasMethod(ep))
            {
                return(false);
            }

            var str = ep.ToString();

            var i = new MethodInfo()
            {
                ParameterPayloadType = typeof(TParam).GetPayloadTypeName(),
                ResultPayloadType    = typeof(TResult).GetPayloadTypeName()
            };

            var f = new Func <ClientConnection, ReceivedWapMessage, Task <WapMessage> >(async(client, message) =>
            {
                WapMessage <TParam> msg = WapMessage <TParam> .FromReceivedMessage(message);

                var result = await func(client, msg.Payload);

                WapMessage <MethodResult <TResult> > res = new WapMessage <MethodResult <TResult> >(MessageType.MethodResponse, message.EndPoint, result);
                return(res);
            });

            _infos.Add(str, i);
            _methods.Add(str, f);

            return(true);
        }
Beispiel #2
0
        private Task <WapMessage> MethodCallHandler(ReceivedWapMessage receivedWapMessage)
        {
            if (!_methods.HasMethod(receivedWapMessage.EndPoint))
            {
                var mres = MethodResult <Empty> .FromError("Method not found in this endpoint!");

                var msg = new WapMessage <MethodResult <Empty> >(MessageType.MethodResponse, receivedWapMessage.EndPoint, mres);
                return(Task.FromResult <WapMessage>(msg));
            }

            return(_methods.CallMethod(WapEndPoint.Parse(receivedWapMessage.EndPoint), receivedWapMessage));
        }
Beispiel #3
0
        private async Task <TResult> CallMethod <TParam, TResult>(WapEndPoint ep, TParam param)
        {
            WapMessage <TParam> msg = new WapMessage <TParam>(MessageType.MethodCall, ep.ToString(), param);
            var rMsg = await _conn.CallMethod(msg);

            WapMessage <MethodResult <TResult> > result = WapMessage <MethodResult <TResult> > .FromReceivedMessage(rMsg);

            if (!result.Payload.Success)
            {
                throw new MethodCallFailedException(result.Payload.Error);
            }

            return(result.Payload.Result);
        }
Beispiel #4
0
        protected async Task <EventSubscriber <TEvent> > SubscribeEvent <TEvent>(string endpoint)
        {
            WapEndPoint ep = WapEndPoint.Parse(Endpoint, endpoint);

            await CallControlMethod <RegisterEvent, Empty>("events.subscribe", new RegisterEvent()
            {
                EndPoint    = ep.ToString(),
                PayloadType = typeof(TEvent).GetPayloadTypeName()
            });

            var subscr = new EventSubscriber <TEvent>(ep);
            var hdl    = new Action <ReceivedWapMessage>(msg =>
            {
                WapMessage <TEvent> wm = WapMessage <TEvent> .FromReceivedMessage(msg);
                subscr.PassData(wm.Payload);
            });

            _eventHandlers.Add(subscr, hdl);

            return(subscr);
        }
Beispiel #5
0
        private async Task PublishEventData <TEvent>(EventPublisher <TEvent> sender, TEvent data) where TEvent : new()
        {
            WapMessage <TEvent> msg = new WapMessage <TEvent>(MessageType.Event, sender.Endpoint.ToString(), data);

            await _conn.SendEventMessage(msg);
        }