streamlit-webrtc 0.47.1__py3-none-any.whl → 0.47.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- streamlit_webrtc/frontend/build/asset-manifest.json +3 -10
- streamlit_webrtc/frontend/build/index.html +1 -1
- streamlit_webrtc/frontend/build/static/js/main.6951f096.js +3 -0
- streamlit_webrtc/frontend/build/static/js/{2.2a96fe85.chunk.js.LICENSE.txt → main.6951f096.js.LICENSE.txt} +0 -17
- streamlit_webrtc/frontend/build/static/js/main.6951f096.js.map +1 -0
- streamlit_webrtc/process.py +1 -1
- {streamlit_webrtc-0.47.1.dist-info → streamlit_webrtc-0.47.6.dist-info}/METADATA +2 -1
- {streamlit_webrtc-0.47.1.dist-info → streamlit_webrtc-0.47.6.dist-info}/RECORD +10 -14
- {streamlit_webrtc-0.47.1.dist-info → streamlit_webrtc-0.47.6.dist-info}/WHEEL +1 -1
- streamlit_webrtc/frontend/build/static/js/2.2a96fe85.chunk.js +0 -3
- streamlit_webrtc/frontend/build/static/js/2.2a96fe85.chunk.js.map +0 -1
- streamlit_webrtc/frontend/build/static/js/main.5825e798.chunk.js +0 -2
- streamlit_webrtc/frontend/build/static/js/main.5825e798.chunk.js.map +0 -1
- streamlit_webrtc/frontend/build/static/js/runtime-main.b6bde46b.js +0 -2
- streamlit_webrtc/frontend/build/static/js/runtime-main.b6bde46b.js.map +0 -1
- {streamlit_webrtc-0.47.1.dist-info → streamlit_webrtc-0.47.6.dist-info}/LICENSE +0 -0
@@ -1,2 +0,0 @@
|
|
1
|
-
(this.webpackJsonpstreamlit_webrtc=this.webpackJsonpstreamlit_webrtc||[]).push([[0],{99:function(e,t,n){"use strict";n.r(t);var i=n(0),r=n.n(i),a=n(54),o=n.n(a),c=n(31),d=n(77),s=n(144),u=n(72),l=n.n(u),v=n(2),f=function(e){var t=Object(c.useRenderData)().theme,n=JSON.stringify(t),i=r.a.useMemo((function(){var e=JSON.parse(n);if(null!=e){var t=l.a.scale([e.textColor,e.backgroundColor]).mode("lab");return Object(d.a)({palette:{primary:{main:e.primaryColor},background:{default:e.backgroundColor,paper:e.secondaryBackgroundColor},text:{primary:e.textColor,secondary:t(.1).hex(),disabled:t(.5).hex()}},typography:{fontFamily:e.font}})}}),[n]);return null==i?Object(v.jsx)(v.Fragment,{children:e.children}):Object(v.jsx)(s.a,{theme:i,children:e.children})},b=n(138),j=r.a.createContext(void 0),O=function(e){var t=Object(i.useContext)(j);return null==t?null:t[e]},p=function(e){var t=Object(c.useRenderData)().args.translations||{},n=t.start,r=t.stop,a=t.select_device,o=t.device_ask_permission,d=t.device_not_available,s=t.device_access_denied,u=t.media_api_not_available,l=Object(i.useMemo)((function(){return{start:n,stop:r,select_device:a,device_ask_permission:o,device_not_available:d,device_access_denied:s,media_api_not_available:u}}),[n,r,a,o,d,s,u]);return Object(v.jsx)(j.Provider,{value:l,children:e.children})},m=r.a.memo(p),h=n(8),g=n(145),I=n(141),S=n(9),E=n(35),D=n(143),A=n(132),x=n(1),y=n.n(x),R=n(6),C=n(25),T=n(140),_=n(142),w=n(148),P=n(98),N=n(131),L=function(e){var t=Object(P.a)(),n=Object(N.a)(t.breakpoints.down("sm"));return Object(i.useEffect)((function(){C.Streamlit.setFrameHeight()}),[n]),Object(v.jsx)(A.a,{direction:n?"column":"row",spacing:2,children:e.children})},k=n(5),V=n(11),G=Object(V.a)(g.a)((function(e){var t,n=e.theme;return t={position:"relative"},Object(k.a)(t,n.breakpoints.down("sm"),{width:"100%"}),Object(k.a)(t,"width",n.spacing(24)),Object(k.a)(t,"height",n.spacing(16)),Object(k.a)(t,"maxHeight",n.spacing(16)),Object(k.a)(t,"display","flex"),Object(k.a)(t,"justifyContent","center"),Object(k.a)(t,"alignItems","center"),t})),M=n(146),F=Object(V.a)(M.a)((function(e){return{display:"flex",justifyContent:"center",alignItems:"center",width:"100%",height:"100%",padding:e.theme.spacing(2),boxSizing:"border-box"}})),U=function(){return Object(v.jsx)(F,{children:O("media_api_not_available")||"Media API not available"})},Y=function(){return Object(v.jsx)(F,{children:O("device_ask_permission")||"Please allow the app to use your media devices"})},H=function(e){return Object(v.jsxs)(F,{children:[O("device_access_denied")||"Access denied"," (",e.error.message,")"]})},W=function(e){return Object(v.jsxs)(F,{children:[O("device_not_available")||"Device not available"," (",e.error.message,")"]})},J=n(73),B=n.n(J),K=Object(V.a)(M.a)({display:"flex",justifyContent:"center",alignItems:"center",width:"100%",height:"100%"}),z=function(){return Object(v.jsx)(K,{children:Object(v.jsx)(B.a,{fontSize:"large"})})},$=r.a.memo(z),q=Object(V.a)(g.a,{shouldForwardProp:function(e){return"$transparent"!==e}})((function(e){var t=e.theme;return{margin:0,padding:0,position:"relative","&:before":{position:"absolute",content:'""',width:"100%",height:"100%",opacity:e.$transparent?0:1,backgroundColor:t.palette.background.default,transition:"opacity 0.3s"}}})),Q=function(e){var t=Object(i.useState)(!1),n=Object(h.a)(t,2),r=n[0],a=n[1];return Object(i.useEffect)((function(){var t=setTimeout((function(){a(!0)}),e.time);return function(){return clearTimeout(t)}}),[e.time]),Object(v.jsx)(q,{$transparent:r,children:e.children})},X=Object(V.a)("video")({maxWidth:"100%",maxHeight:"100%"});function Z(e){e.getVideoTracks().forEach((function(e){return e.stop()})),e.getAudioTracks().forEach((function(e){return e.stop()}))}var ee=function(e){var t=Object(i.useRef)(null);return Object(i.useEffect)((function(){if(null!=e.deviceId){var n=null,i=!1;return navigator.mediaDevices.getUserMedia({video:{deviceId:e.deviceId},audio:!1}).then((function(e){n=e,i?Z(n):t.current&&(t.current.srcObject=n)})),function(){i=!0,n&&Z(n)}}}),[e.deviceId]),Object(v.jsx)(X,{ref:t,autoPlay:!0,muted:!0})},te=r.a.memo(ee);function ne(e,t){var n=e.map((function(e){return e.deviceId}));return t&&n.includes(t)?t:n.length>0?n[0]:void 0}var ie=function(e,t){switch(t.type){case"SET_UNAVAILABLE":return{unavailable:!0,videoInputs:[],audioInputs:[],audioOutputs:[],selectedVideoInputDeviceId:void 0,selectedAudioInputDeviceId:void 0};case"UPDATE_DEVICES":var n=t.devices,i=n.filter((function(e){return"videoinput"===e.kind})),r=n.filter((function(e){return"audioinput"===e.kind})),a=n.filter((function(e){return"audiooutput"===e.kind})),o=ne(i,e.selectedVideoInputDeviceId),c=ne(r,e.selectedAudioInputDeviceId);return Object(S.a)(Object(S.a)({},e),{},{videoInputs:i,audioInputs:r,audioOutputs:a,selectedVideoInputDeviceId:o,selectedAudioInputDeviceId:c});case"UPDATE_SELECTED_DEVICE_ID":return Object(S.a)(Object(S.a)({},e),t.payload)}},re=function(e){var t=e.video,n=e.audio,r=e.defaultVideoDeviceId,a=e.defaultAudioDeviceId,o=e.onSelect,c=Object(i.useState)("WAITING"),d=Object(h.a)(c,2),s=d[0],u=d[1],l=Object(i.useReducer)(ie,{unavailable:!1,videoInputs:[],audioInputs:[],audioOutputs:[],selectedVideoInputDeviceId:r,selectedAudioInputDeviceId:a}),f=Object(h.a)(l,2),b=f[0],j=b.unavailable,O=b.videoInputs,p=b.selectedVideoInputDeviceId,m=b.audioInputs,g=b.selectedAudioInputDeviceId,S=f[1],E=Object(i.useCallback)((function(){var e,t;if("function"===typeof(null===(e=navigator)||void 0===e||null===(t=e.mediaDevices)||void 0===t?void 0:t.enumerateDevices))return navigator.mediaDevices.enumerateDevices().then((function(e){S({type:"UPDATE_DEVICES",devices:e})}));S({type:"SET_UNAVAILABLE"})}),[]),D=Object(i.useRef)({video:r,audio:a});D.current={video:r,audio:a},Object(i.useEffect)((function(){var e,i;if("function"===typeof(null===(e=navigator)||void 0===e||null===(i=e.mediaDevices)||void 0===i?void 0:i.getUserMedia)){u("WAITING");var r=D.current,a=r.video,o=r.audio;navigator.mediaDevices.getUserMedia({video:t&&a?{deviceId:a}:t,audio:n&&o?{deviceId:o}:n}).then(function(){var e=Object(R.a)(y.a.mark((function e(t){return y.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return Z(t),e.next=3,E();case 3:u("ALLOWED");case 4:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()).catch((function(e){u(e)}))}else S({type:"SET_UNAVAILABLE"})}),[t,n,E]),Object(i.useEffect)((function(){var e=function(){return E()};return navigator.mediaDevices.ondevicechange=e,function(){navigator.mediaDevices.ondevicechange===e&&(navigator.mediaDevices.ondevicechange=null)}}),[E]);var x=Object(i.useCallback)((function(e){S({type:"UPDATE_SELECTED_DEVICE_ID",payload:{selectedVideoInputDeviceId:e.target.value}})}),[]),P=Object(i.useCallback)((function(e){S({type:"UPDATE_SELECTED_DEVICE_ID",payload:{selectedAudioInputDeviceId:e.target.value}})}),[]);if(Object(i.useEffect)((function(){var e=t?O.find((function(e){return e.deviceId===p})):null,i=n?m.find((function(e){return e.deviceId===g})):null;o({video:null===e||void 0===e?void 0:e.deviceId,audio:null===i||void 0===i?void 0:i.deviceId})}),[t,n,o,O,m,p,g]),Object(i.useEffect)((function(){setTimeout((function(){return C.Streamlit.setFrameHeight()}))})),j)return Object(v.jsx)(U,{});if("WAITING"===s)return Object(v.jsx)(Q,{time:1e3,children:Object(v.jsx)(Y,{})});if(s instanceof Error){var N=s;return N instanceof DOMException&&("NotReadableError"===N.name||"NotFoundError"===N.name)?Object(v.jsx)(W,{error:N}):N instanceof DOMException&&"NotAllowedError"===N.name?Object(v.jsx)(H,{error:N}):Object(v.jsx)(F,{children:Object(v.jsxs)(I.a,{severity:"error",children:[N.name,": ",N.message]})})}return Object(v.jsxs)(L,{children:[Object(v.jsx)(G,{children:t&&p?Object(v.jsx)(te,{deviceId:p}):Object(v.jsx)($,{})}),Object(v.jsxs)(A.a,{spacing:2,justifyContent:"center",children:[t&&p&&Object(v.jsxs)(w.a,{fullWidth:!0,children:[Object(v.jsx)(_.a,{htmlFor:"device-select-video-input",children:"Video Input"}),Object(v.jsx)(T.a,{inputProps:{name:"video-input",id:"device-select-video-input"},value:p,onChange:x,children:O.map((function(e){return Object(v.jsx)("option",{value:e.deviceId,children:e.label},e.deviceId)}))})]}),n&&g&&Object(v.jsxs)(w.a,{fullWidth:!0,children:[Object(v.jsx)(_.a,{htmlFor:"device-select-audio-input",children:"Audio Input"}),Object(v.jsx)(T.a,{inputProps:{name:"audio-input",id:"device-select-audio-input"},value:g,onChange:P,children:m.map((function(e){return Object(v.jsx)("option",{value:e.deviceId,children:e.label},e.deviceId)}))})]})]})]})},ae=function(e){var t=e.onClose,n=Object(E.a)(e,["onClose"]);return Object(v.jsxs)(A.a,{spacing:2,children:[Object(v.jsx)(re,Object(S.a)({},n)),Object(v.jsx)(g.a,{children:Object(v.jsx)(D.a,{variant:"contained",color:"primary",onClick:t,children:"Done"})})]})},oe=function(e){Object(i.useEffect)((function(){C.Streamlit.setFrameHeight()}));var t=e.stream.getVideoTracks().length>0,n=Object(i.useCallback)((function(t){t&&(t.srcObject=e.stream)}),[e.stream]),r=Object(i.useCallback)((function(){return C.Streamlit.setFrameHeight()}),[]);if(t){var a,o,c,d,s,u,l,f,b,j,O,p,m,h,g,I,E={hidden:null===(a=e.userDefinedVideoAttrs)||void 0===a?void 0:a.hidden,style:null===(o=e.userDefinedVideoAttrs)||void 0===o?void 0:o.style,autoPlay:null===(c=e.userDefinedVideoAttrs)||void 0===c?void 0:c.autoPlay,controls:null===(d=e.userDefinedVideoAttrs)||void 0===d?void 0:d.controls,controlsList:null===(s=e.userDefinedVideoAttrs)||void 0===s?void 0:s.controlsList,crossOrigin:null===(u=e.userDefinedVideoAttrs)||void 0===u?void 0:u.crossOrigin,loop:null===(l=e.userDefinedVideoAttrs)||void 0===l?void 0:l.loop,mediaGroup:null===(f=e.userDefinedVideoAttrs)||void 0===f?void 0:f.mediaGroup,muted:null===(b=e.userDefinedVideoAttrs)||void 0===b?void 0:b.muted,playsInline:null===(j=e.userDefinedVideoAttrs)||void 0===j?void 0:j.playsInline,preload:null===(O=e.userDefinedVideoAttrs)||void 0===O?void 0:O.preload,height:null===(p=e.userDefinedVideoAttrs)||void 0===p?void 0:p.height,poster:null===(m=e.userDefinedVideoAttrs)||void 0===m?void 0:m.poster,width:null===(h=e.userDefinedVideoAttrs)||void 0===h?void 0:h.width,disablePictureInPicture:null===(g=e.userDefinedVideoAttrs)||void 0===g?void 0:g.disablePictureInPicture,disableRemotePlayback:null===(I=e.userDefinedVideoAttrs)||void 0===I?void 0:I.disableRemotePlayback};return Object(v.jsx)("video",Object(S.a)(Object(S.a)({},E),{},{ref:n,onCanPlay:r}))}var D,A,x,y,R,T,_,w,P,N,L,k={hidden:null===(D=e.userDefinedAudioAttrs)||void 0===D?void 0:D.hidden,style:null===(A=e.userDefinedAudioAttrs)||void 0===A?void 0:A.style,autoPlay:null===(x=e.userDefinedAudioAttrs)||void 0===x?void 0:x.autoPlay,controls:null===(y=e.userDefinedAudioAttrs)||void 0===y?void 0:y.controls,controlsList:null===(R=e.userDefinedAudioAttrs)||void 0===R?void 0:R.controlsList,crossOrigin:null===(T=e.userDefinedAudioAttrs)||void 0===T?void 0:T.crossOrigin,loop:null===(_=e.userDefinedAudioAttrs)||void 0===_?void 0:_.loop,mediaGroup:null===(w=e.userDefinedAudioAttrs)||void 0===w?void 0:w.mediaGroup,muted:null===(P=e.userDefinedAudioAttrs)||void 0===P?void 0:P.muted,playsInline:null===(N=e.userDefinedAudioAttrs)||void 0===N?void 0:N.playsInline,preload:null===(L=e.userDefinedAudioAttrs)||void 0===L?void 0:L.preload};return Object(v.jsx)("audio",Object(S.a)({ref:n},k))},ce=r.a.memo(oe),de=n(147),se=n(76),ue=n.n(se),le=Object(V.a)(M.a)((function(e){return{padding:e.theme.spacing(4),display:"flex",justifyContent:"center",alignItems:"center",width:"100%"}})),ve=function(e){return Object(i.useEffect)((function(){C.Streamlit.setFrameHeight()})),Object(v.jsx)(le,{elevation:0,children:e.loading?Object(v.jsx)(de.a,{}):Object(v.jsx)(ue.a,{fontSize:"large"})})},fe=r.a.memo(ve),be=n(16);function je(e,t,n){var i=e||{};return t&&(!0===i.video?i.video={deviceId:t}:"object"!==typeof i.video&&null!=i.video||(i.video=Object(S.a)(Object(S.a)({},i.video),{},{deviceId:t}))),n&&(!0===i.audio?i.audio={deviceId:n}:"object"!==typeof i.audio&&null!=i.audio||(i.audio=Object(S.a)(Object(S.a)({},i.audio),{},{deviceId:n}))),i}var Oe={webRtcState:"STOPPED",sdpOffer:null,signallingTimedOut:!1,stream:null,error:null},pe=function(e){return function(t,n){var i=function(e,t){switch(t.type){case"SIGNALLING_START":return Object(S.a)(Object(S.a)({},e),{},{webRtcState:"SIGNALLING",stream:null,error:null,signallingTimedOut:!1});case"SIGNALLING_TIMEOUT":return Object(S.a)(Object(S.a)({},e),{},{signallingTimedOut:!0});case"SET_STREAM":return Object(S.a)(Object(S.a)({},e),{},{stream:t.stream});case"SET_OFFER":return Object(S.a)(Object(S.a)({},e),{},{sdpOffer:t.offer});case"STOPPING":return Object(S.a)(Object(S.a)({},e),{},{webRtcState:"STOPPING",sdpOffer:null});case"STOPPED":return Object(S.a)(Object(S.a)({},e),{},{webRtcState:"STOPPED",sdpOffer:null,stream:null});case"START_PLAYING":return Object(S.a)(Object(S.a)({},e),{},{webRtcState:"PLAYING",sdpOffer:null});case"PROCESS_ANSWER_ERROR":return Object(S.a)(Object(S.a)({},e),{},{error:t.error});case"ERROR":return Object(S.a)(Object(S.a)({},e),{},{webRtcState:"STOPPED",sdpOffer:null,error:t.error})}}(t,n),r="PLAYING"===i.webRtcState,a=r!==("PLAYING"===t.webRtcState),o=i.sdpOffer,c=t.sdpOffer;return(a||o!==c)&&(c&&console.log("Send SDP offer",c),e({playing:r,sdpOffer:o?o.toJSON():""})),i}},me=function(e){return"RECVONLY"===e||"SENDONLY"===e||"SENDRECV"===e},he=function(e){return e.createOffer().then((function(t){return console.log("Created offer:",t),e.setLocalDescription(t)})).then((function(){return console.log("Wait for ICE gethering..."),new Promise((function(t){if("complete"===e.iceGatheringState)t();else{e.addEventListener("icegatheringstatechange",(function n(){"complete"===e.iceGatheringState&&(e.removeEventListener("icegatheringstatechange",n),t())}))}}))})).then((function(){return e.localDescription})).catch((function(e){throw console.error(e),e}))};function ge(e){return C.Streamlit.setComponentValue(e)}var Ie=function(e){var t=e.translationKey,n=e.defaultText,i=Object(E.a)(e,["translationKey","defaultText"]);return Object(v.jsx)(D.a,Object(S.a)(Object(S.a)({},i),{},{children:O(t)||n}))},Se=(n(101),function(e){var t,n=Object(i.useState)({video:void 0,audio:void 0}),r=Object(h.a)(n,2),a=r[0],o=r[1],c=function(e,t,n,r,a){Object(i.useEffect)((function(){return r({playing:!1,sdpOffer:""})}),[]);var o=Object(i.useRef)(),c=Object(i.useRef)(),d=Object(i.useMemo)((function(){return pe(r)}),[r]),s=Object(i.useReducer)(d,Oe),u=Object(h.a)(s,2),l=u[0],v=u[1],f=Object(i.useCallback)((function(){var e=function(){var e=Object(R.a)(y.a.mark((function e(){var t;return y.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("STOPPING"!==l.webRtcState){e.next=2;break}return e.abrupt("return");case 2:if(t=c.current,c.current=void 0,v({type:"STOPPING"}),null!=t){e.next=7;break}return e.abrupt("return");case 7:return t.getTransceivers&&t.getTransceivers().forEach((function(e){e.stop&&e.stop()})),t.getSenders().forEach((function(e){var t;null===(t=e.track)||void 0===t||t.stop()})),e.abrupt("return",new Promise((function(e){setTimeout((function(){t.close(),e()}),500)})));case 10:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();e().catch((function(e){return v({type:"ERROR",error:e})})).finally((function(){v({type:"STOPPED"})}))}),[l.webRtcState]),b=Object(i.useRef)(f);b.current=f;var j=Object(i.useCallback)((function(){if("STOPPED"===l.webRtcState){var i=function(){var i=Object(R.a)(y.a.mark((function i(){var r,d,s,u,l,f,j,O;return y.a.wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(v({type:"SIGNALLING_START"}),o.current=setTimeout((function(){v({type:"SIGNALLING_TIMEOUT"})}),3e3),r=e.mode,d=e.rtcConfiguration||{},console.log("RTCConfiguration:",d),s=new RTCPeerConnection(d),"SENDRECV"!==r&&"RECVONLY"!==r||s.addEventListener("track",(function(e){var t=e.streams[0];v({type:"SET_STREAM",stream:t})})),"SENDRECV"!==r&&"SENDONLY"!==r){i.next=24;break}if(u=je(e.mediaStreamConstraints,t,n),console.log("MediaStreamConstraints:",u),!u.audio&&!u.video){i.next=21;break}if(null!=navigator.mediaDevices){i.next=13;break}throw new Error("navigator.mediaDevices is undefined. It seems the current document is not loaded securely.");case 13:if(null!=navigator.mediaDevices.getUserMedia){i.next=15;break}throw new Error("getUserMedia is not implemented in this browser");case 15:return l={},i.next=18,navigator.mediaDevices.getUserMedia(u);case 18:(f=i.sent).getTracks().forEach((function(e){s.addTrack(e,f);var t=e.kind;if("video"===t||"audio"===t){var n=e.getSettings().deviceId;null!=n&&(l[t]=n)}})),Object.keys(l).length>0&&a(l);case 21:if("SENDONLY"===r){j=Object(be.a)(s.getTransceivers());try{for(j.s();!(O=j.n()).done;)O.value.direction="sendonly"}catch(p){j.e(p)}finally{j.f()}}i.next=25;break;case 24:"RECVONLY"===r&&(s.addTransceiver("video",{direction:"recvonly"}),s.addTransceiver("audio",{direction:"recvonly"}));case 25:return console.log("transceivers",s.getTransceivers()),s.addEventListener("iceconnectionstatechange",(function(){console.log("iceconnectionstatechange",s.iceConnectionState),"disconnected"!==s.iceConnectionState&&"failed"!==s.iceConnectionState&&"closed"!==s.iceConnectionState||b.current()})),c.current=s,i.next=30,he(s).then((function(e){if(null==e)throw new Error("Failed to create an offer SDP");v({type:"SET_OFFER",offer:e})}));case 30:case"end":return i.stop()}}),i)})));return function(){return i.apply(this,arguments)}}();i().catch((function(e){return v({type:"ERROR",error:e})}))}}),[n,t,e.mediaStreamConstraints,e.mode,e.rtcConfiguration,l.webRtcState,a]);return Object(i.useEffect)((function(){var t=c.current;if(null!=t){var n=e.sdpAnswerJson;if(null==t.remoteDescription&&n&&"SIGNALLING"===l.webRtcState){var i=JSON.parse(n);console.log("Receive answer sdpOffer",i),t.setRemoteDescription(i).then((function(){console.log("Remote description is set"),o.current&&clearTimeout(o.current),v({type:"START_PLAYING"})})).catch((function(e){v({type:"PROCESS_ANSWER_ERROR",error:e}),f()}))}}}),[e.sdpAnswerJson,l.webRtcState,f]),Object(i.useEffect)((function(){var t=e.desiredPlayingState;null!=t&&(!0===t&&"STOPPED"===l.webRtcState?j():!1!==t||"SIGNALLING"!==l.webRtcState&&"PLAYING"!==l.webRtcState||f())}),[e.desiredPlayingState,j,l.webRtcState,f]),{start:j,stop:f,state:l}}(e,a.video,a.audio,e.onComponentValueChange,o),d=c.state,s=c.start,u=c.stop,l=e.mode,f=e.disabled||"SIGNALLING"===d.webRtcState&&!d.signallingTimedOut||"STOPPING"===d.webRtcState||null!=e.desiredPlayingState,b=me(l)&&function(e){return"SENDRECV"===e||"RECVONLY"===e}(l),j=me(l)&&function(e){return"SENDRECV"===e||"SENDONLY"===e}(l),O={videoEnabled:!(t=e.mediaStreamConstraints)||!!t.video,audioEnabled:!t||!!t.audio},p=O.videoEnabled,m=O.audioEnabled,S=Object(i.useState)(!1),E=Object(h.a)(S,2),D=E[0],A=E[1],x=Object(i.useCallback)((function(){A(!0)}),[]),C=Object(i.useCallback)((function(){A(!1)}),[]);return D?Object(v.jsx)(ae,{video:p,audio:m,defaultVideoDeviceId:a.video,defaultAudioDeviceId:a.audio,onSelect:o,onClose:C}):Object(v.jsxs)(g.a,{children:[d.error&&Object(v.jsxs)(I.a,{severity:"error",children:[d.error.name,": ",d.error.message]}),Object(v.jsx)(g.a,{py:1,display:"flex",children:d.stream?Object(v.jsx)(ce,{stream:d.stream,userDefinedVideoAttrs:e.videoHtmlAttrs,userDefinedAudioAttrs:e.audioHtmlAttrs}):b&&Object(v.jsx)(fe,{loading:"SIGNALLING"===d.webRtcState})}),Object(v.jsxs)(g.a,{display:"flex",justifyContent:"space-between",children:["PLAYING"===d.webRtcState||"SIGNALLING"===d.webRtcState?Object(v.jsx)(Ie,{variant:"contained",onClick:u,disabled:f,translationKey:"stop",defaultText:"Stop"}):Object(v.jsx)(Ie,{variant:"contained",color:"primary",onClick:s,disabled:f,translationKey:"start",defaultText:"Start"}),j&&"STOPPED"===d.webRtcState&&Object(v.jsx)(Ie,{color:"inherit",onClick:x,translationKey:"select_device",defaultText:"Select Device"})]})]})}),Ee=function(){var e=Object(c.useRenderData)(),t=e.args.mode,n=e.args.desired_playing_state,i=e.args.sdp_answer_json,r=e.args.rtc_configuration,a=e.args.media_stream_constraints,o=e.args.video_html_attrs,d=e.args.audio_html_attrs;if(!me(t))throw new Error("Invalid mode ".concat(t));return Object(v.jsx)(Se,{disabled:e.disabled,mode:t,desiredPlayingState:n,sdpAnswerJson:i,rtcConfiguration:r,mediaStreamConstraints:a,videoHtmlAttrs:o,audioHtmlAttrs:d,onComponentValueChange:ge})};o.a.render(Object(v.jsx)(r.a.StrictMode,{children:Object(v.jsx)(c.StreamlitProvider,{children:Object(v.jsx)(m,{children:Object(v.jsxs)(f,{children:[Object(v.jsx)(b.a,{}),Object(v.jsx)(Ee,{})]})})})}),document.getElementById("root"))}},[[99,1,2]]]);
|
2
|
-
//# sourceMappingURL=main.5825e798.chunk.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["ThemeProvider.tsx","translation/TranslationProvider.tsx","DeviceSelect/components/DeviceSelectContainer.tsx","DeviceSelect/components/VideoPreviewContainer.tsx","DeviceSelect/components/messages/Message.tsx","DeviceSelect/components/messages/MediaApiNotAvailableMessage.tsx","DeviceSelect/components/messages/AskPermissionMessage.tsx","DeviceSelect/components/messages/AccessDeniedMessage.tsx","DeviceSelect/components/messages/DeviceNotAvailableMessage.tsx","DeviceSelect/components/VoidVideoPreview.tsx","DeviceSelect/components/Defer.tsx","DeviceSelect/components/VideoPreview.tsx","DeviceSelect/utils.ts","DeviceSelect/VideoPreview.tsx","DeviceSelect/DeviceSelect.tsx","DeviceSelect/DeviceSelectForm.tsx","MediaStreamPlayer.tsx","Placeholder.tsx","media-constraint.ts","webrtc/reducer.ts","webrtc/index.ts","component-value.ts","translation/components/TranslatedButton.tsx","WebRtcStreamer.tsx","index.tsx"],"names":["ThemeProvider","props","stTheme","useRenderData","theme","stThemeJson","JSON","stringify","muiTheme","React","useMemo","parse","textColorScale","chroma","scale","textColor","backgroundColor","mode","createTheme","palette","primary","main","primaryColor","background","default","paper","secondaryBackgroundColor","text","secondary","hex","disabled","typography","fontFamily","font","children","translationContext","createContext","undefined","useTranslation","key","contextValue","useContext","TranslationProvider","args","start","stop","select_device","device_ask_permission","device_not_available","device_access_denied","media_api_not_available","value","Provider","memo","DeviceSelectContainer","useTheme","isSmallViewport","useMediaQuery","breakpoints","down","useEffect","Streamlit","setFrameHeight","Stack","direction","spacing","VideoPreviewContainer","styled","Box","position","width","Message","Paper","display","justifyContent","alignItems","height","padding","boxSizing","MediaApiNotAvailableMessage","AskPermissionMessage","AccessDeniedMessage","error","message","DeviceNotAvailableMessage","StyledPaper","VoidVideoPreview","fontSize","OverlayBox","shouldForwardProp","prop","margin","content","opacity","$transparent","transition","Defer","useState","elapsed","setElapsed","timer","setTimeout","time","clearTimeout","VideoPreview","maxWidth","maxHeight","stopAllTracks","stream","getVideoTracks","forEach","track","getAudioTracks","videoRef","useRef","deviceId","unmounted","navigator","mediaDevices","getUserMedia","video","audio","then","_stream","current","srcObject","ref","autoPlay","muted","ensureValidSelection","devices","selectedDeviceId","deviceIds","map","d","includes","length","deviceSelectionReducer","state","action","type","unavailable","videoInputs","audioInputs","audioOutputs","selectedVideoInputDeviceId","selectedAudioInputDeviceId","filter","kind","payload","DeviceSelect","useVideo","useAudio","defaultVideoDeviceId","defaultAudioDeviceId","onSelect","permissionState","setPermissionState","useReducer","deviceSelectionDispatch","updateDeviceList","useCallback","enumerateDevices","defaultDeviceIdsRef","videoDeviceId","audioDeviceId","catch","err","handleDeviceChange","ondevicechange","handleVideoInputChange","e","target","handleAudioInputChange","videoInput","find","audioInput","Error","DOMException","name","Alert","severity","FormControl","fullWidth","InputLabel","htmlFor","NativeSelect","inputProps","id","onChange","device","label","DeviceSelectForm","onClose","deviceSelectProps","Button","variant","color","onClick","MediaStreamPlayer","hasVideo","refCallback","node","refreshFrameHeight","videoProps","hidden","userDefinedVideoAttrs","style","controls","controlsList","crossOrigin","loop","mediaGroup","playsInline","preload","poster","disablePictureInPicture","disableRemotePlayback","onCanPlay","audioProps","userDefinedAudioAttrs","Placeholder","elevation","loading","CircularProgress","compileMediaConstraints","src","constraints","initialState","webRtcState","sdpOffer","signallingTimedOut","connectReducer","onComponentValueChange","nextState","offer","reducer","nextPlaying","playingChanged","nextSdpOffer","prevSdpOffer","console","log","playing","toJSON","isWebRtcMode","val","setupOffer","pc","createOffer","setLocalDescription","Promise","resolve","iceGatheringState","addEventListener","checkState","removeEventListener","localDescription","setComponentValue","componentValue","TranslatedButton","translationKey","defaultText","WebRtcStreamerInner","constraintsFromPython","setDeviceIds","videoDeviceIdRequest","audioDeviceIdRequest","onDevicesOpened","signallingTimerRef","pcRef","dispatch","stopInner","a","getTransceivers","transceiver","getSenders","sender","close","finally","stopRef","startInner","config","rtcConfiguration","RTCPeerConnection","evt","streams","mediaStreamConstraints","openedDeviceIds","getTracks","addTrack","getSettings","Object","keys","addTransceiver","iceConnectionState","sdpAnswerJson","remoteDescription","sdpAnswer","setRemoteDescription","desiredPlayingState","useWebRtc","buttonDisabled","receivable","isReceivable","transmittable","isTransmittable","videoEnabled","audioEnabled","deviceSelectOpen","setDeviceSelectOpen","openDeviceSelect","closeDeviceSelect","py","videoHtmlAttrs","audioHtmlAttrs","WebRtcStreamer","renderData","rtc_configuration","media_stream_constraints","video_html_attrs","audio_html_attrs","ReactDOM","render","StrictMode","CssBaseline","document","getElementById"],"mappings":"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","file":"static/js/main.5825e798.chunk.js","sourcesContent":["import React from \"react\";\nimport { Theme } from \"streamlit-component-lib\";\nimport { useRenderData } from \"streamlit-component-lib-react-hooks\";\nimport {\n createTheme,\n ThemeProvider as MuiThemeProvider,\n} from \"@mui/material/styles\";\nimport chroma from \"chroma-js\";\n\ninterface StreamlitThemeProviderProps {}\nexport const ThemeProvider: React.VFC<\n React.PropsWithChildren<StreamlitThemeProviderProps>\n> = (props) => {\n const { theme: stTheme } = useRenderData();\n\n const stThemeJson = JSON.stringify(stTheme);\n const muiTheme = React.useMemo(() => {\n const stTheme: Theme = JSON.parse(stThemeJson);\n if (stTheme == null) {\n return undefined;\n }\n\n const textColorScale = chroma\n .scale([stTheme.textColor, stTheme.backgroundColor])\n .mode(\"lab\");\n\n return createTheme({\n palette: {\n primary: {\n main: stTheme.primaryColor,\n },\n background: {\n default: stTheme.backgroundColor,\n paper: stTheme.secondaryBackgroundColor,\n },\n text: {\n primary: stTheme.textColor,\n secondary: textColorScale(0.1).hex(),\n disabled: textColorScale(0.5).hex(),\n },\n },\n typography: {\n fontFamily: stTheme.font,\n },\n });\n }, [stThemeJson]);\n\n if (muiTheme == null) {\n return <>{props.children}</>;\n }\n\n return <MuiThemeProvider theme={muiTheme}>{props.children}</MuiThemeProvider>;\n};\n\nexport default ThemeProvider;\n","import React, { useMemo, useContext } from \"react\";\nimport { useRenderData } from \"streamlit-component-lib-react-hooks\";\nimport { Translations } from \"./types\";\n\nconst translationContext = React.createContext<Translations | undefined>(\n undefined\n);\n\nexport const useTranslation = (key: keyof Translations) => {\n const contextValue = useContext(translationContext);\n if (contextValue == null) {\n return null;\n }\n\n return contextValue[key];\n};\n\ninterface TranslationProviderProps {\n children: React.ReactNode;\n}\nconst TranslationProvider: React.VFC<TranslationProviderProps> = (props) => {\n const renderData = useRenderData();\n const {\n start,\n stop,\n select_device,\n device_ask_permission,\n device_not_available,\n device_access_denied,\n media_api_not_available,\n } = renderData.args[\"translations\"] || {};\n const value: Translations = useMemo(\n () => ({\n start,\n stop,\n select_device,\n device_ask_permission,\n device_not_available,\n device_access_denied,\n media_api_not_available,\n }),\n [\n start,\n stop,\n select_device,\n device_ask_permission,\n device_not_available,\n device_access_denied,\n media_api_not_available,\n ]\n );\n return (\n <translationContext.Provider value={value}>\n {props.children}\n </translationContext.Provider>\n );\n};\n\nexport default React.memo(TranslationProvider);\n","import { Streamlit } from \"streamlit-component-lib\";\nimport React, { useEffect } from \"react\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\n\ninterface DeviceSelectContainerProps {\n children: React.ReactNode;\n}\nconst DeviceSelectContainer: React.VFC<DeviceSelectContainerProps> = (\n props\n) => {\n const theme = useTheme();\n const isSmallViewport = useMediaQuery(theme.breakpoints.down(\"sm\"));\n\n useEffect(() => {\n Streamlit.setFrameHeight();\n }, [isSmallViewport]);\n\n return (\n <Stack direction={isSmallViewport ? \"column\" : \"row\"} spacing={2}>\n {props.children}\n </Stack>\n );\n};\n\nexport default DeviceSelectContainer;\n","import Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\n\nconst StyledBox = styled(Box)(({ theme }) => ({\n position: \"relative\",\n [theme.breakpoints.down(\"sm\")]: {\n width: \"100%\",\n },\n width: theme.spacing(24),\n height: theme.spacing(16),\n maxHeight: theme.spacing(16),\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n}));\n\nconst VideoPreviewContainer = StyledBox;\n\nexport default VideoPreviewContainer;\n","import Paper from \"@mui/material/Paper\";\nimport { styled } from \"@mui/material/styles\";\n\nconst StyledPaper = styled(Paper)(({ theme }) => ({\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n width: \"100%\",\n height: \"100%\",\n padding: theme.spacing(2),\n boxSizing: \"border-box\",\n}));\n\nconst Message = StyledPaper;\n\nexport default Message;\n","import React from \"react\";\nimport Message from \"./Message\";\nimport { useTranslation } from \"../../../translation/TranslationProvider\";\n\nconst MediaApiNotAvailableMessage: React.VFC = () => {\n return (\n <Message>\n {useTranslation(\"media_api_not_available\") || \"Media API not available\"}\n </Message>\n );\n};\n\nexport default MediaApiNotAvailableMessage;\n","import React from \"react\";\nimport Message from \"./Message\";\nimport { useTranslation } from \"../../../translation/TranslationProvider\";\n\nconst AskPermissionMessage: React.VFC = () => {\n return (\n <Message>\n {useTranslation(\"device_ask_permission\") ||\n \"Please allow the app to use your media devices\"}\n </Message>\n );\n};\n\nexport default AskPermissionMessage;\n","import React from \"react\";\nimport Message from \"./Message\";\nimport { useTranslation } from \"../../../translation/TranslationProvider\";\n\ninterface AccessDeniedMessageProps {\n error: Error;\n}\nconst AccessDeniedMessage: React.VFC<AccessDeniedMessageProps> = (props) => {\n return (\n <Message>\n {useTranslation(\"device_access_denied\") || \"Access denied\"} (\n {props.error.message})\n </Message>\n );\n};\n\nexport default AccessDeniedMessage;\n","import React from \"react\";\nimport Message from \"./Message\";\nimport { useTranslation } from \"../../../translation/TranslationProvider\";\n\ninterface DeviceNotAvailableMessageProps {\n error: Error;\n}\nconst DeviceNotAvailableMessage: React.VFC<DeviceNotAvailableMessageProps> = (\n props\n) => {\n return (\n <Message>\n {useTranslation(\"device_not_available\") || \"Device not available\"} (\n {props.error.message})\n </Message>\n );\n};\n\nexport default DeviceNotAvailableMessage;\n","import React from \"react\";\nimport Paper from \"@mui/material/Paper\";\nimport VideocamOffIcon from \"@mui/icons-material/VideocamOff\";\nimport { styled } from \"@mui/material/styles\";\n\nconst StyledPaper = styled(Paper)({\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n width: \"100%\",\n height: \"100%\",\n});\n\nconst VoidVideoPreview: React.VFC = () => {\n return (\n <StyledPaper>\n <VideocamOffIcon fontSize=\"large\" />\n </StyledPaper>\n );\n};\n\nexport default React.memo(VoidVideoPreview);\n","import React, { useEffect, useState } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\n\ninterface OverlayBoxProps {\n $transparent: boolean;\n}\nconst OverlayBox = styled(Box, {\n shouldForwardProp: (prop) => prop !== \"$transparent\", // Prevent the custom prop to be passed to the inner HTML tag.\n})<OverlayBoxProps>(({ theme, $transparent }) => ({\n margin: 0,\n padding: 0,\n position: \"relative\",\n \"&:before\": {\n position: \"absolute\",\n content: '\"\"',\n width: \"100%\",\n height: \"100%\",\n opacity: $transparent ? 0 : 1,\n backgroundColor: theme.palette.background.default,\n transition: \"opacity 0.3s\",\n },\n}));\n\ninterface DeferProps {\n time: number;\n children: React.ReactElement;\n}\nconst Defer: React.VFC<DeferProps> = (props) => {\n const [elapsed, setElapsed] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setElapsed(true);\n }, props.time);\n\n return () => clearTimeout(timer);\n }, [props.time]);\n\n return <OverlayBox $transparent={elapsed}>{props.children}</OverlayBox>;\n};\n\nexport default Defer;\n","import { styled } from \"@mui/material/styles\";\n\nconst StyledVideo = styled(\"video\")({\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n});\n\nconst VideoPreview = StyledVideo;\n\nexport default VideoPreview;\n","export function stopAllTracks(stream: MediaStream) {\n stream.getVideoTracks().forEach((track) => track.stop());\n stream.getAudioTracks().forEach((track) => track.stop());\n}\n","import React, { useEffect, useRef } from \"react\";\nimport VideoPreviewComponent from \"./components/VideoPreview\";\nimport { stopAllTracks } from \"./utils\";\n\nexport interface VideoPreviewProps {\n deviceId: MediaDeviceInfo[\"deviceId\"];\n}\nconst VideoPreview: React.VFC<VideoPreviewProps> = (props) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n\n useEffect(() => {\n if (props.deviceId == null) {\n return;\n }\n\n let stream: MediaStream | null = null;\n let unmounted = false;\n navigator.mediaDevices\n .getUserMedia({ video: { deviceId: props.deviceId }, audio: false })\n .then((_stream) => {\n stream = _stream;\n\n if (unmounted) {\n stopAllTracks(stream);\n return;\n }\n\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n }\n });\n\n return () => {\n unmounted = true;\n if (stream) {\n stopAllTracks(stream);\n }\n };\n }, [props.deviceId]);\n\n return <VideoPreviewComponent ref={videoRef} autoPlay muted />;\n};\n\nexport default React.memo(VideoPreview);\n","import { Streamlit } from \"streamlit-component-lib\";\nimport React, {\n useReducer,\n Reducer,\n useCallback,\n useState,\n useEffect,\n useRef,\n} from \"react\";\nimport NativeSelect, { NativeSelectProps } from \"@mui/material/NativeSelect\";\nimport Alert from \"@mui/material/Alert\";\nimport Stack from \"@mui/material/Stack\";\nimport InputLabel from \"@mui/material/InputLabel\";\nimport FormControl from \"@mui/material/FormControl\";\nimport DeviceSelectContainer from \"./components/DeviceSelectContainer\";\nimport VideoPreviewContainer from \"./components/VideoPreviewContainer\";\nimport Message from \"./components/messages/Message\";\nimport MediaApiNotAvailableMessage from \"./components/messages/MediaApiNotAvailableMessage\";\nimport AskPermissionMessage from \"./components/messages/AskPermissionMessage\";\nimport AccessDeniedMessage from \"./components/messages/AccessDeniedMessage\";\nimport DeviceNotAvailableMessage from \"./components/messages/DeviceNotAvailableMessage\";\nimport VoidVideoPreview from \"./components/VoidVideoPreview\";\nimport Defer from \"./components/Defer\";\nimport VideoPreview from \"./VideoPreview\";\nimport { stopAllTracks } from \"./utils\";\n\nfunction ensureValidSelection(\n devices: MediaDeviceInfo[],\n selectedDeviceId: MediaDeviceInfo[\"deviceId\"] | undefined\n): MediaDeviceInfo[\"deviceId\"] | undefined {\n const deviceIds = devices.map((d) => d.deviceId);\n if (selectedDeviceId && deviceIds.includes(selectedDeviceId)) {\n return selectedDeviceId;\n }\n if (deviceIds.length > 0) {\n return deviceIds[0];\n }\n return undefined;\n}\n\ninterface DeviceSelectionState {\n unavailable: boolean;\n videoInputs: MediaDeviceInfo[];\n audioInputs: MediaDeviceInfo[];\n audioOutputs: MediaDeviceInfo[];\n // TODO: Add selectedAudioOutputDeviceId\n selectedVideoInputDeviceId: MediaDeviceInfo[\"deviceId\"] | undefined;\n selectedAudioInputDeviceId: MediaDeviceInfo[\"deviceId\"] | undefined;\n}\ninterface DeviceSelectionActionBase {\n type: string;\n}\ninterface DeviceSelectionSetUnavailableAction\n extends DeviceSelectionActionBase {\n type: \"SET_UNAVAILABLE\";\n}\ninterface DeviceSelectionUpdateDevicesAction extends DeviceSelectionActionBase {\n type: \"UPDATE_DEVICES\";\n devices: MediaDeviceInfo[];\n}\ninterface DeviceSelectionUpdateSelectedDeviceIdAction\n extends DeviceSelectionActionBase {\n type: \"UPDATE_SELECTED_DEVICE_ID\";\n payload: {\n selectedVideoInputDeviceId?: MediaDeviceInfo[\"deviceId\"] | undefined;\n selectedAudioInputDeviceId?: MediaDeviceInfo[\"deviceId\"] | undefined;\n };\n}\ntype DeviceSelectionAction =\n | DeviceSelectionSetUnavailableAction\n | DeviceSelectionUpdateDevicesAction\n | DeviceSelectionUpdateSelectedDeviceIdAction;\nconst deviceSelectionReducer: Reducer<\n DeviceSelectionState,\n DeviceSelectionAction\n> = (state, action) => {\n switch (action.type) {\n case \"SET_UNAVAILABLE\": {\n return {\n unavailable: true,\n videoInputs: [],\n audioInputs: [],\n audioOutputs: [],\n selectedVideoInputDeviceId: undefined,\n selectedAudioInputDeviceId: undefined,\n };\n }\n case \"UPDATE_DEVICES\": {\n const devices = action.devices;\n const videoInputs = devices.filter((d) => d.kind === \"videoinput\");\n const audioInputs = devices.filter((d) => d.kind === \"audioinput\");\n const audioOutputs = devices.filter((d) => d.kind === \"audiooutput\");\n\n const selectedVideoInputDeviceId = ensureValidSelection(\n videoInputs,\n state.selectedVideoInputDeviceId\n );\n const selectedAudioInputDeviceId = ensureValidSelection(\n audioInputs,\n state.selectedAudioInputDeviceId\n );\n\n return {\n ...state,\n videoInputs,\n audioInputs,\n audioOutputs,\n selectedVideoInputDeviceId,\n selectedAudioInputDeviceId,\n };\n }\n case \"UPDATE_SELECTED_DEVICE_ID\": {\n return {\n ...state,\n ...action.payload,\n };\n }\n }\n};\n\ntype PermissionState = \"WAITING\" | \"ALLOWED\" | Error;\n\nexport interface DeviceSelectProps {\n video: boolean;\n audio: boolean;\n defaultVideoDeviceId: MediaDeviceInfo[\"deviceId\"] | undefined;\n defaultAudioDeviceId: MediaDeviceInfo[\"deviceId\"] | undefined;\n onSelect: (devices: {\n video: MediaDeviceInfo[\"deviceId\"] | undefined;\n audio: MediaDeviceInfo[\"deviceId\"] | undefined;\n }) => void;\n}\nconst DeviceSelect: React.VFC<DeviceSelectProps> = (props) => {\n const {\n video: useVideo,\n audio: useAudio,\n defaultVideoDeviceId,\n defaultAudioDeviceId,\n onSelect,\n } = props;\n\n const [permissionState, setPermissionState] =\n useState<PermissionState>(\"WAITING\");\n\n const [\n {\n unavailable,\n videoInputs,\n selectedVideoInputDeviceId,\n audioInputs,\n selectedAudioInputDeviceId,\n },\n deviceSelectionDispatch,\n ] = useReducer(deviceSelectionReducer, {\n unavailable: false,\n videoInputs: [],\n audioInputs: [],\n audioOutputs: [],\n selectedVideoInputDeviceId: defaultVideoDeviceId,\n selectedAudioInputDeviceId: defaultAudioDeviceId,\n });\n\n // Ref: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/ondevicechange#example\n const updateDeviceList = useCallback(() => {\n if (typeof navigator?.mediaDevices?.enumerateDevices !== \"function\") {\n deviceSelectionDispatch({ type: \"SET_UNAVAILABLE\" });\n return;\n }\n\n return navigator.mediaDevices.enumerateDevices().then((devices) => {\n deviceSelectionDispatch({\n type: \"UPDATE_DEVICES\",\n devices,\n });\n });\n }, []);\n\n // These values are passed to inside the useEffect below via a ref\n // because they are used there only for UX improvement\n // and should not be added to the dependency list to avoid triggering re-execution.\n const defaultDeviceIdsRef = useRef({\n video: defaultVideoDeviceId,\n audio: defaultAudioDeviceId,\n });\n defaultDeviceIdsRef.current = {\n video: defaultVideoDeviceId,\n audio: defaultAudioDeviceId,\n };\n // Call `getUserMedia()` to ask the user for the permission.\n useEffect(() => {\n if (typeof navigator?.mediaDevices?.getUserMedia !== \"function\") {\n deviceSelectionDispatch({ type: \"SET_UNAVAILABLE\" });\n return;\n }\n\n setPermissionState(\"WAITING\");\n\n const { video: videoDeviceId, audio: audioDeviceId } =\n defaultDeviceIdsRef.current;\n navigator.mediaDevices\n .getUserMedia({\n // Specify the target devices if the user already selected specific ones.\n // This is not mandatory but beneficial for better UX\n // as unused devices are not accessed so that their LED indicators\n // will not be unnecessarily turned on.\n video:\n useVideo && videoDeviceId ? { deviceId: videoDeviceId } : useVideo,\n audio:\n useAudio && audioDeviceId ? { deviceId: audioDeviceId } : useAudio,\n })\n .then(async (stream) => {\n stopAllTracks(stream);\n\n await updateDeviceList();\n\n setPermissionState(\"ALLOWED\");\n })\n .catch((err) => {\n setPermissionState(err);\n });\n }, [useVideo, useAudio, updateDeviceList]);\n\n // Set up the ondevicechange event handler\n useEffect(() => {\n const handleDeviceChange = () => updateDeviceList();\n navigator.mediaDevices.ondevicechange = handleDeviceChange;\n\n return () => {\n if (navigator.mediaDevices.ondevicechange === handleDeviceChange) {\n navigator.mediaDevices.ondevicechange = null;\n }\n };\n }, [updateDeviceList]);\n\n const handleVideoInputChange = useCallback<\n NonNullable<NativeSelectProps[\"onChange\"]>\n >((e) => {\n deviceSelectionDispatch({\n type: \"UPDATE_SELECTED_DEVICE_ID\",\n payload: {\n selectedVideoInputDeviceId: e.target.value,\n },\n });\n }, []);\n\n const handleAudioInputChange = useCallback<\n NonNullable<NativeSelectProps[\"onChange\"]>\n >((e) => {\n deviceSelectionDispatch({\n type: \"UPDATE_SELECTED_DEVICE_ID\",\n payload: {\n selectedAudioInputDeviceId: e.target.value,\n },\n });\n }, []);\n\n // Call onSelect\n useEffect(() => {\n const videoInput = useVideo\n ? videoInputs.find((d) => d.deviceId === selectedVideoInputDeviceId)\n : null;\n const audioInput = useAudio\n ? audioInputs.find((d) => d.deviceId === selectedAudioInputDeviceId)\n : null;\n onSelect({ video: videoInput?.deviceId, audio: audioInput?.deviceId });\n }, [\n useVideo,\n useAudio,\n onSelect,\n videoInputs,\n audioInputs,\n selectedVideoInputDeviceId,\n selectedAudioInputDeviceId,\n ]);\n\n useEffect(() => {\n setTimeout(() => Streamlit.setFrameHeight());\n });\n\n if (unavailable) {\n return <MediaApiNotAvailableMessage />;\n }\n\n if (permissionState === \"WAITING\") {\n return (\n <Defer time={1000}>\n <AskPermissionMessage />\n </Defer>\n );\n }\n\n if (permissionState instanceof Error) {\n const error = permissionState;\n if (\n error instanceof DOMException &&\n (error.name === \"NotReadableError\" || error.name === \"NotFoundError\")\n ) {\n return <DeviceNotAvailableMessage error={error} />;\n } else if (\n error instanceof DOMException &&\n error.name === \"NotAllowedError\"\n ) {\n return <AccessDeniedMessage error={error} />;\n } else {\n return (\n <Message>\n <Alert severity=\"error\">\n {error.name}: {error.message}\n </Alert>\n </Message>\n );\n }\n }\n\n return (\n <DeviceSelectContainer>\n <VideoPreviewContainer>\n {useVideo && selectedVideoInputDeviceId ? (\n <VideoPreview deviceId={selectedVideoInputDeviceId} />\n ) : (\n <VoidVideoPreview />\n )}\n </VideoPreviewContainer>\n <Stack spacing={2} justifyContent=\"center\">\n {useVideo && selectedVideoInputDeviceId && (\n <FormControl fullWidth>\n <InputLabel htmlFor=\"device-select-video-input\">\n Video Input\n </InputLabel>\n <NativeSelect\n inputProps={{\n name: \"video-input\",\n id: \"device-select-video-input\",\n }}\n value={selectedVideoInputDeviceId}\n onChange={handleVideoInputChange}\n >\n {videoInputs.map((device) => (\n <option key={device.deviceId} value={device.deviceId}>\n {device.label}\n </option>\n ))}\n </NativeSelect>\n </FormControl>\n )}\n {useAudio && selectedAudioInputDeviceId && (\n <FormControl fullWidth>\n <InputLabel htmlFor=\"device-select-audio-input\">\n Audio Input\n </InputLabel>\n <NativeSelect\n inputProps={{\n name: \"audio-input\",\n id: \"device-select-audio-input\",\n }}\n value={selectedAudioInputDeviceId}\n onChange={handleAudioInputChange}\n >\n {audioInputs.map((device) => (\n <option key={device.deviceId} value={device.deviceId}>\n {device.label}\n </option>\n ))}\n </NativeSelect>\n </FormControl>\n )}\n </Stack>\n </DeviceSelectContainer>\n );\n};\n\nexport default DeviceSelect;\n","import React from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport DeviceSelect, { DeviceSelectProps } from \"./DeviceSelect\";\n\nexport interface DeviceSelectFormProps extends DeviceSelectProps {\n onClose: () => void;\n}\nconst DeviceSelectForm: React.VFC<DeviceSelectFormProps> = ({\n onClose,\n ...deviceSelectProps\n}) => {\n return (\n <Stack spacing={2}>\n <DeviceSelect {...deviceSelectProps} />\n <Box>\n <Button variant=\"contained\" color=\"primary\" onClick={onClose}>\n Done\n </Button>\n </Box>\n </Stack>\n );\n};\n\nexport default DeviceSelectForm;\n","import { Streamlit } from \"streamlit-component-lib\";\nimport React, {\n useEffect,\n useCallback,\n VideoHTMLAttributes,\n AudioHTMLAttributes,\n HTMLAttributes,\n} from \"react\";\n\ntype UserDefinedHTMLVideoAttributes = Partial<\n Omit<\n VideoHTMLAttributes<HTMLVideoElement>,\n keyof Omit<HTMLAttributes<HTMLVideoElement>, \"hidden\" | \"style\"> | \"src\"\n >\n>;\ntype UserDefinedHTMLAudioAttributes = Partial<\n Omit<\n AudioHTMLAttributes<HTMLVideoElement>,\n keyof Omit<HTMLAttributes<HTMLVideoElement>, \"hidden\" | \"style\"> | \"src\"\n >\n>;\n\ninterface MediaStreamPlayerProps {\n stream: MediaStream;\n userDefinedVideoAttrs: UserDefinedHTMLVideoAttributes | undefined;\n userDefinedAudioAttrs: UserDefinedHTMLAudioAttributes | undefined;\n}\nconst MediaStreamPlayer: React.VFC<MediaStreamPlayerProps> = (props) => {\n useEffect(() => {\n Streamlit.setFrameHeight();\n });\n\n const hasVideo = props.stream.getVideoTracks().length > 0;\n\n const refCallback = useCallback(\n (node: HTMLVideoElement | HTMLAudioElement | null) => {\n if (node) {\n node.srcObject = props.stream;\n }\n },\n [props.stream]\n );\n\n const refreshFrameHeight = useCallback(() => Streamlit.setFrameHeight(), []);\n\n if (hasVideo) {\n // NOTE: Enumerate all allowed props instead of simply using spread operator\n // passing all the fields in props.userDefinedVideoAttrs\n // in order to block unexpected fields especially like dangerouslySetInnerHTML.\n const videoProps: VideoHTMLAttributes<HTMLVideoElement> = {\n hidden: props.userDefinedVideoAttrs?.hidden,\n style: props.userDefinedVideoAttrs?.style,\n autoPlay: props.userDefinedVideoAttrs?.autoPlay,\n controls: props.userDefinedVideoAttrs?.controls,\n controlsList: props.userDefinedVideoAttrs?.controlsList,\n crossOrigin: props.userDefinedVideoAttrs?.crossOrigin,\n loop: props.userDefinedVideoAttrs?.loop,\n mediaGroup: props.userDefinedVideoAttrs?.mediaGroup,\n muted: props.userDefinedVideoAttrs?.muted,\n playsInline: props.userDefinedVideoAttrs?.playsInline,\n preload: props.userDefinedVideoAttrs?.preload,\n height: props.userDefinedVideoAttrs?.height,\n poster: props.userDefinedVideoAttrs?.poster,\n width: props.userDefinedVideoAttrs?.width,\n disablePictureInPicture:\n props.userDefinedVideoAttrs?.disablePictureInPicture,\n disableRemotePlayback: props.userDefinedVideoAttrs?.disableRemotePlayback,\n };\n\n return (\n <video {...videoProps} ref={refCallback} onCanPlay={refreshFrameHeight} />\n );\n } else {\n const audioProps: AudioHTMLAttributes<HTMLAudioElement> = {\n hidden: props.userDefinedAudioAttrs?.hidden,\n style: props.userDefinedAudioAttrs?.style,\n autoPlay: props.userDefinedAudioAttrs?.autoPlay,\n controls: props.userDefinedAudioAttrs?.controls,\n controlsList: props.userDefinedAudioAttrs?.controlsList,\n crossOrigin: props.userDefinedAudioAttrs?.crossOrigin,\n loop: props.userDefinedAudioAttrs?.loop,\n mediaGroup: props.userDefinedAudioAttrs?.mediaGroup,\n muted: props.userDefinedAudioAttrs?.muted,\n playsInline: props.userDefinedAudioAttrs?.playsInline,\n preload: props.userDefinedAudioAttrs?.preload,\n };\n return <audio ref={refCallback} {...audioProps} />;\n }\n};\n\nexport default React.memo(MediaStreamPlayer);\n","import { Streamlit } from \"streamlit-component-lib\";\nimport React, { useEffect } from \"react\";\nimport Paper from \"@mui/material/Paper\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport VideoLabelIcon from \"@mui/icons-material/VideoLabel\";\nimport { styled } from \"@mui/material/styles\";\n\nconst StyledPaper = styled(Paper)(({ theme }) => ({\n padding: theme.spacing(4),\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n width: \"100%\",\n}));\n\ninterface PlaceholderProps {\n loading: boolean;\n}\nconst Placeholder: React.VFC<PlaceholderProps> = (props) => {\n useEffect(() => {\n Streamlit.setFrameHeight();\n });\n\n return (\n <StyledPaper elevation={0}>\n {props.loading ? (\n <CircularProgress />\n ) : (\n <VideoLabelIcon fontSize=\"large\" />\n )}\n </StyledPaper>\n );\n};\n\nexport default React.memo(Placeholder);\n","export function compileMediaConstraints(\n src: MediaStreamConstraints | undefined,\n videoDeviceId: string | undefined,\n audioDeviceId: string | undefined\n): MediaStreamConstraints {\n const constraints = src || {};\n\n if (videoDeviceId) {\n if (constraints.video === true) {\n constraints.video = {\n deviceId: videoDeviceId,\n };\n } else if (\n typeof constraints.video === \"object\" ||\n constraints.video == null\n ) {\n constraints.video = {\n ...constraints.video,\n deviceId: videoDeviceId,\n };\n }\n }\n\n if (audioDeviceId) {\n if (constraints.audio === true) {\n constraints.audio = {\n deviceId: audioDeviceId,\n };\n } else if (\n typeof constraints.audio === \"object\" ||\n constraints.audio == null\n ) {\n constraints.audio = {\n ...constraints.audio,\n deviceId: audioDeviceId,\n };\n }\n }\n\n return constraints;\n}\n\ninterface MediaUsage {\n videoEnabled: boolean;\n audioEnabled: boolean;\n}\nexport function getMediaUsage(constraintsFromPython: any): MediaUsage {\n const videoEnabled = constraintsFromPython\n ? !!constraintsFromPython.video\n : true;\n const audioEnabled = constraintsFromPython\n ? !!constraintsFromPython.audio\n : true;\n\n return { videoEnabled, audioEnabled };\n}\n","import { ComponentValue } from \"../component-value\";\nimport { Action } from \"./actions\";\n\nexport type WebRtcState = \"STOPPED\" | \"SIGNALLING\" | \"PLAYING\" | \"STOPPING\";\nexport interface State {\n webRtcState: WebRtcState;\n sdpOffer: RTCSessionDescription | null;\n signallingTimedOut: boolean;\n stream: MediaStream | null;\n error: Error | null;\n}\nexport const initialState: State = {\n webRtcState: \"STOPPED\",\n sdpOffer: null,\n signallingTimedOut: false,\n stream: null,\n error: null,\n};\n\nexport const reducer: React.Reducer<State, Action> = (state, action) => {\n switch (action.type) {\n case \"SIGNALLING_START\":\n return {\n ...state,\n webRtcState: \"SIGNALLING\",\n stream: null,\n error: null,\n signallingTimedOut: false,\n };\n case \"SIGNALLING_TIMEOUT\":\n return {\n ...state,\n signallingTimedOut: true,\n };\n case \"SET_STREAM\":\n return {\n ...state,\n stream: action.stream,\n };\n case \"SET_OFFER\":\n return {\n ...state,\n sdpOffer: action.offer,\n };\n case \"STOPPING\":\n return {\n ...state,\n webRtcState: \"STOPPING\",\n sdpOffer: null,\n };\n case \"STOPPED\":\n return {\n ...state,\n webRtcState: \"STOPPED\",\n sdpOffer: null,\n stream: null,\n };\n case \"START_PLAYING\":\n return {\n ...state,\n webRtcState: \"PLAYING\",\n sdpOffer: null,\n };\n case \"PROCESS_ANSWER_ERROR\":\n return {\n ...state,\n error: action.error,\n };\n case \"ERROR\":\n return {\n ...state,\n webRtcState: \"STOPPED\",\n sdpOffer: null,\n error: action.error,\n };\n }\n};\n\nexport const connectReducer = (\n onComponentValueChange: (newComponentValue: ComponentValue) => void\n): React.Reducer<State, Action> => {\n const connectedReducer: React.Reducer<State, Action> = (state, action) => {\n const nextState = reducer(state, action);\n\n const nextPlaying = nextState.webRtcState === \"PLAYING\";\n const prevPlaying = state.webRtcState === \"PLAYING\";\n const playingChanged = nextPlaying !== prevPlaying;\n\n const nextSdpOffer = nextState.sdpOffer;\n const prevSdpOffer = state.sdpOffer;\n const sdpOfferChanged = nextSdpOffer !== prevSdpOffer;\n\n if (playingChanged || sdpOfferChanged) {\n if (prevSdpOffer) {\n console.log(\"Send SDP offer\", prevSdpOffer);\n }\n onComponentValueChange({\n playing: nextPlaying,\n sdpOffer: nextSdpOffer ? nextSdpOffer.toJSON() : \"\", // `Streamlit.setComponentValue` cannot \"unset\" the field by passing null or undefined, so here an empty string is set instead when `sdpOffer` is undefined. // TODO: Create an issue\n });\n }\n\n return nextState;\n };\n\n return connectedReducer;\n};\n","import { useReducer, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport { compileMediaConstraints } from \"../media-constraint\";\nimport { ComponentValue } from \"../component-value\";\nimport { connectReducer, initialState } from \"./reducer\";\n\nexport type WebRtcMode = \"RECVONLY\" | \"SENDONLY\" | \"SENDRECV\";\nexport const isWebRtcMode = (val: unknown): val is WebRtcMode =>\n val === \"RECVONLY\" || val === \"SENDONLY\" || val === \"SENDRECV\";\nexport const isReceivable = (mode: WebRtcMode): boolean =>\n mode === \"SENDRECV\" || mode === \"RECVONLY\";\nexport const isTransmittable = (mode: WebRtcMode): boolean =>\n mode === \"SENDRECV\" || mode === \"SENDONLY\";\n\nconst setupOffer = (\n pc: RTCPeerConnection\n): Promise<RTCSessionDescription | null> => {\n return pc\n .createOffer()\n .then((offer) => {\n console.log(\"Created offer:\", offer);\n return pc.setLocalDescription(offer);\n })\n .then(() => {\n console.log(\"Wait for ICE gethering...\");\n // Wait for ICE gathering to complete\n return new Promise<void>((resolve) => {\n if (pc.iceGatheringState === \"complete\") {\n resolve();\n } else {\n const checkState = () => {\n if (pc.iceGatheringState === \"complete\") {\n pc.removeEventListener(\"icegatheringstatechange\", checkState);\n resolve();\n }\n };\n pc.addEventListener(\"icegatheringstatechange\", checkState);\n }\n });\n })\n .then(() => {\n const offer = pc.localDescription;\n return offer;\n })\n .catch((err) => {\n console.error(err);\n throw err;\n });\n};\n\nconst SIGNALLING_TIMEOUT = 3 * 1000;\n\nexport const useWebRtc = (\n props: {\n mode: WebRtcMode;\n desiredPlayingState: boolean | undefined;\n sdpAnswerJson: string | undefined;\n rtcConfiguration: RTCConfiguration | undefined;\n mediaStreamConstraints: MediaStreamConstraints | undefined;\n },\n videoDeviceIdRequest: MediaDeviceInfo[\"deviceId\"] | undefined,\n audioDeviceIdRequest: MediaDeviceInfo[\"deviceId\"] | undefined,\n onComponentValueChange: (newComponentValue: ComponentValue) => void,\n onDevicesOpened: (openedDeviceIds: { video?: string; audio?: string }) => void\n) => {\n // Initialize component value\n useEffect(() => {\n return onComponentValueChange({\n playing: false,\n sdpOffer: \"\",\n });\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const signallingTimerRef = useRef<NodeJS.Timeout>();\n const pcRef = useRef<RTCPeerConnection>();\n const reducer = useMemo(\n () => connectReducer(onComponentValueChange),\n [onComponentValueChange]\n );\n const [state, dispatch] = useReducer(reducer, initialState);\n\n const stop = useCallback(() => {\n const stopInner = async () => {\n if (state.webRtcState === \"STOPPING\") {\n return;\n }\n\n const pc = pcRef.current;\n pcRef.current = undefined;\n\n dispatch({ type: \"STOPPING\" });\n\n if (pc == null) {\n return;\n }\n\n // close transceivers\n if (pc.getTransceivers) {\n pc.getTransceivers().forEach(function (transceiver) {\n if (transceiver.stop) {\n transceiver.stop();\n }\n });\n }\n\n // close local audio / video\n pc.getSenders().forEach(function (sender) {\n sender.track?.stop();\n });\n\n // close peer connection\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n pc.close();\n resolve();\n }, 500);\n });\n };\n\n stopInner()\n .catch((error) => dispatch({ type: \"ERROR\", error }))\n .finally(() => {\n dispatch({ type: \"STOPPED\" });\n });\n }, [state.webRtcState]);\n\n const stopRef = useRef(stop);\n stopRef.current = stop;\n\n const start = useCallback(() => {\n if (state.webRtcState !== \"STOPPED\") {\n return;\n }\n\n const startInner = async () => {\n dispatch({ type: \"SIGNALLING_START\" });\n signallingTimerRef.current = setTimeout(() => {\n dispatch({ type: \"SIGNALLING_TIMEOUT\" });\n }, SIGNALLING_TIMEOUT);\n\n const mode = props.mode;\n\n const config: RTCConfiguration = props.rtcConfiguration || {};\n console.log(\"RTCConfiguration:\", config);\n const pc = new RTCPeerConnection(config);\n\n // Connect received audio / video to DOM elements\n if (mode === \"SENDRECV\" || mode === \"RECVONLY\") {\n pc.addEventListener(\"track\", (evt) => {\n const stream = evt.streams[0]; // TODO: Handle multiple streams\n dispatch({ type: \"SET_STREAM\", stream });\n });\n }\n\n // Set up transceivers\n if (mode === \"SENDRECV\" || mode === \"SENDONLY\") {\n const constraints = compileMediaConstraints(\n props.mediaStreamConstraints,\n videoDeviceIdRequest,\n audioDeviceIdRequest\n );\n console.log(\"MediaStreamConstraints:\", constraints);\n\n if (constraints.audio || constraints.video) {\n if (navigator.mediaDevices == null) {\n // Ref: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#privacy_and_security\n // > A secure context is, in short, a page loaded using HTTPS or the file:/// URL scheme, or a page loaded from localhost.\n throw new Error(\n \"navigator.mediaDevices is undefined. It seems the current document is not loaded securely.\"\n );\n }\n if (navigator.mediaDevices.getUserMedia == null) {\n throw new Error(\"getUserMedia is not implemented in this browser\");\n }\n\n const openedDeviceIds: {\n video?: MediaDeviceInfo[\"deviceId\"];\n audio?: MediaDeviceInfo[\"deviceId\"];\n } = {};\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((track) => {\n pc.addTrack(track, stream);\n\n const kind = track.kind;\n if (kind !== \"video\" && kind !== \"audio\") {\n return;\n }\n const deviceId = track.getSettings().deviceId;\n if (deviceId == null) {\n return;\n }\n openedDeviceIds[kind] = deviceId;\n });\n if (Object.keys(openedDeviceIds).length > 0) {\n onDevicesOpened(openedDeviceIds);\n }\n }\n\n if (mode === \"SENDONLY\") {\n for (const transceiver of pc.getTransceivers()) {\n transceiver.direction = \"sendonly\";\n }\n }\n } else if (mode === \"RECVONLY\") {\n pc.addTransceiver(\"video\", { direction: \"recvonly\" });\n pc.addTransceiver(\"audio\", { direction: \"recvonly\" });\n }\n console.log(\"transceivers\", pc.getTransceivers());\n\n pc.addEventListener(\"iceconnectionstatechange\", () => {\n console.log(\"iceconnectionstatechange\", pc.iceConnectionState);\n if (\n pc.iceConnectionState === \"disconnected\" ||\n pc.iceConnectionState === \"failed\" ||\n pc.iceConnectionState === \"closed\"\n ) {\n stopRef.current();\n }\n });\n\n pcRef.current = pc;\n\n await setupOffer(pc).then((offer) => {\n if (offer == null) {\n throw new Error(\"Failed to create an offer SDP\");\n }\n\n dispatch({ type: \"SET_OFFER\", offer });\n });\n };\n\n startInner().catch((error) =>\n dispatch({\n type: \"ERROR\",\n error,\n })\n );\n }, [\n audioDeviceIdRequest,\n videoDeviceIdRequest,\n props.mediaStreamConstraints,\n props.mode,\n props.rtcConfiguration,\n state.webRtcState,\n onDevicesOpened,\n ]);\n\n // processAnswer\n useEffect(() => {\n const pc = pcRef.current;\n if (pc == null) {\n return;\n }\n\n const sdpAnswerJson = props.sdpAnswerJson;\n if (pc.remoteDescription == null) {\n if (sdpAnswerJson && state.webRtcState === \"SIGNALLING\") {\n const sdpAnswer = JSON.parse(sdpAnswerJson);\n console.log(\"Receive answer sdpOffer\", sdpAnswer);\n pc.setRemoteDescription(sdpAnswer)\n .then(() => {\n console.log(\"Remote description is set\");\n\n if (signallingTimerRef.current) {\n clearTimeout(signallingTimerRef.current);\n }\n dispatch({ type: \"START_PLAYING\" });\n })\n .catch((error) => {\n dispatch({ type: \"PROCESS_ANSWER_ERROR\", error });\n stop();\n });\n }\n }\n }, [props.sdpAnswerJson, state.webRtcState, stop]);\n\n // reconcilePlayingState\n useEffect(() => {\n const desiredPlayingState = props.desiredPlayingState;\n if (desiredPlayingState != null) {\n if (desiredPlayingState === true && state.webRtcState === \"STOPPED\") {\n start();\n } else if (\n desiredPlayingState === false &&\n (state.webRtcState === \"SIGNALLING\" || state.webRtcState === \"PLAYING\")\n ) {\n stop();\n }\n }\n }, [props.desiredPlayingState, start, state.webRtcState, stop]);\n\n return {\n start,\n stop,\n state,\n };\n};\n","import { Streamlit } from \"streamlit-component-lib\";\n\nexport interface ComponentValue {\n playing: boolean;\n sdpOffer: string; // `Streamlit.setComponentValue` cannot \"unset\" the field by passing null or undefined, so an empty string will be used here for that purpose. // TODO: Create an issue\n}\n\nexport function setComponentValue(componentValue: ComponentValue) {\n return Streamlit.setComponentValue(componentValue);\n}\n","import React from \"react\";\nimport Button, { ButtonProps } from \"@mui/material/Button\";\nimport { useTranslation } from \"../TranslationProvider\";\nimport { TranslationKey } from \"../types\";\n\ninterface TranslatedButtonProps extends ButtonProps {\n translationKey: TranslationKey;\n defaultText: string;\n}\nconst TranslatedButton: React.VFC<TranslatedButtonProps> = ({\n translationKey,\n defaultText,\n ...props\n}) => {\n return (\n <Button {...props}>{useTranslation(translationKey) || defaultText}</Button>\n );\n};\n\nexport default TranslatedButton;\n","import React, { useState, useCallback } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Alert from \"@mui/material/Alert\";\nimport DeviceSelectForm from \"./DeviceSelect/DeviceSelectForm\";\nimport MediaStreamPlayer from \"./MediaStreamPlayer\";\nimport Placeholder from \"./Placeholder\";\nimport { useRenderData } from \"streamlit-component-lib-react-hooks\";\nimport {\n useWebRtc,\n WebRtcMode,\n isWebRtcMode,\n isReceivable,\n isTransmittable,\n} from \"./webrtc\";\nimport { getMediaUsage } from \"./media-constraint\";\nimport { ComponentValue, setComponentValue } from \"./component-value\";\nimport TranslatedButton from \"./translation/components/TranslatedButton\";\nimport \"webrtc-adapter\";\n\ninterface WebRtcStreamerInnerProps {\n disabled: boolean;\n mode: WebRtcMode;\n desiredPlayingState: boolean | undefined;\n sdpAnswerJson: string | undefined;\n rtcConfiguration: RTCConfiguration | undefined;\n mediaStreamConstraints: MediaStreamConstraints | undefined;\n videoHtmlAttrs: any;\n audioHtmlAttrs: any;\n onComponentValueChange: (newComponentValue: ComponentValue) => void;\n}\nconst WebRtcStreamerInner: React.VFC<WebRtcStreamerInnerProps> = (props) => {\n const [deviceIds, setDeviceIds] = useState<{\n video?: MediaDeviceInfo[\"deviceId\"] | undefined;\n audio?: MediaDeviceInfo[\"deviceId\"] | undefined;\n }>({ video: undefined, audio: undefined });\n const { state, start, stop } = useWebRtc(\n props,\n deviceIds.video,\n deviceIds.audio,\n props.onComponentValueChange,\n setDeviceIds\n );\n\n const mode = props.mode;\n const buttonDisabled =\n props.disabled ||\n (state.webRtcState === \"SIGNALLING\" && !state.signallingTimedOut) || // Users can click the stop button after signalling timed out.\n state.webRtcState === \"STOPPING\" ||\n props.desiredPlayingState != null;\n const receivable = isWebRtcMode(mode) && isReceivable(mode);\n const transmittable = isWebRtcMode(mode) && isTransmittable(mode);\n const { videoEnabled, audioEnabled } = getMediaUsage(\n props.mediaStreamConstraints\n );\n\n const [deviceSelectOpen, setDeviceSelectOpen] = useState(false);\n const openDeviceSelect = useCallback(() => {\n setDeviceSelectOpen(true);\n }, []);\n const closeDeviceSelect = useCallback(() => {\n setDeviceSelectOpen(false);\n }, []);\n if (deviceSelectOpen) {\n return (\n <DeviceSelectForm\n video={videoEnabled}\n audio={audioEnabled}\n defaultVideoDeviceId={deviceIds.video}\n defaultAudioDeviceId={deviceIds.audio}\n onSelect={setDeviceIds}\n onClose={closeDeviceSelect}\n />\n );\n }\n\n return (\n <Box>\n {state.error && (\n <Alert severity=\"error\">\n {state.error.name}: {state.error.message}\n </Alert>\n )}\n <Box py={1} display=\"flex\">\n {state.stream ? (\n <MediaStreamPlayer\n stream={state.stream}\n userDefinedVideoAttrs={props.videoHtmlAttrs}\n userDefinedAudioAttrs={props.audioHtmlAttrs}\n />\n ) : (\n receivable && (\n <Placeholder loading={state.webRtcState === \"SIGNALLING\"} />\n )\n )}\n </Box>\n <Box display=\"flex\" justifyContent=\"space-between\">\n {state.webRtcState === \"PLAYING\" ||\n state.webRtcState === \"SIGNALLING\" ? (\n <TranslatedButton\n variant=\"contained\"\n onClick={stop}\n disabled={buttonDisabled}\n translationKey=\"stop\"\n defaultText=\"Stop\"\n />\n ) : (\n <TranslatedButton\n variant=\"contained\"\n color=\"primary\"\n onClick={start}\n disabled={buttonDisabled}\n translationKey=\"start\"\n defaultText=\"Start\"\n />\n )}\n {transmittable && state.webRtcState === \"STOPPED\" && (\n <TranslatedButton\n color=\"inherit\"\n onClick={openDeviceSelect}\n translationKey=\"select_device\"\n defaultText=\"Select Device\"\n />\n )}\n </Box>\n </Box>\n );\n};\n\nconst WebRtcStreamer: React.VFC = () => {\n const renderData = useRenderData();\n\n const mode = renderData.args[\"mode\"];\n const desiredPlayingState = renderData.args[\"desired_playing_state\"];\n const sdpAnswerJson = renderData.args[\"sdp_answer_json\"];\n const rtcConfiguration: RTCConfiguration = renderData.args.rtc_configuration;\n const mediaStreamConstraints: MediaStreamConstraints =\n renderData.args.media_stream_constraints;\n const videoHtmlAttrs = renderData.args.video_html_attrs;\n const audioHtmlAttrs = renderData.args.audio_html_attrs;\n\n if (!isWebRtcMode(mode)) {\n throw new Error(`Invalid mode ${mode}`);\n }\n\n return (\n <WebRtcStreamerInner\n disabled={renderData.disabled}\n mode={mode}\n desiredPlayingState={desiredPlayingState}\n sdpAnswerJson={sdpAnswerJson}\n rtcConfiguration={rtcConfiguration}\n mediaStreamConstraints={mediaStreamConstraints}\n videoHtmlAttrs={videoHtmlAttrs}\n audioHtmlAttrs={audioHtmlAttrs}\n onComponentValueChange={setComponentValue}\n />\n );\n};\n\nexport default WebRtcStreamer;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { ThemeProvider } from \"./ThemeProvider\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { StreamlitProvider } from \"streamlit-component-lib-react-hooks\";\nimport TranslationProvider from \"./translation/TranslationProvider\";\nimport WebRtcStreamer from \"./WebRtcStreamer\";\n\nReactDOM.render(\n <React.StrictMode>\n <StreamlitProvider>\n <TranslationProvider>\n <ThemeProvider>\n <CssBaseline />\n <WebRtcStreamer />\n </ThemeProvider>\n </TranslationProvider>\n </StreamlitProvider>\n </React.StrictMode>,\n document.getElementById(\"root\")\n);\n"],"sourceRoot":""}
|
@@ -1,2 +0,0 @@
|
|
1
|
-
!function(e){function t(t){for(var n,l,i=t[0],a=t[1],f=t[2],p=0,s=[];p<i.length;p++)l=i[p],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(c&&c(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,i=1;i<r.length;i++){var a=r[i];0!==o[a]&&(n=!1)}n&&(u.splice(t--,1),e=l(l.s=r[0]))}return e}var n={},o={1:0},u=[];function l(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,l),r.l=!0,r.exports}l.m=e,l.c=n,l.d=function(e,t,r){l.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},l.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,t){if(1&t&&(e=l(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(l.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)l.d(r,n,function(t){return e[t]}.bind(null,n));return r},l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,"a",t),t},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.p="./";var i=this.webpackJsonpstreamlit_webrtc=this.webpackJsonpstreamlit_webrtc||[],a=i.push.bind(i);i.push=t,i=i.slice();for(var f=0;f<i.length;f++)t(i[f]);var c=a;r()}([]);
|
2
|
-
//# sourceMappingURL=runtime-main.b6bde46b.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.b6bde46b.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"./\";\n\n \tvar jsonpArray = this[\"webpackJsonpstreamlit_webrtc\"] = this[\"webpackJsonpstreamlit_webrtc\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
|
File without changes
|