Skip to contentSkip to navigationSkip to topbar
On this page

Voice JavaScript SDK: Twilio.Device


(information)

Info

You're viewing the documentation for the 2.X version of the Voice JavaScript SDK. View the Migration Guide to learn how to migrate from 1.X to 2.X or view the 1.x-specific documentation.

(information)

Info

The Twilio Client JavaScript SDK has been renamed to Twilio Voice JavaScript SDK.

The Device object is available when the JavaScript SDK is included in your application. It represents a softphone that communicates with Twilio to facilitate inbound and outbound audio connections.

For the full API reference, view the autogenerated documentation on GitHub(link takes you to an external page).

(warning)

Warning

Throughout this page, you will see device with a lowercase "d" and Device with an uppercase "D".

Device refers to the Device object provided by the SDK.

device represents an instance of a Device, created with the new keyword:

const device = new Device(token);

Table of Contents

table-of-contents page anchor

A new instance of a Device should be constructed by using the new keyword and passing an Access Token as the first argument. The constructor also takes an optional second argument, DeviceOptions.

No signaling channel will be opened when instantiating a new Device. The signaling WebSocket will be opened when either device.register() or device.connect() are called.

(warning)

Warning

The maximum number of characters for the identity provided in the Access Token is 121. The identity may only contain alpha-numeric and underscore characters. Other characters, including spaces, or exceeding the maximum number of characters, will result in not being able to place or receive calls.

Instantiate a Device without DeviceOptions

instantiate-a-device-without-deviceoptions page anchor
const device = new Device(token);

The DeviceOptions parameter is optional. The Device instance's options can be updated after instantiation using the device.updateOptions() method.

Instantiate a Device with DeviceOptions

instantiate-a-device-with-deviceoptions page anchor

Examples of using DeviceOptions to specify an Edge location:

1
// Instantiate the device with a specified edge location
2
const device = new Device(token, { edge: 'ashburn'});
3
4
// Instantiate the device with a specified edge and auto-fallback functionality
5
const device = new Device(token, { edge: ['ashburn', 'sydney'] });

To see all of the possible properties, see the DeviceOptions section below.


The Device instance can be configured using the DeviceOptions parameter in two ways: during instantiation with the new keyword or by calling device.updateOptions().

1
const deviceOptions = {
2
edge: 'ashburn',
3
}
4
5
// pass the options object as the second argument in Device constructor
6
const device = new Device(token, deviceOptions);
7
8
// or
9
10
// use the updateOptions method after instantiating the device
11
const device = new Device(token);
12
device.updateOptions(deviceOptions);

DeviceOptions is a JavaScript object with the properties listed in the table below. All properties are optional.

Options PropertyDescription
allowIncomingWhileBusy Boolean

default: false
Whether the Device instance should raise the 'incoming' event when a new call invite is received while already on an active call.
appName stringA name for the application that is instantiating the Device instance. This is used to improve logging in Insights.
appVersion stringA version for the application that is instantiating the Device instance. This is used to improve logging in Insights.
closeProtection Boolean or string

default: false
Setting this property to true will enable a dialog prompt with the text "A call is currently in progress. Leaving or reloading the page will end the call." when closing a page which has an active connection. Setting the property to a string will create a custom message prompt with that string. If custom text is not supported by the browser, Twilio will display the browser's default dialog.
codecPreferences string[]

default:["pcmu", "opus"]
An array of codec names ordered from most-preferred to least-preferred. Opus and PCMU are the two codecs currently supported by Twilio Voice JS SDK. Opus can provide better quality for lower bandwidth, particularly noticeable in poor network conditions. Examples: ["opus", "pcmu"], ["pcmu"]
disableAudioContextSounds BooleanWhether AudioContext(link takes you to an external page) sounds should be disabled. Useful for troubleshooting sound issues that may be caused by AudioContext-specific sounds. If set to true, the Device instance will fall back to HTMLAudioElement(link takes you to an external page) sounds.
dscp BooleanWhether to use googDscp in RTC constraints
edge string[] or string

