aboutsummaryrefslogtreecommitdiff
path: root/roomserver
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-03-16 17:29:52 +0000
committerGitHub <noreply@github.com>2020-03-16 17:29:52 +0000
commitacb505b71751f637531ba9113d4b4daae589bcbc (patch)
tree06bf9ff06794d9f04bbc637e2feac69c1500d2ee /roomserver
parent452f393dd7de5203c5cd3ebe5697af6ea0f4b009 (diff)
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
Diffstat (limited to 'roomserver')
-rw-r--r--roomserver/alias/alias.go2
-rw-r--r--roomserver/api/query.go14
-rw-r--r--roomserver/query/query.go110
3 files changed, 110 insertions, 16 deletions
diff --git a/roomserver/alias/alias.go b/roomserver/alias/alias.go
index aeaf5ae9..59da35b3 100644
--- a/roomserver/alias/alias.go
+++ b/roomserver/alias/alias.go
@@ -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
}
diff --git a/roomserver/api/query.go b/roomserver/api/query.go
index e1850e72..24cca03e 100644
--- a/roomserver/api/query.go
+++ b/roomserver/api/query.go
@@ -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
diff --git a/roomserver/query/query.go b/roomserver/query/query.go
index 83f89777..7f69699f 100644
--- a/roomserver/query/query.go
+++ b/roomserver/query/query.go
@@ -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
}