1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-11-26 17:03:12 +03:00

Merge pull request #986 from matrix-org/bwindels/include-ssa-for-replace

Don't accept any locally known edits earlier than the last known server-side aggregated edit
This commit is contained in:
Bruno Windels
2019-07-10 14:38:26 +00:00
committed by GitHub
2 changed files with 13 additions and 3 deletions

View File

@@ -898,7 +898,7 @@ utils.extend(module.exports.MatrixEvent.prototype, {
return this.status; return this.status;
}, },
_getServerAggregatedRelation(relType) { getServerAggregatedRelation(relType) {
const relations = this.getUnsigned()["m.relations"]; const relations = this.getUnsigned()["m.relations"];
if (relations) { if (relations) {
return relations[relType]; return relations[relType];
@@ -911,7 +911,7 @@ utils.extend(module.exports.MatrixEvent.prototype, {
* @return {string?} * @return {string?}
*/ */
replacingEventId() { replacingEventId() {
const replaceRelation = this._getServerAggregatedRelation("m.replace"); const replaceRelation = this.getServerAggregatedRelation("m.replace");
if (replaceRelation) { if (replaceRelation) {
return replaceRelation.event_id; return replaceRelation.event_id;
} else if (this._replacingEvent) { } else if (this._replacingEvent) {
@@ -936,7 +936,7 @@ utils.extend(module.exports.MatrixEvent.prototype, {
* @return {Date?} * @return {Date?}
*/ */
replacingEventDate() { replacingEventDate() {
const replaceRelation = this._getServerAggregatedRelation("m.replace"); const replaceRelation = this.getServerAggregatedRelation("m.replace");
if (replaceRelation) { if (replaceRelation) {
const ts = replaceRelation.origin_server_ts; const ts = replaceRelation.origin_server_ts;
if (Number.isFinite(ts)) { if (Number.isFinite(ts)) {

View File

@@ -301,10 +301,20 @@ export default class Relations extends EventEmitter {
// event is known anyway. // event is known anyway.
return null; return null;
} }
// the all-knowning server tells us that the event at some point had
// this timestamp for its replacement, so any following replacement should definitely not be less
const replaceRelation =
this._targetEvent.getServerAggregatedRelation("m.replace");
const minTs = replaceRelation && replaceRelation.origin_server_ts;
return this.getRelations().reduce((last, event) => { return this.getRelations().reduce((last, event) => {
if (event.getSender() !== this._targetEvent.getSender()) { if (event.getSender() !== this._targetEvent.getSender()) {
return last; return last;
} }
if (minTs && minTs > event.getTs()) {
return last;
}
if (last && last.getTs() > event.getTs()) { if (last && last.getTs() > event.getTs()) {
return last; return last;
} }