Skip to main content

Relay Client

Relay client is the basic connection to Relay, allowing you send commands to Relay and setup handlers for inbound events.

Constructor

Constructs a client object to interact with Relay.

Parameters

NameTypeRequiredDescription
projectstringrequiredProject ID from your SignalWire Space
tokenstringrequiredJson Web Token retrieved using Rest API. See Generate a JWT for more information.

Examples

Create a Client to interact with the Relay API.

const client = new Relay({
project: 'my-project-id',
token: 'my-jwt',
})

client.on('signalwire.ready', (client) => {
// You are connected with Relay!
})

client.connect()

Properties

NameTypeDescription
connectedbooleantrue if the client has connected to Relay.
expiredbooleantrue if the JWT has expired.

Devices and Media Constraints

You can configure the devices your client will use by default with these properties and methods:

NameTypeDescription
devicesobjectAll devices recognized by the client keyed by kind: videoinput, audioinput and audiooutput.
videoDevicesobjectDEPRECATED: Video devices recognized by the client.
audioInDevicesobjectDEPRECATED: Audio input devices recognized by the client.
audioOutDevicesobjectDEPRECATED: Audio output devices recognized by the client.
mediaConstraintsobjectCurrent audio/video constraints used by the client.
speakerstringAudio output device used by the client.
speakerstringSet the audio output device to use for the subsequent calls.

Examples

If present, use the first audio output device as default speaker.

const speakerList = client.audioOutDevices.toArray()
if (speakerList.length) {
client.speaker = speakerList[0].deviceId
}

Local and Remote Elements

It is usual, in a WebRTC application, to display the local and remote videos in a video-call. In the case of an audio-only call you will need at least the audio element to play the media.

NameTypeDescription
localElementHTMLMediaElementCurrent element used by the client to display the local stream.
localElementHTMLMediaElement, string or FunctionIt accepts an HTMLMediaElement, the ID of the element as a string or a Function that returns an HTMLMediaElement.
remoteElementHTMLMediaElementCurrent element used by the client to display the remote stream.
remoteElementHTMLMediaElement, string or FunctionIt accepts an HTMLMediaElement, the ID of the element as a string or a Function that returns an HTMLMediaElement.

Note: the client will attach the streams to the proper element but will not change the style attribute. You can decide if you would like to display or hide the HTMLMediaElement following the application logic.
Use the callUpdate notification to detect call state changes and update the UI accordingly.

STUN/TURN Servers

Through the iceServers you can set/retrieve the default ICE server configuration for all subsequent calls.

NameTypeDescription
iceServersRTCIceServersCurrent ICE servers used by the client.
iceServersRTCIceServers[] or booleanarray of ICE servers, true to use the default ones or false to not use STUN/TURN at all.

Examples

Use both STUN and TURN for the client.

client.iceServers = [
{
urls: 'stun:stun.example.domain.com'
},
{
urls: 'turn:turn.example.domain.com',
username: '<turn-username>',
credential: '<turn-password>'
}
]

Methods

checkPermissions

The first time a user visits your page, before access his microphone or webcam, the browser display a notification to the user. Use this method if you want to check you already have the permission to access them.

Parameters

NameTypeRequiredDescription
audiobooleanoptionalWhether to check permissions for the microphone.
Default to true
videobooleanoptionalWhether to check permissions for the webcam.
Default to true

Returns

Promise<boolean> - A Promise object resolved with a boolean value.

Examples

Check both audio and video permissions.

// within an async function ..
const success = await client.checkPermissions()
if (success) {
// User gave the permission..
} else {
// User didn't gave the permission..
}

connect

Activates the connection to Relay. Make sure you have attached the listeners you need before connecting the client, or you might miss some events.

Returns

Promise<void>

Examples

await client.connect()

disconnect

Disconnect the client from Relay.

Returns

void

Examples

client.disconnect()

disableMicrophone

Disable the use of the microphone for the subsequent calls.

disableWebcam

Disable the use of the webcam for the subsequent calls.

enableMicrophone

Enable the use of the microphone for the subsequent calls.

enableWebcam

Enable the use of the webcam for the subsequent calls.

getAudioInDevices

Return all audioinput devices supported by the browser.

