diff --git a/packages/backend/src/core/FanoutTimelineService.ts b/packages/backend/src/core/FanoutTimelineService.ts index f6dabfadcd..ca33556fa4 100644 --- a/packages/backend/src/core/FanoutTimelineService.ts +++ b/packages/backend/src/core/FanoutTimelineService.ts @@ -14,9 +14,9 @@ export type FanoutTimelineName = | `homeTimeline:${string}` | `homeTimelineWithFiles:${string}` // only notes with files are included // local timeline - | `localTimeline` // replies are not included - | `localTimelineWithFiles` // only non-reply notes with files are included - | `localTimelineWithReplies` // only replies are included + | 'localTimeline' // replies are not included + | 'localTimelineWithFiles' // only non-reply notes with files are included + | 'localTimelineWithReplies' // only replies are included | `localTimelineWithReplyTo:${string}` // Only replies to specific local user are included. Parameter is reply user id. // antenna @@ -111,4 +111,33 @@ export class FanoutTimelineService { public purge(name: FanoutTimelineName) { return this.redisForTimelines.del('list:' + name); } + + @bindThis + public async purgeAllcache() { + const timeLinePatterns = [ + '*list:homeTimeline*', + '*list:localTimeline*', + '*list:antennaTimeline*', + '*list:userTimeline*', + '*list:userListTimeline*', + '*list:channelTimeline*', + '*list:roleTimeline*', + ]; + let timeLines = [] as string[]; + + for (const timeline of timeLinePatterns) { + let cursor = '0'; + do { + const scanResult = await this.redisForTimelines.scan(cursor, 'MATCH', timeline, 'COUNT', 300); + cursor = scanResult[0]; + timeLines = timeLines.concat(scanResult[1]); + } while (cursor !== '0'); + } + + const pipeline = this.redisForTimelines.pipeline(); + for (const timeLine of timeLines) { + pipeline.del(`list:${timeLine.split('list:')[1]}`); + } + await pipeline.exec(); + } } diff --git a/packages/backend/src/core/MetaService.ts b/packages/backend/src/core/MetaService.ts index 3d88d0aefe..02928642de 100644 --- a/packages/backend/src/core/MetaService.ts +++ b/packages/backend/src/core/MetaService.ts @@ -12,6 +12,7 @@ import { GlobalEventService } from '@/core/GlobalEventService.js'; import { bindThis } from '@/decorators.js'; import type { GlobalEvents } from '@/core/GlobalEventService.js'; import { FeaturedService } from '@/core/FeaturedService.js'; +import { FanoutTimelineService } from './FanoutTimelineService.js'; import type { OnApplicationShutdown } from '@nestjs/common'; @Injectable() @@ -28,6 +29,7 @@ export class MetaService implements OnApplicationShutdown { private featuredService: FeaturedService, private globalEventService: GlobalEventService, + private fanoutTimelineService: FanoutTimelineService, ) { //this.onMessage = this.onMessage.bind(this); @@ -112,6 +114,7 @@ export class MetaService implements OnApplicationShutdown { before = metas[0]; if (before) { + if (before.enableFanoutTimeline === true && data.enableFanoutTimeline === false) this.fanoutTimelineService.purgeAllcache(); await transactionalEntityManager.update(MiMeta, before.id, data); const metas = await transactionalEntityManager.find(MiMeta, {