You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-07-31 15:24:23 +03:00
Fix threads ending up with chunks of their timelines missing (#3618)
* Fix threads ending up with chunks of their timelines missing * delint
This commit is contained in:
committed by
GitHub
parent
de7959de6c
commit
8a80886358
@ -2026,6 +2026,25 @@ describe("MatrixClient event timelines", function () {
|
|||||||
.respond(200, function () {
|
.respond(200, function () {
|
||||||
return THREAD_ROOT;
|
return THREAD_ROOT;
|
||||||
});
|
});
|
||||||
|
httpBackend
|
||||||
|
.when("GET", "/rooms/!foo%3Abar/event/" + encodeURIComponent(THREAD_ROOT.event_id!))
|
||||||
|
.respond(200, function () {
|
||||||
|
return THREAD_ROOT;
|
||||||
|
});
|
||||||
|
httpBackend
|
||||||
|
.when(
|
||||||
|
"GET",
|
||||||
|
"/_matrix/client/v1/rooms/!foo%3Abar/relations/" +
|
||||||
|
encodeURIComponent(THREAD_ROOT.event_id!) +
|
||||||
|
"/" +
|
||||||
|
encodeURIComponent(THREAD_RELATION_TYPE.name) +
|
||||||
|
buildRelationPaginationQuery({ dir: Direction.Backward, limit: 1 }),
|
||||||
|
)
|
||||||
|
.respond(200, function () {
|
||||||
|
return {
|
||||||
|
chunk: [THREAD_REPLY],
|
||||||
|
};
|
||||||
|
});
|
||||||
await Promise.all([httpBackend.flushAllExpected(), utils.syncPromise(client)]);
|
await Promise.all([httpBackend.flushAllExpected(), utils.syncPromise(client)]);
|
||||||
|
|
||||||
const room = client.getRoom(roomId)!;
|
const room = client.getRoom(roomId)!;
|
||||||
|
@ -703,7 +703,11 @@ async function createThread(client: MatrixClient, user: string, roomId: string):
|
|||||||
root.setThreadId(root.getId());
|
root.setThreadId(root.getId());
|
||||||
await room.addLiveEvents([root]);
|
await room.addLiveEvents([root]);
|
||||||
|
|
||||||
return room.createThread(root.getId()!, root, [], false);
|
// Create the thread and wait for it to be initialised
|
||||||
|
const thread = room.createThread(root.getId()!, root, [], false);
|
||||||
|
await new Promise<void>((res) => thread.once(RoomEvent.TimelineReset, () => res()));
|
||||||
|
|
||||||
|
return thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2556,7 +2556,7 @@ describe("Room", function () {
|
|||||||
next_batch: "start_token",
|
next_batch: "start_token",
|
||||||
});
|
});
|
||||||
|
|
||||||
let prom = emitPromise(room, ThreadEvent.New);
|
const prom = emitPromise(room, ThreadEvent.New);
|
||||||
await room.addLiveEvents([randomMessage, threadRoot, threadResponse]);
|
await room.addLiveEvents([randomMessage, threadRoot, threadResponse]);
|
||||||
const thread: Thread = await prom;
|
const thread: Thread = await prom;
|
||||||
await emitPromise(room, ThreadEvent.Update);
|
await emitPromise(room, ThreadEvent.Update);
|
||||||
@ -2583,9 +2583,11 @@ describe("Room", function () {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
prom = emitPromise(room, ThreadEvent.Update);
|
// XXX: If we add the relation to the thread response before the thread finishes fetching via /relations
|
||||||
await room.addLiveEvents([threadResponseEdit]);
|
// then the test will fail
|
||||||
await prom;
|
await emitPromise(room, ThreadEvent.Update);
|
||||||
|
await emitPromise(room, ThreadEvent.Update);
|
||||||
|
await Promise.all([emitPromise(room, ThreadEvent.Update), room.addLiveEvents([threadResponseEdit])]);
|
||||||
expect(thread.replyToEvent!.getContent().body).toBe(threadResponseEdit.getContent()["m.new_content"].body);
|
expect(thread.replyToEvent!.getContent().body).toBe(threadResponseEdit.getContent()["m.new_content"].body);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -2765,7 +2767,7 @@ describe("Room", function () {
|
|||||||
"m.relations": {
|
"m.relations": {
|
||||||
"m.thread": {
|
"m.thread": {
|
||||||
latest_event: threadResponse2.event,
|
latest_event: threadResponse2.event,
|
||||||
count: 2,
|
count: 1,
|
||||||
current_user_participated: true,
|
current_user_participated: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -2787,10 +2789,10 @@ describe("Room", function () {
|
|||||||
let prom = emitPromise(room, ThreadEvent.New);
|
let prom = emitPromise(room, ThreadEvent.New);
|
||||||
await room.addLiveEvents([threadRoot, threadResponse1]);
|
await room.addLiveEvents([threadRoot, threadResponse1]);
|
||||||
const thread: Thread = await prom;
|
const thread: Thread = await prom;
|
||||||
|
await emitPromise(room, ThreadEvent.Update);
|
||||||
|
|
||||||
expect(thread.initialEventsFetched).toBeTruthy();
|
expect(thread.initialEventsFetched).toBeTruthy();
|
||||||
await room.addLiveEvents([threadResponse2]);
|
await room.addLiveEvents([threadResponse2]);
|
||||||
await emitPromise(room, ThreadEvent.Update);
|
|
||||||
expect(thread).toHaveLength(2);
|
expect(thread).toHaveLength(2);
|
||||||
expect(thread.replyToEvent!.getId()).toBe(threadResponse2.getId());
|
expect(thread.replyToEvent!.getId()).toBe(threadResponse2.getId());
|
||||||
|
|
||||||
@ -2809,11 +2811,10 @@ describe("Room", function () {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
prom = emitPromise(room, ThreadEvent.Update);
|
|
||||||
const threadResponse2Redaction = mkRedaction(threadResponse2);
|
|
||||||
await room.addLiveEvents([threadResponse2Redaction]);
|
|
||||||
await prom;
|
|
||||||
await emitPromise(room, ThreadEvent.Update);
|
await emitPromise(room, ThreadEvent.Update);
|
||||||
|
const threadResponse2Redaction = mkRedaction(threadResponse2);
|
||||||
|
await emitPromise(room, ThreadEvent.Update);
|
||||||
|
await room.addLiveEvents([threadResponse2Redaction]);
|
||||||
expect(thread).toHaveLength(1);
|
expect(thread).toHaveLength(1);
|
||||||
expect(thread.replyToEvent!.getId()).toBe(threadResponse1.getId());
|
expect(thread.replyToEvent!.getId()).toBe(threadResponse1.getId());
|
||||||
|
|
||||||
|
@ -326,11 +326,6 @@ export class Thread extends ReadReceipt<ThreadEmittedEvents, ThreadEventHandlerM
|
|||||||
public async addEvent(event: MatrixEvent, toStartOfTimeline: boolean, emit = true): Promise<void> {
|
public async addEvent(event: MatrixEvent, toStartOfTimeline: boolean, emit = true): Promise<void> {
|
||||||
this.setEventMetadata(event);
|
this.setEventMetadata(event);
|
||||||
|
|
||||||
if (!this.initialEventsFetched && !toStartOfTimeline && event.getId() === this.id) {
|
|
||||||
// We're loading the thread organically
|
|
||||||
this.initialEventsFetched = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const lastReply = this.lastReply();
|
const lastReply = this.lastReply();
|
||||||
const isNewestReply = !lastReply || event.localTimestamp >= lastReply!.localTimestamp;
|
const isNewestReply = !lastReply || event.localTimestamp >= lastReply!.localTimestamp;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user