message: Decrypt events ahead of storing them in the index
diff: @@ -38,7 +38,6 @@ export default class EventIndex extends EventEmitter {
  this._eventsPerCrawl = 100;
  this._crawler = null;
  this._currentCheckpoint = null;
  - this.liveEventsForIndex = new Set();
  }
  async init() {
  @@ -188,16 +187,11 @@ export default class EventIndex extends EventEmitter {
  return;
  }
  - // If the event is not yet decrypted mark it for the
  - // Event.decrypted callback.
  if (ev.isBeingDecrypted()) {
  - const eventId = ev.getId();
  - this.liveEventsForIndex.add(eventId);
  - } else {
  - // If the event is decrypted or is unencrypted add it to the
  - // index now.
  - await this.addLiveEventToIndex(ev);
  + await ev._decryptionPromise;
  }
  +
  + await this.addLiveEventToIndex(ev);
  }
  onRoomStateEvent = async (ev, state) => {
  @@ -219,7 +213,6 @@ export default class EventIndex extends EventEmitter {
  const eventId = ev.getId();
  // If the event isn't in our live event set, ignore it.
  - if (!this.liveEventsForIndex.delete(eventId)) return;
  if (err) return;
  await this.addLiveEventToIndex(ev);
  }
  @@ -523,16 +516,16 @@ export default class EventIndex extends EventEmitter {
  }
  });
  - const decryptionPromises = [];
  -
  - matrixEvents.forEach(ev => {
  - if (ev.isBeingDecrypted() || ev.isDecryptionFailure()) {
  - // TODO the decryption promise is a private property, this
  - // should either be made public or we should convert the
  - // event that gets fired when decryption is done into a
  - // promise using the once event emitter method:
  - // https://nodejs.org/api/events.html#events_events_once_emitter_name
  - decryptionPromises.push(ev._decryptionPromise);
  + const decryptionPromises = matrixEvents
  + .filter(event => event.isEncrypted())
  + .map(event => {
  + if (event.shouldAttemptDecryption()) {
  + return event.attemptDecryption(client._crypto, {
  + isRetry: true,
  + emit: false,
  + });
  + } else {
  + return event._decryptionPromise;
  }
  });
  