default: "roaming"
The Edge location to connect to. If using an array of edges, sort by highest priority to lowest priority. The array will be used to provide auto fallback functionality. Check the Device instance's current edge using the device.edge read-only property. If the Device instance is offline, the edge will be null. See the Edges documentation for more details.
enableImprovedSignalingErrorPrecision Boolean

default: false
When set to true, some errors that would have been described with a generic error code are now described with a more precise error code. Please see this section for more details.
enumerateDevices functionPass a custom enumerateDevices function to override what Twilio uses when requesting a list of available media input and output devices.
forceAggressiveIceNomination Boolean

default: false
Experimental feature. Sets whether the Device instance should use ICE Aggressive nomination(link takes you to an external page). If your deployment is on devices with one network interface and your Round Trip Time (RTT) to Twilio's Servers is typically greater than 96 milliseconds, this feature may help reduce call connect time. As this is an experimental feature, we don't recommend enabling this until after testing it thoroughly in your deployment.
getUserMedia functionPass a custom getUserMedia function to override what Twilio uses to create an input MediaStream.
logLevel number or stringThe Voice JavaScript SDK exposes a loglevel(link takes you to an external page)-based logger to allow for runtime logging configuration. Possible values include any of the following numbers: 0 = trace, 1 = debug, 2 = info, 3 = warn, 4 = error, 5 = silent Or any of the following strings: 'trace', 'debug', 'info', 'warn', 'error', 'silent' 'TRACE', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'SILENT' See the loglevel docs(link takes you to an external page) for more information.
maxAverageBitrate numberMax average bitrate to better control how much bandwidth your VoIP application should use. See RFC-7587 section 7.1(link takes you to an external page). Only applicable when using Opus codec. By default, the Opus codec is set up with a transmission rate of around 32 kbps (40-50kbps on the wire). Max Average Bitrate can be set to as low as 6000 bps and as high as 510000 bps. Values outside this range are ignored and the default Opus operation mode is used. Lowering the max average bitrate impacts audio quality. The recommended bitrate for speech is between 8000 and 40000 bps. If you set maxAverageBitrate to 0, the setting is not used.
maxCallSignalingTimeoutMs number

default: 0
The maximum duration in milliseconds the Twilio.Device will attempt to reconnect to the most-recently-used edge in the event of a signaling connectivity loss. After the provided time has passed during reconnection attempts, the Twilio.Device will then use edge fallback. The default value of 0 means that signaling reconnection may not occur, since a change of edge during a reconnection attempt will cause a Call to fail. Since the Twilio.Device will only attempt to reestablish connectivity for up to 30 seconds, the maximum value you would want to use here is 30000 milliseconds. Read more about edge fallback and signaling reconnection on the Edge Locations page. Note: Setting this option to a value greater than zero means Twilio will not terminate the call until the timeout has expired. Please take this into consideration if your application contains webhooks that relies on call status callbacks.
RTCPeerConnection functionOverrides the native RTCPeerConnection class. By default, the SDK will use the unified-plan SDP format if the browser supports it. Unexpected behavior may happen if the RTCPeerConnection parameter uses an SDP format that is different than what the SDK uses. For example, if the browser supports unified-plan and the RTCPeerConnection parameter uses plan-b by default, the SDK will use unified-plan which will cause conflicts with the usage of the RTCPeerConnection. In order to avoid this issue, you need to explicitly set the SDP format that you want the SDK to use with the RTCPeerConnection via Device.ConnectOptions.rtcConfiguration for outgoing calls. Or Call.AcceptOptions.rtcConfiguration for incoming calls. See the example below. Assuming the RTCPeerConnection you provided uses plan-b by default, the following code sets the SDP format to unified-plan instead.// Outgoing calls const call = await device.connect({ rtcConfiguration: { sdpSemantics: 'unified-plan' } // Other options }); // Incoming calls device.on('incoming', call => { call.accept({ rtcConfiguration: { sdpSemantics: 'unified-plan' } // Other options }); });
sounds objectA JavaScript object with key/value pairs of sound names (as the key) and URLs (as the value). See the deviceOptions.sounds properties section below for all available properties (keys for the deviceOptions.sounds object) and the default sounds provided by the SDK. Note: The incoming ringtone will loop for at least two seconds and as long as the incoming call is pending. All other sounds will play once; DTMF tones will be cut short if they exceed one second, while outgoing and disconnect sounds will be cut short if they exceed three seconds.
tokenRefreshMs number

