using FASTER.core; namespace PayForReactions; public class NostrStore : IDisposable { private readonly ILogger _logger; private readonly CancellationTokenSource _cts = new(); private readonly FasterKVSettings _storeSettings; private readonly FasterKV _store; private readonly Task _checkPointer; public NostrStore(string dir, ILogger logger) { _logger = logger; _storeSettings = new FasterKVSettings(Path.Combine(dir, "main"), false, _logger); _store = new(_storeSettings); var version = _store.GetLatestCheckpointVersion(); if (version != -1) { _store.Recover(); } _checkPointer = Task.Factory.StartNew(async () => { while (!_cts.IsCancellationRequested) { await Task.Delay(10_000); await _store.TakeHybridLogCheckpointAsync(CheckpointType.Snapshot, true); } }); } public FasterKV MainStore => _store; public void Dispose() { _cts.Cancel(); _checkPointer.ConfigureAwait(false).GetAwaiter().GetResult(); _store.Dispose(); _storeSettings.Dispose(); } }