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';
60import whitelistMiddleware from './src/middleware/whitelist.js';60import whitelistMiddleware from './src/middleware/whitelist.js';
61import multerMonkeyPatch from './src/middleware/multerMonkeyPatch.js';61import multerMonkeyPatch from './src/middleware/multerMonkeyPatch.js';
62import initRequestProxy from './src/request-proxy.js';62import initRequestProxy from './src/request-proxy.js';
63import getCacheBusterMiddleware from './src/middleware/cacheBuster.js';
63import {64import {
64 getVersion,65 getVersion,
65 getConfigValue,66 getConfigValue,
@@ -515,7 +516,7 @@ if (!disableCsrf) {
515516
516// Static files517// Static files
517// Host index page518// Host index page
518app.get('/', (request, response) => {519app.get('/', getCacheBusterMiddleware(), (request, response) => {
519 if (shouldRedirectToLogin(request)) {520 if (shouldRedirectToLogin(request)) {
520 const query = request.url.split('?')[1];521 const query = request.url.split('?')[1];
521 const redirectUrl = query ? `/login?${query}` : '/login';522 const redirectUrl = query ? `/login?${query}` : '/login';
src/middleware/cacheBuster.js+28 -0
@@ -0,0 +1,28 @@
1import crypto from 'node:crypto';
2import { DEFAULT_USER } from '../constants.js';
3
4/**
5 * Middleware to bust the browser cache for the current user.
6 * @returns {import('express').RequestHandler}
7 */
8export 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}