|
|
|
|
|
|
|
|
|
class ImWebRtc {
|
|
|
|
|
constructor() {
|
|
|
|
|
this.configuration = {}
|
|
|
|
|
this.stream = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.isEnable = function() {
|
|
|
|
|
window.RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window
|
|
|
|
|
.mozRTCPeerConnection;
|
|
|
|
|
window.RTCSessionDescription = window.RTCSessionDescription || window.webkitRTCSessionDescription || window
|
|
|
|
|
.mozRTCSessionDescription;
|
|
|
|
|
window.RTCIceCandidate = window.RTCIceCandidate || window.webkitRTCIceCandidate || window
|
|
|
|
|
.mozRTCIceCandidate;
|
|
|
|
|
return !!window.RTCPeerConnection;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.init = function(configuration) {
|
|
|
|
|
this.configuration = configuration;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.setupPeerConnection = function(callback) {
|
|
|
|
|
this.peerConnection = new RTCPeerConnection(this.configuration);
|
|
|
|
|
this.peerConnection.ontrack = (e) => {
|
|
|
|
|
// 对方的视频流
|
|
|
|
|
callback(e.streams[0]);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.setStream = function(stream) {
|
|
|
|
|
if(this.stream){
|
|
|
|
|
this.peerConnection.removeStream(this.stream)
|
|
|
|
|
}
|
|
|
|
|
if(stream){
|
|
|
|
|
stream.getTracks().forEach((track) => {
|
|
|
|
|
this.peerConnection.addTrack(track, stream);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
this.stream = stream;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.onIcecandidate = function(callback) {
|
|
|
|
|
this.peerConnection.onicecandidate = (event) => {
|
|
|
|
|
// 追踪到候选信息
|
|
|
|
|
if (event.candidate) {
|
|
|
|
|
callback(event.candidate)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.onStateChange = function(callback) {
|
|
|
|
|
// 监听连接状态
|
|
|
|
|
this.peerConnection.oniceconnectionstatechange = (event) => {
|
|
|
|
|
let state = event.target.iceConnectionState;
|
|
|
|
|
console.log("ICE连接状态变化: : " + state)
|
|
|
|
|
callback(state)
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.createOffer = function() {
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
const offerParam = {};
|
|
|
|
|
offerParam.offerToRecieveAudio = 1;
|
|
|
|
|
offerParam.offerToRecieveVideo = 1;
|
|
|
|
|
// 创建本地sdp信息
|
|
|
|
|
this.peerConnection.createOffer(offerParam).then((offer) => {
|
|
|
|
|
// 设置本地sdp信息
|
|
|
|
|
this.peerConnection.setLocalDescription(offer);
|
|
|
|
|
// 发起呼叫请求
|
|
|
|
|
resolve(offer)
|
|
|
|
|
}).catch((e) => {
|
|
|
|
|
reject(e)
|
|
|
|
|
})
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.createAnswer = function(offer) {
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
// 设置远端的sdp
|
|
|
|
|
this.setRemoteDescription(offer);
|
|
|
|
|
// 创建本地dsp
|
|
|
|
|
const offerParam = {};
|
|
|
|
|
offerParam.offerToRecieveAudio = 1;
|
|
|
|
|
offerParam.offerToRecieveVideo = 1;
|
|
|
|
|
this.peerConnection.createAnswer(offerParam).then((answer) => {
|
|
|
|
|
// 设置本地sdp信息
|
|
|
|
|
this.peerConnection.setLocalDescription(answer);
|
|
|
|
|
// 接受呼叫请求
|
|
|
|
|
resolve(answer)
|
|
|
|
|
}).catch((e) => {
|
|
|
|
|
reject(e)
|
|
|
|
|
})
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.setRemoteDescription = function(offer) {
|
|
|
|
|
// 设置对方的sdp信息
|
|
|
|
|
this.peerConnection.setRemoteDescription(new RTCSessionDescription(offer));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.addIceCandidate = function(candidate) {
|
|
|
|
|
// 添加对方的候选人信息
|
|
|
|
|
this.peerConnection.addIceCandidate(new RTCIceCandidate(candidate));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ImWebRtc.prototype.close = function(uid) {
|
|
|
|
|
// 关闭RTC连接
|
|
|
|
|
if (this.peerConnection) {
|
|
|
|
|
this.peerConnection.close();
|
|
|
|
|
this.peerConnection.onicecandidate = null;
|
|
|
|
|
this.peerConnection.onaddstream = null;
|
|
|
|
|
this.peerConnection = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default ImWebRtc;
|