Skip to content

Commit 74e847a

Browse files
authored
refactor: use TRANSIENT scope to avoid service bucket relay (#16985)
* refactor: use TRANSIENT scope to avoid service bucket relay * lint: fix lints * refactor: use transient for apResolver * Update packages/backend/src/core/activitypub/models/ApImageService.ts * fix
1 parent 06657c8 commit 74e847a

32 files changed

+397
-712
lines changed

packages/backend/src/core/CoreModule.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ import { ApLoggerService } from './activitypub/ApLoggerService.js';
141141
import { ApMfmService } from './activitypub/ApMfmService.js';
142142
import { ApRendererService } from './activitypub/ApRendererService.js';
143143
import { ApRequestService } from './activitypub/ApRequestService.js';
144-
import { ApResolverService } from './activitypub/ApResolverService.js';
144+
import { ApResolverService, Resolver } from './activitypub/ApResolverService.js';
145145
import { JsonLdService } from './activitypub/JsonLdService.js';
146146
import { RemoteLoggerService } from './RemoteLoggerService.js';
147147
import { RemoteUserResolveService } from './RemoteUserResolveService.js';
@@ -447,6 +447,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
447447
ApRendererService,
448448
ApRequestService,
449449
ApResolverService,
450+
Resolver,
450451
JsonLdService,
451452
RemoteLoggerService,
452453
RemoteUserResolveService,
@@ -745,6 +746,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
745746
ApRendererService,
746747
ApRequestService,
747748
ApResolverService,
749+
Resolver,
748750
JsonLdService,
749751
RemoteLoggerService,
750752
RemoteUserResolveService,

packages/backend/src/core/activitypub/ApInboxService.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export class ApInboxService {
9595
if (isCollectionOrOrderedCollection(activity)) {
9696
const results = [] as [string, string | void][];
9797
// eslint-disable-next-line no-param-reassign
98-
resolver ??= this.apResolverService.createResolver();
98+
resolver ??= await this.apResolverService.createResolver();
9999

100100
const items = toArray(isCollection(activity) ? activity.items : activity.orderedItems);
101101
if (items.length >= resolver.getRecursionLimit()) {
@@ -221,7 +221,7 @@ export class ApInboxService {
221221
this.logger.info(`Accept: ${uri}`);
222222

223223
// eslint-disable-next-line no-param-reassign
224-
resolver ??= this.apResolverService.createResolver();
224+
resolver ??= await this.apResolverService.createResolver();
225225

226226
const object = await resolver.resolve(activity.object).catch(err => {
227227
this.logger.error(`Resolution failed: ${err}`);
@@ -284,7 +284,7 @@ export class ApInboxService {
284284
this.logger.info(`Announce: ${uri}`);
285285

286286
// eslint-disable-next-line no-param-reassign
287-
resolver ??= this.apResolverService.createResolver();
287+
resolver ??= await this.apResolverService.createResolver();
288288

289289
if (!activity.object) return 'skip: activity has no object property';
290290
const targetUri = getApId(activity.object);
@@ -406,7 +406,7 @@ export class ApInboxService {
406406
}
407407

408408
// eslint-disable-next-line no-param-reassign
409-
resolver ??= this.apResolverService.createResolver();
409+
resolver ??= await this.apResolverService.createResolver();
410410

411411
const object = await resolver.resolve(activity.object).catch(e => {
412412
this.logger.error(`Resolution failed: ${e}`);
@@ -575,7 +575,7 @@ export class ApInboxService {
575575
this.logger.info(`Reject: ${uri}`);
576576

577577
// eslint-disable-next-line no-param-reassign
578-
resolver ??= this.apResolverService.createResolver();
578+
resolver ??= await this.apResolverService.createResolver();
579579

580580
const object = await resolver.resolve(activity.object).catch(e => {
581581
this.logger.error(`Resolution failed: ${e}`);
@@ -642,7 +642,7 @@ export class ApInboxService {
642642
this.logger.info(`Undo: ${uri}`);
643643

644644
// eslint-disable-next-line no-param-reassign
645-
resolver ??= this.apResolverService.createResolver();
645+
resolver ??= await this.apResolverService.createResolver();
646646

647647
const object = await resolver.resolve(activity.object).catch(e => {
648648
this.logger.error(`Resolution failed: ${e}`);
@@ -774,7 +774,7 @@ export class ApInboxService {
774774
this.logger.debug('Update');
775775

776776
// eslint-disable-next-line no-param-reassign
777-
resolver ??= this.apResolverService.createResolver();
777+
resolver ??= await this.apResolverService.createResolver();
778778

779779
const object = await resolver.resolve(activity.object).catch(e => {
780780
this.logger.error(`Resolution failed: ${e}`);

packages/backend/src/core/activitypub/ApResolverService.ts

Lines changed: 30 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,17 @@
33
* SPDX-License-Identifier: AGPL-3.0-only
44
*/
55

6-
import { Inject, Injectable } from '@nestjs/common';
6+
import { Inject, Injectable, Scope } from '@nestjs/common';
77
import { IsNull, Not } from 'typeorm';
88
import type { MiLocalUser, MiRemoteUser } from '@/models/User.js';
9-
import type { NotesRepository, PollsRepository, NoteReactionsRepository, UsersRepository, FollowRequestsRepository, MiMeta } from '@/models/_.js';
9+
import type {
10+
FollowRequestsRepository,
11+
MiMeta,
12+
NoteReactionsRepository,
13+
NotesRepository,
14+
PollsRepository,
15+
UsersRepository
16+
} from '@/models/_.js';
1017
import type { Config } from '@/config.js';
1118
import { HttpRequestService } from '@/core/HttpRequestService.js';
1219
import { DI } from '@/di-symbols.js';
@@ -16,34 +23,50 @@ import { LoggerService } from '@/core/LoggerService.js';
1623
import type Logger from '@/logger.js';
1724
import { SystemAccountService } from '@/core/SystemAccountService.js';
1825
import { IdentifiableError } from '@/misc/identifiable-error.js';
26+
import type { ICollection, IObject, IOrderedCollection } from './type.js';
1927
import { isCollectionOrOrderedCollection } from './type.js';
2028
import { ApDbResolverService } from './ApDbResolverService.js';
2129
import { ApRendererService } from './ApRendererService.js';
2230
import { ApRequestService } from './ApRequestService.js';
2331
import { FetchAllowSoftFailMask } from './misc/check-against-url.js';
24-
import type { IObject, ICollection, IOrderedCollection } from './type.js';
32+
import { ModuleRef } from '@nestjs/core';
2533

34+
@Injectable({ scope: Scope.TRANSIENT })
2635
export class Resolver {
2736
private history: Set<string>;
2837
private user?: MiLocalUser;
2938
private logger: Logger;
39+
private recursionLimit = 256;
3040

3141
constructor(
42+
@Inject(DI.config)
3243
private config: Config,
44+
45+
@Inject(DI.meta)
3346
private meta: MiMeta,
47+
48+
@Inject(DI.usersRepository)
3449
private usersRepository: UsersRepository,
50+
51+
@Inject(DI.notesRepository)
3552
private notesRepository: NotesRepository,
53+
54+
@Inject(DI.pollsRepository)
3655
private pollsRepository: PollsRepository,
56+
57+
@Inject(DI.noteReactionsRepository)
3758
private noteReactionsRepository: NoteReactionsRepository,
59+
60+
@Inject(DI.followRequestsRepository)
3861
private followRequestsRepository: FollowRequestsRepository,
62+
3963
private utilityService: UtilityService,
4064
private systemAccountService: SystemAccountService,
4165
private apRequestService: ApRequestService,
4266
private httpRequestService: HttpRequestService,
4367
private apRendererService: ApRendererService,
4468
private apDbResolverService: ApDbResolverService,
4569
private loggerService: LoggerService,
46-
private recursionLimit = 256,
4770
) {
4871
this.history = new Set();
4972
this.logger = this.loggerService.getLogger('ap-resolve');
@@ -180,54 +203,12 @@ export class Resolver {
180203
@Injectable()
181204
export class ApResolverService {
182205
constructor(
183-
@Inject(DI.config)
184-
private config: Config,
185-
186-
@Inject(DI.meta)
187-
private meta: MiMeta,
188-
189-
@Inject(DI.usersRepository)
190-
private usersRepository: UsersRepository,
191-
192-
@Inject(DI.notesRepository)
193-
private notesRepository: NotesRepository,
194-
195-
@Inject(DI.pollsRepository)
196-
private pollsRepository: PollsRepository,
197-
198-
@Inject(DI.noteReactionsRepository)
199-
private noteReactionsRepository: NoteReactionsRepository,
200-
201-
@Inject(DI.followRequestsRepository)
202-
private followRequestsRepository: FollowRequestsRepository,
203-
204-
private utilityService: UtilityService,
205-
private systemAccountService: SystemAccountService,
206-
private apRequestService: ApRequestService,
207-
private httpRequestService: HttpRequestService,
208-
private apRendererService: ApRendererService,
209-
private apDbResolverService: ApDbResolverService,
210-
private loggerService: LoggerService,
206+
private moduleRef: ModuleRef,
211207
) {
212208
}
213209

214210
@bindThis
215-
public createResolver(): Resolver {
216-
return new Resolver(
217-
this.config,
218-
this.meta,
219-
this.usersRepository,
220-
this.notesRepository,
221-
this.pollsRepository,
222-
this.noteReactionsRepository,
223-
this.followRequestsRepository,
224-
this.utilityService,
225-
this.systemAccountService,
226-
this.apRequestService,
227-
this.httpRequestService,
228-
this.apRendererService,
229-
this.apDbResolverService,
230-
this.loggerService,
231-
);
211+
public async createResolver(): Promise<Resolver> {
212+
return await this.moduleRef.create(Resolver);
232213
}
233214
}

packages/backend/src/core/activitypub/models/ApImageService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export class ApImageService {
4646
throw new Error('actor has been suspended');
4747
}
4848

49-
const image = await this.apResolverService.createResolver().resolve(value);
49+
const image = await (await this.apResolverService.createResolver()).resolve(value);
5050

5151
if (!isDocument(image)) return null;
5252

packages/backend/src/core/activitypub/models/ApNoteService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ export class ApNoteService {
128128
@bindThis
129129
public async createNote(value: string | IObject, actor?: MiRemoteUser, resolver?: Resolver, silent = false): Promise<MiNote | null> {
130130
// eslint-disable-next-line no-param-reassign
131-
if (resolver == null) resolver = this.apResolverService.createResolver();
131+
if (resolver == null) resolver = await this.apResolverService.createResolver();
132132

133133
const object = await resolver.resolve(value);
134134

packages/backend/src/core/activitypub/models/ApPersonService.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ export class ApPersonService implements OnModuleInit {
310310
}
311311

312312
// eslint-disable-next-line no-param-reassign
313-
if (resolver == null) resolver = this.apResolverService.createResolver();
313+
if (resolver == null) resolver = await this.apResolverService.createResolver();
314314

315315
const object = await resolver.resolve(uri);
316316
if (object.id == null) throw new Error('invalid object.id: ' + object.id);
@@ -500,7 +500,7 @@ export class ApPersonService implements OnModuleInit {
500500
//#endregion
501501

502502
// eslint-disable-next-line no-param-reassign
503-
if (resolver == null) resolver = this.apResolverService.createResolver();
503+
if (resolver == null) resolver = await this.apResolverService.createResolver();
504504

505505
const object = hint ?? await resolver.resolve(uri);
506506

@@ -678,7 +678,7 @@ export class ApPersonService implements OnModuleInit {
678678

679679
// リモートサーバーからフェッチしてきて登録
680680
// eslint-disable-next-line no-param-reassign
681-
if (resolver == null) resolver = this.apResolverService.createResolver();
681+
if (resolver == null) resolver = await this.apResolverService.createResolver();
682682
return await this.createPerson(uri, resolver);
683683
}
684684

@@ -707,7 +707,7 @@ export class ApPersonService implements OnModuleInit {
707707

708708
this.logger.info(`Updating the featured: ${user.uri}`);
709709

710-
const _resolver = resolver ?? this.apResolverService.createResolver();
710+
const _resolver = resolver ?? await this.apResolverService.createResolver();
711711

712712
// Resolve to (Ordered)Collection Object
713713
const collection = await _resolver.resolveCollection(user.featured);

packages/backend/src/core/activitypub/models/ApQuestionService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export class ApQuestionService {
4545
@bindThis
4646
public async extractPollFromQuestion(source: string | IObject, resolver?: Resolver): Promise<IPoll> {
4747
// eslint-disable-next-line no-param-reassign
48-
if (resolver == null) resolver = this.apResolverService.createResolver();
48+
if (resolver == null) resolver = await this.apResolverService.createResolver();
4949

5050
const question = await resolver.resolve(source);
5151
if (!isQuestion(question)) throw new Error('invalid type');
@@ -91,7 +91,7 @@ export class ApQuestionService {
9191

9292
// resolve new Question object
9393
// eslint-disable-next-line no-param-reassign
94-
if (resolver == null) resolver = this.apResolverService.createResolver();
94+
if (resolver == null) resolver = await this.apResolverService.createResolver();
9595
const question = await resolver.resolve(value);
9696
this.logger.debug(`fetched question: ${JSON.stringify(question, null, 2)}`);
9797

packages/backend/src/server/ServerModule.ts

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import { NodeinfoServerService } from './NodeinfoServerService.js';
1313
import { ServerService } from './ServerService.js';
1414
import { WellKnownServerService } from './WellKnownServerService.js';
1515
import { GetterService } from './api/GetterService.js';
16-
import { ChannelsService } from './api/stream/ChannelsService.js';
1716
import { ActivityPubServerService } from './ActivityPubServerService.js';
1817
import { ApiLoggerService } from './api/ApiLoggerService.js';
1918
import { ApiServerService } from './api/ApiServerService.js';
@@ -31,24 +30,25 @@ import { UrlPreviewService } from './web/UrlPreviewService.js';
3130
import { ClientLoggerService } from './web/ClientLoggerService.js';
3231
import { OAuth2ProviderService } from './oauth/OAuth2ProviderService.js';
3332

34-
import { MainChannelService } from './api/stream/channels/main.js';
35-
import { AdminChannelService } from './api/stream/channels/admin.js';
36-
import { AntennaChannelService } from './api/stream/channels/antenna.js';
37-
import { ChannelChannelService } from './api/stream/channels/channel.js';
38-
import { DriveChannelService } from './api/stream/channels/drive.js';
39-
import { GlobalTimelineChannelService } from './api/stream/channels/global-timeline.js';
40-
import { HashtagChannelService } from './api/stream/channels/hashtag.js';
41-
import { HomeTimelineChannelService } from './api/stream/channels/home-timeline.js';
42-
import { HybridTimelineChannelService } from './api/stream/channels/hybrid-timeline.js';
43-
import { LocalTimelineChannelService } from './api/stream/channels/local-timeline.js';
44-
import { QueueStatsChannelService } from './api/stream/channels/queue-stats.js';
45-
import { ServerStatsChannelService } from './api/stream/channels/server-stats.js';
46-
import { UserListChannelService } from './api/stream/channels/user-list.js';
47-
import { RoleTimelineChannelService } from './api/stream/channels/role-timeline.js';
48-
import { ChatUserChannelService } from './api/stream/channels/chat-user.js';
49-
import { ChatRoomChannelService } from './api/stream/channels/chat-room.js';
50-
import { ReversiChannelService } from './api/stream/channels/reversi.js';
51-
import { ReversiGameChannelService } from './api/stream/channels/reversi-game.js';
33+
import MainStreamConnection from '@/server/api/stream/Connection.js';
34+
import { MainChannel } from './api/stream/channels/main.js';
35+
import { AdminChannel } from './api/stream/channels/admin.js';
36+
import { AntennaChannel } from './api/stream/channels/antenna.js';
37+
import { ChannelChannel } from './api/stream/channels/channel.js';
38+
import { DriveChannel } from './api/stream/channels/drive.js';
39+
import { GlobalTimelineChannel } from './api/stream/channels/global-timeline.js';
40+
import { HashtagChannel } from './api/stream/channels/hashtag.js';
41+
import { HomeTimelineChannel } from './api/stream/channels/home-timeline.js';
42+
import { HybridTimelineChannel } from './api/stream/channels/hybrid-timeline.js';
43+
import { LocalTimelineChannel } from './api/stream/channels/local-timeline.js';
44+
import { QueueStatsChannel } from './api/stream/channels/queue-stats.js';
45+
import { ServerStatsChannel } from './api/stream/channels/server-stats.js';
46+
import { UserListChannel } from './api/stream/channels/user-list.js';
47+
import { RoleTimelineChannel } from './api/stream/channels/role-timeline.js';
48+
import { ChatUserChannel } from './api/stream/channels/chat-user.js';
49+
import { ChatRoomChannel } from './api/stream/channels/chat-room.js';
50+
import { ReversiChannel } from './api/stream/channels/reversi.js';
51+
import { ReversiGameChannel } from './api/stream/channels/reversi-game.js';
5252
import { SigninWithPasskeyApiService } from './api/SigninWithPasskeyApiService.js';
5353

5454
@Module({
@@ -69,7 +69,7 @@ import { SigninWithPasskeyApiService } from './api/SigninWithPasskeyApiService.j
6969
ServerService,
7070
WellKnownServerService,
7171
GetterService,
72-
ChannelsService,
72+
MainStreamConnection,
7373
ApiCallService,
7474
ApiLoggerService,
7575
ApiServerService,
@@ -80,24 +80,24 @@ import { SigninWithPasskeyApiService } from './api/SigninWithPasskeyApiService.j
8080
SigninService,
8181
SignupApiService,
8282
StreamingApiServerService,
83-
MainChannelService,
84-
AdminChannelService,
85-
AntennaChannelService,
86-
ChannelChannelService,
87-
DriveChannelService,
88-
GlobalTimelineChannelService,
89-
HashtagChannelService,
90-
RoleTimelineChannelService,
91-
ChatUserChannelService,
92-
ChatRoomChannelService,
93-
ReversiChannelService,
94-
ReversiGameChannelService,
95-
HomeTimelineChannelService,
96-
HybridTimelineChannelService,
97-
LocalTimelineChannelService,
98-
QueueStatsChannelService,
99-
ServerStatsChannelService,
100-
UserListChannelService,
83+
MainChannel,
84+
AdminChannel,
85+
AntennaChannel,
86+
ChannelChannel,
87+
DriveChannel,
88+
GlobalTimelineChannel,
89+
HashtagChannel,
90+
RoleTimelineChannel,
91+
ChatUserChannel,
92+
ChatRoomChannel,
93+
ReversiChannel,
94+
ReversiGameChannel,
95+
HomeTimelineChannel,
96+
HybridTimelineChannel,
97+
LocalTimelineChannel,
98+
QueueStatsChannel,
99+
ServerStatsChannel,
100+
UserListChannel,
101101
OpenApiServerService,
102102
OAuth2ProviderService,
103103
],

0 commit comments

Comments
 (0)