Parameters

None

Returns

Promise<MediaDeviceInfo[]> - A Promise object resolved with a list of MediaDeviceInfo.

Examples

List microphones.

// within an async function ..
const devices = await client.getAudioInDevices()
devices.forEach(device => {
console.log(device.kind + ': ' + device.label + ' id: ' + device.deviceId);
})

getAudioOutDevices

Return all audiooutput devices supported by the browser.

Parameters

None

Returns

Promise<MediaDeviceInfo[]> - A Promise object resolved with a list of MediaDeviceInfo.

Examples

List speakers.

// within an async function ..
const devices = await client.getAudioOutDevices()
devices.forEach(device => {
console.log(device.kind + ': ' + device.label + ' id: ' + device.deviceId);
})

getDeviceResolutions

Return a list of supported resolutions for the given webcam (deviceId).

Parameters

NameTypeRequiredDescription
deviceIdstringrequiredDevice ID to be checked.

Returns

Promise<Array> - A Promise object resolved with a list of supported resolutions.

Examples

Check both audio and video permissions.

// within an async function ..
const resolutions = await client.getDeviceResolutions('d346d0f78627e3b808cdf0c2bc0b25b4539848ecf852ff03df5ac7545f4f5398')

[
{
"resolution": "320x240",
"width": 320,
"height": 240
},
{
"resolution": "640x360",
"width": 640,
"height": 360
},
{
"resolution": "640x480",
"width": 640,
"height": 480
},
{
"resolution": "1280x720",
"width": 1280,
"height": 720
}
]

getDevices

Return all devices supported by the browser.

Parameters

None

Returns

Promise<MediaDeviceInfo[]> - A Promise object resolved with a list of MediaDeviceInfo.

Examples

List all devices.

// within an async function ..
const devices = await client.getDevices()
devices.forEach(device => {
console.log(device.kind + ': ' + device.label + ' id: ' + device.deviceId);
})

getVideoDevices

Return all videoinput devices supported by the browser.

Parameters

None

Returns

Promise<MediaDeviceInfo[]> - A Promise object resolved with a list of MediaDeviceInfo.

Examples

List webcams.

// within an async function ..
const devices = await client.getVideoDevices()
devices.forEach(device => {
console.log(device.kind + ': ' + device.label + ' id: ' + device.deviceId);
})

newCall

Make a new outbound call.

Parameters

NameTypeRequiredDescription
optionsobjectrequiredObject with the following properties:
destinationNumberstringrequiredExtension to dial.
callerNumberstringoptionalNumber to use as the caller ID when dialling out to a phone number.
Must be a SignalWire number that you own.
idstringoptionalThe identifier of the Call.
localStreamstringoptionalIf set, the Call will use this stream instead of retrieving a new one. Useful if you already have a MediaStream from a canvas.captureStream() or a screen share extension.
localElementstringoptionalOverrides client's default localElement.
remoteElementstringoptionalOverrides client's default remoteElement.
iceServersRTCIceServers[]optionalOverrides client's default iceServers.
audioMediaStreamConstraintsoptionalOverrides client's default audio constraints.
videoMediaStreamConstraintsoptionalOverrides client's default video constraints.
useStereobooleanoptionalUse stereo audio instead of mono.
micIdstringoptionaldeviceId to use as microphone.
Overrides the client's default one.
camIdstringoptionaldeviceId to use as webcam.
Overrides the client's default one.
speakerIdstringoptionaldeviceId to use as speaker.
Overrides the client's default one.
onNotificationstringoptionalOverrides client's default signalwire.notification handler for this Call.

Returns

Promise<Call> - A Promise fulfilled with the new outbound Call object or rejected with the error.

Examples

Make an outbound call to +1 202-555-0122 using default values from the Client.

// within an async function ..
const options = { destinationNumber: '+12025550122' }
const call = await client.newCall(options).catch(console.error)

on

Attach an event handler for a specific type of event.

Parameters

NameTypeRequiredDescription
eventstringrequiredEvent name. Full list of events Relay Events
handlerfunctionrequiredFunction to call when the event comes.

Returns

Relay - The client object itself.

Examples

Subscribe to the signalwire.ready and signalwire.error events.

