{"id":4012,"date":"2021-11-02T14:54:21","date_gmt":"2021-11-02T06:54:21","guid":{"rendered":"https:\/\/www.enablex.io\/developer\/?page_id=4012"},"modified":"2022-04-11T14:56:01","modified_gmt":"2022-04-11T06:56:01","slug":"pre-call-test","status":"publish","type":"page","link":"https:\/\/doc.smartflomeet.ttns.in\/developer\/video-api\/client-api\/web-toolkit\/pre-call-test\/","title":{"rendered":"Pre-Call Test: Web SDK &#8211; Video API"},"content":{"rendered":"\n<p><strong>Availability:<\/strong>&nbsp;<em>Web SDK v1.9.5+<\/em><\/p>\n\n\n\n<p>The&nbsp;<code>EnxRtc.clientDiagnostics()<\/code>&nbsp;method acts as a Diagnostic Tool to detect any issue causing the RTC to fail. The API runs through predefined test cases related to WebRTC issues and reports asynchronously through an Event as it passes through each test. These test cases are organized in \u201c<strong>Test Groups<\/strong>\u201d as shown below:<\/p>\n\n\n\n<ul><li><strong>Microphone<\/strong><ul><li>Audio capture<\/li><\/ul><\/li><li><strong>Camera<\/strong><ul><li>Check resolution 320&#215;240<\/li><li>Check resolution 640&#215;480<\/li><li>Check resolution 1280&#215;720<\/li><li>Check supported resolutions<\/li><\/ul><\/li><li><strong>Network<\/strong><ul><li>UDP enabled with TURN server<\/li><li>TCP enabled with TURN server<\/li><li>IPv6 enabled with TURN server<\/li><\/ul><\/li><li><strong>Connectivity<\/strong><ul><li>Relay connectivity with TURN server<\/li><li>Reflexive connectivity with TURN server<\/li><li>Host connectivity with TURN server<\/li><\/ul><\/li><li><strong>Throughput<\/strong><ul><li>Data throughput with TURN server<\/li><\/ul><\/li><li><strong>Bandwidth<\/strong><ul><li>Video bandwidth with TURN server<\/li><li>Audio bandwidth with TURN Server<\/li><\/ul><\/li><li><strong>Signalling<\/strong><ul><li>Signalling connectivity with TURN server<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>You can also build a UI to initiate the tests and generate a diagnostic report using this API.<\/p>\n\n\n\n<p><strong>Class:<\/strong> <code>EnxRtc <\/code><\/p>\n\n\n\n<p><strong>Method:<\/strong> <code>EnxRtc.clientDiagnostics(ClientInfo)<\/code><\/p>\n\n\n\n<p><strong>Parameters:<\/strong> <\/p>\n\n\n\n<ul id=\"block-e5f9f797-a887-4336-b9d2-1bd071f28fa8\"><li><code>ClientInfo <\/code>\u2013 JSON object with Client preferences for the execution of Test cases. JSON Keys are explained below:<ul><li><code>testNames<\/code> \u2013 Array of Test Group names. e.g. <code>[ \"microphone\", \"camera\", \"network\", \"connectivity\", \"throughput\", \"bandwidth\", \"signalling\"]<\/code><ul><li>To test only selected Test Groups, add selected Test Group names e.g.,&nbsp;<code>[\"microphone\", \"camera\"]<\/code>.<\/li><li>To test all the Test Groups, use&nbsp;<code>[\"all\"]<\/code>.<\/li><\/ul><\/li><li><code>audioDeviceId<\/code> \u2013 Optional. Device Id of input audio device.<\/li><li><code>videoDeviceId<\/code> \u2013 Optional. Device Id of input video device.<\/li><li><code>regionId<\/code> \u2013 Optional. &nbsp;Array of region Ids of ICE Servers, e.g.&nbsp;<code>[\"IN\", \"SG\", \"US\", \"DE\"].<\/code>&nbsp;Get Region-ID list from Portal.<\/li><li><code>testDurationDataThroughput<\/code> \u2013 Optional. Test duration of data throughput in seconds. [Range: 1-30 sec. Default: 2 sec].<\/li><li><code>testDurationVideoBandwidth<\/code> \u2013 Optional. Test duration of video bandwidth in seconds. [Range: 1-30 sec. Default: 10 sec].<\/li><li><code>testDurationAudioBandwidth<\/code> \u2013 Optional. Test duration of audio bandwidth in seconds. [Range: 1-30 sec. Default: 10 sec].<\/li><li><code>stop<\/code> \u2013 Optional. Boolean. Set to&nbsp;<em>true<\/em>&nbsp;to stop the test cases which are already in execution.<\/li><\/ul><\/li><\/ul>\n\n\n\n<p><strong>Event Notifications:<\/strong><\/p>\n\n\n\n<ul><li><code>client-diagnosis-failed <\/code>&#8211; Notification of Diagnosis failure when API is called with the wrong parameter or a repeated attempt to call the API is made while the previous request is under process.<\/li><li><code>client-diagnosis-stopped<\/code> &#8211; Notification sent when the API execution is stopped explicitly through Method Call.<\/li><li><code>client-diagnosis-finished<\/code> &#8211; Notification sent when the API completes execution of all the test cases. This returns a JSON Object with a complete test result of all the test cases.<\/li><li><code>client-diagnosis-status<\/code> &#8211; Notification sent with the test result of each test case as the API passes through the execution of each test till the completion or till stopped explicitly. This returns a JSON Object with test results.<\/li><\/ul>\n\n\n\n<p><strong><strong>Request for diagnostics:<\/strong><\/strong><\/p>\n\n\n\n<pre id=\"block-4a221594-c2ed-481b-a1da-8be8dbc78504\" class=\"wp-block-preformatted\">var Options = {<br>     testNames: ['microphone', 'camera'],<br>     audioDeviceId: 'XXX',<br>     videoDeviceId: 'XXX',<br>     regionId: ['IN'],<br>     testDurationDataThroughput: 2,<br>     testDurationVideoBandwidth: 30,<br>     testDurationAudioBandwidth: 30,<br>     stop: false<br>};<br><br>client = EnxRtc.clientDiagnostics(Options); \/\/ Execute Test <br><br>\/\/ Test Execution finished<br>client.addEventListener(\"client-diagnosis-finished\", function(response) {<br>\t\/\/ Handle JSON from response.message.<br>\t\/\/ It contains complete test result. A response example given later<br>});<br><br>\/\/ Test Execution has failed<br>client.addEventListener(\"client-diagnosis-failed\", function(response) {<br>\t\/\/ Handle error message from response.message.<br>\t\/\/ Response example:<br>\t\/* <br>\t- Invalid argument.<br>\t- Diagnosis is already in progress. Few resources are in use and may not be accessible.<br>\t*\/<br>});<br><br>\/\/ Test Execution has stopped<br>client.addEventListener('client-diagnosis-stopped', function(response) {<br>\t\/\/ Handle info message from response.message<br>\t\/\/ Response example:<br>\t\/* <br>\t- Diagnosis stopped.<br>\t- Diagnosis not running.<br>\t*\/<br>});<br><br>\/\/ Intermediate Test Result of each  Test Case <br>client.addEventListener(\"client-diagnosis-status\", function(response) {<br>\t\/\/ Handle JSON in response.message<br>\t\/\/ It contains complete test result. A response example given later<br>});<\/pre>\n\n\n\n<p><strong>Response at the beginning of the Test:&nbsp;<\/strong><code>client-diagnosis-status<\/code> <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"test_group\": \"microphone\",\n  \"test_case\": \"audio_capture\",\n  \"status\": \"started\",\n  \"output\": \"\"\n}<\/pre>\n\n\n\n<p><strong><strong>Intermediate Response after finishing a test case:&nbsp;<\/strong><\/strong><code>client-diagnosis-status <\/code><\/p>\n\n\n\n<pre id=\"block-4073e56b-3339-40d1-8b5c-bcbb8693e20e\" class=\"wp-block-preformatted\">{<br>  \"test_group\": \"microphone\",<br>  \"test_case\": \"audio_capture\",<br>  \"status\": \"finished\",<br>  \"output\": {<br>    \"audio_capture\": {<br>      \"result\": \"success\",<br>      \"execution_time\": \"241 ms\",<br>      \"success\": [<br>        {<br>          \"message\": \"Audio track created using device=Default - Microphone Array (Synaptics Audio)\"<br>        },<br>        {<br>          \"message\": \"Active audio input channels: 2\"<br>        }<br>      ],<br>      \"error\": [],<br>      \"warning\": [],<br>      \"info\": [<br>        {<br>          \"message\": \"Channel 0 levels: -38.3 dB (peak), -48.4 dB (RMS)\"<br>        },<br>        {<br>          \"message\": \"Channel 1 levels: -38.3 dB (peak), -48.4 dB (RMS)\"<br>        },<br>        {<br>          \"message\": \"Stereo microphone detected.\"<br>        }<br>      ]<br>    }<br>  }<br>}<\/pre>\n\n\n\n<p><strong>Final Response after completion of all the test cases: <\/strong><code>client-diagnosis-finished<\/code> <\/p>\n\n\n\n<pre id=\"block-a9888e28-99bd-4b09-91f6-4ce0f56653d1\" class=\"wp-block-preformatted\">{<br>  \"microphone\": {<br>    \"audio_capture\": {<br>      \"result\": \"success\",<br>      \"execution_time\": \"241 ms\",<br>      \"success\": [<br>        {<br>          \"message\": \"Audio track created using device=Default - Microphone Array (Synaptics Audio)\"<br>        },<br>        {<br>          \"message\": \"Active audio input channels: 2\"<br>        }<br>      ],<br>      \"error\": [],<br>      \"warning\": []<br>    }<br>  },<br>  \"network\": {<br>    \"udp_enabled\": {<br>      \"IN\": {<br>        \"TURN\": {<br>          \"result\": \"success\",<br>          \"execution_time\": \"241 ms\",<br>          \"success\": [<br>            {<br>              \"message\": \"Gathered candidate of Type: relay Protocol: udp Address: 104.211.155.197\"<br>            }<br>          ],<br>          \"error\": [],<br>          \"warning\": [],<br>          \"server\": {<br>            \"region\": \"IN\",<br>            \"url\": \"turns:ts.enablex.io:443\"<br>          }<br>        }<br>      }<br>    },<br>    \"tcp_enabled\": {<br>      \"IN\": {<br>        \"TURN\": {<br>          \"result\": \"success\",<br>          \"execution_time\": \"241 ms\",<br>          \"success\": [<br>            {<br>              \"message\": \"Gathered candidate of Type: relay Protocol: udp Address: 104.211.155.197\"<br>            }<br>          ],<br>          \"error\": [],<br>          \"warning\": [],<br>          \"server\": {<br>            \"region\": \"IN\",<br>            \"url\": \"turns:ts.enablex.io:443\"<br>          }<br>        }<br>      }<br>    }<br>  }<br>}<\/pre>\n\n\n\n<p><strong>Test Result Explanation<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Test Group<\/th><th class=\"has-text-align-center\" data-align=\"center\">Test Case<\/th><th>Server<\/th><th>Result<\/th><th>Message<\/th><\/tr><\/thead><tbody><tr><td>Microphone<\/td><td class=\"has-text-align-center\" data-align=\"center\">Audio Capture<\/td><td>N\/A<\/td><td>Success<\/td><td>Audio track created using device #device#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Success<\/td><td>Active audio input channels #channel#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>WebAudio run failure:<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>No audio track in returned stream<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>No active input channels detected<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>No active input channels detected. Microphone is most likely muted or broken, please check if muted in the sound settings or physically on the device. Then re-run the test.<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Microphone input level is low, increase input volume or move closer to the microphone.<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>getUserMedia failed with error #error#<\/td><\/tr><tr><td>Camera<\/td><td class=\"has-text-align-center\" data-align=\"center\">check resolution 240<\/td><td>N\/A<\/td><td>Success<\/td><td>Captured video using expected resolution<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Success<\/td><td>Average FPS above threshold<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>getUserMedia failed with error #error#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>No video track in returned stream<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Video track ended, camera stopped working<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Low average sent FPS<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Incorrect captured resolution<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Could not analyze any video frame<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Camera delivering lots of black frames<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Camera delivering lots of frozen frames<\/td><\/tr><tr><td>Camera<\/td><td class=\"has-text-align-center\" data-align=\"center\">check resolution 480<\/td><td><\/td><td>Success<\/td><td>Captured video using expected resolution<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Success<\/td><td>Average FPS above threshold<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>getUserMedia failed with error #error#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>No video track in returned stream<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Video track ended, camera stopped working<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Low average sent FPS<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Incorrect captured resolution<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Could not analyze any video frame<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Camera delivering lots of black frames<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Camera delivering lots of frozen frames<\/td><\/tr><tr><td>Camera<\/td><td class=\"has-text-align-center\" data-align=\"center\">check resolution 720<\/td><td><\/td><td>Success<\/td><td>Captured video using expected resolution<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Success<\/td><td>Average FPS above threshold<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>getUserMedia failed with error #error#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>No video track in returned stream<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Video track ended, camera stopped working<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Low average sent FPS<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Faiiure<\/td><td>Incorrect captured resolution<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Could not analyze any video frame<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Camera delivering lots of black frames<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Camera delivering lots of frozen frames<\/td><\/tr><tr><td>Camera<\/td><td class=\"has-text-align-center\" data-align=\"center\">check supported resolutions<\/td><td>N\/A<\/td><td>Success<\/td><td>Success Supported resolution #resolution#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>No video track in returned stream<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Video track ended, camera stopped working<\/td><\/tr><tr><td>Network<\/td><td class=\"has-text-align-center\" data-align=\"center\">udp enabled<\/td><td>TURN<\/td><td>Success<\/td><td>Supported resolution #resolution#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>No video track in returned stream<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Video track ended, camera stopped working<\/td><\/tr><tr><td>Network<\/td><td class=\"has-text-align-center\" data-align=\"center\">tcp enabled<\/td><td>TURN<\/td><td>Success<\/td><td>Gathered candidate of Type: relay Protocol: udp Address: #IP#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Failed to gather specified candidates<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Failed to create peer connection: #&lt;error#<\/td><\/tr><tr><td>Network<\/td><td class=\"has-text-align-center\" data-align=\"center\">ipv6 enabled<\/td><td>TURN<\/td><td>Success<\/td><td>Gathered candidate of Type: relay Protocol: udp Address: #IP#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Failed to gather IPv6 candidates, it might not be setup\/supported on the network<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Failed to gather IPv6 candidates, it might not be setup\/supported on the network<\/td><\/tr><tr><td>Connectivity<\/td><td class=\"has-text-align-center\" data-align=\"center\">relay connectivity<\/td><td>TURN<\/td><td>Success<\/td><td>Data successfully transmitted between peers<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Invalid data transmitted<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Time out<\/td><\/tr><tr><td>Connectivity<\/td><td class=\"has-text-align-center\" data-align=\"center\">reflexive connectivity<\/td><td>TURN<\/td><td>Success<\/td><td>Data successfully transmitted between peers<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Invalid data transmitted<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Time out<\/td><\/tr><tr><td>Connectivity<\/td><td class=\"has-text-align-center\" data-align=\"center\">host connectivity<\/td><td>TURN<\/td><td>Success<\/td><td>Data successfully transmitted between peers<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Invalid data transmitted<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Time out<\/td><\/tr><tr><td>Throughput<\/td><td class=\"has-text-align-center\" data-align=\"center\">Data Throughput<\/td><td>TURN<\/td><td>Success<\/td><td>Total transmitted: #n# kilo-bits in #t# seconds<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Timed out<\/td><\/tr><tr><td>Bandwidth<\/td><td class=\"has-text-align-center\" data-align=\"center\">Video Bandwidth<\/td><td>TURN<\/td><td>Success<\/td><td>Video resolution: #Width# x #Height#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Camera failure: #Width# x #Height#. Cannot test bandwidth without a working camera<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>getUserMedia failed with error #error#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Frame rate mean is 0, cannot test bandwidth without a working camera<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Could not gather stats<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Only Firefox and Chrome getStats implementations are supported<\/td><\/tr><tr><td>Bandwidth<\/td><td class=\"has-text-align-center\" data-align=\"center\">Audio Bandwidth<\/td><td>TURN<\/td><td>Subject to quality<\/td><td>Average Audio bandwidth &lt;value&gt;<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Subject to quality<\/td><td>Packets lost: &lt;value&gt;<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Subject to quality<\/td><td>RTT Average: &lt;value&gt;<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>getUserMedia() failed with error &lt;error&gt;<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Only Firefox and Chrome getStats() implementations are supported<\/td><\/tr><tr><td>Signaling<\/td><td class=\"has-text-align-center\" data-align=\"center\">Signaling Connectivity<\/td><td><\/td><td>Success<\/td><td>Token created successfully<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Token creation failed due to error: #error#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Failure<\/td><td>Room not joined due to error: #error#<\/td><\/tr><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td><\/td><td>Success<\/td><td>Room joined successfully<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<a name=\"bitrate\"><\/a>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>Get Bitrate Status of Client<\/h2>\n\n\n\n<p><strong>Availability:<\/strong> <em>Web SDK v1.9.8+<\/em><\/p>\n\n\n\n<p>The&nbsp;<code>EnxRtc.clientBitrate()<\/code>&nbsp;method provides bitrate status of the Client. It carries out the following tests to generate a response:<\/p>\n\n\n\n<ul><li><strong>Bandwidth<\/strong><ul><li>Video bandwidth with TURN server<\/li><li>Audio bandwidth with TURN Server<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>You can also build a UI to initiate the tests and generate a diagnostic report using this API.<\/p>\n\n\n\n<p><strong>Class:<\/strong> <code>EnxRtc<\/code><\/p>\n\n\n\n<p><strong>Method:<\/strong> <code>EnxRtc.clientBitrate(clientInfo)<\/code><\/p>\n\n\n\n<p><strong>Parameters:<\/strong> <\/p>\n\n\n\n<ul id=\"block-e5f9f797-a887-4336-b9d2-1bd071f28fa8\"><li><code>clientInfo <\/code>\u2013 Optional. JSON object with Client preferences for the execution of test cases.<ul><li><code>region <\/code>\u2013 String. Region Id of ICE Server, e.g. <code>\"IN\", \"SG\", \"US\", \"DE\".<\/code> Default Region ID is &#8220;DE&#8221;.<\/li><\/ul><\/li><\/ul>\n\n\n\n<p><strong>Event Notifications:<\/strong><\/p>\n\n\n\n<ul><li><code style=\"background-color: rgb(255, 255, 255);\">client-bitrate-finished<\/code> &#8211; Notification sent when the API has completed the execution of the test case. This returns a JSON Object as the final result.<\/li><li><code>client-bitrate-status<\/code> &#8211; Notification sent with the test results at the beginning and end of the test. This returns a JSON Object as the test result. <\/li><\/ul>\n\n\n\n<p><strong><strong>Request for diagnostics:<\/strong><\/strong><\/p>\n\n\n\n<pre id=\"block-4a221594-c2ed-481b-a1da-8be8dbc78504\" class=\"wp-block-preformatted\">var clientInfo = {\n     region: 'IN'\n};\n\nlet client = EnxRtc.clientBitrate(clientInfo);\nclient.addEventListener(\"client-bitrate-status\", function(response) {\n     \/\/ handle info message from response.message\n});\n\nclient.addEventListener(\"client-bitrate-finished\", function(response) {\n     \/\/ handle json from response.message\n});\n<\/pre>\n\n\n\n<p><strong>Response at the beginning and end of Test:&nbsp;<\/strong><code>client-bitrate-status<\/code>   <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/Status at the start of test \n{\n  \"status\": \"started\",\n  \"test_case\": \"video_bandwidth\",\n  \"test_group\": \"bandwidth\",\n  \"test_region\": \"IN\",\n  \"test_server\": \"TURN\"\n}\n\n\/\/ Status at the end of test\n{\n  \"test_group\": \"bandwidth\",\n  \"test_case\": \"video_bandwidth\",\n  \"status\": \"finished\",\n  \"output\": {\n    \"video_bandwidth\": {\n      \"result\": \"success\",\n      \"bandwidth_bps\": 2221949,\n      \"packets_lost_percentage\": \"0.99\",\n      \"execution_time\": \"31566 ms\",\n      \"success\": [],\n      \"error\": [],\n      \"warning\": [],\n      \"info\": [],\n      \"server\": {\n        \"region\": \"IN\",\n        \"url\": \"turns:ts.enablex.io:443\"\n      }\n    }\n  },\n  \"test_region\": \"IN\",\n  \"test_server\": \"TURN\"\n}<\/pre>\n\n\n\n<p><strong>Final<\/strong>&nbsp;<strong>Response: <\/strong><code>client-bitrate-finished<\/code> <\/p>\n\n\n\n<pre id=\"block-a9888e28-99bd-4b09-91f6-4ce0f56653d1\" class=\"wp-block-preformatted\">{\n  \"video\": {\n    \"bitrate_bps\": 2221949,\n    \"connection\": \"stable\"\n  },\n  \"audio\": {\n    \"bitrate_bps\": 278067,\n    \"connection\": \"stable\"\n  }\n}<\/pre>\n\n\n\n<p><strong>Test Result Explanation<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Test Group<\/th><th>Test Case<\/th><th>Server<\/th><th>Result<\/th><th>Messsage<\/th><\/tr><\/thead><tbody><tr><td>Bandwidth<\/td><td>Video Bandwidth<\/td><td>TURN<\/td><td>Success<\/td><td>Video resolution: Width x Height<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Failure<\/td><td>Camera failure: Width x Height. Cannot <br>test bandwidth without a working camera<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Subject to quality<\/td><td>Average Video bandwidth &lt;value&gt;<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Subject to quality<\/td><td>Packets lost: &lt;value&gt;<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Subject to quality<\/td><td>RTT Average: &lt;value&gt;<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Failure<\/td><td>getUserMedia() failed with error &lt;error&gt;<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Failure<\/td><td>Frame Rate mean is 0, cannot <br>test bandwidth without a working camera<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Failure<\/td><td>Only Firefox and Chrome <br>getStats() implementations are supported<\/td><\/tr><tr><td><\/td><td>Audio Bandwidth<\/td><td>TURN<\/td><td>Subject to quality<\/td><td>Average Audio bandwidth &lt;value&gt;<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Subject to quality<\/td><td>Packets lost: &lt;value&gt;<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Subject to quality<\/td><td>RTT Average: &lt;value&gt;<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Failure<\/td><td>getUserMedia() failed with error &lt;error&gt;<\/td><\/tr><tr><td><\/td><td><\/td><td><\/td><td>Failure<\/td><td>Only Firefox and Chrome <br>getStats() implementations are supported<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Note: <\/strong>Currently this API is not working for Firefox and safari browser.<\/p>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator is-style-wide\"\/>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<p> \u2190  <a href=\"..\/console-logging\/\"><\/a><a href=\"..\/console-logging\/\">Manage Console Log<\/a><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column\">\n<p class=\"has-text-align-center\"> <a href=\"..\/\">Index<\/a> <\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column\">\n<p class=\"has-text-align-right\"><a href=\"..\/bitrate-status-of-client\/\"><\/a><a href=\"..\/bitrate-status-of-client\/\">Get Bitrate Status of Client<\/a> \u2192 <\/p>\n<\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Availability:&nbsp;Web SDK v1.9.5+ The&nbsp;EnxRtc.clientDiagnostics()&nbsp;method acts as a Diagnostic Tool to detect any issue causing the RTC to fail. The API runs through predefined test cases related to WebRTC issues and reports asynchronously through an Event as it passes through each test. These test cases are organized in \u201cTest Groups\u201d as shown below: Microphone Audio capture Camera Check resolution 320&#215;240 Check resolution 640&#215;480 Check resolution 1280&#215;720 Check supported resolutions Network UDP&hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"parent":3724,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ub_ctt_via":""},"featured_image_src":null,"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"featured":false,"featured-large":false},"uagb_author_info":{"display_name":"vcxdevwpadmin","author_link":"https:\/\/doc.smartflomeet.ttns.in\/developer\/author\/vcxdevwpadmin\/"},"uagb_comment_info":0,"uagb_excerpt":"Availability:&nbsp;Web SDK v1.9.5+ The&nbsp;EnxRtc.clientDiagnostics()&nbsp;method acts as a Diagnostic Tool to detect any issue causing the RTC to fail. The API runs through predefined test cases related to WebRTC issues and reports asynchronously through an Event as it passes through each test. These test cases are organized in \u201cTest Groups\u201d as shown below: Microphone Audio capture&hellip;","_links":{"self":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages\/4012"}],"collection":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/comments?post=4012"}],"version-history":[{"count":0,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages\/4012\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/pages\/3724"}],"wp:attachment":[{"href":"https:\/\/doc.smartflomeet.ttns.in\/developer\/wp-json\/wp\/v2\/media?parent=4012"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}