JSSip demo

by minh vi

HTML

<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/jssip/3.1.2/jssip.min.js"></script>
<div id="errorMessage">must set sip uri/password</div>
<div id="wrapper">
    <div id="incomingCall" style="display: none">
        <div class="callInfo">
            <h3>Incoming Call</h3>
            <p id="incomingCallNumber">Unknown</p>
        </div>
        <div id="answer"> <i class="fa fa-phone"></i></div>
        <div id="reject"> <i class="fa fa-phone"></i></div>
    </div>
    <div id="callStatus" style="display: none">
        <div class="callInfo">
             <h3 id="callInfoText">info text goes here</h3>
            <p id="callInfoNumber">info number goes here</p>
        </div>
        <div id="hangUp"> <i class="fa fa-phone"></i>
        </div>
    </div>
    <!---------TO FIELD---------------------------------------------------->
    <!---------DIALPAD---------------------------------------------------->
    <div id="inCallButtons" style="display: none">
        <div id="dialPad">
            
            <div class="dialpad-char" data-value="1" unselectable="on">1</div>
            <div class="dialpad-char" data-value="2" unselectable="on">2</div>
            <div class="dialpad-char" data-value="3" unselectable="on">3</div>
            <div class="dialpad-char" data-value="4" unselectable="on">4</div>
            <div class="dialpad-char" data-value="5" unselectable="on">5</div>
            <div class="dialpad-char" data-value="6" unselectable="on">6</div>
            <div class="dialpad-char" data-value="7" unselectable="on">7</div>
            <div class="dialpad-char" data-value="8" unselectable="on">8</div>
            <div class="dialpad-char" data-value="9" unselectable="on">9</div>
            <div class="dialpad-char" data-value="*" unselectable="on">*</div>
            <div class="dialpad-char" data-value="0" unselectable="on">0</div>
            <div...

CSS

@charset"UTF-8";

/* CSS Document */
 html, body {
    margin: 0;
    padding: 0;
    font-family:'Open Sans', sans-serif;
    color: #494949;
}
#wrapper {
    width: 300px;
    margin: 0 auto;
}
.callInfo {
    width: 190px;
    height: 70px;
    float: left;
}
#connectedCall .callInfo {
    width: 240px;
}
#dialPad div{
    -moz-user-select: -moz-none;
    -khtml-user-select: none;
    -webkit-user-select: none;
    
    /*
    Introduced in IE 10.
    See http://ie.microsoft.com/testdrive/HTML5/msUserSelect/
    */
    -ms-user-select: none;
    user-select: none;
}
.callInfo h3 {
    color: #389400;
    margin: 10px 0 10px 0;
}
.callInfo p {
    margin: 0px 25px 0px 0px;
    float: left;
}
#answer, #hangUp, #reject, #connectCall, #mute {
    color: #FFF;
    background-color: #389400;
    width: 50px;
    height: 50px;
    float: right;
    text-align: center;
    font-size: 30px;
    margin: 10px 0px 10px 0px;
    border-radius: 25px 25px 25px 25px;
    -moz-border-radius: 25px 25px 25px 25px;
    -webkit-border-radius: 25px 25px 25px 25px;
    cursor: pointer;
    cursor: hand;
}
#mute:active, #connectCall:active, #reject:active, #hangUp:active, #answer:active {
    background-color: #B6B6B6;
    -webkit-box-shadow: 0px 1px 7px 2px rgba(0, 0, 0, 0.45);
    -moz-box-shadow: 0px 1px 7px 2px rgba(0, 0, 0, 0.45);
    box-shadow: 0px 1px 7px 2px rgba(0, 0, 0, 0.45);
    border: none;
}
#hangUp, #reject {
    -ms-transform: rotate(135deg);
    /* IE 9 */
    -webkit-transform: rotate(135deg);
    /* Chrome, Safari, Opera */
    transform: rotate(135deg);
}
#hangUp {
    background-color: #A90002;
}
#reject {
    background-color: #FFF;
    color: #A90002;
    margin-right: 10px;
}
#connectCall, #mute {
    color: #FFF;
    background-color: #389400;
    width:260px;
    height: 50px;
    font-size: 30px;
    text-align: center;
    margin: 20px 20px 0px 20px;
    border-radius: 5px 5px 5px 5px;
    -moz-border-radius: 5px 5px 5px 5px;
    -webkit-border-radius:...

JavaScript

/* 
 * How To Use:
 * 1. fill in valid credentials in the config below
 * 2. run the JsFiddle and enjoy
 */
 
const credential = 
      { "url": "wss://kam-01.api-connect.io:7443",
       "username": "sip:[email protected]",
       "password": "NpqLlBI32h"
      }


var incomingCallAudio = new window.Audio('https://code.bandwidth.com/media/incoming_alert.mp3');
incomingCallAudio.loop = true;
var remoteAudio = new window.Audio();
remoteAudio.autoplay = true;

const eventHandlers = {
  peerconnection: function(connection) {
  
        connection.peerconnection.onaddstream = e => {
          remoteAudio.srcObject = e.stream;
        };
        connection.peerconnection.onnegotiationneeded = () => {
          if (session) {
            session.renegotiate();
          }
        };
        connection.peerconnection.oniceconnectionstatechange = (e) => {
          console.error("oniceconnectionstatechange: ", e)
        }
      }
}

var callOptions = {
  mediaConstraints: {audio: true, video: false},
  eventHandlers: eventHandlers,
   rtcOfferConstraints: {
      offerToReceiveAudio: {exact: 1},
   }
};

var phone;
if(credential.url && credential.password){
    JsSIP.debug.enable('JsSIP:*'); // more detailed debug output
    const socket = new JsSIP.WebSocketInterface(credential.url);
    phone = new JsSIP.UA({
      sockets: [socket],
      uri: credential.username,
      password: credential.password
    });
    phone.on('registrationFailed', function(ev){
    	alert('Registering on SIP server failed with error: ' + ev.cause);
      credential.url = null;
      credential.password = null;
      updateUI();
    });
    phone.on('newRTCSession',function(ev){
        var newSession = ev.session;
        if(session){ // hangup any existing call
            session.terminate();
        }
        session = newSession;
        var completeSession = function(){
        		session = null;
          	updateUI();
        };
        session.on('ended', completeSession);
...