From 70de43cdaeb789c801cf36e839bd69b43662e1f5 Mon Sep 17 00:00:00 2001 From: Joachim Bauch Date: Thu, 12 Dec 2024 11:04:15 +0100 Subject: [PATCH] Include client features in "join" events. --- api_signaling.go | 6 ++++++ room.go | 2 ++ room_test.go | 39 +++++++++++++++++++++++++++++++++++++++ testclient_test.go | 6 +++++- 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/api_signaling.go b/api_signaling.go index 895d65e..6ff48e8 100644 --- a/api_signaling.go +++ b/api_signaling.go @@ -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, diff --git a/room.go b/room.go index 82ea8a0..e6e04fb 100644 --- a/room.go +++ b/room.go @@ -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 } diff --git a/room_test.go b/room_test.go index 13bfa12..2d170ea 100644 --- a/room_test.go +++ b/room_test.go @@ -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) diff --git a/testclient_test.go b/testclient_test.go index cea8771..464d986 100644 --- a/testclient_test.go +++ b/testclient_test.go @@ -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 {