default: 10000
The number of milliseconds before the AccessToken's expiry that the Twilio.Device will emit the 'tokenWillExpire' event. The default is 10 seconds (10000 milliseconds).

Example:

Specify an Edge location using DeviceOptions

1
// pass options object during device instantiation
2
const device = new Device(token, { edge: 'ashburn' });
3
4
// or
5
6
// pass options object using the updateOptions method
7
const device = new Device(token);
8
device.updateOptions({ edge: 'ashburn' });

Example:

Specify an Edge location and custom sounds

1
const deviceOptions = {
2
edge: 'ashburn',
3
sounds: {
4
incoming: 'http://mysite.com/incoming.mp3',
5
outgoing: 'http://mysite.com/outgoing.mp3',
6
dtmf8: 'http://mysite.com/8_button.mp3'
7
}
8
}
9
10
11
// pass options object during device instantiation
12
const device = new Device(token, deviceOptions);
13
14
// or
15
16
// pass options object using the updateOptions method
17
const device = new Device(token);
18
device.updateOptions(deviceOptions);

deviceOptions.sounds properties and default sounds

deviceoptionssounds-properties-and-default-sounds page anchor

The available properties on the deviceOptions.sounds object are listed in the left column of the table below. In the right column, there are audio players to hear the default sounds provided by the Voice JavaScript SDK.

deviceOptions.sounds propertyDefault sound
incoming
outgoing
disconnect
dtmf1
dtmf2
dtmf3
dtmf4
dtmf5
dtmf6
dtmf7
dtmf8
dtmf9
dtmf0
dtmfs (star)
dtmfh (hash)

Improved Signaling Errors

improved-signaling-errors page anchor

When deviceOptions.enableImprovedSignalingErrorPrecision is set to true, the following errors that would have been described with a generic error code are now described with a more precise error code. With this feature, the following errors now have their own error codes. Please see this page for more details about each error.

Device Error Changes

1
const device = new Device(token, {
2
enableImprovedSignalingErrorPrecision: true,
3
});
4
device.on('error', (deviceError) => {
5
// the following table describes how deviceError will change with this feature flag
6
});
Device Error NameFlag EnabledFlag Disabled
GeneralErrors.ApplicationNotFoundError3100153000
GeneralErrors.ConnectionDeclinedError3100253000
GeneralErrors.ConnectionTimeoutError3100353000
MalformedRequestErrors.MissingParameterArrayError3110153000
MalformedRequestErrors.AuthorizationTokenMissingError3110253000
MalformedRequestErrors.MaxParameterLengthExceededError3110353000
MalformedRequestErrors.InvalidBridgeTokenError3110453000
MalformedRequestErrors.InvalidClientNameError3110553000
MalformedRequestErrors.ReconnectParameterInvalidError3110753000
SignatureValidationErrors.AccessTokenSignatureValidationFailed3120253000
AuthorizationErrors.NoValidAccountError3120353000
AuthorizationErrors.JWTTokenExpirationTooLongError3120753000
ClientErrors.NotFound3140453000
ClientErrors.TemporarilyUnavilable3148053000
ClientErrors.BusyHere3148653000
SIPServerErrors.Decline3160353000

Call Error Changes

1
const device = new Device(token, {
2
enableImprovedSignalingErrorPrecision: true,
3
});
4
const call = device.connect(...);
5
call.on('error', (callError) => {
6
// the following table describes how callError will change with this feature flag
7
});
Call Error NameFlag EnabledFlag Disabled
GeneralErrors.ConnectionDeclinedError3100231005
AuthorizationErrors.InvalidJWTTokenError3120431005
AuthorizationErrors.JWTTokenExpiredError3120531005

This section contains descriptions of the methods available on a Device instance.

device.addListener(eventName, listener)

