{"version":3,"sources":["message.ts","Room.tsx","name.ts","useRoomID.ts","logo.svg","LoginForm.tsx","RoomManage.tsx","url.ts","useRoom.ts","Video.tsx","Router.tsx","useConfig.ts","index.tsx"],"names":["ShareMode","RoomMode","VideoDisplayMode","roomConfig","dictionaries","gen","length","separator","getRoomFromURL","search","slice","split","find","param","startsWith","LoginForm","login","config","hide","React","useState","user","setUser","pass","setPass","loading","setLoading","submit","event","a","preventDefault","then","catch","FormControl","fullWidth","onSubmit","style","display","alignItems","Typography","flex","Button","variant","size","onClick","undefined","TextField","value","onChange","e","target","label","margin","type","Box","marginTop","LoadingButton","children","props","classes","useStyles","disabled","CircularProgress","className","buttonProgress","color","makeStyles","green","position","top","left","marginLeft","CreateRoom","room","window","location","id","setId","mode","authMode","loggedIn","Turn","Stun","defaultMode","closeRoomWhenOwnerLeaves","ownerLeave","setOwnerLeave","FormControlLabel","control","Checkbox","checked","_","paddingBottom","Link","href","rel","toUpperCase","payload","closeOnOwnerLeave","RoomManage","showLogin","setShowLogin","canCreateRoom","loginVisible","Grid","container","justifyContent","paddingTop","maxWidth","width","spacing","item","xs","align","gutterBottom","src","logo","alt","Paper","elevation","padding","logout","bottom","version","port","hostname","protocol","pathname","slashes","concat","path","endsWith","substring","lastIndexOf","url","urlWithSlash","relayConfig","indexOf","iceTransportPolicy","hostSession","sid","ice","send","done","stream","peer","RTCPeerConnection","iceServers","onicecandidate","candidate","onconnectionstatechange","console","log","connectionState","close","getTracks","forEach","track","addTrack","createOffer","offerToReceiveVideo","hostOffer","setLocalDescription","clientSession","onTrack","ontrack","MediaStream","useRoom","state","setState","useEffect","addEventListener","removeEventListener","useCallback","oldId","history","pushState","roomId","useRoomID","roomID","setRoomID","enqueueSnackbar","useSnackbar","conn","useRef","host","client","create","Promise","resolve","ws","current","WebSocket","replace","message","readyState","OPEN","JSON","stringify","first","onmessage","data","parse","clientStreams","filter","peer_id","addIceCandidate","setRemoteDescription","createAnswer","answer","onclose","reason","persist","onerror","err","onopen","username","localStorage","getItem","getPermanentName","share","navigator","mediaDevices","getDisplayMedia","video","getVideoTracks","stopShare","hostStream","Object","values","stop","setName","name","Video","element","setElement","srcObject","play","muted","ref","HostStream","Symbol","flags","result","you","push","owner","streaming","join","Room","open","setOpen","nameInput","setNameInput","permanent","setPermanent","showControl","setShowControl","hoverControl","setHoverControl","showMore","setShowMore","showDisplayOptions","setShowDisplayOptions","selectedStream","setSelectedStream","videoElement","setVideoElement","FitWidth","FitHeight","OriginalSize","FitToWindow","defaultVideoDisplayMode","videoDisplayMode","setVideoDisplayMode","setItem","useShowOnMouseMovement","some","submitName","copyLink","clipboard","writeText","setHoverState","useMemo","onMouseLeave","onMouseEnter","controlVisible","useHotkeys","requestFullscreen","currentStreamIndex","findIndex","nextIndex","previousIndex","videoContainer","title","Tooltip","component","cursor","videoWindowFit","videoWindowWidth","videoWindowHeight","videoClasses","transform","arrow","IconButton","fontSize","tooltip","noMaxWidth","users","map","Badge","badgeContent","currentTarget","Menu","anchorEl","keepMounted","Boolean","onClose","MenuItem","anchorOrigin","horizontal","vertical","bottomContainer","smallVideoContainer","smallVideo","smallVideoLabel","Dialog","DialogTitle","DialogContent","autoFocus","DialogActions","doShow","timeoutHandle","update","clearTimeout","setTimeout","theme","background","palette","paper","zIndex","right","minWidth","minHeight","maxHeight","height","overflow","Router","other","setConfig","refetch","fetch","json","password","body","FormData","set","method","status","text","useConfig","createTheme","adaptV4Theme","overrides","MuiSelect","icon","MuiLink","root","MuiIconButton","MuiListItemIcon","MuiToolbar","MuiTooltip","default","primary","main","secondary","Snackbar","notistackRef","createRef","onClickDismiss","key","closeSnackbar","maxSnack","action","ReactDOM","render","StrictMode","StyledEngineProvider","injectFirst","ThemeProvider","CssBaseline","document","getElementById"],"mappings":"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","file":"static/js/main.fe0d7e4c.chunk.js","sourcesContent":["export enum ShareMode {\n Everyone = 'Everyone',\n Selected = 'Selected',\n}\n\ntype Typed = {type: Type; payload: Base};\n\nexport interface UIConfig {\n authMode: 'turn' | 'none' | 'all';\n user: string;\n loggedIn: boolean;\n version: string;\n closeRoomWhenOwnerLeaves: boolean;\n}\n\nexport interface RoomConfiguration {\n id?: string;\n closeOnOwnerLeave?: boolean;\n mode: RoomMode;\n username?: string;\n}\n\nexport enum RoomMode {\n Turn = 'turn',\n Stun = 'stun',\n Local = 'local',\n}\n\nexport interface JoinConfiguration {\n id: string;\n password?: string;\n username?: string;\n}\n\nexport interface StringMessage {\n message: string;\n}\n\nexport interface P2PSession {\n id: string;\n peer: string;\n iceServers: ICEServer[];\n}\n\nexport interface ICEServer {\n urls: string[];\n credential: string;\n username: string;\n}\n\nexport interface RoomInfo {\n id: string;\n share: ShareMode;\n mode: RoomMode;\n users: RoomUser[];\n}\n\nexport interface RoomUser {\n id: string;\n name: string;\n streaming: boolean;\n you: boolean;\n owner: boolean;\n}\n\nexport interface P2PMessage {\n sid: string;\n value: T;\n}\n\nexport type Room = Typed;\nexport type Error = Typed;\nexport type HostSession = Typed;\nexport type Name = Typed<{username: string}, 'name'>;\nexport type ClientSession = Typed;\nexport type HostICECandidate = Typed, 'hostice'>;\nexport type ClientICECandidate = Typed, 'clientice'>;\nexport type HostOffer = Typed, 'hostoffer'>;\nexport type ClientAnswer = Typed, 'clientanswer'>;\nexport type StartSharing = Typed<{}, 'share'>;\nexport type StopShare = Typed<{}, 'stopshare'>;\nexport type RoomCreate = Typed;\nexport type JoinRoom = Typed;\nexport type EndShare = Typed;\n\nexport type IncomingMessage =\n | Room\n | Error\n | HostSession\n | ClientSession\n | HostICECandidate\n | ClientICECandidate\n | HostOffer\n | EndShare\n | ClientAnswer;\n\nexport type OutgoingMessage =\n | RoomCreate\n | Name\n | JoinRoom\n | HostICECandidate\n | ClientICECandidate\n | HostOffer\n | StopShare\n | ClientAnswer\n | StartSharing;\n","import React from 'react';\nimport {setPermanentName} from './name';\nimport {\n Badge,\n Button,\n Checkbox,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControlLabel,\n IconButton,\n Menu,\n MenuItem,\n Paper,\n TextField,\n Theme,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport CancelPresentationIcon from '@mui/icons-material/CancelPresentation';\nimport PresentToAllIcon from '@mui/icons-material/PresentToAll';\nimport FullScreenIcon from '@mui/icons-material/Fullscreen';\nimport PeopleIcon from '@mui/icons-material/People';\nimport ShowMoreIcon from '@mui/icons-material/MoreVert';\nimport {useHotkeys} from 'react-hotkeys-hook';\nimport {Video} from './Video';\nimport makeStyles from '@mui/styles/makeStyles';\nimport {ConnectedRoom} from './useRoom';\nimport {useSnackbar} from 'notistack';\nimport {RoomUser} from './message';\n\nconst HostStream: unique symbol = Symbol('mystream');\n\nconst flags = (user: RoomUser) => {\n const result: string[] = [];\n if (user.you) {\n result.push('You');\n }\n if (user.owner) {\n result.push('Owner');\n }\n if (user.streaming) {\n result.push('Streaming');\n }\n if (!result.length) {\n return '';\n }\n return ` (${result.join(', ')})`;\n};\n\nenum VideoDisplayMode {\n FitToWindow = 'FitToWindow',\n FitWidth = 'FitWidth',\n FitHeight = 'FitHeight',\n OriginalSize = 'OriginalSize',\n}\n\nconst defaultVideoDisplayMode = (): VideoDisplayMode => {\n switch (localStorage.getItem('videoDisplayMode')) {\n case 'FitWidth':\n return VideoDisplayMode.FitWidth;\n case 'FitHeight':\n return VideoDisplayMode.FitHeight;\n case 'OriginalSize':\n return VideoDisplayMode.OriginalSize;\n default:\n return VideoDisplayMode.FitToWindow;\n }\n};\n\nexport const Room = ({\n state,\n share,\n stopShare,\n setName,\n}: {\n state: ConnectedRoom;\n share: () => void;\n stopShare: () => void;\n setName: (name: string) => void;\n}) => {\n const classes = useStyles();\n const [open, setOpen] = React.useState(false);\n const {enqueueSnackbar} = useSnackbar();\n const [nameInput, setNameInput] = React.useState('');\n const [permanent, setPermanent] = React.useState(false);\n const [showControl, setShowControl] = React.useState(true);\n const [hoverControl, setHoverControl] = React.useState(false);\n const [showMore, setShowMore] = React.useState();\n const [showDisplayOptions, setShowDisplayOptions] = React.useState();\n const [selectedStream, setSelectedStream] = React.useState();\n const [videoElement, setVideoElement] = React.useState(null);\n const [videoDisplayMode, setVideoDisplayMode] = React.useState(\n defaultVideoDisplayMode()\n );\n\n React.useEffect(\n () => localStorage.setItem('videoDisplayMode', videoDisplayMode),\n [videoDisplayMode]\n );\n\n useShowOnMouseMovement(setShowControl);\n\n React.useEffect(() => {\n if (selectedStream === HostStream && state.hostStream) {\n return;\n }\n if (state.clientStreams.some(({id}) => id === selectedStream)) {\n return;\n }\n if (state.clientStreams.length === 0 && selectedStream) {\n setSelectedStream(undefined);\n return;\n }\n setSelectedStream(state.clientStreams[0]?.id);\n }, [state.clientStreams, selectedStream, state.hostStream]);\n\n const stream =\n selectedStream === HostStream\n ? state.hostStream\n : state.clientStreams.find(({id}) => selectedStream === id)?.stream;\n\n const submitName = () => {\n if (permanent) {\n setPermanentName(nameInput);\n }\n setName(nameInput);\n setOpen(false);\n };\n\n React.useEffect(() => {\n if (videoElement && stream) {\n videoElement.srcObject = stream;\n videoElement.play();\n }\n }, [videoElement, stream]);\n\n const copyLink = () => {\n navigator?.clipboard?.writeText(window.location.href)?.then(\n () => enqueueSnackbar('Link Copied', {variant: 'success'}),\n (err) => enqueueSnackbar('Copy Failed ' + err, {variant: 'error'})\n );\n };\n\n const setHoverState = React.useMemo(\n () => ({\n onMouseLeave: () => setHoverControl(false),\n onMouseEnter: () => setHoverControl(true),\n }),\n [setHoverControl]\n );\n\n const controlVisible = showControl || open || showMore || hoverControl;\n\n useHotkeys('s', () => (state.hostStream ? stopShare() : share()), [state.hostStream]);\n useHotkeys(\n 'f',\n () => {\n if (selectedStream) {\n videoElement?.requestFullscreen();\n }\n },\n [videoElement, selectedStream]\n );\n useHotkeys('c', copyLink);\n useHotkeys(\n 'h',\n () => {\n if (state.clientStreams !== undefined && state.clientStreams.length > 0) {\n const currentStreamIndex = state.clientStreams.findIndex(\n ({id}) => id === selectedStream\n );\n const nextIndex =\n currentStreamIndex === state.clientStreams.length - 1\n ? 0\n : currentStreamIndex + 1;\n setSelectedStream(state.clientStreams[nextIndex].id);\n }\n },\n [state.clientStreams, selectedStream]\n );\n useHotkeys(\n 'l',\n () => {\n if (state.clientStreams !== undefined && state.clientStreams.length > 0) {\n const currentStreamIndex = state.clientStreams.findIndex(\n ({id}) => id === selectedStream\n );\n const previousIndex =\n currentStreamIndex === 0\n ? state.clientStreams.length - 1\n : currentStreamIndex - 1;\n setSelectedStream(state.clientStreams[previousIndex].id);\n }\n },\n [state.clientStreams, selectedStream]\n );\n\n const videoClasses = () => {\n switch (videoDisplayMode) {\n case VideoDisplayMode.FitToWindow:\n return `${classes.video} ${classes.videoWindowFit}`;\n case VideoDisplayMode.OriginalSize:\n return `${classes.video}`;\n case VideoDisplayMode.FitWidth:\n return `${classes.video} ${classes.videoWindowWidth}`;\n case VideoDisplayMode.FitHeight:\n return `${classes.video} ${classes.videoWindowHeight}`;\n }\n };\n\n return (\n
\n {controlVisible && (\n \n \n \n {state.id}\n \n \n \n )}\n\n {stream ? (\n
\n }\n arrow\n >\n \n \n \n \n \n \n videoElement?.requestFullscreen()}\n disabled={!selectedStream}\n size=\"large\"\n >\n \n \n \n \n\n \n setShowMore(e.currentTarget)} size=\"large\">\n \n \n \n\n setShowMore(undefined)}\n >\n setShowDisplayOptions(e.currentTarget)}>\n Display Mode\n \n\n {\n setShowMore(undefined);\n setOpen(true);\n }}\n >\n Change Name\n \n \n\n setShowDisplayOptions(undefined)}\n anchorOrigin={{horizontal: 'right', vertical: 'center'}}\n >\n {\n setVideoDisplayMode(VideoDisplayMode.FitToWindow);\n setShowDisplayOptions(undefined);\n setShowMore(undefined);\n }}\n >\n Fit to window\n \n {\n setVideoDisplayMode(VideoDisplayMode.FitWidth);\n setShowDisplayOptions(undefined);\n setShowMore(undefined);\n }}\n >\n Fit width\n \n {\n setVideoDisplayMode(VideoDisplayMode.FitHeight);\n setShowDisplayOptions(undefined);\n setShowMore(undefined);\n }}\n >\n Fit height\n \n {\n setVideoDisplayMode(VideoDisplayMode.OriginalSize);\n setShowDisplayOptions(undefined);\n setShowMore(undefined);\n }}\n >\n Original size\n \n \n \n )}\n\n
\n {state.clientStreams\n .filter(({id}) => id !== selectedStream)\n .map((client) => {\n return (\n setSelectedStream(client.id)}\n >\n \n \n {state.users.find(({id}) => client.peer_id === id)?.name ??\n 'unknown'}\n \n \n );\n })}\n {state.hostStream && selectedStream !== HostStream && (\n setSelectedStream(HostStream)}\n >\n
\n\n setOpen(false)}>\n Change Name\n \n
\n setNameInput(e.target.value)}\n fullWidth\n />\n\n setPermanent(checked)}\n />\n }\n label=\"Remember\"\n />\n \n
\n \n \n \n \n
\n \n );\n};\n\nconst useShowOnMouseMovement = (doShow: (s: boolean) => void) => {\n const timeoutHandle = React.useRef(0);\n\n React.useEffect(() => {\n const update = () => {\n if (timeoutHandle.current === 0) {\n doShow(true);\n }\n\n clearTimeout(timeoutHandle.current);\n timeoutHandle.current = window.setTimeout(() => {\n timeoutHandle.current = 0;\n doShow(false);\n }, 1000);\n };\n window.addEventListener('mousemove', update);\n return () => window.removeEventListener('mousemove', update);\n }, [doShow]);\n\n React.useEffect(\n () =>\n void (timeoutHandle.current = window.setTimeout(() => {\n timeoutHandle.current = 0;\n doShow(false);\n }, 1000)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n};\n\nconst useStyles = makeStyles((theme: Theme) => ({\n title: {\n padding: 15,\n position: 'fixed',\n background: theme.palette.background.paper,\n top: '30px',\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 30,\n },\n bottomContainer: {\n position: 'fixed',\n display: 'flex',\n bottom: 0,\n right: 0,\n zIndex: 20,\n },\n control: {\n padding: 15,\n position: 'fixed',\n background: theme.palette.background.paper,\n bottom: '30px',\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 30,\n },\n video: {\n position: 'absolute',\n\n '&::-webkit-media-controls-start-playback-button': {\n display: 'none!important',\n },\n '&::-webkit-media-controls': {\n display: 'none!important',\n },\n },\n smallVideo: {\n minWidth: '100%',\n minHeight: '100%',\n width: 'auto',\n maxWidth: '300px',\n\n maxHeight: '200px',\n },\n videoWindowFit: {\n width: '100%',\n height: '100%',\n\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%,-50%)',\n },\n videoWindowWidth: {\n height: 'auto',\n width: '100%',\n },\n videoWindowHeight: {\n height: '100%',\n width: 'auto',\n },\n smallVideoLabel: {\n position: 'absolute',\n display: 'block',\n bottom: 0,\n background: 'rgba(0,0,0,.5)',\n padding: '5px 15px',\n },\n noMaxWidth: {\n maxWidth: 'none',\n },\n smallVideoContainer: {\n height: '100%',\n padding: 5,\n maxHeight: 200,\n maxWidth: 400,\n width: '100%',\n },\n videoContainer: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: '100%',\n height: '100%',\n\n overflow: 'auto',\n\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n}));\n","import * as gen from 'unique-names-generator';\n\nconst roomConfig: gen.Config = {\n dictionaries: [gen.adjectives, gen.colors, gen.animals],\n length: 3,\n separator: '-',\n};\nexport const randomRoomName = () => gen.uniqueNamesGenerator(roomConfig);\n\nexport const getPermanentName = () => localStorage.getItem('screego_name') ?? undefined;\nexport const setPermanentName = (name: string) => localStorage.setItem('screego_name', name);\n","import React from 'react';\n\nexport const getRoomFromURL = (search: string): string | undefined =>\n search\n .slice(1)\n .split('&')\n .find((param) => param.startsWith('room='))\n ?.split('=')[1];\n\nexport const useRoomID = (): [string | undefined, (v?: string) => void] => {\n const [state, setState] = React.useState(() =>\n getRoomFromURL(window.location.search)\n );\n React.useEffect(() => {\n const onChange = (): void => setState(getRoomFromURL(window.location.search));\n window.addEventListener('popstate', onChange);\n return () => window.removeEventListener('popstate', onChange);\n }, [setState]);\n return [\n state,\n React.useCallback(\n (id) =>\n setState((oldId?: string) => {\n if (oldId !== id) {\n window.history.pushState({roomId: id}, '', id ? `?room=${id}` : '?');\n }\n return id;\n }),\n [setState]\n ),\n ];\n};\n","export default __webpack_public_path__ + \"static/media/logo.cd44afc0.svg\";","import {UseConfig} from './useConfig';\nimport React from 'react';\nimport {\n Box,\n Button,\n ButtonProps,\n CircularProgress,\n FormControl,\n TextField,\n Typography,\n} from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport {green} from '@mui/material/colors';\n\nexport const LoginForm = ({config: {login}, hide}: {config: UseConfig; hide?: () => void}) => {\n const [user, setUser] = React.useState('');\n const [pass, setPass] = React.useState('');\n const [loading, setLoading] = React.useState(false);\n const submit = async (event: {preventDefault: () => void}) => {\n event.preventDefault();\n setLoading(true);\n login(user, pass)\n .then(() => {\n setLoading(false);\n })\n .catch(() => setLoading(false));\n };\n return (\n
\n \n
\n
\n Login to Screego\n {hide ? (\n \n ) : undefined}\n
\n setUser(e.target.value)}\n label=\"Username\"\n size=\"small\"\n margin=\"dense\"\n />\n setPass(e.target.value)}\n label=\"Password\"\n size=\"small\"\n margin=\"dense\"\n />\n \n \n Login\n \n \n \n
\n
\n );\n};\n\nexport const LoadingButton = ({loading, children, ...props}: ButtonProps & {loading: boolean}) => {\n const classes = useStyles();\n return (\n \n );\n};\n\nconst useStyles = makeStyles(() => ({\n buttonProgress: {\n color: green[500],\n position: 'absolute',\n top: '50%',\n left: '50%',\n marginTop: -12,\n marginLeft: -12,\n },\n}));\n","import React from 'react';\nimport {\n Box,\n Button,\n Checkbox,\n FormControl,\n FormControlLabel,\n Grid,\n Paper,\n TextField,\n Typography,\n Link,\n} from '@mui/material';\nimport {FCreateRoom, UseRoom} from './useRoom';\nimport {RoomMode, UIConfig} from './message';\nimport {randomRoomName} from './name';\nimport {getRoomFromURL} from './useRoomID';\nimport logo from './logo.svg';\nimport {UseConfig} from './useConfig';\nimport {LoginForm} from './LoginForm';\n\nconst defaultMode = (authMode: UIConfig['authMode'], loggedIn: boolean): RoomMode => {\n if (loggedIn) {\n return RoomMode.Turn;\n }\n switch (authMode) {\n case 'all':\n return RoomMode.Turn;\n case 'turn':\n return RoomMode.Stun;\n case 'none':\n default:\n return RoomMode.Turn;\n }\n};\n\nconst CreateRoom = ({room, config}: Pick & {config: UIConfig}) => {\n const [id, setId] = React.useState(\n () => getRoomFromURL(window.location.search) ?? randomRoomName()\n );\n const mode = defaultMode(config.authMode, config.loggedIn);\n const [ownerLeave, setOwnerLeave] = React.useState(config.closeRoomWhenOwnerLeaves);\n const submit = () =>\n room({\n type: 'create',\n payload: {\n mode,\n closeOnOwnerLeave: ownerLeave,\n id: id || undefined,\n },\n });\n return (\n
\n \n setId(e.target.value)}\n label=\"id\"\n margin=\"dense\"\n />\n setOwnerLeave(checked)}\n />\n }\n label=\"Close Room after you leave\"\n />\n \n \n Nat Traversal via:{' '}\n \n {mode.toUpperCase()}\n \n \n \n \n \n
\n );\n};\n\nexport const RoomManage = ({room, config}: {room: FCreateRoom; config: UseConfig}) => {\n const [showLogin, setShowLogin] = React.useState(false);\n\n const canCreateRoom = config.authMode !== 'all';\n const loginVisible = !config.loggedIn && (showLogin || !canCreateRoom);\n\n return (\n \n \n \n \"logo\"\n \n \n {loginVisible ? (\n setShowLogin(false) : undefined}\n />\n ) : (\n <>\n \n Hello {config.user}!{' '}\n {config.loggedIn ? (\n \n ) : (\n setShowLogin(true)}\n >\n Login\n \n )}\n \n\n \n \n )}\n \n \n
\n Screego {config.version} |{' '}\n GitHub\n
\n \n );\n};\n","const {port, hostname, protocol, pathname} = window.location;\nconst slashes = protocol.concat('//');\nconst path = pathname.endsWith('/') ? pathname : pathname.substring(0, pathname.lastIndexOf('/'));\nconst url = slashes.concat(port ? hostname.concat(':', port) : hostname) + path;\nexport const urlWithSlash =\n process.env.NODE_ENV === 'development'\n ? 'http://localhost:5050/'\n : url.endsWith('/')\n ? url\n : url.concat('/');\n","import React from 'react';\nimport {\n ICEServer,\n IncomingMessage,\n JoinRoom,\n OutgoingMessage,\n RoomCreate,\n RoomInfo,\n} from './message';\nimport {getPermanentName} from './name';\nimport {urlWithSlash} from './url';\nimport {useSnackbar} from 'notistack';\nimport {useRoomID} from './useRoomID';\n\nexport type RoomState = false | ConnectedRoom;\nexport type ConnectedRoom = {\n ws: WebSocket;\n hostStream?: MediaStream;\n clientStreams: ClientStream[];\n} & RoomInfo;\n\ninterface ClientStream {\n id: string;\n peer_id: string;\n stream: MediaStream;\n}\n\nexport interface UseRoom {\n state: RoomState;\n room: FCreateRoom;\n share: () => void;\n setName: (name: string) => void;\n stopShare: () => void;\n}\n\nconst relayConfig: Partial =\n window.location.search.indexOf('forceTurn=true') !== -1 ? {iceTransportPolicy: 'relay'} : {};\n\nconst hostSession = async ({\n sid,\n ice,\n send,\n done,\n stream,\n}: {\n sid: string;\n ice: ICEServer[];\n send: (e: OutgoingMessage) => void;\n done: () => void;\n stream: MediaStream;\n}): Promise => {\n const peer = new RTCPeerConnection({...relayConfig, iceServers: ice});\n peer.onicecandidate = (event) => {\n if (!event.candidate) {\n return;\n }\n send({type: 'hostice', payload: {sid: sid, value: event.candidate}});\n };\n\n peer.onconnectionstatechange = (event) => {\n console.log('host change', event);\n if (\n peer.connectionState === 'closed' ||\n peer.connectionState === 'disconnected' ||\n peer.connectionState === 'failed'\n ) {\n peer.close();\n done();\n }\n };\n\n stream.getTracks().forEach((track) => peer.addTrack(track, stream));\n\n const hostOffer = await peer.createOffer({offerToReceiveVideo: true});\n await peer.setLocalDescription(hostOffer);\n send({type: 'hostoffer', payload: {value: hostOffer, sid: sid}});\n\n return peer;\n};\n\nconst clientSession = async ({\n sid,\n ice,\n send,\n done,\n onTrack,\n}: {\n sid: string;\n ice: ICEServer[];\n send: (e: OutgoingMessage) => void;\n onTrack: (s: MediaStream) => void;\n done: () => void;\n}): Promise => {\n console.log('ice', ice);\n const peer = new RTCPeerConnection({...relayConfig, iceServers: ice});\n peer.onicecandidate = (event) => {\n if (!event.candidate) {\n return;\n }\n send({type: 'clientice', payload: {sid: sid, value: event.candidate}});\n };\n peer.onconnectionstatechange = (event) => {\n console.log('client change', event);\n if (\n peer.connectionState === 'closed' ||\n peer.connectionState === 'disconnected' ||\n peer.connectionState === 'failed'\n ) {\n peer.close();\n done();\n }\n };\n peer.ontrack = (event) => {\n const stream = new MediaStream();\n stream.addTrack(event.track);\n onTrack(stream);\n };\n\n return peer;\n};\n\nexport type FCreateRoom = (room: RoomCreate | JoinRoom) => Promise;\n\nexport const useRoom = (): UseRoom => {\n const [roomID, setRoomID] = useRoomID();\n const {enqueueSnackbar} = useSnackbar();\n const conn = React.useRef();\n const host = React.useRef>({});\n const client = React.useRef>({});\n const stream = React.useRef();\n\n const [state, setState] = React.useState(false);\n\n const room: FCreateRoom = React.useCallback(\n (create) => {\n return new Promise((resolve) => {\n const ws = (conn.current = new WebSocket(\n urlWithSlash.replace('http', 'ws') + 'stream'\n ));\n const send = (message: OutgoingMessage) => {\n if (ws.readyState === ws.OPEN) ws.send(JSON.stringify(message));\n };\n let first = true;\n ws.onmessage = (data) => {\n const event: IncomingMessage = JSON.parse(data.data);\n if (first) {\n first = false;\n if (event.type === 'room') {\n resolve();\n enqueueSnackbar(create.type === 'join' ? 'Joined' : 'Room Created', {\n variant: 'success',\n });\n setState({ws, ...event.payload, clientStreams: []});\n setRoomID(event.payload.id);\n } else {\n resolve();\n enqueueSnackbar('Unknown Event: ' + event.type, {variant: 'error'});\n ws.close(1000, 'received unknown event');\n }\n return;\n }\n\n switch (event.type) {\n case 'room':\n setState((current) =>\n current ? {...current, ...event.payload} : current\n );\n return;\n case 'hostsession':\n if (!stream.current) {\n return;\n }\n hostSession({\n sid: event.payload.id,\n stream: stream.current!,\n ice: event.payload.iceServers,\n send,\n done: () => delete host.current[event.payload.id],\n }).then((peer) => {\n host.current[event.payload.id] = peer;\n });\n return;\n case 'clientsession':\n const {id: sid, peer} = event.payload;\n clientSession({\n sid,\n send,\n ice: event.payload.iceServers,\n done: () => {\n delete client.current[sid];\n setState((current) =>\n current\n ? {\n ...current,\n clientStreams: current.clientStreams.filter(\n ({id}) => id !== sid\n ),\n }\n : current\n );\n },\n onTrack: (stream) =>\n setState((current) =>\n current\n ? {\n ...current,\n clientStreams: [\n ...current.clientStreams,\n {\n id: sid,\n stream,\n peer_id: peer,\n },\n ],\n }\n : current\n ),\n }).then((peer) => (client.current[event.payload.id] = peer));\n return;\n case 'clientice':\n host.current[event.payload.sid]?.addIceCandidate(event.payload.value);\n return;\n case 'clientanswer':\n host.current[event.payload.sid]?.setRemoteDescription(\n event.payload.value\n );\n return;\n case 'hostoffer':\n (async () => {\n await client.current[event.payload.sid]?.setRemoteDescription(\n event.payload.value\n );\n const answer = await client.current[\n event.payload.sid\n ]?.createAnswer();\n await client.current[event.payload.sid]?.setLocalDescription(\n answer\n );\n send({\n type: 'clientanswer',\n payload: {sid: event.payload.sid, value: answer},\n });\n })();\n return;\n case 'hostice':\n client.current[event.payload.sid]?.addIceCandidate(event.payload.value);\n return;\n case 'endshare':\n client.current[event.payload]?.close();\n host.current[event.payload]?.close();\n setState((current) =>\n current\n ? {\n ...current,\n clientStreams: current.clientStreams.filter(\n ({id}) => id !== event.payload\n ),\n }\n : current\n );\n }\n };\n ws.onclose = (event) => {\n if (first) {\n resolve();\n first = false;\n }\n enqueueSnackbar(event.reason, {variant: 'error', persist: true});\n setState(false);\n };\n ws.onerror = (err) => {\n if (first) {\n resolve();\n first = false;\n }\n enqueueSnackbar(err, {variant: 'error', persist: true});\n setState(false);\n };\n ws.onopen = () => {\n create.payload.username = getPermanentName();\n send(create);\n };\n });\n },\n [setState, enqueueSnackbar, setRoomID]\n );\n\n const share = async () => {\n if (!navigator.mediaDevices) {\n enqueueSnackbar(\n 'Could not start presentation. (mediaDevices undefined) Are you using https?',\n {\n variant: 'error',\n persist: true,\n }\n );\n return;\n }\n stream.current = await navigator.mediaDevices\n // @ts-ignore\n .getDisplayMedia({video: true});\n stream.current?.getVideoTracks()[0].addEventListener('ended', () => stopShare());\n setState((current) => (current ? {...current, hostStream: stream.current} : current));\n\n conn.current?.send(JSON.stringify({type: 'share', payload: {}}));\n };\n\n const stopShare = async () => {\n Object.values(host.current).forEach((peer) => {\n peer.close();\n });\n host.current = {};\n stream.current?.getTracks().forEach((track) => track.stop());\n stream.current = undefined;\n conn.current?.send(JSON.stringify({type: 'stopshare', payload: {}}));\n setState((current) => (current ? {...current, hostStream: undefined} : current));\n };\n\n const setName = (name: string): void => {\n conn.current?.send(JSON.stringify({type: 'name', payload: {username: name}}));\n };\n\n React.useEffect(() => {\n if (roomID) {\n room({type: 'join', payload: {id: roomID}});\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {state, room, share, stopShare, setName};\n};\n","import React from 'react';\n\nexport const Video = ({src, className}: {src: MediaStream; className?: string}) => {\n const [element, setElement] = React.useState(null);\n\n React.useEffect(() => {\n if (element) {\n element.srcObject = src;\n element.play();\n }\n }, [element, src]);\n\n return