Add leave rooms to /sync response

This commit is contained in:
Eric Eastwood 2020-12-28 15:32:59 -06:00
parent 4cf73a5dc2
commit 88374a5cc4
4 changed files with 51 additions and 7 deletions

View file

@ -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

View file

@ -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,

View file

@ -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(),
}

View file

@ -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 {