224 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			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);
 | |
|   }
 | |
| }
 |