client.on('signalwire.ready', (client) => {
// Your client is ready!
}).on('signalwire.error', (error) => {
// Got an error...
})

off

Remove an event handler that were attached with .on(). If no handler parameter is passed, all listeners for that event will be removed.

Parameters

NameTypeRequiredDescription
eventstringrequiredEvent name. Full list of events Relay Events
handlerfunctionoptionalFunction to remove.
Note: handler will be removed from the stack by reference so make sure to use the same reference in both .on() and .off() methods.

Returns

Relay - The client object itself.

Examples

Subscribe to the signalwire.error and then, remove the event handler.

const errorHandler = (error) => {
// Log the error..
}

client.on('signalwire.error', errorHandler)

// .. later
client.off('signalwire.error', errorHandler)

refreshDevices

DEPRECATED: Use getDevices instead.

Refresh the devices and return a Promise fulfilled with the new devices.

Parameters

None

Returns

Promise<devices> - New devices object.

Examples

Refresh client's devices with async/await syntax.

// within an async function
const devices = await client.refreshDevices()

refreshToken

When the JWT is going to expire, the Client dispatch a notification with type refreshToken that allows you to refresh the token and keep your session alive.

Parameters

NameTypeRequiredDescription
tokenstringrequiredNew JWT to keep your session alive.

Returns

Promise<void>

Examples

Listen for all notifications and, on refreshToken, fetch a new JWT from your backend and update the token on the client.

client.on('signalwire.notification', function(notification) {
switch (notification.type) {

case 'refreshToken':
// Take a new token from your server...
xhrRequestToRefreshYourJWT().then(async (newToken) => {
await client.refreshToken(newToken).catch(console.error)
})
break

}
})

setAudioSettings

You can set the default audio constraints for your client. See here for further details.

Note: It's a common behaviour, in WebRTC applications, to persist devices user's selection to then reuse them across visits.
Due to a Webkit's security protocols, Safari generates random deviceId on each page load.
To avoid this issue you can specify two additional properties (micId and micLabel) in the constraints input parameter.
The client will use these values to assure the microphone you want to use is available by matching both id and label with the device list retrieved from the browser.

Parameters

NameTypeRequiredDescription
constraintsMediaTrackConstraintsrequiredMediaTrackConstraints object with the addition of micId and micLabel.

Returns

Promise<MediaTrackConstraints> - Audio constraints applied to the client.

Examples

Set microphone by id and label with the echoCancellation flag turned off.

// within an async function
const constraints = await client.setAudioSettings({
micId: '229d4c8838a2781e3668eb173fea2622b34fbf6a9deec19ee5caeb0916839520',
micLabel: 'Internal Microphone (Built-in)',
echoCancellation: false
})

setVideoSettings

You can set the default video constraints for your client. See here for further details.

Note: It's a common behaviour, in WebRTC applications, to persist devices user's selection to then reuse them across visits.
Due to a Webkit's security protocols, Safari generates random deviceId on each page load.
To avoid this issue you can specify two additional properties (camId and camLabel) in the constraints input parameter.
The client will use these values to assure the webcam you want to use is available by matching both id and label with the device list retrieved from the browser.

Parameters

NameTypeRequiredDescription
constraintsMediaTrackConstraintsrequiredMediaTrackConstraints object with the addition of camId and camLabel.

Returns

Promise<MediaTrackConstraints> - Video constraints applied to the client.

Examples

Set webcam by id and label with 720p resolution.

// within an async function
const constraints = await client.setVideoSettings({
camId: '229d4c8838a2781e3668eb173fea2622b34fbf6a9deec19ee5caeb0916839520',
camLabel: 'Internal Webcam (Built-in)',
width: 1080,
height: 720
})

Events

All available events you can attach a listener on.

NameDescription
signalwire.readyThe session has been established and all other methods can now be used.
signalwire.errorThere is an error dispatch at the session level.
signalwire.notificationA notification from SignalWire. Notifications can refer to calls or session updates.
signalwire.socket.openThe websocket is open. However, you have not yet been authenticated.
signalwire.socket.errorThe websocket gave an error.
signalwire.socket.messageThe client has received a message from the websocket.
signalwire.socket.closeThe websocket is closing.