1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-07-31 15:24:23 +03:00

Ignore thread relations on state events for consistency with edits (#3540)

* Ignore thread relations on state events for consistency with edits

* Add test
This commit is contained in:
Michael Telatynski
2023-07-04 13:07:49 +01:00
committed by GitHub
parent 5be4548b3d
commit 89cabc4912
2 changed files with 40 additions and 2 deletions

View File

@ -308,4 +308,25 @@ describe("MatrixEvent", () => {
}); });
}); });
}); });
it("should ignore thread relation on state events", async () => {
const stateEvent = new MatrixEvent({
event_id: "$event_id",
type: "some_state_event",
content: {
"foo": "bar",
"m.relates_to": {
"event_id": "$thread_id",
"m.in_reply_to": {
event_id: "$thread_id",
},
"rel_type": "m.thread",
},
},
state_key: "",
});
expect(stateEvent.isState()).toBeTruthy();
expect(stateEvent.threadRootId).toBeUndefined();
});
}); });

View File

@ -34,7 +34,7 @@ import {
import { Crypto } from "../crypto"; import { Crypto } from "../crypto";
import { deepSortedObjectEntries, internaliseString } from "../utils"; import { deepSortedObjectEntries, internaliseString } from "../utils";
import { RoomMember } from "./room-member"; import { RoomMember } from "./room-member";
import { Thread, ThreadEvent, ThreadEventHandlerMap, THREAD_RELATION_TYPE } from "./thread"; import { Thread, THREAD_RELATION_TYPE, ThreadEvent, ThreadEventHandlerMap } from "./thread";
import { IActionsObject } from "../pushprocessor"; import { IActionsObject } from "../pushprocessor";
import { TypedReEmitter } from "../ReEmitter"; import { TypedReEmitter } from "../ReEmitter";
import { MatrixError } from "../http-api"; import { MatrixError } from "../http-api";
@ -576,6 +576,10 @@ export class MatrixEvent extends TypedEventEmitter<MatrixEventEmittedEvents, Mat
* Get the event ID of the thread head * Get the event ID of the thread head
*/ */
public get threadRootId(): string | undefined { public get threadRootId(): string | undefined {
// don't allow state events to be threaded as per the spec
if (this.isState()) {
return undefined;
}
const relatesTo = this.getWireContent()?.["m.relates_to"]; const relatesTo = this.getWireContent()?.["m.relates_to"];
if (relatesTo?.rel_type === THREAD_RELATION_TYPE.name) { if (relatesTo?.rel_type === THREAD_RELATION_TYPE.name) {
return relatesTo.event_id; return relatesTo.event_id;
@ -597,6 +601,11 @@ export class MatrixEvent extends TypedEventEmitter<MatrixEventEmittedEvents, Mat
* A helper to check if an event is a thread's head or not * A helper to check if an event is a thread's head or not
*/ */
public get isThreadRoot(): boolean { public get isThreadRoot(): boolean {
// don't allow state events to be threaded as per the spec
if (this.isState()) {
return false;
}
const threadDetails = this.getServerAggregatedRelation<IThreadBundledRelationship>(THREAD_RELATION_TYPE.name); const threadDetails = this.getServerAggregatedRelation<IThreadBundledRelationship>(THREAD_RELATION_TYPE.name);
// Bundled relationships only returned when the sync response is limited // Bundled relationships only returned when the sync response is limited
@ -1365,7 +1374,11 @@ export class MatrixEvent extends TypedEventEmitter<MatrixEventEmittedEvents, Mat
// Relation info is lifted out of the encrypted content when sent to // Relation info is lifted out of the encrypted content when sent to
// encrypted rooms, so we have to check `getWireContent` for this. // encrypted rooms, so we have to check `getWireContent` for this.
const relation = this.getWireContent()?.["m.relates_to"]; const relation = this.getWireContent()?.["m.relates_to"];
if (this.isState() && relation?.rel_type === RelationType.Replace) { if (
this.isState() &&
relation?.rel_type &&
([RelationType.Replace, RelationType.Thread] as string[]).includes(relation.rel_type)
) {
// State events cannot be m.replace relations // State events cannot be m.replace relations
return false; return false;
} }
@ -1618,6 +1631,10 @@ export class MatrixEvent extends TypedEventEmitter<MatrixEventEmittedEvents, Mat
* @param thread - the thread * @param thread - the thread
*/ */
public setThread(thread?: Thread): void { public setThread(thread?: Thread): void {
// don't allow state events to be threaded as per the spec
if (this.isState()) {
return;
}
if (this.thread) { if (this.thread) {
this.reEmitter.stopReEmitting(this.thread, [ThreadEvent.Update]); this.reEmitter.stopReEmitting(this.thread, [ThreadEvent.Update]);
} }