Include client features in "join" events.

This commit is contained in:
Joachim Bauch 2024-12-12 11:04:15 +01:00
commit 70de43cdae
No known key found for this signature in database
GPG key ID: 77C1D22D53E15F02
4 changed files with 52 additions and 1 deletions

View file

@ -531,6 +531,7 @@ const (
ServerFeatureDialout = "dialout"
ServerFeatureFederation = "federation"
ServerFeatureRecipientCall = "recipient-call"
ServerFeatureJoinFeatures = "join-features"
// Features to send to internal clients only.
ServerFeatureInternalVirtualSessions = "virtual-sessions"
@ -551,6 +552,7 @@ var (
ServerFeatureDialout,
ServerFeatureFederation,
ServerFeatureRecipientCall,
ServerFeatureJoinFeatures,
}
DefaultFeaturesInternal = []string{
ServerFeatureInternalVirtualSessions,
@ -562,6 +564,7 @@ var (
ServerFeatureDialout,
ServerFeatureFederation,
ServerFeatureRecipientCall,
ServerFeatureJoinFeatures,
}
DefaultWelcomeFeatures = []string{
ServerFeatureAudioVideoPermissions,
@ -574,6 +577,7 @@ var (
ServerFeatureDialout,
ServerFeatureFederation,
ServerFeatureRecipientCall,
ServerFeatureJoinFeatures,
}
)
@ -1068,6 +1072,7 @@ func (m *EventServerMessage) String() string {
type EventServerMessageSessionEntry struct {
SessionId string `json:"sessionid"`
UserId string `json:"userid"`
Features []string `json:"features,omitempty"`
User json.RawMessage `json:"user,omitempty"`
RoomSessionId string `json:"roomsessionid,omitempty"`
Federated bool `json:"federated,omitempty"`
@ -1077,6 +1082,7 @@ func (e *EventServerMessageSessionEntry) Clone() *EventServerMessageSessionEntry
return &EventServerMessageSessionEntry{
SessionId: e.SessionId,
UserId: e.UserId,
Features: e.Features,
User: e.User,
RoomSessionId: e.RoomSessionId,
Federated: e.Federated,

View file

@ -372,6 +372,7 @@ func (r *Room) notifySessionJoined(sessionId string) {
User: s.UserData(),
}
if s, ok := s.(*ClientSession); ok {
entry.Features = s.GetFeatures()
entry.RoomSessionId = s.RoomSessionId()
entry.Federated = s.ClientType() == HelloClientTypeFederation
}
@ -551,6 +552,7 @@ func (r *Room) PublishSessionJoined(session Session, sessionData *RoomSessionDat
},
}
if session, ok := session.(*ClientSession); ok {
message.Event.Join[0].Features = session.GetFeatures()
message.Event.Join[0].RoomSessionId = session.RoomSessionId()
message.Event.Join[0].Federated = session.ClientType() == HelloClientTypeFederation
}

View file

@ -292,6 +292,45 @@ loop:
assert.NoError(err)
}
func TestRoom_RoomJoinFeatures(t *testing.T) {
t.Parallel()
CatchLogForTest(t)
require := require.New(t)
assert := assert.New(t)
hub, _, router, server := CreateHubForTest(t)
config, err := getTestConfig(server)
require.NoError(err)
b, err := NewBackendServer(config, hub, "no-version")
require.NoError(err)
require.NoError(b.Start(router))
client := NewTestClient(t, server, hub)
defer client.CloseWithBye()
features := []string{"one", "two", "three"}
require.NoError(client.SendHelloClientWithFeatures(testDefaultUserId, features))
ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
defer cancel()
hello, err := client.RunUntilHello(ctx)
require.NoError(err)
// Join room by id.
roomId := "test-room"
roomMsg, err := client.JoinRoom(ctx, roomId)
require.NoError(err)
require.Equal(roomId, roomMsg.Room.RoomId)
if message, err := client.RunUntilMessage(ctx); assert.NoError(err) {
if assert.NoError(client.checkMessageJoinedSession(message, hello.Hello.SessionId, testDefaultUserId)) {
assert.Equal(roomId+"-"+hello.Hello.SessionId, message.Event.Join[0].RoomSessionId)
assert.Equal(features, message.Event.Join[0].Features)
}
}
}
func TestRoom_RoomSessionData(t *testing.T) {
t.Parallel()
CatchLogForTest(t)

View file

@ -456,10 +456,14 @@ func (c *TestClient) SendHelloResume(resumeId string) error {
}
func (c *TestClient) SendHelloClient(userid string) error {
return c.SendHelloClientWithFeatures(userid, nil)
}
func (c *TestClient) SendHelloClientWithFeatures(userid string, features []string) error {
params := TestBackendClientAuthParams{
UserId: userid,
}
return c.SendHelloParams(c.server.URL, HelloVersionV1, "client", nil, params)
return c.SendHelloParams(c.server.URL, HelloVersionV1, "client", features, params)
}
func (c *TestClient) SendHelloInternal() error {