{"version":3,"sources":["utils/fontawesome.tsx","utils/constants.tsx","api/socket.tsx","components/Header.tsx","components/DeviceInputView.tsx","components/EventTableHeadSelectModal.tsx","components/EventTableView.tsx","utils/format.tsx","components/EventStreamView.tsx","components/NotFound.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["library","add","faEnvelope","faHome","faSort","faSortUp","faSortDown","faTrash","faTimesCircle","EVENT_TABLE_HEADINGS","LOCAL_STORAGE_SELECTED_FILTERS","LOCAL_STORAGE_DEVICE_ID_HISTORY","username","uuid","split","url","process","socket","WebSocket","waitForOpenConnection","Promise","resolve","reject","currentAttempt","interval","setInterval","maxNumberOfAttempts","clearInterval","Error","readyState","OPEN","subscribe","deviceID","a","clientMessage","console","log","send","JSON","stringify","error","unsubscribe","Header","Navbar","bg","expand","className","classNames","Brand","href","src","height","alt","Nav","Link","DeviceInputView","props","devicesHistory","getDeviceIdsInStorage","useState","deviceIDs","setDeviceIDs","useEffect","selectDeviceIds","map","includes","concat","Form","inline","onSubmit","event","preventDefault","target","deviceInput","deviceId","value","toString","trim","toUpperCase","length","addDeviceIdToStorage","onDeviceSubscribe","Dropdown","as","InputGroup","size","Toggle","FormControl","autoComplete","placeholder","name","Menu","index","Item","eventKey","Button","variant","onClick","handleDeviceClick","deviceIds","filter","item","window","localStorage","setItem","constants","itemId","onDeviceRemove","handleTrash","icon","Append","type","onUnsubscribeAll","Row","Col","xs","handleUnsubscribe","EventTableHeadSelectModal","headingsCheck","forEach","heading","headings","setHeadings","handleChange","checked","Modal","aria-labelledby","onHide","show","animation","closeButton","Title","id","Body","FormControlLabel","control","Checkbox","Object","keys","every","key","onChange","color","label","md","Footer","selectedFilters","onHeadingSave","useTableStyles","makeStyles","container","borderTopLeftRadius","borderTopRightRadius","header","minWidth","EventTableView","selectedHeadings","getItem","selected","parse","headingModalDisplay","setHeadingModalDisplay","tableClasses","generateDownloadWindow","fileName","content","encodedUri","encodeURI","link","document","createElement","setAttribute","style","visibility","body","appendChild","click","removeChild","useCallback","columns","useMemo","entry","assign","accessor","Cell","cell","quotesOnKeys","displayDataTypes","collapsed","v","stringValue","parseInt","DateTime","fromSeconds","toLocaleString","DATETIME_FULL","fromMillis","epochToString","messages","React","eventMessages","StyledTableCell","withStyles","theme","createStyles","head","backgroundColor","palette","info","light","common","white","fontSize","TableCell","useTable","data","useSortBy","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","lowerCasedValue","toLowerCase","onSearchQueryUpdate","tsvContent","join","eventMessage","dataField","push","jsonContent","handleClearData","TableContainer","TableHead","headerGroup","TableRow","getHeaderGroupProps","headers","column","getHeaderProps","getSortByToggleProps","render","TableSortLabel","active","isSorted","direction","isSortedDesc","TableBody","row","getRowProps","background","cells","getCellProps","EventStreamView","allEventMessages","setAllEventMessages","setEventMessages","activeDeviceIds","setActiveDeviceIds","paramDeviceIds","setActiveParamDeviceIds","history","useHistory","devices","URLSearchParams","useLocation","search","get","cb","msg","streamEvent","s","onopen","onmessage","onclose","onerror","deviceIdsInText","addedDevices","query","entries","some","activeDeviceId","NotFound","year","Date","getFullYear","to","App","CssBaseline","path","component","exact","Component","Boolean","location","hostname","match","ReactDOM","StrictMode","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","message"],"mappings":"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","file":"static/js/main.f865fe37.chunk.js","sourcesContent":["// src/utils/fontawesome.tsx\n\nimport { library } from '@fortawesome/fontawesome-svg-core';\nimport { faEnvelope, faHome, faSort, faSortUp, faSortDown, faTrash, faTimesCircle } from '@fortawesome/free-solid-svg-icons';\n\nlibrary.add(\n faEnvelope,\n faHome,\n faSort,\n faSortUp,\n faSortDown,\n faTrash,\n faTimesCircle\n);\n","export const EVENT_TABLE_HEADINGS = [\n 's',\n 'uid',\n 'client_ip',\n 'revid',\n 'sess_id',\n 'game_name',\n 'event_type',\n 'st1',\n 'st2',\n 'st3',\n 'n',\n 'l',\n 'v',\n 'ts',\n 'c',\n 'tu',\n 'json_data',\n 'kt_v',\n 'time_stamp',\n 'v_maj',\n 'v_min',\n 'v_rev',\n 'os',\n 'app_key',\n 'req_id',\n 'i',\n];\n\nexport const LOCAL_STORAGE_SELECTED_FILTERS = 'selected-filters';\nexport const LOCAL_STORAGE_DEVICE_ID_HISTORY = 'device_id_history';\n\nexport const LOCAL_SOCKET_URL = 'ws://localhost:8080/socket';","// api/socket.tsx\nimport { LOCAL_SOCKET_URL } from \"../utils/constants\";\nimport { v4 as uuid } from 'uuid';\n\nconst server = process.env.NODE_ENV === 'production' ? process.env.REACT_APP_SOCKET_SERVER_URL || LOCAL_SOCKET_URL : LOCAL_SOCKET_URL;\nconst username = uuid().split('-')[0];\nconst url = `${server}?username=${username}`;\nconst socket = new WebSocket(url);\n\n\nconst waitForOpenConnection = (socket: any) => {\n return new Promise((resolve, reject) => {\n const maxNumberOfAttempts = 10\n const intervalTime = 200 //ms\n\n let currentAttempt = 0\n const interval = setInterval(() => {\n if (currentAttempt > maxNumberOfAttempts - 1) {\n clearInterval(interval)\n reject(new Error('Maximum number of attempts exceeded'))\n } else if (socket.readyState === socket.OPEN) {\n clearInterval(interval)\n resolve()\n }\n currentAttempt++\n }, intervalTime)\n })\n}\n\nlet connect = (cb: any) => {\n\n socket.onopen = () => {\n console.log(`Successful Connection: ${url}`);\n };\n\n socket.onmessage = (msg: any) => {\n cb(msg);\n };\n\n socket.onclose = (event: any) => {\n console.log(\"Socket closed connection: \", event);\n };\n\n socket.onerror = (error: any) => {\n console.log(\"Socket error: \", error);\n };\n};\n\nlet subscribe = async (deviceID: string) => {\n const clientMessage = {\n \"command\": 0,\n \"channel\": deviceID\n };\n console.log(\"Subscribing to channel: \", deviceID);\n\n if (socket.readyState !== socket.OPEN) {\n try {\n await waitForOpenConnection(socket)\n socket.send(JSON.stringify(clientMessage));\n } catch (err) { console.error(err) }\n} else {\n socket.send(JSON.stringify(clientMessage));\n}\n};\n\nlet unsubscribe = (deviceID: string) => {\n const clientMessage = {\n \"command\": 1,\n \"channel\": deviceID\n };\n console.log(\"Unsubscribing from channel: \", deviceID);\n socket.send(JSON.stringify(clientMessage));\n};\n\nlet sendMsg = (msg: any) => {\n const blob = {\n \"event\": \"sub\",\n \"payload\": \"some text here\"\n };\n console.log(\"sending msg: \", msg);\n socket.send(msg);\n socket.send(JSON.stringify(blob));\n};\n\nexport { connect, sendMsg, subscribe, unsubscribe };\n","// src/components/Header/Header.tsx\nimport React from \"react\";\nimport \"./Header.scss\";\n\nimport classNames from 'classnames';\n\nimport Navbar from 'react-bootstrap/Navbar';\nimport Nav from 'react-bootstrap/Nav';\n\nexport const Header = () => {\n return (\n \n \n \n \n \n \n );\n}\n\nexport default Header;","import React, { useEffect, useState } from \"react\";\nimport { Button, Dropdown, Form, FormControl, InputGroup, Row, Col } from \"react-bootstrap\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport * as constants from '../utils/constants'\n\nimport \"./DeviceInputView.scss\";\nimport classNames from \"classnames\";\n\ntype DeviceInputProps = {\n onDeviceSubscribe: any,\n onDeviceRemove: any,\n onUnsubscribeAll: any,\n selectDeviceIds: string[],\n getDeviceIdsInStorage: any,\n addDeviceIdToStorage: any,\n};\n\nexport const DeviceInputView = (props: DeviceInputProps) => {\n\n const devicesHistory = props.getDeviceIdsInStorage();\n const [deviceIDs, setDeviceIDs] = useState([] as string[]);\n\n useEffect(() => {\n props.selectDeviceIds?.map((deviceID) => {\n if (!deviceIDs.includes(deviceID)) {\n setDeviceIDs(deviceIDs.concat(deviceID));\n }\n })\n });\n\n const handleSubscribe = (event: any) => {\n event.preventDefault();\n if (event.target) {\n const deviceInput = event.target.deviceId.value?.toString()?.trim().toUpperCase();\n if (deviceInput?.length <= 0) return;\n props.addDeviceIdToStorage(deviceInput);\n setDeviceIDs(deviceIDs.concat(deviceInput));\n props.onDeviceSubscribe(deviceInput);\n event.target.deviceId.value = '';\n }\n }\n\n const handleDeviceClick = (deviceId: string) => {\n if (!deviceIDs.includes(deviceId)) {\n props.addDeviceIdToStorage(deviceId);\n setDeviceIDs(deviceIDs.concat(deviceId));\n props.onDeviceSubscribe(deviceId);\n }\n }\n\n const handleTrash = (deviceId: string) => {\n let deviceIds = props.getDeviceIdsInStorage();\n deviceIds = deviceIds.filter((item: string) => item !== deviceId);\n window.localStorage.setItem(constants.LOCAL_STORAGE_DEVICE_ID_HISTORY, JSON.stringify(deviceIds));\n setDeviceIDs(deviceIDs.filter((itemId: string) => itemId !== deviceId));\n props.onDeviceRemove(deviceId);\n }\n\n const handleUnsubscribe = (deviceId: string) => {\n setDeviceIDs(deviceIDs.filter((itemId: string) => itemId !== deviceId));\n props.onDeviceRemove(deviceId);\n }\n\n const handleClear = () => {\n setDeviceIDs([]);\n props.onUnsubscribeAll(deviceIDs);\n }\n\n return (\n
\n
\n \n \n \n {devicesHistory.map((deviceId: string, index: number) => {\n return (\n \n \n \n \n );\n })}\n \n \n \n \n \n \n
\n \n Active subscriptions:\n \n {deviceIDs.map((deviceId: string, index: number) => {\n return (\n \n {deviceId}\n handleUnsubscribe(deviceId)}>\n \n \n \n );\n })}\n \n \n
\n );\n}","import React, {useState} from \"react\";\nimport Modal from 'react-bootstrap/Modal';\nimport Button from \"react-bootstrap/Button\";\nimport Row from 'react-bootstrap/Row';\nimport Col from 'react-bootstrap/Col';\nimport { Checkbox, FormControlLabel } from \"@material-ui/core\";\nimport * as constants from '../utils/constants';\n\n\ntype EventTableHeadSelectProps = {\n headings: string[],\n show: boolean,\n onHide: any,\n onHeadingSave: (headings: string[]) => void;\n}\n\nexport const EventTableHeadSelectModal = (props: EventTableHeadSelectProps) => {\n\n const headingsCheck: {[key: string]: boolean} = {};\n\n constants.EVENT_TABLE_HEADINGS.forEach((heading: string) => {\n headingsCheck[heading] = false;\n });\n\n props.headings.forEach((heading: string) => {\n headingsCheck[heading] = true;\n });\n\n const [headings, setHeadings] = useState(headingsCheck);\n\n const handleChange = (event: any) => {\n const { value, checked } = event.target;\n setHeadings({...headings, [value]: checked});\n }\n\n const onHeadingsSave = () => {\n const selectedFilters = Object.keys(headings).filter(key => headings[key]);\n window.localStorage.setItem(constants.LOCAL_STORAGE_SELECTED_FILTERS, JSON.stringify(selectedFilters));\n props.onHeadingSave(selectedFilters);\n }\n\n const selectAllChecked = () => {\n return Object.keys(headings).every(key => headings[key]);\n }\n\n const selectAll = (event: any) => {\n\n const { checked } = event.target;\n\n constants.EVENT_TABLE_HEADINGS.forEach((heading: string) => {\n headingsCheck[heading] = checked;\n });\n setHeadings({...headingsCheck})\n }\n\n return (\n \n \n \n Choose Event Table Headings\n \n \n \n \n \n }\n label=\"Select All\"\n />\n \n \n {constants.EVENT_TABLE_HEADINGS.map((heading:string, index:number) => {\n return (\n \n \n }\n label={`${heading}`}\n />\n \n );\n })}\n \n \n \n \n \n \n \n );\n}","import React, {useCallback, useMemo, useState} from \"react\";\nimport { EventMessage } from \"../class/EventMessage\";\n\nimport { Row as BootstrapRow } from \"react-bootstrap\"; // rename to avoid naming conflict with react table\nimport Col from \"react-bootstrap/Col\";\nimport FormControl from \"react-bootstrap/FormControl\";\nimport Button from \"react-bootstrap/Button\";\nimport MaUTable from '@material-ui/core/Table';\nimport {\n createStyles,\n makeStyles,\n TableBody,\n TableCell,\n TableRow,\n TableSortLabel,\n TableHead,\n TableContainer,\n Theme,\n withStyles\n} from \"@material-ui/core/\";\nimport {Cell, useSortBy, useTable, Row} from \"react-table\";\nimport ReactJson from \"react-json-view\";\nimport {epochToString} from \"../utils/format\";\nimport {EventTableHeadSelectModal} from \"./EventTableHeadSelectModal\";\nimport * as constants from \"../utils/constants\";\n\ntype EventHistoryViewProps = {\n handleClearData: any,\n onSearchQueryUpdate: any,\n eventMessages: any[] // Have to use type to be compatible with react-table Column Type\n}\n\nconst useTableStyles = makeStyles({\n container: {\n borderTopLeftRadius: \"4px\",\n borderTopRightRadius: \"4px\",\n },\n header: {\n minWidth: \"138px\",\n },\n});\n\nexport const EventTableView = (props: EventHistoryViewProps) => {\n\n const selectedHeadings = window.localStorage.getItem(constants.LOCAL_STORAGE_SELECTED_FILTERS);\n const selected = (selectedHeadings != null ? JSON.parse(selectedHeadings) : constants.EVENT_TABLE_HEADINGS) as string[];\n const [headings, setHeadings] = useState(selected);\n const [headingModalDisplay, setHeadingModalDisplay] = useState(false);\n\n const tableClasses = useTableStyles();\n\n const onSearchQueryChange = (event: any) => {\n const filter = event.target.value;\n\n const lowerCasedValue = filter.toLowerCase().trim();\n props.onSearchQueryUpdate(lowerCasedValue);\n }\n\n const onExportTSVClick = () => {\n let tsvContent = \"data:text/tsv;charset=utf-8,\";\n\n tsvContent += headings.join('\\t');\n tsvContent += '\\r\\n';\n\n tsvContent += props.eventMessages.map((eventMessage: any) => {\n const dataField: any = [];\n headings.forEach(heading => {\n dataField.push(JSON.stringify(eventMessage[heading]));\n });\n return dataField.join('\\t');\n }).join('\\r\\n');\n\n generateDownloadWindow('export.tsv', tsvContent);\n }\n\n const onExportJSONClick = () => {\n const jsonContent = `data:application/json;charset=utf-8, ${JSON.stringify(props.eventMessages, null, 2)}`;\n generateDownloadWindow('data.json', jsonContent);\n }\n\n const generateDownloadWindow = (fileName: string, content: string) => {\n const encodedUri = encodeURI(content);\n const link = document.createElement(\"a\");\n link.setAttribute(\"href\", encodedUri);\n link.setAttribute(\"download\", fileName);\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n const onHeadingSave = useCallback((headings: string[]) => {\n setHeadings(headings);\n setHeadingModalDisplay(false);\n }, [setHeadings, setHeadingModalDisplay]);\n\n const columns = useMemo(() => {\n return headings.map((heading: string) => {\n const entry = Object.assign({}, {\n Header: heading,\n accessor: heading as keyof EventMessage,\n });\n\n switch (heading) {\n case 'json_data':\n return Object.assign(entry, {\n Cell: ({cell: {value}}: any) => \n });\n case 'ts':\n return Object.assign(entry, {\n Cell: ({cell: {value}}: any) => epochToString(value)\n });\n default:\n return entry;\n }\n })\n }, [headings]);\n\n const messages = React.useMemo(() => props.eventMessages, [props.eventMessages]);\n\n const StyledTableCell = withStyles((theme: Theme) =>\n createStyles({\n head: {\n backgroundColor: theme.palette.info.light,\n color: theme.palette.common.white,\n },\n body: {\n fontSize: 14,\n },\n }),\n )(TableCell);\n\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n rows,\n prepareRow,\n } = useTable(\n {\n columns: columns,\n data: messages,\n },\n useSortBy,\n );\n\n return (\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n { headerGroups.map(headerGroup => (\n \n { headerGroup.headers.map(column => (\n \n {column.render(\"Header\")}\n \n \n ))}\n \n ))}\n \n \n {rows.map((row: Row, index:number) => {\n // prepare rows and get the row props from react-table dynamically\n prepareRow(row);\n return (\n \n {row.cells.map((cell:Cell) => {\n return {cell.render(\"Cell\")}\n })}\n \n );\n })}\n \n \n \n setHeadingModalDisplay(false)}\n />\n
\n );\n}","// src/utils/format.tsx\n\nimport { DateTime } from \"luxon\";\n\nexport const epochToString = (v: number) => {\n let stringValue = v ? v.toString() : '';\n if (v !== parseInt(stringValue, 10)) {\n return stringValue;\n }\n switch (stringValue.length) {\n case 10:\n stringValue = DateTime.fromSeconds(v).toLocaleString(DateTime.DATETIME_FULL);\n break;\n case 13:\n stringValue = DateTime.fromMillis(v).toLocaleString(DateTime.DATETIME_FULL);\n break;\n default:\n }\n return stringValue;\n};\n","import React, {useCallback, useEffect, useState} from 'react';\nimport { EventMessage } from \"../class/EventMessage\";\nimport { connect, subscribe, unsubscribe } from '../api/socket';\nimport Header from \"./Header\";\nimport { DeviceInputView } from \"./DeviceInputView\";\nimport { EventTableView } from \"./EventTableView\";\nimport { useLocation, useHistory} from 'react-router-dom';\nimport * as constants from '../utils/constants'\n\n\nexport const EventStreamView = () => {\n\n const [allEventMessages, setAllEventMessages] = useState([] as EventMessage[]);\n const [eventMessages, setEventMessages] = useState([] as EventMessage[]);\n const [activeDeviceIds, setActiveDeviceIds] = useState([] as string[]);\n const [paramDeviceIds, setActiveParamDeviceIds] = useState([] as string[]);\n const history = useHistory();\n\n\n const query = new URLSearchParams(useLocation().search);\n const devices = query.get('s')?.split(',');\n\n useEffect(() => {\n connect((msg: any) => {\n const streamEvent = JSON.parse(msg.data);\n if (activeDeviceIds.includes(streamEvent.s)) {\n setEventMessages(eventMessages.concat(streamEvent));\n setAllEventMessages(allEventMessages.concat(streamEvent));\n }\n });\n }); \n\n useEffect(() => {\n devices?.map((deviceID) => {\n if (!paramDeviceIds.includes(deviceID)) {\n setActiveParamDeviceIds(paramDeviceIds.concat(deviceID));\n addDeviceIdToStorage(deviceID);\n onDeviceSubscribe(deviceID);\n }\n })\n });\n\n const onDeviceSubscribe = (deviceId: string) => {\n setActiveDeviceIds(activeDeviceIds.concat(deviceId));\n subscribe(deviceId);\n }\n\n const onDeviceUnSubscribe = (deviceId: string) => {\n unsubscribe(deviceId);\n setActiveDeviceIds(activeDeviceIds.filter((activeDeviceId: string) => activeDeviceId !== deviceId));\n if(paramDeviceIds.length > 0)\n {\n setActiveParamDeviceIds(paramDeviceIds.filter((deviceID: string) => deviceID !== deviceId));\n history.push(\"/stream\")\n }\n }\n\n const onUnsubscribeAll = (deviceIds: string[]) => {\n deviceIds.forEach((deviceId: string) => {\n unsubscribe(deviceId);\n });\n setEventMessages([]);\n setAllEventMessages([]);\n setActiveDeviceIds([]);\n setActiveParamDeviceIds([]);\n }\n\n const handleClearData = () => {\n setEventMessages([]);\n setAllEventMessages([]);\n }\n\n const getDeviceIdsInStorage = () => {\n const deviceIdsInText = window.localStorage.getItem(constants.LOCAL_STORAGE_DEVICE_ID_HISTORY) || '';\n return deviceIdsInText.length ? JSON.parse(deviceIdsInText) : [] as string[];\n }\n\n const addDeviceIdToStorage = (deviceId: string) => {\n let addedDevices = getDeviceIdsInStorage();\n if (!addedDevices.includes(deviceId)) {\n addedDevices = addedDevices.concat(deviceId);\n window.localStorage.setItem(constants.LOCAL_STORAGE_DEVICE_ID_HISTORY, JSON.stringify(addedDevices));\n }\n }\n\n const onSearchQueryUpdate = useCallback((query) => {\n\n setEventMessages(allEventMessages.filter((eventMessage:EventMessage) => {\n return Object.entries(eventMessage).some(([,value]) => {\n const lowerCasedItemValue = value.toString().toLowerCase().trim();\n return lowerCasedItemValue.includes(query);\n });\n }))\n }, [setEventMessages, allEventMessages])\n\n return (\n
\n
\n \n
\n
\n \n
\n
\n
\n );\n}","// src/components/NotFound/NotFound.tsx\nimport React from \"react\";\nimport \"./NotFound.scss\";\nimport { Link } from \"react-router-dom\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport classNames from 'classnames';\n\nexport const NotFound = () => {\n const year = new Date().getFullYear();\n return(\n
\n
\n

404

\n

Well, that was unexpected.

\n
\n

Sorry, I have no clue where that page might be …

\n
\n
\n \n Take Me Home\n \n
\n
\n
\n © {year} Glu Mobile. All rights reserved.\n
\n
\n );\n}","// App.tsx\nimport React, { Component } from \"react\";\nimport { BrowserRouter as Router, Route, Switch } from \"react-router-dom\";\nimport { CssBaseline } from \"@material-ui/core\";\nimport './App.css';\nimport { EventStreamView } from \"./components/EventStreamView\";\nimport { NotFound } from \"./components/NotFound\";\n\nclass App extends Component {\n\n render() {\n return (\n \n
\n \n \n \n \n \n \n \n
\n
\n );\n }\n}\n\nexport default App;","// 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\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(\n process.env.PUBLIC_URL,\n window.location.href\n );\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: 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(\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: 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 (\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","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport './utils/fontawesome';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\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":""}