mirror of
https://github.com/vector-im/element-call.git
synced 2026-07-24 19:19:21 +00:00
refact: step 1 - extract oldest membership transport into new function
This commit is contained in:
@@ -18,6 +18,7 @@ import {
|
|||||||
from,
|
from,
|
||||||
map,
|
map,
|
||||||
merge,
|
merge,
|
||||||
|
Observable,
|
||||||
of,
|
of,
|
||||||
startWith,
|
startWith,
|
||||||
switchMap,
|
switchMap,
|
||||||
@@ -208,54 +209,14 @@ export const createLocalTransport$ = ({
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (useOldestMember) {
|
if (useOldestMember) {
|
||||||
// --- Oldest member mode ---
|
return observeLocalTransportForOldestMembership(
|
||||||
return {
|
scope,
|
||||||
// Never update the transport that we advertise in our membership. Just
|
oldestMemberTransport$,
|
||||||
// take the first valid oldest member or preferred transport that we learn
|
preferredTransport$,
|
||||||
// about, and stick with that. This avoids unnecessary SFU hops and room
|
client,
|
||||||
// state changes.
|
ownMembershipIdentity,
|
||||||
advertised$: scope.behavior(
|
roomId,
|
||||||
merge(
|
);
|
||||||
oldestMemberTransport$,
|
|
||||||
preferredTransport$.pipe(map((t) => t.transport)),
|
|
||||||
).pipe(
|
|
||||||
first((t) => t !== null),
|
|
||||||
tap((t) =>
|
|
||||||
logger.info(`Advertise transport: ${t.livekit_service_url}`),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
null,
|
|
||||||
),
|
|
||||||
// Publish on the transport used by the oldest member.
|
|
||||||
active$: scope.behavior(
|
|
||||||
oldestMemberTransport$.pipe(
|
|
||||||
switchMap((transport) => {
|
|
||||||
// Oldest member not available (or invalid SFU config).
|
|
||||||
if (transport === null) return of(null);
|
|
||||||
// Oldest member available: fetch the SFU config.
|
|
||||||
const fetchOldestMemberTransport =
|
|
||||||
async (): Promise<LocalTransportWithSFUConfig> => ({
|
|
||||||
transport,
|
|
||||||
sfuConfig: await getSFUConfigWithOpenID(
|
|
||||||
client,
|
|
||||||
ownMembershipIdentity,
|
|
||||||
transport.livekit_service_url,
|
|
||||||
roomId,
|
|
||||||
{ forceJwtEndpoint: JwtEndpointVersion.Legacy },
|
|
||||||
logger,
|
|
||||||
),
|
|
||||||
});
|
|
||||||
return from(fetchOldestMemberTransport()).pipe(startWith(null));
|
|
||||||
}),
|
|
||||||
tap((t) =>
|
|
||||||
logger.info(
|
|
||||||
`Publish on transport: ${t?.transport.livekit_service_url}`,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
null,
|
|
||||||
),
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Multi-SFU mode ---
|
// --- Multi-SFU mode ---
|
||||||
@@ -353,3 +314,65 @@ async function doOpenIdAndJWTFromUrl(
|
|||||||
sfuConfig,
|
sfuConfig,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function observeLocalTransportForOldestMembership(
|
||||||
|
scope: ObservableScope,
|
||||||
|
oldestMemberTransport$: Behavior<LivekitTransportConfig | null>,
|
||||||
|
preferredTransport$: Observable<LocalTransportWithSFUConfig>,
|
||||||
|
client: Pick<
|
||||||
|
MatrixClient,
|
||||||
|
"getDomain" | "baseUrl" | "_unstable_getRTCTransports" | "getAccessToken"
|
||||||
|
> &
|
||||||
|
OpenIDClientParts,
|
||||||
|
ownMembershipIdentity: CallMembershipIdentityParts,
|
||||||
|
roomId: string,
|
||||||
|
): LocalTransport {
|
||||||
|
// --- Oldest member mode ---
|
||||||
|
return {
|
||||||
|
// Never update the transport that we advertise in our membership. Just
|
||||||
|
// take the first valid oldest member or preferred transport that we learn
|
||||||
|
// about, and stick with that. This avoids unnecessary SFU hops and room
|
||||||
|
// state changes.
|
||||||
|
advertised$: scope.behavior(
|
||||||
|
merge(
|
||||||
|
oldestMemberTransport$,
|
||||||
|
preferredTransport$.pipe(map((t) => t.transport)),
|
||||||
|
).pipe(
|
||||||
|
first((t) => t !== null),
|
||||||
|
tap((t) =>
|
||||||
|
logger.info(`Advertise transport: ${t.livekit_service_url}`),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
null,
|
||||||
|
),
|
||||||
|
// Publish on the transport used by the oldest member.
|
||||||
|
active$: scope.behavior(
|
||||||
|
oldestMemberTransport$.pipe(
|
||||||
|
switchMap((transport) => {
|
||||||
|
// Oldest member not available (or invalid SFU config).
|
||||||
|
if (transport === null) return of(null);
|
||||||
|
// Oldest member available: fetch the SFU config.
|
||||||
|
const fetchOldestMemberTransport =
|
||||||
|
async (): Promise<LocalTransportWithSFUConfig> => ({
|
||||||
|
transport,
|
||||||
|
sfuConfig: await getSFUConfigWithOpenID(
|
||||||
|
client,
|
||||||
|
ownMembershipIdentity,
|
||||||
|
transport.livekit_service_url,
|
||||||
|
roomId,
|
||||||
|
{ forceJwtEndpoint: JwtEndpointVersion.Legacy },
|
||||||
|
logger,
|
||||||
|
),
|
||||||
|
});
|
||||||
|
return from(fetchOldestMemberTransport()).pipe(startWith(null));
|
||||||
|
}),
|
||||||
|
tap((t) =>
|
||||||
|
logger.info(
|
||||||
|
`Publish on transport: ${t?.transport.livekit_service_url}`,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
null,
|
||||||
|
),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user