diff options
author | Neil Alexander <neilalexander@users.noreply.github.com> | 2020-10-05 17:47:08 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-05 17:47:08 +0100 |
commit | 2e71d2708f7c922dcb6361c8a49022470b8b6e33 (patch) | |
tree | 7b8241f2bd45f18fc2eee8efd1cb6561553e0601 /roomserver/internal/input | |
parent | 4e6b7f726d6741e0faa77ad0c8ba373ea58ef3f8 (diff) |
Resolve state after event against current room state when determining latest state changes (#1479)
* Resolve state after event against current room state when determining latest state changes
* Update sytest-whitelist
* Update sytest-whitelist, blacklist
Diffstat (limited to 'roomserver/internal/input')
-rw-r--r-- | roomserver/internal/input/input_latest_events.go | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/roomserver/internal/input/input_latest_events.go b/roomserver/internal/input/input_latest_events.go index 5c2a1de6..2e9f3b4e 100644 --- a/roomserver/internal/input/input_latest_events.go +++ b/roomserver/internal/input/input_latest_events.go @@ -215,10 +215,27 @@ func (u *latestEventsUpdater) latestState() error { var err error roomState := state.NewStateResolution(u.api.DB, *u.roomInfo) - // Get a list of the current latest events. - latestStateAtEvents := make([]types.StateAtEvent, len(u.latest)) + // Get a list of the current room state events if available. + var currentState []types.StateEntry + if u.roomInfo.StateSnapshotNID != 0 { + currentState, _ = roomState.LoadStateAtSnapshot(u.ctx, u.roomInfo.StateSnapshotNID) + } + + // Get a list of the current latest events. This will include both + // the current room state and the latest events after the input event. + // The idea is that we will perform state resolution on this set and + // any conflicting events will be resolved properly. + latestStateAtEvents := make([]types.StateAtEvent, len(u.latest)+len(currentState)) + offset := 0 + for i := range currentState { + latestStateAtEvents[i] = types.StateAtEvent{ + BeforeStateSnapshotNID: u.roomInfo.StateSnapshotNID, + StateEntry: currentState[i], + } + offset++ + } for i := range u.latest { - latestStateAtEvents[i] = u.latest[i].StateAtEvent + latestStateAtEvents[offset+i] = u.latest[i].StateAtEvent } // Takes the NIDs of the latest events and creates a state snapshot |