From 3d11c4e940195bfb68f98c77382fa698b9f900b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?= <46447427+samunohito@users.noreply.github.com> Date: Tue, 14 Jan 2025 08:04:55 +0900 Subject: [PATCH 1/7] wip --- packages/backend/src/config.ts | 12 ++++ .../backend/src/core/NoteCreateService.ts | 58 +++++++++++++++---- packages/backend/src/core/QueueModule.ts | 12 ++++ packages/backend/src/core/QueueService.ts | 18 ++++++ .../src/queue/QueueProcessorService.ts | 20 +++++++ packages/backend/src/queue/const.ts | 1 + .../LocalUserDeliverProcessorService.ts | 48 +++++++++++++++ packages/backend/src/queue/types.ts | 9 +++ 8 files changed, 168 insertions(+), 10 deletions(-) create mode 100644 packages/backend/src/queue/processors/LocalUserDeliverProcessorService.ts diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 42f1033b9d..7fe50a5b2f 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -89,6 +89,12 @@ type Source = { deliverJobMaxAttempts?: number; inboxJobMaxAttempts?: number; + deliverLocalUser?: { + postNoteCreated?: { + runOnWorker?: boolean; + } + } + mediaProxy?: string; proxyRemoteFiles?: boolean; videoThumbnailGenerator?: string; @@ -149,6 +155,11 @@ export type Config = { relationshipJobPerSec: number | undefined; deliverJobMaxAttempts: number | undefined; inboxJobMaxAttempts: number | undefined; + deliverLocalUser?: { + postNoteCreated?: { + runOnWorker?: boolean; + } + }; proxyRemoteFiles: boolean | undefined; signToActivityPubGet: boolean | undefined; @@ -277,6 +288,7 @@ export function loadConfig(): Config { relationshipJobPerSec: config.relationshipJobPerSec, deliverJobMaxAttempts: config.deliverJobMaxAttempts, inboxJobMaxAttempts: config.inboxJobMaxAttempts, + deliverLocalUser: config.deliverLocalUser, proxyRemoteFiles: config.proxyRemoteFiles, signToActivityPubGet: config.signToActivityPubGet ?? true, mediaProxy: externalMediaProxy ?? internalMediaProxy, diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index 56ddcefd7c..2c3b9c3c1a 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -8,6 +8,8 @@ import * as mfm from 'mfm-js'; import { In, DataSource, IsNull, LessThan } from 'typeorm'; import * as Redis from 'ioredis'; import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common'; +import Logger from '@/logger.js'; +import { LoggerService } from '@/core/LoggerService.js'; import { extractMentions } from '@/misc/extract-mentions.js'; import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js'; import { extractHashtags } from '@/misc/extract-hashtags.js'; @@ -123,6 +125,8 @@ type MinimumUser = { uri: MiUser['uri']; }; +type PostNoteUser = Pick + type Option = { createdAt?: Date | null; name?: string | null; @@ -145,10 +149,26 @@ type Option = { app?: MiApp | null; }; +export type PostNoteCreateData = { + note: MiNote; + user: PostNoteUser; + data: Option; + silent: boolean; + tags: string[]; + mentionedUsers: MinimumUser[]; +} + @Injectable() export class NoteCreateService implements OnApplicationShutdown { #shutdownController = new AbortController(); private updateNotesCountQueue: CollapsedQueue; + /** + * @see NoteCreateService#postNoteCreated + * @see QueueService#localUserDeliver + * @see LocalUserDeliverProcessorService + */ + private readonly postNoteCreatedCaller: (p: PostNoteCreateData) => void | Promise; + private readonly logger: Logger; constructor( @Inject(DI.config) @@ -219,8 +239,29 @@ export class NoteCreateService implements OnApplicationShutdown { private utilityService: UtilityService, private userBlockingService: UserBlockingService, private cacheService: CacheService, + private loggerService: LoggerService, ) { + this.logger = this.loggerService.getLogger('note-create-service'); this.updateNotesCountQueue = new CollapsedQueue(process.env.NODE_ENV !== 'test' ? 60 * 1000 * 5 : 0, this.collapseNotesCount, this.performUpdateNotesCount); + + const runOnImmediate = (p: PostNoteCreateData) => { + setImmediate('post created', { signal: this.#shutdownController.signal }).then( + () => this.postNoteCreated(p), + () => { /* aborted, ignore this */ }, + ); + }; + + const runOnWorker = async (p: PostNoteCreateData) => { + await this.queueService.localUserDeliver({ + type: 'postNoteCreated', + data: p, + }); + }; + + this.postNoteCreatedCaller = this.config.deliverLocalUser?.postNoteCreated?.runOnWorker + ? runOnWorker + : runOnImmediate; + this.logger.info('postNoteCreatedCaller: ' + this.config.deliverLocalUser?.postNoteCreated?.runOnWorker ? 'worker' : 'immediate'); } @bindThis @@ -394,10 +435,7 @@ export class NoteCreateService implements OnApplicationShutdown { const note = await this.insertNote(user, data, tags, emojis, mentionedUsers); - setImmediate('post created', { signal: this.#shutdownController.signal }).then( - () => this.postNoteCreated(note, user, data, silent, tags!, mentionedUsers!), - () => { /* aborted, ignore this */ }, - ); + this.postNoteCreatedCaller({ note, user, data, silent, tags, mentionedUsers }); return note; } @@ -500,13 +538,13 @@ export class NoteCreateService implements OnApplicationShutdown { } } + /** + * Queueから呼ぶためにpublicにしているが、通常は直接呼ばないこと + */ @bindThis - private async postNoteCreated(note: MiNote, user: { - id: MiUser['id']; - username: MiUser['username']; - host: MiUser['host']; - isBot: MiUser['isBot']; - }, data: Option, silent: boolean, tags: string[], mentionedUsers: MinimumUser[]) { + public async postNoteCreated(params: PostNoteCreateData) { + const { note, user, data, silent, tags, mentionedUsers } = params; + this.notesChart.update(note, true); if (note.visibility !== 'specified' && (this.meta.enableChartsForRemoteUser || (user.host == null))) { this.perUserNotesChart.update(user, note, true); diff --git a/packages/backend/src/core/QueueModule.ts b/packages/backend/src/core/QueueModule.ts index b10b8e5899..cf6a1a0229 100644 --- a/packages/backend/src/core/QueueModule.ts +++ b/packages/backend/src/core/QueueModule.ts @@ -16,6 +16,7 @@ import { RelationshipJobData, UserWebhookDeliverJobData, SystemWebhookDeliverJobData, + LocalUserDeliverJobData, } from '../queue/types.js'; import type { Provider } from '@nestjs/common'; @@ -28,6 +29,7 @@ export type RelationshipQueue = Bull.Queue; export type ObjectStorageQueue = Bull.Queue; export type UserWebhookDeliverQueue = Bull.Queue; export type SystemWebhookDeliverQueue = Bull.Queue; +export type LocalUserDeliverQueue = Bull.Queue; const $system: Provider = { provide: 'queue:system', @@ -83,6 +85,12 @@ const $systemWebhookDeliver: Provider = { inject: [DI.config], }; +const $localUserDeliver: Provider = { + provide: 'queue:localUserDeliver', + useFactory: (config: Config) => new Bull.Queue(QUEUE.LOCAL_USER_DELIVER, baseQueueOptions(config, QUEUE.LOCAL_USER_DELIVER)), + inject: [DI.config], +}; + @Module({ imports: [ ], @@ -96,6 +104,7 @@ const $systemWebhookDeliver: Provider = { $objectStorage, $userWebhookDeliver, $systemWebhookDeliver, + $localUserDeliver, ], exports: [ $system, @@ -107,6 +116,7 @@ const $systemWebhookDeliver: Provider = { $objectStorage, $userWebhookDeliver, $systemWebhookDeliver, + $localUserDeliver, ], }) export class QueueModule implements OnApplicationShutdown { @@ -120,6 +130,7 @@ export class QueueModule implements OnApplicationShutdown { @Inject('queue:objectStorage') public objectStorageQueue: ObjectStorageQueue, @Inject('queue:userWebhookDeliver') public userWebhookDeliverQueue: UserWebhookDeliverQueue, @Inject('queue:systemWebhookDeliver') public systemWebhookDeliverQueue: SystemWebhookDeliverQueue, + @Inject('queue:localUserDeliver') public localUserDeliverQueue: LocalUserDeliverQueue, ) {} public async dispose(): Promise { @@ -136,6 +147,7 @@ export class QueueModule implements OnApplicationShutdown { this.objectStorageQueue.close(), this.userWebhookDeliverQueue.close(), this.systemWebhookDeliverQueue.close(), + this.localUserDeliverQueue.close(), ]); } diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts index da76dd1284..16ddbff628 100644 --- a/packages/backend/src/core/QueueService.ts +++ b/packages/backend/src/core/QueueService.ts @@ -19,6 +19,7 @@ import { type UserWebhookPayload } from './UserWebhookService.js'; import type { DbJobData, DeliverJobData, + LocalUserDeliverJobData, RelationshipJobData, SystemWebhookDeliverJobData, ThinUser, @@ -29,6 +30,7 @@ import type { DeliverQueue, EndedPollNotificationQueue, InboxQueue, + LocalUserDeliverQueue, ObjectStorageQueue, RelationshipQueue, SystemQueue, @@ -53,6 +55,7 @@ export class QueueService { @Inject('queue:objectStorage') public objectStorageQueue: ObjectStorageQueue, @Inject('queue:userWebhookDeliver') public userWebhookDeliverQueue: UserWebhookDeliverQueue, @Inject('queue:systemWebhookDeliver') public systemWebhookDeliverQueue: SystemWebhookDeliverQueue, + @Inject('queue:localUserDeliver') public localUserDeliverQueue: LocalUserDeliverQueue, ) { this.systemQueue.add('tickCharts', { }, { @@ -528,6 +531,21 @@ export class QueueService { }); } + @bindThis + public localUserDeliver( + data: LocalUserDeliverJobData, + opts?: { attempts?: number }, + ) { + return this.localUserDeliverQueue.add('localUserDeliver-' + data.type, data, { + attempts: opts?.attempts ?? 1, + backoff: { + type: 'custom', + }, + removeOnComplete: true, + removeOnFail: true, + }); + } + @bindThis public destroy() { this.deliverQueue.once('cleaned', (jobs, status) => { diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts index 6940e1c188..ddd460f0e7 100644 --- a/packages/backend/src/queue/QueueProcessorService.ts +++ b/packages/backend/src/queue/QueueProcessorService.ts @@ -45,6 +45,7 @@ import { CleanProcessorService } from './processors/CleanProcessorService.js'; import { AggregateRetentionProcessorService } from './processors/AggregateRetentionProcessorService.js'; import { QueueLoggerService } from './QueueLoggerService.js'; import { QUEUE, baseQueueOptions } from './const.js'; +import { LocalUserDeliverProcessorService } from './processors/LocalUserDeliverProcessorService.js'; // ref. https://github.com/misskey-dev/misskey/pull/7635#issue-971097019 function httpRelatedBackoff(attemptsMade: number) { @@ -84,6 +85,7 @@ export class QueueProcessorService implements OnApplicationShutdown { private relationshipQueueWorker: Bull.Worker; private objectStorageQueueWorker: Bull.Worker; private endedPollNotificationQueueWorker: Bull.Worker; + private localUserDeliverQueueWorker: Bull.Worker; constructor( @Inject(DI.config) @@ -123,6 +125,7 @@ export class QueueProcessorService implements OnApplicationShutdown { private bakeBufferedReactionsProcessorService: BakeBufferedReactionsProcessorService, private checkModeratorsActivityProcessorService: CheckModeratorsActivityProcessorService, private cleanProcessorService: CleanProcessorService, + private localUserDeliverProcessorService: LocalUserDeliverProcessorService, ) { this.logger = this.queueLoggerService.logger; @@ -517,6 +520,21 @@ export class QueueProcessorService implements OnApplicationShutdown { }); } //#endregion + + //#region LocalUser deliver + { + this.localUserDeliverQueueWorker = new Bull.Worker(QUEUE.LOCAL_USER_DELIVER, (job) => { + if (this.config.sentryForBackend) { + return Sentry.startSpan({ name: 'Queue: LocalUserDeliver' }, () => this.localUserDeliverProcessorService.process(job)); + } else { + return this.localUserDeliverProcessorService.process(job); + } + }, { + ...baseQueueOptions(this.config, QUEUE.LOCAL_USER_DELIVER), + autorun: false, + }); + } + //#endregion } @bindThis @@ -531,6 +549,7 @@ export class QueueProcessorService implements OnApplicationShutdown { this.relationshipQueueWorker.run(), this.objectStorageQueueWorker.run(), this.endedPollNotificationQueueWorker.run(), + this.localUserDeliverQueueWorker.run(), ]); } @@ -546,6 +565,7 @@ export class QueueProcessorService implements OnApplicationShutdown { this.relationshipQueueWorker.close(), this.objectStorageQueueWorker.close(), this.endedPollNotificationQueueWorker.close(), + this.localUserDeliverQueueWorker.close(), ]); } diff --git a/packages/backend/src/queue/const.ts b/packages/backend/src/queue/const.ts index 67f689b618..a114a95c1c 100644 --- a/packages/backend/src/queue/const.ts +++ b/packages/backend/src/queue/const.ts @@ -16,6 +16,7 @@ export const QUEUE = { OBJECT_STORAGE: 'objectStorage', USER_WEBHOOK_DELIVER: 'userWebhookDeliver', SYSTEM_WEBHOOK_DELIVER: 'systemWebhookDeliver', + LOCAL_USER_DELIVER: 'localUserDeliver', }; export function baseQueueOptions(config: Config, queueName: typeof QUEUE[keyof typeof QUEUE]): Bull.QueueOptions { diff --git a/packages/backend/src/queue/processors/LocalUserDeliverProcessorService.ts b/packages/backend/src/queue/processors/LocalUserDeliverProcessorService.ts new file mode 100644 index 0000000000..78aef8aa0e --- /dev/null +++ b/packages/backend/src/queue/processors/LocalUserDeliverProcessorService.ts @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { Inject, Injectable } from '@nestjs/common'; +import type { Config } from '@/config.js'; +import { bindThis } from '@/decorators.js'; +import { DI } from '@/di-symbols.js'; +import type Logger from '@/logger.js'; +import type { LocalUserDeliverJobData } from '@/queue/types.js'; +import { NoteCreateService } from '@/core/NoteCreateService.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; + +@Injectable() +export class LocalUserDeliverProcessorService { + private logger: Logger; + + constructor( + @Inject(DI.config) + private config: Config, + + private noteCreateService: NoteCreateService, + private queueLoggerService: QueueLoggerService, + ) { + this.logger = this.queueLoggerService.logger.createSubLogger('clean'); + } + + @bindThis + public async process(job: Bull.Job): Promise { + try { + switch (job.data.type) { + case 'postNoteCreated': { + const data = job.data; + await this.noteCreateService.postNoteCreated(data.data); + break; + } + } + } catch (e) { + if (e instanceof Error) { + this.logger.error(`Failed to process job. ${job.data}`, e); + } + + this.logger.error(`Failed to process. ${job.data}`, new Error(`unknown: ${e}`)); + } + } +} diff --git a/packages/backend/src/queue/types.ts b/packages/backend/src/queue/types.ts index a4077a0547..3006b1a38f 100644 --- a/packages/backend/src/queue/types.ts +++ b/packages/backend/src/queue/types.ts @@ -3,6 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ +import { PostNoteCreateData } from '@/core/NoteCreateService.js'; import type { Antenna } from '@/server/api/endpoints/i/import-antennas.js'; import type { MiDriveFile } from '@/models/DriveFile.js'; import type { MiNote } from '@/models/Note.js'; @@ -127,6 +128,14 @@ export type UserWebhookDeliverJobData = { eventId: string; }; +// 他のも増えそうな余地あるので +export type LocalUserDeliverJobData = LocalUserDeliverPostNoteCreatedJobData; + +type LocalUserDeliverPostNoteCreatedJobData = { + type: 'postNoteCreated'; + data: PostNoteCreateData; +} + export type ThinUser = { id: MiUser['id']; }; From 9c78649ab2df1cfd110073861f3cea94c345a1e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?= <46447427+samunohito@users.noreply.github.com> Date: Tue, 14 Jan 2025 08:12:06 +0900 Subject: [PATCH 2/7] wip --- packages/backend/src/queue/QueueProcessorModule.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/backend/src/queue/QueueProcessorModule.ts b/packages/backend/src/queue/QueueProcessorModule.ts index 9044285bf6..7b39118630 100644 --- a/packages/backend/src/queue/QueueProcessorModule.ts +++ b/packages/backend/src/queue/QueueProcessorModule.ts @@ -4,6 +4,7 @@ */ import { Module } from '@nestjs/common'; +import { LocalUserDeliverProcessorService } from '@/queue/processors/LocalUserDeliverProcessorService.js'; import { CoreModule } from '@/core/CoreModule.js'; import { GlobalModule } from '@/GlobalModule.js'; import { CheckModeratorsActivityProcessorService } from '@/queue/processors/CheckModeratorsActivityProcessorService.js'; @@ -83,6 +84,7 @@ import { RelationshipProcessorService } from './processors/RelationshipProcessor AggregateRetentionProcessorService, CheckExpiredMutingsProcessorService, CheckModeratorsActivityProcessorService, + LocalUserDeliverProcessorService, QueueProcessorService, ], exports: [ From 067f5762e332f3176754d1b43990c8cee212fa3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?= <46447427+samunohito@users.noreply.github.com> Date: Tue, 14 Jan 2025 08:27:43 +0900 Subject: [PATCH 3/7] refactor --- packages/backend/src/config.ts | 4 ++-- packages/backend/src/core/NoteCreateService.ts | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 7fe50a5b2f..a3bf02f231 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -91,7 +91,7 @@ type Source = { deliverLocalUser?: { postNoteCreated?: { - runOnWorker?: boolean; + runOn?: 'immediate' | 'worker'; } } @@ -157,7 +157,7 @@ export type Config = { inboxJobMaxAttempts: number | undefined; deliverLocalUser?: { postNoteCreated?: { - runOnWorker?: boolean; + runOn?: 'immediate' | 'worker'; } }; proxyRemoteFiles: boolean | undefined; diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index 2c3b9c3c1a..793a7beebc 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -258,10 +258,13 @@ export class NoteCreateService implements OnApplicationShutdown { }); }; - this.postNoteCreatedCaller = this.config.deliverLocalUser?.postNoteCreated?.runOnWorker + this.postNoteCreatedCaller = this.config.deliverLocalUser?.postNoteCreated?.runOn === 'worker' ? runOnWorker : runOnImmediate; - this.logger.info('postNoteCreatedCaller: ' + this.config.deliverLocalUser?.postNoteCreated?.runOnWorker ? 'worker' : 'immediate'); + const runOnName = this.config.deliverLocalUser?.postNoteCreated?.runOn + ? this.config.deliverLocalUser.postNoteCreated.runOn + : 'immediate'; + this.logger.info(`postNoteCreatedCaller: ${runOnName}`); } @bindThis From 554e112864adb73a3d3aefc90bc0ba01ac64471c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?= <46447427+samunohito@users.noreply.github.com> Date: Tue, 14 Jan 2025 08:36:59 +0900 Subject: [PATCH 4/7] add bull --- packages/backend/src/server/web/ClientServerService.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts index 1a75096c4e..b0a42a9a3b 100644 --- a/packages/backend/src/server/web/ClientServerService.ts +++ b/packages/backend/src/server/web/ClientServerService.ts @@ -33,7 +33,7 @@ import type { RelationshipQueue, SystemQueue, UserWebhookDeliverQueue, - SystemWebhookDeliverQueue, + SystemWebhookDeliverQueue, LocalUserDeliverQueue, } from '@/core/QueueModule.js'; import { UserEntityService } from '@/core/entities/UserEntityService.js'; import { NoteEntityService } from '@/core/entities/NoteEntityService.js'; @@ -143,6 +143,7 @@ export class ClientServerService { @Inject('queue:objectStorage') public objectStorageQueue: ObjectStorageQueue, @Inject('queue:userWebhookDeliver') public userWebhookDeliverQueue: UserWebhookDeliverQueue, @Inject('queue:systemWebhookDeliver') public systemWebhookDeliverQueue: SystemWebhookDeliverQueue, + @Inject('queue:localUserDeliver') public localUserDeliverQueue: LocalUserDeliverQueue, ) { //this.createServer = this.createServer.bind(this); } @@ -271,6 +272,7 @@ export class ClientServerService { this.objectStorageQueue, this.userWebhookDeliverQueue, this.systemWebhookDeliverQueue, + this.localUserDeliverQueue, ].map(q => new BullMQAdapter(q)), serverAdapter: bullBoardServerAdapter, }); From cda219fe0976ca81b98128e5c4645a061d693caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?= <46447427+samunohito@users.noreply.github.com> Date: Thu, 16 Jan 2025 08:31:00 +0900 Subject: [PATCH 5/7] add example --- .config/docker_example.yml | 6 ++++++ .config/example.yml | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/.config/docker_example.yml b/.config/docker_example.yml index 3f8e5734ce..0fcbf90641 100644 --- a/.config/docker_example.yml +++ b/.config/docker_example.yml @@ -183,6 +183,12 @@ id: 'aidx' # deliverJobMaxAttempts: 12 # inboxJobMaxAttempts: 8 +#deliverLocalUser: +# postNoteCreated: +# # Changes the way post-processing (notifications, sending webhooks, delivery to each timeline, delivery to ActivityPub) is called immediately after creating a note. +# # The configurable values are "immediate" and "worker" (the default is "immediate"). +# runOn: 'immediate' + # IP address family used for outgoing request (ipv4, ipv6 or dual) #outgoingAddressFamily: ipv4 diff --git a/.config/example.yml b/.config/example.yml index 60a6a0aa71..a96243f9dc 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -269,6 +269,13 @@ id: 'aidx' #deliverJobMaxAttempts: 12 #inboxJobMaxAttempts: 8 +# deliver for LocalUsers +#deliverLocalUser: +# postNoteCreated: +# # Changes the way post-processing (notifications, sending webhooks, delivery to each timeline, delivery to ActivityPub) is called immediately after creating a note. +# # The configurable values are "immediate" and "worker" (the default is "immediate"). +# runOn: 'immediate' + # Local address used for outgoing requests #outgoingAddress: 127.0.0.1 From 03a61ea3a6545c751203ff3a62b17c3a9191ade6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?= <46447427+samunohito@users.noreply.github.com> Date: Thu, 16 Jan 2025 08:42:40 +0900 Subject: [PATCH 6/7] fix CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75dd37bc24..fe7b23ed80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ - Enhance: pg_bigmが利用できるよう、ノートの検索をILIKE演算子でなくLIKE演算子でLOWER()をかけたテキストに対して行うように - Enhance: チャート更新時にDBに同時接続しないように (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/830) +- Enhance: ノート作成後の後処理をワーカープロセスで実行するオプションを追加( #15052 ) - Fix: ユーザーのプロフィール画面をアドレス入力などで直接表示した際に概要タブの描画に失敗する問題の修正( #15032 ) - Fix: 起動前の疎通チェックが機能しなくなっていた問題を修正 (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/737) From 4eca4e072b038e8990a8b75b7d6e54ea2796409d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?= <46447427+samunohito@users.noreply.github.com> Date: Thu, 16 Jan 2025 08:45:56 +0900 Subject: [PATCH 7/7] fix format --- packages/backend/src/server/web/ClientServerService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts index b0a42a9a3b..789965a4cf 100644 --- a/packages/backend/src/server/web/ClientServerService.ts +++ b/packages/backend/src/server/web/ClientServerService.ts @@ -33,7 +33,8 @@ import type { RelationshipQueue, SystemQueue, UserWebhookDeliverQueue, - SystemWebhookDeliverQueue, LocalUserDeliverQueue, + SystemWebhookDeliverQueue, + LocalUserDeliverQueue, } from '@/core/QueueModule.js'; import { UserEntityService } from '@/core/entities/UserEntityService.js'; import { NoteEntityService } from '@/core/entities/NoteEntityService.js';