From afed0a0b341f143c60221b7e0f76b59ce18fabfc Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 13 Apr 2024 14:33:59 -0500 Subject: [PATCH] cache: serve stale response --- src/app.ts | 2 +- src/middleware/cache.ts | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/app.ts b/src/app.ts index 3f5804f..ad920c7 100644 --- a/src/app.ts +++ b/src/app.ts @@ -134,7 +134,7 @@ app.get('/users/:username', actorController); app.get('/nodeinfo/:version', nodeInfoSchemaController); -app.get('/api/v1/instance', cache({ expires: Time.seconds(3) }), instanceController); +app.get('/api/v1/instance', cache({ expires: Time.minutes(5) }), instanceController); app.get('/api/v1/apps/verify_credentials', appCredentialsController); app.post('/api/v1/apps', createAppController); diff --git a/src/middleware/cache.ts b/src/middleware/cache.ts index c897645..8e80005 100644 --- a/src/middleware/cache.ts +++ b/src/middleware/cache.ts @@ -12,19 +12,32 @@ export const cache = (opts: CacheOpts): MiddlewareHandler => { let expires = Date.now() + opts.expires; return async (c, next) => { - if (!response || (Date.now() > expires)) { - debug('Building cache for page', c.req.url); - expires = Date.now() + opts.expires; + const now = Date.now(); + const expired = now > expires; + async function updateCache() { await next(); - const res = c.res.clone(); if (res.status < 500) { response = res; } - } else { + return res; + } + + if (response && !expired) { debug('Serving page from cache', c.req.url); return response.clone(); + } else { + expires = Date.now() + opts.expires; + if (response && expired) { + debug('Serving stale cache, rebuilding', c.req.url); + const stale = response.clone(); + updateCache(); + await new Promise((resolve) => setTimeout(resolve, 0)); + return stale; + } + debug('Building cache for page', c.req.url); + return await updateCache(); } }; };