using FASTER.core; namespace FASTERlay; public class NostrStore : IDisposable { private readonly ILogger _logger; private readonly CancellationTokenSource _cts = new(); private readonly FasterKVSettings _storeSettings; private readonly FasterKV _store; private readonly FasterKVSettings _tagStoreSettings; private readonly FasterKV _tagStore; 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(); } _tagStoreSettings = new FasterKVSettings(Path.Combine(dir, "tags"), false, _logger); _tagStore = new(_tagStoreSettings); var keyVersion = _tagStore.GetLatestCheckpointVersion(); if (keyVersion != -1) { _tagStore.Recover(); } _checkpointer = Task.Factory.StartNew(async () => { while (!_cts.IsCancellationRequested) { await Task.Delay(10_000); await _store.TakeHybridLogCheckpointAsync(CheckpointType.Snapshot, true); await _tagStore.TakeHybridLogCheckpointAsync(CheckpointType.Snapshot, true); } }); } public FasterKV MainStore => _store; public FasterKV TagStore => _tagStore; public void Dispose() { _cts.Cancel(); _checkpointer.ConfigureAwait(false).GetAwaiter().GetResult(); _store.Dispose(); _storeSettings.Dispose(); _tagStore.Dispose(); _tagStoreSettings.Dispose(); } }