using Hcs.Broker.Logger;
using System.Text;
namespace Hcs.Broker.MessageCapturer
{
///
/// Реализация механизма захвата содержимого сообщений SOAP, записывающая
/// каждое сообщение в отдельный файл на диске
///
public class FileMessageCapturer(string directory, ILogger logger) : IMessageCapturer
{
private readonly string directory = directory;
private readonly ILogger logger = logger;
public string LastFileName { get; private set; }
public event Action OnFileWritten;
public void CaptureMessage(bool sent, string messageBody)
{
var index = 0;
var maxIndex = 1000000;
string fileName;
do
{
index += 1;
if (index > maxIndex)
{
throw new Exception("index value exceeds maxIndex value");
}
fileName = index.ToString("D3") + "_" + (sent ? "message" : "response") + ".xml";
if (!string.IsNullOrEmpty(directory))
{
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
fileName = Path.Combine(directory, fileName);
}
}
while (File.Exists(fileName));
logger?.WriteLine($"Capturing message to file {fileName}...");
File.WriteAllText(fileName, messageBody, Encoding.UTF8);
LastFileName = fileName;
OnFileWritten?.Invoke(fileName);
}
}
}