mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-23 14:53:10 -06:00
Handle overwriting same event type and state key
This commit is contained in:
parent
bc5db48f2c
commit
bacf54cd5e
|
|
@ -47,7 +47,7 @@ func SendEventWithState(
|
||||||
ctx context.Context, rsAPI RoomserverInternalAPI, state *gomatrixserverlib.RespState,
|
ctx context.Context, rsAPI RoomserverInternalAPI, state *gomatrixserverlib.RespState,
|
||||||
event gomatrixserverlib.HeaderedEvent, haveEventIDs map[string]bool,
|
event gomatrixserverlib.HeaderedEvent, haveEventIDs map[string]bool,
|
||||||
) error {
|
) error {
|
||||||
outliers, err := state.Events()
|
stateEvents, err := state.Events()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -55,18 +55,34 @@ func SendEventWithState(
|
||||||
var ires []InputRoomEvent
|
var ires []InputRoomEvent
|
||||||
var stateIDs []string
|
var stateIDs []string
|
||||||
|
|
||||||
for _, outlier := range outliers {
|
for _, stateEvent := range stateEvents {
|
||||||
if haveEventIDs[outlier.EventID()] {
|
if stateEvent.StateKey() == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if haveEventIDs[stateEvent.EventID()] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if stateEvent.Type() == event.Type() && *stateEvent.StateKey() == *event.StateKey() {
|
||||||
|
// If this event is an old state event that will be replaced by the
|
||||||
|
// given event, then store it as an outlier instead. We don't want
|
||||||
|
// to include it in the current room state as we will end up violating
|
||||||
|
// unique constraints in the state block, but we need the event to
|
||||||
|
// be stored as it may be referred to as an auth_event or prev_event.
|
||||||
|
ires = append(ires, InputRoomEvent{
|
||||||
|
Kind: KindOutlier,
|
||||||
|
Event: stateEvent.Headered(event.RoomVersion),
|
||||||
|
AuthEventIDs: stateEvent.AuthEventIDs(),
|
||||||
|
})
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ires = append(ires, InputRoomEvent{
|
ires = append(ires, InputRoomEvent{
|
||||||
Kind: KindNew,
|
Kind: KindNew,
|
||||||
Event: outlier.Headered(event.RoomVersion),
|
Event: stateEvent.Headered(event.RoomVersion),
|
||||||
AuthEventIDs: outlier.AuthEventIDs(),
|
AuthEventIDs: stateEvent.AuthEventIDs(),
|
||||||
HasState: true,
|
HasState: true,
|
||||||
StateEventIDs: stateIDs,
|
StateEventIDs: stateIDs,
|
||||||
})
|
})
|
||||||
stateIDs = append(stateIDs, outlier.EventID())
|
stateIDs = append(stateIDs, stateEvent.EventID())
|
||||||
}
|
}
|
||||||
|
|
||||||
ires = append(ires, InputRoomEvent{
|
ires = append(ires, InputRoomEvent{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue