summary refs log tree commit diff
path: root/extra/admin-api/Spacebar.Cdn/Services/LruFileCache.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-01-11 16:31:22 +0100
committerRory& <root@rory.gay>2026-01-11 16:31:22 +0100
commit654fcc29b5d2284d301df3f63e9db35c21ec63cf (patch)
treec9191c9b62307c08056e3b62cdcd7d4bfbb3c715 /extra/admin-api/Spacebar.Cdn/Services/LruFileCache.cs
parentMerge pull request #1464 from CyberL1/fix/build-workflow (diff)
downloadserver-ts-654fcc29b5d2284d301df3f63e9db35c21ec63cf.tar.xz
CDN-CS stuff
Diffstat (limited to 'extra/admin-api/Spacebar.Cdn/Services/LruFileCache.cs')
-rw-r--r--extra/admin-api/Spacebar.Cdn/Services/LruFileCache.cs58
1 files changed, 58 insertions, 0 deletions
diff --git a/extra/admin-api/Spacebar.Cdn/Services/LruFileCache.cs b/extra/admin-api/Spacebar.Cdn/Services/LruFileCache.cs
new file mode 100644

index 00000000..3a25b1e4 --- /dev/null +++ b/extra/admin-api/Spacebar.Cdn/Services/LruFileCache.cs
@@ -0,0 +1,58 @@ +namespace Spacebar.AdminApi.TestClient.Services.Services; + +public class LruFileCache(int maxSizeBytes) { + private readonly Dictionary<string, Entry> _entries = new(); + + public async Task<Entry?> GetOrAdd(string key, Func<Task<Entry>> factory) { + if (_entries.TryGetValue(key, out var entry)) { + entry.LastAccessed = DateTimeOffset.UtcNow; + return entry; + } + + entry = await factory(); + if (entry.Data.Length > 0) + _entries[key] = entry; + + if (_entries.Sum(kv => kv.Value.Data.Length) > maxSizeBytes) { + var oldestKey = _entries.OrderBy(kv => kv.Value.LastAccessed).First().Key; + _entries.Remove(oldestKey); + } + + return entry; + } + + public class Entry { + public DateTimeOffset LastAccessed { get; set; } + public byte[] Data { get; set; } + public string MimeType { get; set; } + } +} + +public class LruCache<T>(int maxItems) { + private readonly Dictionary<string, CacheItem> _items = new(); + + public async Task<T?> GetOrAddAsync(string key, Func<Task<T>> factory) { + if (_items.TryGetValue(key, out var cacheItem)) { + cacheItem.LastAccessed = DateTimeOffset.UtcNow; + return cacheItem.Value; + } + + var value = await factory(); + _items[key] = new CacheItem { + Value = value, + LastAccessed = DateTimeOffset.UtcNow + }; + + if (_items.Count > maxItems) { + var oldestKey = _items.OrderBy(kv => kv.Value.LastAccessed).First().Key; + _items.Remove(oldestKey); + } + + return value; + } + + private class CacheItem { + public T Value { get; set; } + public DateTimeOffset LastAccessed { get; set; } + } +} \ No newline at end of file