deviceaddlistenereventname-listener page anchor

Add an event listener to the Device instance. This is an alias for device.on().

See the Events section of this page to see the full list of events emitted by a Device instance.

ParameterData TypeDescription
eventNamestring or symbolThe event emitted by the Device instance that will call the listener function
listenerfunctionThe function that will be called when the specified event is emitted

Example:

If you want to know when your Device instance is ready to receive incoming calls, listen for the 'registered' event.

1
const device = new Device(token);
2
3
device.addListener('registered', device => {
4
console.log('The device is ready to receive incoming calls.')
5
});

See the Node.js Events Docs(link takes you to an external page) for more information.

device.connect(ConnectOptions)

deviceconnectconnectoptions page anchor

Attempts a new connection to the Twilio application that you associated with the Access Token used when instantiating the Device instance.

This method will return a Promise with a Call object. You should keep track of this Call object to monitor/modify the active call.

To end the call, you can use the .disconnect() method on the Call object or use the device.disconnectAll() method.

1
const device = new Device(token);
2
3
let call = await device.connect({
4
params: {
5
To: '+15551234567'
6
}
7
});

ConnectOptions

connectoptions page anchor

device.connect() takes an optional ConnectOptions argument. The ConnectOptions object is a JavaScript object with optional params, connectToken, rtcConfiguration, and rtcConstraints properties.

Example:

1
const device = new Device(token);
2
3
let call = await device.connect({
4
params: {
5
To: "+15551234567"
6
agent: "Smith",
7
location: "Matrix"
8
},
9
rtcConstraints: {
10
audio: true
11
},
12
rtcConfiguration: {
13
iceServers: [{
14
urls: "stunserver.example.com",
15
username: "username@twilio.com",
16
credential: "webrtcCredential"
17
}]
18
}
19
})
connectToken
connecttoken page anchor

The call.connectToken allows for the manual reconnection to an existing call. This is applicable for calls that were previously received (incoming) or created (outgoing) from a Device instance. When a call is manually reconnected using the call.connectToken, its call.direction property is automatically set to OUTGOING.

(warning)

Warning

Only unanswered incoming calls can be manually reconnected at this time. Invoking this method to an already answered call may introduce unexpected behavior.

See device's incoming event for an example.

A JavaScript object containing key/value pairs to be sent to the Twilio application. These params will be passed to your application as GET or POST parameters.

(warning)

Warning

The total length of all params passed to device.connect() must not exceed 800 bytes. See How to Share Information Between Your Applications for more information.

(warning)

Warning

Your application should not assume that these parameters are safe since any user can call this function with whatever parameters they want.

For example, the following code will pass the params key/value pairs agent=Smith and location=Matrix to the Twilio application associated with this Device instance's Access Token.

1
const device = new Device(token);
2
3
let call = await device.connect({
4
params: {
5
agent: "Smith",
6
location: "Matrix"
7
}
8
});

An RTCConfiguration(link takes you to an external page) dictionary to pass to the RTCPeerConnection(link takes you to an external page) constructor. This allows you to configure the WebRTC connection between your local machine and the remote peer.

A MediaStreamConstraints(link takes you to an external page) dictionary to pass to getUserMedia(link takes you to an external page) when making or accepting a Call. This allows you to configure the behavior of tracks returned in the MediaStream(link takes you to an external page).

Each browser implements a different set of MediaTrackConstraints, so consult your browser's implementation of getUserMedia for more information.

Destroys the Device instance.

This method will disconnect all calls, unbind audio devices, destroy the stream (which causes the unregistered event to be emitted), and then the Device instance will emit the destroyed event. Then, all event listeners attached to the Device instance are cleaned up.

1
const device = new Device(token);
2
3
device.destroy();

device.disconnectAll()

devicedisconnectall page anchor

Disconnect all Calls associated with the Device instance.

Example:

A user clicks on a Hang Up button in the browser, which calls device.disconnectAll() to end the current Call.

1
const device = new Device(token);
2
3
// A click on a 'Hang Up' button calls this method
4
const hangupCall = () => {
5
device.disconnectAll();
6
console.log('The call has ended.');
7
}

