process state events in the timeline together with other timeline events

so member info gets overwritten after all the previous events
have already been written
This commit is contained in:
Bruno Windels 2020-08-20 09:39:19 +02:00
parent fe7cc08287
commit ba3a4ab8b2

View file

@ -118,7 +118,7 @@ export class SyncWriter {
_writeStateEvents(roomResponse, txn) { _writeStateEvents(roomResponse, txn) {
const changedMembers = []; const changedMembers = [];
// persist state // persist state
const {state, timeline} = roomResponse; const {state} = roomResponse;
if (state.events) { if (state.events) {
for (const event of state.events) { for (const event of state.events) {
const member = this._writeStateEvent(event, txn); const member = this._writeStateEvent(event, txn);
@ -127,31 +127,29 @@ export class SyncWriter {
} }
} }
} }
// persist live state events in timeline return changedMembers;
}
_writeTimeline(entries, timeline, currentKey, txn) {
const changedMembers = [];
if (timeline.events) { if (timeline.events) {
for (const event of timeline.events) { const events = deduplicateEvents(timeline.events);
for(const event of events) {
// process live state events first, so new member info is available
if (typeof event.state_key === "string") { if (typeof event.state_key === "string") {
const member = this._writeStateEvent(event, txn); const member = this._writeStateEvent(event, txn);
if (member) { if (member) {
changedMembers.push(member); changedMembers.push(member);
} }
} }
} // store event in timeline
}
return changedMembers;
}
_writeTimeline(entries, timeline, currentKey, txn) {
if (timeline.events) {
const events = deduplicateEvents(timeline.events);
for(const event of events) {
currentKey = currentKey.nextKey(); currentKey = currentKey.nextKey();
const entry = createEventEntry(currentKey, this._roomId, event); const entry = createEventEntry(currentKey, this._roomId, event);
txn.timelineEvents.insert(entry); txn.timelineEvents.insert(entry);
entries.push(new EventEntry(entry, this._fragmentIdComparer)); entries.push(new EventEntry(entry, this._fragmentIdComparer));
} }
} }
return currentKey; return {currentKey, changedMembers};
} }
async writeSync(roomResponse, txn) { async writeSync(roomResponse, txn) {
@ -177,8 +175,9 @@ export class SyncWriter {
// important this happens before _writeTimeline so // important this happens before _writeTimeline so
// members are available in the transaction // members are available in the transaction
const changedMembers = this._writeStateEvents(roomResponse, txn); const changedMembers = this._writeStateEvents(roomResponse, txn);
const timelineResult = this._writeTimeline(entries, timeline, currentKey, txn);
currentKey = this._writeTimeline(entries, timeline, currentKey, txn); currentKey = timelineResult.currentKey;
changedMembers.push(...timelineResult.changedMembers);
return {entries, newLiveKey: currentKey, changedMembers}; return {entries, newLiveKey: currentKey, changedMembers};
} }