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
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:
committed by
GitHub
parent
5be4548b3d
commit
89cabc4912
@ -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();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user