mirror of
git://soft.sys114.com/mainsail
synced 2026-02-04 14:50:36 +09:00
2 lines
6.7 KiB
JavaScript
2 lines
6.7 KiB
JavaScript
import{m as g,B as T,H as w,J as _,P as u,R as C,W as m,C as v,n as y}from"./index-Bku7SJna.js";import{m as R,n as S,r as b}from"./vuetify-Ce4WN_Dg.js";import"./overlayscrollbars-CiKU261J.js";import"./echarts-DzoUeqWp.js";var x=Object.defineProperty,P=Object.getOwnPropertyDescriptor,l=(d,t,e,s)=>{for(var i=s>1?void 0:s?P(t,e):t,a=d.length-1,n;a>=0;a--)(n=d[a])&&(i=(s?n(t,e,i):n(i))||i);return s&&i&&x(t,e,i),i};let c=class extends g(T,w){constructor(){super(...arguments),this.capitalize=_,this.pc=null,this.restartTimeout=null,this.status="connecting",this.eTag=null,this.sessionUuid=null,this.queuedCandidates=[],this.offerData={iceUfrag:"",icePwd:"",medias:[]},this.RESTART_PAUSE=2e3,this.unquoteCredential=t=>JSON.parse('"'.concat(t,'"'))}beforeDestroy(){this.terminate(),this.restartTimeout&&clearTimeout(this.restartTimeout)}get webcamStyle(){var t,e,s;return{transform:this.generateTransform((t=this.camSettings.flip_horizontal)!=null?t:!1,(e=this.camSettings.flip_vertical)!=null?e:!1,(s=this.camSettings.rotation)!=null?s:0)}}get url(){let t=this.camSettings.stream_url;return t.endsWith("/")||(t+="/"),t+="whep",this.convertUrl(t,this.printerUrl)}changedUrl(){this.terminate(),this.start()}get expanded(){var t;return this.page!=="dashboard"?!0:(t=this.$store.getters["gui/getPanelExpand"]("webcam-panel",this.viewport))!=null?t:!1}expandChanged(t){if(!t){this.terminate();return}this.start()}log(t,e){if(e){window.console.log("[WebRTC mediamtx] ".concat(t),e);return}window.console.log("[WebRTC mediamtx] ".concat(t))}linkToIceServers(t){return t===null?[]:t.split(", ").map(e=>{const s=e.match(/^<(.+?)>; rel="ice-server"(; username="(.*?)"; credential="(.*?)"; credential-type="password")?/i);if(s===null)return{urls:""};const i={urls:[s[1]]};return s.length>3&&(i.username=this.unquoteCredential(s[3]),i.credential=this.unquoteCredential(s[4]),i.credentialType="password"),i})}parseOffer(t){const e={iceUfrag:"",icePwd:"",medias:[]};for(const s of t.split("\r\n"))s.startsWith("m=")?e.medias.push(s.slice(2)):e.iceUfrag===""&&s.startsWith("a=ice-ufrag:")?e.iceUfrag=s.slice(12):e.icePwd===""&&s.startsWith("a=ice-pwd:")&&(e.icePwd=s.slice(10));return e}generateSdpFragment(t,e){const s={};for(const n of e){const o=n.sdpMLineIndex;o!==null&&(o in s||(s[o]=[]),s[o].push(n))}let i="a=ice-ufrag:"+t.iceUfrag+"\r\na=ice-pwd:"+t.icePwd+"\r\n",a=0;for(const n of t.medias){if(s[a]!==void 0){i+="m="+n+"\r\na=mid:"+a+"\r\n";for(const o of s[a])i+="a="+o.candidate+"\r\n"}a++}return i}async start(){if(this.restartTimeout!==null&&(clearTimeout(this.restartTimeout),this.restartTimeout=null),this.url===null){this.log("invalid url"),this.scheduleRestart();return}this.log("requesting ICE servers from "+this.url);try{const t=await fetch(this.url,{method:"OPTIONS"});if(t.status!==204){this.log("error: Received bad status code:",t.status),this.scheduleRestart();return}await this.onIceServers(t)}catch{this.log("error: Cannot connect to backend"),this.scheduleRestart()}}async onIceServers(t){const e=this.linkToIceServers(t.headers.get("Link"));this.log("ice servers:",e),this.pc=new RTCPeerConnection({iceServers:e,sdpSemantics:"unified-plan"});const s="sendrecv";this.pc.addTransceiver("video",{direction:s}),this.pc.addTransceiver("audio",{direction:s}),this.pc.onicecandidate=a=>this.onLocalCandidate(a),this.pc.oniceconnectionstatechange=()=>this.onConnectionState(),this.pc.ontrack=a=>{this.log("new track:",a.track.kind),this.video.srcObject=a.streams[0]};const i=await this.pc.createOffer();await this.onLocalOffer(i)}async onLocalOffer(t){var e,s,i,a,n,o,p;try{const r=await fetch((e=this.url)!=null?e:"",{method:"POST",headers:{"Content-Type":"application/sdp"},body:t.sdp});if(r.status!==201){this.log("error: Received bad status code:",r.status),this.scheduleRestart();return}this.offerData=this.parseOffer((s=t.sdp)!=null?s:""),(i=this.pc)==null||i.setLocalDescription(t),this.eTag=r.headers.get("ETag");const h=(a=r.headers.get("Location"))!=null?a:"";this.sessionUuid=(n=h==null?void 0:h.substring(h.lastIndexOf("/")+1))!=null?n:null,r.headers.has("E-Tag")&&(this.eTag=r.headers.get("E-Tag"));const f=await r.text();this.onRemoteAnswer(new RTCSessionDescription({type:"answer",sdp:f}))}catch(r){this.log((p=(o=r==null?void 0:r.message)!=null?o:r)!=null?p:"unknown error"),this.scheduleRestart()}}onRemoteAnswer(t){var e;if(this.restartTimeout===null){try{(e=this.pc)==null||e.setRemoteDescription(t)}catch(s){this.log(s),this.scheduleRestart()}this.queuedCandidates.length!==0&&(this.sendLocalCandidates(this.queuedCandidates),this.queuedCandidates=[])}}onConnectionState(){var t,e;if(this.restartTimeout===null)switch(this.status=(e=(t=this.pc)==null?void 0:t.iceConnectionState)!=null?e:"",this.log("peer connection state:",this.status),this.status){case"disconnected":this.scheduleRestart()}}onLocalCandidate(t){if(this.restartTimeout===null&&t.candidate!==null){if(this.eTag===""){this.queuedCandidates.push(t.candidate);return}this.sendLocalCandidates([t.candidate])}}async sendLocalCandidates(t){var s;if(this.sessionUuid===null){this.log("Session-UUID is null"),this.scheduleRestart();return}const e=((s=this.url)!=null?s:"")+"/"+this.sessionUuid;try{const i=await fetch(e,{method:"PATCH",headers:{"Content-Type":"application/trickle-ice-sdpfrag","If-Match":this.eTag},body:this.generateSdpFragment(this.offerData,t)});if(i.status===204)return;if(i.status===404){this.log("stream not found"),this.scheduleRestart();return}this.log("bad status code ".concat(i.status)),this.scheduleRestart()}catch(i){this.log(i),this.scheduleRestart()}}terminate(){this.log("terminating"),this.pc!==null&&(this.pc.close(),this.pc=null)}scheduleRestart(){this.restartTimeout===null&&(this.terminate(),this.restartTimeout=window.setTimeout(()=>{this.log("scheduling restart"),this.restartTimeout=null,this.start()},this.RESTART_PAUSE),this.eTag="",this.queuedCandidates=[])}};l([u({required:!0})],c.prototype,"camSettings",2);l([u({default:null})],c.prototype,"printerUrl",2);l([u({type:String,default:null})],c.prototype,"page",2);l([C()],c.prototype,"video",2);l([m("url")],c.prototype,"changedUrl",1);l([m("expanded",{immediate:!0})],c.prototype,"expandChanged",1);c=l([v],c);var U=function(){var t=this,e=t._self._c;return t._self._setupProxy,e("div",[e("video",{directives:[{name:"show",rawName:"v-show",value:t.status==="connected",expression:"status === 'connected'"}],ref:"video",staticClass:"webcamImage",style:t.webcamStyle,attrs:{autoplay:"",playsinline:"",muted:""},domProps:{muted:!0}}),t.status!=="connected"?e(R,[e(S,{staticClass:"_webcam_webrtc_output text-center d-flex flex-column justify-center align-center"},[t.status==="connecting"?e(b,{staticClass:"mb-3",attrs:{indeterminate:"",color:"primary"}}):t._e(),e("span",{staticClass:"mt-3"},[t._v(t._s(t.capitalize(t.status)))])],1)],1):t._e()],1)},O=[],W=y(c,U,O,!1,null,"7234d392");const D=W.exports;export{D as default};
|