Don't copy events so much

This commit is contained in:
Neil Alexander 2020-03-31 12:48:30 +01:00
parent 664f31ec98
commit b58af7180c
55 changed files with 218 additions and 186 deletions

View file

@ -181,7 +181,7 @@ func createTransaction(
} }
} }
var ev []gomatrixserverlib.Event var ev []*gomatrixserverlib.Event
for _, e := range events { for _, e := range events {
ev = append(ev, e.Event) ev = append(ev, e.Event)
} }

View file

@ -31,7 +31,7 @@ type Database interface {
SetDisplayName(ctx context.Context, localpart string, displayName string) error SetDisplayName(ctx context.Context, localpart string, displayName string) error
CreateAccount(ctx context.Context, localpart, plaintextPassword, appserviceID string) (*authtypes.Account, error) CreateAccount(ctx context.Context, localpart, plaintextPassword, appserviceID string) (*authtypes.Account, error)
CreateGuestAccount(ctx context.Context) (*authtypes.Account, error) CreateGuestAccount(ctx context.Context) (*authtypes.Account, error)
UpdateMemberships(ctx context.Context, eventsToAdd []gomatrixserverlib.Event, idsToRemove []string) error UpdateMemberships(ctx context.Context, eventsToAdd []*gomatrixserverlib.Event, idsToRemove []string) error
GetMembershipInRoomByLocalpart(ctx context.Context, localpart, roomID string) (authtypes.Membership, error) GetMembershipInRoomByLocalpart(ctx context.Context, localpart, roomID string) (authtypes.Membership, error)
GetRoomIDsByLocalPart(ctx context.Context, localpart string) ([]string, error) GetRoomIDsByLocalPart(ctx context.Context, localpart string) ([]string, error)
GetMembershipsByLocalpart(ctx context.Context, localpart string) (memberships []authtypes.Membership, err error) GetMembershipsByLocalpart(ctx context.Context, localpart string) (memberships []authtypes.Membership, err error)

View file

@ -207,7 +207,7 @@ func (d *Database) removeMembershipsByEventIDs(
// insertion and deletion has been successfully processed. // insertion and deletion has been successfully processed.
// Returns a SQL error if there was an issue with any part of the process // Returns a SQL error if there was an issue with any part of the process
func (d *Database) UpdateMemberships( func (d *Database) UpdateMemberships(
ctx context.Context, eventsToAdd []gomatrixserverlib.Event, idsToRemove []string, ctx context.Context, eventsToAdd []*gomatrixserverlib.Event, idsToRemove []string,
) error { ) error {
return common.WithTransaction(d.db, func(txn *sql.Tx) error { return common.WithTransaction(d.db, func(txn *sql.Tx) error {
if err := d.removeMembershipsByEventIDs(ctx, txn, idsToRemove); err != nil { if err := d.removeMembershipsByEventIDs(ctx, txn, idsToRemove); err != nil {
@ -258,7 +258,7 @@ func (d *Database) GetMembershipsByLocalpart(
// If the event isn't a valid m.room.member event with type `join`, does nothing. // If the event isn't a valid m.room.member event with type `join`, does nothing.
// If an error occurred, returns the SQL error // If an error occurred, returns the SQL error
func (d *Database) newMembership( func (d *Database) newMembership(
ctx context.Context, txn *sql.Tx, ev gomatrixserverlib.Event, ctx context.Context, txn *sql.Tx, ev *gomatrixserverlib.Event,
) error { ) error {
if ev.Type() == "m.room.member" && ev.StateKey() != nil { if ev.Type() == "m.room.member" && ev.StateKey() != nil {
localpart, serverName, err := gomatrixserverlib.SplitID('@', *ev.StateKey()) localpart, serverName, err := gomatrixserverlib.SplitID('@', *ev.StateKey())

View file

@ -216,7 +216,7 @@ func (d *Database) removeMembershipsByEventIDs(
// insertion and deletion has been successfully processed. // insertion and deletion has been successfully processed.
// Returns a SQL error if there was an issue with any part of the process // Returns a SQL error if there was an issue with any part of the process
func (d *Database) UpdateMemberships( func (d *Database) UpdateMemberships(
ctx context.Context, eventsToAdd []gomatrixserverlib.Event, idsToRemove []string, ctx context.Context, eventsToAdd []*gomatrixserverlib.Event, idsToRemove []string,
) error { ) error {
return common.WithTransaction(d.db, func(txn *sql.Tx) error { return common.WithTransaction(d.db, func(txn *sql.Tx) error {
if err := d.removeMembershipsByEventIDs(ctx, txn, idsToRemove); err != nil { if err := d.removeMembershipsByEventIDs(ctx, txn, idsToRemove); err != nil {
@ -267,7 +267,7 @@ func (d *Database) GetRoomIDsByLocalPart(
// If the event isn't a valid m.room.member event with type `join`, does nothing. // If the event isn't a valid m.room.member event with type `join`, does nothing.
// If an error occurred, returns the SQL error // If an error occurred, returns the SQL error
func (d *Database) newMembership( func (d *Database) newMembership(
ctx context.Context, txn *sql.Tx, ev gomatrixserverlib.Event, ctx context.Context, txn *sql.Tx, ev *gomatrixserverlib.Event,
) error { ) error {
if ev.Type() == "m.room.member" && ev.StateKey() != nil { if ev.Type() == "m.room.member" && ev.StateKey() != nil {
localpart, serverName, err := gomatrixserverlib.SplitID('@', *ev.StateKey()) localpart, serverName, err := gomatrixserverlib.SplitID('@', *ev.StateKey())

View file

@ -101,24 +101,24 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error {
// lookupStateEvents looks up the state events that are added by a new event. // lookupStateEvents looks up the state events that are added by a new event.
func (s *OutputRoomEventConsumer) lookupStateEvents( func (s *OutputRoomEventConsumer) lookupStateEvents(
addsStateEventIDs []string, event gomatrixserverlib.Event, addsStateEventIDs []string, event *gomatrixserverlib.Event,
) ([]gomatrixserverlib.Event, error) { ) ([]*gomatrixserverlib.Event, error) {
// Fast path if there aren't any new state events. // Fast path if there aren't any new state events.
if len(addsStateEventIDs) == 0 { if len(addsStateEventIDs) == 0 {
// If the event is a membership update (e.g. for a profile update), it won't // If the event is a membership update (e.g. for a profile update), it won't
// show up in AddsStateEventIDs, so we need to add it manually // show up in AddsStateEventIDs, so we need to add it manually
if event.Type() == "m.room.member" { if event.Type() == "m.room.member" {
return []gomatrixserverlib.Event{event}, nil return []*gomatrixserverlib.Event{event}, nil
} }
return nil, nil return nil, nil
} }
// Fast path if the only state event added is the event itself. // Fast path if the only state event added is the event itself.
if len(addsStateEventIDs) == 1 && addsStateEventIDs[0] == event.EventID() { if len(addsStateEventIDs) == 1 && addsStateEventIDs[0] == event.EventID() {
return []gomatrixserverlib.Event{event}, nil return []*gomatrixserverlib.Event{event}, nil
} }
result := []gomatrixserverlib.Event{} result := []*gomatrixserverlib.Event{}
missing := []string{} missing := []string{}
for _, id := range addsStateEventIDs { for _, id := range addsStateEventIDs {
// Append the current event in the results if its ID is in the events list // Append the current event in the results if its ID is in the events list

View file

@ -305,7 +305,7 @@ func createRoom(
return jsonerror.InternalServerError() return jsonerror.InternalServerError()
} }
if err = gomatrixserverlib.Allowed(*ev, &authEvents); err != nil { if err = gomatrixserverlib.Allowed(ev, &authEvents); err != nil {
util.GetLogger(req.Context()).WithError(err).Error("gomatrixserverlib.Allowed failed") util.GetLogger(req.Context()).WithError(err).Error("gomatrixserverlib.Allowed failed")
return jsonerror.InternalServerError() return jsonerror.InternalServerError()
} }
@ -386,5 +386,5 @@ func buildEvent(
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot build event %s : Builder failed to build. %w", builder.Type, err) return nil, fmt.Errorf("cannot build event %s : Builder failed to build. %w", builder.Type, err)
} }
return &event, nil return event, nil
} }

View file

@ -76,7 +76,7 @@ func GetEvent(
cfg: cfg, cfg: cfg,
federation: federation, federation: federation,
keyRing: keyRing, keyRing: keyRing,
requestedEvent: requestedEvent, requestedEvent: *requestedEvent,
} }
stateReq := api.QueryStateAfterEventsRequest{ stateReq := api.QueryStateAfterEventsRequest{
@ -116,7 +116,7 @@ func GetEvent(
if membership == gomatrixserverlib.Join { if membership == gomatrixserverlib.Join {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusOK, Code: http.StatusOK,
JSON: gomatrixserverlib.ToClientEvent(r.requestedEvent, gomatrixserverlib.FormatAll), JSON: gomatrixserverlib.ToClientEvent(&r.requestedEvent, gomatrixserverlib.FormatAll),
} }
} }
} }

View file

@ -311,6 +311,7 @@ func (r joinRoomReq) joinRoomUsingServer(roomID string, server gomatrixserverlib
var request api.QueryRoomVersionCapabilitiesRequest var request api.QueryRoomVersionCapabilitiesRequest
var response api.QueryRoomVersionCapabilitiesResponse var response api.QueryRoomVersionCapabilitiesResponse
if err := r.queryAPI.QueryRoomVersionCapabilities(r.req.Context(), &request, &response); err != nil { if err := r.queryAPI.QueryRoomVersionCapabilities(r.req.Context(), &request, &response); err != nil {
fmt.Println("r.queryAPI.QueryRoomVersionCapabilities:", err)
return nil, err return nil, err
} }
var supportedVersions []gomatrixserverlib.RoomVersion var supportedVersions []gomatrixserverlib.RoomVersion
@ -320,6 +321,7 @@ func (r joinRoomReq) joinRoomUsingServer(roomID string, server gomatrixserverlib
respMakeJoin, err := r.federation.MakeJoin(r.req.Context(), server, roomID, r.userID, supportedVersions) respMakeJoin, err := r.federation.MakeJoin(r.req.Context(), server, roomID, r.userID, supportedVersions)
if err != nil { if err != nil {
// TODO: Check if the user was not allowed to join the room. // TODO: Check if the user was not allowed to join the room.
fmt.Println("r.federation.MakeJoin:", err)
return nil, err return nil, err
} }
@ -327,6 +329,7 @@ func (r joinRoomReq) joinRoomUsingServer(roomID string, server gomatrixserverlib
// but it's possible that the remote server returned us something "odd" // but it's possible that the remote server returned us something "odd"
err = r.writeToBuilder(&respMakeJoin.JoinEvent, roomID) err = r.writeToBuilder(&respMakeJoin.JoinEvent, roomID)
if err != nil { if err != nil {
fmt.Println("r.writeToBuilder:", err)
return nil, err return nil, err
} }
@ -352,18 +355,22 @@ func (r joinRoomReq) joinRoomUsingServer(roomID string, server gomatrixserverlib
return &res, nil return &res, nil
} }
fmt.Println("Sending", string(event.JSON()))
respSendJoin, err := r.federation.SendJoin(r.req.Context(), server, event, respMakeJoin.RoomVersion) respSendJoin, err := r.federation.SendJoin(r.req.Context(), server, event, respMakeJoin.RoomVersion)
if err != nil { if err != nil {
fmt.Println("r.federation.SendJoin:", err)
return nil, err return nil, err
} }
if err = respSendJoin.Check(r.req.Context(), r.keyRing, event); err != nil { if err = respSendJoin.Check(r.req.Context(), r.keyRing, event); err != nil {
fmt.Println("respSendJoin.Check:", err)
return nil, err return nil, err
} }
if err = r.producer.SendEventWithState( if err = r.producer.SendEventWithState(
r.req.Context(), r.req.Context(),
gomatrixserverlib.RespState(respSendJoin.RespState), respSendJoin.ToRespState(),
event.Headered(respMakeJoin.RoomVersion), event.Headered(respMakeJoin.RoomVersion),
); err != nil { ); err != nil {
util.GetLogger(r.req.Context()).WithError(err).Error("gomatrixserverlib.RespState failed") util.GetLogger(r.req.Context()).WithError(err).Error("gomatrixserverlib.RespState failed")

View file

@ -163,10 +163,10 @@ func generateSendEvent(
// check to see if this user can perform this operation // check to see if this user can perform this operation
stateEvents := make([]*gomatrixserverlib.Event, len(queryRes.StateEvents)) stateEvents := make([]*gomatrixserverlib.Event, len(queryRes.StateEvents))
for i := range queryRes.StateEvents { for i := range queryRes.StateEvents {
stateEvents[i] = &queryRes.StateEvents[i].Event stateEvents[i] = queryRes.StateEvents[i].Event
} }
provider := gomatrixserverlib.NewAuthEvents(stateEvents) provider := gomatrixserverlib.NewAuthEvents(stateEvents)
if err = gomatrixserverlib.Allowed(*e, &provider); err != nil { if err = gomatrixserverlib.Allowed(e, &provider); err != nil {
return nil, &util.JSONResponse{ return nil, &util.JSONResponse{
Code: http.StatusForbidden, Code: http.StatusForbidden,
JSON: jsonerror.Forbidden(err.Error()), // TODO: Is this error string comprehensible to the client? JSON: jsonerror.Forbidden(err.Error()), // TODO: Is this error string comprehensible to the client?

View file

@ -122,7 +122,7 @@ func buildAndOutput() gomatrixserverlib.EventReference {
} }
// Write an event to the output. // Write an event to the output.
func writeEvent(event gomatrixserverlib.Event) { func writeEvent(event *gomatrixserverlib.Event) {
encoder := json.NewEncoder(os.Stdout) encoder := json.NewEncoder(os.Stdout)
if *format == "InputRoomEvent" { if *format == "InputRoomEvent" {
var ire api.InputRoomEvent var ire api.InputRoomEvent

View file

@ -103,7 +103,7 @@ func clientEventJSONForOutputRoomEvent(outputRoomEvent string) string {
if err := json.Unmarshal([]byte(outputRoomEvent), &out); err != nil { if err := json.Unmarshal([]byte(outputRoomEvent), &out); err != nil {
panic("failed to unmarshal output room event: " + err.Error()) panic("failed to unmarshal output room event: " + err.Error())
} }
clientEvs := gomatrixserverlib.ToClientEvents([]gomatrixserverlib.Event{ clientEvs := gomatrixserverlib.ToClientEvents([]*gomatrixserverlib.Event{
out.NewRoomEvent.Event.Event, out.NewRoomEvent.Event.Event,
}, gomatrixserverlib.FormatSync) }, gomatrixserverlib.FormatSync)
b, err := json.Marshal(clientEvs[0]) b, err := json.Marshal(clientEvs[0])

View file

@ -57,7 +57,7 @@ func BuildEvent(
return nil, err return nil, err
} }
return &event, nil return event, nil
} }
// AddPrevEventsToEvent fills out the prev_events and auth_events fields in builder // AddPrevEventsToEvent fills out the prev_events and auth_events fields in builder
@ -94,7 +94,7 @@ func AddPrevEventsToEvent(
authEvents := gomatrixserverlib.NewAuthEvents(nil) authEvents := gomatrixserverlib.NewAuthEvents(nil)
for i := range queryRes.StateEvents { for i := range queryRes.StateEvents {
err = authEvents.AddEvent(&queryRes.StateEvents[i].Event) err = authEvents.AddEvent(queryRes.StateEvents[i].Event)
if err != nil { if err != nil {
return err return err
} }

View file

@ -83,7 +83,7 @@ func Backfill(
} }
// Filter any event that's not from the requested room out. // Filter any event that's not from the requested room out.
evs := make([]gomatrixserverlib.Event, 0) evs := make([]*gomatrixserverlib.Event, 0)
var ev gomatrixserverlib.HeaderedEvent var ev gomatrixserverlib.HeaderedEvent
for _, ev = range res.Events { for _, ev = range res.Events {

View file

@ -80,5 +80,5 @@ func getEvent(
return nil, &util.JSONResponse{Code: http.StatusNotFound, JSON: nil} return nil, &util.JSONResponse{Code: http.StatusNotFound, JSON: nil}
} }
return &eventsResponse.Events[0].Event, nil return eventsResponse.Events[0].Event, nil
} }

View file

@ -113,6 +113,6 @@ func Invite(
// the other servers in the room that we have been invited. // the other servers in the room that we have been invited.
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusOK, Code: http.StatusOK,
JSON: gomatrixserverlib.RespInvite{Event: signedEvent}, JSON: gomatrixserverlib.RespInvite{Event: &signedEvent},
} }
} }

View file

@ -15,6 +15,7 @@
package routing package routing
import ( import (
"fmt"
"net/http" "net/http"
"time" "time"
@ -88,11 +89,11 @@ func MakeJoin(
// Check that the join is allowed or not // Check that the join is allowed or not
stateEvents := make([]*gomatrixserverlib.Event, len(queryRes.StateEvents)) stateEvents := make([]*gomatrixserverlib.Event, len(queryRes.StateEvents))
for i := range queryRes.StateEvents { for i := range queryRes.StateEvents {
stateEvents[i] = &queryRes.StateEvents[i].Event stateEvents[i] = queryRes.StateEvents[i].Event
} }
provider := gomatrixserverlib.NewAuthEvents(stateEvents) provider := gomatrixserverlib.NewAuthEvents(stateEvents)
if err = gomatrixserverlib.Allowed(*event, &provider); err != nil { if err = gomatrixserverlib.Allowed(event, &provider); err != nil {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusForbidden, Code: http.StatusForbidden,
JSON: jsonerror.Forbidden(err.Error()), JSON: jsonerror.Forbidden(err.Error()),
@ -128,8 +129,13 @@ func SendJoin(
} }
} }
fmt.Println("Content:", string(request.Content()))
fmt.Println("Room version:", verRes.RoomVersion)
event, err := gomatrixserverlib.NewEventFromUntrustedJSON(request.Content(), verRes.RoomVersion) event, err := gomatrixserverlib.NewEventFromUntrustedJSON(request.Content(), verRes.RoomVersion)
if err != nil { if err != nil {
fmt.Println("gomatrixserverlib.NewEventFromUntrustedJSON:", err)
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusBadRequest, Code: http.StatusBadRequest,
JSON: jsonerror.NotJSON("The request body could not be decoded into valid JSON. " + err.Error()), JSON: jsonerror.NotJSON("The request body could not be decoded into valid JSON. " + err.Error()),

View file

@ -75,10 +75,10 @@ func MakeLeave(
// Check that the leave is allowed or not // Check that the leave is allowed or not
stateEvents := make([]*gomatrixserverlib.Event, len(queryRes.StateEvents)) stateEvents := make([]*gomatrixserverlib.Event, len(queryRes.StateEvents))
for i := range queryRes.StateEvents { for i := range queryRes.StateEvents {
stateEvents[i] = &queryRes.StateEvents[i].Event stateEvents[i] = queryRes.StateEvents[i].Event
} }
provider := gomatrixserverlib.NewAuthEvents(stateEvents) provider := gomatrixserverlib.NewAuthEvents(stateEvents)
if err = gomatrixserverlib.Allowed(*event, &provider); err != nil { if err = gomatrixserverlib.Allowed(event, &provider); err != nil {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusForbidden, Code: http.StatusForbidden,
JSON: jsonerror.Forbidden(err.Error()), JSON: jsonerror.Forbidden(err.Error()),

View file

@ -108,7 +108,7 @@ func (t *txnReq) processTransaction() (*gomatrixserverlib.RespSend, error) {
util.GetLogger(t.context).WithError(err).Warnf("Transaction: Failed to parse event JSON of event %q", event.EventID()) util.GetLogger(t.context).WithError(err).Warnf("Transaction: Failed to parse event JSON of event %q", event.EventID())
return nil, err return nil, err
} }
if err := gomatrixserverlib.VerifyAllEventSignatures(t.context, []gomatrixserverlib.Event{event}, t.keys); err != nil { if err := gomatrixserverlib.VerifyAllEventSignatures(t.context, []*gomatrixserverlib.Event{event}, t.keys); err != nil {
util.GetLogger(t.context).WithError(err).Warnf("Transaction: Couldn't validate signature of event %q", event.EventID()) util.GetLogger(t.context).WithError(err).Warnf("Transaction: Couldn't validate signature of event %q", event.EventID())
return nil, err return nil, err
} }
@ -163,11 +163,11 @@ type unknownRoomError struct {
func (e unknownRoomError) Error() string { return fmt.Sprintf("unknown room %q", e.roomID) } func (e unknownRoomError) Error() string { return fmt.Sprintf("unknown room %q", e.roomID) }
func (t *txnReq) processEvent(e gomatrixserverlib.Event) error { func (t *txnReq) processEvent(e *gomatrixserverlib.Event) error {
prevEventIDs := e.PrevEventIDs() prevEventIDs := e.PrevEventIDs()
// Fetch the state needed to authenticate the event. // Fetch the state needed to authenticate the event.
needed := gomatrixserverlib.StateNeededForAuth([]gomatrixserverlib.Event{e}) needed := gomatrixserverlib.StateNeededForAuth([]*gomatrixserverlib.Event{e})
stateReq := api.QueryStateAfterEventsRequest{ stateReq := api.QueryStateAfterEventsRequest{
RoomID: e.RoomID(), RoomID: e.RoomID(),
PrevEventIDs: prevEventIDs, PrevEventIDs: prevEventIDs,
@ -193,7 +193,7 @@ func (t *txnReq) processEvent(e gomatrixserverlib.Event) error {
} }
// Check that the event is allowed by the state at the event. // Check that the event is allowed by the state at the event.
var events []gomatrixserverlib.Event var events []*gomatrixserverlib.Event
for _, headeredEvent := range stateResp.StateEvents { for _, headeredEvent := range stateResp.StateEvents {
events = append(events, headeredEvent.Unwrap()) events = append(events, headeredEvent.Unwrap())
} }
@ -216,10 +216,10 @@ func (t *txnReq) processEvent(e gomatrixserverlib.Event) error {
return err return err
} }
func checkAllowedByState(e gomatrixserverlib.Event, stateEvents []gomatrixserverlib.Event) error { func checkAllowedByState(e *gomatrixserverlib.Event, stateEvents []*gomatrixserverlib.Event) error {
authUsingState := gomatrixserverlib.NewAuthEvents(nil) authUsingState := gomatrixserverlib.NewAuthEvents(nil)
for i := range stateEvents { for i := range stateEvents {
err := authUsingState.AddEvent(&stateEvents[i]) err := authUsingState.AddEvent(stateEvents[i])
if err != nil { if err != nil {
return err return err
} }
@ -227,7 +227,7 @@ func checkAllowedByState(e gomatrixserverlib.Event, stateEvents []gomatrixserver
return gomatrixserverlib.Allowed(e, &authUsingState) return gomatrixserverlib.Allowed(e, &authUsingState)
} }
func (t *txnReq) processEventWithMissingState(e gomatrixserverlib.Event, roomVersion gomatrixserverlib.RoomVersion) error { func (t *txnReq) processEventWithMissingState(e *gomatrixserverlib.Event, roomVersion gomatrixserverlib.RoomVersion) error {
// We are missing the previous events for this events. // We are missing the previous events for this events.
// This means that there is a gap in our view of the history of the // This means that there is a gap in our view of the history of the
// room. There two ways that we can handle such a gap: // room. There two ways that we can handle such a gap:

View file

@ -144,7 +144,7 @@ func getIDsFromEventRef(events []gomatrixserverlib.EventReference) []string {
return IDs return IDs
} }
func getIDsFromEvent(events []gomatrixserverlib.Event) []string { func getIDsFromEvent(events []*gomatrixserverlib.Event) []string {
IDs := make([]string, len(events)) IDs := make([]string, len(events))
for i := range events { for i := range events {
IDs[i] = events[i].EventID() IDs[i] = events[i].EventID()

View file

@ -169,7 +169,7 @@ func ExchangeThirdPartyInvite(
// Ask the requesting server to sign the newly created event so we know it // Ask the requesting server to sign the newly created event so we know it
// acknowledged it // acknowledged it
signedEvent, err := federation.SendInvite(httpReq.Context(), request.Origin(), *event) signedEvent, err := federation.SendInvite(httpReq.Context(), request.Origin(), event)
if err != nil { if err != nil {
util.GetLogger(httpReq.Context()).WithError(err).Error("federation.SendInvite failed") util.GetLogger(httpReq.Context()).WithError(err).Error("federation.SendInvite failed")
return jsonerror.InternalServerError() return jsonerror.InternalServerError()
@ -293,7 +293,7 @@ func buildMembershipEvent(
authEvents := gomatrixserverlib.NewAuthEvents(nil) authEvents := gomatrixserverlib.NewAuthEvents(nil)
for i := range queryRes.StateEvents { for i := range queryRes.StateEvents {
err = authEvents.AddEvent(&queryRes.StateEvents[i].Event) err = authEvents.AddEvent(queryRes.StateEvents[i].Event)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -314,7 +314,7 @@ func buildMembershipEvent(
cfg.Matrix.PrivateKey, queryRes.RoomVersion, cfg.Matrix.PrivateKey, queryRes.RoomVersion,
) )
return &event, err return event, err
} }
// sendToRemoteServer uses federation to send an invite provided by an identity // sendToRemoteServer uses federation to send an invite provided by an identity

View file

@ -223,7 +223,7 @@ func (s *OutputRoomEventConsumer) joinedHostsAtEvent(
// joinedHostsFromEvents turns a list of state events into a list of joined hosts. // joinedHostsFromEvents turns a list of state events into a list of joined hosts.
// This errors if one of the events was invalid. // This errors if one of the events was invalid.
// It should be impossible for an invalid event to get this far in the pipeline. // It should be impossible for an invalid event to get this far in the pipeline.
func joinedHostsFromEvents(evs []gomatrixserverlib.Event) ([]types.JoinedHost, error) { func joinedHostsFromEvents(evs []*gomatrixserverlib.Event) ([]types.JoinedHost, error) {
var joinedHosts []types.JoinedHost var joinedHosts []types.JoinedHost
for _, ev := range evs { for _, ev := range evs {
if ev.Type() != "m.room.member" || ev.StateKey() == nil { if ev.Type() != "m.room.member" || ev.StateKey() == nil {
@ -288,8 +288,8 @@ func combineDeltas(adds1, removes1, adds2, removes2 []string) (adds, removes []s
// lookupStateEvents looks up the state events that are added by a new event. // lookupStateEvents looks up the state events that are added by a new event.
func (s *OutputRoomEventConsumer) lookupStateEvents( func (s *OutputRoomEventConsumer) lookupStateEvents(
addsStateEventIDs []string, event gomatrixserverlib.Event, addsStateEventIDs []string, event *gomatrixserverlib.Event,
) ([]gomatrixserverlib.Event, error) { ) ([]*gomatrixserverlib.Event, error) {
// Fast path if there aren't any new state events. // Fast path if there aren't any new state events.
if len(addsStateEventIDs) == 0 { if len(addsStateEventIDs) == 0 {
return nil, nil return nil, nil
@ -297,11 +297,11 @@ func (s *OutputRoomEventConsumer) lookupStateEvents(
// Fast path if the only state event added is the event itself. // Fast path if the only state event added is the event itself.
if len(addsStateEventIDs) == 1 && addsStateEventIDs[0] == event.EventID() { if len(addsStateEventIDs) == 1 && addsStateEventIDs[0] == event.EventID() {
return []gomatrixserverlib.Event{event}, nil return []*gomatrixserverlib.Event{event}, nil
} }
missing := addsStateEventIDs missing := addsStateEventIDs
var result []gomatrixserverlib.Event var result []*gomatrixserverlib.Event
// Check if event itself is being added. // Check if event itself is being added.
for _, eventID := range missing { for _, eventID := range missing {
@ -340,7 +340,7 @@ func (s *OutputRoomEventConsumer) lookupStateEvents(
return result, nil return result, nil
} }
func missingEventsFrom(events []gomatrixserverlib.Event, required []string) []string { func missingEventsFrom(events []*gomatrixserverlib.Event, required []string) []string {
have := map[string]bool{} have := map[string]bool{}
for _, event := range events { for _, event := range events {
have[event.EventID()] = true have[event.EventID()] = true

2
go.mod
View file

@ -9,7 +9,7 @@ require (
github.com/matrix-org/go-http-js-libp2p v0.0.0-20200318135427-31631a9ef51f github.com/matrix-org/go-http-js-libp2p v0.0.0-20200318135427-31631a9ef51f
github.com/matrix-org/go-sqlite3-js v0.0.0-20200304164012-aa524245b658 github.com/matrix-org/go-sqlite3-js v0.0.0-20200304164012-aa524245b658
github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26 github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26
github.com/matrix-org/gomatrixserverlib v0.0.0-20200327155501-33fb4c7049dc github.com/matrix-org/gomatrixserverlib v0.0.0-20200331114308-cce9803cf1c0
github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1 github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1
github.com/matrix-org/util v0.0.0-20190711121626-527ce5ddefc7 github.com/matrix-org/util v0.0.0-20190711121626-527ce5ddefc7
github.com/mattn/go-sqlite3 v2.0.2+incompatible github.com/mattn/go-sqlite3 v2.0.2+incompatible

14
go.sum
View file

@ -130,6 +130,20 @@ github.com/matrix-org/gomatrixserverlib v0.0.0-20200124100636-0c2ec91d1df5 h1:km
github.com/matrix-org/gomatrixserverlib v0.0.0-20200124100636-0c2ec91d1df5/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI= github.com/matrix-org/gomatrixserverlib v0.0.0-20200124100636-0c2ec91d1df5/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200327155501-33fb4c7049dc h1:qrRu4/AlulnldLiyGpYYm+ELIkrP51XCRlA3txWpN30= github.com/matrix-org/gomatrixserverlib v0.0.0-20200327155501-33fb4c7049dc h1:qrRu4/AlulnldLiyGpYYm+ELIkrP51XCRlA3txWpN30=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200327155501-33fb4c7049dc/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI= github.com/matrix-org/gomatrixserverlib v0.0.0-20200327155501-33fb4c7049dc/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200330133059-bbdce5ac98b2 h1:Rvahg1XdpwKCesugEow8EjwMR1c9azPfP8NbFfj3x9g=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200330133059-bbdce5ac98b2/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200330141007-1fdfd615ef66 h1:QIY94E/XU+7HhbDk9W0QWNxOecDQ8fK/Q9MapAIhQ0I=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200330141007-1fdfd615ef66/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200330150858-f60671ad5b5b h1:dsU5w9XBuYt5Nm0QZk+1Zz3bQm9WHMAaCR2AE7fxj4g=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200330150858-f60671ad5b5b/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200331095927-38aaf4691913 h1:4rULxCsOZJMvx7S/fLRldY/Lt8EU52DnE7ah4NPaTqI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200331095927-38aaf4691913/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200331100407-7de7b642eff3 h1:/ssNjPLDp+tFfd3yOBcY5zVgPRgcWMY/XAt14NgAvQw=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200331100407-7de7b642eff3/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200331100927-6c0159bd04e1 h1:1cCNqND1p944BuV6YkbDXH4tmpkasAjp+NveGBJPcgE=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200331100927-6c0159bd04e1/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200331114308-cce9803cf1c0 h1:JZ90wZqOkRHpkTLjfk2lkaNS7l2XI8JGkXJ8ziPawLI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200331114308-cce9803cf1c0/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1 h1:osLoFdOy+ChQqVUn2PeTDETFftVkl4w9t/OW18g3lnk= github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1 h1:osLoFdOy+ChQqVUn2PeTDETFftVkl4w9t/OW18g3lnk=
github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1/go.mod h1:cXoYQIENbdWIQHt1SyCo6Bl3C3raHwJ0wgVrXHSqf+A= github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1/go.mod h1:cXoYQIENbdWIQHt1SyCo6Bl3C3raHwJ0wgVrXHSqf+A=
github.com/matrix-org/util v0.0.0-20171127121716-2e2df66af2f5 h1:W7l5CP4V7wPyPb4tYE11dbmeAOwtFQBTW0rf4OonOS8= github.com/matrix-org/util v0.0.0-20171127121716-2e2df66af2f5 h1:W7l5CP4V7wPyPb4tYE11dbmeAOwtFQBTW0rf4OonOS8=

View file

@ -99,7 +99,7 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error {
return err return err
} }
var addQueryEvents, remQueryEvents []gomatrixserverlib.Event var addQueryEvents, remQueryEvents []*gomatrixserverlib.Event
for _, headeredEvent := range addQueryRes.Events { for _, headeredEvent := range addQueryRes.Events {
addQueryEvents = append(addQueryEvents, headeredEvent.Event) addQueryEvents = append(addQueryEvents, headeredEvent.Event)
} }

View file

@ -27,6 +27,6 @@ type Database interface {
SetRoomVisibility(ctx context.Context, visible bool, roomID string) error SetRoomVisibility(ctx context.Context, visible bool, roomID string) error
CountPublicRooms(ctx context.Context) (int64, error) CountPublicRooms(ctx context.Context) (int64, error)
GetPublicRooms(ctx context.Context, offset int64, limit int16, filter string) ([]gomatrixserverlib.PublicRoom, error) GetPublicRooms(ctx context.Context, offset int64, limit int16, filter string) ([]gomatrixserverlib.PublicRoom, error)
UpdateRoomFromEvents(ctx context.Context, eventsToAdd []gomatrixserverlib.Event, eventsToRemove []gomatrixserverlib.Event) error UpdateRoomFromEvents(ctx context.Context, eventsToAdd []*gomatrixserverlib.Event, eventsToRemove []*gomatrixserverlib.Event) error
UpdateRoomFromEvent(ctx context.Context, event gomatrixserverlib.Event) error UpdateRoomFromEvent(ctx context.Context, event *gomatrixserverlib.Event) error
} }

View file

@ -97,8 +97,8 @@ func (d *PublicRoomsServerDatabase) GetPublicRooms(
// returns an error. // returns an error.
func (d *PublicRoomsServerDatabase) UpdateRoomFromEvents( func (d *PublicRoomsServerDatabase) UpdateRoomFromEvents(
ctx context.Context, ctx context.Context,
eventsToAdd []gomatrixserverlib.Event, eventsToAdd []*gomatrixserverlib.Event,
eventsToRemove []gomatrixserverlib.Event, eventsToRemove []*gomatrixserverlib.Event,
) error { ) error {
for _, event := range eventsToAdd { for _, event := range eventsToAdd {
if err := d.UpdateRoomFromEvent(ctx, event); err != nil { if err := d.UpdateRoomFromEvent(ctx, event); err != nil {
@ -124,7 +124,7 @@ func (d *PublicRoomsServerDatabase) UpdateRoomFromEvents(
// does nothing. // does nothing.
// If something went wrong during the process, returns an error. // If something went wrong during the process, returns an error.
func (d *PublicRoomsServerDatabase) UpdateRoomFromEvent( func (d *PublicRoomsServerDatabase) UpdateRoomFromEvent(
ctx context.Context, event gomatrixserverlib.Event, ctx context.Context, event *gomatrixserverlib.Event,
) error { ) error {
// Process the event according to its type // Process the event according to its type
switch event.Type() { switch event.Type() {
@ -179,7 +179,7 @@ func (d *PublicRoomsServerDatabase) UpdateRoomFromEvent(
// database, if set to truem decrements it. // database, if set to truem decrements it.
// Returns an error if the update failed. // Returns an error if the update failed.
func (d *PublicRoomsServerDatabase) updateNumJoinedUsers( func (d *PublicRoomsServerDatabase) updateNumJoinedUsers(
ctx context.Context, membershipEvent gomatrixserverlib.Event, remove bool, ctx context.Context, membershipEvent *gomatrixserverlib.Event, remove bool,
) error { ) error {
membership, err := membershipEvent.Membership() membership, err := membershipEvent.Membership()
if err != nil { if err != nil {
@ -202,7 +202,7 @@ func (d *PublicRoomsServerDatabase) updateNumJoinedUsers(
// Returns an error if decoding the Matrix event's content or updating the attribute // Returns an error if decoding the Matrix event's content or updating the attribute
// failed. // failed.
func (d *PublicRoomsServerDatabase) updateStringAttribute( func (d *PublicRoomsServerDatabase) updateStringAttribute(
ctx context.Context, attrName string, event gomatrixserverlib.Event, ctx context.Context, attrName string, event *gomatrixserverlib.Event,
content interface{}, field *string, content interface{}, field *string,
) error { ) error {
if err := json.Unmarshal(event.Content(), content); err != nil { if err := json.Unmarshal(event.Content(), content); err != nil {
@ -219,7 +219,7 @@ func (d *PublicRoomsServerDatabase) updateStringAttribute(
// Returns an error if decoding the Matrix event's content or updating the attribute // Returns an error if decoding the Matrix event's content or updating the attribute
// failed. // failed.
func (d *PublicRoomsServerDatabase) updateBooleanAttribute( func (d *PublicRoomsServerDatabase) updateBooleanAttribute(
ctx context.Context, attrName string, event gomatrixserverlib.Event, ctx context.Context, attrName string, event *gomatrixserverlib.Event,
content interface{}, field *string, strForTrue string, content interface{}, field *string, strForTrue string,
) error { ) error {
if err := json.Unmarshal(event.Content(), content); err != nil { if err := json.Unmarshal(event.Content(), content); err != nil {
@ -240,7 +240,7 @@ func (d *PublicRoomsServerDatabase) updateBooleanAttribute(
// a given room with it. // a given room with it.
// Returns an error if decoding the Matrix event or updating the list failed. // Returns an error if decoding the Matrix event or updating the list failed.
func (d *PublicRoomsServerDatabase) updateRoomAliases( func (d *PublicRoomsServerDatabase) updateRoomAliases(
ctx context.Context, aliasesEvent gomatrixserverlib.Event, ctx context.Context, aliasesEvent *gomatrixserverlib.Event,
) error { ) error {
var content common.AliasesContent var content common.AliasesContent
if err := json.Unmarshal(aliasesEvent.Content(), &content); err != nil { if err := json.Unmarshal(aliasesEvent.Content(), &content); err != nil {

View file

@ -99,8 +99,8 @@ func (d *PublicRoomsServerDatabase) GetPublicRooms(
// returns an error. // returns an error.
func (d *PublicRoomsServerDatabase) UpdateRoomFromEvents( func (d *PublicRoomsServerDatabase) UpdateRoomFromEvents(
ctx context.Context, ctx context.Context,
eventsToAdd []gomatrixserverlib.Event, eventsToAdd []*gomatrixserverlib.Event,
eventsToRemove []gomatrixserverlib.Event, eventsToRemove []*gomatrixserverlib.Event,
) error { ) error {
for _, event := range eventsToAdd { for _, event := range eventsToAdd {
if err := d.UpdateRoomFromEvent(ctx, event); err != nil { if err := d.UpdateRoomFromEvent(ctx, event); err != nil {
@ -126,7 +126,7 @@ func (d *PublicRoomsServerDatabase) UpdateRoomFromEvents(
// does nothing. // does nothing.
// If something went wrong during the process, returns an error. // If something went wrong during the process, returns an error.
func (d *PublicRoomsServerDatabase) UpdateRoomFromEvent( func (d *PublicRoomsServerDatabase) UpdateRoomFromEvent(
ctx context.Context, event gomatrixserverlib.Event, ctx context.Context, event *gomatrixserverlib.Event,
) error { ) error {
// Process the event according to its type // Process the event according to its type
switch event.Type() { switch event.Type() {
@ -181,7 +181,7 @@ func (d *PublicRoomsServerDatabase) UpdateRoomFromEvent(
// database, if set to truem decrements it. // database, if set to truem decrements it.
// Returns an error if the update failed. // Returns an error if the update failed.
func (d *PublicRoomsServerDatabase) updateNumJoinedUsers( func (d *PublicRoomsServerDatabase) updateNumJoinedUsers(
ctx context.Context, membershipEvent gomatrixserverlib.Event, remove bool, ctx context.Context, membershipEvent *gomatrixserverlib.Event, remove bool,
) error { ) error {
membership, err := membershipEvent.Membership() membership, err := membershipEvent.Membership()
if err != nil { if err != nil {
@ -204,7 +204,7 @@ func (d *PublicRoomsServerDatabase) updateNumJoinedUsers(
// Returns an error if decoding the Matrix event's content or updating the attribute // Returns an error if decoding the Matrix event's content or updating the attribute
// failed. // failed.
func (d *PublicRoomsServerDatabase) updateStringAttribute( func (d *PublicRoomsServerDatabase) updateStringAttribute(
ctx context.Context, attrName string, event gomatrixserverlib.Event, ctx context.Context, attrName string, event *gomatrixserverlib.Event,
content interface{}, field *string, content interface{}, field *string,
) error { ) error {
if err := json.Unmarshal(event.Content(), content); err != nil { if err := json.Unmarshal(event.Content(), content); err != nil {
@ -221,7 +221,7 @@ func (d *PublicRoomsServerDatabase) updateStringAttribute(
// Returns an error if decoding the Matrix event's content or updating the attribute // Returns an error if decoding the Matrix event's content or updating the attribute
// failed. // failed.
func (d *PublicRoomsServerDatabase) updateBooleanAttribute( func (d *PublicRoomsServerDatabase) updateBooleanAttribute(
ctx context.Context, attrName string, event gomatrixserverlib.Event, ctx context.Context, attrName string, event *gomatrixserverlib.Event,
content interface{}, field *string, strForTrue string, content interface{}, field *string, strForTrue string,
) error { ) error {
if err := json.Unmarshal(event.Content(), content); err != nil { if err := json.Unmarshal(event.Content(), content); err != nil {
@ -242,7 +242,7 @@ func (d *PublicRoomsServerDatabase) updateBooleanAttribute(
// a given room with it. // a given room with it.
// Returns an error if decoding the Matrix event or updating the list failed. // Returns an error if decoding the Matrix event or updating the list failed.
func (d *PublicRoomsServerDatabase) updateRoomAliases( func (d *PublicRoomsServerDatabase) updateRoomAliases(
ctx context.Context, aliasesEvent gomatrixserverlib.Event, ctx context.Context, aliasesEvent *gomatrixserverlib.Event,
) error { ) error {
var content common.AliasesContent var content common.AliasesContent
if err := json.Unmarshal(aliasesEvent.Content(), &content); err != nil { if err := json.Unmarshal(aliasesEvent.Content(), &content); err != nil {

View file

@ -232,7 +232,7 @@ func (r *RoomserverAliasAPI) sendUpdatedAliasesEvent(
// Add auth events // Add auth events
authEvents := gomatrixserverlib.NewAuthEvents(nil) authEvents := gomatrixserverlib.NewAuthEvents(nil)
for i := range res.StateEvents { for i := range res.StateEvents {
err = authEvents.AddEvent(&res.StateEvents[i].Event) err = authEvents.AddEvent(res.StateEvents[i].Event)
if err != nil { if err != nil {
return err return err
} }

View file

@ -218,8 +218,8 @@ type QueryStateAndAuthChainResponse struct {
PrevEventsExist bool `json:"prev_events_exist"` PrevEventsExist bool `json:"prev_events_exist"`
// The state and auth chain events that were requested. // The state and auth chain events that were requested.
// The lists will be in an arbitrary order. // The lists will be in an arbitrary order.
StateEvents []gomatrixserverlib.HeaderedEvent `json:"state_events"` StateEvents []*gomatrixserverlib.HeaderedEvent `json:"state_events"`
AuthChainEvents []gomatrixserverlib.HeaderedEvent `json:"auth_chain_events"` AuthChainEvents []*gomatrixserverlib.HeaderedEvent `json:"auth_chain_events"`
} }
// QueryBackfillRequest is a request to QueryBackfill. // QueryBackfillRequest is a request to QueryBackfill.

View file

@ -25,7 +25,7 @@ import (
func IsServerAllowed( func IsServerAllowed(
serverName gomatrixserverlib.ServerName, serverName gomatrixserverlib.ServerName,
serverCurrentlyInRoom bool, serverCurrentlyInRoom bool,
authEvents []gomatrixserverlib.Event, authEvents []*gomatrixserverlib.Event,
) bool { ) bool {
historyVisibility := historyVisibilityForRoom(authEvents) historyVisibility := historyVisibilityForRoom(authEvents)
@ -52,7 +52,7 @@ func IsServerAllowed(
return false return false
} }
func historyVisibilityForRoom(authEvents []gomatrixserverlib.Event) string { func historyVisibilityForRoom(authEvents []*gomatrixserverlib.Event) string {
// https://matrix.org/docs/spec/client_server/r0.6.0#id87 // https://matrix.org/docs/spec/client_server/r0.6.0#id87
// By default if no history_visibility is set, or if the value is not understood, the visibility is assumed to be shared. // By default if no history_visibility is set, or if the value is not understood, the visibility is assumed to be shared.
visibility := "shared" visibility := "shared"
@ -78,7 +78,7 @@ func historyVisibilityForRoom(authEvents []gomatrixserverlib.Event) string {
return visibility return visibility
} }
func IsAnyUserOnServerWithMembership(serverName gomatrixserverlib.ServerName, authEvents []gomatrixserverlib.Event, wantMembership string) bool { func IsAnyUserOnServerWithMembership(serverName gomatrixserverlib.ServerName, authEvents []*gomatrixserverlib.Event, wantMembership string) bool {
for _, ev := range authEvents { for _, ev := range authEvents {
membership, err := ev.Membership() membership, err := ev.Membership()
if err != nil || membership != wantMembership { if err != nil || membership != wantMembership {

View file

@ -38,7 +38,7 @@ func checkAuthEvents(
// TODO: check for duplicate state keys here. // TODO: check for duplicate state keys here.
// Work out which of the state events we actually need. // Work out which of the state events we actually need.
stateNeeded := gomatrixserverlib.StateNeededForAuth([]gomatrixserverlib.Event{event.Unwrap()}) stateNeeded := gomatrixserverlib.StateNeededForAuth([]*gomatrixserverlib.Event{event.Unwrap()})
// Load the actual auth events from the database. // Load the actual auth events from the database.
authEvents, err := loadAuthEvents(ctx, db, stateNeeded, authStateEntries) authEvents, err := loadAuthEvents(ctx, db, stateNeeded, authStateEntries)
@ -102,7 +102,7 @@ func (ae *authEvents) lookupEventWithEmptyStateKey(typeNID types.EventTypeNID) *
if !ok { if !ok {
return nil return nil
} }
return &event.Event return event.Event
} }
func (ae *authEvents) lookupEvent(typeNID types.EventTypeNID, stateKey string) *gomatrixserverlib.Event { func (ae *authEvents) lookupEvent(typeNID types.EventTypeNID, stateKey string) *gomatrixserverlib.Event {
@ -121,7 +121,7 @@ func (ae *authEvents) lookupEvent(typeNID types.EventTypeNID, stateKey string) *
if !ok { if !ok {
return nil return nil
} }
return &event.Event return event.Event
} }
// loadAuthEvents loads the events needed for authentication from the supplied room state. // loadAuthEvents loads the events needed for authentication from the supplied room state.

View file

@ -34,7 +34,7 @@ type RoomEventDatabase interface {
// Stores a matrix room event in the database // Stores a matrix room event in the database
StoreEvent( StoreEvent(
ctx context.Context, ctx context.Context,
event gomatrixserverlib.Event, event *gomatrixserverlib.Event,
txnAndSessionID *api.TransactionID, txnAndSessionID *api.TransactionID,
authEventNIDs []types.EventNID, authEventNIDs []types.EventNID,
) (types.RoomNID, types.StateAtEvent, error) ) (types.RoomNID, types.StateAtEvent, error)
@ -155,7 +155,7 @@ func calculateAndSetState(
input api.InputRoomEvent, input api.InputRoomEvent,
roomNID types.RoomNID, roomNID types.RoomNID,
stateAtEvent *types.StateAtEvent, stateAtEvent *types.StateAtEvent,
event gomatrixserverlib.Event, event *gomatrixserverlib.Event,
) error { ) error {
var err error var err error
roomState := state.NewStateResolution(db) roomState := state.NewStateResolution(db)
@ -237,7 +237,7 @@ func processInviteEvent(
} }
event := input.Event.Unwrap() event := input.Event.Unwrap()
outputUpdates, err := updateToInviteMembership(updater, &event, nil) outputUpdates, err := updateToInviteMembership(updater, event, nil)
if err != nil { if err != nil {
return err return err
} }

View file

@ -51,7 +51,7 @@ func updateLatestEvents(
ow OutputRoomEventWriter, ow OutputRoomEventWriter,
roomNID types.RoomNID, roomNID types.RoomNID,
stateAtEvent types.StateAtEvent, stateAtEvent types.StateAtEvent,
event gomatrixserverlib.Event, event *gomatrixserverlib.Event,
sendAsServer string, sendAsServer string,
transactionID *api.TransactionID, transactionID *api.TransactionID,
) (err error) { ) (err error) {
@ -91,7 +91,7 @@ type latestEventsUpdater struct {
ow OutputRoomEventWriter ow OutputRoomEventWriter
roomNID types.RoomNID roomNID types.RoomNID
stateAtEvent types.StateAtEvent stateAtEvent types.StateAtEvent
event gomatrixserverlib.Event event *gomatrixserverlib.Event
transactionID *api.TransactionID transactionID *api.TransactionID
// Which server to send this event as. // Which server to send this event as.
sendAsServer string sendAsServer string

View file

@ -61,13 +61,13 @@ func updateMemberships(
if change.removedEventNID != 0 { if change.removedEventNID != 0 {
ev, _ := eventMap(events).lookup(change.removedEventNID) ev, _ := eventMap(events).lookup(change.removedEventNID)
if ev != nil { if ev != nil {
re = &ev.Event re = ev.Event
} }
} }
if change.addedEventNID != 0 { if change.addedEventNID != 0 {
ev, _ := eventMap(events).lookup(change.addedEventNID) ev, _ := eventMap(events).lookup(change.addedEventNID)
if ev != nil { if ev != nil {
ae = &ev.Event ae = ev.Event
} }
} }
if updates, err = updateMembership(updater, targetUserNID, re, ae, updates); err != nil { if updates, err = updateMembership(updater, targetUserNID, re, ae, updates); err != nil {

View file

@ -245,7 +245,7 @@ func (r *RoomserverQueryAPI) QueryEventsByID(
func (r *RoomserverQueryAPI) loadStateEvents( func (r *RoomserverQueryAPI) loadStateEvents(
ctx context.Context, stateEntries []types.StateEntry, ctx context.Context, stateEntries []types.StateEntry,
) ([]gomatrixserverlib.Event, error) { ) ([]*gomatrixserverlib.Event, error) {
eventNIDs := make([]types.EventNID, len(stateEntries)) eventNIDs := make([]types.EventNID, len(stateEntries))
for i := range stateEntries { for i := range stateEntries {
eventNIDs[i] = stateEntries[i].EventNID eventNIDs[i] = stateEntries[i].EventNID
@ -255,13 +255,13 @@ func (r *RoomserverQueryAPI) loadStateEvents(
func (r *RoomserverQueryAPI) loadEvents( func (r *RoomserverQueryAPI) loadEvents(
ctx context.Context, eventNIDs []types.EventNID, ctx context.Context, eventNIDs []types.EventNID,
) ([]gomatrixserverlib.Event, error) { ) ([]*gomatrixserverlib.Event, error) {
stateEvents, err := r.DB.Events(ctx, eventNIDs) stateEvents, err := r.DB.Events(ctx, eventNIDs)
if err != nil { if err != nil {
return nil, err return nil, err
} }
result := make([]gomatrixserverlib.Event, len(stateEvents)) result := make([]*gomatrixserverlib.Event, len(stateEvents))
for i := range stateEvents { for i := range stateEvents {
result[i] = stateEvents[i].Event result[i] = stateEvents[i].Event
} }
@ -560,7 +560,7 @@ func (r *RoomserverQueryAPI) QueryBackfill(
} }
// Retrieve events from the list that was filled previously. // Retrieve events from the list that was filled previously.
var loadedEvents []gomatrixserverlib.Event var loadedEvents []*gomatrixserverlib.Event
loadedEvents, err = r.loadEvents(ctx, resultNIDs) loadedEvents, err = r.loadEvents(ctx, resultNIDs)
if err != nil { if err != nil {
return err return err
@ -593,7 +593,7 @@ func (r *RoomserverQueryAPI) isServerCurrentlyInRoom(ctx context.Context, server
if err != nil { if err != nil {
return false, err return false, err
} }
gmslEvents := make([]gomatrixserverlib.Event, len(events)) gmslEvents := make([]*gomatrixserverlib.Event, len(events))
for i := range events { for i := range events {
gmslEvents[i] = events[i].Event gmslEvents[i] = events[i].Event
} }
@ -737,17 +737,19 @@ func (r *RoomserverQueryAPI) QueryStateAndAuthChain(
} }
for _, event := range stateEvents { for _, event := range stateEvents {
response.StateEvents = append(response.StateEvents, event.Headered(roomVersion)) headered := event.Headered(roomVersion)
response.StateEvents = append(response.StateEvents, &headered)
} }
for _, event := range authEvents { for _, event := range authEvents {
response.AuthChainEvents = append(response.AuthChainEvents, event.Headered(roomVersion)) headered := event.Headered(roomVersion)
response.AuthChainEvents = append(response.AuthChainEvents, &headered)
} }
return err return err
} }
func (r *RoomserverQueryAPI) loadStateAtEventIDs(ctx context.Context, eventIDs []string) ([]gomatrixserverlib.Event, error) { func (r *RoomserverQueryAPI) loadStateAtEventIDs(ctx context.Context, eventIDs []string) ([]*gomatrixserverlib.Event, error) {
roomState := state.NewStateResolution(r.DB) roomState := state.NewStateResolution(r.DB)
prevStates, err := r.DB.StateAtEventIDs(ctx, eventIDs) prevStates, err := r.DB.StateAtEventIDs(ctx, eventIDs)
if err != nil { if err != nil {
@ -776,13 +778,13 @@ func (r *RoomserverQueryAPI) loadStateAtEventIDs(ctx context.Context, eventIDs [
// given events. Will *not* error if we don't have all auth events. // given events. Will *not* error if we don't have all auth events.
func getAuthChain( func getAuthChain(
ctx context.Context, dB RoomserverQueryAPIEventDB, authEventIDs []string, ctx context.Context, dB RoomserverQueryAPIEventDB, authEventIDs []string,
) ([]gomatrixserverlib.Event, error) { ) ([]*gomatrixserverlib.Event, error) {
// List of event IDs to fetch. On each pass, these events will be requested // List of event IDs to fetch. On each pass, these events will be requested
// from the database and the `eventsToFetch` will be updated with any new // from the database and the `eventsToFetch` will be updated with any new
// events that we have learned about and need to find. When `eventsToFetch` // events that we have learned about and need to find. When `eventsToFetch`
// is eventually empty, we should have reached the end of the chain. // is eventually empty, we should have reached the end of the chain.
eventsToFetch := authEventIDs eventsToFetch := authEventIDs
authEventsMap := make(map[string]gomatrixserverlib.Event) authEventsMap := make(map[string]*gomatrixserverlib.Event)
for len(eventsToFetch) > 0 { for len(eventsToFetch) > 0 {
// Try to retrieve the events from the database. // Try to retrieve the events from the database.
@ -813,7 +815,7 @@ func getAuthChain(
// We've now retrieved all of the events we can. Flatten them down into an // We've now retrieved all of the events we can. Flatten them down into an
// array and return them. // array and return them.
var authEvents []gomatrixserverlib.Event var authEvents []*gomatrixserverlib.Event
for _, event := range authEventsMap { for _, event := range authEventsMap {
authEvents = append(authEvents, event) authEvents = append(authEvents, event)
} }

View file

@ -26,12 +26,12 @@ import (
// used to implement RoomserverQueryAPIEventDB to test getAuthChain // used to implement RoomserverQueryAPIEventDB to test getAuthChain
type getEventDB struct { type getEventDB struct {
eventMap map[string]gomatrixserverlib.Event eventMap map[string]*gomatrixserverlib.Event
} }
func createEventDB() *getEventDB { func createEventDB() *getEventDB {
return &getEventDB{ return &getEventDB{
eventMap: make(map[string]gomatrixserverlib.Event), eventMap: make(map[string]*gomatrixserverlib.Event),
} }
} }

View file

@ -524,7 +524,7 @@ func init() {
// Returns a numeric ID for the snapshot of the state before the event. // Returns a numeric ID for the snapshot of the state before the event.
func (v StateResolution) CalculateAndStoreStateBeforeEvent( func (v StateResolution) CalculateAndStoreStateBeforeEvent(
ctx context.Context, ctx context.Context,
event gomatrixserverlib.Event, event *gomatrixserverlib.Event,
roomNID types.RoomNID, roomNID types.RoomNID,
) (types.StateSnapshotNID, error) { ) (types.StateSnapshotNID, error) {
// Load the state at the prev events. // Load the state at the prev events.
@ -795,15 +795,15 @@ func (v StateResolution) resolveConflictsV2(
// For each conflicted event, we will add a new set of auth events. Auth // For each conflicted event, we will add a new set of auth events. Auth
// events may be duplicated across these sets but that's OK. // events may be duplicated across these sets but that's OK.
authSets := make(map[string][]gomatrixserverlib.Event) authSets := make(map[string][]*gomatrixserverlib.Event)
var authEvents []gomatrixserverlib.Event var authEvents []*gomatrixserverlib.Event
var authDifference []gomatrixserverlib.Event var authDifference []*gomatrixserverlib.Event
// For each conflicted event, let's try and get the needed auth events. // For each conflicted event, let's try and get the needed auth events.
for _, conflictedEvent := range conflictedEvents { for _, conflictedEvent := range conflictedEvents {
// Work out which auth events we need to load. // Work out which auth events we need to load.
key := conflictedEvent.EventID() key := conflictedEvent.EventID()
needed := gomatrixserverlib.StateNeededForAuth([]gomatrixserverlib.Event{conflictedEvent}) needed := gomatrixserverlib.StateNeededForAuth([]*gomatrixserverlib.Event{conflictedEvent})
// Find the numeric IDs for the necessary state keys. // Find the numeric IDs for the necessary state keys.
var neededStateKeys []string var neededStateKeys []string
@ -836,7 +836,7 @@ func (v StateResolution) resolveConflictsV2(
// This function helps us to work out whether an event exists in one of the // This function helps us to work out whether an event exists in one of the
// auth sets. // auth sets.
isInAuthList := func(k string, event gomatrixserverlib.Event) bool { isInAuthList := func(k string, event *gomatrixserverlib.Event) bool {
for _, e := range authSets[k] { for _, e := range authSets[k] {
if e.EventID() == event.EventID() { if e.EventID() == event.EventID() {
return true return true
@ -846,7 +846,7 @@ func (v StateResolution) resolveConflictsV2(
} }
// This function works out if an event exists in all of the auth sets. // This function works out if an event exists in all of the auth sets.
isInAllAuthLists := func(event gomatrixserverlib.Event) bool { isInAllAuthLists := func(event *gomatrixserverlib.Event) bool {
found := true found := true
for k := range authSets { for k := range authSets {
found = found && isInAuthList(k, event) found = found && isInAuthList(k, event)
@ -933,7 +933,7 @@ func (v StateResolution) stateKeyTuplesNeeded(stateKeyNIDMap map[string]types.Ev
// Returns an error if there was a problem talking to the database. // Returns an error if there was a problem talking to the database.
func (v StateResolution) loadStateEvents( func (v StateResolution) loadStateEvents(
ctx context.Context, entries []types.StateEntry, ctx context.Context, entries []types.StateEntry,
) ([]gomatrixserverlib.Event, map[string]types.StateEntry, error) { ) ([]*gomatrixserverlib.Event, map[string]types.StateEntry, error) {
eventNIDs := make([]types.EventNID, len(entries)) eventNIDs := make([]types.EventNID, len(entries))
for i := range entries { for i := range entries {
eventNIDs[i] = entries[i].EventNID eventNIDs[i] = entries[i].EventNID
@ -943,7 +943,7 @@ func (v StateResolution) loadStateEvents(
return nil, nil, err return nil, nil, err
} }
eventIDMap := map[string]types.StateEntry{} eventIDMap := map[string]types.StateEntry{}
result := make([]gomatrixserverlib.Event, len(entries)) result := make([]*gomatrixserverlib.Event, len(entries))
for i := range entries { for i := range entries {
event, ok := eventMap(events).lookup(entries[i].EventNID) event, ok := eventMap(events).lookup(entries[i].EventNID)
if !ok { if !ok {

View file

@ -25,7 +25,7 @@ import (
type Database interface { type Database interface {
statedb.RoomStateDatabase statedb.RoomStateDatabase
StoreEvent(ctx context.Context, event gomatrixserverlib.Event, txnAndSessionID *api.TransactionID, authEventNIDs []types.EventNID) (types.RoomNID, types.StateAtEvent, error) StoreEvent(ctx context.Context, event *gomatrixserverlib.Event, txnAndSessionID *api.TransactionID, authEventNIDs []types.EventNID) (types.RoomNID, types.StateAtEvent, error)
StateEntriesForEventIDs(ctx context.Context, eventIDs []string) ([]types.StateEntry, error) StateEntriesForEventIDs(ctx context.Context, eventIDs []string) ([]types.StateEntry, error)
EventStateKeys(ctx context.Context, eventStateKeyNIDs []types.EventStateKeyNID) (map[types.EventStateKeyNID]string, error) EventStateKeys(ctx context.Context, eventStateKeyNIDs []types.EventStateKeyNID) (map[types.EventStateKeyNID]string, error)
EventNIDs(ctx context.Context, eventIDs []string) (map[string]types.EventNID, error) EventNIDs(ctx context.Context, eventIDs []string) (map[string]types.EventNID, error)

View file

@ -50,7 +50,7 @@ func Open(dataSourceName string) (*Database, error) {
// StoreEvent implements input.EventDatabase // StoreEvent implements input.EventDatabase
func (d *Database) StoreEvent( func (d *Database) StoreEvent(
ctx context.Context, event gomatrixserverlib.Event, ctx context.Context, event *gomatrixserverlib.Event,
txnAndSessionID *api.TransactionID, authEventNIDs []types.EventNID, txnAndSessionID *api.TransactionID, authEventNIDs []types.EventNID,
) (types.RoomNID, types.StateAtEvent, error) { ) (types.RoomNID, types.StateAtEvent, error) {
var ( var (
@ -137,7 +137,7 @@ func (d *Database) StoreEvent(
}, nil }, nil
} }
func extractRoomVersionFromCreateEvent(event gomatrixserverlib.Event) ( func extractRoomVersionFromCreateEvent(event *gomatrixserverlib.Event) (
gomatrixserverlib.RoomVersion, error, gomatrixserverlib.RoomVersion, error,
) { ) {
var err error var err error

View file

@ -71,7 +71,7 @@ func Open(dataSourceName string) (*Database, error) {
// StoreEvent implements input.EventDatabase // StoreEvent implements input.EventDatabase
func (d *Database) StoreEvent( func (d *Database) StoreEvent(
ctx context.Context, event gomatrixserverlib.Event, ctx context.Context, event *gomatrixserverlib.Event,
txnAndSessionID *api.TransactionID, authEventNIDs []types.EventNID, txnAndSessionID *api.TransactionID, authEventNIDs []types.EventNID,
) (types.RoomNID, types.StateAtEvent, error) { ) (types.RoomNID, types.StateAtEvent, error) {
var ( var (
@ -166,7 +166,7 @@ func (d *Database) StoreEvent(
}, nil }, nil
} }
func extractRoomVersionFromCreateEvent(event gomatrixserverlib.Event) ( func extractRoomVersionFromCreateEvent(event *gomatrixserverlib.Event) (
gomatrixserverlib.RoomVersion, error, gomatrixserverlib.RoomVersion, error,
) { ) {
var err error var err error

View file

@ -99,7 +99,7 @@ type StateAtEventAndReference struct {
// It is when performing bulk event lookup in the database. // It is when performing bulk event lookup in the database.
type Event struct { type Event struct {
EventNID EventNID EventNID EventNID
gomatrixserverlib.Event *gomatrixserverlib.Event
} }
const ( const (

View file

@ -43,11 +43,11 @@ var roomVersions = map[gomatrixserverlib.RoomVersion]RoomVersionDescription{
Stable: true, Stable: true,
}, },
gomatrixserverlib.RoomVersionV3: RoomVersionDescription{ gomatrixserverlib.RoomVersionV3: RoomVersionDescription{
Supported: false, Supported: true,
Stable: false, Stable: false,
}, },
gomatrixserverlib.RoomVersionV4: RoomVersionDescription{ gomatrixserverlib.RoomVersionV4: RoomVersionDescription{
Supported: false, Supported: true,
Stable: false, Stable: false,
}, },
gomatrixserverlib.RoomVersionV5: RoomVersionDescription{ gomatrixserverlib.RoomVersionV5: RoomVersionDescription{
@ -59,7 +59,7 @@ var roomVersions = map[gomatrixserverlib.RoomVersion]RoomVersionDescription{
// DefaultRoomVersion contains the room version that will, by // DefaultRoomVersion contains the room version that will, by
// default, be used to create new rooms on this server. // default, be used to create new rooms on this server.
func DefaultRoomVersion() gomatrixserverlib.RoomVersion { func DefaultRoomVersion() gomatrixserverlib.RoomVersion {
return gomatrixserverlib.RoomVersionV2 return gomatrixserverlib.RoomVersionV4
} }
// RoomVersions returns a map of all known room versions to this // RoomVersions returns a map of all known room versions to this

View file

@ -98,7 +98,7 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error {
func (s *OutputRoomEventConsumer) onNewRoomEvent( func (s *OutputRoomEventConsumer) onNewRoomEvent(
ctx context.Context, msg api.OutputNewRoomEvent, ctx context.Context, msg api.OutputNewRoomEvent,
) error { ) error {
ev := msg.Event ev := &msg.Event
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"event_id": ev.EventID(), "event_id": ev.EventID(),
"room_id": ev.RoomID(), "room_id": ev.RoomID(),
@ -129,7 +129,7 @@ func (s *OutputRoomEventConsumer) onNewRoomEvent(
pduPos, err := s.db.WriteEvent( pduPos, err := s.db.WriteEvent(
ctx, ctx,
&ev, ev,
addsStateEvents, addsStateEvents,
msg.AddsStateEventIDs, msg.AddsStateEventIDs,
msg.RemovesStateEventIDs, msg.RemovesStateEventIDs,
@ -146,7 +146,7 @@ func (s *OutputRoomEventConsumer) onNewRoomEvent(
}).Panicf("roomserver output log: write event failure") }).Panicf("roomserver output log: write event failure")
return nil return nil
} }
s.notifier.OnNewEvent(&ev, "", nil, types.PaginationToken{PDUPosition: pduPos}) s.notifier.OnNewEvent(ev, "", nil, types.PaginationToken{PDUPosition: pduPos})
return nil return nil
} }
@ -154,7 +154,7 @@ func (s *OutputRoomEventConsumer) onNewRoomEvent(
func (s *OutputRoomEventConsumer) onNewInviteEvent( func (s *OutputRoomEventConsumer) onNewInviteEvent(
ctx context.Context, msg api.OutputNewInviteEvent, ctx context.Context, msg api.OutputNewInviteEvent,
) error { ) error {
pduPos, err := s.db.AddInviteEvent(ctx, msg.Event) pduPos, err := s.db.AddInviteEvent(ctx, &msg.Event)
if err != nil { if err != nil {
// panic rather than continue with an inconsistent database // panic rather than continue with an inconsistent database
log.WithFields(log.Fields{ log.WithFields(log.Fields{
@ -187,8 +187,8 @@ func (s *OutputRoomEventConsumer) onRetireInviteEvent(
// lookupStateEvents looks up the state events that are added by a new event. // lookupStateEvents looks up the state events that are added by a new event.
func (s *OutputRoomEventConsumer) lookupStateEvents( func (s *OutputRoomEventConsumer) lookupStateEvents(
addsStateEventIDs []string, event gomatrixserverlib.HeaderedEvent, addsStateEventIDs []string, event *gomatrixserverlib.HeaderedEvent,
) ([]gomatrixserverlib.HeaderedEvent, error) { ) ([]*gomatrixserverlib.HeaderedEvent, error) {
// Fast path if there aren't any new state events. // Fast path if there aren't any new state events.
if len(addsStateEventIDs) == 0 { if len(addsStateEventIDs) == 0 {
return nil, nil return nil, nil
@ -196,7 +196,7 @@ func (s *OutputRoomEventConsumer) lookupStateEvents(
// Fast path if the only state event added is the event itself. // Fast path if the only state event added is the event itself.
if len(addsStateEventIDs) == 1 && addsStateEventIDs[0] == event.EventID() { if len(addsStateEventIDs) == 1 && addsStateEventIDs[0] == event.EventID() {
return []gomatrixserverlib.HeaderedEvent{event}, nil return []*gomatrixserverlib.HeaderedEvent{event}, nil
} }
// Check if this is re-adding a state events that we previously processed // Check if this is re-adding a state events that we previously processed
@ -230,7 +230,9 @@ func (s *OutputRoomEventConsumer) lookupStateEvents(
return nil, err return nil, err
} }
result = append(result, eventResp.Events...) for i := range eventResp.Events {
result = append(result, &eventResp.Events[i])
}
missing = missingEventsFrom(result, addsStateEventIDs) missing = missingEventsFrom(result, addsStateEventIDs)
if len(missing) != 0 { if len(missing) != 0 {
@ -242,7 +244,7 @@ func (s *OutputRoomEventConsumer) lookupStateEvents(
return result, nil return result, nil
} }
func (s *OutputRoomEventConsumer) updateStateEvent(event gomatrixserverlib.HeaderedEvent) (gomatrixserverlib.HeaderedEvent, error) { func (s *OutputRoomEventConsumer) updateStateEvent(event *gomatrixserverlib.HeaderedEvent) (*gomatrixserverlib.HeaderedEvent, error) {
var stateKey string var stateKey string
if event.StateKey() == nil { if event.StateKey() == nil {
stateKey = "" stateKey = ""
@ -271,7 +273,7 @@ func (s *OutputRoomEventConsumer) updateStateEvent(event gomatrixserverlib.Heade
return event, err return event, err
} }
func missingEventsFrom(events []gomatrixserverlib.HeaderedEvent, required []string) []string { func missingEventsFrom(events []*gomatrixserverlib.HeaderedEvent, required []string) []string {
have := map[string]bool{} have := map[string]bool{}
for _, event := range events { for _, event := range events {
have[event.EventID()] = true have[event.EventID()] = true

View file

@ -189,7 +189,7 @@ func (r *messagesReq) retrieveEvents() (
return return
} }
var events []gomatrixserverlib.HeaderedEvent var events []*gomatrixserverlib.HeaderedEvent
// There can be two reasons for streamEvents to be empty: either we've // There can be two reasons for streamEvents to be empty: either we've
// reached the oldest event in the room (or the most recent one, depending // reached the oldest event in the room (or the most recent one, depending
@ -215,12 +215,12 @@ func (r *messagesReq) retrieveEvents() (
sort.SliceStable(events, func(i int, j int) bool { sort.SliceStable(events, func(i int, j int) bool {
// Backward ordering is antichronological (latest event to oldest // Backward ordering is antichronological (latest event to oldest
// one). // one).
return sortEvents(&(events[j]), &(events[i])) return sortEvents(events[j], events[i])
}) })
} else { } else {
sort.SliceStable(events, func(i int, j int) bool { sort.SliceStable(events, func(i int, j int) bool {
// Forward ordering is chronological (oldest event to latest one). // Forward ordering is chronological (oldest event to latest one).
return sortEvents(&(events[i]), &(events[j])) return sortEvents(events[i], events[j])
}) })
} }
@ -281,7 +281,7 @@ func (r *messagesReq) retrieveEvents() (
// Returns an error if there was an issue talking with the database or // Returns an error if there was an issue talking with the database or
// backfilling. // backfilling.
func (r *messagesReq) handleEmptyEventsSlice() ( func (r *messagesReq) handleEmptyEventsSlice() (
events []gomatrixserverlib.HeaderedEvent, err error, events []*gomatrixserverlib.HeaderedEvent, err error,
) { ) {
backwardExtremities, err := r.db.BackwardExtremitiesForRoom(r.ctx, r.roomID) backwardExtremities, err := r.db.BackwardExtremitiesForRoom(r.ctx, r.roomID)
@ -295,7 +295,7 @@ func (r *messagesReq) handleEmptyEventsSlice() (
} else { } else {
// If not, it means the slice was empty because we reached the room's // If not, it means the slice was empty because we reached the room's
// creation, so return an empty slice. // creation, so return an empty slice.
events = []gomatrixserverlib.HeaderedEvent{} events = []*gomatrixserverlib.HeaderedEvent{}
} }
return return
@ -307,7 +307,7 @@ func (r *messagesReq) handleEmptyEventsSlice() (
// through backfilling if needed. // through backfilling if needed.
// Returns an error if there was an issue while backfilling. // Returns an error if there was an issue while backfilling.
func (r *messagesReq) handleNonEmptyEventsSlice(streamEvents []types.StreamEvent) ( func (r *messagesReq) handleNonEmptyEventsSlice(streamEvents []types.StreamEvent) (
events []gomatrixserverlib.HeaderedEvent, err error, events []*gomatrixserverlib.HeaderedEvent, err error,
) { ) {
// Check if we have enough events. // Check if we have enough events.
isSetLargeEnough := len(streamEvents) >= r.limit isSetLargeEnough := len(streamEvents) >= r.limit
@ -335,7 +335,7 @@ func (r *messagesReq) handleNonEmptyEventsSlice(streamEvents []types.StreamEvent
// Backfill is needed if we've reached a backward extremity and need more // Backfill is needed if we've reached a backward extremity and need more
// events. It's only needed if the direction is backward. // events. It's only needed if the direction is backward.
if len(backwardExtremities) > 0 && !isSetLargeEnough && r.backwardOrdering { if len(backwardExtremities) > 0 && !isSetLargeEnough && r.backwardOrdering {
var pdus []gomatrixserverlib.HeaderedEvent var pdus []*gomatrixserverlib.HeaderedEvent
// Only ask the remote server for enough events to reach the limit. // Only ask the remote server for enough events to reach the limit.
pdus, err = r.backfill(backwardExtremities, r.limit-len(streamEvents)) pdus, err = r.backfill(backwardExtremities, r.limit-len(streamEvents))
if err != nil { if err != nil {
@ -361,7 +361,7 @@ func (r *messagesReq) handleNonEmptyEventsSlice(streamEvents []types.StreamEvent
// event, or if there is no remote homeserver to contact. // event, or if there is no remote homeserver to contact.
// Returns an error if there was an issue with retrieving the list of servers in // Returns an error if there was an issue with retrieving the list of servers in
// the room or sending the request. // the room or sending the request.
func (r *messagesReq) backfill(fromEventIDs []string, limit int) ([]gomatrixserverlib.HeaderedEvent, error) { func (r *messagesReq) backfill(fromEventIDs []string, limit int) ([]*gomatrixserverlib.HeaderedEvent, error) {
verReq := api.QueryRoomVersionForRoomRequest{RoomID: r.roomID} verReq := api.QueryRoomVersionForRoomRequest{RoomID: r.roomID}
verRes := api.QueryRoomVersionForRoomResponse{} verRes := api.QueryRoomVersionForRoomResponse{}
if err := r.queryAPI.QueryRoomVersionForRoom(r.ctx, &verReq, &verRes); err != nil { if err := r.queryAPI.QueryRoomVersionForRoom(r.ctx, &verReq, &verRes); err != nil {
@ -373,7 +373,7 @@ func (r *messagesReq) backfill(fromEventIDs []string, limit int) ([]gomatrixserv
return nil, fmt.Errorf("Cannot find server to backfill from: %w", err) return nil, fmt.Errorf("Cannot find server to backfill from: %w", err)
} }
headered := make([]gomatrixserverlib.HeaderedEvent, 0) headered := make([]*gomatrixserverlib.HeaderedEvent, 0)
// If the roomserver responded with at least one server that isn't us, // If the roomserver responded with at least one server that isn't us,
// send it a request for backfill. // send it a request for backfill.
@ -390,7 +390,8 @@ func (r *messagesReq) backfill(fromEventIDs []string, limit int) ([]gomatrixserv
if e != nil { if e != nil {
continue continue
} }
headered = append(headered, event.Headered(verRes.RoomVersion)) headeredEvent := event.Headered(verRes.RoomVersion)
headered = append(headered, &headeredEvent)
} }
util.GetLogger(r.ctx).WithField("server", srvToBackfillFrom).WithField("new_events", len(headered)).Info("Storing new events from backfill") util.GetLogger(r.ctx).WithField("server", srvToBackfillFrom).WithField("new_events", len(headered)).Info("Storing new events from backfill")
@ -399,8 +400,8 @@ func (r *messagesReq) backfill(fromEventIDs []string, limit int) ([]gomatrixserv
for i := range headered { for i := range headered {
if _, err = r.db.WriteEvent( if _, err = r.db.WriteEvent(
r.ctx, r.ctx,
&headered[i], headered[i],
[]gomatrixserverlib.HeaderedEvent{}, []*gomatrixserverlib.HeaderedEvent{},
[]string{}, []string{},
[]string{}, []string{},
nil, true, nil, true,

View file

@ -57,7 +57,7 @@ func OnIncomingStateRequest(req *http.Request, db storage.Database, roomID strin
for _, event := range stateEvents { for _, event := range stateEvents {
stateEvent := stateEventInStateResp{ stateEvent := stateEventInStateResp{
ClientEvent: gomatrixserverlib.HeaderedToClientEvents( ClientEvent: gomatrixserverlib.HeaderedToClientEvents(
[]gomatrixserverlib.HeaderedEvent{event}, gomatrixserverlib.FormatAll, []*gomatrixserverlib.HeaderedEvent{event}, gomatrixserverlib.FormatAll,
)[0], )[0],
} }
var prevEventRef types.PrevEventRef var prevEventRef types.PrevEventRef
@ -115,7 +115,7 @@ func OnIncomingStateTypeRequest(req *http.Request, db storage.Database, roomID s
} }
stateEvent := stateEventInStateResp{ stateEvent := stateEventInStateResp{
ClientEvent: gomatrixserverlib.HeaderedToClientEvent(*event, gomatrixserverlib.FormatAll), ClientEvent: gomatrixserverlib.HeaderedToClientEvent(event, gomatrixserverlib.FormatAll),
} }
return util.JSONResponse{ return util.JSONResponse{

View file

@ -29,16 +29,16 @@ import (
type Database interface { type Database interface {
common.PartitionStorer common.PartitionStorer
AllJoinedUsersInRooms(ctx context.Context) (map[string][]string, error) AllJoinedUsersInRooms(ctx context.Context) (map[string][]string, error)
Events(ctx context.Context, eventIDs []string) ([]gomatrixserverlib.HeaderedEvent, error) Events(ctx context.Context, eventIDs []string) ([]*gomatrixserverlib.HeaderedEvent, error)
WriteEvent(context.Context, *gomatrixserverlib.HeaderedEvent, []gomatrixserverlib.HeaderedEvent, []string, []string, *api.TransactionID, bool) (types.StreamPosition, error) WriteEvent(context.Context, *gomatrixserverlib.HeaderedEvent, []*gomatrixserverlib.HeaderedEvent, []string, []string, *api.TransactionID, bool) (types.StreamPosition, error)
GetStateEvent(ctx context.Context, roomID, evType, stateKey string) (*gomatrixserverlib.HeaderedEvent, error) GetStateEvent(ctx context.Context, roomID, evType, stateKey string) (*gomatrixserverlib.HeaderedEvent, error)
GetStateEventsForRoom(ctx context.Context, roomID string, stateFilterPart *gomatrixserverlib.StateFilter) (stateEvents []gomatrixserverlib.HeaderedEvent, err error) GetStateEventsForRoom(ctx context.Context, roomID string, stateFilterPart *gomatrixserverlib.StateFilter) (stateEvents []*gomatrixserverlib.HeaderedEvent, err error)
SyncPosition(ctx context.Context) (types.PaginationToken, error) SyncPosition(ctx context.Context) (types.PaginationToken, error)
IncrementalSync(ctx context.Context, device authtypes.Device, fromPos, toPos types.PaginationToken, numRecentEventsPerRoom int, wantFullState bool) (*types.Response, error) IncrementalSync(ctx context.Context, device authtypes.Device, fromPos, toPos types.PaginationToken, numRecentEventsPerRoom int, wantFullState bool) (*types.Response, error)
CompleteSync(ctx context.Context, userID string, numRecentEventsPerRoom int) (*types.Response, error) CompleteSync(ctx context.Context, userID string, numRecentEventsPerRoom int) (*types.Response, error)
GetAccountDataInRange(ctx context.Context, userID string, oldPos, newPos types.StreamPosition, accountDataFilterPart *gomatrixserverlib.EventFilter) (map[string][]string, error) GetAccountDataInRange(ctx context.Context, userID string, oldPos, newPos types.StreamPosition, accountDataFilterPart *gomatrixserverlib.EventFilter) (map[string][]string, error)
UpsertAccountData(ctx context.Context, userID, roomID, dataType string) (types.StreamPosition, error) UpsertAccountData(ctx context.Context, userID, roomID, dataType string) (types.StreamPosition, error)
AddInviteEvent(ctx context.Context, inviteEvent gomatrixserverlib.HeaderedEvent) (types.StreamPosition, error) AddInviteEvent(ctx context.Context, inviteEvent *gomatrixserverlib.HeaderedEvent) (types.StreamPosition, error)
RetireInviteEvent(ctx context.Context, inviteEventID string) error RetireInviteEvent(ctx context.Context, inviteEventID string) error
SetTypingTimeoutCallback(fn cache.TimeoutCallbackFn) SetTypingTimeoutCallback(fn cache.TimeoutCallbackFn)
AddTypingUser(userID, roomID string, expireTime *time.Time) types.StreamPosition AddTypingUser(userID, roomID string, expireTime *time.Time) types.StreamPosition
@ -48,6 +48,6 @@ type Database interface {
EventsAtTopologicalPosition(ctx context.Context, roomID string, pos types.StreamPosition) ([]types.StreamEvent, error) EventsAtTopologicalPosition(ctx context.Context, roomID string, pos types.StreamPosition) ([]types.StreamEvent, error)
BackwardExtremitiesForRoom(ctx context.Context, roomID string) (backwardExtremities []string, err error) BackwardExtremitiesForRoom(ctx context.Context, roomID string) (backwardExtremities []string, err error)
MaxTopologicalPosition(ctx context.Context, roomID string) (types.StreamPosition, error) MaxTopologicalPosition(ctx context.Context, roomID string) (types.StreamPosition, error)
StreamEventsToEvents(device *authtypes.Device, in []types.StreamEvent) []gomatrixserverlib.HeaderedEvent StreamEventsToEvents(device *authtypes.Device, in []types.StreamEvent) []*gomatrixserverlib.HeaderedEvent
SyncStreamPosition(ctx context.Context) (types.StreamPosition, error) SyncStreamPosition(ctx context.Context) (types.StreamPosition, error)
} }

View file

@ -185,7 +185,7 @@ func (s *currentRoomStateStatements) selectRoomIDsWithMembership(
func (s *currentRoomStateStatements) selectCurrentState( func (s *currentRoomStateStatements) selectCurrentState(
ctx context.Context, txn *sql.Tx, roomID string, ctx context.Context, txn *sql.Tx, roomID string,
stateFilter *gomatrixserverlib.StateFilter, stateFilter *gomatrixserverlib.StateFilter,
) ([]gomatrixserverlib.HeaderedEvent, error) { ) ([]*gomatrixserverlib.HeaderedEvent, error) {
stmt := common.TxStmt(txn, s.selectCurrentStateStmt) stmt := common.TxStmt(txn, s.selectCurrentStateStmt)
rows, err := stmt.QueryContext(ctx, roomID, rows, err := stmt.QueryContext(ctx, roomID,
pq.StringArray(stateFilter.Senders), pq.StringArray(stateFilter.Senders),
@ -213,7 +213,7 @@ func (s *currentRoomStateStatements) deleteRoomStateByEventID(
func (s *currentRoomStateStatements) upsertRoomState( func (s *currentRoomStateStatements) upsertRoomState(
ctx context.Context, txn *sql.Tx, ctx context.Context, txn *sql.Tx,
event gomatrixserverlib.HeaderedEvent, membership *string, addedAt types.StreamPosition, event *gomatrixserverlib.HeaderedEvent, membership *string, addedAt types.StreamPosition,
) error { ) error {
// Parse content as JSON and search for an "url" key // Parse content as JSON and search for an "url" key
containsURL := false containsURL := false
@ -257,8 +257,8 @@ func (s *currentRoomStateStatements) selectEventsWithEventIDs(
return rowsToStreamEvents(rows) return rowsToStreamEvents(rows)
} }
func rowsToEvents(rows *sql.Rows) ([]gomatrixserverlib.HeaderedEvent, error) { func rowsToEvents(rows *sql.Rows) ([]*gomatrixserverlib.HeaderedEvent, error) {
result := []gomatrixserverlib.HeaderedEvent{} result := []*gomatrixserverlib.HeaderedEvent{}
for rows.Next() { for rows.Next() {
var eventBytes []byte var eventBytes []byte
if err := rows.Scan(&eventBytes); err != nil { if err := rows.Scan(&eventBytes); err != nil {
@ -269,7 +269,7 @@ func rowsToEvents(rows *sql.Rows) ([]gomatrixserverlib.HeaderedEvent, error) {
if err := json.Unmarshal(eventBytes, &ev); err != nil { if err := json.Unmarshal(eventBytes, &ev); err != nil {
return nil, err return nil, err
} }
result = append(result, ev) result = append(result, &ev)
} }
return result, rows.Err() return result, rows.Err()
} }

View file

@ -87,7 +87,7 @@ func (s *inviteEventsStatements) prepare(db *sql.DB) (err error) {
} }
func (s *inviteEventsStatements) insertInviteEvent( func (s *inviteEventsStatements) insertInviteEvent(
ctx context.Context, inviteEvent gomatrixserverlib.HeaderedEvent, ctx context.Context, inviteEvent *gomatrixserverlib.HeaderedEvent,
) (streamPos types.StreamPosition, err error) { ) (streamPos types.StreamPosition, err error) {
var headeredJSON []byte var headeredJSON []byte
headeredJSON, err = json.Marshal(inviteEvent) headeredJSON, err = json.Marshal(inviteEvent)

View file

@ -221,7 +221,7 @@ func (s *outputRoomEventsStatements) selectStateInRange(
stateNeeded[ev.RoomID()] = needSet stateNeeded[ev.RoomID()] = needSet
eventIDToEvent[ev.EventID()] = types.StreamEvent{ eventIDToEvent[ev.EventID()] = types.StreamEvent{
HeaderedEvent: ev, HeaderedEvent: &ev,
StreamPosition: streamPos, StreamPosition: streamPos,
ExcludeFromSync: excludeFromSync, ExcludeFromSync: excludeFromSync,
} }
@ -392,7 +392,7 @@ func rowsToStreamEvents(rows *sql.Rows) ([]types.StreamEvent, error) {
} }
result = append(result, types.StreamEvent{ result = append(result, types.StreamEvent{
HeaderedEvent: ev, HeaderedEvent: &ev,
StreamPosition: streamPos, StreamPosition: streamPos,
TransactionID: transactionID, TransactionID: transactionID,
ExcludeFromSync: excludeFromSync, ExcludeFromSync: excludeFromSync,

View file

@ -37,7 +37,7 @@ import (
type stateDelta struct { type stateDelta struct {
roomID string roomID string
stateEvents []gomatrixserverlib.HeaderedEvent stateEvents []*gomatrixserverlib.HeaderedEvent
membership string membership string
// The PDU stream position of the latest membership event for this user, if applicable. // The PDU stream position of the latest membership event for this user, if applicable.
// Can be 0 if there is no membership event in this delta. // Can be 0 if there is no membership event in this delta.
@ -100,7 +100,7 @@ func (d *SyncServerDatasource) AllJoinedUsersInRooms(ctx context.Context) (map[s
// If an event is not found in the database then it will be omitted from the list. // If an event is not found in the database then it will be omitted from the list.
// Returns an error if there was a problem talking with the database. // Returns an error if there was a problem talking with the database.
// Does not include any transaction IDs in the returned events. // Does not include any transaction IDs in the returned events.
func (d *SyncServerDatasource) Events(ctx context.Context, eventIDs []string) ([]gomatrixserverlib.HeaderedEvent, error) { func (d *SyncServerDatasource) Events(ctx context.Context, eventIDs []string) ([]*gomatrixserverlib.HeaderedEvent, error) {
streamEvents, err := d.events.selectEvents(ctx, nil, eventIDs) streamEvents, err := d.events.selectEvents(ctx, nil, eventIDs)
if err != nil { if err != nil {
return nil, err return nil, err
@ -151,7 +151,7 @@ func (d *SyncServerDatasource) handleBackwardExtremities(ctx context.Context, tx
func (d *SyncServerDatasource) WriteEvent( func (d *SyncServerDatasource) WriteEvent(
ctx context.Context, ctx context.Context,
ev *gomatrixserverlib.HeaderedEvent, ev *gomatrixserverlib.HeaderedEvent,
addStateEvents []gomatrixserverlib.HeaderedEvent, addStateEvents []*gomatrixserverlib.HeaderedEvent,
addStateEventIDs, removeStateEventIDs []string, addStateEventIDs, removeStateEventIDs []string,
transactionID *api.TransactionID, excludeFromSync bool, transactionID *api.TransactionID, excludeFromSync bool,
) (pduPosition types.StreamPosition, returnErr error) { ) (pduPosition types.StreamPosition, returnErr error) {
@ -187,7 +187,7 @@ func (d *SyncServerDatasource) WriteEvent(
func (d *SyncServerDatasource) updateRoomState( func (d *SyncServerDatasource) updateRoomState(
ctx context.Context, txn *sql.Tx, ctx context.Context, txn *sql.Tx,
removedEventIDs []string, removedEventIDs []string,
addedEvents []gomatrixserverlib.HeaderedEvent, addedEvents []*gomatrixserverlib.HeaderedEvent,
pduPosition types.StreamPosition, pduPosition types.StreamPosition,
) error { ) error {
// remove first, then add, as we do not ever delete state, but do replace state which is a remove followed by an add. // remove first, then add, as we do not ever delete state, but do replace state which is a remove followed by an add.
@ -232,7 +232,7 @@ func (d *SyncServerDatasource) GetStateEvent(
// Returns an error if there was an issue with the retrieval. // Returns an error if there was an issue with the retrieval.
func (d *SyncServerDatasource) GetStateEventsForRoom( func (d *SyncServerDatasource) GetStateEventsForRoom(
ctx context.Context, roomID string, stateFilter *gomatrixserverlib.StateFilter, ctx context.Context, roomID string, stateFilter *gomatrixserverlib.StateFilter,
) (stateEvents []gomatrixserverlib.HeaderedEvent, err error) { ) (stateEvents []*gomatrixserverlib.HeaderedEvent, err error) {
err = common.WithTransaction(d.db, func(txn *sql.Tx) error { err = common.WithTransaction(d.db, func(txn *sql.Tx) error {
stateEvents, err = d.roomstate.selectCurrentState(ctx, txn, roomID, stateFilter) stateEvents, err = d.roomstate.selectCurrentState(ctx, txn, roomID, stateFilter)
return err return err
@ -594,7 +594,7 @@ func (d *SyncServerDatasource) getResponseWithPDUsForCompleteSync(
// Build up a /sync response. Add joined rooms. // Build up a /sync response. Add joined rooms.
for _, roomID := range joinedRoomIDs { for _, roomID := range joinedRoomIDs {
var stateEvents []gomatrixserverlib.HeaderedEvent var stateEvents []*gomatrixserverlib.HeaderedEvent
stateEvents, err = d.roomstate.selectCurrentState(ctx, txn, roomID, &stateFilter) stateEvents, err = d.roomstate.selectCurrentState(ctx, txn, roomID, &stateFilter)
if err != nil { if err != nil {
return return
@ -702,7 +702,7 @@ func (d *SyncServerDatasource) UpsertAccountData(
// If the invite was successfully stored this returns the stream ID it was stored at. // If the invite was successfully stored this returns the stream ID it was stored at.
// Returns an error if there was a problem communicating with the database. // Returns an error if there was a problem communicating with the database.
func (d *SyncServerDatasource) AddInviteEvent( func (d *SyncServerDatasource) AddInviteEvent(
ctx context.Context, inviteEvent gomatrixserverlib.HeaderedEvent, ctx context.Context, inviteEvent *gomatrixserverlib.HeaderedEvent,
) (types.StreamPosition, error) { ) (types.StreamPosition, error) {
return d.invites.insertInviteEvent(ctx, inviteEvent) return d.invites.insertInviteEvent(ctx, inviteEvent)
} }
@ -753,7 +753,7 @@ func (d *SyncServerDatasource) addInvitesToResponse(
for roomID, inviteEvent := range invites { for roomID, inviteEvent := range invites {
ir := types.NewInviteResponse() ir := types.NewInviteResponse()
ir.InviteState.Events = gomatrixserverlib.ToClientEvents( ir.InviteState.Events = gomatrixserverlib.ToClientEvents(
[]gomatrixserverlib.Event{inviteEvent.Event}, gomatrixserverlib.FormatSync, []*gomatrixserverlib.Event{inviteEvent.Event}, gomatrixserverlib.FormatSync,
) )
// TODO: add the invite state from the invite event. // TODO: add the invite state from the invite event.
res.Rooms.Invite[roomID] = *ir res.Rooms.Invite[roomID] = *ir
@ -960,7 +960,7 @@ func (d *SyncServerDatasource) getStateDeltas(
// dupe join events will result in the entire room state coming down to the client again. This is added in // dupe join events will result in the entire room state coming down to the client again. This is added in
// the 'state' part of the response though, so is transparent modulo bandwidth concerns as it is not added to // the 'state' part of the response though, so is transparent modulo bandwidth concerns as it is not added to
// the timeline. // the timeline.
if membership := getMembershipFromEvent(&ev.Event, userID); membership != "" { if membership := getMembershipFromEvent(ev.Event, userID); membership != "" {
if membership == gomatrixserverlib.Join { if membership == gomatrixserverlib.Join {
// send full room state down instead of a delta // send full room state down instead of a delta
var s []types.StreamEvent var s []types.StreamEvent
@ -1041,7 +1041,7 @@ func (d *SyncServerDatasource) getStateDeltasForFullStateSync(
for roomID, stateStreamEvents := range state { for roomID, stateStreamEvents := range state {
for _, ev := range stateStreamEvents { for _, ev := range stateStreamEvents {
if membership := getMembershipFromEvent(&ev.Event, userID); membership != "" { if membership := getMembershipFromEvent(ev.Event, userID); membership != "" {
if membership != gomatrixserverlib.Join { // We've already added full state for all joined rooms above. if membership != gomatrixserverlib.Join { // We've already added full state for all joined rooms above.
deltas = append(deltas, stateDelta{ deltas = append(deltas, stateDelta{
membership: membership, membership: membership,
@ -1077,8 +1077,8 @@ func (d *SyncServerDatasource) currentStateStreamEventsForRoom(
// StreamEventsToEvents converts streamEvent to Event. If device is non-nil and // StreamEventsToEvents converts streamEvent to Event. If device is non-nil and
// matches the streamevent.transactionID device then the transaction ID gets // matches the streamevent.transactionID device then the transaction ID gets
// added to the unsigned section of the output event. // added to the unsigned section of the output event.
func (d *SyncServerDatasource) StreamEventsToEvents(device *authtypes.Device, in []types.StreamEvent) []gomatrixserverlib.HeaderedEvent { func (d *SyncServerDatasource) StreamEventsToEvents(device *authtypes.Device, in []types.StreamEvent) []*gomatrixserverlib.HeaderedEvent {
out := make([]gomatrixserverlib.HeaderedEvent, len(in)) out := make([]*gomatrixserverlib.HeaderedEvent, len(in))
for i := 0; i < len(in); i++ { for i := 0; i < len(in); i++ {
out[i] = in[i].HeaderedEvent out[i] = in[i].HeaderedEvent
if device != nil && in[i].TransactionID != nil { if device != nil && in[i].TransactionID != nil {
@ -1100,7 +1100,7 @@ func (d *SyncServerDatasource) StreamEventsToEvents(device *authtypes.Device, in
// There may be some overlap where events in stateEvents are already in recentEvents, so filter // There may be some overlap where events in stateEvents are already in recentEvents, so filter
// them out so we don't include them twice in the /sync response. They should be in recentEvents // them out so we don't include them twice in the /sync response. They should be in recentEvents
// only, so clients get to the correct state once they have rolled forward. // only, so clients get to the correct state once they have rolled forward.
func removeDuplicates(stateEvents, recentEvents []gomatrixserverlib.HeaderedEvent) []gomatrixserverlib.HeaderedEvent { func removeDuplicates(stateEvents, recentEvents []*gomatrixserverlib.HeaderedEvent) []*gomatrixserverlib.HeaderedEvent {
for _, recentEv := range recentEvents { for _, recentEv := range recentEvents {
if recentEv.StateKey() == nil { if recentEv.StateKey() == nil {
continue // not a state event continue // not a state event

View file

@ -171,7 +171,7 @@ func (s *currentRoomStateStatements) selectRoomIDsWithMembership(
func (s *currentRoomStateStatements) selectCurrentState( func (s *currentRoomStateStatements) selectCurrentState(
ctx context.Context, txn *sql.Tx, roomID string, ctx context.Context, txn *sql.Tx, roomID string,
stateFilterPart *gomatrixserverlib.StateFilter, stateFilterPart *gomatrixserverlib.StateFilter,
) ([]gomatrixserverlib.HeaderedEvent, error) { ) ([]*gomatrixserverlib.HeaderedEvent, error) {
stmt := common.TxStmt(txn, s.selectCurrentStateStmt) stmt := common.TxStmt(txn, s.selectCurrentStateStmt)
rows, err := stmt.QueryContext(ctx, roomID, rows, err := stmt.QueryContext(ctx, roomID,
nil, // FIXME: pq.StringArray(stateFilterPart.Senders), nil, // FIXME: pq.StringArray(stateFilterPart.Senders),
@ -199,7 +199,7 @@ func (s *currentRoomStateStatements) deleteRoomStateByEventID(
func (s *currentRoomStateStatements) upsertRoomState( func (s *currentRoomStateStatements) upsertRoomState(
ctx context.Context, txn *sql.Tx, ctx context.Context, txn *sql.Tx,
event gomatrixserverlib.HeaderedEvent, membership *string, addedAt types.StreamPosition, event *gomatrixserverlib.HeaderedEvent, membership *string, addedAt types.StreamPosition,
) error { ) error {
// Parse content as JSON and search for an "url" key // Parse content as JSON and search for an "url" key
containsURL := false containsURL := false
@ -247,15 +247,15 @@ func (s *currentRoomStateStatements) selectEventsWithEventIDs(
return rowsToStreamEvents(rows) return rowsToStreamEvents(rows)
} }
func rowsToEvents(rows *sql.Rows) ([]gomatrixserverlib.HeaderedEvent, error) { func rowsToEvents(rows *sql.Rows) ([]*gomatrixserverlib.HeaderedEvent, error) {
result := []gomatrixserverlib.HeaderedEvent{} result := []*gomatrixserverlib.HeaderedEvent{}
for rows.Next() { for rows.Next() {
var eventBytes []byte var eventBytes []byte
if err := rows.Scan(&eventBytes); err != nil { if err := rows.Scan(&eventBytes); err != nil {
return nil, err return nil, err
} }
// TODO: Handle redacted events // TODO: Handle redacted events
var ev gomatrixserverlib.HeaderedEvent var ev *gomatrixserverlib.HeaderedEvent
if err := json.Unmarshal(eventBytes, &ev); err != nil { if err := json.Unmarshal(eventBytes, &ev); err != nil {
return nil, err return nil, err
} }

View file

@ -84,7 +84,7 @@ func (s *inviteEventsStatements) prepare(db *sql.DB, streamID *streamIDStatement
} }
func (s *inviteEventsStatements) insertInviteEvent( func (s *inviteEventsStatements) insertInviteEvent(
ctx context.Context, txn *sql.Tx, inviteEvent gomatrixserverlib.HeaderedEvent, streamPos types.StreamPosition, ctx context.Context, txn *sql.Tx, inviteEvent *gomatrixserverlib.HeaderedEvent, streamPos types.StreamPosition,
) (err error) { ) (err error) {
var headeredJSON []byte var headeredJSON []byte
headeredJSON, err = json.Marshal(inviteEvent) headeredJSON, err = json.Marshal(inviteEvent)
@ -114,14 +114,14 @@ func (s *inviteEventsStatements) deleteInviteEvent(
// active invites for the target user ID in the supplied range. // active invites for the target user ID in the supplied range.
func (s *inviteEventsStatements) selectInviteEventsInRange( func (s *inviteEventsStatements) selectInviteEventsInRange(
ctx context.Context, txn *sql.Tx, targetUserID string, startPos, endPos types.StreamPosition, ctx context.Context, txn *sql.Tx, targetUserID string, startPos, endPos types.StreamPosition,
) (map[string]gomatrixserverlib.HeaderedEvent, error) { ) (map[string]*gomatrixserverlib.HeaderedEvent, error) {
stmt := common.TxStmt(txn, s.selectInviteEventsInRangeStmt) stmt := common.TxStmt(txn, s.selectInviteEventsInRangeStmt)
rows, err := stmt.QueryContext(ctx, targetUserID, startPos, endPos) rows, err := stmt.QueryContext(ctx, targetUserID, startPos, endPos)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer common.CloseAndLogIfError(ctx, rows, "selectInviteEventsInRange: rows.close() failed") defer common.CloseAndLogIfError(ctx, rows, "selectInviteEventsInRange: rows.close() failed")
result := map[string]gomatrixserverlib.HeaderedEvent{} result := map[string]*gomatrixserverlib.HeaderedEvent{}
for rows.Next() { for rows.Next() {
var ( var (
roomID string roomID string
@ -136,7 +136,7 @@ func (s *inviteEventsStatements) selectInviteEventsInRange(
return nil, err return nil, err
} }
result[roomID] = event result[roomID] = &event
} }
return result, nil return result, nil
} }

View file

@ -217,7 +217,7 @@ func (s *outputRoomEventsStatements) selectStateInRange(
stateNeeded[ev.RoomID()] = needSet stateNeeded[ev.RoomID()] = needSet
eventIDToEvent[ev.EventID()] = types.StreamEvent{ eventIDToEvent[ev.EventID()] = types.StreamEvent{
HeaderedEvent: ev, HeaderedEvent: &ev,
StreamPosition: streamPos, StreamPosition: streamPos,
ExcludeFromSync: excludeFromSync, ExcludeFromSync: excludeFromSync,
} }
@ -411,7 +411,7 @@ func rowsToStreamEvents(rows *sql.Rows) ([]types.StreamEvent, error) {
} }
result = append(result, types.StreamEvent{ result = append(result, types.StreamEvent{
HeaderedEvent: ev, HeaderedEvent: &ev,
StreamPosition: streamPos, StreamPosition: streamPos,
TransactionID: transactionID, TransactionID: transactionID,
ExcludeFromSync: excludeFromSync, ExcludeFromSync: excludeFromSync,

View file

@ -40,7 +40,7 @@ import (
type stateDelta struct { type stateDelta struct {
roomID string roomID string
stateEvents []gomatrixserverlib.HeaderedEvent stateEvents []*gomatrixserverlib.HeaderedEvent
membership string membership string
// The PDU stream position of the latest membership event for this user, if applicable. // The PDU stream position of the latest membership event for this user, if applicable.
// Can be 0 if there is no membership event in this delta. // Can be 0 if there is no membership event in this delta.
@ -126,7 +126,7 @@ func (d *SyncServerDatasource) AllJoinedUsersInRooms(ctx context.Context) (map[s
// If an event is not found in the database then it will be omitted from the list. // If an event is not found in the database then it will be omitted from the list.
// Returns an error if there was a problem talking with the database. // Returns an error if there was a problem talking with the database.
// Does not include any transaction IDs in the returned events. // Does not include any transaction IDs in the returned events.
func (d *SyncServerDatasource) Events(ctx context.Context, eventIDs []string) ([]gomatrixserverlib.HeaderedEvent, error) { func (d *SyncServerDatasource) Events(ctx context.Context, eventIDs []string) ([]*gomatrixserverlib.HeaderedEvent, error) {
streamEvents, err := d.events.selectEvents(ctx, nil, eventIDs) streamEvents, err := d.events.selectEvents(ctx, nil, eventIDs)
if err != nil { if err != nil {
return nil, err return nil, err
@ -177,7 +177,7 @@ func (d *SyncServerDatasource) handleBackwardExtremities(ctx context.Context, tx
func (d *SyncServerDatasource) WriteEvent( func (d *SyncServerDatasource) WriteEvent(
ctx context.Context, ctx context.Context,
ev *gomatrixserverlib.HeaderedEvent, ev *gomatrixserverlib.HeaderedEvent,
addStateEvents []gomatrixserverlib.HeaderedEvent, addStateEvents []*gomatrixserverlib.HeaderedEvent,
addStateEventIDs, removeStateEventIDs []string, addStateEventIDs, removeStateEventIDs []string,
transactionID *api.TransactionID, excludeFromSync bool, transactionID *api.TransactionID, excludeFromSync bool,
) (pduPosition types.StreamPosition, returnErr error) { ) (pduPosition types.StreamPosition, returnErr error) {
@ -213,7 +213,7 @@ func (d *SyncServerDatasource) WriteEvent(
func (d *SyncServerDatasource) updateRoomState( func (d *SyncServerDatasource) updateRoomState(
ctx context.Context, txn *sql.Tx, ctx context.Context, txn *sql.Tx,
removedEventIDs []string, removedEventIDs []string,
addedEvents []gomatrixserverlib.HeaderedEvent, addedEvents []*gomatrixserverlib.HeaderedEvent,
pduPosition types.StreamPosition, pduPosition types.StreamPosition,
) error { ) error {
// remove first, then add, as we do not ever delete state, but do replace state which is a remove followed by an add. // remove first, then add, as we do not ever delete state, but do replace state which is a remove followed by an add.
@ -258,7 +258,7 @@ func (d *SyncServerDatasource) GetStateEvent(
// Returns an error if there was an issue with the retrieval. // Returns an error if there was an issue with the retrieval.
func (d *SyncServerDatasource) GetStateEventsForRoom( func (d *SyncServerDatasource) GetStateEventsForRoom(
ctx context.Context, roomID string, stateFilterPart *gomatrixserverlib.StateFilter, ctx context.Context, roomID string, stateFilterPart *gomatrixserverlib.StateFilter,
) (stateEvents []gomatrixserverlib.HeaderedEvent, err error) { ) (stateEvents []*gomatrixserverlib.HeaderedEvent, err error) {
err = common.WithTransaction(d.db, func(txn *sql.Tx) error { err = common.WithTransaction(d.db, func(txn *sql.Tx) error {
stateEvents, err = d.roomstate.selectCurrentState(ctx, txn, roomID, stateFilterPart) stateEvents, err = d.roomstate.selectCurrentState(ctx, txn, roomID, stateFilterPart)
return err return err
@ -628,7 +628,7 @@ func (d *SyncServerDatasource) getResponseWithPDUsForCompleteSync(
// Build up a /sync response. Add joined rooms. // Build up a /sync response. Add joined rooms.
for _, roomID := range joinedRoomIDs { for _, roomID := range joinedRoomIDs {
var stateEvents []gomatrixserverlib.HeaderedEvent var stateEvents []*gomatrixserverlib.HeaderedEvent
stateEvents, err = d.roomstate.selectCurrentState(ctx, txn, roomID, &stateFilterPart) stateEvents, err = d.roomstate.selectCurrentState(ctx, txn, roomID, &stateFilterPart)
if err != nil { if err != nil {
return return
@ -742,7 +742,7 @@ func (d *SyncServerDatasource) UpsertAccountData(
// If the invite was successfully stored this returns the stream ID it was stored at. // If the invite was successfully stored this returns the stream ID it was stored at.
// Returns an error if there was a problem communicating with the database. // Returns an error if there was a problem communicating with the database.
func (d *SyncServerDatasource) AddInviteEvent( func (d *SyncServerDatasource) AddInviteEvent(
ctx context.Context, inviteEvent gomatrixserverlib.HeaderedEvent, ctx context.Context, inviteEvent *gomatrixserverlib.HeaderedEvent,
) (streamPos types.StreamPosition, err error) { ) (streamPos types.StreamPosition, err error) {
err = common.WithTransaction(d.db, func(txn *sql.Tx) error { err = common.WithTransaction(d.db, func(txn *sql.Tx) error {
streamPos, err = d.streamID.nextStreamID(ctx, txn) streamPos, err = d.streamID.nextStreamID(ctx, txn)
@ -800,7 +800,7 @@ func (d *SyncServerDatasource) addInvitesToResponse(
for roomID, inviteEvent := range invites { for roomID, inviteEvent := range invites {
ir := types.NewInviteResponse() ir := types.NewInviteResponse()
ir.InviteState.Events = gomatrixserverlib.HeaderedToClientEvents( ir.InviteState.Events = gomatrixserverlib.HeaderedToClientEvents(
[]gomatrixserverlib.HeaderedEvent{inviteEvent}, gomatrixserverlib.FormatSync, []*gomatrixserverlib.HeaderedEvent{inviteEvent}, gomatrixserverlib.FormatSync,
) )
// TODO: add the invite state from the invite event. // TODO: add the invite state from the invite event.
res.Rooms.Invite[roomID] = *ir res.Rooms.Invite[roomID] = *ir
@ -1007,7 +1007,7 @@ func (d *SyncServerDatasource) getStateDeltas(
// dupe join events will result in the entire room state coming down to the client again. This is added in // dupe join events will result in the entire room state coming down to the client again. This is added in
// the 'state' part of the response though, so is transparent modulo bandwidth concerns as it is not added to // the 'state' part of the response though, so is transparent modulo bandwidth concerns as it is not added to
// the timeline. // the timeline.
if membership := getMembershipFromEvent(&ev.HeaderedEvent, userID); membership != "" { if membership := getMembershipFromEvent(ev.HeaderedEvent, userID); membership != "" {
if membership == gomatrixserverlib.Join { if membership == gomatrixserverlib.Join {
// send full room state down instead of a delta // send full room state down instead of a delta
var s []types.StreamEvent var s []types.StreamEvent
@ -1088,7 +1088,7 @@ func (d *SyncServerDatasource) getStateDeltasForFullStateSync(
for roomID, stateStreamEvents := range state { for roomID, stateStreamEvents := range state {
for _, ev := range stateStreamEvents { for _, ev := range stateStreamEvents {
if membership := getMembershipFromEvent(&ev.HeaderedEvent, userID); membership != "" { if membership := getMembershipFromEvent(ev.HeaderedEvent, userID); membership != "" {
if membership != gomatrixserverlib.Join { // We've already added full state for all joined rooms above. if membership != gomatrixserverlib.Join { // We've already added full state for all joined rooms above.
deltas = append(deltas, stateDelta{ deltas = append(deltas, stateDelta{
membership: membership, membership: membership,
@ -1124,8 +1124,8 @@ func (d *SyncServerDatasource) currentStateStreamEventsForRoom(
// StreamEventsToEvents converts streamEvent to Event. If device is non-nil and // StreamEventsToEvents converts streamEvent to Event. If device is non-nil and
// matches the streamevent.transactionID device then the transaction ID gets // matches the streamevent.transactionID device then the transaction ID gets
// added to the unsigned section of the output event. // added to the unsigned section of the output event.
func (d *SyncServerDatasource) StreamEventsToEvents(device *authtypes.Device, in []types.StreamEvent) []gomatrixserverlib.HeaderedEvent { func (d *SyncServerDatasource) StreamEventsToEvents(device *authtypes.Device, in []types.StreamEvent) []*gomatrixserverlib.HeaderedEvent {
out := make([]gomatrixserverlib.HeaderedEvent, len(in)) out := make([]*gomatrixserverlib.HeaderedEvent, len(in))
for i := 0; i < len(in); i++ { for i := 0; i < len(in); i++ {
out[i] = in[i].HeaderedEvent out[i] = in[i].HeaderedEvent
if device != nil && in[i].TransactionID != nil { if device != nil && in[i].TransactionID != nil {
@ -1147,7 +1147,7 @@ func (d *SyncServerDatasource) StreamEventsToEvents(device *authtypes.Device, in
// There may be some overlap where events in stateEvents are already in recentEvents, so filter // There may be some overlap where events in stateEvents are already in recentEvents, so filter
// them out so we don't include them twice in the /sync response. They should be in recentEvents // them out so we don't include them twice in the /sync response. They should be in recentEvents
// only, so clients get to the correct state once they have rolled forward. // only, so clients get to the correct state once they have rolled forward.
func removeDuplicates(stateEvents, recentEvents []gomatrixserverlib.HeaderedEvent) []gomatrixserverlib.HeaderedEvent { func removeDuplicates(stateEvents, recentEvents []*gomatrixserverlib.HeaderedEvent) []*gomatrixserverlib.HeaderedEvent {
for _, recentEv := range recentEvents { for _, recentEv := range recentEvents {
if recentEv.StateKey() == nil { if recentEv.StateKey() == nil {
continue // not a state event continue // not a state event

View file

@ -40,7 +40,7 @@ type StreamPosition int64
// Same as gomatrixserverlib.Event but also has the PDU stream position for this event. // Same as gomatrixserverlib.Event but also has the PDU stream position for this event.
type StreamEvent struct { type StreamEvent struct {
gomatrixserverlib.HeaderedEvent *gomatrixserverlib.HeaderedEvent
StreamPosition StreamPosition StreamPosition StreamPosition
TransactionID *api.TransactionID TransactionID *api.TransactionID
ExcludeFromSync bool ExcludeFromSync bool