fix: always clone the note before hideNote

This commit is contained in:
Lhc_fl 2025-03-03 18:17:13 +08:00
parent 0c7657e3a3
commit 381046a6b1
No known key found for this signature in database
GPG key ID: 3A10435B21EDC6AA

View file

@ -82,6 +82,12 @@ export default abstract class Channel {
return false;
}
/**
* Please make sure you did `assignMyReaction` before this function.
* See Dakker's comment regarding the same object will leading to wrong value.
* @param note The note to **CHANGE**
* @see assignMyReaction
*/
protected async hideNote(note: Packed<'Note'>): Promise<void> {
if (note.renote) {
await this.hideNote(note.renote);
@ -122,7 +128,6 @@ export default abstract class Channel {
public onMessage?(type: string, body: JsonValue): void;
public async assignMyReaction(note: Packed<'Note'>): Promise<Packed<'Note'>> {
let changed = false;
// StreamingApiServerService creates a single EventEmitter per server process,
// so a new note arriving from redis gets de-serialised once per server process,
// and then that single object is passed to all active channels on each connection.
@ -133,7 +138,6 @@ export default abstract class Channel {
if (note.renote && Object.keys(note.renote.reactions).length > 0) {
const myReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id);
if (myReaction) {
changed = true;
clonedNote.renote = { ...note.renote };
clonedNote.renote.myReaction = myReaction;
}
@ -141,7 +145,6 @@ export default abstract class Channel {
if (note.renote?.reply && Object.keys(note.renote.reply.reactions).length > 0) {
const myReaction = await this.noteEntityService.populateMyReaction(note.renote.reply, this.user.id);
if (myReaction) {
changed = true;
clonedNote.renote = { ...note.renote };
clonedNote.renote.reply = { ...note.renote.reply };
clonedNote.renote.reply.myReaction = myReaction;
@ -151,12 +154,11 @@ export default abstract class Channel {
if (this.user && note.reply && Object.keys(note.reply.reactions).length > 0) {
const myReaction = await this.noteEntityService.populateMyReaction(note.reply, this.user.id);
if (myReaction) {
changed = true;
clonedNote.reply = { ...note.reply };
clonedNote.reply.myReaction = myReaction;
}
}
return changed ? clonedNote : note;
return clonedNote;
}
}