@@ -19,6 +19,7 @@ import {
1919 CallMembership ,
2020 type SessionMembershipData ,
2121 DEFAULT_EXPIRE_DURATION ,
22+ type RtcMembershipData ,
2223} from "../../../src/matrixrtc/CallMembership" ;
2324import { membershipTemplate } from "./mocks" ;
2425
@@ -44,7 +45,7 @@ describe("CallMembership", () => {
4445 scope : "m.room" ,
4546 application : "m.call" ,
4647 device_id : "AAAAAAA" ,
47- focus_active : { type : "livekit" } ,
48+ focus_active : { type : "livekit" , focus_selection : "oldest_membership" } ,
4849 foci_preferred : [ { type : "livekit" } ] ,
4950 } ;
5051
@@ -94,11 +95,138 @@ describe("CallMembership", () => {
9495 it ( "returns preferred foci" , ( ) => {
9596 const fakeEvent = makeMockEvent ( ) ;
9697 const mockFocus = { type : "this_is_a_mock_focus" } ;
97- const membership = new CallMembership (
98- fakeEvent ,
99- Object . assign ( { } , membershipTemplate , { foci_preferred : [ mockFocus ] } ) ,
100- ) ;
101- expect ( membership . getPreferredFoci ( ) ) . toEqual ( [ mockFocus ] ) ;
98+ const membership = new CallMembership ( fakeEvent , { ...membershipTemplate , foci_preferred : [ mockFocus ] } ) ;
99+ expect ( membership . transports ) . toEqual ( [ mockFocus ] ) ;
100+ } ) ;
101+ describe ( "getTransport" , ( ) => {
102+ const mockFocus = { type : "this_is_a_mock_focus" } ;
103+ const oldestMembership = new CallMembership ( makeMockEvent ( ) , membershipTemplate ) ;
104+ it ( "gets the correct active transport with oldest_membership" , ( ) => {
105+ const membership = new CallMembership ( makeMockEvent ( ) , {
106+ ...membershipTemplate ,
107+ foci_preferred : [ mockFocus ] ,
108+ focus_active : { type : "livekit" , focus_selection : "oldest_membership" } ,
109+ } ) ;
110+
111+ // if we are the oldest member we use our focus.
112+ expect ( membership . getTransport ( membership ) ) . toStrictEqual ( mockFocus ) ;
113+
114+ // If there is an older member we use its focus.
115+ expect ( membership . getTransport ( oldestMembership ) ) . toBe ( membershipTemplate . foci_preferred [ 0 ] ) ;
116+ } ) ;
117+
118+ it ( "does not provide focus if the selection method is unknown" , ( ) => {
119+ const membership = new CallMembership ( makeMockEvent ( ) , {
120+ ...membershipTemplate ,
121+ foci_preferred : [ mockFocus ] ,
122+ focus_active : { type : "livekit" , focus_selection : "multi_sfu" } ,
123+ } ) ;
124+
125+ // if we are the oldest member we use our focus.
126+ expect ( membership . getTransport ( membership ) ) . toStrictEqual ( mockFocus ) ;
127+
128+ // If there is an older member we still use our own focus in multi sfu.
129+ expect ( membership . getTransport ( oldestMembership ) ) . toBe ( mockFocus ) ;
130+ } ) ;
131+ } ) ;
132+ } ) ;
133+
134+ describe ( "RtcMembershipData" , ( ) => {
135+ beforeEach ( ( ) => {
136+ jest . useFakeTimers ( ) ;
137+ } ) ;
138+
139+ afterEach ( ( ) => {
140+ jest . useRealTimers ( ) ;
141+ } ) ;
142+
143+ const membershipTemplate : RtcMembershipData = {
144+ slot_id : "m.call#1" ,
145+ application : { type : "m.call" } ,
146+ member : { user_id : "@alice:example.org" , device_id : "AAAAAAA" , id : "xyzHASHxyz" } ,
147+ rtc_transports : [ { type : "livekit" } ] ,
148+ versions : [ ] ,
149+ } ;
150+
151+ it ( "rejects membership with no slot_id" , ( ) => {
152+ expect ( ( ) => {
153+ new CallMembership ( makeMockEvent ( ) , { ...membershipTemplate , slot_id : undefined } ) ;
154+ } ) . toThrow ( ) ;
155+ } ) ;
156+
157+ it ( "rejects membership with no application" , ( ) => {
158+ expect ( ( ) => {
159+ new CallMembership ( makeMockEvent ( ) , { ...membershipTemplate , application : undefined } ) ;
160+ } ) . toThrow ( ) ;
161+ } ) ;
162+
163+ it ( "rejects membership with incorrect application" , ( ) => {
164+ expect ( ( ) => {
165+ new CallMembership ( makeMockEvent ( ) , {
166+ ...membershipTemplate ,
167+ application : { wrong_type_key : "unknown" } ,
168+ } ) ;
169+ } ) . toThrow ( ) ;
170+ } ) ;
171+
172+ it ( "rejects membership with no member" , ( ) => {
173+ expect ( ( ) => {
174+ new CallMembership ( makeMockEvent ( ) , { ...membershipTemplate , member : undefined } ) ;
175+ } ) . toThrow ( ) ;
176+ } ) ;
177+
178+ it ( "rejects membership with incorrect member" , ( ) => {
179+ expect ( ( ) => {
180+ new CallMembership ( makeMockEvent ( ) , { ...membershipTemplate , member : { i : "test" } } ) ;
181+ } ) . toThrow ( ) ;
182+ expect ( ( ) => {
183+ new CallMembership ( makeMockEvent ( ) , {
184+ ...membershipTemplate ,
185+ member : { id : "test" , device_id : "test" , user_id_wrong : "test" } ,
186+ } ) ;
187+ } ) . toThrow ( ) ;
188+ expect ( ( ) => {
189+ new CallMembership ( makeMockEvent ( ) , {
190+ ...membershipTemplate ,
191+ member : { id : "test" , device_id_wrong : "test" , user_id_wrong : "test" } ,
192+ } ) ;
193+ } ) . toThrow ( ) ;
194+ expect ( ( ) => {
195+ new CallMembership ( makeMockEvent ( ) , {
196+ ...membershipTemplate ,
197+ member : { id : "test" , device_id : "test" , user_id : "@@test" } ,
198+ } ) ;
199+ } ) . toThrow ( ) ;
200+ expect ( ( ) => {
201+ new CallMembership ( makeMockEvent ( ) , {
202+ ...membershipTemplate ,
203+ member : { id : "test" , device_id : "test" , user_id : "@test:user.id" } ,
204+ } ) ;
205+ } ) . not . toThrow ( ) ;
206+ } ) ;
207+
208+ it ( "considers memberships unexpired if local age low enough" , ( ) => {
209+ // TODO link prev event
210+ } ) ;
211+
212+ it ( "considers memberships expired if local age large enough" , ( ) => {
213+ // TODO link prev event
214+ } ) ;
215+
216+ describe ( "getTransport" , ( ) => {
217+ it ( "gets the correct active transport with oldest_membership" , ( ) => {
218+ const oldestMembership = new CallMembership ( makeMockEvent ( ) , {
219+ ...membershipTemplate ,
220+ rtc_transports : [ { type : "oldest_transport" } ] ,
221+ } ) ;
222+ const membership = new CallMembership ( makeMockEvent ( ) , membershipTemplate ) ;
223+
224+ // if we are the oldest member we use our focus.
225+ expect ( membership . getTransport ( membership ) ) . toStrictEqual ( { type : "livekit" } ) ;
226+
227+ // If there is an older member we use our own focus focus. (RtcMembershipData always uses multi sfu)
228+ expect ( membership . getTransport ( oldestMembership ) ) . toStrictEqual ( { type : "livekit" } ) ;
229+ } ) ;
102230 } ) ;
103231 } ) ;
104232
0 commit comments