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