Merge pull request #3481 from SillyTavern/cache-buster Add cache buster middleware to clear browser cache on server restart

fc488bd4fe6b5ae862e3f84cff0ae48429d65249

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
2 files changed, +30 -1Showing whitespace changes
server.js+2 -1
@@ -60,6 +60,7 @@ import basicAuthMiddleware from './src/middleware/basicAuth.js';
6060import whitelistMiddleware from './src/middleware/whitelist.js';
6161import multerMonkeyPatch from './src/middleware/multerMonkeyPatch.js';
6262import initRequestProxy from './src/request-proxy.js';
63+import getCacheBusterMiddleware from './src/middleware/cacheBuster.js';
6364import {
6465 getVersion,
6566 getConfigValue,
@@ -515,7 +516,7 @@ if (!disableCsrf) {
515516
516517// Static files
517518// Host index page
518519app.get('/', getCacheBusterMiddleware(), (request, response) => {
519520 if (shouldRedirectToLogin(request)) {
520521 const query = request.url.split('?')[1];
521522 const redirectUrl = query ? `/login?${query}` : '/login';
src/middleware/cacheBuster.js+28 -0
@@ -0,0 +1,28 @@
1+import crypto from 'node:crypto';
2+import { DEFAULT_USER } from '../constants.js';
3+
4+/**
5+ * Middleware to bust the browser cache for the current user.
6+ * @returns {import('express').RequestHandler}
7+ */
8+export default function getCacheBusterMiddleware() {
9+ /**
10+ * @type {Set<string>} Handles/User-Agents that have already been busted.
11+ */
12+ const keys = new Set();
13+
14+ return (request, response, next) => {
15+ const handle = request.user?.profile?.handle || DEFAULT_USER.handle;
16+ const userAgent = request.headers['user-agent'] || '';
17+ const hash = crypto.createHash('sha256').update(userAgent).digest('hex');
18+ const key = `${handle}-${hash}`;
19+
20+ if (keys.has(key)) {
21+ return next();
22+ }
23+
24+ keys.add(key);
25+ response.setHeader('Clear-Site-Data', '"cache"');
26+ next();
27+ };
28+}