diff --git a/packages/backend/src/core/GlobalEventService.ts b/packages/backend/src/core/GlobalEventService.ts index da5982abf6..5fe50e5e64 100644 --- a/packages/backend/src/core/GlobalEventService.ts +++ b/packages/backend/src/core/GlobalEventService.ts @@ -129,6 +129,9 @@ export interface NoteEventTypes { type NoteStreamEventTypes = { [key in keyof NoteEventTypes]: { id: MiNote['id']; + userId: MiNote['userId']; + visibility: MiNote['visibility']; + visibleUserIds: MiNote['visibleUserIds']; body: NoteEventTypes[key]; }; }; @@ -378,9 +381,12 @@ export class GlobalEventService { } @bindThis - public publishNoteStream(noteId: MiNote['id'], type: K, value?: NoteEventTypes[K]): void { - this.publish(`noteStream:${noteId}`, type, { - id: noteId, + public publishNoteStream(note: MiNote, type: K, value?: NoteEventTypes[K]): void { + this.publish(`noteStream:${note.id}`, type, { + id: note.id, + userId: note.userId, + visibility: note.visibility, + visibleUserIds: note.visibleUserIds, body: value, }); } diff --git a/packages/backend/src/core/NoteDeleteService.ts b/packages/backend/src/core/NoteDeleteService.ts index af1f0eda9a..1b945277b7 100644 --- a/packages/backend/src/core/NoteDeleteService.ts +++ b/packages/backend/src/core/NoteDeleteService.ts @@ -68,7 +68,7 @@ export class NoteDeleteService { } if (!quiet) { - this.globalEventService.publishNoteStream(note.id, 'deleted', { + this.globalEventService.publishNoteStream(note, 'deleted', { deletedAt: deletedAt, }); diff --git a/packages/backend/src/core/PollService.ts b/packages/backend/src/core/PollService.ts index 6c96ab16cf..d21a43714f 100644 --- a/packages/backend/src/core/PollService.ts +++ b/packages/backend/src/core/PollService.ts @@ -83,7 +83,7 @@ export class PollService { const index = choice + 1; // In SQL, array index is 1 based await this.pollsRepository.query(`UPDATE poll SET votes[${index}] = votes[${index}] + 1 WHERE "noteId" = '${poll.noteId}'`); - this.globalEventService.publishNoteStream(note.id, 'pollVoted', { + this.globalEventService.publishNoteStream(note, 'pollVoted', { choice: choice, userId: user.id, }); diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts index 6f9fe53937..cd1e87dbd8 100644 --- a/packages/backend/src/core/ReactionService.ts +++ b/packages/backend/src/core/ReactionService.ts @@ -244,7 +244,7 @@ export class ReactionService { }, }); - this.globalEventService.publishNoteStream(note.id, 'reacted', { + this.globalEventService.publishNoteStream(note, 'reacted', { reaction: decodedReaction.reaction, emoji: customEmoji != null ? { name: customEmoji.host ? `${customEmoji.name}@${customEmoji.host}` : `${customEmoji.name}@.`, @@ -318,7 +318,7 @@ export class ReactionService { .execute(); } - this.globalEventService.publishNoteStream(note.id, 'unreacted', { + this.globalEventService.publishNoteStream(note, 'unreacted', { reaction: this.decodeReaction(exist.reaction).reaction, userId: user.id, }); diff --git a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts index f33f49075b..56ddf651df 100644 --- a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts +++ b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts @@ -155,7 +155,7 @@ export default class extends Endpoint { // eslint- const index = ps.choice + 1; // In SQL, array index is 1 based await this.pollsRepository.query(`UPDATE poll SET votes[${index}] = votes[${index}] + 1 WHERE "noteId" = '${poll.noteId}'`); - this.globalEventService.publishNoteStream(note.id, 'pollVoted', { + this.globalEventService.publishNoteStream(note, 'pollVoted', { choice: ps.choice, userId: me.id, }); diff --git a/packages/backend/src/server/api/stream/Connection.ts b/packages/backend/src/server/api/stream/Connection.ts index 5989409997..36f7cd93b2 100644 --- a/packages/backend/src/server/api/stream/Connection.ts +++ b/packages/backend/src/server/api/stream/Connection.ts @@ -206,6 +206,14 @@ export default class Connection { @bindThis private async onNoteStreamMessage(data: GlobalEvents['note']['payload']) { + if (data.body.visibility === 'specified' && !data.body.visibleUserIds.includes(this.user!.id)) { + return; + } + + if (data.body.visibility === 'followers' && !Object.hasOwn(this.following, data.body.userId)) { + return; + } + this.sendMessageToWs('noteUpdated', { id: data.body.id, type: data.type,