device.emit(eventName, ...args)

deviceemiteventname-args page anchor

Calls each of the event listeners registered for the event named eventName. The listeners will be called in the order they were registered. Any arguments passed in after the eventName will be passed to the event listeners.

ParameterData TypeDescription
eventNamestring or symbolThe event emitted by the Device instance that will call the listener function
argsanyThe arguments that will be passed to the event listener(s) for the specified event

See the Node.js Events Docs(link takes you to an external page) for more information.

device.eventNames()

deviceeventnames page anchor

Returns an array of event names for which the Device instance has registered event listeners.

See the Node.js Events Docs(link takes you to an external page) for more information.

device.getMaxListeners()

devicegetmaxlisteners page anchor

Returns the current maximum number of event listeners for the Device instance.

By default, the maximum number of listeners is 10, and is set by the static Device.defaultMaxListeners property or the dynamic device.setMaxListeners(number) method.

See the Node.js Events Docs(link takes you to an external page) for more information.

device.listenerCount(eventName)

devicelistenercounteventname page anchor

Returns the number of listeners listening to the event named eventName on the Device instance.

ParameterData TypeDescription
eventNamestring or symbolThe name of the event for which you want to retrieve the listener count

See the Node.js Events Docs(link takes you to an external page) for more information.

device.listeners(eventName)

devicelistenerseventname page anchor

Returns an array of the listeners registered on the Device instance for the event named eventName.

ParameterData TypeDescription
eventNamestring or symbolThe name of the event for which you want to retrieve the listeners

See the Node.js Events Docs(link takes you to an external page) for more information.

device.off(eventName, listener)

deviceoffeventname-listener page anchor

Removes the listener for the event named eventName. This is an alias for device.removeListener().

1
const device = new Device(token);
2
3
const handleSuccessfulRegistration = () => {
4
console.log('The device is ready to receive incoming calls.')
5
}
6
7
device.on('registered', handleSuccessfulRegistration);
8
9
device.off('registered', handleSuccessfulRegistration);

See the Node.js Event Docs(link takes you to an external page) for more information.

device.on(eventName, listener)

deviceoneventname-listener page anchor

Add an event listener to the Device instance. This is analogous to the Device.addListener() method.

See the Events section of this page to see the full list of events emitted by the Device instance.

ParameterData TypeDescription
eventNamestring or symbolThe event emitted by the Device instance that will call the listener function
listenerfunctionThe function that will be called when the specified event is emitted

Example:

If you want to know when your Device instance is ready to receive incoming calls, listen for the 'registered' event.

