{"version":3,"sources":["polyfills.ts","Launch.tsx","Log.ts","App.tsx","serviceWorker.ts","index.tsx"],"names":["window","process","client","clientConfig","LaunchView","props","id","style","display","justifyContent","alignItems","width","height","description","Button","size","color","circular","icon","onClick","Launch","LoggerProvider","getLogger","ClientOptions","LaunchType","ProjectId","ModelId","Version","EnvironmentId","Endpoint","ForceRelay","UseNativeTouchEvents","UsePointerLock","PointerLockRelease","Resolution","this","LoadingView","StreamerStatus","Connected","Completed","NotSupported","content","LaunchRequestStatus","status","LaunchStatusType","Unavailable","Error","Failed","src","alt","maxWidth","maxHeight","textAlign","EmbeddedView","videoRef","useRef","handle","useFullScreenHandle","isIPhone","System","Browser","os","navigator","userAgent","includes","Status","WarningThreshold","ExitThreshold","WarningCallback","exit","ExitCallback","location","reload","VideoRef","Emitter","InputEmitter","Stream","VideoStream","streamResolutionConfiguration","enter","position","top","right","className","active","Icon","name","audio","Audio","autoplay","volume","query","qs","search","clientOptions","launchType","endpoint","projectId","modelId","version","environmentId","resolution","fhd","undefined","usePointerLock","pointerLockRelease","useNativeTouchEvents","platform","PlatformNext","initialize","App","useState","modelDefinitionUnavailable","setModelDefinitionUnavailable","UndefinedModelDefinition","modelDefinition","setModelDefinition","availableModels","setAvailableModels","launchRequestError","setLaunchRequestError","streamerOptions","DefaultStreamerOptions","useAsyncEffect","logger","info","useAnonymousCredentials","connect","agent","iceServers","serviceCredentials","forceRelay","getModels","models","debug","error","useEffect","length","selectedModels","filter","model","launchRequestOptions","regionOverride","virtualizationProviderOverride","useLaunchRequest","launchRequest","queueLaunchRequest","useStreamer","streamerStatus","emitter","videoStream","audioStream","messageSubject","loading","setLoading","disconnect","srcObject","launch","load","subscription","subscribe","value","err","unsubscribe","isValid","overflow","Disconnected","Withdrawn","href","AppWrapper","IsBrowserSupported","Boolean","hostname","match","ReactDOM","render","document","getElementById","serviceWorker","ready","then","registration","unregister"],"mappings":"2vBAEAA,OAAgB,QAAIC,E,4MCGdC,EAAqBC,EAWdC,EAAoC,SAACC,GAChD,OACE,qBAAKC,GAAG,kBAAkBC,MAAO,CAC/BC,QAAS,OACTC,eAAgB,SAChBC,WAAY,SACZC,MAAO,OACPC,OAAQ,QAER,SACA,gCACE,6BAAKV,EAAOW,cAEZ,cAACC,EAAA,EAAM,CAACC,KAAK,UAAUC,MAAM,OAAOC,UAAQ,EAACC,KAAK,OAAOC,QAAS,kBAAMd,EAAMe,QAAQ,QAK9F,ECjCeC,mBAAeC,UAAU,UC8ClCpB,EAAqBC,EAerBoB,EAAa,iDAEjBC,gBAAU,OAGVC,eAAS,OACTC,aAAO,OACPC,aAAO,OACPC,mBAAa,OACbC,cAAQ,OAGRC,YAAa,EAAM,KACnBC,0BAAoB,OACpBC,oBAAc,OACdC,wBAAkB,OAClBC,gBAAU,EAUT,OAVS,oCAEV,WACE,QAAKC,KAAKV,aAGLU,KAAKT,OAIZ,KAAC,EA1BgB,GAkCbU,EAAsC,SAAC/B,GAC3C,OAAIA,EAAMgC,iBAAmBA,iBAAeC,WAAajC,EAAMgC,iBAAmBA,iBAAeE,UACxF,yBAKLlC,EAAMgC,iBAAmBA,iBAAeG,eAC1CC,EACE,8BACE,6BAAI,wEASRA,EAJApC,EAAMqC,oBAAoBC,SAAWC,mBAAiBC,aACtDxC,EAAMqC,oBAAoBC,SAAWC,mBAAiBE,OACtDzC,EAAMgC,iBAAmBA,iBAAeU,OAGtC,gCACE,6BAAI,6CACJ,6BAAI,gDAKN,qBACExC,MAAO,CACLC,QAAS,OACTC,eAAgB,SAChBC,WAAY,SACZC,MAAO,OACPC,OAAQ,QAER,SAEF,qBACEoC,IAAI,cACJC,IAAI,kBACJ1C,MAAO,CACL2C,SAAU,OACVC,UAAW,OACXxC,MAAO,OACPC,OAAQ,YAQhB,qBACAL,MAAO,CACLC,QAAS,OACTC,eAAgB,SAChBC,WAAY,SACZC,MAAO,OACPC,OAAQ,QAEN,SACF,qBAAKL,MAAO,CAAE6C,UAAW,UAAW,SAAEX,OAxD1C,IAAIA,CA2DN,EAaMY,EAAoC,SAAChD,GACzC,IAAMiD,EAAWC,iBAAyB,MACpCC,EAASC,cAETC,EAAmC,QAAxBC,SAAOC,UAAUC,KAAiB7D,OAAO8D,UAAUC,UAAUC,SAAS,QACvF,OACE,qBAAKzD,MAAO,CAAEK,OAAQ,QAAS,SAC7B,eAAC,IAAU,CAAC4C,OAAQA,EAAO,UACzB,cAAC,cAAW,CACVS,OAAQ5D,EAAMgC,eACd6B,iBAAkB,IAClBC,cAAe,IACfC,gBAAiBZ,EAAOa,KACxBC,aAAc,kBAAMtE,OAAOuE,SAASC,QAAQ,IAG9C,cAAC,EAAW,CAAC9B,oBAAqBrC,EAAMqC,oBAAqBL,eAAgBhC,EAAMgC,iBACnF,cAAC,cAAW,CACVoC,SAAUnB,EACVoB,QAASrE,EAAMsE,aACfC,OAAQvE,EAAMwE,YACd9C,qBAAsB1B,EAAM0B,qBAC5BC,eAAgB3B,EAAM2B,eACtBC,mBAAoB5B,EAAM4B,mBAC1BC,WAAY4C,wCAA8BzE,EAAM6B,cAGlD,cAACpB,EAAA,EAAM,CACLK,QAASqC,EAAOuB,MAChBxE,MAAO,CAAEyE,SAAU,WAAYC,IAAK,GAAIC,MAAO,IAC/CC,UAAWzB,GAAYF,EAAO4B,QAAU/E,EAAMgC,iBAAmBA,iBAAeC,UAAY,SAAW,GAAG,SAC1G,cAAC+C,EAAA,EAAI,CAACC,KAAK,iBAOrB,EAMMC,EAAQ,IAAIC,MAClBD,EAAME,UAAW,EACjBF,EAAMG,OAAS,GAGf,IAAMC,EAAQC,QAAS5F,OAAOuE,SAASsB,QACjCC,EAA+B,IAAIvE,EACzCuE,EAActE,WAAiC,QAAvB,EAAImE,EAAkB,kBAAC,QAAezF,EAAO6F,WACjEJ,EAAqB,eAA+B,QAA1BA,EAAqB,gBACjDG,EAActE,WAAa,SAG7BsE,EAAcjE,SAA6B,QAArB,EAAI8D,EAAgB,gBAAC,QAAezF,EAAO8F,SACjEF,EAAcrE,UAA+B,QAAtB,EAAIkE,EAAiB,iBAAC,QAAezF,EAAO+F,UACnEH,EAAcpE,QAA2B,QAApB,EAAIiE,EAAe,eAAC,QAAezF,EAAOgG,QAC/DJ,EAAcnE,QAA2B,QAApB,EAAIgE,EAAe,eAAC,QAAezF,EAAOiG,QAC/DL,EAAclE,cAAuC,QAA1B,EAAI+D,EAAqB,qBAAC,QAAezF,EAAOkG,cAC3EN,EAAc5D,WAAiC,QAAvB,EAAIyD,EAAkB,kBAAC,QAAmBzF,EAAOmG,WACzEP,EAAc5D,WAAqC,QAA3B,EAAG4D,EAAc5D,kBAAU,QAAIA,aAAWoE,IAElER,EAAc9D,eACuF,QADzE,OACGuE,IAA5BZ,EAAsB,eAAkBzF,EAAOsG,eAA6C,SAA5Bb,EAAsB,sBAAY,SAErGG,EAAc7D,mBACmG,QADjF,OACGsE,IAAhCZ,EAA0B,mBAAkBzF,EAAOuG,mBAAqD,SAAhCd,EAA0B,0BAAY,SAGjHG,EAAchE,WAA8C,QAApC,OAA2ByE,IAAxBZ,EAAkB,kBAAe,SAC5DG,EAAc/D,qBAGgC,QAHZ,OACGwE,IAAlCZ,EAA4B,qBACzBzF,EAAOwG,qBAC2B,SAAlCf,EAA4B,4BAAY,SAE9C,IAAMgB,EAAW,IAAIC,eACrBD,EAASE,WAAW,CAAEb,SAAUF,EAAcjE,UAAY,2BAE1D,IAAMiF,EAAgB,WACpB,MAAoEC,oBAAS,GAAM,mBAA5EC,EAA0B,KAAEC,EAA6B,KAChE,EAA8CF,mBAAS,IAAIG,4BAA2B,mBAA/EC,EAAe,KAAEC,EAAkB,KAC1C,EAA8CL,qBAA6B,mBAApEM,EAAe,KAAEC,EAAkB,KAC1C,EAAoDP,qBAAiB,mBAA9DQ,EAAkB,KAAEC,EAAqB,KAC1CC,EAAkBC,yBAExBC,IAAc,gCAAC,kGACT7B,EAAcrE,UAAU,CAAD,gBACgD,OAAzEmG,EAAOC,KAAK,kCAAoC/B,EAAcrE,WAAW,kBAEjEkF,EAASmB,wBAAwBhC,EAAcrE,UAAWqE,EAAclE,eAAe,KAAD,kBACtF+E,EAASoB,UAAU,KAAD,EAG8B,OAFtDH,EAAOC,KAAK,oBAAsBlB,EAASqB,MAAM1H,IACjDmH,EAAgBQ,WAAatB,EAASqB,MAAME,mBAAmBD,WAC/DR,EAAgBU,WAAarC,EAAchE,WAAW,UACjC6E,EAASyB,YAAY,KAAD,GAAnCC,EAAM,OACZf,EAAmBe,GACnBT,EAAOU,MAAM,mBAAoBD,GAAQ,kDAEzCT,EAAOW,MAAM,EAAD,IAAM,0DAGrB,CAACzC,IAEJ0C,qBAAU,WACR,GAAmB,OAAfnB,QAAe,IAAfA,KAAiBoB,OAAQ,CAC3B,IAAMC,EAAiBrB,EAAgBsB,QAAO,SAAUC,GACtD,GAAI9C,EAAcpE,UAAYkH,EAAMtI,GAAI,CAEtC,GAAIwF,EAAcnE,SAAWmE,EAAcnE,UAAYiH,EAAMzC,QAC3D,OAAO,EAGT,IAAKL,EAAcnE,SAAWiH,EAAMxD,OAClC,OAAO,CAEX,CACA,OAAO,CACT,IACkB,OAAdsD,QAAc,IAAdA,KAAgBD,OAClBrB,EAAmBsB,EAAe,IAElCzB,GAA8B,EAElC,CACF,GAAG,CAACI,IAEJ,IAAMwB,EAA6C,CACjDC,eAAgBnD,EAAsB,eACtCoD,+BAAgCpD,EAAsC,gCAExE,EAAoDqD,2BAAiBrC,EAAUQ,EAAiB0B,GAAqB,mBAA9GlG,EAAM,KAAEsG,EAAa,KAAEC,EAAkB,KAChD,EAA4EC,sBAC1ExC,EACAsC,EACAxB,GACD,mBAJM2B,EAAc,KAAEC,EAAO,KAAEC,EAAW,KAAEC,EAAW,KAAEC,EAAc,KAKxE,EAA8BzC,oBAAS,GAAM,mBAAtC0C,EAAO,KAAEC,EAAU,KAE1BlB,qBAAU,WACJY,IAAmB/G,iBAAeU,QACpC4D,EAASgD,YAEb,GAAG,CAACP,IAEAG,IACFhE,EAAMqE,UAAYL,GAGpB,IAAMM,EAAM,iDAAG,wFAEA,GADbH,GAAW,GACXnE,EAAMuE,OAE2B,UAA7BhE,EAActE,WAAsB,0CAE9B0H,IAAqB,KAAD,kDAE1B1B,EAAsB,EAAD,IAAM,yDAGhC,kBAXW,mCAmCZ,OArBAgB,qBAAU,WACRZ,EAAOC,KAAK,SAAUlF,EAAQyG,EAChC,GAAG,CAACzG,EAAQyG,IAGZZ,qBAAU,WACR,IAAMuB,EAAeP,EAAeQ,WAClC,SAACC,GACCrC,EAAOC,KAAK,YAAcoC,EAC5B,IACA,SAACC,GACCtC,EAAOW,MAAM2B,EACf,IAGF,OAAO,WACLH,EAAaI,aACf,CACF,GAAG,CAACX,IAGC1D,EAAcsE,UAoBfpD,EAEA,qBACEzG,MAAO,CACLC,QAAS,OACTI,OAAQ,OACRyJ,SAAU,OACVjH,UAAW,SACX1C,WAAY,SACZD,eAAgB,UAChB,SACF,+BAAM,uDAKR8G,EAEA,qBACEhH,MAAO,CACLC,QAAS,OACTI,OAAQ,OACRyJ,SAAU,OACVjH,UAAW,SACX1C,WAAY,SACZD,eAAgB,UAChB,SACF,+BAGM,yIAOR2I,IAAmB/G,iBAAeiI,aAElC,qBACE/J,MAAO,CACLC,QAAS,OACTI,OAAQ,OACRyJ,SAAU,OACVjH,UAAW,SACX1C,WAAY,SACZD,eAAgB,UAChB,SACF,6BAAI,+BAKN2I,IAAmB/G,iBAAeU,OAElC,sBACExC,MAAO,CACLC,QAAS,OACTI,OAAQ,OACRyJ,SAAU,OACVjH,UAAW,SACX1C,WAAY,SACZD,eAAgB,UAChB,UACF,6BAAI,0BACJ,6BAAI,+CAKN2I,IAAmB/G,iBAAekI,UAElC,qBACEhK,MAAO,CACLC,QAAS,OACTI,OAAQ,OACRyJ,SAAU,OACVjH,UAAW,SACX1C,WAAY,SACZD,eAAgB,UAChB,SACF,6BAAI,sCAKNgJ,EAEA,cAAC,EAAY,CACX5E,YAAayE,EACbjH,eAAgB+G,EAChB1G,oBAAqBC,EACrBgC,aAAc0E,EACdtH,qBAAsB+D,EAAc/D,qBACpCC,eAAgB8D,EAAc9D,eAC9BC,mBAAoB6D,EAAc7D,mBAClCC,WAAY4D,EAAc5D,aAGQ,UAA7B4D,EAActE,YAA2B6F,EAcZ,UAA7BvB,EAActE,YAA0C,OAAf6F,QAAe,IAAfA,KAAiBoB,OAe5D,cAAC,EAAU,CAACrH,OAAQyI,IAbzB,qBACEtJ,MAAO,CACLC,QAAS,OACTI,OAAQ,OACRyJ,SAAU,OACVjH,UAAW,SACX1C,WAAY,SACZD,eAAgB,UAChB,SACF,6BAAI,6DAvBN,qBACEF,MAAO,CACLC,QAAS,OACTI,OAAQ,OACRyJ,SAAU,OACVjH,UAAW,SACX1C,WAAY,SACZD,eAAgB,UAChB,SACF,6BAAI,sBAhIN,qBACEF,MAAO,CACLC,QAAS,OACTI,OAAQ,OACRyJ,SAAU,OACVjH,UAAW,SACX1C,WAAY,SACZD,eAAgB,UAChB,SACF,8BAAG,uEACoE,IACrE,mBAAG+J,KAAK,qEAAoE,SAAC,aAAY,4DAyInG,EAYeC,EAVc,WAC3B,OAAO9G,SAAO+G,qBACZ,cAAC,EAAG,IAEJ,qBAAKvF,UAAU,sCAAqC,SAClD,oBAAIA,UAAU,SAAQ,SAAC,2CAG7B,EC1foBwF,QACW,cAA7B3K,OAAOuE,SAASqG,UAEe,UAA7B5K,OAAOuE,SAASqG,UAEhB5K,OAAOuE,SAASqG,SAASC,MAAM,2D,cCRnCC,IAASC,OAAO,cAAC,EAAG,IAAKC,SAASC,eAAe,SDkH3C,kBAAmBnH,WACrBA,UAAUoH,cAAcC,MAAMC,MAAK,SAACC,GAClCA,EAAaC,YACf,G","file":"static/js/main.a21299b8.chunk.js","sourcesContent":["// Workaround: https://github.com/graphql/graphql-js/issues/1536\nimport * as process from 'process';\nwindow['process'] = process;\nexport {};\n","import React from 'react';\nimport { Button } from 'semantic-ui-react';\n\nimport './Launch.css';\nimport clientConfig from './client.json';\nconst client: ClientJson = clientConfig as ClientJson;\n\nclass ClientJson {\n description?: string = 'description';\n title?: string = 'title';\n}\n\ninterface LaunchProps {\n Launch: () => void;\n}\n\nexport const LaunchView: React.FC = (props: LaunchProps) => {\n return (\n
\n
\n

{client.description}

\n \n \n
\n \n
\n );\n};\n","import { LoggerProvider } from \"@pureweb/platform-sdk\";\nexport default LoggerProvider.getLogger(\"client\");\n","/**\n * This reference template is designed to showcase the elements used to construct your own\n * application.\n * \n * When developing take care to:\n * - Retain user interaction to begin audio.\n * - Understand video sizing and mobile screen orientation.\n \n * See attached documentation for reference. Contact support@pureweb.com with any questions.\n * \n *\n * Copyright (C) PureWeb 2020\n */\n\nimport {\n LaunchStatusEvent,\n LaunchStatusType,\n ModelDefinition,\n PlatformNext,\n UndefinedModelDefinition,\n InputEmitter,\n DefaultStreamerOptions,\n StreamerStatus,\n Resolution,\n streamResolutionConfiguration\n} from '@pureweb/platform-sdk';\n\nimport {\n useStreamer,\n useLaunchRequest,\n IdleTimeout,\n LaunchRequestOptions,\n VideoStream,\n System\n} from '@pureweb/platform-sdk-react';\n\nimport * as qs from 'query-string';\nimport React, { useEffect, useState, useRef } from 'react';\nimport { FullScreen, useFullScreenHandle } from 'react-full-screen';\nimport { Button, Icon } from 'semantic-ui-react';\nimport useAsyncEffect from 'use-async-effect';\nimport './App.css';\nimport clientConfig from './client.json';\n\nimport { LaunchView } from './Launch';\nimport logger from './Log';\n\nconst client: ClientJson = clientConfig as ClientJson;\n\nclass ClientJson {\n environmentId?: string;\n launchType?: string;\n projectId?: string;\n modelId?: string;\n version?: string;\n endpoint?: string;\n usePointerLock?: boolean;\n pointerLockRelease?: boolean;\n useNativeTouchEvents?: boolean;\n resolution?: string;\n}\n\nclass ClientOptions {\n // Overridable connection options\n LaunchType?: string;\n\n // Launch queue configuration\n ProjectId?: string;\n ModelId?: string;\n Version?: string;\n EnvironmentId?: string;\n Endpoint?: string;\n\n // Overridable streamer options\n ForceRelay = false;\n UseNativeTouchEvents?: boolean;\n UsePointerLock?: boolean;\n PointerLockRelease?: boolean;\n Resolution?: Resolution;\n\n isValid(): boolean {\n if (!this.ProjectId) {\n return false;\n }\n if (!this.ModelId) {\n return false;\n }\n return true;\n }\n}\n\ninterface LoadingProps {\n LaunchRequestStatus: LaunchStatusEvent;\n StreamerStatus: StreamerStatus;\n}\n\nconst LoadingView: React.FC = (props: LoadingProps) => {\n if (props.StreamerStatus === StreamerStatus.Connected || props.StreamerStatus === StreamerStatus.Completed) {\n return
;\n }\n\n let content;\n\n if (props.StreamerStatus === StreamerStatus.NotSupported) {\n content = (\n
\n

Your browser does not support the necessary WebRTC capabilities.

\n
\n );\n }\n if (\n props.LaunchRequestStatus.status === LaunchStatusType.Unavailable ||\n props.LaunchRequestStatus.status === LaunchStatusType.Error ||\n props.StreamerStatus === StreamerStatus.Failed\n ) {\n content = (\n
\n

The experience is presently unavailable.

\n

Please refresh to request a new session.

\n
\n );\n } else {\n content = (\n \n \n
\n );\n \n }\n return (\n \n
{content}
\n \n );\n};\n\ninterface ViewProps {\n LaunchRequestStatus: LaunchStatusEvent;\n StreamerStatus: StreamerStatus;\n VideoStream: MediaStream;\n InputEmitter: InputEmitter;\n UseNativeTouchEvents: boolean;\n UsePointerLock: boolean;\n PointerLockRelease: boolean;\n Resolution: Resolution;\n}\n\nconst EmbeddedView: React.FC = (props: ViewProps) => {\n const videoRef = useRef(null);\n const handle = useFullScreenHandle();\n // Fullscreen API presently supported on iPad, but not iPhone or iPod\n const isIPhone = System.Browser().os === 'iOS' && !window.navigator.userAgent.includes('iPad');\n return (\n
\n \n window.location.reload()} // TODO: How to 'close' a contribution?\n />\n\n \n \n\n \n \n \n\n \n \n
\n );\n};\n\n// Initialize audio.\n// load() must be called from a user interaction, especially to retain iOS audio\n// this can be 'mouseup', 'touchend' or 'keypress'\n// Pass the audioStream created from useStreamer as the srcObject to play game audio.\nconst audio = new Audio();\naudio.autoplay = true;\naudio.volume = 0.5;\n\n// Parse query parameters\nconst query = qs.parse(window.location.search);\nconst clientOptions: ClientOptions = new ClientOptions();\nclientOptions.LaunchType = (query['launchType'] as string) ?? client.launchType;\nif (query['collaboration'] && query['collaboration'] == 'true') {\n clientOptions.LaunchType = 'local';\n}\n\nclientOptions.Endpoint = (query['endpoint'] as string) ?? client.endpoint;\nclientOptions.ProjectId = (query['projectId'] as string) ?? client.projectId;\nclientOptions.ModelId = (query['modelId'] as string) ?? client.modelId;\nclientOptions.Version = (query['version'] as string) ?? client.version;\nclientOptions.EnvironmentId = (query['environmentId'] as string) ?? client.environmentId;\nclientOptions.Resolution = (query['resolution'] as Resolution) ?? client.resolution;\nclientOptions.Resolution = clientOptions.Resolution ?? Resolution.fhd;\n// use client json config if usePointerLock query string parameter is undefined, else use query string parameter. Default to false if non are present\nclientOptions.UsePointerLock =\n (query['usePointerLock'] === undefined ? client.usePointerLock : query['usePointerLock'] === 'true') ?? true;\n// release the pointer lock on mouse up if true\nclientOptions.PointerLockRelease =\n (query['pointerLockRelease'] === undefined ? client.pointerLockRelease : query['pointerLockRelease'] === 'true') ??\n true;\n\nclientOptions.ForceRelay = query['forceRelay'] !== undefined ?? false;\nclientOptions.UseNativeTouchEvents =\n (query['useNativeTouchEvents'] === undefined\n ? client.useNativeTouchEvents\n : query['useNativeTouchEvents'] === 'true') ?? false;\n// Initialize platform reference\nconst platform = new PlatformNext();\nplatform.initialize({ endpoint: clientOptions.Endpoint || 'https://api.pureweb.io' });\n\nconst App: React.FC = () => {\n const [modelDefinitionUnavailable, setModelDefinitionUnavailable] = useState(false);\n const [modelDefinition, setModelDefinition] = useState(new UndefinedModelDefinition());\n const [availableModels, setAvailableModels] = useState();\n const [launchRequestError, setLaunchRequestError] = useState();\n const streamerOptions = DefaultStreamerOptions;\n\n useAsyncEffect(async () => {\n if (clientOptions.ProjectId) {\n logger.info('Initializing available models: ' + clientOptions.ProjectId);\n try {\n await platform.useAnonymousCredentials(clientOptions.ProjectId, clientOptions.EnvironmentId);\n await platform.connect();\n logger.info('Agent Connected: ' + platform.agent.id);\n streamerOptions.iceServers = platform.agent.serviceCredentials.iceServers as RTCIceServer[];\n streamerOptions.forceRelay = clientOptions.ForceRelay;\n const models = await platform.getModels();\n setAvailableModels(models);\n logger.debug('Available models', models);\n } catch (err) {\n logger.error(err);\n }\n }\n }, [clientOptions]);\n\n useEffect(() => {\n if (availableModels?.length) {\n const selectedModels = availableModels.filter(function (model: ModelDefinition): boolean {\n if (clientOptions.ModelId === model.id) {\n // If there is a version specified and we encounter it\n if (clientOptions.Version && clientOptions.Version === model.version) {\n return true;\n }\n // If there is no version specified and we find the primary version\n if (!clientOptions.Version && model.active) {\n return true;\n }\n }\n return false;\n });\n if (selectedModels?.length) {\n setModelDefinition(selectedModels[0]);\n } else {\n setModelDefinitionUnavailable(true);\n }\n }\n }, [availableModels]);\n\n const launchRequestOptions: LaunchRequestOptions = {\n regionOverride: query['regionOverride'] as string,\n virtualizationProviderOverride: query['virtualizationProviderOverride'] as string\n };\n const [status, launchRequest, queueLaunchRequest] = useLaunchRequest(platform, modelDefinition, launchRequestOptions);\n const [streamerStatus, emitter, videoStream, audioStream, messageSubject] = useStreamer(\n platform,\n launchRequest,\n streamerOptions\n );\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (streamerStatus === StreamerStatus.Failed) {\n platform.disconnect();\n }\n }, [streamerStatus]);\n\n if (audioStream) {\n audio.srcObject = audioStream;\n }\n\n const launch = async () => {\n setLoading(true);\n audio.load();\n\n if (clientOptions.LaunchType !== 'local') {\n try {\n await queueLaunchRequest();\n } catch (err) {\n setLaunchRequestError(err);\n }\n }\n };\n\n // Log status messages\n useEffect(() => {\n logger.info('Status', status, streamerStatus);\n }, [status, streamerStatus]);\n\n // Subscribe to game messages\n useEffect(() => {\n const subscription = messageSubject.subscribe(\n (value: string) => {\n logger.info('Message: ' + value);\n },\n (err) => {\n logger.error(err);\n }\n );\n\n return () => {\n subscription.unsubscribe();\n };\n }, [messageSubject]);\n\n // Notify user of missing or errors in configuration\n if (!clientOptions.isValid()) {\n return (\n \n

