mirror of
https://github.com/hoernschen/dendrite.git
synced 2025-07-29 04:32:47 +00:00
Implement gomatrixserverlib.HeaderedEvent in roomserver query API (#912)
* Implement gomatrixserverlib.HeaderedEvent, which should allow us to store room version headers along with the event across API boundaries and consumers/producers, and intercept unmarshalling to get the event structure right * Add federationsender to previous
This commit is contained in:
parent
452f393dd7
commit
acb505b717
21 changed files with 163 additions and 36 deletions
|
@ -229,7 +229,7 @@ func (r *RoomserverAliasAPI) sendUpdatedAliasesEvent(
|
|||
// Add auth events
|
||||
authEvents := gomatrixserverlib.NewAuthEvents(nil)
|
||||
for i := range res.StateEvents {
|
||||
err = authEvents.AddEvent(&res.StateEvents[i])
|
||||
err = authEvents.AddEvent(&res.StateEvents[i].Event)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ type QueryLatestEventsAndStateResponse struct {
|
|||
// This list will be in an arbitrary order.
|
||||
// These are used to set the auth_events when sending an event.
|
||||
// These are used to check whether the event is allowed.
|
||||
StateEvents []gomatrixserverlib.Event `json:"state_events"`
|
||||
StateEvents []gomatrixserverlib.HeaderedEvent `json:"state_events"`
|
||||
// The depth of the latest events.
|
||||
// This is one greater than the maximum depth of the latest events.
|
||||
// This is used to set the depth when sending an event.
|
||||
|
@ -79,7 +79,7 @@ type QueryStateAfterEventsResponse struct {
|
|||
PrevEventsExist bool `json:"prev_events_exist"`
|
||||
// The state events requested.
|
||||
// This list will be in an arbitrary order.
|
||||
StateEvents []gomatrixserverlib.Event `json:"state_events"`
|
||||
StateEvents []gomatrixserverlib.HeaderedEvent `json:"state_events"`
|
||||
}
|
||||
|
||||
// QueryEventsByIDRequest is a request to QueryEventsByID
|
||||
|
@ -99,7 +99,7 @@ type QueryEventsByIDResponse struct {
|
|||
// fails to read it from the database then it will fail
|
||||
// the entire request.
|
||||
// This list will be in an arbitrary order.
|
||||
Events []gomatrixserverlib.Event `json:"events"`
|
||||
Events []gomatrixserverlib.HeaderedEvent `json:"events"`
|
||||
}
|
||||
|
||||
// QueryMembershipForUserRequest is a request to QueryMembership
|
||||
|
@ -186,7 +186,7 @@ type QueryMissingEventsRequest struct {
|
|||
// QueryMissingEventsResponse is a response to QueryMissingEvents
|
||||
type QueryMissingEventsResponse struct {
|
||||
// Missing events, arbritrary order.
|
||||
Events []gomatrixserverlib.Event `json:"events"`
|
||||
Events []gomatrixserverlib.HeaderedEvent `json:"events"`
|
||||
}
|
||||
|
||||
// QueryStateAndAuthChainRequest is a request to QueryStateAndAuthChain
|
||||
|
@ -212,8 +212,8 @@ type QueryStateAndAuthChainResponse struct {
|
|||
PrevEventsExist bool `json:"prev_events_exist"`
|
||||
// The state and auth chain events that were requested.
|
||||
// The lists will be in an arbitrary order.
|
||||
StateEvents []gomatrixserverlib.Event `json:"state_events"`
|
||||
AuthChainEvents []gomatrixserverlib.Event `json:"auth_chain_events"`
|
||||
StateEvents []gomatrixserverlib.HeaderedEvent `json:"state_events"`
|
||||
AuthChainEvents []gomatrixserverlib.HeaderedEvent `json:"auth_chain_events"`
|
||||
}
|
||||
|
||||
// QueryBackfillRequest is a request to QueryBackfill.
|
||||
|
@ -229,7 +229,7 @@ type QueryBackfillRequest struct {
|
|||
// QueryBackfillResponse is a response to QueryBackfill.
|
||||
type QueryBackfillResponse struct {
|
||||
// Missing events, arbritrary order.
|
||||
Events []gomatrixserverlib.Event `json:"events"`
|
||||
Events []gomatrixserverlib.HeaderedEvent `json:"events"`
|
||||
}
|
||||
|
||||
// QueryServersInRoomAtEventRequest is a request to QueryServersInRoomAtEvent
|
||||
|
|
|
@ -89,6 +89,10 @@ type RoomserverQueryAPIDatabase interface {
|
|||
EventStateKeys(
|
||||
context.Context, []types.EventStateKeyNID,
|
||||
) (map[types.EventStateKeyNID]string, error)
|
||||
// Look up the room version for a given room.
|
||||
GetRoomVersionForRoom(
|
||||
ctx context.Context, roomNID types.RoomNID,
|
||||
) (gomatrixserverlib.RoomVersion, error)
|
||||
}
|
||||
|
||||
// RoomserverQueryAPI is an implementation of api.RoomserverQueryAPI
|
||||
|
@ -116,6 +120,12 @@ func (r *RoomserverQueryAPI) QueryLatestEventsAndState(
|
|||
return nil
|
||||
}
|
||||
response.RoomExists = true
|
||||
|
||||
roomVersion, err := r.DB.GetRoomVersionForRoom(ctx, roomNID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var currentStateSnapshotNID types.StateSnapshotNID
|
||||
response.LatestEvents, currentStateSnapshotNID, response.Depth, err =
|
||||
r.DB.LatestEventIDs(ctx, roomNID)
|
||||
|
@ -136,7 +146,15 @@ func (r *RoomserverQueryAPI) QueryLatestEventsAndState(
|
|||
return err
|
||||
}
|
||||
|
||||
response.StateEvents = stateEvents
|
||||
for _, event := range stateEvents {
|
||||
response.StateEvents = append(response.StateEvents, gomatrixserverlib.HeaderedEvent{
|
||||
EventHeader: gomatrixserverlib.EventHeader{
|
||||
RoomVersion: roomVersion,
|
||||
},
|
||||
Event: event,
|
||||
})
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -161,6 +179,11 @@ func (r *RoomserverQueryAPI) QueryStateAfterEvents(
|
|||
}
|
||||
response.RoomExists = true
|
||||
|
||||
roomVersion, err := r.DB.GetRoomVersionForRoom(ctx, roomNID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
prevStates, err := r.DB.StateAtEventIDs(ctx, request.PrevEventIDs)
|
||||
if err != nil {
|
||||
switch err.(type) {
|
||||
|
@ -185,7 +208,15 @@ func (r *RoomserverQueryAPI) QueryStateAfterEvents(
|
|||
return err
|
||||
}
|
||||
|
||||
response.StateEvents = stateEvents
|
||||
for _, event := range stateEvents {
|
||||
response.StateEvents = append(response.StateEvents, gomatrixserverlib.HeaderedEvent{
|
||||
EventHeader: gomatrixserverlib.EventHeader{
|
||||
RoomVersion: roomVersion,
|
||||
},
|
||||
Event: event,
|
||||
})
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -212,7 +243,18 @@ func (r *RoomserverQueryAPI) QueryEventsByID(
|
|||
return err
|
||||
}
|
||||
|
||||
response.Events = events
|
||||
for _, event := range events {
|
||||
// TODO: Room version here
|
||||
roomVersion := gomatrixserverlib.RoomVersionV1
|
||||
|
||||
response.Events = append(response.Events, gomatrixserverlib.HeaderedEvent{
|
||||
EventHeader: gomatrixserverlib.EventHeader{
|
||||
RoomVersion: roomVersion,
|
||||
},
|
||||
Event: event,
|
||||
})
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -486,10 +528,18 @@ func (r *RoomserverQueryAPI) QueryMissingEvents(
|
|||
return err
|
||||
}
|
||||
|
||||
response.Events = make([]gomatrixserverlib.Event, 0, len(loadedEvents)-len(eventsToFilter))
|
||||
response.Events = make([]gomatrixserverlib.HeaderedEvent, 0, len(loadedEvents)-len(eventsToFilter))
|
||||
for _, event := range loadedEvents {
|
||||
if !eventsToFilter[event.EventID()] {
|
||||
response.Events = append(response.Events, event)
|
||||
// TODO: Room version here
|
||||
roomVersion := gomatrixserverlib.RoomVersionV1
|
||||
|
||||
response.Events = append(response.Events, gomatrixserverlib.HeaderedEvent{
|
||||
EventHeader: gomatrixserverlib.EventHeader{
|
||||
RoomVersion: roomVersion,
|
||||
},
|
||||
Event: event,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -525,7 +575,24 @@ func (r *RoomserverQueryAPI) QueryBackfill(
|
|||
}
|
||||
|
||||
// Retrieve events from the list that was filled previously.
|
||||
response.Events, err = r.loadEvents(ctx, resultNIDs)
|
||||
var loadedEvents []gomatrixserverlib.Event
|
||||
loadedEvents, err = r.loadEvents(ctx, resultNIDs)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, event := range loadedEvents {
|
||||
// TODO: Room version here
|
||||
roomVersion := gomatrixserverlib.RoomVersionV1
|
||||
|
||||
response.Events = append(response.Events, gomatrixserverlib.HeaderedEvent{
|
||||
EventHeader: gomatrixserverlib.EventHeader{
|
||||
RoomVersion: roomVersion,
|
||||
},
|
||||
Event: event,
|
||||
})
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -635,8 +702,35 @@ func (r *RoomserverQueryAPI) QueryStateAndAuthChain(
|
|||
return err
|
||||
}
|
||||
|
||||
response.StateEvents = stateEvents
|
||||
response.AuthChainEvents, err = getAuthChain(ctx, r.DB, request.AuthEventIDs)
|
||||
authEvents, err := getAuthChain(ctx, r.DB, request.AuthEventIDs)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, event := range stateEvents {
|
||||
// TODO: Room version here
|
||||
roomVersion := gomatrixserverlib.RoomVersionV1
|
||||
|
||||
response.StateEvents = append(response.StateEvents, gomatrixserverlib.HeaderedEvent{
|
||||
EventHeader: gomatrixserverlib.EventHeader{
|
||||
RoomVersion: roomVersion,
|
||||
},
|
||||
Event: event,
|
||||
})
|
||||
}
|
||||
|
||||
for _, event := range authEvents {
|
||||
// TODO: Room version here
|
||||
roomVersion := gomatrixserverlib.RoomVersionV1
|
||||
|
||||
response.AuthChainEvents = append(response.AuthChainEvents, gomatrixserverlib.HeaderedEvent{
|
||||
EventHeader: gomatrixserverlib.EventHeader{
|
||||
RoomVersion: roomVersion,
|
||||
},
|
||||
Event: event,
|
||||
})
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue