aboutsummaryrefslogtreecommitdiff
path: root/roomserver/internal/query/query.go
diff options
context:
space:
mode:
Diffstat (limited to 'roomserver/internal/query/query.go')
-rw-r--r--roomserver/internal/query/query.go35
1 files changed, 31 insertions, 4 deletions
diff --git a/roomserver/internal/query/query.go b/roomserver/internal/query/query.go
index 81051150..ecfb580f 100644
--- a/roomserver/internal/query/query.go
+++ b/roomserver/internal/query/query.go
@@ -49,6 +49,7 @@ func (r *Queryer) QueryLatestEventsAndState(
}
// QueryStateAfterEvents implements api.RoomserverInternalAPI
+// nolint:gocyclo
func (r *Queryer) QueryStateAfterEvents(
ctx context.Context,
request *api.QueryStateAfterEventsRequest,
@@ -78,10 +79,18 @@ func (r *Queryer) QueryStateAfterEvents(
}
response.PrevEventsExist = true
- // Look up the currrent state for the requested tuples.
- stateEntries, err := roomState.LoadStateAfterEventsForStringTuples(
- ctx, prevStates, request.StateToFetch,
- )
+ var stateEntries []types.StateEntry
+ if len(request.StateToFetch) == 0 {
+ // Look up all of the current room state.
+ stateEntries, err = roomState.LoadCombinedStateAfterEvents(
+ ctx, prevStates,
+ )
+ } else {
+ // Look up the current state for the requested tuples.
+ stateEntries, err = roomState.LoadStateAfterEventsForStringTuples(
+ ctx, prevStates, request.StateToFetch,
+ )
+ }
if err != nil {
return err
}
@@ -91,6 +100,24 @@ func (r *Queryer) QueryStateAfterEvents(
return err
}
+ if len(request.PrevEventIDs) > 1 && len(request.StateToFetch) == 0 {
+ var authEventIDs []string
+ for _, e := range stateEvents {
+ authEventIDs = append(authEventIDs, e.AuthEventIDs()...)
+ }
+ authEventIDs = util.UniqueStrings(authEventIDs)
+
+ authEvents, err := getAuthChain(ctx, r.DB.EventsFromIDs, authEventIDs)
+ if err != nil {
+ return fmt.Errorf("getAuthChain: %w", err)
+ }
+
+ stateEvents, err = state.ResolveConflictsAdhoc(info.RoomVersion, stateEvents, authEvents)
+ if err != nil {
+ return fmt.Errorf("state.ResolveConflictsAdhoc: %w", err)
+ }
+ }
+
for _, event := range stateEvents {
response.StateEvents = append(response.StateEvents, event.Headered(info.RoomVersion))
}