mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-16 19:33:09 -06:00
Perform state resolution at send_join
This commit is contained in:
parent
fa928be0b8
commit
99612358a2
|
|
@ -186,6 +186,7 @@ func SendJoin(
|
|||
PrevEventIDs: event.PrevEventIDs(),
|
||||
AuthEventIDs: event.AuthEventIDs(),
|
||||
RoomID: roomID,
|
||||
ResolveState: true,
|
||||
}, &stateAndAuthChainResponse)
|
||||
if err != nil {
|
||||
util.GetLogger(httpReq.Context()).WithError(err).Error("query.QueryStateAndAuthChain failed")
|
||||
|
|
|
|||
|
|
@ -203,6 +203,8 @@ type QueryStateAndAuthChainRequest struct {
|
|||
PrevEventIDs []string `json:"prev_event_ids"`
|
||||
// The list of auth events for the event. Used to calculate the auth chain
|
||||
AuthEventIDs []string `json:"auth_event_ids"`
|
||||
// Should state resolution be ran on the result events?
|
||||
ResolveState bool `json:"resolve_state"`
|
||||
}
|
||||
|
||||
// QueryStateAndAuthChainResponse is a response to QueryStateAndAuthChain
|
||||
|
|
|
|||
|
|
@ -736,6 +736,14 @@ func (r *RoomserverQueryAPI) QueryStateAndAuthChain(
|
|||
return err
|
||||
}
|
||||
|
||||
if request.ResolveState {
|
||||
if stateEvents, err = state.ResolveConflictsAdhoc(
|
||||
roomVersion, stateEvents, authEvents,
|
||||
); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
for _, event := range stateEvents {
|
||||
response.StateEvents = append(response.StateEvents, event.Headered(roomVersion))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -681,6 +681,53 @@ func (v StateResolution) calculateStateAfterManyEvents(
|
|||
return
|
||||
}
|
||||
|
||||
func ResolveConflictsAdhoc(
|
||||
version gomatrixserverlib.RoomVersion,
|
||||
events []gomatrixserverlib.Event,
|
||||
authEvents []gomatrixserverlib.Event,
|
||||
) ([]gomatrixserverlib.Event, error) {
|
||||
type stateKeyTuple struct {
|
||||
Type string
|
||||
StateKey *string
|
||||
}
|
||||
|
||||
eventMap := make(map[stateKeyTuple][]gomatrixserverlib.Event)
|
||||
var conflicted, notConflicted, resolved []gomatrixserverlib.Event
|
||||
|
||||
for _, event := range events {
|
||||
tuple := stateKeyTuple{event.Type(), event.StateKey()}
|
||||
if _, ok := eventMap[tuple]; ok {
|
||||
eventMap[tuple] = append(eventMap[tuple], event)
|
||||
} else {
|
||||
eventMap[tuple] = []gomatrixserverlib.Event{event}
|
||||
}
|
||||
}
|
||||
|
||||
for _, list := range eventMap {
|
||||
if len(list) > 1 {
|
||||
conflicted = append(conflicted, list...)
|
||||
} else {
|
||||
notConflicted = append(notConflicted, list...)
|
||||
}
|
||||
}
|
||||
|
||||
stateResAlgo, err := version.StateResAlgorithm()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
switch stateResAlgo {
|
||||
case gomatrixserverlib.StateResV1:
|
||||
resolved = gomatrixserverlib.ResolveStateConflicts(conflicted, authEvents)
|
||||
resolved = append(resolved, notConflicted...)
|
||||
case gomatrixserverlib.StateResV2:
|
||||
resolved = gomatrixserverlib.ResolveStateConflictsV2(conflicted, notConflicted, authEvents, authEvents)
|
||||
default:
|
||||
return nil, errors.New("unsupported state resolution algorithm")
|
||||
}
|
||||
|
||||
return resolved, nil
|
||||
}
|
||||
|
||||
func (v StateResolution) resolveConflicts(
|
||||
ctx context.Context, version gomatrixserverlib.RoomVersion,
|
||||
notConflicted, conflicted []types.StateEntry,
|
||||
|
|
|
|||
Loading…
Reference in a new issue