.. _developers_guide:
****************
Developers Guide
****************
Here is an example project with xuc authentication, both CTI and SIP websocket up and running, and an echo test plus a few examples of cti messages API.
https://gitlab.com/xivo.solutions/cti-stack-example
Integration Principles
======================
* Download the javascript API files from the project `xucserver `_
on our `gitlab `_ repository
::
wget https://gitlab.com/xivo.solutions/xucserver/raw/master/app/assets/javascripts/cti.js
wget https://gitlab.com/xivo.solutions/xucserver/raw/master/app/assets/javascripts/callback.js
wget https://gitlab.com/xivo.solutions/xucserver/raw/master/app/assets/javascripts/membership.js
wget https://gitlab.com/xivo.solutions/xucserver/raw/master/app/assets/javascripts/xc_webrtc.js
wget https://gitlab.com/xivo.solutions/xucserver/raw/master/app/assets/javascripts/SIPml-api.js
* Include the files in your projects
::
.. _cti_authentication:
* Connect to the Xuc server using new Authentication token (see :ref:`rest_authentication`)
::
var wsurl = "ws://"+server+"/xuc/api/2.0/cti?token="+token;
Cti.WebSocket.init(wsurl,username,phoneNumber);
* Setup event handlers to be notified on
* Phone state changes
* Agent state changes
* Statistics
* ...
* Eventually also webRTC handlers
* general
* register
* incoming
* outgoing
* Once web socket communication is established you are able to call XuC Cti javascript methods.
* Place a call, log an agent ....
::
...
$('#login_btn').click(function(event){
Cti.loginAgent($('#agentPhoneNumber').val());
});
$('#logout_btn').click(function(event){
Cti.logoutAgent();
});
$('#xuc_dial_btn').click(function(event){
Cti.dial($("#xuc_destination").val());
});
...
Sample Application
==================
A sample application is provided by the XuC server. This application allows to display events and using different methods exposed by the XuC
::
http://:/sample
.. figure:: sampleapp.png
:scale: 90%
You may browse and use the ``sample.js`` javascript file as an example
* Calling Cti methods :
::
.$('#xuc_login_btn').click(function(event) {
Cti.loginAgent($('#xuc_agentPhoneNumber').val());
});
$('#xuc_logout_btn').click(function(event) {
Cti.logoutAgent();
});
$('#xuc_pause_btn').click(function(event) {
Cti.pauseAgent();
});
$('#xuc_unpause_btn').click(function(event) {
Cti.unpauseAgent();
});
$('#xuc_subscribe_to_queue_stats_btn').click(function(event) {
Cti.subscribeToQueueStats();
});
$('#xuc_answer_btn').click(function(event) {
Cti.answer();
});
$('#xuc_hangup_btn').click(function(event) {
Cti.hangup();
});
$('#xuc_login_btn').click(function(event) {
Cti.loginAgent($('#xuc_agentPhoneNumber').val());
});
$('#xuc_logout_btn').click(function(event) {
Cti.logoutAgent();
});
$('#xuc_togglelogin_btn').click(function(event) {
Cti.toggleAgentLogin();
});
$('#xuc_pause_btn').click(function(event) {
Cti.pauseAgent();
});
$('#xuc_unpause_btn').click(function(event) {
Cti.unpauseAgent();
});
$('#xuc_subscribe_to_queue_stats_btn').click(function(event) {
Cti.subscribeToQueueStats();
});
$('#xuc_answer_btn').click(function(event) {
Cti.answer();
});
$('#xuc_hangup_btn').click(function(event) {
Cti.hangup();
});
$('#xuc_get_agent_call_history').click(function() {
Cti.getAgentCallHistory(7);
});
$('#xuc_get_user_call_history').click(function() {
Cti.getUserCallHistory(7);
});
$('#xuc_get_user_call_history_by_days').click(function() {
Cti.getUserCallHistoryByDays(7);
});
..............
* Declaring events handlers :
::
Cti.setHandler(Cti.MessageType.USERSTATUSES, usersStatusesHandler);
Cti.setHandler(Cti.MessageType.USERSTATUSUPDATE, userStatusHandler);
Cti.setHandler(Cti.MessageType.USERCONFIGUPDATE, userConfigHandler);
Cti.setHandler(Cti.MessageType.LOGGEDON, loggedOnHandler);
Cti.setHandler(Cti.MessageType.PHONESTATUSUPDATE, phoneStatusHandler);
Cti.setHandler(Cti.MessageType.VOICEMAILSTATUSUPDATE, voiceMailStatusHandler);
Cti.setHandler(Cti.MessageType.LINKSTATUSUPDATE, linkStatusHandler);
Cti.setHandler(Cti.MessageType.QUEUESTATISTICS, queueStatisticsHandler);
Cti.setHandler(Cti.MessageType.QUEUECONFIG, queueConfigHandler);
Cti.setHandler(Cti.MessageType.QUEUELIST, queueConfigHandler);
Cti.setHandler(Cti.MessageType.QUEUEMEMBER, queueMemberHandler);
Cti.setHandler(Cti.MessageType.QUEUEMEMBERLIST, queueMemberHandler);
Cti.setHandler(Cti.MessageType.DIRECTORYRESULT, directoryResultHandler);
Cti.setHandler(Cti.MessageType.AGENTCONFIG, agentConfigHandler);
Cti.setHandler(Cti.MessageType.AGENTLIST, agentConfigHandler);
Cti.setHandler(Cti.MessageType.AGENTGROUPLIST, agentGroupConfigHandler);
Cti.setHandler(Cti.MessageType.AGENTSTATEEVENT, agentStateEventHandler);
Cti.setHandler(Cti.MessageType.AGENTERROR, agentErrorHandler);
Cti.setHandler(Cti.MessageType.ERROR, errorHandler);
Cti.setHandler(Cti.MessageType.AGENTDIRECTORY, agentDirectoryHandler);
Cti.setHandler(Cti.MessageType.CONFERENCES, conferencesHandler);
Cti.setHandler(Cti.MessageType.CALLHISTORY, callHistoryHandler);
xc_webrtc.setHandler(xc_webrtc.MessageType.GENERAL, webRtcGeneralEventHandler);
xc_webrtc.setHandler(xc_webrtc.MessageType.REGISTRATION, webRtcRegistrationEventHandler);
xc_webrtc.setHandler(xc_webrtc.MessageType.INCOMING, webRtcIncomingEventHandler);
xc_webrtc.setHandler(xc_webrtc.MessageType.OUTGOING, webRtcOutgoingEventHandler);
.. _ws_msg_throttling:
Throttling
==========
The websocket server integrates a throttling mechanism to prevent flooding.
If you exceed more than 90 request messages in 30 seconds (with a burst of 180), your messages will be throttled and you will receive an error :
::
`{msgType: "Error", ctiMessage: {Error: "Maximum throttle throughput exceeded."}}`
By default, the server applies theses limits:
::
websocket.messagePerDuration = 90
websocket.maxBurst = 180
They can be adjusted if the default settings are not suitable due to a high volume of messages on a machine with heavy traffic. To adjust these values you have to set ``WS_THROTTLING_NB_MESSAGES`` and ``WS_THROTTLING_NB_MESSAGES_BURST`` environment variables in the ``/etc/docker/compose/custom.env``
Example:
::
WS_THROTTLING_NB_MESSAGES=120
WS_THROTTLING_NB_MESSAGES_BURST=240
Then you need to recreate the xucserver container with ``xivocc-dcomp up -d`` to apply the changes.
If these environment variables are not defined in the custom.env file, the default throttling limits will be applied.
This mechanism is analog to the rate-limiting from nginx, and concepts such as burst are :ref:`explained there `.
Debugging
=========
Cti features
------------
Cti events can be logged in the console if the ``Cti.debugMsg`` variable is set to ``true``, you can do it directly in
the developer tools console:
::
Cti.debugMsg=true;
You'll then get send and received events in the console log (prefixed by ``S>>>`` and ``R<<<`` respectively):
::
2016-11-23 14:48:59.180 S>>> {"claz":"web","command":"dial","destination":"111","variables":{}}
2016-11-23 14:48:59.557 R<<< {"msgType":"PhoneStatusUpdate","ctiMessage":{"status":"CALLING"}}