Changelog
9.6.1
Changes
- We now throw an error on unsanitized inputs
9.6.0
New
- Dispatch
rtc:iceconnectionstatechange
event at application level when a ice
connection state
application.on('rtc:iceconnectionstatechange', (state) => {
console.log(state);
});
- Dispatch
rtc:peerconnectionstatechange
event at application level when a peer connection for a call has a state change
application.on('rtc:peerconnectionstatechange', (state) => {
console.log(state);
});
- Dispatch
rtc:peerconnectioncreated
event at application level when a peer connection is created
application.on('rtc:peerconnectioncreated', (peerconnection) => {
console.log(peerconnection);
});
- Dispatch
rtc:icecandidateerror
event at application level when there is an error with the ice candidate
application.on('rtc:icecandidateerror', (error) => {
console.log(error);
});
- Dispatch
rtc:icegatheringstatechange
event at application level when a ice
state changes during ice gathering process
application.on('rtc:icegatheringstatechange', (state) => {
console.log(state);
});
- Dispatch
rtc:signalingstatechange
event at application level when a peer connection signaling state change
application.on('rtc:signalingstatechange', (state) => {
console.log(state);
});
Changes
- Update
webrtc-adapter
shim to 9.0.1
9.5.3
Fixes
- Fix bug on keeping active local streams open if
RTCPeerConnection
establishment fails
9.5.2
Changes
- Improve Event Sync request efficiency
9.5.1
Fixes
- Fix bug on
networkRequest
data stringification
9.5.0
New
- Support pending events (missed
member:invited
)
9.4.0
New
conversation
.sendEphemeralEvent({ state: "INVITED" })
.then((event) => {
console.log(event)
});
9.3.1
Fixes
- Fix
NexmoAPI
error wrapping for v0.3
Conversation API endpoints
9.3.0
New
- Add
state
to query param for application.getConversations()
for the ConversationsPage
object
application
.getConversations({ state: "INVITED" })
.then((conversations_page) => {
conversations_page.items.forEach(conversation => {
render(conversation);
})
});
Fixes
- Fix type definition for
Conversation
timestamp to object
- Default
socket.io
query session_version
to 0.0.1
unless enableInboundOffer
flag set to true, then default to 0.0.2
9.2.6
Changes
- Add WS reconnection metrics
9.2.5
Fixes
- Fix type definition for
enableEventsQueue
and enableInboundOffer
- Add
acknowledgeEvents
flag in the configuration to allow tracking of websocket event acknowledgement
9.2.4
Fixes
- Emitting
reconnecting
socket event on reconnection attempt
9.2.3
Changes
- Upgrade
socket.io-client
version to 4.6.1
9.2.2
Fixes
- Fix
ConversationEventsProcessor
being initiated multiple times for the same conversation
9.2.1
Fixes
- Fix EmitMediaStream listener for failed call
9.2.0
Changes
- Add
enableInboundOffer
flag to config for inbound call setup
- Remove
Ice Servers
default from webrtc STUN
server setup
- Replace
api.nexmo
URLs to api.vonage
URLs
9.1.5
Fixes
- Fix bug on user re invited/joined to a conversation
9.1.4
Changes
- Use
v2
of Nexmo Conversation Websocket
9.1.3
Fix
- Fix typescript module definition
9.1.2
Fix
- Refactor preload media function
9.1.1
Fix
- Fix events ordering for rtc:transfer on named conversations
9.1.0
New
- Use pre-loaded media on inbound calls (start
WebRTC ice
gathering process as soon as member is invited to a call)
Fix
- Remove
public-ip
library because of a security vulnerability (updated with is-ip
)
9.0.0
Breaking changes
- Rename
login()
function to createSession()
rtc.createSession(token).then((application) => {
console.log(application);
}).catch((error) => {
console.log(error);
});
- Rename
logout()
function to deleteSession()
rtc.deleteSession().then((response) => {
console.log(response);
}).catch((error) => {
console.log(error);
});
Changes
- Move websocket connection creation to the
createSession()
function
8.7.3
Changes
- Added token authentication to
connectivityReport()
rtc.connectivityReport(token, {
dcListCallback: (dcList) => {...dcList, additionalDc}
}).then((report) => {
console.log(report);
}).catch((error) => {
console.log(error);
});
- Added token authentication to
checkMediaServers()
rtc.checkMediaServers('token', 'nexmo-api-url','dc').then((responseArray) => {
console.log(responseArray);
}).catch((error) => {
console.log(error);
});
8.7.2
Fix
- Removed unused npm dependencies.
8.7.1
New
- Added new
checkMediaServers()
method to return a list with the connection health of the media servers for a specific datacenter.
rtc.checkMediaServers('nexmo-api-url','dc').then((responseArray) => {
console.log(responseArray);
}).catch((error) => {
console.log(error);
});
- Added new
checkMediaConnectivity()
method to return the connection health of a single media server.
rtc.checkMediaConnectivity('ip-address','1').then((response) => {
console.log(response);
}).catch((error) => {
console.log(error);
});
Changes
- Update
connectivityReport()
to return connection time in ms for connection to https, wss, and media servers
8.6.0
New
- Added an optional object argument to the
connectivityReport()
, with optional field dcListCallback
which accepts a callback function to update data center list
rtc.connectivityReport({
dcListCallback: (dcList) => {...dcList, additionalDc}
}).then((report) => {
console.log(report);
}).catch((error) => {
console.log(error);
});
8.5.0
New
- Expose
seen()
and delivered()
functions for message events
messageEvent.seen().then(() => {
console.log(`Seen message with id ${messageEvent.id}`);
}).catch((error) => {
console.log(error);
});
- Support new message status events
message:seen
message:delivered
message:submitted
message:rejected
message:undeliverable
conversation.on("message:delivered", (member, event) => {
console.log(`Message with id ${event.id} delivered to ${member.name}`);
});
- Added new state objects for message events supporting the new statuses
seen_by
delivered_to
submitted_to
rejected_by
undeliverable_to
Changes
- Update
connectivityReport()
to use proper endpoints per region
8.4.1
Fix
- Fix events ordering when gap in inbound events
8.4.0
New
- Added new
connectivityReport()
function to get a connectivity report for all Vonage data centers and media servers
rtc.connectivityReport().then((report) => {
console.log(report);
}).catch((error) => {
console.log(error);
});
8.3.1
New
- Set the default sync level for the login process from
lite
to none
8.3.0
New
- Added new
uploadImage()
function to upload an image to the Vonage Media Service
const params = {
quality_ratio : "90",
medium_size_ratio: "40",
thumbnail_size_ratio: "20"
};
conversation.uploadImage(fileInput.files[0], params).then((uploadImageRequest) => {
uploadImageRequest.onprogress = (e) => {
console.log("Image request progress: ", e);
console.log("Image progress: " + e.loaded + "/" + e.total);
};
uploadImageRequest.onabort = (e) => {
console.log("Image request aborted: ", e);
console.log("Image: " + e.type);
};
uploadImageRequest.onloadend = (e) => {
console.log("Image request successful: ", e);
console.log("Image: " + e.type);
};
uploadImageRequest.onreadystatechange = () => {
if (uploadImageRequest.readyState === 4 && uploadImageRequest.status === 200) {
const representations = JSON.parse(uploadImageRequest.responseText);
console.log("Original image url: ", representations.original.url);
console.log("Medium image url: ", representations.medium.url);
console.log("Thumbnail image url: ", representations.thumbnail.url);
}
};
}).catch((error) => {
console.error("error uploading the image ", error);
});
- Added new
sendMessage()
function to send a new message
to the conversation (supported types are text
, image
, audio
, video
and file
)
conversation.sendMessage({
"message_type": "text",
"text": "Hi Vonage!"
}).then((event) => {
console.log("message was sent", event);
}).catch((error)=>{
console.error("error sending the message ", error);
});
conversation.sendMessage({
"message_type": "image",
"image": {
"url": "https://example.com/image.jpg"
}
})
.then((event) => {
console.log("message was sent", event);
}).catch((error)=>{
console.error("error sending the message ", error);
});
- Added new
MessageEvent
type of event
conversation.on("message", (member, messageEvent) => {
console.log(messageEvent);
});
Changes
- Deprecate
sendText()
function (use sendMessage()
with a type of text
instead)
conversation.sendMessage({ "message_type": "text", "text": "Hi Vonage!" }).then((event) => {
console.log("message was sent", event);
}).catch((error)=>{
console.error("error sending the message ", error);
});
- Deprecate
sendImage()
function (use uploadImage()
and sendMessage()
with a type of image
instead)
conversation.uploadImage(imageFile).then((imageRequest) => {
imageRequest.onreadystatechange = () => {
if (imageRequest.readyState === 4 && imageRequest.status === 200) {
try {
const { original, medium, thumbnail } = JSON.parse(imageRequest.responseText);
const message = {
message_type: 'image',
image: {
url: original.url ?? medium.url ?? thumbnail.url
}
}
return conversation.sendMessage(message);
} catch (error) {
console.error("error sending the message ", error);
}
}
if (imageRequest.status !== 200) {
console.error("error uploading the image");
}
};
return imageRequest;
})
.catch((error) => {
console.error("error uploading the image ", error);
});
8.2.5
Fix
- Fix error handling for audio permissions
8.2.2
Fix
8.2.0
New
- Add new
getUserSessions()
function to fetch the sessions of the logged in user
application.getUserSessions({ user_id: "USR-id", page_size: 20 }).then((user_sessions_page) => {
user_sessions_page.items.forEach(user_session => {
render(user_session)
})
}).catch((error) => {
console.error(error);
});
8.1.1
New
- Add new optional
mediaParams
parameter in reconnectCall
function, in order to modify the MediaStream
object
application.reconnectCall(
"conversation_id",
"rtc_id",
{ audioConstraints: { deviceId: "device_id" } }
).then((nxmCall) => {
console.log(nxmCall);
}).catch((error) => {
console.error(error);
});
- Update
media.enable()
docs to include audio constraints
Fixes
- Assign the correct
NXMCall
status when reconnecting to a call (STARTED
, RINGING
or ANSWERED
)
Changes
8.1.0
New
- Add
reconnectCall
function allowing users to reconnect to a call within 20 seconds if browser tab closed
application.reconnectCall("conversation_id", "rtc_id").then((nxmCall) => {
console.log(nxmCall);
}).catch((error) => {
console.error(error);
});
- Add optional parameter
reconnectRtcId
to media enable()
function to reconnect media to call
conversation.media.enable({ reconnectRtcId: "UUID" }).then((stream) => {
console.log(stream)
}).catch((error) => {
console.error("error renabling media", error);
});
- Add
custom_data
object in callServer
function
application.callServer("<phone_number>", "phone", { field1: "test" }).then((nxmCall) => {
console.log(nxmCall);
}).catch((error) => {
console.error(error);
});
- Add
apiKey
, applicationId
, conversationId
and conversationName
when available in rtcstats
analytics reports
Fixes
- Fix bug in call transfer where
transferred_from
was undefined
8.0.5
Fixes
- Fix the
from
for member events
- Update npm dependencies including
socket-io
8.0.4
Fixes
- Fix bug on
DTMF
dispatch of callback to event_url
8.0.3
Fixes
- Fix out of order internal events processing in the events queue
- Fix deprecation warning message for
rtcstats:report
8.0.1
Fixes
- Update Typescript definitions
- Fix bug on IP-IP call scenario involving Native SDKs (not populating properly the
Conversation.members
Map)
8.0.0
Breaking changes
- Deprecate
Conversation.members
Map (it will be populated only on a call scenario)
- Conversation events will be emitted with a subset information of the Member
conversation.on("any:event", ({memberId, userId, userName, displayName, imageUrl, customData}, event) => {});
Changes
- Add paginated
getMembers()
function to retrieve the members of a conversation
conversation.getMembers().then((members_page) => {
members_page.items.forEach(member => {
render(member);
})
}).catch((error) => {
console.error("error getting the members ", error);
});
- Add
getMyMember()
function to retrieve our own member in a conversation
conversation.getMyMember().then((member) => {
render(member);
}).catch((error) => {
console.error("error getting my member", error);
});
- Add
getMember()
function to fetch a conversation member by member_id
conversation.getMember("MEM-id").then((member) => {
render(member);
}).catch((error) => {
console.error("error getting member", error);
});
Fixes
- Update Typescript definitions
7.1.0
Changes
rtcstats:report
is deprecated. Please use rtcstats:analytics
instead
application.on('rtcstats:analytics', ({
type: 'mos' || 'mos_report',
mos: string,
rtc_id: string,
mos_report?: {
average: string,
last: string,
max: string,
min: string
},
report?: RTCStatsReport
}) => {}
- Add logs reporter for remote logging
- Add custom
getStats
parser
- Remove
callstats
library and implementation
7.0.2
Fixes
- Emit 'call:status:update' event when application offline and call disconnected
7.0.1
Fixes
- Remove unnecessary warning message for call status transitions
7.0.0
Breaking changes
legs
endpoint should be included in acl
paths on JWT
token creation
"acl": {
"paths": {
...,
"/*/legs/**": {}
}
}
Changes
- Improve
callServer
setup time by prewarming leg
- Add the
rtcObject
and remote stream
to the NxmCall
object
Fixes
- Return
ClientDisconnected
reason when client logouts from SDK
6.2.1
Fixes
- Revert back to 6.1.1 from 6.2.0-alpha
6.1.2
Fixes
- Update Typescript definitions
6.1.1
Fixes
- Update Typescript definitions
6.1.0
Changes
- Add
enableEventsQueue
flag to client configuration (default to true)
- Add internal
eventsQueue
mechanism to guarantee order of events received during a session
6.0.19
Changes
- Update
reconnectionDelay
to 2000
in socket.io
- Add
randomizationFactor
to 0.55
in socket.io
6.0.18
Changes
Fixes
- Add
reconnectionDelay
to 3000 and reconnectionDelayMax
to 15000 in socket.io
6.0.17
Fixes
- Update Session id after reconnection
6.0.16
Fixes
- Dispatch
system:error:expired-token
event in application level
application.on('system:error:expired-token', 'NXM-errors', () => {
console.log('Token Expired');
});
- Handle uncaught exception of
conversation:error:invalid-member-state
event
6.0.15
Fixes
- Set SDK default to single preset ICE candidate
- Remove
iceGatherOnlyOneCandidate
flag from client configuration
6.0.13
Fixes
- Update websocket reconnection logic for token expiry
6.0.12
Fixes
- Update resolved stream on media enabling
6.0.11
Changes
- Update websocket reconnection logic
- Fix delay in establishing media connection with one ice candidate sent
6.0.10
Fixes
- Filter IPv6 Candidates from
iceGatherOnlyOneCandidate
SDP offer
6.0.9
Fixes
- Fix handler of
rtc:transfer
event to refresh conversation
6.0.8
Fixes
- Fix duplicated webrtc offer sent during IP calling
- Fix Safari
WebRTC
dependency
6.0.7
Fixes
- Fix ANSWERED call status in IP - IP calling
- Fix docs issues
Changes
- Improve TypeScript definitions
6.0.6
Fixes
- Add
iceGatherOnlyOneCandidate
configuration option and use to define path in ICE gathering
process
6.0.5
Fixes
- Update styling of
JSDocs
to Docstrap
template
- Change
RTCPeerConnection ICE candidates
gathering process to send the Session Description Protocol (SDP
) offer on first ICE
candidate gathered
6.0.4
Fixes
- Remove remaining audio elements after transferring a call to a new conversation
- Update
conversation.invite()
to not include empty user_id
or user_name
fields within the requests
6.0.3
New
- Added TypeScript definition files
Changes
- Added options for customized logging levels in the console of
debug
, info
, warn
, or error
.
new NexmoClient({
debug: 'info'
})
- Moved storage of JWT token from
localStorage
to NexmoClient
configuration object
- Removed unnecessary files from the NPM release package
Fixes
- Fixed call statuses order in case of a transfer
6.0.1
Changes
- Removed
media.record()
and media.fetchRecording()
functions
- Removed cache option from SDK, used for storing conversations and events
- Removed automatic syncing of all individual
conversations
in login, when sync
is lite
or full
6.0.0
Breaking Changes
- Change return value of
application.getConversations()
to new ConversationsPage
object
application
.getConversations({ page_size: 20 })
.then((conversations_page) => {
conversations_page.items.forEach(conversation => {
render(conversation);
})
});
- Change return value of
conversation.getEvents()
to new EventsPage
object
conversation
.getEvents({ event_type: `member:*` })
.then((events_page) => {
events_page.items.forEach(event => {
render(event);
})
});
- Rename method
application.callPhone
to application.callServer
- Rename method
application.call
to application.inAppCall
- Rename method
call.createPhoneCall
to call.createServerCall
- Rename class
Call
to NXMCall
- Rename class
ConversationClient
to NexmoClient
- Rename class
ConversationClientError
to NexmoClientError
- Rename files
conversationClient.js
and conversationClient.min.js
to nexmoClient.js
and nexmoClient.min.js
- Deprecate
member:call:state
event (use instead member:call:status
)
- Remove automatic login in case of a websocket reconnection and emit the event
New
- Send and listen for custom event types in a conversation.
conversation
.sendCustomEvent({type: `my_custom_event`, body: { enabled: true }})
.then((custom_event) => {
console.log(event.body);
});
conversation.on(`my_custom_event`, (from, event) => {
console.log(event.body);
});
- Add new
PageConfig
class for configuring settings for paginated requests
- Add new
Page
class to wrap results of paginated requests
- Add setup of default pagination configuration for conversations and events in ConversationClient initialization
- Add wild card supported for filtering by event types using
:*
(for example event_type
: member:*
)
new NexmoClient({
conversations_page_config: {
page_size: 25,
order: 'asc'
cursor: 'abc'
},
events_page_config: {
page_size: 50,
event_type: `member:*`
}
})
- Add new
ConversationsPage
and EventsPage
which extend Page
class to wrap results of paginated requests for conversations and events
- Add
getNext()
and getPrev()
methods to ConversationsPage
and EventsPage
objects to fetch previous and next pages of conversations and events
- Add
conversations_page_last
parameter to application
object and events_page_last
parameter to conversation
object for reference to last page retrieved
application.conversations_page_last
.getNext((conversations_page) => {
conversations_page.items.forEach(conversation => {
render(conversation)
})
})
conversation.events_page_last
.getPrev((events_page) => {
events_page.items.forEach(event => {
render(event)
})
})
- Add the ability to make an IP-IP call through
callServer
function
application
.callServer('username', 'app')
.then((nxmCall) => {
});
application
.callServer('07400000000')
.then((nxmCall) => {
});
Changes
- Update
reason
object to receive reason.reason_text
and reason.reason_code
fields
Internal changes
- Rename
Event
class to NXMEvent
- Update CAPI requests to REST calls for these events
event:delivered
text:delivered
image:delivered
event:seen
text:seen
image:seen
conversation:events
audio:play
conversation:delete
conversation:invite
text
text:typing:on
text:typing:off
new:conversation
conversation:get
user:conversations
user:get
conversation:join
audio:say
audio:earmuff:on
audio:earmuff:off
audio:dtmf
audio:record
audio:play
conversation:member:delete
event:delete
audio:ringing:start
audio:ringing:stop
audio:mute:on
audio:mute:off
image
rtc:new
rtc:answer
rtc:terminate
knocking:new
knocking:delete
5.3.4
Fixes
- Custom SDK config object does a deep merge with default config object
5.3.3
Fixes
- Change digits to digit in the sendDTMF() request method payload
- Stream is not being terminated on a call transfer
member:call
is not being emitted if media.audio_settings.enabled
is false or doesn't exist
New
- Set member.callStatus
started
when initialising an IP - IP call
- Set member.callStatus
ringing
when enabling the ringing with media.startRinging()
Internal changes
- Move stream clean up from
member:left
to rtc:hangup
in Media module
5.3.2
Breaking changes
- Revert 5.3.1 pagination back to 5.2.1
5.3.1
Patch
- Update expected payload for pagination
5.3.0
New
- Migrated from websocket to network requests for conversation.getEvents() & application.getConversations() in preparation for new paginated endpoints
5.2.1
New
- Support
reason
for member:delete conversation.leave
, member.kick
, call.hangup
and call.reject
- Listen for the
member:left
event with reason
conversation.on('member:left', (member, event) => {
console.log(event.body.reason);
});
- Add
callStatus
field in the Member
object, defining the status of a call
- Emit
member:call:status
event each time the member.callStatus
changes
conversation.on("member:call:status", (member) => {
console.log(member.callStatus);
});
5.2.0
New
Add the call
instance in application.calls
map in createCall()
function (IP -IP call)
Update caller parameter in call object in a PSTN - IP call from unknown
to channel.from.number
or channel.from.uri
if exists
Emit the new leg:status:update
event each time a member leg status change
conversation.on("leg:status:update", (member, event) {
console.log(member, event);
});
- Add the the
channel.legs
field in member events offered by CS
conversation.on(<member_event>, (member, event) {
console.log(event);
});
5.1.0
New
conversation.media.sendDTMF('digits')
- Emit new event
audio:dtmf
conversation.on("audio:dtmf",(from, event)=>{
event.digit
event.from
event.timestamp
event.cid
event.body
});
- Set customized audio constraints for IP calls when enabling audio
conversation.media.enable({
'audioConstraints': audioConstraints
})
* Replaces the stream's audio tracks currently being used as the sender's sources with a new one with new audio constraints
* @param {object} constraints - audio constraints
* @returns {Promise<MediaStream>} - Returns the new stream with the updated audio constraints.
* @example
* conversation.media.updateAudioConstraints({'autoGainControl': true})
**/
- Update audio constraints for existing audio tracks
conversation.media.updateAudioConstraints(audioConstraints)
})
Fixes
- Remove 'this' passed to cache worker event handler
Internal breaking changes
- Change the media audio parameter from
media.audio
to media.audio_settings
in inviteWithAudio
function
5.0.3
Changes
- Change default behaviour of
autoPlayAudio
in media.enable()
from false to true
- Pass an
autoPlayAudio
parameter to call.createCall()
and call.answer()
functions (default is true)
5.0.2
New
- Delete the image files before sending the
image:delete
request
- Attach of audio stream can now be chosen if it will be automatically on or off through
media.enable()
media.enable({
autoPlayAudio: true | false
})
Changes (internally)
- Combine the network GET, POST and DELETE requests in one generic function
5.0.1
Fixes
- Clean up user's media before leaving from an ongoing conversation
Breaking changes
- Change
application.conversations
type from Object
to Map
4.1.0
Fixes
- Fixed the bug where the audio stream resolved in media.enable() is causing echo and was not the remote stream
- Resolve the remote stream
pc.ontrack()
and not the localStream
from getUserMedia
Changes
- Rename
localStream
to stream
in media.rtcObjects
object.
4.0.2
Changes
- Removed
media.rtcNewPromises
New
- Internal lib dependencies update
- Added suport for Bugsnag error monitoring and reporting tool
* @class ConversationClient
*
* @param {object} param.log_reporter configure log reports for bugsnag tool
* @param {Boolean} param.log_reporter.enabled=false
* @param {string} param.log_reporter.bugsnag_key your bugsnag api key / defaults to Nexmo api key
- Updated vscode settings to add empty line (if none) at end of every file upon save
- Disable the ice candidates trickling in ice connection
- Wait until most of the candidates to be gathered both for the local and remote side
- Added new private function
editSDPOrder(offer, answer)
in rtc_helper.js
to reorder the answer SDP when it's needed
- For rtc connection fail state
- Disable leg
- emit new event
media:connection:fail
member.on("media:connection:fail",(connection_details)=>{
connection_details.rtc_id
connection_details.remote_member_id
connection_details.connection_event:
connection_details.type
connection_details.streamIndex
});
* @event Member#media:connection:fail
*
* @property {number} payload.rtc_id the rtc_id / leg_id
* @property {string} payload.remote_member_id the id of the Member the stream belongs to
* @property {event} payload.connection_event the connection fail event
Breaking changes (internally)
- Deprecating ice trickling logic with
onicecandidate
event handler
- Change the format of
member:media
event to the new one offered by CS
type: 'member:media',
from: member.member_id,
conversation_id: member.conversation_id,
body: {
media: member.media,
channel: member.channel
}
- Change the format of
member:invited
event to the new offered by CS
type: 'member:invited',
body: {
media: {
audio_settings: {
enabled: false,
earmuffed: false,
muted: false
}
}
}
4.0.1
New
Select the sync level for the login process
full
: trigger full sync to include conversations and events
lite
: trigger partial sync, only conversation objects (empty of events)
none
: don't sync anything
if the Cache module is enabled the manual fetch of a conversation will store them in internal storage
usage:
new ConverationClient({'sync':'full'});
Fixes
rtcstats:report
was duplicating instances in each call
- remove
screenshare
https restriction
Breaking changes (internally)
- Deprecating
application.activeStream
, now it's part of application.activeStreams
- Removed the restriction to allow calling
media.enable()
while a stream is active
4.0.0
Breaking Changes
- rename SDK
stitch
to client
- listening for
media:stream:*
now gives streamIndex
instead of index
for consistency with the internal rtcObjects
* @event Member
*
* @property {number} payload.streamIndex the index number of this stream
* @property {number} [payload.rtc_id] the rtc_id / leg_id
* @property {string} [payload.remote_member_id] the id of the Member the stream belongs to
* @property {string} [payload.name] the stream's display name
* @property {MediaStream} payload.stream the stream that is activated
* @property {boolean} [payload.video_mute] if the video is hidden
* @property {boolean} [payload.audio_mute] if the audio is muted
Internal Breaking Changes
New
- Screen Share Source ID can now be specified when invoking
media.enable()
3.0.2
New
- Get local stream details under member object on
media:stream:on
for audio
call.conversation.me.on("media:stream:on",(stream_details)=>{
});
* @event Member
*
* @property {number} payload.index the index number of this stream
* @property {number} [payload.rtc_id] the rtc_id / leg_id
* @property {string} [payload.remote_member_id] the id of the Member the stream belongs to
* @property {string} [payload.name] the stream's display name
* @property {MediaStream} payload.stream the stream that is activated
* @property {boolean} [payload.video_mute] if the video is hidden
* @property {boolean} [payload.audio_mute] if the audio is muted
Fix
- Resubscribe to events after disabling and re-enabling media (video flow)
Changes
- update default socket.io
reconnectionAttempts
from infinity
to 5
Breaking changes
group socket.io configuration params
e.g. to disable auto-reconnect: new ConversationClient({socket_io:{
reconnection:false
}})
rename Stitch-client
errors to NXM-errors
errors
Example: Listen to general errors
application.on('*', 'NXM-errors', (error) => {
console.log('An error has been thrown with the type' + error.type);
});
Example: Listen to expired token and update it
application.on('system:error:expired-token', 'NXM-errors', () => {
application.updateToken(<token>)
.then(() => {
console.log('Token Expired');
});
});
3.0.1
New
handle call transfer events rtc:transfer
- attach
member.transferred_from = old_conversation
to know that the member has been transferred from another conversation
- attach
member.transferred_to = new_conversation
to know that this new member comes from a transfer
- attach
call.transferred
to know that a transfer has happened in this call object
Added Call.id
property, when the call is initialised. (leg_id/call_id) (Use this id to transfer this rtc member)
Fixes
- Now the SDK won't kick the last member of a conversation in a call (it was causing most of the
conversation:not-found
issues when a call was terminated)
Internal Changes
- moved
conversation.rtcObjects
to the media
level
it was conversation.media.parentConversation.rtcObjects
, Now you can access the rtcObjects in the media level conversation.media.rtcObjects
- the single PeerConnection object (audio only flow) has also been moved to the media level.
conversation.media.pc
3.0.0
BREAKING CHANGES
Conversation.members
is now a Map()
Call.to
members is now a Map()
to get a member object
conversation.members.get(member_id);
to loop through members
for (const member of conversation.members.values()) { ... }
2.2.0
New
Fix
Breaking Changes
- drop support for
development
for Node v5
2.1.0
Breaking Changes
Screen share
screenshareExtensionId
changed to screenShareExtensionId
new ConversationClient({
debug: false,
screenShareExtensionId: YOUR_EXTENSION_ID
})
RTC stats
- config params for rtcstats are now under a single object
before:
params.rtcstats_enabled = false
params.rtcstats_url = 'url'
params.rtcstats_events = true
now:
params.rtcstats.ws_url = 'url'
params.rtcstats.emit_events = true
New
Call stats event
initialise by setting initial config: new ConversationClient({rtcstats.emit_events:true});
listen for MOS for the Audio stream on Application.on('rtcstats:report', data);
Updated webRTC adapter (better support for browsers)
Internal lib dependency updates
Call object now has a direction (Outbound, Inbound)
Add minified version in public bundle dist/conversationClient.min.js
Fixes
change build/publish flow to include the dist/conversationClient.min.js
covering more use cases: listen your user's join and invite events on both application and conversation level
Timeout with success for Ice gathering for audio calls (mid solution until trickle is done)
Fix call status ANSWERED IP-PSTN case, should reflect the PSTN member joining the audio stream
Call status now does not go to a previous status
Switch to websocket protocol to fix disconnection issues
Internal optimisations
Known Issues
- media.mute() throws error when the audio has been disabled and enabled again