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); } }