Example #1
0
        public async Task <CmdResponseBO <PushMessageCmd> > Handle(PushMessageCmd request, CancellationToken cancellationToken)
        {
            // Check if Client is Registered
            var client = _cachingService.Clients.FirstOrDefault(x => x.StreamId == request.Context.ConnectionId);

            if (client == null)
            {
                Console.WriteLine($"Unknown or unauthorized client detected");
                await _hubContext.Clients.Client(request.Context.ConnectionId).SendAsync("TelemetryCall", "Client Unknown or Unauthorized");

                return(new()
                {
                    HttpStatusCode = HttpStatusCode.Forbidden
                });
            }

            request.RequestServer = new()
            {
                RequestId = client.Guid,
                Name      = client.Name
            };

            var telemetry = new StreamFlowTelemetryBO
            {
                ClientGuid   = client.Guid,
                RequestGuid  = request.MessageQueue.RequestGuid,
                ConsumerGuid = request.MessageQueue.ConsumerGuid
            };

            // Execute Sending Message
            switch (request.MessageQueue.ExchangeType)
            {
            case MessageExchangeType.FanOut:
                await _hubContext.Clients.All.SendAsync(request.MessageQueue.CommandName, request.MessageQueue.Data, request.MessageQueue.Message, JsonSerializer.Serialize(telemetry), cancellationToken : cancellationToken);

                break;

            case MessageExchangeType.Direct:
                var c = _cachingService.Clients.FirstOrDefault(x => x.Guid == request.MessageQueue.Recipient);

                if (c != null)
                {
                    Console.WriteLine($"Action: {request.MessageQueue.ExchangeType} | Request ID: {telemetry.RequestGuid} | {request.RequestServer.Name} -> {c.Name}");
                    await _hubContext.Clients.Client(c.StreamId).SendAsync(request.MessageQueue.CommandName, request.MessageQueue.Data, request.MessageQueue.Message, JsonSerializer.Serialize(telemetry), cancellationToken);

                    break;
                }

                if (_cachingService.AbsoluteClients.All(x => x.Guid != request.MessageQueue.Recipient))
                {
                    Console.WriteLine($"Connection with ID {request.RequestServer.RequestId} : {request.RequestServer.Name} has invalid recipient");
                    return(new()
                    {
                        HttpStatusCode = HttpStatusCode.NotFound
                    });
                }

                if (!_streamFlowConfiguration.QueueMessages)
                {
                    Console.WriteLine($"[Message Queue Disabled]; Message from connection with ID {request.RequestServer.RequestId} : {request.RequestServer.Name} has been dropped; Recipient unavailable");
                    break;
                }

                if (_cachingService.QueuedMessages.Where(i => i.Recipient == request.MessageQueue.Recipient).Count() > _streamFlowConfiguration.QueueDepth)
                {
                    Console.WriteLine($"Message from connection with ID {request.RequestServer.RequestId} : {request.RequestServer.Name} cannot be queued: Queue depth has been exhausted");
                    break;
                }

                _cachingService.QueuedMessages.Add(request.MessageQueue);
                Console.WriteLine($"Message from connection with ID {request.RequestServer.RequestId} : {request.RequestServer.Name} has been queued; Recipient unavailable");

                break;

            case MessageExchangeType.Topic:
                await _hubContext.Clients.Group(request.MessageQueue.Recipient.ToString()).SendAsync(request.MessageQueue.CommandName, request.MessageQueue.Data, request.MessageQueue.Message, JsonSerializer.Serialize(telemetry), cancellationToken: cancellationToken);

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(new()
            {
                HttpStatusCode = HttpStatusCode.Accepted
            });
        }
    }
