summaryrefslogtreecommitdiff
path: root/packages/backend/src/server
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2024-07-05 10:43:39 +0000
committerdakkar <dakkar@thenautilus.net>2024-07-05 10:43:39 +0000
commitc4f4041cf8c104e6a18970d21d764c5c263bc9dc (patch)
tree9e92d6f974d4eedf844bf944b78f8de7d5ccbaae /packages/backend/src/server
parentmerge: prepare for the next release (!562) (diff)
parentpass all the options to the cache constructor (diff)
downloadsharkey-c4f4041cf8c104e6a18970d21d764c5c263bc9dc.tar.gz
sharkey-c4f4041cf8c104e6a18970d21d764c5c263bc9dc.tar.bz2
sharkey-c4f4041cf8c104e6a18970d21d764c5c263bc9dc.zip
merge: cache URL previews on the server (!565)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/565 Approved-by: fEmber <acomputerdog@gmail.com> Approved-by: Luna <her@mint.lgbt>
Diffstat (limited to 'packages/backend/src/server')
-rw-r--r--packages/backend/src/server/web/UrlPreviewService.ts29
1 files changed, 27 insertions, 2 deletions
diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts
index 8f8f08a305..96038d9c1e 100644
--- a/packages/backend/src/server/web/UrlPreviewService.ts
+++ b/packages/backend/src/server/web/UrlPreviewService.ts
@@ -17,20 +17,33 @@ import { bindThis } from '@/decorators.js';
import { ApiError } from '@/server/api/error.js';
import { MiMeta } from '@/models/Meta.js';
import type { FastifyRequest, FastifyReply } from 'fastify';
+import * as Redis from 'ioredis';
+import { RedisKVCache } from '@/misc/cache.js';
@Injectable()
export class UrlPreviewService {
private logger: Logger;
+ private previewCache: RedisKVCache<SummalyResult>;
constructor(
@Inject(DI.config)
private config: Config,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
private metaService: MetaService,
private httpRequestService: HttpRequestService,
private loggerService: LoggerService,
) {
this.logger = this.loggerService.getLogger('url-preview');
+ this.previewCache = new RedisKVCache<SummalyResult>(this.redisClient, 'summaly', {
+ lifetime: 1000 * 86400,
+ memoryCacheLifetime: 1000 * 10 * 60,
+ fetcher: (key: string) => { throw new Error('the UrlPreview cache should never fetch'); },
+ toRedisConverter: (value) => JSON.stringify(value),
+ fromRedisConverter: (value) => JSON.parse(value),
+ });
}
@bindThis
@@ -75,9 +88,19 @@ export class UrlPreviewService {
};
}
+ const key = `${url}@${lang}`;
+ const cached = await this.previewCache.get(key);
+ if (cached !== undefined) {
+ this.logger.info(`Returning cache preview of ${key}`);
+ // Cache 7days
+ reply.header('Cache-Control', 'max-age=604800, immutable');
+
+ return cached;
+ }
+
this.logger.info(meta.urlPreviewSummaryProxyUrl
- ? `(Proxy) Getting preview of ${url}@${lang} ...`
- : `Getting preview of ${url}@${lang} ...`);
+ ? `(Proxy) Getting preview of ${key} ...`
+ : `Getting preview of ${key} ...`);
try {
const summary = meta.urlPreviewSummaryProxyUrl
@@ -97,6 +120,8 @@ export class UrlPreviewService {
summary.icon = this.wrap(summary.icon);
summary.thumbnail = this.wrap(summary.thumbnail);
+ this.previewCache.set(key, summary);
+
// Cache 7days
reply.header('Cache-Control', 'max-age=604800, immutable');