{"version":3,"sources":["config.ts","assets/selenium-grid-logo.svg","components/TopBar/TopBar.tsx","models/size.ts","assets/operating-systems/android.svg","assets/operating-systems/mac.svg","assets/operating-systems/windows.svg","assets/operating-systems/linux.svg","assets/operating-systems/unknown.svg","util/os-logo.tsx","components/common/OsLogo.tsx","components/Node/NodeDetailsDialog.tsx","components/Node/NodeLoad.tsx","assets/browsers/chrome.svg","assets/browsers/edge.svg","assets/browsers/opera.svg","assets/browsers/firefox.svg","assets/browsers/safari.svg","assets/browsers/unknown.svg","util/browser-logo.tsx","assets/browsers/internet-explorer.png","assets/browsers/safari-technology-preview.png","components/common/BrowserLogo.tsx","components/Node/Stereotypes.tsx","components/Node/Node.tsx","components/NoData/NoData.tsx","components/Loading/Loading.tsx","components/Error/Error.tsx","util/browser-version.tsx","screens/Overview/Overview.tsx","components/Footer/Footer.tsx","components/EnhancedTableToolbar.tsx","components/LiveView/PasswordDialog.tsx","components/LiveView/LiveView.tsx","components/RunningSessions/RunningSessions.tsx","components/QueuedSessions/QueuedSessions.tsx","screens/Sessions/Sessions.tsx","screens/Help/Help.tsx","components/NavBar/OverallConcurrency.tsx","components/NavBar/NavBar.tsx","App.tsx","serviceWorker.ts","theme/typography.tsx","theme/theme.tsx","index.tsx"],"names":["GridConfig","status","xhrPollingIntervalMillis","serverUri","document","location","protocol","host","TopBar","props","client","intervalID","this","subheader","error","classes","drawerOpen","toggleDrawer","className","root","CssBaseline","AppBar","position","appBar","Toolbar","toolbar","IconButton","edge","color","aria-label","onClick","menuButton","href","clsx","menuButtonHidden","Box","toolbarTitle","src","seleniumGridLogo","gridLogo","alt","alignItems","display","flexDirection","Typography","title","component","variant","noWrap","React","Component","defaultProps","withStyles","Size","theme","createStyles","paddingRight","width","justifyContent","zIndex","drawer","transition","transitions","create","easing","sharp","duration","leavingScreen","marginRight","flexGrow","palette","secondary","main","height","osLogo","os","unknownOsLogo","osLowerCase","toLowerCase","includes","windowsLogo","androidLogo","macLogo","linuxLogo","OsLogo","osName","size","logo","XS","xs","S","small","M","medium","L","large","sizeMap","marginLeft","NodeDetailsDialog","handleDialogOpen","setState","open","handleDialogClose","state","node","nodeInfo","buttonMargin","data-testid","id","Dialog","onClose","aria-labelledby","DialogTitle","osInfo","name","fontWeight","mr","uri","DialogContent","dividers","gutterBottom","arch","version","slotCount","DialogActions","Button","padding","LinearProgressWithLabel","LinearProgress","minWidth","Math","round","value","NodeLoad","sessionCount","currentLoad","min","maxSession","toFixed","Grid","item","container","justify","spacing","pt","mt","Number","browserLogo","browser","unknownBrowserLogo","chromeLogo","edgeLogo","operaLogo","firefoxLogo","safariLogo","BrowserLogo","browserName","Stereotypes","stereotypes","direction","sort","a","b","browserNameComparison","localeCompare","browserVersion","map","slotStereotype","idx","index","Tooltip","JSON","stringify","rawData","stereotype","Badge","badgeContent","boxStyle","platformName","CreateStereotypeGridItem","marginBottom","marginTop","Node","nodeStatusClass","up","down","Card","CardContent","paddingContent","slotStereotypes","paddingLeft","backgroundColor","grey","A100","NoData","message","Container","maxWidth","align","Link","paddingBottom","paddingTop","Loading","mb","Error","errorMessage","length","NODES_QUERY","Overview","fetchData","query","fetchPolicy","then","loading","data","networkError","catch","setInterval","bind","clearInterval","ApolloConsumer","undefined","nodes","nodesInfo","parse","platform","slots","fixedHeightPaper","paper","fixedHeight","lg","sm","xl","Paper","overflow","Footer","target","rel","Date","getFullYear","EnhancedTableToolbar","flex","useStyles","makeStyles","flexWrap","margin","withoutLabel","textField","PasswordDialog","prop","children","setOpen","onConfirm","onCancel","useState","amount","password","weight","weightRange","showPassword","values","setValues","DialogContentText","FormControl","InputLabel","htmlFor","Input","autoFocus","type","fullWidth","onChange","event","endAdornment","InputAdornment","onMouseDown","preventDefault","Visibility","VisibilityOff","LiveView","rfb","canvas","handlePasswordDialog","disconnect","connect","RFB","url","scaleViewport","background","addEventListener","handleCredentials","securityFailed","registerChild","ref","detail","reason","handleCredentialsEntered","sendCredentials","username","handlePasswordDialogClose","handleMouseEnter","focus","handleMouseLeave","blur","prevProps","style","onMouseEnter","onMouseLeave","descendingComparator","orderBy","getComparator","order","stableSort","array","comparator","stabilizedThis","el","headCells","numeric","label","EnhancedTableHead","onRequestSort","TableHead","TableRow","headCell","TableCell","sortDirection","TableSortLabel","active","property","visuallyHidden","Transition","forwardRef","Slide","RunningSessions","rowId","rowOpen","handleLiveViewOpen","rowLiveViewOpen","handleLiveViewClose","handleRequestSort","isAsc","handleClick","selected","selectedIndex","indexOf","newSelected","concat","slice","handleChangePage","newPage","page","handleChangeRowsPerPage","rowsPerPage","parseInt","handleChangeDense","dense","checked","isSelected","displaySessionInfo","displayLiveView","sessions","rows","session","capabilities","startTime","nodeId","nodeUri","sessionDurationMillis","slot","parsed","vnc","createSessionData","emptyRows","TableContainer","Table","table","TableBody","row","isItemSelected","labelId","hover","role","aria-checked","tabIndex","scope","fullScreen","TransitionComponent","textPadding","dialogContent","prettyMilliseconds","colSpan","TablePagination","rowsPerPageOptions","count","onChangePage","onChangeRowsPerPage","FormControlLabel","control","Switch","border","clip","top","queueList","queueListItem","borderBottomWidth","borderBottomStyle","borderBottomColor","QueuedSessions","sessionQueueRequests","queue","queuedSession","List","queueItem","ListItem","GRID_SESSIONS_QUERY","Sessions","sessionsInfo","Help","pathname","m","image","withRouter","CircularProgressWithLabel","CircularProgress","left","bottom","right","OverallConcurrency","p","concurrencyBackground","ListItemLink","button","NavBar","nodeCount","sessionQueueSize","showOverallConcurrency","Drawer","drawerPaper","drawerPaperClose","toolbarIcon","Divider","ListItemIcon","ListItemText","primary","queueBackground","mixins","whiteSpace","minHeight","enteringScreen","overflowX","breakpoints","ApolloClient","cache","InMemoryCache","ReactModal","setAppElement","GRID_QUERY","App","grid","topBarSubheader","ApolloProvider","content","exact","path","Boolean","window","hostname","match","typogpaphy","h1","fontSize","letterSpacing","h2","h3","h4","h5","h6","overline","fontFamily","join","createMuiTheme","red","A400","default","typography","ReactDOM","render","StrictMode","ThemeProvider","getElementById","navigator","serviceWorker","ready","registration","unregister","console"],"mappings":"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","file":"static/js/main.485aaafa.chunk.js","sourcesContent":["// Contains the global config values which can be adjusted\nexport const GridConfig = {\n status: {\n // How often we poll the GraphQL endpoint\n xhrPollingIntervalMillis: 5000\n },\n\n // Server config (Start the Selenium Server with the \"--allow-cors true\" flag)\n serverUri:\n process.env.NODE_ENV === 'development'\n ? 'http://localhost:4444/graphql'\n : document.location.protocol + '//' + document.location.host + '/graphql'\n}\n","export default __webpack_public_path__ + \"static/media/selenium-grid-logo.86cdb73d.svg\";","import AppBar from '@material-ui/core/AppBar'\nimport Box from '@material-ui/core/Box'\nimport CssBaseline from '@material-ui/core/CssBaseline'\nimport IconButton from '@material-ui/core/IconButton'\nimport { createStyles, StyleRules, Theme } from '@material-ui/core/styles'\nimport Toolbar from '@material-ui/core/Toolbar'\nimport Typography from '@material-ui/core/Typography'\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft'\nimport MenuIcon from '@material-ui/icons/Menu'\nimport HelpIcon from '@material-ui/icons/Help'\nimport clsx from 'clsx'\nimport React, { ReactNode } from 'react'\nimport seleniumGridLogo from '../../assets/selenium-grid-logo.svg'\nimport { withStyles } from '@material-ui/core'\nimport { ApolloClient } from '@apollo/client'\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n root: {\n display: 'flex'\n },\n toolbar: {\n paddingRight: 24 // keep right padding when drawer closed\n },\n toolbarTitle: {\n display: 'flex',\n width: 'calc(100%)',\n alignItems: 'center',\n justifyContent: 'center'\n },\n appBar: {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create(['width', 'margin'], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen\n })\n },\n menuButton: {\n marginRight: 36\n },\n menuButtonHidden: {\n display: 'none'\n },\n title: {\n flexGrow: 1,\n color: theme.palette.secondary.main\n },\n gridLogo: {\n width: 52,\n height: 52,\n marginRight: 10\n }\n })\n\ninterface TopBarProps {\n subheader: string\n error: boolean\n classes: any\n drawerOpen: boolean\n toggleDrawer: () => void\n}\n\nclass TopBar extends React.Component {\n static defaultProps = {\n error: false,\n drawerOpen: false\n }\n\n client: ApolloClient | null\n intervalID\n\n constructor (props) {\n super(props)\n this.client = null\n }\n\n render (): ReactNode {\n const { subheader, error, classes, drawerOpen, toggleDrawer } = this.props\n\n return (\n
\n \n \n \n {!error && (\n \n {drawerOpen ? () : ()}\n \n )}\n \n \n \n \n \n \n \n Selenium Grid\n \n \n {subheader}\n \n \n \n \n \n
\n )\n }\n}\n\nexport default withStyles(useStyles)(TopBar)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nexport enum Size {\n XS,\n S,\n M,\n L,\n}\n","export default __webpack_public_path__ + \"static/media/android.53b63277.svg\";","export default __webpack_public_path__ + \"static/media/mac.348e84b8.svg\";","export default __webpack_public_path__ + \"static/media/windows.680a11ac.svg\";","export default __webpack_public_path__ + \"static/media/linux.ff969ad1.svg\";","export default __webpack_public_path__ + \"static/media/unknown.053aec7b.svg\";","import androidLogo from '../assets/operating-systems/android.svg'\nimport macLogo from '../assets/operating-systems/mac.svg'\nimport windowsLogo from '../assets/operating-systems/windows.svg'\nimport linuxLogo from '../assets/operating-systems/linux.svg'\nimport unknownOsLogo from '../assets/operating-systems/unknown.svg'\n\nconst osLogo = (os: string): string => {\n if (!os) {\n return unknownOsLogo\n }\n\n const osLowerCase: string = os.toLowerCase()\n if (osLowerCase.includes('win')) {\n return windowsLogo\n }\n if (osLowerCase.includes('android')) {\n return androidLogo\n }\n if (osLowerCase.includes('mac') || osLowerCase.includes('ios')) {\n return macLogo\n }\n if (osLowerCase.includes('nix') || osLowerCase.includes('nux')\n || osLowerCase.includes('aix')) {\n return linuxLogo\n }\n return unknownOsLogo\n}\n\nexport default osLogo\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport { StyleRules, withStyles } from '@material-ui/core/styles'\nimport { Size } from '../../models/size'\nimport osLogo from '../../util/os-logo'\nimport clsx from 'clsx'\n\nconst useStyles = (): StyleRules => (\n {\n logo: {\n marginRight: 0,\n marginLeft: 0\n },\n xs: {\n width: 16,\n height: 16\n },\n small: {\n width: 24,\n height: 24\n },\n medium: {\n width: 32,\n height: 32\n },\n large: {\n width: 48,\n height: 48\n }\n })\n\ninterface OsLogoProps {\n osName: string\n size: Size\n classes: any\n}\n\nclass OsLogo extends React.Component {\n static defaultProps = {\n size: Size.S\n }\n\n render (): ReactNode {\n const { osName, size, classes } = this.props ?? { osName: '' }\n\n function sizeMap (size): string {\n if (size === Size.XS) {\n return classes.xs\n }\n if (size === Size.S) {\n return classes.small\n }\n if (size === Size.M) {\n return classes.medium\n }\n if (size === Size.L) {\n return classes.large\n }\n return classes.small\n }\n\n return (\n \n )\n }\n}\n\nexport default withStyles(useStyles)(OsLogo)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport {\n Box,\n Button,\n createStyles,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n withStyles\n} from '@material-ui/core'\nimport React, { ReactNode } from 'react'\nimport NodeInfo from '../../models/node-info'\nimport InfoIcon from '@material-ui/icons/Info'\nimport OsLogo from '../common/OsLogo'\nimport { StyleRules } from '@material-ui/core/styles'\n\nconst useStyles = (): StyleRules => createStyles(\n {\n buttonMargin: {\n padding: 1\n }\n })\n\ninterface NodeDetailsDialogProps {\n node: NodeInfo\n classes: any\n}\n\ninterface NodeDetailsDialogState {\n open: boolean\n}\n\nclass NodeDetailsDialog extends React.Component {\n constructor (props) {\n super(props)\n this.state = {\n open: false\n }\n }\n\n handleDialogOpen = (): void => {\n this.setState({ open: true })\n }\n\n handleDialogClose = (): void => {\n this.setState({ open: false })\n }\n\n render (): ReactNode {\n const { node, classes } = this.props\n const { open } = this.state\n const nodeInfo = node\n\n return (\n \n \n \n \n \n \n \n \n URI:\n \n {nodeInfo.uri}\n \n \n \n Node Id: {nodeInfo.id}\n \n \n OS Arch: {nodeInfo.osInfo.arch}\n \n \n OS Name: {nodeInfo.osInfo.name}\n \n \n OS Version: {nodeInfo.osInfo.version}\n \n \n Total slots: {nodeInfo.slotCount}\n \n \n Grid version: {nodeInfo.version}\n \n \n \n \n \n \n \n )\n }\n}\n\nexport default withStyles(useStyles)(NodeDetailsDialog)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport {\n Box,\n Grid,\n Typography\n} from '@material-ui/core'\nimport React, { ReactNode } from 'react'\nimport NodeInfo from '../../models/node-info'\nimport LinearProgress, { LinearProgressProps } from '@material-ui/core/LinearProgress'\n\nfunction LinearProgressWithLabel (props: LinearProgressProps & { value: number }): JSX.Element {\n return (\n \n \n \n \n \n \n {`${Math.round(props.value)}%`}\n \n \n \n )\n}\n\nclass NodeLoad extends React.Component<{ node: NodeInfo }, {}> {\n render (): ReactNode {\n const { node } = this.props\n const sessionCount = node.sessionCount ?? 0\n const currentLoad = sessionCount === 0\n ? 0\n : Math.min(((sessionCount / node.maxSession) * 100), 100).toFixed(2)\n\n return (\n \n \n \n \n \n Sessions: {sessionCount}\n \n \n \n \n \n \n Max. Concurrency: {node.maxSession}\n \n \n \n \n \n \n \n \n )\n }\n}\n\nexport default NodeLoad\n","export default __webpack_public_path__ + \"static/media/chrome.191aefd5.svg\";","export default __webpack_public_path__ + \"static/media/edge.01a4ea8d.svg\";","export default __webpack_public_path__ + \"static/media/opera.b6559658.svg\";","export default __webpack_public_path__ + \"static/media/firefox.efda5897.svg\";","export default __webpack_public_path__ + \"static/media/safari.93e4ca5d.svg\";","export default __webpack_public_path__ + \"static/media/unknown.053aec7b.svg\";","import chromeLogo from '../assets/browsers/chrome.svg'\nimport edgeLogo from '../assets/browsers/edge.svg'\nimport operaLogo from '../assets/browsers/opera.svg'\nimport firefoxLogo from '../assets/browsers/firefox.svg'\nimport internetExplorerLogo from '../assets/browsers/internet-explorer.png'\nimport safariLogo from '../assets/browsers/safari.svg'\nimport safariTechnologyPreviewLogo\n from '../assets/browsers/safari-technology-preview.png'\nimport unknownBrowserLogo from '../assets/browsers/unknown.svg'\n\nconst browserLogo = (browser: string): string => {\n if (!browser) {\n return unknownBrowserLogo\n }\n\n switch (browser.toLowerCase()) {\n case 'chrome':\n return chromeLogo\n case 'microsoftedge':\n return edgeLogo\n case 'msedge':\n return edgeLogo\n case 'operablink':\n return operaLogo\n case 'opera':\n return operaLogo\n case 'firefox':\n return firefoxLogo\n case 'internet explorer':\n return internetExplorerLogo\n case 'safari':\n return safariLogo\n case 'safari technology preview':\n return safariTechnologyPreviewLogo\n default:\n return unknownBrowserLogo\n }\n}\n\nexport default browserLogo\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport { StyleRules, withStyles } from '@material-ui/core/styles'\nimport browserLogo from '../../util/browser-logo'\nimport { Size } from '../../models/size'\nimport clsx from 'clsx'\n\nconst useStyles = (): StyleRules => (\n {\n logo: {\n marginRight: 0,\n marginLeft: 0\n },\n small: {\n width: 24,\n height: 24\n },\n medium: {\n width: 32,\n height: 32\n },\n large: {\n width: 48,\n height: 48\n }\n })\n\ninterface BrowserLogoProps {\n browserName: string\n size: Size\n classes: any\n}\n\nclass BrowserLogo extends React.Component {\n static defaultProps = {\n size: Size.S\n }\n\n render (): ReactNode {\n const { browserName, size, classes } = this.props\n\n function sizeMap (size): string {\n if (size === Size.S) {\n return classes.small\n }\n if (size === Size.M) {\n return classes.medium\n }\n if (size === Size.L) {\n return classes.large\n }\n return classes.small\n }\n\n return (\n \n )\n }\n}\n\nexport default withStyles(useStyles)(BrowserLogo)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport {\n Badge,\n Box,\n createStyles,\n Grid,\n Tooltip,\n Typography,\n withStyles\n} from '@material-ui/core'\nimport React, { ReactNode } from 'react'\nimport StereotypeInfo from '../../models/stereotype-info'\nimport BrowserLogo from '../common/BrowserLogo'\nimport { StyleRules } from '@material-ui/core/styles'\nimport OsLogo from '../common/OsLogo'\nimport { Size } from '../../models/size'\n\nconst useStyles = (): StyleRules => createStyles(\n {\n boxStyle: {\n marginBottom: 5,\n marginTop: 20,\n marginRight: 35\n },\n browserVersion: {\n marginBottom: 5,\n marginRight: 7\n }\n })\n\ninterface StereotypesProps {\n stereotypes: StereotypeInfo[]\n classes: any\n}\n\nclass Stereotypes extends React.Component {\n render (): ReactNode {\n const { stereotypes, classes } = this.props\n\n function CreateStereotypeGridItem (slotStereotype: StereotypeInfo, index: any): JSX.Element {\n return (\n \n \n \n \n \n \n \n \n {slotStereotype.browserVersion}\n \n \n \n \n \n \n )\n }\n\n return (\n \n \n \n Stereotypes\n \n \n \n {\n stereotypes\n .sort((a, b) => {\n const browserNameComparison = a.browserName.localeCompare(b.browserName)\n if (browserNameComparison !== 0) {\n return browserNameComparison\n } else {\n return a.browserVersion.localeCompare(b.browserVersion)\n }\n })\n .map((slotStereotype: any, idx) => {\n return (\n CreateStereotypeGridItem(slotStereotype, idx)\n )\n })\n }\n \n \n )\n }\n}\n\nexport default withStyles(useStyles)(Stereotypes)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport {\n Box,\n Card,\n CardContent,\n createStyles,\n Grid,\n Theme,\n Typography,\n withStyles\n} from '@material-ui/core'\nimport React, { ReactNode } from 'react'\nimport NodeInfo from '../../models/node-info'\nimport NodeDetailsDialog from './NodeDetailsDialog'\nimport NodeLoad from './NodeLoad'\nimport Stereotypes from './Stereotypes'\nimport clsx from 'clsx'\nimport OsLogo from '../common/OsLogo'\nimport { StyleRules } from '@material-ui/core/styles'\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n root: {\n height: '100%',\n flexGrow: 1\n },\n paddingContent: {\n paddingRight: 10,\n paddingLeft: 10\n },\n osLogo: {\n width: 32,\n height: 32,\n marginRight: 5\n },\n up: {},\n down: {\n backgroundColor: theme.palette.grey.A100\n }\n })\n\ninterface NodeProps {\n node: NodeInfo\n classes: any\n}\n\nclass Node extends React.Component {\n render (): ReactNode {\n const { node, classes } = this.props\n const nodeStatusClass = node.status === 'UP' ? classes.up : classes.down\n\n return (\n \n \n \n \n \n \n URI:\n \n {node.uri}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n }\n}\n\nexport default withStyles(useStyles)(Node)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport {\n Box,\n Container,\n createStyles,\n Link,\n Theme,\n Typography,\n withStyles\n} from '@material-ui/core'\nimport { StyleRules } from '@material-ui/core/styles'\n\nconst useStyles = (theme: Theme): StyleRules => createStyles({\n root: {\n backgroundColor: theme.palette.secondary.main,\n height: '100%',\n paddingBottom: theme.spacing(3),\n paddingTop: theme.spacing(3),\n width: '100%',\n justifyContent: 'center'\n }\n})\n\ninterface NoDataProps {\n message: string\n classes: any\n}\n\nclass NoData extends React.Component {\n render (): ReactNode {\n const { message, classes } = this.props\n // noinspection HtmlUnknownAnchorTarget\n return (\n
\n \n \n \n {message}\n \n \n More information about Selenium Grid can be found at the{' '}\n \n Help\n \n {' '}section.\n \n \n \n
\n )\n }\n}\n\nexport default withStyles(useStyles)(NoData)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport LinearProgress from '@material-ui/core/LinearProgress'\nimport {\n Box,\n createStyles,\n Theme,\n Typography,\n withStyles\n} from '@material-ui/core'\nimport { StyleRules } from '@material-ui/core/styles'\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n root: {\n backgroundColor: theme.palette.secondary.main,\n height: '100%',\n paddingTop: theme.spacing(1),\n width: '100%',\n justifyContent: 'center'\n }\n })\n\ninterface LoadingProps {\n classes: any\n}\n\nclass Loading extends React.Component {\n render (): ReactNode {\n const { classes } = this.props\n return (\n
\n \n \n Loading...\n \n \n \n
\n )\n }\n}\n\nexport default withStyles(useStyles)(Loading)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport { Box, Container, createStyles, Typography, Theme, withStyles } from '@material-ui/core'\nimport { StyleRules } from '@material-ui/core/styles'\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n root: {\n backgroundColor: theme.palette.secondary.main,\n height: '100%',\n paddingBottom: theme.spacing(3),\n paddingTop: theme.spacing(3),\n width: '100%',\n justifyContent: 'center'\n }\n })\n\ninterface ErrorProps {\n message: string\n errorMessage: string\n classes: any\n}\n\nclass Error extends React.Component {\n render (): ReactNode {\n const { message, errorMessage, classes } = this.props\n // noinspection HtmlUnknownAnchorTarget\n return (\n
\n \n \n \n \n {message}\n \n \n \n
\n                {errorMessage}\n              
\n \n
\n \n
\n )\n }\n}\n\nexport default withStyles(useStyles)(Error)\n","const browserVersion = (version: string): string => {\n const browserVersion = version ?? ''\n return browserVersion.length > 0 ? 'v.' + browserVersion : browserVersion\n}\n\nexport default browserVersion\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport Grid from '@material-ui/core/Grid'\nimport Paper from '@material-ui/core/Paper'\nimport {\n createStyles,\n StyleRules,\n Theme,\n withStyles\n} from '@material-ui/core/styles'\nimport clsx from 'clsx'\nimport { loader } from 'graphql.macro'\nimport React, { ReactNode } from 'react'\nimport Node from '../../components/Node/Node'\nimport { ApolloClient, ApolloConsumer } from '@apollo/client'\nimport NodeInfo from '../../models/node-info'\nimport OsInfo from '../../models/os-info'\nimport { GridConfig } from '../../config'\nimport NoData from '../../components/NoData/NoData'\nimport Loading from '../../components/Loading/Loading'\nimport Error from '../../components/Error/Error'\nimport StereotypeInfo from '../../models/stereotype-info'\nimport browserVersion from '../../util/browser-version'\nimport Capabilities from '../../models/capabilities'\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n toolbar: {\n paddingRight: 24 // keep right padding when drawer closed\n },\n title: {\n flexGrow: 1,\n color: theme.palette.secondary.main\n },\n paper: {\n display: 'flex',\n overflow: 'auto',\n flexDirection: 'column'\n }\n })\n\nconst NODES_QUERY = loader('../../graphql/nodes.gql')\n\ninterface OverviewProps {\n classes: any\n}\n\ninterface OverviewState {\n loading: boolean\n error: string | undefined\n data: any\n}\n\nclass Overview extends React.Component {\n client: ApolloClient | null\n intervalID\n\n constructor (props) {\n super(props)\n this.client = null\n }\n\n fetchData = (): void => {\n this.client?.query({ query: NODES_QUERY, fetchPolicy: 'network-only' })\n .then(({ loading, error, data }) => {\n this.setState({\n loading: loading,\n error: error?.networkError?.message,\n data: data\n })\n })\n .catch((error) => {\n this.setState({ loading: false, error: error.message })\n })\n }\n\n componentDidMount (): void {\n this.fetchData()\n this.intervalID =\n setInterval(this.fetchData.bind(this),\n GridConfig.status.xhrPollingIntervalMillis)\n }\n\n componentWillUnmount (): void {\n clearInterval(this.intervalID)\n }\n\n render (): ReactNode {\n if (this.client === null) {\n return (\n \n {client => {\n this.client = client\n return (\n \n \n \n )\n }}\n \n )\n }\n const { loading, error, data } = this.state ?? { loading: false, error: 'No connection to the Grid', data: [] }\n\n if (loading) {\n return (\n \n \n \n )\n }\n\n if (error !== undefined) {\n const message = 'There has been an error while loading the Nodes from the Grid.'\n return (\n \n \n \n )\n }\n\n const unSortedNodes = data.nodesInfo.nodes.map((node) => {\n const osInfo: OsInfo = {\n name: node.osInfo.name,\n version: node.osInfo.version,\n arch: node.osInfo.arch\n }\n\n interface StereoTypeData {\n stereotype: Capabilities;\n slots: number\n }\n\n const slotStereotypes = (JSON.parse(node.stereotypes) as Array).map((item) => {\n const slotStereotype: StereotypeInfo = {\n browserName: item.stereotype.browserName ?? '',\n browserVersion: browserVersion(\n item.stereotype.browserVersion ?? item.stereotype.version),\n platformName: (item.stereotype.platformName\n ?? item.stereotype.platform) ?? '',\n slotCount: item.slots,\n rawData: item\n }\n return slotStereotype\n })\n const newNode: NodeInfo = {\n uri: node.uri,\n id: node.id,\n status: node.status,\n maxSession: node.maxSession,\n slotCount: node.slotCount,\n version: node.version,\n osInfo: osInfo,\n sessionCount: node.sessionCount ?? 0,\n slotStereotypes: slotStereotypes\n }\n return newNode\n })\n\n const nodes = unSortedNodes.sort((a, b) => (a.id < b.id ? -1 : 1))\n if (nodes.length === 0) {\n const shortMessage = 'The Grid has no registered Nodes yet.'\n return (\n \n \n \n )\n }\n\n const { classes } = this.props\n const fixedHeightPaper = clsx(classes.paper, classes.fixedHeight)\n\n return (\n \n {/* Nodes */}\n {nodes.map((node, index) => {\n return (\n \n \n \n \n \n )\n })}\n \n )\n }\n}\n\nexport default withStyles(useStyles)(Overview)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport { Box, Link, Typography } from '@material-ui/core'\n\nclass Footer extends React.Component<{}, {}> {\n render (): ReactNode {\n // noinspection HtmlUnknownAnchorTarget\n return (\n \n \n \n Help\n \n {' - All rights reserved - '}\n \n Software Freedom Conservancy\n {' '}\n {new Date().getFullYear()}.\n \n \n )\n }\n}\n\nexport default Footer\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport { StyleRules, Theme, withStyles } from '@material-ui/core/styles'\nimport Toolbar from '@material-ui/core/Toolbar'\nimport Typography from '@material-ui/core/Typography'\n\nconst useStyles = (theme: Theme): StyleRules => (\n {\n root: {\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(1)\n },\n title: {\n flex: '1 1 100%'\n }\n })\n\ninterface EnhancedTableToolbarProps {\n title: string\n classes: any\n}\n\nclass EnhancedTableToolbar extends React.Component {\n render (): ReactNode {\n const { title, classes } = this.props\n return (\n \n \n {title}\n \n \n )\n }\n}\n\nexport default withStyles(useStyles)(EnhancedTableToolbar)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React from 'react'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n FormControl,\n Input,\n InputAdornment,\n InputLabel,\n makeStyles\n} from '@material-ui/core'\nimport clsx from 'clsx'\nimport { createStyles, Theme } from '@material-ui/core/styles'\nimport IconButton from '@material-ui/core/IconButton'\nimport { Visibility, VisibilityOff } from '@material-ui/icons'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n margin: {\n margin: theme.spacing(1),\n },\n withoutLabel: {\n marginTop: theme.spacing(3),\n },\n textField: {\n width: '25ch',\n },\n }),\n)\n\ninterface State {\n amount: string;\n password: string;\n weight: string;\n weightRange: string;\n showPassword: boolean;\n}\n\nconst PasswordDialog = (props) => {\n const { title, children, open, setOpen, onConfirm, onCancel } = props\n const classes = useStyles()\n const [values, setValues] = React.useState({\n amount: '',\n password: '',\n weight: '',\n weightRange: '',\n showPassword: false,\n })\n const handleChange = (prop: keyof State) => (event: React.ChangeEvent) => {\n setValues({ ...values, [prop]: event.target.value })\n }\n const handleClickShowPassword = () => {\n setValues({ ...values, showPassword: !values.showPassword })\n }\n\n const handleMouseDownPassword = (event: React.MouseEvent) => {\n event.preventDefault()\n }\n return (\n setOpen(false)}\n aria-labelledby={'password-dialog'}\n >\n {title}\n \n \n {children}\n \n \n \n Password\n \n \n \n {values.showPassword ? : }\n \n \n }\n />\n \n \n \n \n \n \n \n )\n}\n\nexport default PasswordDialog\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport { createStyles, Theme, withStyles } from '@material-ui/core'\nimport { StyleRules } from '@material-ui/core/styles'\nimport RFB from '@novnc/novnc/core/rfb'\nimport PasswordDialog from './PasswordDialog'\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n root: {\n backgroundColor: theme.palette.secondary.main,\n height: '100%',\n paddingTop: theme.spacing(1),\n width: '100%',\n justifyContent: 'center'\n }\n })\n\ninterface LiveViewProps {\n /**\n * The URL for which to create a remote VNC connection.\n * Should include the protocol, host, port, and path.\n */\n url?: string,\n /**\n * Customize the CSS styles of the canvas element with an object.\n */\n style?: object,\n /**\n * Specify if the remote session should be scaled locally so it fits its\n * container. When disabled it will be centered if the remote session is\n * smaller than its container, or handled according to `clipViewport` if it\n * is larger. Default is false.\n */\n scaleViewport?: boolean,\n /**\n * Callback to close the Live View when the PasswordDialog is prompted and\n * the user clicks 'Cancel'\n */\n onClose: () => void\n}\n\ninterface PasswordDialogState {\n open: boolean,\n message: string\n}\n\nclass LiveView extends React.Component {\n rfb: any = null\n canvas: any = null\n\n constructor (props) {\n super(props)\n this.state = {\n open: false,\n message: ''\n }\n }\n\n handlePasswordDialog = (state: boolean): void => {\n this.setState({ open: state })\n }\n\n disconnect = () => {\n if (!this.rfb) {\n return\n }\n\n this.rfb.disconnect()\n this.rfb = null\n }\n\n connect = () => {\n this.disconnect()\n\n if (!this.canvas) {\n return\n }\n\n this.rfb = new RFB(this.canvas, this.props.url, {})\n this.rfb.scaleViewport = this.props.scaleViewport\n this.rfb.background = 'rgb(247,248,248)'\n this.rfb.addEventListener('credentialsrequired', this.handleCredentials)\n this.rfb.addEventListener('securityfailure', this.securityFailed)\n }\n\n registerChild = ref => {\n this.canvas = ref\n }\n\n componentDidMount () {\n this.connect()\n }\n\n componentWillUnmount () {\n this.disconnect()\n }\n\n componentDidUpdate (prevProps) {\n if (!this.rfb) {\n return\n }\n\n this.rfb.scaleViewport = this.props.scaleViewport\n }\n\n securityFailed = (event: any) => {\n let errorMessage\n if ('reason' in event.detail) {\n errorMessage =\n 'Connection has been rejected with reason: ' + event.detail.reason\n } else {\n errorMessage = 'New connection has been rejected'\n }\n this.setState({ message: errorMessage })\n this.connect()\n }\n\n handleCredentials = () => {\n this.handlePasswordDialog(true)\n }\n\n handleCredentialsEntered = (password: string) => {\n this.rfb.sendCredentials({ username: '', password: password })\n }\n\n handlePasswordDialogClose = () => {\n this.props.onClose()\n }\n\n handleMouseEnter = () => {\n if (!this.rfb) {\n return\n }\n\n this.rfb.focus()\n }\n\n handleMouseLeave = () => {\n if (!this.rfb) {\n return\n }\n\n this.rfb.blur()\n }\n\n render (): ReactNode {\n const { open, message } = this.state\n\n return (\n \n \n {message}\n \n \n )\n }\n}\n\nexport default withStyles(useStyles)(LiveView)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport Table from '@material-ui/core/Table'\nimport TableBody from '@material-ui/core/TableBody'\nimport TableCell from '@material-ui/core/TableCell'\nimport TableContainer from '@material-ui/core/TableContainer'\nimport TableHead from '@material-ui/core/TableHead'\nimport TablePagination from '@material-ui/core/TablePagination'\nimport TableRow from '@material-ui/core/TableRow'\nimport TableSortLabel from '@material-ui/core/TableSortLabel'\nimport Typography from '@material-ui/core/Typography'\nimport Paper from '@material-ui/core/Paper'\nimport FormControlLabel from '@material-ui/core/FormControlLabel'\nimport Switch from '@material-ui/core/Switch'\nimport {\n Box,\n Button,\n createStyles,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n Theme,\n withStyles\n} from '@material-ui/core'\nimport InfoIcon from '@material-ui/icons/Info'\nimport VideocamIcon from '@material-ui/icons/Videocam'\nimport Slide from '@material-ui/core/Slide'\nimport { StyleRules } from '@material-ui/core/styles'\nimport { TransitionProps } from '@material-ui/core/transitions'\nimport browserVersion from '../../util/browser-version'\nimport EnhancedTableToolbar from '../EnhancedTableToolbar'\nimport prettyMilliseconds from 'pretty-ms'\nimport BrowserLogo from '../common/BrowserLogo'\nimport OsLogo from '../common/OsLogo'\nimport { Size } from '../../models/size'\nimport Capabilities from '../../models/capabilities'\nimport LiveView from '../LiveView/LiveView'\n\ninterface SessionData {\n id: string\n capabilities: string\n browserName: string\n browserVersion: string\n platformName: string\n startTime: string\n uri: string\n nodeId: string\n nodeUri: string\n sessionDurationMillis: number\n slot: any,\n vnc: string,\n name: string,\n}\n\nfunction createSessionData (\n id: string,\n capabilities: string,\n startTime: string,\n uri: string,\n nodeId: string,\n nodeUri: string,\n sessionDurationMillis: number,\n slot: any\n): SessionData {\n const parsed = JSON.parse(capabilities) as Capabilities\n const browserName = parsed.browserName\n const browserVersion = parsed.browserVersion ?? parsed.version\n const platformName = parsed.platformName ?? parsed.platform\n const vnc: string = parsed['se:vnc'] ?? ''\n const name: string = parsed['se:name'] ?? id\n return {\n id,\n capabilities,\n browserName,\n browserVersion,\n platformName,\n startTime,\n uri,\n nodeId,\n nodeUri,\n sessionDurationMillis,\n slot,\n vnc,\n name\n }\n}\n\nfunction descendingComparator (a: T, b: T, orderBy: keyof T): number {\n if (b[orderBy] < a[orderBy]) {\n return -1\n }\n if (b[orderBy] > a[orderBy]) {\n return 1\n }\n return 0\n}\n\ntype Order = 'asc' | 'desc'\n\nfunction getComparator (\n order: Order,\n orderBy: Key\n): (a: { [key in Key]: number | string }, b: { [key in Key]: number | string }) => number {\n return order === 'desc'\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy)\n}\n\nfunction stableSort (array: T[], comparator: (a: T, b: T) => number): T[] {\n const stabilizedThis = array.map((el, index) => [el, index] as [T, number])\n stabilizedThis.sort((a, b) => {\n const order = comparator(a[0], b[0])\n if (order !== 0) {\n return order\n }\n return a[1] - b[1]\n })\n return stabilizedThis.map((el) => el[0])\n}\n\ninterface HeadCell {\n id: keyof SessionData\n label: string\n numeric: boolean\n}\n\nconst headCells: HeadCell[] = [\n { id: 'id', numeric: false, label: 'Session' },\n { id: 'capabilities', numeric: false, label: 'Capabilities' },\n { id: 'startTime', numeric: false, label: 'Start time' },\n { id: 'sessionDurationMillis', numeric: false, label: 'Duration' },\n { id: 'nodeUri', numeric: false, label: 'Node URI' }\n]\n\ninterface EnhancedTableProps {\n classes: any\n onRequestSort: (event: React.MouseEvent,\n property: keyof SessionData) => void\n order: Order\n orderBy: string\n}\n\nfunction EnhancedTableHead (props: EnhancedTableProps): JSX.Element {\n const { classes, order, orderBy, onRequestSort } = props\n const createSortHandler = (property: keyof SessionData) => (event: React.MouseEvent) => {\n onRequestSort(event, property)\n }\n\n return (\n \n \n {headCells.map((headCell) => (\n \n \n \n {headCell.label}\n \n {orderBy === headCell.id ? (\n \n {order === 'desc' ? 'sorted descending' : 'sorted ascending'}\n \n ) : null}\n \n \n ))}\n \n \n )\n}\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n root: {\n width: '100%'\n },\n paper: {\n width: '100%',\n marginBottom: theme.spacing(2)\n },\n table: {\n minWidth: 750\n },\n visuallyHidden: {\n border: 0,\n clip: 'rect(0 0 0 0)',\n height: 1,\n margin: -1,\n overflow: 'hidden',\n padding: 0,\n position: 'absolute',\n top: 20,\n width: 1\n },\n buttonMargin: {\n padding: 1\n },\n textPadding: {\n paddingLeft: 10,\n paddingRight: 10\n },\n dialogContent: {\n height: 600\n },\n queueList: {\n minWidth: 750,\n backgroundColor: theme.palette.background.paper,\n marginBottom: 20\n },\n queueListItem: {\n borderBottomWidth: 1,\n borderBottomStyle: 'solid',\n borderBottomColor: '#e0e0e0'\n }\n })\n\ninterface RunningSessionsProps {\n sessions: SessionData[]\n classes: any\n}\n\ninterface RunningSessionsState {\n order: Order\n orderBy: keyof SessionData\n selected: string[]\n page: number\n dense: boolean\n rowsPerPage: number\n rowOpen: string\n rowLiveViewOpen: string\n}\n\nconst Transition = React.forwardRef(function Transition (\n props: TransitionProps & { children?: React.ReactElement },\n ref: React.Ref,\n) {\n return \n})\n\nclass RunningSessions extends React.Component {\n constructor (props) {\n super(props)\n this.state = {\n order: 'asc',\n orderBy: 'startTime',\n selected: [],\n page: 0,\n dense: false,\n rowsPerPage: 5,\n rowOpen: '',\n rowLiveViewOpen: ''\n }\n }\n\n handleDialogOpen = (rowId: string): void => {\n this.setState({ rowOpen: rowId })\n }\n\n handleDialogClose = (): void => {\n this.setState({ rowOpen: '' })\n }\n\n handleLiveViewOpen = (rowId: string): void => {\n this.setState({ rowLiveViewOpen: rowId })\n }\n\n handleLiveViewClose = (): void => {\n this.setState({ rowLiveViewOpen: '' })\n }\n\n handleRequestSort = (event: React.MouseEvent,\n property: keyof SessionData): void => {\n const { orderBy, order } = this.state\n const isAsc = orderBy === property && order === 'asc'\n this.setState({ order: (isAsc ? 'desc' : 'asc'), orderBy: property })\n }\n\n handleClick = (event: React.MouseEvent, name: string): void => {\n const { selected } = this.state\n const selectedIndex = selected.indexOf(name)\n let newSelected: string[] = []\n\n if (selectedIndex === -1) {\n newSelected = newSelected.concat(selected, name)\n } else if (selectedIndex === 0) {\n newSelected = newSelected.concat(selected.slice(1))\n } else if (selectedIndex === selected.length - 1) {\n newSelected = newSelected.concat(selected.slice(0, -1))\n } else if (selectedIndex > 0) {\n newSelected = newSelected.concat(\n selected.slice(0, selectedIndex),\n selected.slice(selectedIndex + 1)\n )\n }\n this.setState({ selected: newSelected })\n }\n\n handleChangePage = (event: unknown, newPage: number): void => {\n this.setState({ page: newPage })\n }\n\n handleChangeRowsPerPage = (event: React.ChangeEvent): void => {\n this.setState({ rowsPerPage: parseInt(event.target.value, 10), page: 0 })\n }\n\n handleChangeDense = (event: React.ChangeEvent): void => {\n this.setState({ dense: event.target.checked })\n }\n\n isSelected = (name: string): boolean => this.state.selected.includes(name)\n\n displaySessionInfo = (id: string): JSX.Element => {\n const handleInfoIconClick = (): void => {\n this.handleDialogOpen(id)\n }\n const { classes } = this.props\n return (\n \n \n \n )\n }\n\n displayLiveView = (id: string): JSX.Element => {\n const handleLiveViewIconClick = (): void => {\n this.handleLiveViewOpen(id)\n }\n const { classes } = this.props\n return (\n \n \n \n )\n }\n\n render (): ReactNode {\n const { sessions, classes } = this.props\n const { dense, order, orderBy, page, rowOpen, rowLiveViewOpen, rowsPerPage } = this.state\n\n const rows = sessions.map((session) => {\n return createSessionData(\n session.id,\n session.capabilities,\n session.startTime,\n session.uri,\n session.nodeId,\n session.nodeUri,\n session.sessionDurationMillis,\n session.slot\n )\n })\n const emptyRows = rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage)\n\n return (\n
\n {rows.length > 0 && (\n
\n \n \n \n \n \n \n {stableSort(rows, getComparator(order, orderBy))\n .slice(page * rowsPerPage,\n page * rowsPerPage + rowsPerPage)\n .map((row, index) => {\n const isItemSelected = this.isSelected(\n row.id as string)\n const labelId = `enhanced-table-checkbox-${index}`\n return (\n \n this.handleClick(event, row.id as string)}\n role='checkbox'\n aria-checked={isItemSelected}\n tabIndex={-1}\n key={row.id}\n selected={isItemSelected}\n >\n \n {\n (row.vnc as string).length > 0 &&\n this.displayLiveView(row.id as string)\n }\n {row.id}\n {\n (row.vnc as string).length > 0 &&\n \n \n \n \n Session\n \n {row.name}\n \n \n \n {browserVersion(\n row.browserVersion as string)}\n \n \n \n \n \n \n Close\n \n \n \n }\n \n \n {this.displaySessionInfo(row.id as string)}\n \n \n {browserVersion(row.browserVersion as string)}\n \n \n \n \n Session\n \n {row.name}\n \n \n \n {browserVersion(row.browserVersion as string)}\n \n \n \n Capabilities:\n \n \n
\n                                      {JSON.stringify(\n                                        JSON.parse(\n                                          row.capabilities as string) as object,\n                                        null, 2)}\n                                    
\n
\n
\n \n \n Close\n \n \n \n
\n \n {row.startTime}\n \n \n {prettyMilliseconds(\n Number(row.sessionDurationMillis))}\n \n \n {row.nodeUri}\n \n \n )\n })}\n {emptyRows > 0 && (\n \n \n \n )}\n
\n \n
\n \n
\n }\n label='Dense padding'\n />\n
\n )}\n
\n )\n }\n}\n\nexport default withStyles(useStyles)(RunningSessions)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport * as React from 'react'\nimport { createStyles, StyleRules, Theme } from '@material-ui/core/styles'\nimport { List, ListItem, withStyles } from '@material-ui/core'\nimport EnhancedTableToolbar from '../EnhancedTableToolbar'\nimport { ReactNode } from 'react'\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n root: {\n width: '100%',\n paddingTop: 30\n },\n queueList: {\n minWidth: 750,\n backgroundColor: theme.palette.background.paper,\n marginBottom: 20\n },\n queueListItem: {\n borderBottomWidth: 1,\n borderBottomStyle: 'solid',\n borderBottomColor: '#e0e0e0'\n }\n })\n\ninterface QueuedSessionsProps {\n sessionQueueRequests: string[]\n classes: any\n}\n\nclass QueuedSessions extends React.Component {\n render (): ReactNode {\n const { sessionQueueRequests, classes } = this.props\n const queue = sessionQueueRequests.map((queuedSession) => {\n return JSON.stringify(JSON.parse(queuedSession) as object)\n })\n return (\n
\n {queue.length > 0 && (\n
\n \n \n {queue.map((queueItem, index) => {\n return (\n \n
\n                      {queueItem}\n                    
\n
\n )\n })}\n
\n
\n )}\n
\n )\n }\n}\n\nexport default withStyles(useStyles)(QueuedSessions)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport RunningSessions from '../../components/RunningSessions/RunningSessions'\nimport { ApolloClient, ApolloConsumer } from '@apollo/client'\nimport { loader } from 'graphql.macro'\nimport { GridConfig } from '../../config'\nimport Grid from '@material-ui/core/Grid'\nimport QueuedSessions from '../../components/QueuedSessions/QueuedSessions'\nimport NoData from '../../components/NoData/NoData'\nimport Loading from '../../components/Loading/Loading'\nimport Error from '../../components/Error/Error'\n\nconst GRID_SESSIONS_QUERY = loader('../../graphql/sessions.gql')\n\ninterface SessionsProps {\n classes: any\n}\n\ninterface SessionsState {\n loading: boolean\n error: string | undefined\n data: any\n}\n\nclass Sessions extends React.Component {\n client: ApolloClient | null\n intervalID\n\n constructor (props) {\n super(props)\n this.client = null\n }\n\n fetchData = (): void => {\n this.client?.query(\n { query: GRID_SESSIONS_QUERY, fetchPolicy: 'network-only' })\n .then(({ loading, error, data }) => {\n this.setState({\n loading: loading,\n error: error?.networkError?.message,\n data: data\n })\n })\n .catch((error) => {\n this.setState({ loading: false, error: error.message })\n })\n }\n\n componentDidMount (): void {\n this.fetchData()\n this.intervalID =\n setInterval(this.fetchData.bind(this),\n GridConfig.status.xhrPollingIntervalMillis)\n }\n\n componentWillUnmount (): void {\n clearInterval(this.intervalID)\n }\n\n render (): ReactNode {\n if (this.client === null) {\n return (\n \n {client => {\n this.client = client\n return (\n \n \n \n )\n }}\n \n )\n }\n const { loading, error, data } = this.state ?? { loading: false, error: 'No connection to the Grid', data: [] }\n\n if (loading) {\n return (\n \n \n \n )\n }\n\n if (error !== undefined) {\n const message = 'There has been an error while loading the running and queued Sessions from the Grid.'\n return (\n \n \n \n )\n }\n if (data.sessionsInfo.sessionQueueRequests.length === 0 && data.sessionsInfo.sessions.length === 0) {\n const shortMessage = 'There are no running or queued sessions at the moment.'\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n \n )\n }\n}\n\nexport default Sessions\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport { Box, Container, Link, Typography } from '@material-ui/core'\nimport {\n createStyles,\n StyleRules,\n Theme,\n withStyles\n} from '@material-ui/core/styles'\nimport { RouteComponentProps, withRouter } from 'react-router-dom'\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n root: {\n backgroundColor: theme.palette.secondary.main,\n height: '100%',\n paddingBottom: theme.spacing(3),\n paddingTop: theme.spacing(3),\n width: '100%',\n justifyContent: 'center'\n },\n image: {\n marginTop: 50,\n display: 'inline-block',\n maxWidth: '100%',\n width: 560\n }\n })\n\ninterface HelpProps extends RouteComponentProps {\n classes: any\n}\n\nclass Help extends React.Component {\n // noinspection HtmlUnknownAnchorTarget\n render (): ReactNode {\n const { classes, location } = this.props\n\n return (\n
\n \n \n {location.pathname !== '/help' && (\n \n \n Whoops! The URL specified routes to this help page.\n \n \n )}\n \n \n More information about Selenium Grid can be found at the{' '}\n \n documentation\n .\n \n \n \n \n Please report bugs and issues to the Selenium{' '}\n \n issue tracker\n .\n \n \n \n \n For questions and help, check the different support channels on\n our{' '}\n \n website\n .\n \n \n \n \n Selenium is made possible through the efforts of our open source\n community, contributions from these{' '}\n \n people\n \n , and our{' '}\n \n sponsors\n .\n \n \n \n \n
\n )\n }\n}\n\nexport default withStyles(useStyles)(withRouter(Help))\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport React, { ReactNode } from 'react'\nimport {\n Box,\n CircularProgress,\n CircularProgressProps,\n createStyles,\n Theme,\n Typography,\n withStyles\n} from '@material-ui/core'\nimport { StyleRules } from '@material-ui/core/styles'\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n concurrencyBackground: {\n backgroundColor: theme.palette.secondary.main\n }\n })\n\nfunction CircularProgressWithLabel (props: CircularProgressProps & { value: number }): JSX.Element {\n return (\n \n \n \n \n {`${Math.round(props.value)}%`}\n \n \n \n )\n}\n\ninterface OverallConcurrencyProps {\n sessionCount: number\n maxSession: number\n classes: any\n}\n\nclass OverallConcurrency extends React.Component {\n render (): ReactNode {\n const { maxSession, sessionCount, classes } = this.props\n const currentLoad = Math.min(\n ((sessionCount / (maxSession === 0 ? 1 : maxSession)) * 100), 100)\n\n return (\n \n \n Concurrency\n \n \n \n \n \n \n {sessionCount}\n \n {' / '}\n \n {maxSession}\n \n \n \n )\n }\n}\n\nexport default (withStyles(useStyles))(OverallConcurrency)\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport Divider from '@material-ui/core/Divider'\nimport Drawer from '@material-ui/core/Drawer'\nimport IconButton from '@material-ui/core/IconButton'\nimport List from '@material-ui/core/List'\nimport ListItem from '@material-ui/core/ListItem'\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\nimport ListItemText from '@material-ui/core/ListItemText'\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft'\nimport DashboardIcon from '@material-ui/icons/Dashboard'\nimport AssessmentIcon from '@material-ui/icons/Assessment'\nimport HelpIcon from '@material-ui/icons/Help'\nimport clsx from 'clsx'\nimport React, { ReactNode } from 'react'\nimport {\n Box,\n createStyles,\n Theme,\n Typography,\n withStyles\n} from '@material-ui/core'\nimport { withRouter } from 'react-router'\nimport { RouteComponentProps } from 'react-router-dom'\nimport OverallConcurrency from './OverallConcurrency'\nimport { StyleRules } from '@material-ui/core/styles'\n\nconst drawerWidth = 240\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n root: {\n display: 'flex'\n },\n toolbarIcon: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n padding: '0 8px',\n ...theme.mixins.toolbar,\n backgroundColor: theme.palette.primary.main\n },\n drawerPaper: {\n position: 'relative',\n whiteSpace: 'nowrap',\n width: drawerWidth,\n minHeight: '100vh',\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen\n })\n },\n drawerPaperClose: {\n overflowX: 'hidden',\n minHeight: '100vh',\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen\n }),\n width: theme.spacing(7),\n [theme.breakpoints.up('sm')]: {\n width: theme.spacing(9)\n }\n },\n queueBackground: {\n backgroundColor: theme.palette.secondary.main\n }\n\n })\n\nfunction ListItemLink (props): JSX.Element {\n return \n}\n\ninterface NavBarProps extends RouteComponentProps {\n open: boolean\n maxSession: number\n sessionCount: number\n nodeCount: number\n sessionQueueSize: number\n classes: any\n}\n\nclass NavBar extends React.Component {\n static defaultProps = {\n open: false\n }\n\n render (): ReactNode {\n const {\n open,\n maxSession,\n sessionCount,\n nodeCount,\n sessionQueueSize,\n classes,\n location\n } = this.props\n\n // Not showing the overall status when the user is on the Overview page and there is only one node, because polling\n // is not happening at the same time and it could be confusing for the user. So, displaying it when there is more\n // than one node, or when the user is on a different page and there is at least one node registered.\n const showOverallConcurrency = nodeCount > 1 || (location.pathname !== '/' && nodeCount > 0)\n\n return (\n \n
\n \n \n \n
\n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n \n {open && (\n \n \n Queue size: {sessionQueueSize}\n \n \n )}\n {showOverallConcurrency && open && (\n \n )}\n \n )\n }\n}\n\nexport default (withStyles(useStyles))(withRouter(NavBar))\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport {\n ApolloClient,\n ApolloProvider,\n InMemoryCache,\n NormalizedCacheObject\n} from '@apollo/client'\nimport {\n Route,\n RouteComponentProps,\n Switch,\n withRouter\n} from 'react-router-dom'\nimport React, { ReactNode } from 'react'\nimport ReactModal from 'react-modal'\nimport { GridConfig } from './config'\nimport TopBar from './components/TopBar/TopBar'\nimport Overview from './screens/Overview/Overview'\nimport Footer from './components/Footer/Footer'\nimport Container from '@material-ui/core/Container'\nimport Sessions from './screens/Sessions/Sessions'\nimport Help from './screens/Help/Help'\nimport {\n createStyles,\n StyleRules,\n Theme,\n withStyles\n} from '@material-ui/core/styles'\nimport { loader } from 'graphql.macro'\nimport NavBar from './components/NavBar/NavBar'\n\nexport const client: ApolloClient = new ApolloClient(\n {\n cache: new InMemoryCache(),\n uri: GridConfig.serverUri\n })\n\ninterface AppProps extends RouteComponentProps {\n classes: any\n}\n\nconst useStyles = (theme: Theme): StyleRules => createStyles(\n {\n root: {\n display: 'flex'\n },\n content: {\n flexGrow: 1,\n height: '100vh',\n overflow: 'auto',\n paddingTop: theme.spacing(8)\n },\n container: {\n paddingTop: theme.spacing(4),\n paddingBottom: theme.spacing(4)\n }\n })\n\nif (process.env.NODE_ENV !== 'test') {\n ReactModal.setAppElement('#root')\n}\n\nconst GRID_QUERY = loader('./graphql/grid.gql')\n\ninterface AppState {\n drawerOpen: boolean\n loading: boolean\n error: string | undefined\n data: any\n}\n\nclass App extends React.Component {\n intervalID\n\n constructor (props) {\n super(props)\n this.state = {\n drawerOpen: true,\n loading: true,\n error: undefined,\n data: {}\n }\n }\n\n fetchData = (): void => {\n client.query({ query: GRID_QUERY, fetchPolicy: 'network-only' })\n .then(({ loading, error, data }) => {\n this.setState({\n loading: loading,\n error: error?.networkError?.message,\n data: data\n })\n })\n .catch((error) => {\n this.setState({ loading: false, error: error.message })\n })\n }\n\n componentDidMount (): void {\n this.fetchData()\n this.intervalID =\n setInterval(this.fetchData.bind(this),\n GridConfig.status.xhrPollingIntervalMillis)\n }\n\n componentWillUnmount (): void {\n clearInterval(this.intervalID)\n }\n\n toggleDrawer = (): void => {\n this.setState({ drawerOpen: !this.state.drawerOpen })\n }\n\n render (): ReactNode {\n const { classes } = this.props\n const { error, data, drawerOpen } = this.state\n\n const maxSession = error !== undefined ? 0 : data?.grid?.maxSession ?? 0\n const sessionCount = error !== undefined ? 0 : data?.grid?.sessionCount ?? 0\n const nodeCount = error !== undefined ? 0 : data?.grid?.nodeCount ?? 0\n const sessionQueueSize = error !== undefined ? 0\n : data?.grid?.sessionQueueSize ?? 0\n\n const topBarSubheader = error ?? data?.grid?.version\n\n return (\n \n
\n \n {error === undefined && (\n \n )}\n
\n \n \n \n \n \n \n \n \n
\n
\n
\n
\n )\n }\n}\n\nexport default withStyles(useStyles)(withRouter(App))\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\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(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n)\n\nexport function register (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(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n )\n })\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config)\n }\n })\n }\n}\n\nfunction registerValidSW (swUrl, 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(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n )\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, config) {\n // Check if the service worker can be found. If it can't reload the page.\n // @ts-ignore\n window.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 (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\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(\n 'No internet connection found. App is running in offline mode.'\n )\n })\n}\n\nexport function unregister () {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister()\n })\n .catch(error => {\n console.error(error.message)\n })\n }\n}\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nconst typogpaphy = {\n h1: {\n fontWeight: 500,\n fontSize: 35,\n letterSpacing: '-0.24px'\n },\n h2: {\n fontWeight: 500,\n fontSize: 29,\n letterSpacing: '-0.24px'\n },\n h3: {\n fontWeight: 500,\n fontSize: 24,\n letterSpacing: '-0.06px'\n },\n h4: {\n fontWeight: 500,\n fontSize: 20,\n letterSpacing: '-0.06px'\n },\n h5: {\n fontWeight: 500,\n fontSize: 16,\n letterSpacing: '-0.05px'\n },\n h6: {\n fontWeight: 500,\n fontSize: 14,\n letterSpacing: '-0.05px'\n },\n overline: {\n fontWeight: 500\n },\n fontFamily: [\n 'Encode Sans',\n 'sans-serif'\n ].join(',')\n}\n\nexport default typogpaphy\n","// Licensed to the Software Freedom Conservancy (SFC) under one\n// or more contributor license agreements. See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership. The SFC licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License. You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied. See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\nimport red from '@material-ui/core/colors/red'\nimport { createMuiTheme, Theme } from '@material-ui/core/styles'\nimport typography from './typography'\n\n// A custom theme for this app\nconst theme: Theme = createMuiTheme({\n palette: {\n primary: {\n main: '#615E9B'\n },\n secondary: {\n main: '#F7F8F8'\n },\n error: {\n main: red.A400\n },\n background: {\n default: '#F7F8F8'\n }\n },\n typography\n})\n\nexport default theme\n","import { CssBaseline } from '@material-ui/core'\nimport { ThemeProvider } from '@material-ui/core/styles'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { HashRouter as Router } from 'react-router-dom'\nimport App from './App'\nimport * as serviceWorker from './serviceWorker'\nimport theme from './theme/theme'\nimport './index.css'\n\nReactDOM.render(\n \n \n {/* CssBaseline kick start an elegant, consistent, and simple baseline to build upon. */}\n \n \n \n \n \n ,\n document.getElementById('root')\n)\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":""}