feat: enforce jetstream retention and limits
This commit is contained in:
@@ -62,6 +62,17 @@ public sealed class FileStore : IStreamStore, IAsyncDisposable
|
||||
});
|
||||
}
|
||||
|
||||
public void TrimToMaxMessages(ulong maxMessages)
|
||||
{
|
||||
while ((ulong)_messages.Count > maxMessages)
|
||||
{
|
||||
var first = _messages.Keys.Min();
|
||||
_messages.Remove(first);
|
||||
}
|
||||
|
||||
RewriteDataFile();
|
||||
}
|
||||
|
||||
public ValueTask DisposeAsync() => ValueTask.CompletedTask;
|
||||
|
||||
private void LoadExisting()
|
||||
@@ -91,6 +102,22 @@ public sealed class FileStore : IStreamStore, IAsyncDisposable
|
||||
}
|
||||
}
|
||||
|
||||
private void RewriteDataFile()
|
||||
{
|
||||
var lines = new List<string>(_messages.Count);
|
||||
foreach (var message in _messages.OrderBy(kv => kv.Key).Select(kv => kv.Value))
|
||||
{
|
||||
lines.Add(JsonSerializer.Serialize(new FileRecord
|
||||
{
|
||||
Sequence = message.Sequence,
|
||||
Subject = message.Subject,
|
||||
PayloadBase64 = Convert.ToBase64String(message.Payload.ToArray()),
|
||||
}));
|
||||
}
|
||||
|
||||
File.WriteAllLines(_dataFilePath, lines);
|
||||
}
|
||||
|
||||
private sealed class FileRecord
|
||||
{
|
||||
public ulong Sequence { get; init; }
|
||||
|
||||
Reference in New Issue
Block a user