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:
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user