From d9fd26c34c510b684a0f28e81175a14645639b5f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 Apr 2022 18:23:28 +0100 Subject: [PATCH 1/4] Prevent duplicated re-emitter setups in event-mapper --- src/event-mapper.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/event-mapper.ts b/src/event-mapper.ts index 92b2683046c..40ef5a824a9 100644 --- a/src/event-mapper.ts +++ b/src/event-mapper.ts @@ -25,7 +25,7 @@ export interface MapperOpts { } export function eventMapperFor(client: MatrixClient, options: MapperOpts): EventMapper { - const preventReEmit = Boolean(options.preventReEmit); + let preventReEmit = Boolean(options.preventReEmit); const decrypt = options.decrypt !== false; function mapper(plainOldJsObject: Partial) { @@ -43,6 +43,8 @@ export function eventMapperFor(client: MatrixClient, options: MapperOpts): Event } else { // merge the latest unsigned data from the server event.setUnsigned({ ...event.getUnsigned(), ...plainOldJsObject.unsigned }); + // prevent doubling up re-emitters + preventReEmit = true; } const thread = room?.findThreadForEvent(event); From aaa3e0961da1d8f1d91b4a4ccfc894f2935b6bcd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 Apr 2022 18:23:46 +0100 Subject: [PATCH 2/4] Set up re-emitter for local pre-echoed events --- src/client.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/client.ts b/src/client.ts index 60d3f370430..154e947b548 100644 --- a/src/client.ts +++ b/src/client.ts @@ -3779,6 +3779,15 @@ export class MatrixClient extends TypedEventEmitter Date: Mon, 11 Apr 2022 19:57:54 +0100 Subject: [PATCH 3/4] Stabilise redaction handling in threads --- src/models/thread.ts | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/models/thread.ts b/src/models/thread.ts index 549336b4f31..14a036b3046 100644 --- a/src/models/thread.ts +++ b/src/models/thread.ts @@ -95,6 +95,7 @@ export class Thread extends TypedEventEmitter { ]); this.room.on(MatrixEventEvent.BeforeRedaction, this.onBeforeRedaction); + this.room.on(RoomEvent.Redaction, this.onRedaction); this.room.on(RoomEvent.LocalEchoUpdated, this.onEcho); this.timelineSet.on(RoomEvent.Timeline, this.onEcho); @@ -115,23 +116,24 @@ export class Thread extends TypedEventEmitter { } } - private onBeforeRedaction = (event: MatrixEvent) => { + private onBeforeRedaction = (event: MatrixEvent, redaction: MatrixEvent) => { if (event?.isRelation(THREAD_RELATION_TYPE.name) && - this.room.eventShouldLiveIn(event).threadId === this.id + this.room.eventShouldLiveIn(event).threadId === this.id && + !redaction.status // only respect it when it succeeds ) { this.replyCount--; this.emit(ThreadEvent.Update, this); } + }; - if (this.lastEvent?.getId() === event.getId()) { - const events = [...this.timelineSet.getLiveTimeline().getEvents()].reverse(); - this.lastEvent = events.find(e => ( - !e.isRedacted() && - e.getId() !== event.getId() && - e.isRelation(THREAD_RELATION_TYPE.name) - )) ?? this.rootEvent; - this.emit(ThreadEvent.NewReply, this, this.lastEvent); - } + private onRedaction = (event: MatrixEvent) => { + if (event.threadRootId !== this.id) return; // ignore redactions for other timelines + const events = [...this.timelineSet.getLiveTimeline().getEvents()].reverse(); + this.lastEvent = events.find(e => ( + !e.isRedacted() && + e.isRelation(THREAD_RELATION_TYPE.name) + )) ?? this.rootEvent; + this.emit(ThreadEvent.Update, this); }; private onEcho = (event: MatrixEvent) => { @@ -142,7 +144,7 @@ export class Thread extends TypedEventEmitter { // when threads are used over federation. That could result in the reply // count value drifting away from the value returned by the server const isThreadReply = event.isRelation(THREAD_RELATION_TYPE.name); - if (!this.lastEvent || (isThreadReply + if (!this.lastEvent || this.lastEvent.isRedacted() || (isThreadReply && (event.getId() !== this.lastEvent.getId()) && (event.localTimestamp > this.lastEvent.localTimestamp)) ) { From 38849f750b30dbfb59f8bee454776982380fee7b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 11 Apr 2022 20:06:32 +0100 Subject: [PATCH 4/4] Fix tests --- spec/unit/matrix-client.spec.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spec/unit/matrix-client.spec.ts b/spec/unit/matrix-client.spec.ts index b8659bd9b4e..680e14ed5eb 100644 --- a/spec/unit/matrix-client.spec.ts +++ b/spec/unit/matrix-client.spec.ts @@ -816,6 +816,9 @@ describe("MatrixClient", function() { }, addPendingEvent: jest.fn(), updatePendingEvent: jest.fn(), + reEmitter: { + reEmit: jest.fn(), + }, }; beforeEach(() => {