| @@ -72,6 +72,33 @@ const getOrCreateRpc = (username) => { | |||
| } | |||
| return State.rpcs[username] | |||
| } | |||
| const getSelectedMedia = async () => { | |||
| const stream = new MediaStream() | |||
| const addTrack = stream.addTrack.bind(stream) | |||
| const muted = document.querySelector('#mute-check').checked | |||
| if(!muted) { | |||
| const audio = Media.audioDefaults | |||
| await navigator.mediaDevices.getUserMedia({audio}) | |||
| .then(s => s.getAudioTracks().forEach(addTrack)) | |||
| .catch(e => console.error(e)) | |||
| } | |||
| const source = document.querySelector('#media-source').value | |||
| if(source === 'camera') { | |||
| const video = {width: {ideal: 320}, facingMode: 'user', frameRate: 26} | |||
| await navigator.mediaDevices.getUserMedia({video}) | |||
| .then(s => s.getVideoTracks().forEach(addTrack)) | |||
| .catch(e => console.error(e)) | |||
| } | |||
| if(source === 'screen' && navigator.mediaDevices.getDisplayMedia) { | |||
| await navigator.mediaDevices.getDisplayMedia() | |||
| .then(s => s.getVideoTracks().forEach(addTrack)) | |||
| .catch(e => console.error(e)) | |||
| } | |||
| return stream | |||
| } | |||
| const onPeerInfo = async ({detail: message}) => { | |||
| const rpc = getOrCreateRpc(message.source) | |||
| if(rpc && message.value.type === 'request') { | |||
| @@ -258,35 +285,8 @@ const Media = { | |||
| noiseSuppresion: true, | |||
| echoCancellation: true, | |||
| }, | |||
| getSelectedMedia: async () => { | |||
| const stream = new MediaStream() | |||
| const addTrack = stream.addTrack.bind(stream) | |||
| const muted = document.querySelector('#mute-check').checked | |||
| if(!muted) { | |||
| const audio = Media.audioDefaults | |||
| await navigator.mediaDevices.getUserMedia({audio}) | |||
| .then(s => s.getAudioTracks().forEach(addTrack)) | |||
| .catch(e => console.error(e)) | |||
| } | |||
| const source = document.querySelector('#media-source').value | |||
| if(source === 'camera') { | |||
| const video = {width: {ideal: 320}, facingMode: 'user', frameRate: 26} | |||
| await navigator.mediaDevices.getUserMedia({video}) | |||
| .then(s => s.getVideoTracks().forEach(addTrack)) | |||
| .catch(e => console.error(e)) | |||
| } | |||
| if(source === 'screen' && navigator.mediaDevices.getDisplayMedia) { | |||
| await navigator.mediaDevices.getDisplayMedia() | |||
| .then(s => s.getVideoTracks().forEach(addTrack)) | |||
| .catch(e => console.error(e)) | |||
| } | |||
| return stream | |||
| }, | |||
| turnOn: async () => { | |||
| const media = await Media.getSelectedMedia() | |||
| const media = await getSelectedMedia() | |||
| State.media[State.username] = media | |||
| wire({kind: 'peerInfo', value: {type: 'request'}}) | |||
| m.redraw() | |||