1
const device = new Device(token);
2
3
device.on('registered', device => {
4
console.log('The device is ready to receive incoming calls.')
5
};

device.once(eventName, listener)

deviceonceeventname-listener page anchor

Adds a one-time listener to the Device instance for the event named eventName.

ParameterData TypeDescription
eventNamestring or symbolThe event emitted by the Device instance that will call the listener function
listenerfunctionThe function that will be called when the specified event is emitted. The listener function will be removed and then invoked one time.

See the Node.js Events Docs(link takes you to an external page) for more information.

device.prependListener(eventName, listener)

deviceprependlistenereventname-listener page anchor

Adds a listener function to the beginning of the listeners array for the event named eventName.

Calling this multiple times with the same eventName and listener arguments will add the listener again, meaning that the listener will be called multiple times when the specified event is emitted.

ParameterData TypeDescription
eventNamestring or symbolThe event emitted by the Device instance that will call the listener function
listenerfunctionThe function that will be called when the specified event is emitted. The listener will be added to the beginning of the listeners array for the specified event.

See the Node.js Events Docs(link takes you to an external page) for more information.

device.prependOnceListener(eventName, listener)

deviceprependoncelistenereventname-listener page anchor

Adds a one-time listener to the beginning of the listener array for the specified event.

ParameterData TypeDescription
eventNamestring or symbolThe event emitted by the Device instance that will call the listener function
listenerfunctionThe function that will be called the next time the specified event is emitted. The listener will be removed from the listeners array before being invoked.

See the Node.js Events Docs(link takes you to an external page) for more information.

device.rawListeners(eventName)

devicerawlistenerseventname page anchor

Returns an array of the listeners associated with the event named eventName. This includes any wrappers.

ParameterData TypeDescription
eventNamestring or symbolthe event for which you want to retrieve the listeners array (includes any wrappers)

See the Node.js Events Docs(link takes you to an external page) for more information.

Register the Device instance with Twilio, allowing it to receive incoming calls. This will open a signaling WebSocket, so the browser tab may show the 'recording' icon.

It's not necessary to call device.register() in order to make outgoing calls.

1
const device = new Device(token);
2
3
const handleSuccessfulRegistration = () => {
4
console.log('The device is ready to receive incoming calls.')
5
}
6
7
device.on('registered', handleSuccessfulRegistration);
8
9
device.register();
(information)

Info

Some browsers will throw errors on pages that play audio that isn't initiated by a user gesture. Twilio recommends calling device.register() in response to a user gesture, such as a click. One popular and intuitive way to implement this is to add a button that will call device.register().

Example:

A user clicks on a Start Device button that will fire device.register() to enable the Device instance to receive incoming calls. Once registered, the Device instance will emit the 'registered' event.

1
const device = new Device(token);
2
3
// Listen for the 'registered' event
4
device.on('registered', () => {
5
console.log('The device is ready to receive calls.')
6
})
7
8
// A 'Start Device' button click calls this method
9
const startDevice = () => {
10
console.log('Registering the device to receive calls.');
11
device.register();
12
}

device.removeAllListeners(eventNames?)

deviceremovealllistenerseventnames page anchor

Removes all listeners on the Device instance if no argument is passed. This is not recommended.

The optional eventNames parameter is an array of event name strings.

If eventNames argument is passed, only those listeners will be removed. This is only recommended for events and event listeners that you have added, not those created by the SDK.

1
const device = new Device(token);
2
3
// removes all event listeners
4
device.removeListeners();
5
6
// removes the listeners for the "event1" and "event2" events
7
device.removeListeners(["event1", "event2"]);

See the Node.js Events Docs(link takes you to an external page) for more information.

device.removeListener(eventName, listener)

deviceremovelistenereventname-listener page anchor

Removes the listener specified by the eventName and listener arguments. This is analogous to device.off().

1
const device = new Device(token);
2
3
const handleSuccessfulRegistration = () => {
4
console.log('The device is ready to receive incoming calls.')
5
}
6
7
device.on('registered', handleSuccessfulRegistration);
8
9
device.removeListener('registered', handleSuccessfulRegistration);

See the Node.js Events Docs(link takes you to an external page) for more information.

device.setMaxListeners(number)

devicesetmaxlistenersnumber page anchor

Set the maximum number of event listeners allowed on this Device instance. The default maximum is 10.

Calling this method will change only the maximum allowed on this specific instance of a Device. If you want to change the maximum number of listeners allowed for all Device instances, consider setting the static Device.defaultMaxListeners property on the global Device object provided by the SDK.

Note: device.setMaxListeners(number) will have precedence over Device.defaultMaxListeners.

1
const device = new Device(token);
2
3
device.setMaxListeners(20);

device.unregister()

deviceunregister page anchor

Unregister the Device instance with Twilio. This will prevent the Device instance from receiving incoming calls.

The Device instance will emit the 'unregistered' event when successfully unregistered with Twilio.

1
const device = new Device(token);
2
3
// Listen for the 'unregistered' event
4
device.on('unregistered', () => {
5
console.log('The device is no longer able to receive calls.')
6
})
7
8
const unregisterDevice = () => {
9
console.log('Unregistering the device.');
10
device.unregister();
11
}
12

device.updateOptions(options)

deviceupdateoptionsoptions page anchor

Set the options used within the Device instance.

See the DeviceOptions section above for the full list of available options.

Example:

Specify an Edge location and custom sounds

1
const options = {
2
edge: 'ashburn',
3
sounds: {
4
incoming: '',
5
outgoing: '',
6
dtmf8: ''
7
}
8
}
9
10
const device = new Device(token);
11
device.updateOptions(options);

device.updateToken(token)

deviceupdatetokentoken page anchor

Update the token used by this Device instance to connect to Twilio.

If the token expires, the Device instance will not be able to receive or make calls. It will also prevent statistics from being sent to Voice Insights.

It is recommended to call this API after device.tokenWillExpire event is emitted, and before or after a call to prevent a potential ~1s audio loss during the update process.

In the future, as Twilio explores signaling reconnection support, keeping this token updated will be important for automatically restoring connection to a Call or re-registering the Device instance.

Example:

1
// time to live for the token, in milliseconds
2
const timeToLive = 600000; // 10 minutes
3
const refreshBuffer = 30000; // 30 seconds
4
5
const token = await getTokenViaAjax({ timeToLive });
6
const device = new Device(token);
7
8
setInterval(async () => {
9
const newToken = await getTokenViaAjax({ timeToLive });
10
device.updateToken(token);
11
}, timeToLive - refreshBuffer);

Emitted when the Device has been destroyed.

Listen for the 'destroyed' event.

1
const device = new Device(token);
2
3
device.on('destroyed', () => {
4
// Do something
5
});

Emitted when the Device instance receives an error.

The event listener will receive a TwilioError and when applicable, a reference to the Call object that was active when the error occurred. See the TwilioError section below for more information on the TwilioError object.

Listen for the 'error' event.

1
const device = new Device(token);
2
3
device.on('error', (twilioError, call) => {
4
console.log('An error has occurred: ', twilioError);
5
});

TwilioError

The format of the TwilioError returned from the error event is a JavaScript object with the following properties:

PropertyDescription
causes string[]A list of possible causes for the error
code numberThe numerical code associated with this error
description stringA description of what the error means
explanation stringAn explanation of when the error may be observed
message stringAny further information discovered and passed along at runtime.
name stringThe name of this error
originalError (optional) stringThe original error received from the external system, if any
solutions string[]A list of potential solutions for the error

See a list of common errors on the Voice SDK Error Codes Page.

Emitted when an incoming Call is received. An event listener will receive the Call object representing the incoming Call. You can interact with the call object using its public APIs, or you can forward it to a different Device using device.connect() and call.connectToken, enabling your application to receive multiple incoming calls for the same identity.

Important: When forwarding a call, the token for the target Device instance needs to have the same identity as the token used in the Device that originally received the call.

1
const receiverDevice = new Device(token, options);
2
await receiverDevice.register();
3
4
receiverDevice.on('incoming', (call) => {
5
// Forward this call to a new Device instance using the call.connectToken string.
6
forwardCall(call.connectToken);
7
});
8
9
// The forwardCall function may look something like the following.
10
async function forwardCall(connectToken) {
11
// For each incoming call, create a new Device object. This ensures individual
12
// interaction with each call, without affecting other calls.
13
// IMPORTANT: The token for this new device needs to have the same identity
14
// as the token used in the receiverDevice.
15
const device = new Device(token, options);
16
const call = await device.connect({ connectToken });
17
18
// Destroy the `Device` after the call is completed
19
call.on('disconnect', () => device.destroy());
20
}

Emitted when the Device instance is registered and able to receive incoming calls.

Listen for the 'registered' event.

1
const device = new Device(token);
2
3
device.on('registered', () => {
4
// Do something
5
});

Emitted when the Device instance is registering with Twilio to receive incoming calls.

Listen for the 'registering' event.

1
const device = new Device(token);
2
3
device.on('registering', () => {
4
// Do something
5
});

Emitted when the Device instance's AccessToken is about to expire.

Use the refreshTokenMs property on the DeviceOptions object to set a custom warning time. The default is 10 seconds (10000 milliseconds) prior to the AccessToken expiring.

Listen for the 'tokenWillExpire' event.

You can use this event along with device.updateToken() to automatically retrieve a new AccessToken and update the AccessToken on the Device instance, as shown in the example below:

1
device.on('tokenWillExpire', () => {
2
const token = getNewTokenViaAjax();
3
device.updateToken(token);
4
});

Emitted when the Device instance has unregistered with Twilio.

Listen for the 'unregistered' event.

1
const device = new Device(token);
2
3
device.on('unregistered', () =>
4
// Do something
5
});

