From be2baf739ed72f1b2ea7663a56dfb7a1b8389ba1 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Wed, 25 Jun 2025 19:31:54 -0400 Subject: [PATCH] implement updateAccessTokenQueue --- .../backend/src/core/CollapsedQueueService.ts | 28 ++++++++++++++++++- .../src/server/api/AuthenticateService.ts | 4 ++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/core/CollapsedQueueService.ts b/packages/backend/src/core/CollapsedQueueService.ts index 1cbc4102e0..0082c55d0d 100644 --- a/packages/backend/src/core/CollapsedQueueService.ts +++ b/packages/backend/src/core/CollapsedQueueService.ts @@ -14,7 +14,7 @@ import { bindThis } from '@/decorators.js'; import type { MiInstance } from '@/models/Instance.js'; import { InternalEventService } from '@/core/InternalEventService.js'; import { MiUser } from '@/models/User.js'; -import type { MiNote, UsersRepository, NotesRepository } from '@/models/_.js'; +import type { MiNote, UsersRepository, NotesRepository, MiAccessToken, AccessTokensRepository } from '@/models/_.js'; import { DI } from '@/di-symbols.js'; export type UpdateInstanceJob = { @@ -42,6 +42,10 @@ export type UpdateNoteJob = { clippedCountDelta?: number; }; +export type UpdateAccessTokenJob = { + lastUsedAt: Date; +}; + @Injectable() export class CollapsedQueueService implements OnApplicationShutdown { // Moved from InboxProcessorService @@ -49,6 +53,7 @@ export class CollapsedQueueService implements OnApplicationShutdown { // Moved from NoteCreateService, NoteEditService, and NoteDeleteService public readonly updateUserQueue: CollapsedQueue; public readonly updateNoteQueue: CollapsedQueue; + public readonly updateAccessTokenQueue: CollapsedQueue; private readonly logger: Logger; @@ -59,6 +64,9 @@ export class CollapsedQueueService implements OnApplicationShutdown { @Inject(DI.notesRepository) public readonly notesRepository: NotesRepository, + @Inject(DI.accessTokensRepository) + public readonly accessTokensRepository: AccessTokensRepository, + private readonly federatedInstanceService: FederatedInstanceService, private readonly envService: EnvService, private readonly internalEventService: InternalEventService, @@ -160,6 +168,21 @@ export class CollapsedQueueService implements OnApplicationShutdown { }, ); + this.updateAccessTokenQueue = new CollapsedQueue( + 'updateAccessToken', + fiveMinuteInterval, + (oldJob, newJob) => ({ + lastUsedAt: maxDate(oldJob.lastUsedAt, newJob.lastUsedAt), + }), + (id, job) => this.accessTokensRepository.update({ id }, { + lastUsedAt: job.lastUsedAt, + }), + { + onError: this.onQueueError, + concurrency: 2, + }, + ); + this.internalEventService.on('userChangeDeletedState', this.onUserDeleted); } @@ -170,6 +193,7 @@ export class CollapsedQueueService implements OnApplicationShutdown { await this.performQueue(this.updateInstanceQueue); await this.performQueue(this.updateUserQueue); await this.performQueue(this.updateNoteQueue); + await this.performQueue(this.updateAccessTokenQueue); this.logger.info('Persistence complete.'); } @@ -209,6 +233,8 @@ export class CollapsedQueueService implements OnApplicationShutdown { } } +function maxDate(first: Date | undefined, second: Date): Date; +function maxDate(first: Date, second: Date | undefined): Date; function maxDate(first: Date | undefined, second: Date | undefined): Date | undefined; function maxDate(first: Date | null | undefined, second: Date | null | undefined): Date | null | undefined; diff --git a/packages/backend/src/server/api/AuthenticateService.ts b/packages/backend/src/server/api/AuthenticateService.ts index 2c5615c084..3f95c4b6c1 100644 --- a/packages/backend/src/server/api/AuthenticateService.ts +++ b/packages/backend/src/server/api/AuthenticateService.ts @@ -16,6 +16,7 @@ import { bindThis } from '@/decorators.js'; import { attachCallerId } from '@/misc/attach-caller-id.js'; import { CacheManagementService, type ManagedMemoryKVCache } from '@/global/CacheManagementService.js'; import { TimeService } from '@/global/TimeService.js'; +import { CollapsedQueueService } from '@/core/CollapsedQueueService.js'; export class AuthenticationError extends Error { // Fix the error name in stack traces - https://stackoverflow.com/a/71573071 @@ -43,6 +44,7 @@ export class AuthenticateService { private cacheService: CacheService, private readonly timeService: TimeService, + private readonly collapsedQueueService: CollapsedQueueService, cacheManagementService: CacheManagementService, ) { @@ -79,7 +81,7 @@ export class AuthenticateService { throw new AuthenticationError('invalid signature'); } - this.accessTokensRepository.update(accessToken.id, { + this.collapsedQueueService.updateAccessTokenQueue.enqueue(accessToken.id, { lastUsedAt: this.timeService.date, });