This document discusses building a cloud phone system using WebRTC. It presents three implementation options:
1) Using sipML5 and a backend PBX like Asterisk to handle signaling and media. sipML5 provides a JavaScript SIP stack for making audio and video calls in the browser.
2) Using Janus Gateway to connect a WebRTC frontend to a SIP backend. Janus acts as a WebRTC-SIP translator and plugin for video conferencing, screen sharing, and IM.
3) A complete WebRTC phone built with Janus, connecting a JavaScript client directly to the Janus server for signaling and media handling without an additional SIP backend. Example code is shown for making audio and video calls between a
45. let configuration = {
uri: '3000@nethesis.it',
transportOptions: {
wsServers: [ 'wss://nethesis.it:8089/ws' ]
},
authorizationUser: '3000',
password: '1234'
};
let phone = new SIP.UA(configuration);
phone.on('registered', e => {...});
phone.on('invite', e => {...});
phone.on('...', e => {...});
phone.start();
1 User Agent
2 Video Call
3 Answer Call
4 Hangup
46. let configuration = {
uri: '3000@nethesis.it',
transportOptions: {
wsServers: [ 'wss://nethesis.it:8089/ws' ]
},
authorizationUser: '3000',
password: '1234'
};
let phone = new SIP.UA(configuration);
phone.on('registered', e => {...});
phone.on('invite', e => {...});
phone.on('...', e => {...});
phone.start();
1 User Agent
2 Video Call
3 Answer Call
4 Hangup
47. 3 Answer Call
4 Hangup
2 Video Call
1 User Agent
let session = phone.invite('34012@nethesis.it');
session.on('progress', e => {...});
session.on('failed', e => {...});
session.on('trackAdded', () => {
let pc = session.sessionDescriptionHandler
.peerConnection;
let remoteStream = new MediaStream();
pc.getReceivers().forEach(receiver => {
remoteStream.addTrack(receiver.track);
});
remoteStreamVideo.srcObject = remoteStream;
remoteStreamVideo.play();
// and add local one
});
48. 3 Answer Call
4 Hangup
2 Video Call
1 User Agent
let session = phone.invite('34012@nethesis.it');
session.on('progress', e => {...});
session.on('failed', e => {...});
session.on('trackAdded', () => {
let pc = session.sessionDescriptionHandler
.peerConnection;
let remoteStream = new MediaStream();
pc.getReceivers().forEach(receiver => {
remoteStream.addTrack(receiver.track);
});
remoteStreamVideo.srcObject = remoteStream;
remoteStreamVideo.play();
// and add local one
});
49. 2 Video Call
4 Hangup
1 User Agent
3 Answer Call
phone.on('invite', session => {
session.on('progress', e => {...});
session.on('failed', e => {...});
session.on('trackAdded', () => {
let pc = session
.sessionDescriptionHandler
.peerConnection;
let remoteStream = new MediaStream();
pc.getReceivers().forEach(receiver => {
remoteStream.addTrack(receiver.track);
});
remoteStreamVideo.srcObject = remoteStream;
remoteStreamVideo.play();
// and add local one
});
});
50. 2 Video Call
4 Hangup
1 User Agent
3 Answer Call
phone.on('invite', session => {
session.on('progress', e => {...});
session.on('failed', e => {...});
session.on('trackAdded', () => {
let pc = session
.sessionDescriptionHandler
.peerConnection;
let remoteStream = new MediaStream();
pc.getReceivers().forEach(receiver => {
remoteStream.addTrack(receiver.track);
});
remoteStreamVideo.srcObject = remoteStream;
remoteStreamVideo.play();
// and add local one
});
});
51. 3 Answer Call
1 User Agent
2 Video Call
4 Hangup
let hangup = e => {
rtcSession.terminate();
};