This repository has been archived by the owner on Nov 25, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 677
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Initial implementation of MSC2753, as tested by matrix-org/sytest#944. Doesn't yet handle unpeeks, peeked EDUs, or history viz changing during a peek - these will follow. #1370 has full details.
- Loading branch information
Showing
29 changed files
with
1,209 additions
and
59 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
// Copyright 2020 New Vector Ltd | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package routing | ||
|
||
import ( | ||
"net/http" | ||
|
||
roomserverAPI "github.com/matrix-org/dendrite/roomserver/api" | ||
"github.com/matrix-org/dendrite/userapi/api" | ||
"github.com/matrix-org/dendrite/userapi/storage/accounts" | ||
"github.com/matrix-org/gomatrixserverlib" | ||
"github.com/matrix-org/util" | ||
) | ||
|
||
func PeekRoomByIDOrAlias( | ||
req *http.Request, | ||
device *api.Device, | ||
rsAPI roomserverAPI.RoomserverInternalAPI, | ||
accountDB accounts.Database, | ||
roomIDOrAlias string, | ||
) util.JSONResponse { | ||
// if this is a remote roomIDOrAlias, we have to ask the roomserver (or federation sender?) to | ||
// to call /peek and /state on the remote server. | ||
// TODO: in future we could skip this if we know we're already participating in the room, | ||
// but this is fiddly in case we stop participating in the room. | ||
|
||
// then we create a local peek. | ||
peekReq := roomserverAPI.PerformPeekRequest{ | ||
RoomIDOrAlias: roomIDOrAlias, | ||
UserID: device.UserID, | ||
DeviceID: device.ID, | ||
} | ||
peekRes := roomserverAPI.PerformPeekResponse{} | ||
|
||
// Check to see if any ?server_name= query parameters were | ||
// given in the request. | ||
if serverNames, ok := req.URL.Query()["server_name"]; ok { | ||
for _, serverName := range serverNames { | ||
peekReq.ServerNames = append( | ||
peekReq.ServerNames, | ||
gomatrixserverlib.ServerName(serverName), | ||
) | ||
} | ||
} | ||
|
||
// Ask the roomserver to perform the peek. | ||
rsAPI.PerformPeek(req.Context(), &peekReq, &peekRes) | ||
if peekRes.Error != nil { | ||
return peekRes.Error.JSONResponse() | ||
} | ||
|
||
// if this user is already joined to the room, we let them peek anyway | ||
// (given they might be about to part the room, and it makes things less fiddly) | ||
|
||
// Peeking stops if none of the devices who started peeking have been | ||
// /syncing for a while, or if everyone who was peeking calls /leave | ||
// (or /unpeek with a server_name param? or DELETE /peek?) | ||
// on the peeked room. | ||
|
||
return util.JSONResponse{ | ||
Code: http.StatusOK, | ||
// TODO: Put the response struct somewhere internal. | ||
JSON: struct { | ||
RoomID string `json:"room_id"` | ||
}{peekRes.RoomID}, | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
## Peeking | ||
|
||
Peeking is implemented as per [MSC2753](https://github.com/matrix-org/matrix-doc/pull/2753). | ||
|
||
Implementationwise, this means: | ||
* Users call `/peek` and `/unpeek` on the clientapi from a given device. | ||
* The clientapi delegates these via HTTP to the roomserver, which coordinates peeking in general for a given room | ||
* The roomserver writes an NewPeek event into the kafka log headed to the syncserver | ||
* The syncserver tracks the existence of the local peek in its DB, and then starts waking up the peeking devices for the room in question, putting it in the `peek` section of the /sync response. | ||
|
||
Questions (given this is [my](https://github.com/ara4n) first time hacking on Dendrite): | ||
* The whole clientapi -> roomserver -> syncapi flow to initiate a peek seems very indirect. Is there a reason not to just let syncapi itself host the implementation of `/peek`? | ||
|
||
In future, peeking over federation will be added as per [MSC2444](https://github.com/matrix-org/matrix-doc/pull/2444). | ||
* The `roomserver` will kick the `federationsender` much as it does for a federated `/join` in order to trigger a federated `/peek` | ||
* The `federationsender` tracks the existence of the remote peek in question | ||
* The `federationsender` regularly renews the remote peek as long as there are still peeking devices syncing for it. | ||
* TBD: how do we tell if there are no devices currently syncing for a given peeked room? The syncserver needs to tell the roomserver | ||
somehow who then needs to warn the federationsender. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.