package clientapi import ( "errors" "net/http" "github.com/dariuszjaniak/warp/server/internal/httputil" "github.com/dariuszjaniak/warp/server/internal/syncapi" "github.com/dariuszjaniak/warp/server/internal/userapi" ) // slidingSyncPath is MSC4186's endpoint. It is still unstable: the MSC has // not been merged, and the prefix is what every client implementing it // sends. const slidingSyncPath = "/_matrix/client/unstable/org.matrix.simplified_msc3575/sync" // handleSlidingSync implements POST slidingSyncPath. func (c *ClientAPI) handleSlidingSync(w http.ResponseWriter, r *http.Request, auth userapi.Authenticated) error { query := r.URL.Query() timeout, err := durationParam(query.Get("timeout")) if err != nil { return err } var body syncapi.SlidingBody if _, err := httputil.DecodeOptionalJSON(w, r, &body); err != nil { return err } resp, err := c.sync.SlidingSync(r.Context(), syncapi.SlidingRequest{ User: auth.UserID, Localpart: auth.Localpart, Device: auth.DeviceID, Pos: query.Get("pos"), Timeout: timeout, SetPresence: query.Get("set_presence"), Body: body, }) if err != nil { if ctxErr := r.Context().Err(); ctxErr != nil && errors.Is(err, ctxErr) { return nil //nolint:nilerr // the client is gone; there is nobody to answer } return syncError(err) } httputil.NoCache(w) httputil.WriteJSON(w, http.StatusOK, resp) return nil }