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