CNCEC_SUBQHSE_WUHUAN/SGGL/FineUIPro.Web/res/js/mixrtc.min.js

224 lines
5.5 KiB
JavaScript

class WebRTC {
constructor(config) {
this.ChangeStatus = "";
this.options = {
mediaConstraints: { audio: true, video: false },
pcConfig: {
iceServers: [
{ urls: ["stun:stun.mixcom.cn:3478"] },
{
urls: "turn:stun.mixcom.cn:3478",
username: "mixcom",
credential: "MikangyunST",
},
],
},
};
this.audioConf = {
audio: "",
ringout: "",
ringin: "",
hangup: "",
};
if (config == undefined) {
console.log("[RTC] : RTC is missing configuration information");
return false;
}
if (
config.audioConfigs == undefined ||
typeof config.audioConfigs.audio != "object"
) {
console.log("[RTC] : audio is not configured");
} else {
this.audioConf = { ...this.audioConf, ...config.audioConfigs };
}
if (config.changeStatus) {
this.ChangeStatus = config.changeStatus;
}
if (config.options !== undefined) {
this.options = config.options;
}
if (config.debug !== undefined && config.debug === true) {
JsSIP.debug.enable("JsSIP:*");
}
}
// 初始化录音播放
audioInit() {
// 默认是循环播放
const audio = this.audioConf.audio;
audio.srcObject = null;
audio.currentTime = 0;
audio.loop = false;
audio.src = "";
}
// 播放录音
audioPlay(src) {
const audio = this.audioConf.audio;
this.audioInit();
if (src == "ringin" || src == "ringout") {
audio.loop = true;
}
audio.src = this.audioConf[src];
audio.load();
audio.play();
}
// 连接WebSocket
WebSocket(url) {
this.socket = new JsSIP.WebSocketInterface(url);
}
// 注册分机
register(config) {
console.log("注册分机");
this.configuration = {
sockets: [this.socket],
uri: "sip:" + config.extension + "@" + config.sipserver,
password: config.password,
contact_uri: "sip:" + config.extension + "@" + config.sipserver,
};
this.ua = new JsSIP.UA(this.configuration);
// Websocket连接成功
this.ua.on("connected", function () {
console.log("websocket连接成功");
});
// Websocket连接断开
this.ua.on("disconnected", function () {
console.log("websocket连接断开");
// 重连
if (this.ua) {
this.ua.start();
}
});
var that = this;
// 呼入或者呼出时触发的事件
this.ua.on("newRTCSession", function (e) {
const { session, originator } = e;
that.session = session;
switch (originator) {
// out
case "local":
// 此处为呼出前的操作
that.ChangeStatus("CallOut");
break;
case "remote":
that.audioPlay("ringin");
that.ChangeStatus("CallIn", session.remote_identity.display_name);
// 此处为呼入接通前的操作
break;
default:
}
// 连接中
session.on("connecting", () => {
that.ChangeStatus("Connecting");
});
// 连接已接受
session.on("accepted", () => {
that.ChangeStatus("Connected");
});
// 通话中
session.on("confirmed", () => {
that.ChangeStatus("Calling");
const stream = new MediaStream();
const receivers = session.connection.getReceivers();
if (receivers) {
receivers.forEach((receiver) => stream.addTrack(receiver.track));
}
audio.srcObject = stream;
// 最后都要播放
audio.play();
});
// 播放回铃音
session.on("progress", () => {
// 判断呼出 播放回铃
if (originator === "local") {
that.audioInit();
const stream = new MediaStream();
const receivers = session.connection.getReceivers();
if (receivers) {
receivers.forEach((receiver) => stream.addTrack(receiver.track));
}
audio.srcObject = stream;
audio.play();
}
});
// 结束
session.on("ended", () => {
console.log("挂断了");
that.ChangeStatus("Ended", "");
that.audioPlay("hangup");
});
// 失败
session.on("failed", (e) => {
console.log("失败了");
that.ChangeStatus("Failed", "");
that.audioPlay("hangup");
});
// ICE 交互连通建立事件 加快通讯速度
session.on('icecandidate', function (event) {
if (
event.candidate.type === 'srflx' &&
event.candidate.relatedAddress !== null &&
event.candidate.relatedPort !== null
) {
event.ready();
}
});
});
this.ua.on("registered", () => {
console.log("[SIP Phone] : Registered (ON LINE)");
});
this.ua.on("unregistered", () => {
console.log("[SIP Phone] : Unregistered (OFF LINE)");
});
this.ua.on("registrationFailed", (e) => {
console.log("[SIP Phone] : Registration Failed (OFF LINE)");
});
this.ua.start();
}
// 注销
unregister() {
this.ua.unregister(this.options);
this.ua.stop();
this.ua = null;
console.log("[SIP Phone] : unregistered")
}
// 呼出
call(phone) {
this.ua.call(phone, this.options);
this.audioPlay("ringout");
}
// 挂断
hangup() {
this.ua.terminateSessions();
}
// 接通
answer() {
console.log(this.session)
this.session.answer(this.options);
}
// 拒接
reject() {
this.ua.terminateSessions();
// this.seesion.terminate(this.options);
}
}