\n Your client has one or more configuration errors. Please consult the{' '}\n README for details on how\n to configure the client template.\n

\n \n );\n }\n\n if (modelDefinitionUnavailable) {\n return (\n \n The model that you have requested does not exist\n \n );\n }\n\n if (launchRequestError) {\n return (\n \n \n {process.env.NODE_ENV === 'development'\n ? `There was an error with the launch request: ${launchRequestError}`\n : 'It appears the requested model is currently not online as per your set schedule. Please contact support if it should be available.'}\n \n \n );\n }\n\n // Begin connection\n if (streamerStatus === StreamerStatus.Disconnected) {\n return (\n \n

Disconnected from stream

\n \n );\n }\n\n if (streamerStatus === StreamerStatus.Failed) {\n return (\n \n

Failure during stream

\n

Please refresh to request a new session

\n \n );\n }\n\n if (streamerStatus === StreamerStatus.Withdrawn) {\n return (\n \n

Streamer contribution withdrawn

\n \n );\n }\n\n if (loading) {\n return (\n \n );\n } else if (clientOptions.LaunchType !== 'local' && !availableModels) {\n return (\n \n

Initializing...

\n \n );\n } else if (clientOptions.LaunchType !== 'local' && !availableModels?.length) {\n return (\n \n

No models are currently available in this environment.

\n \n );\n } else {\n return ;\n }\n};\n\nconst AppWrapper: React.FC = () => {\n return System.IsBrowserSupported() ? (\n \n ) : (\n
\n

Your browser is currently unsupported

\n
\n );\n};\n\nexport default AppWrapper;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === \"[::1]\" ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\"This web app is being served cache-first by a service worker. To learn more, visit https://bit.ly/CRA-PWA\");\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\"New content is available and will be used when all tabs for this page are closed. See https://bit.ly/CRA-PWA.\");\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (response.status === 404 || (contentType != null && contentType.indexOf(\"javascript\") === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\"No internet connection found. App is running in offline mode.\");\n });\n}\n\nexport function unregister() {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister();\n });\n }\n}\n","import './polyfills';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nimport 'semantic-ui-css/semantic.min.css';\nimport './index.css';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}