feat: execute full-repo remaining parity closure plan
This commit is contained in:
@@ -33,6 +33,7 @@ public sealed class FileStore : IStreamStore, IAsyncDisposable
|
||||
PruneExpired(DateTime.UtcNow);
|
||||
|
||||
_last++;
|
||||
var persistedPayload = TransformForPersist(payload.Span);
|
||||
var stored = new StoredMessage
|
||||
{
|
||||
Sequence = _last,
|
||||
@@ -46,7 +47,7 @@ public sealed class FileStore : IStreamStore, IAsyncDisposable
|
||||
{
|
||||
Sequence = stored.Sequence,
|
||||
Subject = stored.Subject,
|
||||
PayloadBase64 = Convert.ToBase64String(stored.Payload.ToArray()),
|
||||
PayloadBase64 = Convert.ToBase64String(persistedPayload),
|
||||
TimestampUtc = stored.TimestampUtc,
|
||||
});
|
||||
await File.AppendAllTextAsync(_dataFilePath, line + Environment.NewLine, ct);
|
||||
@@ -109,7 +110,7 @@ public sealed class FileStore : IStreamStore, IAsyncDisposable
|
||||
{
|
||||
Sequence = x.Sequence,
|
||||
Subject = x.Subject,
|
||||
PayloadBase64 = Convert.ToBase64String(x.Payload.ToArray()),
|
||||
PayloadBase64 = Convert.ToBase64String(TransformForPersist(x.Payload.Span)),
|
||||
TimestampUtc = x.TimestampUtc,
|
||||
})
|
||||
.ToArray();
|
||||
@@ -136,7 +137,7 @@ public sealed class FileStore : IStreamStore, IAsyncDisposable
|
||||
{
|
||||
Sequence = record.Sequence,
|
||||
Subject = record.Subject ?? string.Empty,
|
||||
Payload = Convert.FromBase64String(record.PayloadBase64 ?? string.Empty),
|
||||
Payload = RestorePayload(Convert.FromBase64String(record.PayloadBase64 ?? string.Empty)),
|
||||
TimestampUtc = record.TimestampUtc,
|
||||
};
|
||||
_messages[record.Sequence] = message;
|
||||
@@ -191,7 +192,7 @@ public sealed class FileStore : IStreamStore, IAsyncDisposable
|
||||
{
|
||||
Sequence = record.Sequence,
|
||||
Subject = record.Subject ?? string.Empty,
|
||||
Payload = Convert.FromBase64String(record.PayloadBase64 ?? string.Empty),
|
||||
Payload = RestorePayload(Convert.FromBase64String(record.PayloadBase64 ?? string.Empty)),
|
||||
TimestampUtc = record.TimestampUtc,
|
||||
};
|
||||
|
||||
@@ -223,7 +224,7 @@ public sealed class FileStore : IStreamStore, IAsyncDisposable
|
||||
{
|
||||
Sequence = message.Sequence,
|
||||
Subject = message.Subject,
|
||||
PayloadBase64 = Convert.ToBase64String(message.Payload.ToArray()),
|
||||
PayloadBase64 = Convert.ToBase64String(TransformForPersist(message.Payload.Span)),
|
||||
TimestampUtc = message.TimestampUtc,
|
||||
});
|
||||
|
||||
@@ -280,4 +281,55 @@ public sealed class FileStore : IStreamStore, IAsyncDisposable
|
||||
}
|
||||
|
||||
private readonly record struct BlockPointer(int BlockId, long Offset);
|
||||
|
||||
private byte[] TransformForPersist(ReadOnlySpan<byte> payload)
|
||||
{
|
||||
var bytes = payload.ToArray();
|
||||
if (_options.EnableCompression)
|
||||
bytes = Compress(bytes);
|
||||
if (_options.EnableEncryption)
|
||||
bytes = Xor(bytes, _options.EncryptionKey);
|
||||
return bytes;
|
||||
}
|
||||
|
||||
private byte[] RestorePayload(ReadOnlySpan<byte> persisted)
|
||||
{
|
||||
var bytes = persisted.ToArray();
|
||||
if (_options.EnableEncryption)
|
||||
bytes = Xor(bytes, _options.EncryptionKey);
|
||||
if (_options.EnableCompression)
|
||||
bytes = Decompress(bytes);
|
||||
return bytes;
|
||||
}
|
||||
|
||||
private static byte[] Xor(ReadOnlySpan<byte> data, byte[]? key)
|
||||
{
|
||||
if (key == null || key.Length == 0)
|
||||
return data.ToArray();
|
||||
|
||||
var output = data.ToArray();
|
||||
for (var i = 0; i < output.Length; i++)
|
||||
output[i] ^= key[i % key.Length];
|
||||
return output;
|
||||
}
|
||||
|
||||
private static byte[] Compress(ReadOnlySpan<byte> data)
|
||||
{
|
||||
using var output = new MemoryStream();
|
||||
using (var stream = new System.IO.Compression.DeflateStream(output, System.IO.Compression.CompressionLevel.Fastest, leaveOpen: true))
|
||||
{
|
||||
stream.Write(data);
|
||||
}
|
||||
|
||||
return output.ToArray();
|
||||
}
|
||||
|
||||
private static byte[] Decompress(ReadOnlySpan<byte> data)
|
||||
{
|
||||
using var input = new MemoryStream(data.ToArray());
|
||||
using var stream = new System.IO.Compression.DeflateStream(input, System.IO.Compression.CompressionMode.Decompress);
|
||||
using var output = new MemoryStream();
|
||||
stream.CopyTo(output);
|
||||
return output.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user