aboutsummaryrefslogtreecommitdiff
path: root/syncapi/routing
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-06-17 17:41:45 +0100
committerGitHub <noreply@github.com>2020-06-17 17:41:45 +0100
commitddf1c8adf1fd1441b76834df479d1ab5a132de88 (patch)
tree9a738062cade5fcd16fc2f4cc60e8b4a7efe18cc /syncapi/routing
parent84a7881468a57bd4225f5c990c03b5fce729f914 (diff)
Hacks for supporting Riot iOS (#1148)
* Join room body is optional * Support deprecated login by user/password * Implement dummy key upload endpoint * Make a very determinate end to /messages if we hit the create event in back-pagination * Linting
Diffstat (limited to 'syncapi/routing')
-rw-r--r--syncapi/routing/messages.go45
1 files changed, 28 insertions, 17 deletions
diff --git a/syncapi/routing/messages.go b/syncapi/routing/messages.go
index de5429db..15add1b4 100644
--- a/syncapi/routing/messages.go
+++ b/syncapi/routing/messages.go
@@ -158,6 +158,7 @@ func OnIncomingMessagesRequest(
util.GetLogger(req.Context()).WithError(err).Error("mreq.retrieveEvents failed")
return jsonerror.InternalServerError()
}
+
util.GetLogger(req.Context()).WithFields(logrus.Fields{
"from": from.String(),
"to": to.String(),
@@ -246,6 +247,12 @@ func (r *messagesReq) retrieveEvents() (
// change the way topological positions are defined (as depth isn't the most
// reliable way to define it), it would be easier and less troublesome to
// only have to change it in one place, i.e. the database.
+ start, end, err = r.getStartEnd(events)
+
+ return clientEvents, start, end, err
+}
+
+func (r *messagesReq) getStartEnd(events []gomatrixserverlib.HeaderedEvent) (start, end types.TopologyToken, err error) {
start, err = r.db.EventPositionInTopology(
r.ctx, events[0].EventID(),
)
@@ -253,24 +260,28 @@ func (r *messagesReq) retrieveEvents() (
err = fmt.Errorf("EventPositionInTopology: for start event %s: %w", events[0].EventID(), err)
return
}
- end, err = r.db.EventPositionInTopology(
- r.ctx, events[len(events)-1].EventID(),
- )
- if err != nil {
- err = fmt.Errorf("EventPositionInTopology: for end event %s: %w", events[len(events)-1].EventID(), err)
- return
- }
-
- if r.backwardOrdering {
- // A stream/topological position is a cursor located between two events.
- // While they are identified in the code by the event on their right (if
- // we consider a left to right chronological order), tokens need to refer
- // to them by the event on their left, therefore we need to decrement the
- // end position we send in the response if we're going backward.
- end.Decrement()
+ if r.backwardOrdering && events[len(events)-1].Type() == gomatrixserverlib.MRoomCreate {
+ // We've hit the beginning of the room so there's really nowhere else
+ // to go. This seems to fix Riot iOS from looping on /messages endlessly.
+ end = types.NewTopologyToken(0, 0)
+ } else {
+ end, err = r.db.EventPositionInTopology(
+ r.ctx, events[len(events)-1].EventID(),
+ )
+ if err != nil {
+ err = fmt.Errorf("EventPositionInTopology: for end event %s: %w", events[len(events)-1].EventID(), err)
+ return
+ }
+ if r.backwardOrdering {
+ // A stream/topological position is a cursor located between two events.
+ // While they are identified in the code by the event on their right (if
+ // we consider a left to right chronological order), tokens need to refer
+ // to them by the event on their left, therefore we need to decrement the
+ // end position we send in the response if we're going backward.
+ end.Decrement()
+ }
}
-
- return clientEvents, start, end, err
+ return
}
// handleEmptyEventsSlice handles the case where the initial request to the