diff --git a/src/models/event.js b/src/models/event.js index 4c07db75e..6949674cb 100644 --- a/src/models/event.js +++ b/src/models/event.js @@ -758,6 +758,10 @@ utils.extend(module.exports.MatrixEvent.prototype, { if (this.isRedacted()) { return; } + if (newEvent.isBeingDecrypted()) { + throw new Error("Trying to replace event when " + + "new content hasn't been decrypted yet"); + } const oldContent = this.getContent(); const newContent = newEvent.getContent()["m.new_content"]; // need to always replace m.relates_to with the old one, diff --git a/src/models/room.js b/src/models/room.js index 3ea9b2a2f..471967549 100644 --- a/src/models/room.js +++ b/src/models/room.js @@ -1038,8 +1038,16 @@ Room.prototype._addLiveEvent = function(event, duplicateStrategy) { const replacedId = relatesTo && relatesTo.event_id; const replacedEvent = this.getUnfilteredTimelineSet().findEventById(replacedId); if (replacedEvent) { - replacedEvent.makeReplaced(event); - this.emit("Room.replaceEvent", replacedEvent, this); + const doAndEmitReplacement = () => { + replacedEvent.makeReplaced(event); + this.emit("Room.replaceEvent", replacedEvent, this); + }; + + if (event.isBeingDecrypted()) { + event.once("Event.decrypted", doAndEmitReplacement); + } else { + doAndEmitReplacement(); + } } }