Example #2
0
        public async Task <CmdResponseBO <InvokeMethodResponseCmd> > Handle(InvokeMethodResponseCmd request, CancellationToken cancellationToken)
        {
            // Check if Client is Registered
            var client = _cachingService.Clients.FirstOrDefault(x => x.StreamId == request.Context.ConnectionId);

            if (client == null)
            {
                Console.WriteLine($"Unknown or unauthorized client detected");
                _hubContext.Clients.Client(request.Context.ConnectionId).SendAsync("TelemetryCall", "Client Unknown or Unauthorized");
                return(new()
                {
                    HttpStatusCode = HttpStatusCode.Forbidden
                });
            }

            request.RequestServer = new()
            {
                RequestId = client.Guid,
                Name      = client.Name
            };

            var telemetry = new StreamFlowTelemetryBO
            {
                ClientGuid   = client.Guid,
                RequestGuid  = request.MessageQueue.RequestGuid,
                ConsumerGuid = request.MessageQueue.ConsumerGuid
            };

            var c = _cachingService.Clients.FirstOrDefault(x => x.Guid == request.MessageQueue.Recipient);

            if (c != null)
            {
                if (_cachingService.PendingMethodCalls.TryRemove(request.MessageQueue.RequestGuid, out TaskCompletionSource <StreamFlowMessageBO> methodCallCompletionSource))
                {
                    await Task.Run(() => methodCallCompletionSource.SetResult(request.MessageQueue), cancellationToken);
                }

                Console.WriteLine("Response for Invoked Method Received");
                return(new()
                {
                    HttpStatusCode = HttpStatusCode.Accepted
                });
            }

            if (_cachingService.AbsoluteClients.All(x => x.Guid != request.MessageQueue.Recipient))
            {
                Console.WriteLine($"Connection with ID {request.RequestServer.RequestId} : {request.RequestServer.Name} has invalid recipient");
                goto returnYield;
            }

            if (!_streamFlowConfiguration.QueueMessages)
            {
                Console.WriteLine($"[Message Queue Disabled]; Message from connection with ID {request.RequestServer.RequestId} : {request.RequestServer.Name} has been dropped; Recipient unavailable");
                goto returnYield;
            }

            if (_cachingService.QueuedMessages.Where(i => i.Recipient == request.MessageQueue.Recipient).Count() > _streamFlowConfiguration.QueueDepth)
            {
                Console.WriteLine($"Message from connection with ID {request.RequestServer.RequestId} : {request.RequestServer.Name} cannot be queued: Queue depth has been exhausted");
                goto returnYield;
            }

            _cachingService.QueuedMessages.Add(request.MessageQueue);
            Console.WriteLine($"Message from connection with ID {request.RequestServer.RequestId} : {request.RequestServer.Name} has been queued; Recipient unavailable");

returnYield:

            return(new()
            {
                HttpStatusCode = HttpStatusCode.Accepted
            });
        }
    }
Example #3
0
        public async Task <QueryResponseBO <StreamFlowInvokeResponse> > Handle(InvokeMethodQuery request, CancellationToken cancellationToken)
        {
            // Check if Client is Registered
            var client = _cachingService.Clients.FirstOrDefault(x => x.StreamId == request.Context.ConnectionId);

            if (client == null)
            {
                Console.WriteLine($"Unknown or unauthorized client detected");
                await _hubContext.Clients.Client(request.Context.ConnectionId).SendAsync("TelemetryCall", "Client Unknown or Unauthorized");

                return(new()
                {
                    HttpStatusCode = HttpStatusCode.Forbidden
                });
            }

            request.RequestServer = new()
            {
                RequestId = client.Guid,
                Name      = client.Name
            };

            var telemetry = new StreamFlowTelemetryBO
            {
                ClientGuid   = client.Guid,
                RequestGuid  = request.MessageQueue.RequestGuid,
                ConsumerGuid = request.MessageQueue.ConsumerGuid
            };

            var c = _cachingService.Clients.FirstOrDefault(x => x.Guid == request.MessageQueue.Recipient);

            if (c != null)
            {
                _helperService.StopWatch.Start("Invoked Method");
                var methodCallCompletionSource = new TaskCompletionSource <StreamFlowMessageBO>();
                //methodCallCompletionSource.RunContinuationsAsynchronously();
                if (!_cachingService.PendingMethodCalls.TryAdd(request.MessageQueue.RequestGuid, methodCallCompletionSource))
                {
                    return(new()
                    {
                        HttpStatusCode = HttpStatusCode.InternalServerError,
                        Message = $"Error while invoking method '{request.MessageQueue.CommandName}' on {request.MessageQueue.Recipient}"
                    });
                }

                await _hubContext.Clients.Client(c.StreamId).SendAsync(request.MessageQueue.CommandName, request.MessageQueue.Data, request.MessageQueue.Message, telemetry, cancellationToken);

                var response = await methodCallCompletionSource.Task.ConfigureAwait(false);

                _helperService.StopWatch.Stop("Invoke Response Received");
                return(new()
                {
                    HttpStatusCode = HttpStatusCode.Accepted,
                    Response = new ()
                    {
                        HttpStatusCode = response.Adapt <CmdResponseBO>().HttpStatusCode,
                        Response = response.Data
                    }
                });
            }

            if (_cachingService.AbsoluteClients.All(x => x.Guid != request.MessageQueue.Recipient))
            {
                Console.WriteLine($"Connection with ID {request.RequestServer.RequestId} : {request.RequestServer.Name} has invalid recipient");
                return(new()
                {
                    HttpStatusCode = HttpStatusCode.NotFound,
                    Response = new()
                    {
                        HttpStatusCode = HttpStatusCode.NotFound
                    }
                });
            }


            Console.WriteLine($"Message from connection with ID {request.RequestServer.RequestId} : {request.RequestServer.Name} has been dropped; Recipient unavailable");
            return(new()
            {
                HttpStatusCode = HttpStatusCode.ServiceUnavailable,
                Response = new()
                {
                    HttpStatusCode = HttpStatusCode.NotFound
                }
            });
        }
    }