Return the AudioHelper(link takes you to an external page) object used by the Device instance. See the device.audio docs for more information.

Returns an array of Calls that this Device instance is maintaining.

Modifying one of these calls will have the same affect as modifying the same Call as it was returned by device.on('incoming') or device.connect().

1
const device = new Device(token);
2
3
// make an ougoing call
4
device.connect({ params: { To: "+15551234567" } });
5
6
console.log(device.calls);
7
8
// Prints:
9
// []

Returns the Edge value the Device instance is currently connected to. The value will be null when the Device instance is offline.

1
const device = new Device(token);
2
3
device.on("registered", () => {
4
console.log(device.edge);
5
});
6
7
device.register();
8
9
// Prints:
10
// ashburn

Returns the home Twilio Region the Device instance is connected to as a string. The value will be null when the Device instance is offline.

1
const device = new Device(token);
2
3
console.log(device.home);
4
5
// The default region for the JavaScript SDK is US-1
6
7
// Prints:
8
// 'us1'
9

Returns the identity string that is associated with the Device instance's current AccessToken.

This accessor is only populated when the Device instance has successfully registered with Twilio.

Returns a Boolean for whether the Device instance is currently on an active Call

1
const device = new Device(token);
2
3
console.log(device.isBusy);
4
5
// Prints:
6
// false
7
8
9
10
// make an outgoing call
11
device.connect({ params: { To: "+15551234567" });
12
13
console.log(device.isBusy);
14
15
// Prints:
16
// true

Returns the state of the Device instance

1
const device = new Device(token);
2
3
console.log(device.state);
4
5
// Prints:
6
// unregistered

The possible Device instance states are:

  • unregistered - The Device instance is not registered with Twilio and cannot accept incoming calls
  • registering - The Device instance is registering with Twilio to accept incoming calls
  • registered - The Device instance is registered with Twilio and can accept incoming calls
  • destroyed - The Device instance has been destroyed and will not be able to make or receive new calls

Use event listeners on the Device instance to give the user feedback when the Device instance's state changes. See the Best Practices Page for more information.

Returns the token used by this Device instance

1
const device = new Device(token);
2
3
console.log(device.token);
4
5
// Prints:
6
// eyJhbGciOiJIUzI1NiIsInR5cCI6Ikp....

You can use the JWT debugger(link takes you to an external page) to decode and inspect the token.


Static methods should be called on the Device global object provided by the SDK.

Device.runPreflight(token, options?)

devicerunpreflighttoken-options page anchor

Returns a PreflightTest object representing a test call to Twilio which provides information to help troubleshoot call related issues.

Example:

const preflightTest = Device.runPreflight(token, options);

A Twilio.PreflightTest object represents a test call to Twilio which provides information to help troubleshoot call related issues. You never instantiate it directly, but it's returned when you call Device.runPreflight(token, options).

See the PreflightTest Page for more information.


Static properties are those properties that only exist on the global Device object.

Device.defaultMaxListeners

devicedefaultmaxlisteners page anchor

Use this to change the default maximum number of event listeners permitted on all instances of a Device.

Device.defaultMaxListeners = 20;

If you need to change the maximum number of event listeners on a specific Device instance, call the device.setMaxListeners(number) method on that instance.

Note: device.setMaxListeners(number) will have precedence over Device.defaultMaxListeners.


Static accessors should be called on the Device global provided by the SDK.

Returns a Boolean for whether or not this SDK is supported by the current browser

1
console.log(Device.isSupported);
2
3
// Prints:
4
// true
5

Returns the package name of the SDK

1
console.log(Device.packageName);
2
3
// Prints:
4
// @twilio/voice-sdk
5

Returns the current SDK version

1
console.log(Device.version);
2
3
// Prints:
4
// 2.0.0

Need some help?

Terms of service

Copyright © 2024 Twilio Inc.