// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Amazon.ApiGatewayManagementApi;
using Amazon.ApiGatewayManagementApi.Model;
using Amazon.Lambda.Core;
using ManagementConsoleBackend.ManagementService.Data;
using Newtonsoft.Json;
namespace ManagementConsoleBackend.Common
{
public static class Utils
{
/// JSON encodes an object and sends it to an APIGW connectionId and service URL.
/// Returns false if the connection has gone away
///
public static async Task SendJsonResponse(string connectionId, string serviceUrl, object obj, int maxMessageSize=30000 )
{
var apiClient = new AmazonApiGatewayManagementApiClient(new AmazonApiGatewayManagementApiConfig {
ServiceURL = serviceUrl,
ResignRetries = true,
});
var objectJson = JsonConvert.SerializeObject(obj);
LambdaLogger.Log($"MESSAGE DESTINATION: {connectionId}");
LambdaLogger.Log($"MESSAGE SERVICE URL: {serviceUrl}");
LambdaLogger.Log($"MESSAGE CONTENTS: {objectJson}");
LambdaLogger.Log($"MESSAGE CONTENTS LENGTH: {objectJson.Length}");
var messages = new List();
if (objectJson.Length > maxMessageSize)
{
var multipartMessages = objectJson.MakeMultipartMessage(maxMessageSize);
foreach (var multipartMessage in multipartMessages)
{
messages.Add(JsonConvert.SerializeObject(multipartMessage));
}
}
else
{
messages = new List
{
objectJson
};
}
foreach (var message in messages)
{
var stream = new MemoryStream(UTF8Encoding.UTF8.GetBytes(message));
var postConnectionRequest = new PostToConnectionRequest
{
ConnectionId = connectionId,
Data = stream
};
try
{
await apiClient.GetConnectionAsync(new GetConnectionRequest
{
ConnectionId = connectionId
});
await apiClient.PostToConnectionAsync(postConnectionRequest);
LambdaLogger.Log("SENT TO " + connectionId);
}
catch (GoneException e)
{
LambdaLogger.Log(e.ToString());
return false;
}
catch (Exception e)
{
LambdaLogger.Log(e.ToString());
return false;
}
}
return true;
}
/// Returns a UNIX timestamp
public static long GetUnixTimestamp()
{
var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
return (long)timeSpan.TotalSeconds;
}
private static Random rng = new Random();
public static void Shuffle(this IList list)
{
var n = list.Count;
while (n > 1) {
n--;
var k = rng.Next(n + 1);
var value = list[k];
list[k] = list[n];
list[n] = value;
}
}
public static int RandomInt(int min, int max)
{
return rng.Next(min, max + 1);
}
public static int RandomInt(int max)
{
return rng.Next(max + 1);
}
public static double RandomDouble(double min, double max)
{
return (rng.NextDouble() * (max - min)) + min;
}
public static double RandomDouble(double max)
{
return (rng.NextDouble() * max);
}
public static string ReadEventStream(Stream stream)
{
using var reader = new StreamReader(stream);
return reader.ReadToEnd();
}
}
}