using System.Text;
using Elsa.Workflows.Management.Contracts;
using IronCompress;
namespace Elsa.Workflows.Management.Compression;
///
/// Represents a ZSTD compression strategy.
///
public class Zstd : ICompressionCodec
{
private Iron Iron { get; set; } = new();
///
public ValueTask CompressAsync(string input, CancellationToken cancellationToken = default)
{
var inputBytes = Encoding.UTF8.GetBytes(input);
var span = inputBytes.AsSpan();
var result = Iron.Compress(Codec.Zstd, span);
var compressedBytes = result.AsSpan();
var compressedString = Convert.ToBase64String(compressedBytes);
return new (compressedString);
}
///
public ValueTask DecompressAsync(string input, CancellationToken cancellationToken = default)
{
var inputBytes = Convert.FromBase64String(input);
var span = inputBytes.AsSpan();
var result = Iron.Decompress(Codec.Zstd, span);
var decompressedBytes = result.AsSpan();
var decompressedString = Encoding.UTF8.GetString(decompressedBytes);
return new (decompressedString);
}
}