Ejemplo n.º 1
0
        public RabbitBus(
            IEasyNetQLogger logger,
            IConventions conventions,
            IAdvancedBus advancedBus,
            IPublishExchangeDeclareStrategy publishExchangeDeclareStrategy,
            IRpc rpc,
            ISendReceive sendReceive,
            IConnectionConfiguration connectionConfiguration)
        {
            Preconditions.CheckNotNull(logger, "logger");
            Preconditions.CheckNotNull(conventions, "conventions");
            Preconditions.CheckNotNull(advancedBus, "advancedBus");
            Preconditions.CheckNotNull(publishExchangeDeclareStrategy, "publishExchangeDeclareStrategy");
            Preconditions.CheckNotNull(rpc, "rpc");
            Preconditions.CheckNotNull(sendReceive, "sendReceive");
            Preconditions.CheckNotNull(connectionConfiguration, "connectionConfiguration");

            this.logger      = logger;
            this.conventions = conventions;
            this.advancedBus = advancedBus;
            this.publishExchangeDeclareStrategy = publishExchangeDeclareStrategy;
            this.rpc                     = rpc;
            this.sendReceive             = sendReceive;
            this.connectionConfiguration = connectionConfiguration;

            advancedBus.Connected    += OnConnected;
            advancedBus.Disconnected += OnDisconnected;
        }
Ejemplo n.º 2
0
 public RpcTask(int id, IRpc rpc, DateTime expire)
 {
     CompleteWaiter = new ManualResetEventSlim(false);
     Id             = id;
     Rpc            = rpc;
     ExpireDate     = expire;
 }
