Giter Site home page Giter Site logo

team-telnyx / flutter-voice-sdk Goto Github PK

View Code? Open in Web Editor NEW
10.0 9.0 3.0 414 KB

Telnyx Flutter WebRTC SDK - Enable real-time communication with WebRTC and Telnyx

License: MIT License

Kotlin 0.09% Swift 2.89% Objective-C 0.02% Dart 93.50% HTML 2.61% Ruby 0.89%
flutter dart sip webrtc voip flutter-package telecommunications sip-client

flutter-voice-sdk's Introduction

Pub Version Flutter Test

Telnyx Flutter Voice SDK

Enable Telnyx real-time communication services on Flutter applications (Android / iOS / Web) ๐Ÿ“ž ๐Ÿ”ฅ

Features

  • Create / Receive calls
  • Hold calls
  • Mute calls
  • Dual Tone Multi Frequency

Usage

SIP Credentials

In order to start making and receiving calls using the TelnyxRTC SDK you will need to get SIP Credentials:

Screenshot 2022-07-15 at 13 51 45

  1. Access to https://portal.telnyx.com/
  2. Sign up for a Telnyx Account.
  3. Create a Credential Connection to configure how you connect your calls.
  4. Create an Outbound Voice Profile to configure your outbound call settings and assign it to your Credential Connection.

For more information on how to generate SIP credentials check the Telnyx WebRTC quickstart guide.

Platform Specific Configuration

Android

If you are implementing the SDK into an Android application it is important to remember to add the following permissions to your AndroidManifest in order to allow Audio and Internet permissions:

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

iOS

on the iOS platform, you need to add the microphone permission to your Info.plist file:

    <key>NSMicrophoneUsageDescription</key>
    <string>$(PRODUCT_NAME) Microphone Usage!</string>

Telnyx Client

TelnyxClient() is the core class of the SDK, and can be used to connect to our backend socket connection, create calls, check state and disconnect, etc.

Once an instance is created, you can call the .connect() method to connect to the socket. An error will appear as a socket response if there is no network available:

    TelnyxClient _telnyxClient = TelnyxClient();
    _telnyxClient.connect();

Logging into Telnyx Client

To log into the Telnyx WebRTC client, you'll need to authenticate using a Telnyx SIP Connection. Follow our quickstart guide to create JWTs (JSON Web Tokens) to authenticate. To log in with a token we use the tokinLogin() method. You can also authenticate directly with the SIP Connection username and password with the credentialLogin() method:

   _telnyxClient.tokenLogin(tokenConfig)
                    //OR
   _telnyxClient.credentialLogin(credentialConfig)             

Note: tokenConfig and credentialConfig are simple classes that represent login settings for the client to use. They look like this:

/// Creates an instance of CredentialConfig which can be used to log in
///
/// Uses the [sipUser] and [sipPassword] fields to log in
/// [sipCallerIDName] and [sipCallerIDNumber] will be the Name and Number associated
/// [notificationToken] is the token used to register the device for notifications if required (FCM or APNS)
/// The [autoReconnect] flag decided whether or not to attempt a reconnect (3 attempts) in the case of a login failure with
/// legitimate credentials
class CredentialConfig {
 CredentialConfig(this.sipUser, this.sipPassword, this.sipCallerIDName,
     this.sipCallerIDNumber, this.notificationToken, this.autoReconnect);

 final String sipUser;
 final String sipPassword;
 final String sipCallerIDName;
 final String sipCallerIDNumber;
 final String? notificationToken;
 final bool? autoReconnect;
}

/// Creates an instance of TokenConfig which can be used to log in
///
/// Uses the [sipToken] field to log in
/// [sipCallerIDName] and [sipCallerIDNumber] will be the Name and Number associated
/// [notificationToken] is the token used to register the device for notifications if required (FCM or APNS)
/// The [autoReconnect] flag decided whether or not to attempt a reconnect (3 attempts) in the case of a login failure with
/// a legitimate token
class TokenConfig {
 TokenConfig(this.sipToken, this.sipCallerIDName, this.sipCallerIDNumber,
     this.notificationToken, this.autoReconnect);

