From 6499b70c2402354574206c9255ebfbf0e7db3e94 Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Wed, 12 Apr 2017 17:52:36 +0100 Subject: [PATCH] Glue together db code with sync server --- .../dendrite/clientapi/events/clientevent.go | 14 ++++++++++++++ .../dendrite/syncserver/storage/syncserver.go | 3 ++- .../dendrite/syncserver/sync/requestpool.go | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/github.com/matrix-org/dendrite/clientapi/events/clientevent.go diff --git a/src/github.com/matrix-org/dendrite/clientapi/events/clientevent.go b/src/github.com/matrix-org/dendrite/clientapi/events/clientevent.go new file mode 100644 index 000000000..5c9679637 --- /dev/null +++ b/src/github.com/matrix-org/dendrite/clientapi/events/clientevent.go @@ -0,0 +1,14 @@ +package events + +import "encoding/json" + +// ClientEvent is an event which is fit for consumption by clients, in accordance with the specification. +type ClientEvent struct { + Content json.RawMessage `json:"content"` + Sender string `json:"sender"` + Type string `json:"type"` + StateKey *string `json:"state_key,omitempty"` + Unsigned json.RawMessage `json:"unsigned"` + OriginServerTS int64 `json:"origin_server_ts"` + EventID string `json:"event_id"` +} diff --git a/src/github.com/matrix-org/dendrite/syncserver/storage/syncserver.go b/src/github.com/matrix-org/dendrite/syncserver/storage/syncserver.go index c18540791..fa2e6a42c 100644 --- a/src/github.com/matrix-org/dendrite/syncserver/storage/syncserver.go +++ b/src/github.com/matrix-org/dendrite/syncserver/storage/syncserver.go @@ -96,8 +96,9 @@ func (d *SyncServerDatabase) SyncStreamPosition() (types.StreamPosition, error) return types.StreamPosition(id), nil } -// CompleteSync returns a map of room ID to RoomData. +// CompleteSync returns all the data needed in order to create a complete sync response. func (d *SyncServerDatabase) CompleteSync(userID string, numRecentEventsPerRoom int) (pos types.StreamPosition, data map[string]types.RoomData, returnErr error) { + data = make(map[string]types.RoomData) // This needs to be all done in a transaction as we need to do multiple SELECTs, and we need to have // a consistent view of the database throughout. This includes extracting the sync stream position. returnErr = runTransaction(d.db, func(txn *sql.Tx) error { diff --git a/src/github.com/matrix-org/dendrite/syncserver/sync/requestpool.go b/src/github.com/matrix-org/dendrite/syncserver/sync/requestpool.go index e4dd65b95..6056521d0 100644 --- a/src/github.com/matrix-org/dendrite/syncserver/sync/requestpool.go +++ b/src/github.com/matrix-org/dendrite/syncserver/sync/requestpool.go @@ -139,6 +139,23 @@ func (rp *RequestPool) waitForEvents(req syncRequest) types.StreamPosition { } func (rp *RequestPool) currentSyncForUser(req syncRequest) (*types.Response, error) { + if req.since == types.StreamPosition(0) { + pos, data, err := rp.db.CompleteSync(req.userID, 3) + if err != nil { + return nil, err + } + res := types.NewResponse() + res.NextBatch = pos.String() + for roomID, d := range data { + jr := types.NewJoinResponse() + jr.Timeline.Events = d.RecentEvents + jr.Timeline.Limited = true + jr.State.Events = d.State + res.Rooms.Join[roomID] = *jr + } + return res, nil + } + currentPos := rp.waitForEvents(req) // TODO: handle ignored users