perf(backend): improve streaming api performance (#12033)
* wip * Update NoteEntityService.ts * wip * wip * wip * wip
This commit is contained in:
		| @@ -38,19 +38,6 @@ class ChannelChannel extends Channel { | ||||
| 	private async onNote(note: Packed<'Note'>) { | ||||
| 		if (note.channelId !== this.channelId) return; | ||||
|  | ||||
| 		// リプライなら再pack | ||||
| 		if (note.replyId != null) { | ||||
| 			note.reply = await this.noteEntityService.pack(note.replyId, this.user, { | ||||
| 				detail: true, | ||||
| 			}); | ||||
| 		} | ||||
| 		// Renoteなら再pack | ||||
| 		if (note.renoteId != null) { | ||||
| 			note.renote = await this.noteEntityService.pack(note.renoteId, this.user, { | ||||
| 				detail: true, | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する | ||||
| 		if (isUserRelated(note, this.userIdsWhoMeMuting)) return; | ||||
| 		// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する | ||||
| @@ -58,6 +45,11 @@ class ChannelChannel extends Channel { | ||||
|  | ||||
| 		if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; | ||||
|  | ||||
| 		if (this.user && note.renoteId && !note.text) { | ||||
| 			const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); | ||||
| 			note.renote!.myReaction = myRenoteReaction; | ||||
| 		} | ||||
|  | ||||
| 		this.connection.cacheNote(note); | ||||
|  | ||||
| 		this.send('note', note); | ||||
|   | ||||
| @@ -52,19 +52,6 @@ class GlobalTimelineChannel extends Channel { | ||||
| 		if (note.visibility !== 'public') return; | ||||
| 		if (note.channelId != null) return; | ||||
|  | ||||
| 		// リプライなら再pack | ||||
| 		if (note.replyId != null) { | ||||
| 			note.reply = await this.noteEntityService.pack(note.replyId, this.user, { | ||||
| 				detail: true, | ||||
| 			}); | ||||
| 		} | ||||
| 		// Renoteなら再pack | ||||
| 		if (note.renoteId != null) { | ||||
| 			note.renote = await this.noteEntityService.pack(note.renoteId, this.user, { | ||||
| 				detail: true, | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		// 関係ない返信は除外 | ||||
| 		if (note.reply && !this.following[note.userId]?.withReplies) { | ||||
| 			const reply = note.reply; | ||||
| @@ -84,6 +71,11 @@ class GlobalTimelineChannel extends Channel { | ||||
|  | ||||
| 		if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; | ||||
|  | ||||
| 		if (this.user && note.renoteId && !note.text) { | ||||
| 			const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); | ||||
| 			note.renote!.myReaction = myRenoteReaction; | ||||
| 		} | ||||
|  | ||||
| 		this.connection.cacheNote(note); | ||||
|  | ||||
| 		this.send('note', note); | ||||
|   | ||||
| @@ -43,13 +43,6 @@ class HashtagChannel extends Channel { | ||||
| 		const matched = this.q.some(tags => tags.every(tag => noteTags.includes(normalizeForSearch(tag)))); | ||||
| 		if (!matched) return; | ||||
|  | ||||
| 		// Renoteなら再pack | ||||
| 		if (note.renoteId != null) { | ||||
| 			note.renote = await this.noteEntityService.pack(note.renoteId, this.user, { | ||||
| 				detail: true, | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する | ||||
| 		if (isUserRelated(note, this.userIdsWhoMeMuting)) return; | ||||
| 		// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する | ||||
| @@ -57,6 +50,11 @@ class HashtagChannel extends Channel { | ||||
|  | ||||
| 		if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; | ||||
|  | ||||
| 		if (this.user && note.renoteId && !note.text) { | ||||
| 			const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); | ||||
| 			note.renote!.myReaction = myRenoteReaction; | ||||
| 		} | ||||
|  | ||||
| 		this.connection.cacheNote(note); | ||||
|  | ||||
| 		this.send('note', note); | ||||
|   | ||||
| @@ -51,27 +51,10 @@ class HomeTimelineChannel extends Channel { | ||||
| 		// Ignore notes from instances the user has muted | ||||
| 		if (isInstanceMuted(note, new Set<string>(this.userProfile!.mutedInstances ?? []))) return; | ||||
|  | ||||
| 		if (['followers', 'specified'].includes(note.visibility)) { | ||||
| 			note = await this.noteEntityService.pack(note.id, this.user!, { | ||||
| 				detail: true, | ||||
| 			}); | ||||
|  | ||||
| 			if (note.isHidden) { | ||||
| 				return; | ||||
| 			} | ||||
| 		} else { | ||||
| 			// リプライなら再pack | ||||
| 			if (note.replyId != null) { | ||||
| 				note.reply = await this.noteEntityService.pack(note.replyId, this.user!, { | ||||
| 					detail: true, | ||||
| 				}); | ||||
| 			} | ||||
| 			// Renoteなら再pack | ||||
| 			if (note.renoteId != null) { | ||||
| 				note.renote = await this.noteEntityService.pack(note.renoteId, this.user!, { | ||||
| 					detail: true, | ||||
| 				}); | ||||
| 			} | ||||
| 		if (note.visibility === 'followers') { | ||||
| 			if (!Object.hasOwn(this.following, note.userId)) return; | ||||
| 		} else if (note.visibility === 'specified') { | ||||
| 			if (!note.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 		} | ||||
|  | ||||
| 		// 関係ない返信は除外 | ||||
| @@ -90,6 +73,11 @@ class HomeTimelineChannel extends Channel { | ||||
|  | ||||
| 		if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; | ||||
|  | ||||
| 		if (this.user && note.renoteId && !note.text) { | ||||
| 			const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); | ||||
| 			note.renote!.myReaction = myRenoteReaction; | ||||
| 		} | ||||
|  | ||||
| 		this.connection.cacheNote(note); | ||||
|  | ||||
| 		this.send('note', note); | ||||
|   | ||||
| @@ -62,27 +62,10 @@ class HybridTimelineChannel extends Channel { | ||||
| 			(note.channelId != null && this.followingChannels.has(note.channelId)) | ||||
| 		)) return; | ||||
|  | ||||
| 		if (['followers', 'specified'].includes(note.visibility)) { | ||||
| 			note = await this.noteEntityService.pack(note.id, this.user!, { | ||||
| 				detail: true, | ||||
| 			}); | ||||
|  | ||||
| 			if (note.isHidden) { | ||||
| 				return; | ||||
| 			} | ||||
| 		} else { | ||||
| 			// リプライなら再pack | ||||
| 			if (note.replyId != null) { | ||||
| 				note.reply = await this.noteEntityService.pack(note.replyId, this.user!, { | ||||
| 					detail: true, | ||||
| 				}); | ||||
| 			} | ||||
| 			// Renoteなら再pack | ||||
| 			if (note.renoteId != null) { | ||||
| 				note.renote = await this.noteEntityService.pack(note.renoteId, this.user!, { | ||||
| 					detail: true, | ||||
| 				}); | ||||
| 			} | ||||
| 		if (note.visibility === 'followers') { | ||||
| 			if (!Object.hasOwn(this.following, note.userId)) return; | ||||
| 		} else if (note.visibility === 'specified') { | ||||
| 			if (!note.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 		} | ||||
|  | ||||
| 		// Ignore notes from instances the user has muted | ||||
| @@ -104,6 +87,11 @@ class HybridTimelineChannel extends Channel { | ||||
|  | ||||
| 		if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; | ||||
|  | ||||
| 		if (this.user && note.renoteId && !note.text) { | ||||
| 			const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); | ||||
| 			note.renote!.myReaction = myRenoteReaction; | ||||
| 		} | ||||
|  | ||||
| 		this.connection.cacheNote(note); | ||||
|  | ||||
| 		this.send('note', note); | ||||
|   | ||||
| @@ -54,19 +54,6 @@ class LocalTimelineChannel extends Channel { | ||||
| 		if (note.visibility !== 'public') return; | ||||
| 		if (note.channelId != null && !this.followingChannels.has(note.channelId)) return; | ||||
|  | ||||
| 		// リプライなら再pack | ||||
| 		if (note.replyId != null) { | ||||
| 			note.reply = await this.noteEntityService.pack(note.replyId, this.user, { | ||||
| 				detail: true, | ||||
| 			}); | ||||
| 		} | ||||
| 		// Renoteなら再pack | ||||
| 		if (note.renoteId != null) { | ||||
| 			note.renote = await this.noteEntityService.pack(note.renoteId, this.user, { | ||||
| 				detail: true, | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		// 関係ない返信は除外 | ||||
| 		if (note.reply && this.user && !this.following[note.userId]?.withReplies && !this.withReplies) { | ||||
| 			const reply = note.reply; | ||||
| @@ -83,6 +70,11 @@ class LocalTimelineChannel extends Channel { | ||||
|  | ||||
| 		if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; | ||||
|  | ||||
| 		if (this.user && note.renoteId && !note.text) { | ||||
| 			const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); | ||||
| 			note.renote!.myReaction = myRenoteReaction; | ||||
| 		} | ||||
|  | ||||
| 		this.connection.cacheNote(note); | ||||
|  | ||||
| 		this.send('note', note); | ||||
|   | ||||
| @@ -82,27 +82,10 @@ class UserListChannel extends Channel { | ||||
|  | ||||
| 		if (!Object.hasOwn(this.membershipsMap, note.userId)) return; | ||||
|  | ||||
| 		if (['followers', 'specified'].includes(note.visibility)) { | ||||
| 			note = await this.noteEntityService.pack(note.id, this.user, { | ||||
| 				detail: true, | ||||
| 			}); | ||||
|  | ||||
| 			if (note.isHidden) { | ||||
| 				return; | ||||
| 			} | ||||
| 		} else { | ||||
| 			// リプライなら再pack | ||||
| 			if (note.replyId != null) { | ||||
| 				note.reply = await this.noteEntityService.pack(note.replyId, this.user, { | ||||
| 					detail: true, | ||||
| 				}); | ||||
| 			} | ||||
| 			// Renoteなら再pack | ||||
| 			if (note.renoteId != null) { | ||||
| 				note.renote = await this.noteEntityService.pack(note.renoteId, this.user, { | ||||
| 					detail: true, | ||||
| 				}); | ||||
| 			} | ||||
| 		if (note.visibility === 'followers') { | ||||
| 			if (!Object.hasOwn(this.following, note.userId)) return; | ||||
| 		} else if (note.visibility === 'specified') { | ||||
| 			if (!note.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 		} | ||||
|  | ||||
| 		// 関係ない返信は除外 | ||||
| @@ -119,6 +102,13 @@ class UserListChannel extends Channel { | ||||
|  | ||||
| 		if (note.renote && !note.text && isUserRelated(note, this.userIdsWhoMeMutingRenotes)) return; | ||||
|  | ||||
| 		if (this.user && note.renoteId && !note.text) { | ||||
| 			const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renoteId, this.user.id); | ||||
| 			note.renote!.myReaction = myRenoteReaction; | ||||
| 		} | ||||
|  | ||||
| 		this.connection.cacheNote(note); | ||||
|  | ||||
| 		this.send('note', note); | ||||
| 	} | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo