diff --git a/syncapi/routing/filter.go b/syncapi/routing/filter.go index cfa059c9..4cefd753 100644 --- a/syncapi/routing/filter.go +++ b/syncapi/routing/filter.go @@ -21,7 +21,6 @@ import ( "github.com/matrix-org/dendrite/clientapi/jsonerror" "github.com/matrix-org/dendrite/syncapi/storage" - "github.com/matrix-org/dendrite/syncapi/sync" "github.com/matrix-org/dendrite/userapi/api" "github.com/matrix-org/gomatrixserverlib" "github.com/matrix-org/util" @@ -105,7 +104,7 @@ func PutFilter( limitRes := gjson.GetBytes(body, "room.timeline.limit") if !limitRes.Exists() { util.GetLogger(req.Context()).Infof("missing timeline limit, using default") - filter.Room.Timeline.Limit = sync.DefaultTimelineLimit + filter.Room.Timeline.Limit = gomatrixserverlib.DefaultRoomEventFilter().Limit } // Validate generates a user-friendly error diff --git a/syncapi/storage/shared/syncserver.go b/syncapi/storage/shared/syncserver.go index 71f6fecc..e65ee7c6 100644 --- a/syncapi/storage/shared/syncserver.go +++ b/syncapi/storage/shared/syncserver.go @@ -698,7 +698,10 @@ func (d *Database) IncrementalSync( To: toPos.PDUPosition, } - numRecentEventsPerRoom := filter.Room.Timeline.Limit + numRecentEventsPerRoom := gomatrixserverlib.DefaultRoomEventFilter().Limit + if filter != nil { + numRecentEventsPerRoom = filter.Room.Timeline.Limit + } joinedRoomIDs, err = d.addPDUDeltaToResponse( ctx, device, r, numRecentEventsPerRoom, wantFullState, res, @@ -813,11 +816,27 @@ func (d *Database) getResponseWithPDUsForCompleteSync( return } - // TODO: Add "leave" rooms. - res.Rooms.Join[roomID] = *jr } + // Extract room state and recent events for all rooms the user has left + leaveRoomIDs, err := d.CurrentRoomState.SelectRoomIDsWithMembership(ctx, txn, userID, gomatrixserverlib.Leave) + if err != nil { + return + } + // Build up a /sync response. Add leave rooms. + for _, roomID := range leaveRoomIDs { + var lr *types.LeaveResponse + lr, err = d.getLeaveResponseForCompleteSync( + ctx, txn, roomID, r, filter, device, + ) + if err != nil { + return + } + + res.Rooms.Leave[roomID] = *lr + } + // Add peeked rooms. peeks, err := d.Peeks.SelectPeeksInRange(ctx, txn, userID, device.ID, r) if err != nil { @@ -926,6 +945,33 @@ func (d *Database) getJoinResponseForCompleteSync( return jr, nil } +func (d *Database) getLeaveResponseForCompleteSync( + ctx context.Context, txn *sql.Tx, + roomID string, + r types.Range, + filter *gomatrixserverlib.Filter, + device userapi.Device, +) (lr *types.LeaveResponse, err error) { + jr, err := d.getJoinResponseForCompleteSync( + ctx, + txn, + roomID, + r, + filter, + device, + ) + if err != nil { + return + } + + lr = types.NewLeaveResponse() + lr.Timeline.PrevBatch = jr.Timeline.PrevBatch + lr.Timeline.Events = jr.Timeline.Events + lr.Timeline.Limited = jr.Timeline.Limited + lr.State.Events = jr.State.Events + return lr, nil +} + func (d *Database) CompleteSync( ctx context.Context, res *types.Response, diff --git a/syncapi/sync/notifier_test.go b/syncapi/sync/notifier_test.go index d24da463..840dd0c8 100644 --- a/syncapi/sync/notifier_test.go +++ b/syncapi/sync/notifier_test.go @@ -367,7 +367,7 @@ func newTestSyncRequest(userID, deviceID string, since types.StreamingToken) syn timeout: 1 * time.Minute, since: since, wantFullState: false, - limit: DefaultTimelineLimit, + limit: gomatrixserverlib.DefaultRoomEventFilter().Limit, log: util.GetLogger(context.TODO()), ctx: context.TODO(), } diff --git a/syncapi/sync/request.go b/syncapi/sync/request.go index a8b0fc99..13f848f6 100644 --- a/syncapi/sync/request.go +++ b/syncapi/sync/request.go @@ -31,7 +31,6 @@ import ( const defaultSyncTimeout = time.Duration(0) const defaultIncludeLeave = false -const DefaultTimelineLimit = 20 // syncRequest represents a /sync request, with sensible defaults/sanity checks applied. type syncRequest struct {