Beispiel #1
0
        public async Task SendMessageAsync(Message request)
        {
            // enumerate open connections
            var connections = await _connections.GetAllRowsAsync();

            LogInfo($"Found {connections.Count()} open connection(s)");

            // attempt to send message on all open connections
            var messageBytes = Encoding.UTF8.GetBytes(LambdaSerializer.Serialize(new Message {
                From = request.From,
                Text = request.Text
            }));
            var outcomes = await Task.WhenAll(connections.Select(async(connectionId, index) => {
                LogInfo($"Post to connection {index}: {connectionId}");
                try {
                    await _amaClient.PostToConnectionAsync(new PostToConnectionRequest {
                        ConnectionId = connectionId,
                        Data         = new MemoryStream(messageBytes)
                    });
                } catch (AmazonServiceException e) when(e.StatusCode == System.Net.HttpStatusCode.Gone)
                {
                    LogInfo($"Deleting gone connection: {connectionId}");
                    await _connections.DeleteRowAsync(connectionId);
                    return(false);
                } catch (Exception e) {
                    LogErrorAsWarning(e, "PostToConnectionAsync() failed");
                    return(false);
                }
                return(true);
            }));

            LogInfo($"Data sent to {outcomes.Count(result => result)} connections");
        }
Beispiel #2
0
 public async Task CloseConnectionAsync(APIGatewayProxyRequest request)
 {
     try {
         LogInfo($"Disconnected: {request.RequestContext.ConnectionId} [{request.RequestContext.RouteKey}]");
         await _connections.DeleteRowAsync(request.RequestContext.ConnectionId);
     } catch (Exception e) {
         LogError(e);
         throw Abort(CreateResponse(500, $"Failure while attempting to disconnect: {e.Message}"));
     }
 }