@telnyx/react-native-voice-sdk
Version:
Telnyx React Native Voice SDK - A complete WebRTC voice calling solution
170 lines (154 loc) • 6.24 kB
text/typescript
import { Platform } from 'react-native';
import uuid from 'uuid-random';
import { SDK_VERSION } from '../env';
import { TelnyxRTCMethod } from './methods';
// const attachMessage = {
// id: 3546946,
// jsonrpc: "2.0",
// method: "telnyx_rtc.attach",
// params: {
// callID: "5da8ff55-0981-4659-8438-983a53c56719",
// callee_id_name: "Outbound Call",
// callee_id_number: "haythem2",
// caller_id_name: "haythem1",
// caller_id_number: "haythem1",
// dialogParams: {
// custom_headers: [
// { name: "X-RTC-CALLID", value: "4c6cb475-f8ad-4a2b-8ee3-74b143071b66" },
// { name: "X-RTC-SESSID", value: "940f4a1c-763a-48fd-99d6-af4618551d4b" },
// ],
// },
// display_direction: "outbound",
// sdp: "v=0\r\no=FreeSWITCH 1753331097 1753331099 IN IP4 185.246.41.194\r\ns=FreeSWITCH\r\nc=IN IP4 185.246.41.194\r\nt=0 0\r\na=msid-semantic: WMS GHVvLj3nPKycSfBNZBXwExoFdYHAQ2AQ\r\nm=audio 16952 RTP/SAVPF 9\r\na=rtpmap:9 G722/8000\r\na=silenceSupp:off - - - -\r\na=ptime:20\r\na=sendrecv\r\na=mid:0\r\na=fingerprint:sha-256 45:57:25:EC:5D:91:D9:DD:B0:63:16:19:96:35:69:74:50:10:D4:0F:AF:7C:4A:48:10:B5:0C:9E:D8:81:62:28\r\na=setup:actpass\r\na=rtcp-mux\r\na=rtcp:16952 IN IP4 185.246.41.194\r\na=ice-ufrag:Ve8HU3HAZpKuww8t\r\na=ice-pwd:U8R0EsQEEyI3gtfTkw5dLsu4\r\na=candidate:3068080591 1 udp 2130706431 185.246.41.194 16952 typ host generation 0\r\na=candidate:3068080591 2 udp 2130706430 185.246.41.194 16952 typ host generation 0\r\na=end-of-candidates\r\na=ssrc:3699583393 cname:K2HknTRZl1p68VPF\r\na=ssrc:3699583393 msid:GHVvLj3nPKycSfBNZBXwExoFdYHAQ2AQ a0\r\na=ssrc:3699583393 mslabel:GHVvLj3nPKycSfBNZBXwExoFdYHAQ2AQ\r\na=ssrc:3699583393 label:GHVvLj3nPKycSfBNZBXwExoFdYHAQ2AQa0\r\n",
// telnyx_leg_id: "9fcae98e-686d-11f0-8284-02420a0ddb20",
// telnyx_session_id: "9fc46906-686d-11f0-9240-02420a0ddb20",
// variables: {
// "Core-UUID": "415d6f84-428f-46f7-ac2e-1d1e79673c89",
// "Event-Calling-File": "switch_channel.c",
// "Event-Calling-Function": "switch_channel_get_variables_prefix",
// "Event-Calling-Line-Number": "4642",
// "Event-Date-GMT": "Thu, 24 Jul 2025 09:08:05 GMT",
// "Event-Date-Local": "2025-07-24 09:08:05",
// "Event-Date-Timestamp": "1753348085735317",
// "Event-Name": "CHANNEL_DATA",
// "Event-Sequence": "8660473",
// },
// },
// voice_sdk_id: "VSDK1Ch8RUTpauq8R_PjeRii_E_pLMAph9Q",
// };
type CreateAttachMessageParams = {
callId: string;
sessionId: string;
sdp: string;
customHeaders?: { name: string; value: string }[];
destinationNumber?: string;
callerIdName?: string;
callerIdNumber?: string;
clientState?: string;
userVariables?: string[];
};
/**
* Create telnyx_rtc.attach message for call reattachment
* This message includes SDP and dialog parameters needed for WebRTC media reestablishment
*/
export function createAttachMessage({
callId,
sessionId,
sdp,
customHeaders = [],
destinationNumber = '',
callerIdName = '',
callerIdNumber = '',
clientState = '',
userVariables = [],
}: CreateAttachMessageParams) {
return {
id: uuid(),
jsonrpc: '2.0' as const,
method: TelnyxRTCMethod.ATTACH,
params: {
dialogParams: {
attach: true,
audio: true,
callID: callId,
caller_id_name: callerIdName,
caller_id_number: callerIdNumber,
clientState,
custom_headers: customHeaders,
destination_number: destinationNumber,
remote_caller_id_name: '',
screenShare: false,
useStereo: false,
userVariables,
video: false,
},
sdp,
sessid: sessionId,
'User-Agent': `ReactNative-${SDK_VERSION}`,
},
};
}
export type AttachEvent = {
id: number;
jsonrpc: '2.0';
method: 'telnyx_rtc.attach';
params: {
callID: string;
callee_id_name: string;
callee_id_number: string;
caller_id_name: string;
caller_id_number: string;
dialogParams: {
custom_headers: Array<{ name: string; value: string }>;
};
display_direction: 'inbound' | 'outbound';
sdp: string;
telnyx_leg_id: string;
telnyx_session_id: string;
variables?: Record<string, string>;
};
};
export function isAttachEvent(msg: unknown): msg is AttachEvent {
if (!msg || typeof msg !== 'object') {
return false;
}
const tmp = msg as Partial<AttachEvent>;
return tmp.method === TelnyxRTCMethod.ATTACH && !!tmp.params?.callID;
}
export function createAttachCallMessage(pushNotificationPayload?: any) {
const message = {
jsonrpc: '2.0' as const,
id: Math.floor(Math.random() * 1000000),
method: TelnyxRTCMethod.ATTACH_CALLS,
params: {} as Record<string, any>,
};
// Add push notification metadata if available
if (pushNotificationPayload) {
console.log('[AttachMessage] Creating attach message with payload:', pushNotificationPayload);
// The payload structure might be nested - check both levels
const metadata = pushNotificationPayload.metadata || pushNotificationPayload;
// If payload has voice_sdk_id, include it (this should match the WebSocket connection voice_sdk_id)
if (metadata.voice_sdk_id) {
message.params.voice_sdk_id = metadata.voice_sdk_id;
console.log('[AttachMessage] Added voice_sdk_id:', metadata.voice_sdk_id);
}
// Add any other relevant push metadata
if (metadata.call_id) {
message.params.callID = metadata.call_id;
console.log('[AttachMessage] Added callID:', metadata.call_id);
}
if (metadata.telnyx_session_id) {
message.params.telnyx_session_id = metadata.telnyx_session_id;
console.log('[AttachMessage] Added telnyx_session_id:', metadata.telnyx_session_id);
}
if (metadata.telnyx_leg_id) {
message.params.telnyx_leg_id = metadata.telnyx_leg_id;
console.log('[AttachMessage] Added telnyx_leg_id:', metadata.telnyx_leg_id);
}
// Add push notification provider info
message.params.push_notification_provider = Platform.OS;
message.params.push_notification_environment = __DEV__ ? 'debug' : 'production';
console.log('[AttachMessage] Final attach message:', message);
}
return message;
}