 final String sipToken;
 final String sipCallerIDName;
 final String sipCallerIDNumber;
 final String? notificationToken;
 final bool? autoReconnect;
}

Adding push notifications - Android platform

The Android platform makes use of Firebase Cloud Messaging in order to deliver push notifications. If you would like to receive notifications when receiving calls on your Android mobile device you will have to enable Firebase Cloud Messaging within your application. For a detailed tutorial, please visit our official Push Notification Docs

  1. Add the metadata to CallKitParams extra field
    static Future showNotification(RemoteMessage message)  {
      CallKitParams callKitParams = CallKitParams(
        android:...,
          ios:...,
          extra: message.data,
      )
      await FlutterCallkitIncoming.showCallkitIncoming(callKitParams);
    }
  1. Listen for Call Events and invoke the handlePushNotification method
   FlutterCallkitIncoming.onEvent.listen((CallEvent? event) {
   switch (event!.event) {
   case Event.actionCallIncoming:
   // retrieve the push metadata from extras
    PushMetaData? pushMetaData = PushMetaData.fromJson(
    jsonDecode(event.body['extra']['metadata']));
    _telnyxClient.handlePushNotification(pushMetaData, credentialConfig, tokenConfig);
    break;
   case Event.actionCallStart:
    ....
   break;
   case Event.actionCallAccept:
     ...
   logger.i('Call Accepted Attach Call');
   break;
   });

Adding push notifications - iOS platform

The iOS Platform makes use of the Apple Push Notification Service (APNS) and Pushkit in order to deliver and receive push notifications For a detailed tutorial, please visit our official Push Notification Docs

  1. Listen for incoming calls in AppDelegate.swift class
    func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
            print("didReceiveIncomingPushWith")
            guard type == .voIP else { return }
            
            if let metadata = payload.dictionaryPayload["metadata"] as? [String: Any] {
                var callID = UUID.init().uuidString
                if let newCallId = (metadata["call_id"] as? String),
                   !newCallId.isEmpty {
                    callID = newCallId
                }
                let callerName = (metadata["caller_name"] as? String) ?? ""
                let callerNumber = (metadata["caller_number"] as? String) ?? ""
                
                let id = payload.dictionaryPayload["call_id"] as? String ??  UUID().uuidString
                let isVideo = payload.dictionaryPayload["isVideo"] as? Bool ?? false
                
                let data = flutter_callkit_incoming.Data(id: id, nameCaller: callerName, handle: callerNumber, type: isVideo ? 1 : 0)
                data.extra = payload.dictionaryPayload as NSDictionary
                data.normalHandle = 1              
                
                let caller = callerName.isEmpty ? (callerNumber.isEmpty ? "Unknown" : callerNumber) : callerName
                let uuid = UUID(uuidString: callID)
                
                //set more data
                //data.iconName = ...
                //data.....
                SwiftFlutterCallkitIncomingPlugin.sharedInstance?.showCallkitIncoming(data, fromPushKit: true)
            }
        }
  1. Listen for Call Events and invoke the handlePushNotification method
   FlutterCallkitIncoming.onEvent.listen((CallEvent? event) {
   switch (event!.event) {
   case Event.actionCallIncoming:
   // retrieve the push metadata from extras
    PushMetaData? pushMetaData = PushMetaData.fromJson(event.body['extra']['metadata']);
    _telnyxClient.handlePushNotification(pushMetaData, credentialConfig, tokenConfig);
    break;
   case Event.actionCallStart:
    ....
   break;
   case Event.actionCallAccept:
     ...
   logger.i('Call Accepted Attach Call');
   break;
   });

Creating a call invitation

In order to make a call invitation, we first create an instance of the Call class with the .call instance. This creates a Call class which can be used to interact with calls (invite, accept, decline, etc). To then send an invite, we can use the .newInvite() method which requires you to provide your callerName, callerNumber, the destinationNumber (or SIP credential), and your clientState (any String value).

    _telnyxClient
        .call
        .newInvite("callerName", "000000000", destination, "State");

Accepting a call

In order to be able to accept a call, we first need to listen for invitations. We do this by getting the Telnyx Socket Response callbacks:

 // Observe Socket Messages Received
_telnyxClient.onSocketMessageReceived = (TelnyxMessage message) {
  switch (message.socketMethod) {
        case SocketMethod.CLIENT_READY:
        {
           // Fires once client has correctly been setup and logged into, you can now make calls. 
           break;
        }
        case SocketMethod.LOGIN:
        {
            // Handle a successful login - Update UI or Navigate to new screen, etc. 
            break;
        }
        case SocketMethod.INVITE:
        {
            // Handle an invitation Update UI or Navigate to new screen, etc. 
            // Then, through an answer button of some kind we can accept the call with:
            _incomingInvite = message.message.inviteParams;
            _telnyxClient.createCall().acceptCall(
                _incomingInvite, "callerName", "000000000", "State");
            break;
        }
        case SocketMethod.ANSWER:
        {
           // Handle a received call answer - Update UI or Navigate to new screen, etc.
          break;
        }
        case SocketMethod.BYE:
        {
           // Handle a call rejection or ending - Update UI or Navigate to new screen, etc.
           break;
      }
    }
    notifyListeners();
};

We can then use this method to create a listener that listens for an invitation and, in this case, answers it straight away. A real implementation would be more suited to show some UI and allow manual accept / decline operations.

Decline / End Call

In order to end a call, we can get a stored instance of Call and call the .endCall(callID) method. To decline an incoming call we first create the call with the .createCall() method and then call the .endCall(callID) method:

    if (_ongoingCall) {
      _telnyxClient.call.endCall(_telnyxClient.call.callId);
    } else {
      _telnyxClient.createCall().endCall(_incomingInvite?.callID);
    }

DTMF (Dual Tone Multi Frequency)

In order to send a DTMF message while on a call you can call the .dtmf(callID, tone), method where tone is a String value of the character you would like pressed:

    _telnyxClient.call.dtmf(_telnyxClient.call.callId, tone);

Mute a call

To mute a call, you can simply call the .onMuteUnmutePressed() method:

    _telnyxClient.call.onMuteUnmutePressed();

Toggle loud speaker

To toggle loud speaker, you can simply call .enableSpeakerPhone(bool):

    _telnyxClient.call.enableSpeakerPhone(true);

Put a call on hold

To put a call on hold, you can simply call the .onHoldUnholdPressed() method:

    _telnyxClient.call.onHoldUnholdPressed();

Questions? Comments? Building something rad? Join our Slack channel and share.

License

MIT Licence ยฉ Telnyx

flutter-voice-sdk's People

Contributors

adandyguyinspace avatar arunkumar-telnyx avatar dependabot[bot] avatar icodelifee avatar isaacakakpo1 avatar oliver-zimmerman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flutter-voice-sdk's Issues

[Bug] The app does not run. Packages are outdated..

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
Which version of the SDK have you added from pub.dev? Feel free to add the whole dependency implementation:
eg. telnyx_webrtc: ^0.0.1

Describe the bug
I would expect when Downloading the package, you would be able to just open the main.dart file and click run and it would spin up the app. It does not.

Expected behaviour
The app would boot and run

To Reproduce
Steps to reproduce the behaviour:

  1. Download from github
  2. open in vs code
  3. Try a Debug and Run on an AVD

** Device (please complete the following information):**

  • Emulator: true
  • Device/Browser: Nexus 4
  • OS Version: Android 11

Logs
Resolving dependencies...

Changed 111 dependencies!
Launching lib/main.dart on Android SDK built for x86 in debug mode...
Upgrading build.gradle
Conflict detected between Android Studio Java version and Gradle version, upgrading Gradle version from 6.7 to 7.6.1.
Upgrading gradle-wrapper.properties
Warning: Mapping new ns http://schemas.android.com/repository/android/common/02 to old ns http://schemas.android.com/repository/android/common/01
Warning: Mapping new ns http://schemas.android.com/repository/android/generic/02 to old ns http://schemas.android.com/repository/android/generic/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/addon2/02 to old ns http://schemas.android.com/sdk/android/repo/addon2/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/addon2/03 to old ns http://schemas.android.com/sdk/android/repo/addon2/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/repository2/02 to old ns http://schemas.android.com/sdk/android/repo/repository2/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/repository2/03 to old ns http://schemas.android.com/sdk/android/repo/repository2/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/sys-img2/03 to old ns http://schemas.android.com/sdk/android/repo/sys-img2/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/sys-img2/02 to old ns http://schemas.android.com/sdk/android/repo/sys-img2/01
/home/eric/.pub-cache/hosted/pub.dev/firebase_core-1.24.0/lib/src/firebase_app.dart:18:25: Error: Member not found: 'FirebaseAppPlatform.verifyExtends'.
FirebaseAppPlatform.verifyExtends(_delegate);
^^^^^^^^^^^^^
: Error: The argument type 'Map<String, dynamic>' can't be assigned to the parameter type 'CallKitParams'.

  • 'Map' is from 'dart:core'.

  • 'CallKitParams' is from 'package:flutter_callkit_incoming/entities/call_kit_params.dart' ('/home/eric/.pub-cache/hosted/pub.dev/flutter_callkit_incoming-1.0.3+3/lib/entities/call_kit_params.dart').
    await FlutterCallkitIncoming.showCallkitIncoming(params);
    ^

Target kernel_snapshot failed: Exception

FAILURE: Build failed with an exception.

  • Where:
    Script '/home/eric/snap/flutter/common/flutter/packages/flutter_tools/gradle/flutter.gradle' line: 1201

  • What went wrong:
    Execution failed for task ':app:compileFlutterBuildDebug'.

Process 'command '/home/eric/snap/flutter/common/flutter/bin/flutter'' finished with non-zero exit value 1

  • Try:

Run with --stacktrace option to get the stack trace.
Run with --info or --debug option to get more log output.
Run with --scan to get full insights.

BUILD FAILED in 20s
Exception: Gradle task assembleDebug failed with exit code 1
Exited (sigterm)

[Bug] Relogging a different user wont listen to socket messages through the handler

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
Which version of the SDK have you added from pub.dev? Feel free to add the whole dependency implementation:
eg. telnyx_webrtc: ^0.0.1

Describe the bug
When i open the app the Telnyx client gets connected and then i login to the client and observer the responses through the onSocketMessageReceived handler, when i logout the user [App user] and logs in with a different user i connect again, when i do this then i repeat the first step again and observe the response. After that no socket message gets handled by the callback

Expected behaviour
A clear and concise description of what you expected to happen.

To Reproduce
Steps to reproduce the behaviour:

  1. e.g. (Log on with credentials)
  2. e.g. (Socket error then returned)

** Device (please complete the following information):**

  • Emulator: (true/false)
  • Device/Browser: [e.g. Pixel 6, iPhone XR, Chrome]
  • OS Version: [e.g. Android Oreo, iOS 12, Chrome Version 103.0.5060.53]

Logs
Please provide any logs available to you, remember to enable verbose logging within the SDK.

[Bug] Call Audio/Mic not working

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
telnyx_webrtc: ^0.0.3

Describe the bug
After the receiver accepts the call, both the caller nor the receiver cannot hear any audio from the device

Expected behavior
The caller and receiver should be able to hear and speak

** Device (please complete the following information):**

  • OS Version: Android 12

Logs
INVITATION ANSWERED :: {jsonrpc: 2.0, id: 67246, method: telnyx_rtc.answer, params: {callID: Instance of 'Uuid', variables: {Event-Name: CHANNEL_DATA, Core-UUID: efaeab2c-2067-42d3-b973-37aa4330ac97, FreeSWITCH-Hostname: b2bua-rtc.tel-sy1-ibm-prod-133, FreeSWITCH-Switchname: b2bua-rtc.tel-sy1-ibm-prod-133, FreeSWITCH-IPv4: 10.33.0.80, FreeSWITCH-IPv6: ::1, Event-Date-Local: 2022-08-19 14:24:34, Event-Date-GMT: Fri, 19 Aug 2022 14:24:34 GMT, Event-Date-Timestamp: 1660919074493112, Event-Calling-File: switch_channel.c, Event-Calling-Function: switch_channel_get_variables_prefix, Event-Calling-Line-Number: 4576, Event-Sequence: 163053}}}

[Bug] createCall() throws invalid argument error

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
telnyx_webrtc: ^0.0.3

Describe the bug
While creating a call using connected Telnyx client throws Argument Error, looking into API I believe it is caused due to the #11 socket initialize error while logging with credentials, since it throws an error there, the socket id is not initialized.

Logs

I/flutter (13454): โ”‚ #0   TelnyxClient._onMessage (package:telnyx_webrtc/telnyx_client.dart:234:13)
package:telnyx_webrtc/telnyx_client.dart:234
I/flutter (13454): โ”‚ #1   TelnyxClient.connect.<anonymous closure> (package:telnyx_webrtc/telnyx_client.dart:89:9)
package:telnyx_webrtc/telnyx_client.dart:89
I/flutter (13454): โ”‚ ๐Ÿ’ก DEBUG MESSAGE: {"jsonrpc":"2.0","id":30805,"method":"telnyx_rtc.ping","params":{"serno":1660818704}}

Screenshot 2022-08-18 at 4 04 56 PM

[Bug] Logging in after connecting telnyx causes LateInitialization error

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
telnyx_webrtc: latest

Describe the bug
No, it does not occur in the example app because the example does not log in right after you connect the client. I had this issue for a long time and the workaround I did to fix it was using a delay of 4 seconds to log in after you connect the client because the connect() method is not asynchronous, but in release the delay is not really working and users are not able to automatically login into the client.
Screenshot 2022-10-26 at 4 52 44 PM

Expected behaviour
A clear and concise description of what you expected to happen.

Logs
Please provide any logs available to you, remember to enable verbose logging within the SDK.

[Bug] Socket Message CLIENT_READY is not being logged properly

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
eg. telnyx_webrtc: latest

Describe the bug
This only happens sometimes, but when i try to login with credentials sometimes the CLIENT_READY wont be logged.
Please check the logs below

Expected behaviour
socket method CLIENT_READY logs and should allow to receive or create calls

To Reproduce
Steps to reproduce the behaviour:

  1. e.g. (Log on with credentials)
  2. e.g. (Socket error then returned)

Logs
https://katb.in/sawawalikiz

[Bug] LateInitializationError while login using credentials

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
telnyx_webrtc: ^0.0.3

Describe the bug
LateInitializationError: Field '_socket@742383924' has not been initialized. while connecting with Credentials
Screenshot 2022-08-18 at 12 21 05 AM
Screenshot 2022-08-18 at 12 21 52 AM

To Reproduce
Steps to reproduce the behaviour:

  1. e.g. (Log on with credentials)
  2. e.g. (Socket error then returned)

** Device (please complete the following information):**

  • OS Version: [Android 12]

Logs
Please provide any logs available to you, remember to enable verbose logging within the SDK.

[Enhancement] Accept Call From Notification iOS

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
telnyx_webrtc: ^0.0.1

Describe the bug
Could you please add feature "Accept Call From Notification iOS".

telnyxClient.call.newInvite( _localName, "+123456789", destination, "Fake State", ); IS NOT WORK

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
Which version of the SDK have you added from pub.dev? Feel free to add the whole dependency implementation:
eg. telnyx_webrtc: ^0.0.1

Describe the bug
A clear and concise description of what the bug is.

Expected behaviour
A clear and concise description of what you expected to happen.

To Reproduce
Steps to reproduce the behaviour:

  1. e.g. (Log on with credentials)
  2. e.g. (Socket error then returned)

** Device (please complete the following information):**

  • Emulator: (true/false)
  • Device/Browser: [e.g. Pixel 6, iPhone XR, Chrome]
  • OS Version: [e.g. Android Oreo, iOS 12, Chrome Version 103.0.5060.53]

Logs
Please provide any logs available to you, remember to enable verbose logging within the SDK.

[Bug] Autentication error on createCall().newInvite()

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
telnyx_webrtc: ^0.0.10

Describe the bug
After a .connect() and a .tokenLogin(tc), i call the method .createCall().newInvite(...) but no call starts.

Expected behaviour
The call starts with no issues

To Reproduce
Log on with tokenConfig

** Device:**

  • Windows

Logs
After connecting:
๐Ÿ’ก Web Socket is now connected
๐Ÿ’ก WebSocket connected

After trying .createCall().newInvite(...)
๐Ÿ’ก Peer :: Adding ICE candidate :: Instance of 'RTCIceCandidate'
๐Ÿ’ก TxSocket :: send : ... data ...
๐Ÿ’ก DEBUG MESSAGE: {"jsonrpc":"2.0","id":"04f0a93c-3ab2-4ce7-a021-6146e418ba2f","error":{"code":-32000,"message":"Authentication Required"}}
๐Ÿ’ก Received WebSocket message :: {"jsonrpc":"2.0","id":"04f0a93c-3ab2-4ce7-a021-6146e418ba2f","error":{"code":-32000,"message":"Authentication Required"}}
๐Ÿ’ก Received WebSocket message - Contains Error :: "{"jsonrpc":"2.0","id":"04f0a93c-3ab2-4ce7-a021-6146e418ba2f","error":{"code":-32000,"message":"Authentication Required"}}"
๐Ÿ’ก Received and ignored empty packet

The "onSocketErrorReceived" listener, received this:
[ERROR:flutter/shell/common/shell.cc(1004)] The 'FlutterWebRTC/peerConnectionEvent68AABAA1-A384-490D-8604-3A54594FC8A7' channel sent a message from native to Flutter on a non-platform thread. Platform channel messages must be sent on the platform thread. Failure to do so may result in data loss or crashes, and must be fixed in the plugin or application code creating that channel.

hi, I am using your webRTC voice SDK in Flutter technology. While using this SDK I faced some Issues. 1. Connection time-out issue: I have been facing this issue for a long time and your telnyx_webrtc: ^0.0.10 has fixed that but it still not working. I have tried your latest git example in a flutter that also has the same time-out issue. please provide support for that. 2. Last call connection issue: When my Telynx is not connected than i get a call notification on that call notification I am again connecting Telynx the last call not showing then then plugin(Sdk) function not working.

Bug Category

  • Credential Login
  • Token Login
  • Local Audio Issue
  • Remote Audio Issue
  • Audio Device Switching
  • Mute / Unmute
  • Hold / Unhold
  • Performance issues
  • Other

SDK Version
Which version of the SDK have you added from pub.dev? Feel free to add the whole dependency implementation:
eg. telnyx_webrtc: ^0.0.1

Describe the bug
A clear and concise description of what the bug is.

Expected behaviour
A clear and concise description of what you expected to happen.

To Reproduce
Steps to reproduce the behaviour:

  1. e.g. (Log on with credentials)
  2. e.g. (Socket error then returned)

** Device (please complete the following information):**

  • Emulator: (true/false)
  • Device/Browser: [e.g. Pixel 6, iPhone XR, Chrome]
  • OS Version: [e.g. Android Oreo, iOS 12, Chrome Version 103.0.5060.53]

Logs
Please provide any logs available to you, remember to enable verbose logging within the SDK.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.