Ejemplo n.º 3
0
        public AzureBus(
            IAzureNetQLogger logger,
            IConventions conventions,
            IRpc rpc,
            ISendReceive sendReceive,
            IAzureAdvancedBus advancedBus,
            IConnectionConfiguration connectionConfiguration,
            ISerializer serializer)
        {
            Preconditions.CheckNotNull(logger, "logger");
            Preconditions.CheckNotNull(conventions, "conventions");
            Preconditions.CheckNotNull(rpc, "rpc");
            Preconditions.CheckNotNull(sendReceive, "sendReceive");
            Preconditions.CheckNotNull(advancedBus, "advancedBus");
            Preconditions.CheckNotNull(connectionConfiguration, "connectionConfiguration");
            Preconditions.CheckNotNull(serializer, "serializer");

            this.logger                  = logger;
            this.conventions             = conventions;
            this.rpc                     = rpc;
            this.sendReceive             = sendReceive;
            this.advancedBus             = advancedBus;
            this.connectionConfiguration = connectionConfiguration;
            this.serializer              = serializer;
            this.exceptionHandler        = new ExceptionHandler(logger);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Retorna o RPC registrado para o número de mensagem informado, ou null caso
        /// não haja um RPC registrado para o número de mensagem.
        /// </summary>
        /// <param name="msgId">Número da mensagem</param>
        /// <returns>RPC registrado para o número da mensagem, ou null caso nenhum registrado.</returns>
        protected IRpc GetRpc(int msgId)
        {
            IRpc rpc = null;

            m_rpcs.TryGetValue(msgId, out rpc);
            return(rpc);
        }
Ejemplo n.º 5
0
 public Proto5Handler(TezosNode node, TzktContext db, CacheService cache, QuotesService quotes, IServiceProvider services, IConfiguration config, ILogger <Proto5Handler> logger)
     : base(node, db, cache, quotes, services, config, logger)
 {
     Rpc         = new Rpc(node);
     Diagnostics = new Diagnostics(this);
     Validator   = new Validator(this);
 }
Ejemplo n.º 6
0
        private RpcManager()
        {
            this.asyncRpcIndex  = 0;
            QueuedRpcs          = new Dictionary <Player, Queue <QueuedRpc> >();
            registeredRPCs      = new Dictionary <string, List <RegisteredRpc> >();
            registeredAsyncRPCs = new Dictionary <string, List <RegisteredRpc> >();

            RootElement.OnMiscelaniousEvent += (eventName, source, p1, p2, p3, p4, p5, p6, p7, p8) =>
            {
                if (registeredRPCs.ContainsKey(eventName))
                {
                    Player player = ElementManager.Instance.GetElement <Player>(source);

                    var registeredRpcs = registeredRPCs[eventName];

                    foreach (var registeredRpc in registeredRpcs)
                    {
                        var method = registeredRpc.callback;

                        IRpc rpc = (IRpc)Activator.CreateInstance(registeredRpc.type);
                        rpc.Parse(p1);
                        method.Invoke(player, rpc);
                    }
                }
                else if (registeredAsyncRPCs.ContainsKey(eventName))
                {
                    Player player = ElementManager.Instance.GetElement <Player>(source);

                    var registeredRpcs = registeredAsyncRPCs[eventName];

                    foreach (var registeredRpc in registeredRpcs)
                    {
                        var method = registeredRpc.callback;

                        AsyncRpc asyncRpc = Activator.CreateInstance <AsyncRpc>();
                        asyncRpc.Parse(p1);

                        method.Invoke(player, asyncRpc);
                    }
                }
            };

            RegisterRPC <EmptyRpc>("slipe-client-ready-rpc", (player, rpc) =>
            {
                if (QueuedRpcs.TryGetValue(player, out Queue <QueuedRpc> rpcQueue))
                {
                    player.IsReadyForIncomingRequests = true;
                    QueuedRpcs.Remove(player);
                    while (rpcQueue.TryDequeue(out QueuedRpc queuedRpc))
                    {
                        if (queuedRpc.bandwidth != -1)
                        {
                            TriggerLatentRPC(player, queuedRpc.key, queuedRpc.bandwidth, queuedRpc.rpc, queuedRpc.persists);
                        }
                        else
                        {
                            TriggerRPC(player, queuedRpc.key, queuedRpc.rpc);
                        }
                    }
                }
Ejemplo n.º 7
0
 public QueuedRpc(string key, IRpc rpc, int bandwidth, bool persists)
 {
     this.key       = key;
     this.rpc       = rpc;
     this.bandwidth = bandwidth;
     this.persists  = persists;
 }
Ejemplo n.º 8
0
        private void QueueRpc(Player target, string key, IRpc argument, int bandwidth = -1, bool persists = false)
        {
            if (!QueuedRpcs.ContainsKey(target))
            {
                QueuedRpcs[target] = new List <QueuedRpc>();
            }

            QueuedRpcs[target].Add(new QueuedRpc(key, argument, bandwidth, persists));
        }
Ejemplo n.º 9
0
        public RpcTask Send(uint packetId, IRpc rpc, int timeout = 60000)
        {
            var expire = DateTime.Now.AddMilliseconds(timeout);

            if (timeout == -1)
            {
                expire = DateTime.MaxValue;
            }
            return(Send(packetId, rpc, expire));
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Retorna o RPC para o número de mensagem, ou null em caso de nenhum RPC registrado
        /// para o número informado (p.ex. nova requisição).
        /// </summary>
        /// <param name="msgId">Número de mensagem</param>
        /// <returns>RPC ativo, ou null caso nenhum ativo para o número de mensagem.</returns>
        private IRpc GetRpc(int msgId)
        {
            IRpc ret = null;

            if (m_Rpcs.TryGetValue(msgId, out ret))
            {
                return(ret);
            }
            return(null);
        }
Ejemplo n.º 11
0
        public void Call(IRpc f, int id, string method, ListTreeNode <T> args)
        {
            Callback callback;

            if (!m_map.TryGetValue(method, out callback))
            {
                throw new KeyNotFoundException();
            }
            callback(id, args, f);
        }
Ejemplo n.º 12
0
        /// <summary>
        ///     Set up a responder for an RPC service.
        /// </summary>
        /// <typeparam name="TRequest">The request type</typeparam>
        /// <typeparam name="TResponse">The response type</typeparam>
        /// <param name="rpc">The rpc instance</param>
        /// <param name="responder">A function that performs the response</param>
        /// <param name="cancellationToken">The cancellation token</param>
        public static AwaitableDisposable <IDisposable> RespondAsync <TRequest, TResponse>(
            this IRpc rpc,
            Func <TRequest, Task <TResponse> > responder,
            CancellationToken cancellationToken = default
            )
        {
            Preconditions.CheckNotNull(rpc, "rpc");

            return(rpc.RespondAsync <TRequest, TResponse>((r, c) => responder(r), c => { }, cancellationToken));
        }
Ejemplo n.º 13
0
        public static RpcServer UseRpc(this IRpc host, RpcServer server)
        {
            var tupple = host.ReflectRpcFunctions();

            tupple.ForEach(t =>
            {
                server.Register(t.Item1, t.Item2);
            });
            return(server);
        }
Ejemplo n.º 14
0
        /// <summary>
        ///     Set up a responder for an RPC service.
        /// </summary>
        /// <typeparam name="TRequest">The request type</typeparam>
        /// <typeparam name="TResponse">The response type</typeparam>
        /// <param name="rpc">The rpc instance</param>
        /// <param name="responder">A function that performs the response</param>
        /// <param name="cancellationToken">The cancellation token</param>
        public static IDisposable Respond <TRequest, TResponse>(
            this IRpc rpc,
            Func <TRequest, Task <TResponse> > responder,
            CancellationToken cancellationToken = default
            )
        {
            Preconditions.CheckNotNull(rpc, "rpc");

            return(rpc.Respond(responder, c => { }, cancellationToken));
        }
Ejemplo n.º 15
0
        /// <summary>
        ///     Makes an RPC style request
        /// </summary>
        /// <typeparam name="TRequest">The request type</typeparam>
        /// <typeparam name="TResponse">The response type</typeparam>
        /// <param name="rpc">The rpc instance.</param>
        /// <param name="request">The request message.</param>
        /// <param name="cancellationToken">The cancellation token</param>
        /// <returns>The response</returns>
        public static Task <TResponse> RequestAsync <TRequest, TResponse>(
            this IRpc rpc,
            TRequest request,
            CancellationToken cancellationToken = default
            )
        {
            Preconditions.CheckNotNull(rpc, "rpc");

            return(rpc.RequestAsync <TRequest, TResponse>(request, c => { }, cancellationToken));
        }
Ejemplo n.º 16
0
        public static TMLobby RecallRpc(this IRpc host, TMLobby lobby)
        {
            var tupple = host.ReflectRpcFunctions();

            tupple.ForEach(t =>
            {
                lobby.Unregister(t.Item1);
            });
            return(lobby);
        }
Ejemplo n.º 17
0
 /// <summary>
 /// Trigger an RPC on a player
 /// </summary>
 public void TriggerRPC(Player target, string key, IRpc argument)
 {
     if (!target.IsReadyForIncomingRequests && argument.OnClientRpcFailed == ClientRpcFailedAction.Queue)
     {
         QueueRpc(target, key, argument);
     }
     else
     {
         MtaServer.TriggerClientEvent(target.MTAElement, key, Element.Root.MTAElement, argument);
     }
 }
Ejemplo n.º 18
0
        /// <summary>
        ///     Makes an RPC style request
        /// </summary>
        /// <param name="rpc">The rpc instance.</param>
        /// <param name="request">The request message.</param>
        /// <param name="requestType">The request type</param>
        /// <param name="responseType">The response type</param>
        /// <param name="configure">
        ///     Fluent configuration e.g. x => x.WithQueueName("uk.london")
        /// </param>
        /// <param name="cancellationToken">The cancellation token</param>
        /// <returns>The response</returns>
        public static Task <object> RequestAsync(
            this IRpc rpc,
            object request,
            Type requestType,
            Type responseType,
            Action <IRequestConfiguration> configure,
            CancellationToken cancellationToken = default
            )
        {
            Preconditions.CheckNotNull(rpc, "rpc");

            var requestDelegate = RequestDelegates.GetOrAdd(Tuple.Create(requestType, responseType), t =>
            {
                var requestMethodInfo = typeof(IRpc).GetMethod("RequestAsync");
                if (requestMethodInfo == null)
                {
                    throw new MissingMethodException(nameof(IRpc), "RequestAsync");
                }

                var toTaskOfObjectMethodInfo = typeof(NonGenericRpcExtensions).GetMethod(nameof(ToTaskOfObject), BindingFlags.NonPublic | BindingFlags.Static);
                if (toTaskOfObjectMethodInfo == null)
                {
                    throw new MissingMethodException(nameof(NonGenericRpcExtensions), nameof(ToTaskOfObject));
                }

                var genericRequestPublishMethodInfo = requestMethodInfo.MakeGenericMethod(t.Item1, t.Item2);
                var genericToTaskOfObjectMethodInfo = toTaskOfObjectMethodInfo.MakeGenericMethod(t.Item2);
                var rpcParameter                       = Expression.Parameter(typeof(IRpc), "rpc");
                var requestParameter                   = Expression.Parameter(typeof(object), "request");
                var requestTypeParameter               = Expression.Parameter(typeof(Type), "requestType");
                var responseTypeParameter              = Expression.Parameter(typeof(Type), "responseType");
                var configureParameter                 = Expression.Parameter(typeof(Action <IRequestConfiguration>), "configure");
                var cancellationTokenParameter         = Expression.Parameter(typeof(CancellationToken), "cancellationToken");
                var genericRequestMethodCallExpression = Expression.Call(
                    rpcParameter,
                    genericRequestPublishMethodInfo,
                    Expression.Convert(requestParameter, t.Item1),
                    configureParameter,
                    cancellationTokenParameter
                    );
                var lambda = Expression.Lambda <NonGenericRequestDelegate>(
                    Expression.Call(null, genericToTaskOfObjectMethodInfo, genericRequestMethodCallExpression),
                    rpcParameter,
                    requestParameter,
                    requestTypeParameter,
                    responseTypeParameter,
                    configureParameter,
                    cancellationTokenParameter
                    );
                return(lambda.Compile());
            });

            return(requestDelegate(rpc, request, requestType, responseType, configure, cancellationToken));
        }
Ejemplo n.º 19
0
        /// <summary>
        ///     Set up a responder for an RPC service.
        /// </summary>
        /// <typeparam name="TRequest">The request type</typeparam>
        /// <typeparam name="TResponse">The response type</typeparam>
        /// <param name="rpc">The rpc instance</param>
        /// <param name="responder">A function that performs the response</param>
        /// <param name="configure">A function that performs the configuration</param>
        /// <param name="cancellationToken">The cancellation token</param>
        public static IDisposable Respond <TRequest, TResponse>(
            this IRpc rpc,
            Func <TRequest, Task <TResponse> > responder,
            Action <IResponderConfiguration> configure,
            CancellationToken cancellationToken = default
            )
        {
            Preconditions.CheckNotNull(rpc, "rpc");

            return(rpc.Respond <TRequest, TResponse>((r, c) => responder(r), configure, cancellationToken));
        }
Ejemplo n.º 20
0
 /// <summary>
 /// Trigger an RPC with limited bandwidth
 /// </summary>
 public void TriggerLatentRPC(Player target, string key, int bandwidth, IRpc argument, bool persists = false)
 {
     if (!target.IsReadyForIncomingRequests && argument.OnClientRpcFailed == ClientRpcFailedAction.Queue)
     {
         QueueRpc(target, key, argument, bandwidth, persists);
     }
     else
     {
         MtaServer.TriggerLatentClientEvent(target.MTAElement, key, bandwidth, persists, Element.Root.MTAElement, argument);
     }
 }
Ejemplo n.º 21
0
        /// <summary>
        ///     Set up a responder for an RPC service.
        /// </summary>
        /// <typeparam name="TRequest">The request type</typeparam>
        /// <typeparam name="TResponse">The response type</typeparam>
        /// <param name="rpc">The rpc instance</param>
        /// <param name="responder">A function that performs the response</param>
        /// <param name="cancellationToken">The cancellation token</param>
        public static AwaitableDisposable <IDisposable> RespondAsync <TRequest, TResponse>(
            this IRpc rpc,
            Func <TRequest, TResponse> responder,
            CancellationToken cancellationToken = default
            )
        {
            Preconditions.CheckNotNull(rpc, "rpc");

            var asyncResponder = TaskHelpers.FromFunc <TRequest, TResponse>((m, c) => responder(m));

            return(rpc.RespondAsync <TRequest, TResponse>(asyncResponder, c => { }, cancellationToken));
        }
Ejemplo n.º 22
0
        /// <summary>
        ///     Makes an RPC style request
        /// </summary>
        /// <typeparam name="TRequest">The request type</typeparam>
        /// <typeparam name="TResponse">The response type</typeparam>
        /// <param name="rpc">The rpc instance.</param>
        /// <param name="request">The request message.</param>
        /// <param name="cancellationToken">The cancellation token</param>
        /// <returns>The response</returns>
        public static TResponse Request <TRequest, TResponse>(
            this IRpc rpc,
            TRequest request,
            CancellationToken cancellationToken = default
            )
        {
            Preconditions.CheckNotNull(rpc, "rpc");

            return(rpc.RequestAsync <TRequest, TResponse>(request, cancellationToken)
                   .GetAwaiter()
                   .GetResult());
        }
Ejemplo n.º 23
0
        /// <summary>
        ///     Makes an RPC style request
        /// </summary>
        /// <param name="rpc">The rpc instance.</param>
        /// <param name="request">The request message.</param>
        /// <param name="requestType">The request type</param>
        /// <param name="responseType">The response type</param>
        /// <param name="cancellationToken">The cancellation token</param>
        /// <returns>The response</returns>
        public static Task <object> RequestAsync(
            this IRpc rpc,
            object request,
            Type requestType,
            Type responseType,
            CancellationToken cancellationToken = default
            )
        {
            Preconditions.CheckNotNull(rpc, "rpc");

            return(rpc.RequestAsync(request, requestType, responseType, c => { }, cancellationToken));
        }
Ejemplo n.º 24
0
        public static Task RpcAsync(this IRpc @this, IEnumerable <TMClient> clients, string methodName, bool isStatic, params object[] args)
        {
            var type          = @this.GetType();
            var hostAttribute = type.GetCustomAttribute <RpcHostAttribute>();
            var hostName      = string.IsNullOrEmpty(hostAttribute.Name) ? type.Name : hostAttribute.Name;
            var rpcMethodName = string.Format("{0}_{1}", hostName, methodName);

            if (!isStatic)
            {
                var hostId = @this.ReflectRpcHostIdPropertyValue();
                rpcMethodName = $"{hostName}_{hostId}_{methodName}";
            }
            return(clients.RpcAsync(rpcMethodName, args));
        }
Ejemplo n.º 25
0
        /// <summary>
        /// Callback de notificação de pacote recebido.
        /// Localiza o RPC a partir do número da mensagem e transmite o pacote
        /// para o RPC.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="packet"></param>
        protected void OnPacketReceived(object sender, InternalPacket packet)
        {
            int msgId = packet.MsgId;

            IRpc rpc = GetRpc(msgId);

            if (rpc != null)
            {
                rpc.OnPacketReceived(GetSession(), packet);
                return;
            }

            MyDebug.LogDebug("Channel.OnPacketReceived: msgid {0} desconhecido ou inesperado", packet.MsgId);
        }
Ejemplo n.º 26
0
        /// <summary>
        ///     Makes an RPC style request
        /// </summary>
        /// <param name="rpc">The rpc instance.</param>
        /// <param name="request">The request message.</param>
        /// <param name="requestType">The request type</param>
        /// <param name="responseType">The response type</param>
        /// <param name="cancellationToken">The cancellation token</param>
        /// <returns>The response</returns>
        public static object Request(
            this IRpc rpc,
            object request,
            Type requestType,
            Type responseType,
            CancellationToken cancellationToken = default
            )
        {
            Preconditions.CheckNotNull(rpc, "rpc");

            return(rpc.RequestAsync(request, requestType, responseType, cancellationToken)
                   .GetAwaiter()
                   .GetResult());
        }
Ejemplo n.º 27
0
 public RabbitBus(
     IAdvancedBus advanced,
     IPubSub pubSub,
     IRpc rpc,
     ISendReceive sendReceive,
     IScheduler scheduler,
     IRabbitMQPersistentConnection connection)
 {
     _advanced    = advanced;
     _pubsub      = pubSub;
     _rpc         = rpc;
     _sendreceive = sendReceive;
     _scheduler   = scheduler;
     _connection  = connection;
 }
Ejemplo n.º 28
0
        protected async Task <Tout> CallAsync <Tout>(IRpc rpc)
        {
            var requestPath = config.GetServerEndpoint() + "/" + rpc.Controller;

            client.DefaultRequestHeaders.Clear();
            client.DefaultRequestHeaders.Add("debug-uid-override", sessionData.UID);

            HttpResponseMessage response = await client.GetAsync(requestPath);

            if (response.IsSuccessStatusCode)
            {
                var responseString = await response.Content.ReadAsStringAsync();

                return(JsonConvert.DeserializeObject <Tout>(responseString));
            }
            return(default);
Ejemplo n.º 29
0
        private static bool RpcHandler(YangStatement statement, IRpc partial)
        {
            switch (statement.Keyword)
            {
            case "input":
                partial.Input = ParseStatement(statement, RpcParameterHandlers, new RpcParameter(statement.Keyword));
                return(false);

            case "output":
                partial.Output = ParseStatement(statement, RpcParameterHandlers, new RpcParameter(statement.Keyword));
                return(false);

            default:
                return(false);
            }
        }
Ejemplo n.º 30
0
 public static string ReflectRpcHostIdPropertyValue(this IRpc rpcHost)
 {
     PropertyInfo[] props = rpcHost.GetType().GetProperties();
     foreach (PropertyInfo prop in props)
     {
         object[] attrs = prop.GetCustomAttributes(true);
         foreach (object attr in attrs)
         {
             if (attr is RpcHostIdPropertyAttribute idAttr)
             {
                 return(prop.GetValue(rpcHost).ToString());
             }
         }
     }
     return("");
 }