From cd515f1922988dc79c7cbe88914393d6f9cfd016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 12 Mar 2020 11:42:02 +0100 Subject: [PATCH 1/3] EventIndex: Add support to delete events from the index. --- src/indexing/BaseEventIndexManager.js | 4 ++++ src/indexing/EventIndex.js | 31 ++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/indexing/BaseEventIndexManager.js b/src/indexing/BaseEventIndexManager.js index 66904f9264..f780c8e9ce 100644 --- a/src/indexing/BaseEventIndexManager.js +++ b/src/indexing/BaseEventIndexManager.js @@ -123,6 +123,10 @@ export default class BaseEventIndexManager { throw new Error("Unimplemented"); } + async deleteEvent(eventId: string): Promise { + throw new Error("Unimplemented"); + } + /** * Check if our event index is empty. */ diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index c8a9a4c1fa..128b4bb42d 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -61,6 +61,7 @@ export default class EventIndex extends EventEmitter { client.on('Room.timeline', this.onRoomTimeline); client.on('Event.decrypted', this.onEventDecrypted); client.on('Room.timelineReset', this.onTimelineReset); + client.on('Room.redaction', this.onRedaction); } /** @@ -74,6 +75,7 @@ export default class EventIndex extends EventEmitter { client.removeListener('Room.timeline', this.onRoomTimeline); client.removeListener('Event.decrypted', this.onEventDecrypted); client.removeListener('Room.timelineReset', this.onTimelineReset); + client.removeListener('Room.redaction', this.onRedaction); } /** @@ -210,6 +212,23 @@ export default class EventIndex extends EventEmitter { await this.addLiveEventToIndex(ev); } + /* + * The Room.redaction listener. + * + * Removes a redacted event from our event index. + */ + onRedaction = async (ev, room) => { + // We only index encrypted rooms locally. + if (!MatrixClientPeg.get().isRoomEncrypted(room.roomId)) return; + const indexManager = PlatformPeg.get().getEventIndexingManager(); + + try { + await indexManager.deleteEvent(ev.getAssociatedId()); + } catch (e) { + console.log("EventIndex: Error deleting event from index", e); + } + } + /* * The Room.timelineReset listener. * @@ -431,12 +450,17 @@ export default class EventIndex extends EventEmitter { // Let us wait for all the events to get decrypted. await Promise.all(decryptionPromises); - // TODO if there are no events at this point we're missing a lot // decryption keys, do we want to retry this checkpoint at a later // stage? const filteredEvents = matrixEvents.filter(this.isValidEvent); + // Collect the redaction events so we can delete the redacted events + // from the index. + const redactionEvents = matrixEvents.filter((ev) => { + return ev.getType() === "m.room.redaction"; + }); + // Let us convert the events back into a format that EventIndex can // consume. const events = filteredEvents.map((ev) => { @@ -468,6 +492,11 @@ export default class EventIndex extends EventEmitter { ); try { + for (var i = 0; i < redactionEvents.length; i++) { + let ev = redactionEvents[i]; + await indexManager.deleteEvent(ev.getAssociatedId()); + } + const eventsAlreadyAdded = await indexManager.addHistoricEvents( events, newCheckpoint, checkpoint); // If all events were already indexed we assume that we catched From c02e839e9dba2390e1a2cf776c244031fb570c31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 12 Mar 2020 12:15:46 +0100 Subject: [PATCH 2/3] EventIndex: Use a const instead of a let binding. --- src/indexing/EventIndex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 128b4bb42d..245427d425 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -493,7 +493,7 @@ export default class EventIndex extends EventEmitter { try { for (var i = 0; i < redactionEvents.length; i++) { - let ev = redactionEvents[i]; + const ev = redactionEvents[i]; await indexManager.deleteEvent(ev.getAssociatedId()); } From 25568fa15cc9ddf899f5265cf433d3263a8b24fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 12 Mar 2020 12:20:46 +0100 Subject: [PATCH 3/3] EventIndex: More lint fixes. --- src/indexing/EventIndex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 245427d425..a4a9302601 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -492,7 +492,7 @@ export default class EventIndex extends EventEmitter { ); try { - for (var i = 0; i < redactionEvents.length; i++) { + for (let i = 0; i < redactionEvents.length; i++) { const ev = redactionEvents[i]; await indexManager.deleteEvent(ev.getAssociatedId()); }