Support redaction changes in remoteEntries

This commit is contained in:
RMidhunSuresh 2021-12-08 17:14:17 +05:30
parent c690de9f7b
commit ea89c272b9
2 changed files with 18 additions and 0 deletions

View file

@ -209,6 +209,8 @@ export class Timeline {
// used in replaceEntries // used in replaceEntries
static _entryUpdater(existingEntry, entry) { static _entryUpdater(existingEntry, entry) {
// ensure dependents point to the new entry instead of existingEntry
existingEntry.dependents?.forEach(event => event.setContextEntry(entry));
entry.updateFrom(existingEntry); entry.updateFrom(existingEntry);
return entry; return entry;
} }
@ -220,6 +222,8 @@ export class Timeline {
for (const entry of entries) { for (const entry of entries) {
try { try {
this._remoteEntries.getAndUpdate(entry, Timeline._entryUpdater); this._remoteEntries.getAndUpdate(entry, Timeline._entryUpdater);
// Since this entry changed, all dependent entries should be updated
entry.dependents?.forEach(e => this._findAndUpdateRelatedEntry(null, e.id, () => true));
} catch (err) { } catch (err) {
if (err.name === "CompareError") { if (err.name === "CompareError") {
// see FragmentIdComparer, if the replacing entry is on a fragment // see FragmentIdComparer, if the replacing entry is on a fragment
@ -251,6 +255,7 @@ export class Timeline {
let contextEvent; let contextEvent;
// find in remote events // find in remote events
contextEvent = this.getByEventId(id); contextEvent = this.getByEventId(id);
contextEvent?.addDependent(entry);
// find in storage // find in storage
if (!contextEvent) { if (!contextEvent) {
contextEvent = await this._fetchEventFromStorage(id); contextEvent = await this._fetchEventFromStorage(id);

View file

@ -25,6 +25,7 @@ export class EventEntry extends BaseEventEntry {
this._decryptionError = null; this._decryptionError = null;
this._decryptionResult = null; this._decryptionResult = null;
this._contextEntry = null; this._contextEntry = null;
this._dependents = null;
} }
clone() { clone() {
@ -40,12 +41,24 @@ export class EventEntry extends BaseEventEntry {
if (other._decryptionError && !this._decryptionError) { if (other._decryptionError && !this._decryptionError) {
this._decryptionError = other._decryptionError; this._decryptionError = other._decryptionError;
} }
this._dependents = other._dependents;
} }
setContextEntry(entry) { setContextEntry(entry) {
this._contextEntry = entry; this._contextEntry = entry;
} }
addDependent(entry) {
if (!this._dependents) {
this._dependents = [];
}
this._dependents.push(entry);
}
get dependents() {
return this._dependents;
}
get event() { get event() {
return this._eventEntry.event; return this._eventEntry.event;
} }