feat: add federatedCallId and callOrigin to client call routing

Enable federated DM calls to route accept/reject/end through the correct
WebSocket connection using callOrigin, and include federatedCallId in all
dm_call payloads for server-side FederatedCallEntry lookup.
This commit is contained in:
Jannis Braun
2026-04-08 03:26:48 +02:00
parent 0c57f9491f
commit ba7b975bc8
10 changed files with 73 additions and 31 deletions
+23 -9
View File
@@ -314,20 +314,24 @@ function handleEvent(origin: string, event: ServerEvent): void {
// Restore DM call state from server (all origins — federated DMs live on remote instances)
{
const { activeDmCall, setActiveDmCall, setIncomingCall, incomingCall, connectFn, disconnectFn, setFederatedCallData } = useVoiceStore.getState();
const { activeDmCall, setActiveDmCall, setIncomingCall, incomingCall, connectFn, disconnectFn, setFederatedCallData, setFederatedCallId } = useVoiceStore.getState();
const myId = event.user.id;
if (event.activeCalls && event.activeCalls.length > 0) {
for (const call of event.activeCalls) {
// For federated calls, check membership via token presence (participants may be empty)
const isParticipant = call.participants.includes(myId) || !!call.livekitToken;
if (call.state === 'active' && isParticipant) {
setActiveDmCall({ dmChannelId: call.dmChannelId });
const callDmId = call.dmChannelId || call.federatedCallId || '';
setActiveDmCall({ dmChannelId: callDmId });
// Store federated call data if present (server already filtered to this user's token)
if (call.livekitUrl && call.livekitToken) {
setFederatedCallData(call.livekitToken, call.livekitUrl);
}
if (connectFn) {
connectFn(call.dmChannelId, true).catch((err) => {
if (call.federatedCallId) {
setFederatedCallId(call.federatedCallId);
}
if (connectFn && callDmId) {
connectFn(callDmId, true).catch((err) => {
console.error('[WS] DM call reconnect failed:', err);
});
}
@@ -344,6 +348,9 @@ function handleEvent(origin: string, event: ServerEvent): void {
if (call.livekitUrl && call.livekitToken) {
setFederatedCallData(call.livekitToken, call.livekitUrl);
}
if (call.federatedCallId) {
setFederatedCallId(call.federatedCallId);
}
}
}
} else {
@@ -770,9 +777,9 @@ function handleEvent(origin: string, event: ServerEvent): void {
// ─── DM call events (all origins) ──────────────────────────────────────
case 'dm_call_incoming': {
const { setIncomingCall, setFederatedCallData } = useVoiceStore.getState();
const { setIncomingCall, setFederatedCallData, setFederatedCallId, setCallOrigin } = useVoiceStore.getState();
setIncomingCall({
dmChannelId: event.dmChannelId,
dmChannelId: event.dmChannelId ?? null,
callerId: event.callerId,
callerName: event.callerName,
});
@@ -780,6 +787,12 @@ function handleEvent(origin: string, event: ServerEvent): void {
if (event.livekitUrl && event.livekitToken) {
setFederatedCallData(event.livekitToken, event.livekitUrl);
}
if (event.federatedCallId) {
setFederatedCallId(event.federatedCallId);
}
if (event.callOrigin) {
setCallOrigin(event.callOrigin);
}
break;
}
@@ -787,10 +800,11 @@ function handleEvent(origin: string, event: ServerEvent): void {
const { setIncomingCall, setOutgoingCall, setActiveDmCall, connectFn, isLiveKitConnected } = useVoiceStore.getState();
setIncomingCall(null);
setOutgoingCall(null);
setActiveDmCall({ dmChannelId: event.dmChannelId });
const callDmId = event.dmChannelId || event.federatedCallId || '';
setActiveDmCall({ dmChannelId: callDmId });
// Only connect if not already connected (federated acceptor connects immediately in handleAccept)
if (connectFn && !isLiveKitConnected) {
connectFn(event.dmChannelId, true).catch((err) => {
if (connectFn && !isLiveKitConnected && callDmId) {
connectFn(callDmId, true).catch((err: unknown) => {
console.error('[WS] DM call connect failed:', err);
});
}