All checks were successful
Build and Push Docker Image / build (push) Successful in 29s
- New /api/dashboard/status endpoint (admin-only, 403 for non-admins) - Returns server info (uptime, Node version, memory usage) - Returns polling mode and interval - Returns cache stats: entry count, total size, per-key breakdown with item count, size in KB, and TTL remaining - Status button in admin controls header - Collapsible status panel with grid layout - Responsive: single column on mobile
71 lines
1.6 KiB
JavaScript
71 lines
1.6 KiB
JavaScript
const { logToFile } = require('./logger');
|
|
|
|
class MemoryCache {
|
|
constructor() {
|
|
this.store = new Map();
|
|
}
|
|
|
|
get(key) {
|
|
const entry = this.store.get(key);
|
|
if (!entry) return null;
|
|
if (Date.now() > entry.expiresAt) {
|
|
this.store.delete(key);
|
|
return null;
|
|
}
|
|
return entry.value;
|
|
}
|
|
|
|
set(key, value, ttlMs) {
|
|
this.store.set(key, {
|
|
value,
|
|
expiresAt: Date.now() + ttlMs
|
|
});
|
|
}
|
|
|
|
invalidate(key) {
|
|
this.store.delete(key);
|
|
}
|
|
|
|
clear() {
|
|
this.store.clear();
|
|
}
|
|
|
|
getStats() {
|
|
const now = Date.now();
|
|
const entries = [];
|
|
let totalSize = 0;
|
|
|
|
for (const [key, entry] of this.store.entries()) {
|
|
const json = JSON.stringify(entry.value);
|
|
const sizeBytes = Buffer.byteLength(json, 'utf8');
|
|
totalSize += sizeBytes;
|
|
const ttlRemaining = Math.max(0, entry.expiresAt - now);
|
|
const expired = now > entry.expiresAt;
|
|
let itemCount = null;
|
|
if (Array.isArray(entry.value)) {
|
|
itemCount = entry.value.length;
|
|
} else if (entry.value && typeof entry.value === 'object') {
|
|
if (Array.isArray(entry.value.records)) itemCount = entry.value.records.length;
|
|
else if (Array.isArray(entry.value.slots)) itemCount = entry.value.slots.length;
|
|
}
|
|
entries.push({
|
|
key,
|
|
sizeBytes,
|
|
itemCount,
|
|
ttlRemainingMs: ttlRemaining,
|
|
expired
|
|
});
|
|
}
|
|
|
|
return {
|
|
entryCount: this.store.size,
|
|
totalSizeBytes: totalSize,
|
|
entries
|
|
};
|
|
}
|
|
}
|
|
|
|
const cache = new MemoryCache();
|
|
|
|
module.exports = cache;
|