{"id":"3967e978-6540-480c-ad96-2729f481b750","shortId":"m6sw2q","kind":"skill","title":"telnyx-webrtc-client-react-native","tagline":">-","description":"# Telnyx WebRTC - React Native SDK\n\nBuild real-time voice communication into React Native apps (Android & iOS) using the `@telnyx/react-voice-commons-sdk` library.\n\n> **Prerequisites**: Create WebRTC credentials and generate a login token using the Telnyx server-side SDK. See the `telnyx-webrtc-*` skill in your server language plugin (e.g., `telnyx-python`, `telnyx-javascript`).\n\n## Features\n\n- **Reactive Streams**: RxJS-based state management\n- **Automatic Lifecycle**: Background/foreground handling\n- **Native Call UI**: CallKit (iOS) and ConnectionService (Android)\n- **Push Notifications**: FCM (Android) and APNs/PushKit (iOS)\n- **TypeScript Support**: Full type definitions\n\n## Installation\n\n```bash\nnpm install @telnyx/react-voice-commons-sdk\n```\n\n---\n\n## Basic Setup\n\n```tsx\nimport { TelnyxVoiceApp, createTelnyxVoipClient } from '@telnyx/react-voice-commons-sdk';\n\n// Create VoIP client instance\nconst voipClient = createTelnyxVoipClient({\n  enableAppStateManagement: true,  // Auto background/foreground handling\n  debug: true,                     // Enable logging\n});\n\nexport default function App() {\n  return (\n    <TelnyxVoiceApp \n      voipClient={voipClient} \n      enableAutoReconnect={false} \n      debug={true}\n    >\n      <YourAppContent />\n    </TelnyxVoiceApp>\n  );\n}\n```\n\n---\n\n## Authentication\n\n### Credential-Based Login\n\n```tsx\nimport { createCredentialConfig } from '@telnyx/react-voice-commons-sdk';\n\nconst config = createCredentialConfig('sip_username', 'sip_password', {\n  debug: true,\n  pushNotificationDeviceToken: 'your_device_token',\n});\n\nawait voipClient.login(config);\n```\n\n### Token-Based Login (JWT)\n\n```tsx\nimport { createTokenConfig } from '@telnyx/react-voice-commons-sdk';\n\nconst config = createTokenConfig('your_jwt_token', {\n  debug: true,\n  pushNotificationDeviceToken: 'your_device_token',\n});\n\nawait voipClient.loginWithToken(config);\n```\n\n### Auto-Reconnection\n\nThe library automatically stores credentials for seamless reconnection:\n\n```tsx\n// Automatically reconnects using stored credentials\nconst success = await voipClient.loginFromStoredConfig();\n\nif (!success) {\n  // No stored auth, show login UI\n}\n```\n\n---\n\n## Reactive State Management\n\n```tsx\nimport { useEffect, useState } from 'react';\n\nfunction CallScreen() {\n  const [connectionState, setConnectionState] = useState(null);\n  const [calls, setCalls] = useState([]);\n  \n  useEffect(() => {\n    // Subscribe to connection state\n    const connSub = voipClient.connectionState$.subscribe((state) => {\n      setConnectionState(state);\n    });\n    \n    // Subscribe to active calls\n    const callsSub = voipClient.calls$.subscribe((activeCalls) => {\n      setCalls(activeCalls);\n    });\n    \n    return () => {\n      connSub.unsubscribe();\n      callsSub.unsubscribe();\n    };\n  }, []);\n  \n  return (/* UI */);\n}\n```\n\n### Individual Call State\n\n```tsx\nuseEffect(() => {\n  if (call) {\n    const sub = call.callState$.subscribe((state) => {\n      console.log('Call state:', state);\n    });\n    return () => sub.unsubscribe();\n  }\n}, [call]);\n```\n\n---\n\n## Making Calls\n\n```tsx\nconst call = await voipClient.newCall('+18004377950');\n```\n\n---\n\n## Receiving Calls\n\nIncoming calls are handled automatically via push notifications and the `TelnyxVoiceApp` wrapper. The native call UI (CallKit/ConnectionService) is displayed automatically.\n\n---\n\n## Call Controls\n\n```tsx\n// Answer incoming call\nawait call.answer();\n\n// Mute/Unmute\nawait call.mute();\nawait call.unmute();\n\n// Hold/Unhold\nawait call.hold();\nawait call.unhold();\n\n// End call\nawait call.hangup();\n\n// Send DTMF\nawait call.dtmf('1');\n```\n\n---\n\n## Push Notifications - Android (FCM)\n\n### 1. Place `google-services.json` in project root\n\n### 2. MainActivity Setup\n\n```kotlin\n// MainActivity.kt\nimport com.telnyx.react_voice_commons.TelnyxMainActivity\n\nclass MainActivity : TelnyxMainActivity() {\n    override fun onHandleIntent(intent: Intent) {\n        super.onHandleIntent(intent)\n        // Additional intent processing\n    }\n}\n```\n\n### 3. Background Message Handler\n\n```tsx\n// index.js or App.tsx\nimport messaging from '@react-native-firebase/messaging';\nimport { TelnyxVoiceApp } from '@telnyx/react-voice-commons-sdk';\n\nmessaging().setBackgroundMessageHandler(async (remoteMessage) => {\n  await TelnyxVoiceApp.handleBackgroundPush(remoteMessage.data);\n});\n```\n\n---\n\n## Push Notifications - iOS (PushKit)\n\n### AppDelegate Setup\n\n```swift\n// AppDelegate.swift\nimport PushKit\nimport TelnyxVoiceCommons\n\n@UIApplicationMain\npublic class AppDelegate: ExpoAppDelegate, PKPushRegistryDelegate {\n  \n  public override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil\n  ) -> Bool {\n    // Initialize VoIP push registration\n    TelnyxVoipPushHandler.initializeVoipRegistration()\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n  \n  // VoIP Push Token Update\n  public func pushRegistry(_ registry: PKPushRegistry, \n                           didUpdate pushCredentials: PKPushCredentials, \n                           for type: PKPushType) {\n    TelnyxVoipPushHandler.shared.handleVoipTokenUpdate(pushCredentials, type: type)\n  }\n  \n  // VoIP Push Received\n  public func pushRegistry(_ registry: PKPushRegistry, \n                           didReceiveIncomingPushWith payload: PKPushPayload, \n                           for type: PKPushType, \n                           completion: @escaping () -> Void) {\n    TelnyxVoipPushHandler.shared.handleVoipPush(payload, type: type, completion: completion)\n  }\n}\n```\n\n> **Note**: CallKit integration is automatically handled by the internal CallBridge component.\n\n---\n\n## Configuration Options\n\n### createTelnyxVoipClient Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enableAppStateManagement` | boolean | true | Auto background/foreground handling |\n| `debug` | boolean | false | Enable debug logging |\n\n### TelnyxVoiceApp Props\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `voipClient` | TelnyxVoipClient | The VoIP client instance |\n| `enableAutoReconnect` | boolean | Auto-reconnect on disconnect |\n| `debug` | boolean | Enable debug logging |\n\n---\n\n## Storage Keys (Managed Automatically)\n\nThe library manages these AsyncStorage keys internally:\n\n- `@telnyx_username` - SIP username\n- `@telnyx_password` - SIP password\n- `@credential_token` - JWT token\n- `@push_token` - Push notification token\n\n> You don't need to manage these manually.\n\n---\n\n## Troubleshooting\n\n| Issue | Solution |\n|-------|----------|\n| Double login | Don't call `login()` manually when using `TelnyxVoiceApp` with auto-reconnect |\n| Background disconnect | Check `enableAutoReconnect` setting |\n| Android push not working | Verify `google-services.json` and MainActivity extends `TelnyxMainActivity` |\n| iOS push not working | Ensure AppDelegate implements `PKPushRegistryDelegate` and calls `TelnyxVoipPushHandler` |\n| Memory leaks | Unsubscribe from RxJS observables in useEffect cleanup |\n| Audio issues | iOS audio handled by CallBridge; Android check ConnectionService |\n\n### Clear Stored Auth (Advanced)\n\n```tsx\nimport AsyncStorage from '@react-native-async-storage/async-storage';\n\nawait AsyncStorage.multiRemove([\n  '@telnyx_username',\n  '@telnyx_password', \n  '@credential_token',\n  '@push_token',\n]);\n```\n\n---\n\n<!-- BEGIN AUTO-GENERATED API REFERENCE -- do not edit below this line -->\n\n**[references/webrtc-server-api.md](references/webrtc-server-api.md) has the server-side WebRTC API — credential creation, token generation, and push notification setup. You MUST read it when setting up authentication or push notifications.**\n\n## API Reference\n\n\n### TelnyxVoipClient\n\n# Class: TelnyxVoipClient\n\nThe main public interface for the react-voice-commons module.\n\nThis class serves as the Façade for the entire module, providing a simplified\nAPI that completely hides the underlying complexity. It is the sole entry point\nfor developers using the react-voice-commons package.\n\nThe TelnyxVoipClient is designed to be state-management agnostic, exposing\nall observable state via RxJS streams. This allows developers to integrate it\ninto their chosen state management solution naturally.\n\n### Methods\n\n### login()\n\n> **login**(`config`): `Promise`\\<`void`\\>\n### Parameters\n### config\n\n[`CredentialConfig`](../interfaces/CredentialConfig.md)\n### Returns\n\nA Promise that completes when the connection attempt is initiated\n### loginWithToken()\n\n> **loginWithToken**(`config`): `Promise`\\<`void`\\>\n### Parameters\n### config\n\n[`TokenConfig`](../interfaces/TokenConfig.md)\n### Returns\n\nA Promise that completes when the connection attempt is initiated\n### logout()\n\n> **logout**(): `Promise`\\<`void`\\>\n### Returns\n### loginFromStoredConfig()\n\n> **loginFromStoredConfig**(): `Promise`\\<`boolean`\\>\n### Returns\n### newCall()\n\n> **newCall**(`destination`, `callerName?`, `callerNumber?`, `customHeaders?`): `Promise`\\<[`Call`](Call.md)\\>\n### Parameters\n### destination\n\nThe destination number or SIP URI to call\n### callerName?\n\nOptional caller name to display\n### callerNumber?\n\nOptional caller ID number\n### customHeaders?\n\nOptional custom headers to include with the call\n### Returns\n\nA Promise that completes with the Call object once the invitation has been sent\n### handlePushNotification()\n\n> **handlePushNotification**(`payload`): `Promise`\\<`void`\\>\n### Parameters\n### payload\n\nThe push notification payload\n### Returns\n### disablePushNotifications()\n\n> **disablePushNotifications**(): `void`\n### Returns\n### setCallConnecting()\n\n> **setCallConnecting**(`callId`): `void`\n### Parameters\n### callId\n\nThe ID of the call to set to connecting state\n### Returns\n### findCallByTelnyxCall()\n\n> **findCallByTelnyxCall**(`telnyxCall`): [`Call`](Call.md)\n### Parameters\n### telnyxCall\n\nThe Telnyx call object to find\n### Returns\n\n[`Call`](Call.md)\n### queueAnswerFromCallKit()\n\n> **queueAnswerFromCallKit**(`customHeaders`): `void`\n### Parameters\n### customHeaders\n\nOptional custom headers to include with the answer\n### Returns\n### queueEndFromCallKit()\n\n> **queueEndFromCallKit**(): `void`\n### Returns\n### dispose()\n\n> **dispose**(): `void`\n### Returns\n\n\n### Call\n\n# Class: Call\n\nRepresents a call with reactive state streams.\n\nThis class wraps the underlying Telnyx Call object and provides\nreactive streams for all call state changes, making it easy to\nintegrate with any state management solution.\n\n### Methods\n\n### answer()\n\n> **answer**(`customHeaders?`): `Promise`\\<`void`\\>\n### Parameters\n### customHeaders?\n\nOptional custom headers to include with the answer\n### Returns\n### hangup()\n\n> **hangup**(`customHeaders?`): `Promise`\\<`void`\\>\n### Parameters\n### customHeaders?\n\nOptional custom headers to include with the hangup request\n### Returns\n### hold()\n\n> **hold**(): `Promise`\\<`void`\\>\n### Returns\n### resume()\n\n> **resume**(): `Promise`\\<`void`\\>\n### Returns\n### mute()\n\n> **mute**(): `Promise`\\<`void`\\>\n### Returns\n### unmute()\n\n> **unmute**(): `Promise`\\<`void`\\>\n### Returns\n### toggleMute()\n\n> **toggleMute**(): `Promise`\\<`void`\\>\n### Returns\n### setConnecting()\n\n> **setConnecting**(): `void`\n### Returns\n### dispose()\n\n> **dispose**(): `void`\n### Returns\n\n\n### TelnyxCallState\n\n# Enumeration: TelnyxCallState\n\nRepresents the state of a call in the Telnyx system.\n\nThis enum provides a simplified view of call states, abstracting away\nthe complexity of the underlying SIP call states.\n\n### Enumeration Members\n\n### RINGING\n\n> **RINGING**: `\"RINGING\"`\n### CONNECTING\n\n> **CONNECTING**: `\"CONNECTING\"`\n### ACTIVE\n\n> **ACTIVE**: `\"ACTIVE\"`\n### HELD\n\n> **HELD**: `\"HELD\"`\n### ENDED\n\n> **ENDED**: `\"ENDED\"`\n### FAILED\n\n> **FAILED**: `\"FAILED\"`\n### DROPPED\n\n> **DROPPED**: `\"DROPPED\"`\n\n\n### TelnyxConnectionState\n\n# Enumeration: TelnyxConnectionState\n\nRepresents the connection state to the Telnyx platform.\n\nThis enum provides a simplified view of the connection status,\nabstracting away the complexity of the underlying WebSocket states.\n\n### Enumeration Members\n\n### DISCONNECTED\n\n> **DISCONNECTED**: `\"DISCONNECTED\"`\n### CONNECTING\n\n> **CONNECTING**: `\"CONNECTING\"`\n### CONNECTED\n\n> **CONNECTED**: `\"CONNECTED\"`\n### RECONNECTING\n\n> **RECONNECTING**: `\"RECONNECTING\"`\n### ERROR\n\n> **ERROR**: `\"ERROR\"`\n\n<!-- END AUTO-GENERATED API REFERENCE -->","tags":["telnyx","webrtc","client","react","native","team-telnyx","agent-skills","ai-coding-agent","claude-code","cpaas","cursor","iot"],"capabilities":["skill","source-team-telnyx","skill-telnyx-webrtc-client-react-native","topic-agent-skills","topic-ai-coding-agent","topic-claude-code","topic-cpaas","topic-cursor","topic-iot","topic-llm","topic-sdk","topic-sip","topic-sms","topic-speech-to-text","topic-telephony"],"categories":["ai"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/team-telnyx/ai/telnyx-webrtc-client-react-native","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add team-telnyx/ai","source_repo":"https://github.com/team-telnyx/ai","install_from":"skills.sh"}},"qualityScore":"0.533","qualityRationale":"deterministic score 0.53 from registry signals: · indexed on github topic:agent-skills · 167 github stars · SKILL.md body (12,341 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:54:55.643Z","embedding":null,"createdAt":"2026-04-18T22:08:45.522Z","updatedAt":"2026-04-22T00:54:55.643Z","lastSeenAt":"2026-04-22T00:54:55.643Z","tsv":"'+18004377950':289 '/async-storage':643 '/interfaces/credentialconfig.md':772 '/interfaces/tokenconfig.md':792 '/messaging':384 '1':338,343 '2':349 '3':369 'abstract':1066,1120 'activ':249,1084,1085,1086 'activecal':255,257 'addit':366 'advanc':633 'agnost':742 'allow':751 'android':22,81,85,341,590,627 'answer':315,930,978,979,992 'api':662,682,711 'apns/pushkit':87 'app':21,126 'app.tsx':376 'appdeleg':400,411,605 'appdelegate.swift':403 'applic':417,418,433 'async':391,641 'asyncstorag':540,636 'asyncstorage.multiremove':645 'attempt':781,801 'audio':620,623 'auth':211,632 'authent':135,678 'auto':116,187,500,523,583 'auto-reconnect':186,522,582 'automat':70,191,198,296,311,482,535 'await':158,183,205,287,318,321,323,326,328,332,336,393,644 'away':1067,1121 'background':370,585 'background/foreground':72,117,501 'base':67,138,163 'bash':95 'basic':99 'bool':425 'boolean':498,504,521,528,812 'build':12 'call':75,232,250,264,269,276,281,283,286,291,293,306,312,317,331,575,609,821,832,852,860,894,904,910,915,940,942,945,956,964,1052,1064,1074 'call.answer':319 'call.callstate':272 'call.dtmf':337 'call.hangup':333 'call.hold':327 'call.md':822,905,916 'call.mute':322 'call.unhold':329 'call.unmute':324 'callbridg':487,626 'caller':835,841 'callernam':817,833 'callernumb':818,839 'callid':886,889 'callkit':77,479 'callkit/connectionservice':308 'callscreen':225 'callssub':252 'callssub.unsubscribe':260 'chang':966 'check':587,628 'chosen':758 'class':356,410,685,699,941,951 'cleanup':619 'clear':630 'client':4,109,518 'com.telnyx.react_voice_commons.telnyxmainactivity':355 'common':696,731 'communic':17 'complet':469,476,477,713,777,797,857 'complex':717,1069,1123 'compon':488 'config':146,160,172,185,766,770,786,790 'configur':489 'connect':238,780,800,898,1081,1082,1083,1104,1118,1134,1135,1136,1137,1138,1139 'connectionservic':80,629 'connectionst':227 'connsub':241 'connsub.unsubscribe':259 'console.log':275 'const':111,145,171,203,226,231,240,251,270,285 'control':313 'creat':29,107 'createcredentialconfig':142,147 'createtelnyxvoipcli':104,113,491 'createtokenconfig':168,173 'creation':664 'credenti':31,137,193,202,551,650,663 'credential-bas':136 'credentialconfig':771 'custom':846,924,986,1002 'customhead':819,844,919,922,980,984,996,1000 'debug':119,133,152,177,503,507,527,530 'default':124,495 'definit':93 'descript':496,513 'design':736 'destin':816,824,826 'develop':725,752 'devic':156,181 'didfinishlaunchingwithopt':420,434 'didreceiveincomingpushwith':463 'didupd':445 'disablepushnotif':880,881 'disconnect':526,586,1131,1132,1133 'display':310,838 'dispos':936,937,1040,1041 'doubl':571 'drop':1096,1097,1098 'dtmf':335 'e.g':55 'easi':969 'enabl':121,506,529 'enableappstatemanag':114,497 'enableautoreconnect':131,520,588 'end':330,1090,1091,1092 'ensur':604 'entir':706 'entri':722 'enum':1058,1111 'enumer':1045,1076,1100,1129 'error':1143,1144,1145 'escap':470 'expoappdeleg':412 'export':123 'expos':743 'extend':598 'fail':1093,1094,1095 'fals':132,505 'façad':703 'fcm':84,342 'featur':62 'find':913 'findcallbytelnyxcal':901,902 'firebas':383 'full':91 'fun':360 'func':416,441,459 'function':125,224 'generat':33,666 'google-services.json':345,595 'handl':73,118,295,483,502,624 'handlepushnotif':868,869 'handler':372 'hangup':994,995,1008 'header':847,925,987,1003 'held':1087,1088,1089 'hide':714 'hold':1011,1012 'hold/unhold':325 'id':842,891 'implement':606 'import':102,141,167,219,354,377,385,404,406,635 'includ':849,927,989,1005 'incom':292,316 'index.js':374 'individu':263 'initi':426,783,803 'instal':94,97 'instanc':110,519 'integr':480,754,971 'intent':362,363,365,367 'interfac':690 'intern':486,542 'invit':864 'io':23,78,88,398,600,622 'issu':569,621 'javascript':61 'jwt':165,175,553 'key':533,541 'kotlin':352 'languag':53 'launchopt':421,435 'leak':612 'librari':27,190,537 'lifecycl':71 'log':122,508,531 'login':35,139,164,213,572,576,764,765 'loginfromstoredconfig':809,810 'loginwithtoken':784,785 'logout':804,805 'main':688 'mainact':350,357,597 'mainactivity.kt':353 'make':282,967 'manag':69,217,534,538,565,741,760,975 'manual':567,577 'member':1077,1130 'memori':611 'messag':371,378,389 'method':763,977 'modul':697,707 'must':672 'mute':1021,1022 'mute/unmute':320 'name':836 'nativ':6,10,20,74,305,382,640 'natur':762 'need':563 'newcal':814,815 'nil':424 'note':478 'notif':83,299,340,397,558,669,681,877 'npm':96 'null':230 'number':827,843 'object':861,911,957 'observ':616,745 'onhandleint':361 'option':490,492,493,834,840,845,923,985,1001 'overrid':359,415 'packag':732 'paramet':769,789,823,873,888,906,921,983,999 'password':151,548,550,649 'payload':464,473,870,874,878 'pkpushcredenti':447 'pkpushpayload':465 'pkpushregistri':444,462 'pkpushregistrydeleg':413,607 'pkpushtyp':450,468 'place':344 'platform':1109 'plugin':54 'point':723 'prerequisit':28 'process':368 'project':347 'promis':767,775,787,795,806,811,820,855,871,981,997,1013,1018,1023,1028,1033 'prop':510,511 'provid':708,959,1059,1112 'public':409,414,440,458,689 'push':82,298,339,396,428,437,456,555,557,591,601,652,668,680,876 'pushcredenti':446,452 'pushkit':399,405 'pushnotificationdevicetoken':154,179 'pushregistri':442,460 'python':58 'queueanswerfromcallkit':917,918 'queueendfromcallkit':932,933 'react':5,9,19,223,381,639,694,729 'react-native-async-storag':638 'react-native-firebas':380 'react-voice-common':693,728 'reactiv':63,215,947,960 'read':673 'real':14 'real-tim':13 'receiv':290,457 'reconnect':188,196,199,524,584,1140,1141,1142 'refer':683 'references/webrtc-server-api.md':654,655 'registr':429 'registri':443,461 'remotemessag':392 'remotemessage.data':395 'repres':943,1047,1102 'request':1009 'resum':1016,1017 'return':127,258,261,279,431,773,793,808,813,853,879,883,900,914,931,935,939,993,1010,1015,1020,1025,1030,1035,1039,1043 'ring':1078,1079,1080 'root':348 'rxjs':66,615,748 'rxjs-base':65 'sdk':11,43 'seamless':195 'see':44 'send':334 'sent':867 'serv':700 'server':41,52,659 'server-sid':40,658 'set':589,676,896 'setbackgroundmessagehandl':390 'setcal':233,256 'setcallconnect':884,885 'setconnect':1036,1037 'setconnectionst':228,245 'setup':100,351,401,670 'show':212 'side':42,660 'simplifi':710,1061,1114 'sip':148,150,545,549,829,1073 'skill':49 'skill-telnyx-webrtc-client-react-native' 'sole':721 'solut':570,761,976 'source-team-telnyx' 'state':68,216,239,244,246,265,274,277,278,740,746,759,899,948,965,974,1049,1065,1075,1105,1128 'state-manag':739 'status':1119 'storag':532,642 'store':192,201,210,631 'stream':64,749,949,961 'sub':271 'sub.unsubscribe':280 'subscrib':236,243,247,254,273 'success':204,208 'super.application':432 'super.onhandleintent':364 'support':90 'swift':402 'system':1056 'telnyx':2,7,39,47,57,60,543,547,646,648,909,955,1055,1108 'telnyx-javascript':59 'telnyx-python':56 'telnyx-webrtc':46 'telnyx-webrtc-client-react-n':1 'telnyx/react-voice-commons-sdk':26,98,106,144,170,388 'telnyxcal':903,907 'telnyxcallst':1044,1046 'telnyxconnectionst':1099,1101 'telnyxmainact':358,599 'telnyxvoiceapp':103,128,302,386,509,580 'telnyxvoiceapp.handlebackgroundpush':394 'telnyxvoicecommon':407 'telnyxvoipcli':515,684,686,734 'telnyxvoippushhandl':610 'telnyxvoippushhandler.initializevoipregistration':430 'telnyxvoippushhandler.shared.handlevoippush':472 'telnyxvoippushhandler.shared.handlevoiptokenupdate':451 'time':15 'togglemut':1031,1032 'token':36,157,162,176,182,438,552,554,556,559,651,653,665 'token-bas':161 'tokenconfig':791 'topic-agent-skills' 'topic-ai-coding-agent' 'topic-claude-code' 'topic-cpaas' 'topic-cursor' 'topic-iot' 'topic-llm' 'topic-sdk' 'topic-sip' 'topic-sms' 'topic-speech-to-text' 'topic-telephony' 'troubleshoot':568 'true':115,120,134,153,178,499 'tsx':101,140,166,197,218,266,284,314,373,634 'type':92,449,453,454,467,474,475,494,512 'typescript':89 'ui':76,214,262,307 'uiapplic':419 'uiapplication.launchoptionskey':422 'uiapplicationmain':408 'under':716,954,1072,1126 'unmut':1026,1027 'unsubscrib':613 'updat':439 'uri':830 'use':24,37,200,579,726 'useeffect':220,235,267,618 'usernam':149,544,546,647 'usest':221,229,234 'verifi':594 'via':297,747 'view':1062,1115 'voic':16,695,730 'void':471,768,788,807,872,882,887,920,934,938,982,998,1014,1019,1024,1029,1034,1038,1042 'voip':108,427,436,455,517 'voipclient':112,129,130,514 'voipclient.calls':253 'voipclient.connectionstate':242 'voipclient.login':159 'voipclient.loginfromstoredconfig':206 'voipclient.loginwithtoken':184 'voipclient.newcall':288 'webrtc':3,8,30,48,661 'websocket':1127 'work':593,603 'wrap':952 'wrapper':303","prices":[{"id":"2af22caa-f75f-42ec-9a2e-ba37fff91fb4","listingId":"3967e978-6540-480c-ad96-2729f481b750","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"team-telnyx","category":"ai","install_from":"skills.sh"},"createdAt":"2026-04-18T22:08:45.522Z"}],"sources":[{"listingId":"3967e978-6540-480c-ad96-2729f481b750","source":"github","sourceId":"team-telnyx/ai/telnyx-webrtc-client-react-native","sourceUrl":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-webrtc-client-react-native","isPrimary":false,"firstSeenAt":"2026-04-18T22:08:45.522Z","lastSeenAt":"2026-04-22T00:54:55.643Z"}],"details":{"listingId":"3967e978-6540-480c-ad96-2729f481b750","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"team-telnyx","slug":"telnyx-webrtc-client-react-native","github":{"repo":"team-telnyx/ai","stars":167,"topics":["agent-skills","ai","ai-coding-agent","claude-code","cpaas","cursor","iot","llm","sdk","sip","sms","speech-to-text","telephony","telnyx","tts","twilio-migration","voice-agents","voice-ai","webrtc","windsurf"],"license":"mit","html_url":"https://github.com/team-telnyx/ai","pushed_at":"2026-04-21T22:09:49Z","description":"Official one-stop shop for AI Agents and developers building with Telnyx.","skill_md_sha":"9fe60539ce8e2ea468b0a165f9f27a7d39859964","skill_md_path":"skills/telnyx-webrtc-client-react-native/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-webrtc-client-react-native"},"layout":"multi","source":"github","category":"ai","frontmatter":{"name":"telnyx-webrtc-client-react-native","description":">-"},"skills_sh_url":"https://skills.sh/team-telnyx/ai/telnyx-webrtc-client-react-native"},"updatedAt":"2026-04-22T00:54:55.643Z"}}