fix: correct status panel cache stats and static asset caching
cache.js: Map values serialise as '{}' under JSON.stringify, causing
emby:users to show 0 bytes and null item count in the status panel.
Convert Maps via Object.fromEntries before stringifying, and report
Map.size as itemCount.
index.js: JS and CSS served with Cache-Control: no-cache so browsers
always revalidate on load. ETag still prevents re-downloading unchanged
files — only a new deploy triggers an actual download.
This commit is contained in:
@@ -202,8 +202,17 @@ app.get('/ready', (req, res) => {
|
|||||||
const PUBLIC_DIR = path.join(__dirname, '../public');
|
const PUBLIC_DIR = path.join(__dirname, '../public');
|
||||||
const INDEX_HTML = path.join(PUBLIC_DIR, 'index.html');
|
const INDEX_HTML = path.join(PUBLIC_DIR, 'index.html');
|
||||||
|
|
||||||
// Serve all static assets (js, css, images, icons) except index.html
|
// Serve all static assets (js, css, images, icons) except index.html.
|
||||||
app.use(express.static(PUBLIC_DIR, { index: false }));
|
// JS and CSS get no-cache so browsers revalidate on every load (ETag still
|
||||||
|
// avoids re-downloading unchanged files; only a deploy changes the ETag).
|
||||||
|
app.use(express.static(PUBLIC_DIR, {
|
||||||
|
index: false,
|
||||||
|
setHeaders(res, filePath) {
|
||||||
|
if (filePath.endsWith('.js') || filePath.endsWith('.css')) {
|
||||||
|
res.setHeader('Cache-Control', 'no-cache');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
// Serve index.html with nonce injected into the <script> and <link> tags
|
// Serve index.html with nonce injected into the <script> and <link> tags
|
||||||
function serveIndex(req, res) {
|
function serveIndex(req, res) {
|
||||||
|
|||||||
@@ -36,13 +36,17 @@ class MemoryCache {
|
|||||||
let totalSize = 0;
|
let totalSize = 0;
|
||||||
|
|
||||||
for (const [key, entry] of this.store.entries()) {
|
for (const [key, entry] of this.store.entries()) {
|
||||||
const json = JSON.stringify(entry.value);
|
// Maps must be converted before JSON.stringify (which renders them as "{}")
|
||||||
|
const serializable = entry.value instanceof Map ? Object.fromEntries(entry.value) : entry.value;
|
||||||
|
const json = JSON.stringify(serializable);
|
||||||
const sizeBytes = Buffer.byteLength(json, 'utf8');
|
const sizeBytes = Buffer.byteLength(json, 'utf8');
|
||||||
totalSize += sizeBytes;
|
totalSize += sizeBytes;
|
||||||
const ttlRemaining = Math.max(0, entry.expiresAt - now);
|
const ttlRemaining = Math.max(0, entry.expiresAt - now);
|
||||||
const expired = now > entry.expiresAt;
|
const expired = now > entry.expiresAt;
|
||||||
let itemCount = null;
|
let itemCount = null;
|
||||||
if (Array.isArray(entry.value)) {
|
if (entry.value instanceof Map) {
|
||||||
|
itemCount = entry.value.size;
|
||||||
|
} else if (Array.isArray(entry.value)) {
|
||||||
itemCount = entry.value.length;
|
itemCount = entry.value.length;
|
||||||
} else if (entry.value && typeof entry.value === 'object') {
|
} else if (entry.value && typeof entry.value === 'object') {
|
||||||
if (Array.isArray(entry.value.records)) itemCount = entry.value.records.length;
|
if (Array.isArray(entry.value.records)) itemCount = entry.value.records.length;
|
||||||
|
|||||||
Reference in New Issue
Block a user