{"version":3,"mappings":"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","names":["createEventEmitter","eventsEmitter","worker","host","hostname","url","m","eventName","handler","e","SPLIT_LOWER_UPPER_RE","SPLIT_UPPER_UPPER_RE","SPLIT_NUMBER_LOWER_RE","SPLIT_LETTER_NUMBER_RE","DEFAULT_STRIP_REGEXP","SPLIT_REPLACE_VALUE","DEFAULT_PREFIX_CHARACTERS","split","input","options","separateNumbers","result","start","end","sentenceCase","prefix","getPrefix","lower","lowerFactory","upper","upperFactory","transform","capitalCaseTransformFactory","word","index","locale","prefixCharacters","i","char","toggleSelection","selection","active","ranges","range","deselectCurrent","require$$0","clipboardToIE11Formatting","defaultMessage","format","message","copyKey","copy","text","debug","reselectPrevious","mark","success","successful","err","copyToClipboard","TOKENS","IS_MANUAL_CASE","ALPHANUMERIC_PATTERN","WORD_SEPARATORS","SMALL_WORDS","titleCase","smallWords","token","nargs","stringTemplate","template","string","args","match","filingDescriptions","imported","formatFilingDescription","transaction","__vitePreload","f","formatString","ClipboardCopy","ExternalLink","delay","setDelay","streamPath","delayMs","createEventComponent","event","eventCardContainer","element","companyNumber","title","description","getDescription","received","originalEvent","latencyMs","copyButton","c","d","filter","filterTextBox","eventsContainer","containers","streamPaths","container","eventCount","eventCard","timeout","startStatusManager","updateHealthIndicators","initialStatus","recurringUpdate","getHealth","health","indicator","currentWsConnections","res","registerServiceWorker","registration","error"],"sources":["../../src/scripts/workerWrapper.ts","../../node_modules/.pnpm/change-case@5.1.2/node_modules/change-case/dist/index.js","../../node_modules/.pnpm/toggle-selection@1.0.6/node_modules/toggle-selection/index.js","../../node_modules/.pnpm/copy-to-clipboard@3.3.3/node_modules/copy-to-clipboard/index.js","../../node_modules/.pnpm/title-case@4.1.2/node_modules/title-case/dist/index.js","../../node_modules/.pnpm/string-template@1.0.0/node_modules/string-template/index.js","../../src/scripts/formatFilingDescription.ts","../../src/assets/icons/ClipboardCopy.svg","../../src/assets/icons/ExternalLink.svg","../../src/scripts/latencyIndicator.ts","../../src/scripts/eventCardFactory.ts","../../src/scripts/eventManager.ts","../../src/scripts/statusManager.ts","../../src/scripts/registerServiceWorker.ts","../../src/scripts/main.ts"],"sourcesContent":["// this should be called from the main thread. it starts a worker and emits the events\r\n\r\n\r\nexport function createEventEmitter() {\r\n const eventsEmitter = new EventTarget()\r\n const worker = new Worker(new URL(\"./websocketWorker.ts\", import.meta.url), {\r\n type: \"module\"\r\n })\r\n const { host, hostname } = window.location\r\n const protocol = hostname === \"localhost\" ? \"ws\" : \"wss\"\r\n const url = `${protocol}://${host}/events`\r\n worker.postMessage({ type: \"url\", url })\r\n worker.addEventListener(\"message\", m => eventsEmitter.dispatchEvent(new CustomEvent(m.data.type, { detail: m.data.data })))\r\n return {\r\n close(){\r\n worker.postMessage({type:'close'})\r\n },\r\n start(){\r\n worker.postMessage({type:'start'})\r\n },\r\n on(eventName, handler){\r\n eventsEmitter.addEventListener(eventName, e=>handler((e).detail))\r\n },\r\n triggerStatus(){\r\n worker.postMessage({ type: \"status\" })\r\n }\r\n }\r\n}\r\n","// Regexps involved with splitting words in various case formats.\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\nconst SPLIT_NUMBER_LOWER_RE = /(\\d)(\\p{Ll})/gu;\nconst SPLIT_LETTER_NUMBER_RE = /(\\p{L})(\\d)/gu;\n// Regexp involved with stripping non-word characters from the result.\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\n// The replacement value for splits.\nconst SPLIT_REPLACE_VALUE = \"$1\\0$2\";\n// The default characters to keep after transforming case.\nconst DEFAULT_PREFIX_CHARACTERS = \"\";\n/**\n * Split any cased input strings into an array of words.\n */\nexport function split(input, options = {}) {\n const { separateNumbers } = options;\n let result = input.trim();\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n if (separateNumbers) {\n result = result\n .replace(SPLIT_NUMBER_LOWER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_LETTER_NUMBER_RE, SPLIT_REPLACE_VALUE);\n }\n result = result.replace(DEFAULT_STRIP_REGEXP, \"\\0\");\n let start = 0;\n let end = result.length;\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\")\n start++;\n if (start === end)\n return [];\n while (result.charAt(end - 1) === \"\\0\")\n end--;\n return result.slice(start, end).split(/\\0/g);\n}\n/**\n * Convert a string to space separated lower case (`foo bar`).\n */\nexport function noCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n return (prefix +\n split(input, options)\n .map(lowerFactory(options?.locale))\n .join(\" \"));\n}\n/**\n * Convert a string to camel case (`fooBar`).\n */\nexport function camelCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = pascalCaseTransformFactory(lower, upper);\n return (prefix +\n split(input, options)\n .map((word, index) => {\n if (index === 0)\n return lower(word);\n return transform(word, index);\n })\n .join(\"\"));\n}\n/**\n * Convert a string to pascal case (`FooBar`).\n */\nexport function pascalCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n return (prefix +\n split(input, options).map(pascalCaseTransformFactory(lower, upper)).join(\"\"));\n}\n/**\n * Convert a string to pascal snake case (`Foo_Bar`).\n */\nexport function pascalSnakeCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n return (prefix +\n split(input, options)\n .map(capitalCaseTransformFactory(lower, upper))\n .join(\"_\"));\n}\n/**\n * Convert a string to capital case (`Foo Bar`).\n */\nexport function capitalCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n return (prefix +\n split(input, options)\n .map(capitalCaseTransformFactory(lower, upper))\n .join(\" \"));\n}\n/**\n * Convert a string to constant case (`FOO_BAR`).\n */\nexport function constantCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const upper = upperFactory(options?.locale);\n return prefix + split(input, options).map(upper).join(\"_\");\n}\n/**\n * Convert a string to dot case (`foo.bar`).\n */\nexport function dotCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const lower = lowerFactory(options?.locale);\n return prefix + split(input, options).map(lower).join(\".\");\n}\n/**\n * Convert a string to kebab case (`foo-bar`).\n */\nexport function kebabCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const lower = lowerFactory(options?.locale);\n return prefix + split(input, options).map(lower).join(\"-\");\n}\n/**\n * Convert a string to path case (`foo/bar`).\n */\nexport function pathCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const lower = lowerFactory(options?.locale);\n return prefix + split(input, options).map(lower).join(\"/\");\n}\n/**\n * Convert a string to path case (`Foo bar`).\n */\nexport function sentenceCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = capitalCaseTransformFactory(lower, upper);\n return (prefix +\n split(input, options)\n .map((word, index) => {\n if (index === 0)\n return transform(word);\n return lower(word);\n })\n .join(\" \"));\n}\n/**\n * Convert a string to snake case (`foo_bar`).\n */\nexport function snakeCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const lower = lowerFactory(options?.locale);\n return prefix + split(input, options).map(lower).join(\"_\");\n}\n/**\n * Convert a string to header case (`Foo-Bar`).\n */\nexport function trainCase(input, options) {\n const prefix = getPrefix(input, options?.prefixCharacters);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n return (prefix +\n split(input, options)\n .map(capitalCaseTransformFactory(lower, upper))\n .join(\"-\"));\n}\nfunction lowerFactory(locale) {\n return locale === false\n ? (input) => input.toLowerCase()\n : (input) => input.toLocaleLowerCase(locale);\n}\nfunction upperFactory(locale) {\n return locale === false\n ? (input) => input.toUpperCase()\n : (input) => input.toLocaleUpperCase(locale);\n}\nfunction capitalCaseTransformFactory(lower, upper) {\n return (word) => `${upper(word[0])}${lower(word.slice(1))}`;\n}\nfunction pascalCaseTransformFactory(lower, upper) {\n return (word, index) => {\n const char0 = word[0];\n const initial = index > 0 && char0 >= \"0\" && char0 <= \"9\" ? \"_\" + char0 : upper(char0);\n return initial + lower(word.slice(1));\n };\n}\nfunction getPrefix(input, prefixCharacters = DEFAULT_PREFIX_CHARACTERS) {\n let prefix = \"\";\n for (let i = 0; i < input.length; i++) {\n const char = input.charAt(i);\n if (prefixCharacters.includes(char)) {\n prefix += char;\n }\n else {\n break;\n }\n }\n return prefix;\n}\n//# sourceMappingURL=index.js.map","\nmodule.exports = function () {\n var selection = document.getSelection();\n if (!selection.rangeCount) {\n return function () {};\n }\n var active = document.activeElement;\n\n var ranges = [];\n for (var i = 0; i < selection.rangeCount; i++) {\n ranges.push(selection.getRangeAt(i));\n }\n\n switch (active.tagName.toUpperCase()) { // .toUpperCase handles XHTML\n case 'INPUT':\n case 'TEXTAREA':\n active.blur();\n break;\n\n default:\n active = null;\n break;\n }\n\n selection.removeAllRanges();\n return function () {\n selection.type === 'Caret' &&\n selection.removeAllRanges();\n\n if (!selection.rangeCount) {\n ranges.forEach(function(range) {\n selection.addRange(range);\n });\n }\n\n active &&\n active.focus();\n };\n};\n","\"use strict\";\n\nvar deselectCurrent = require(\"toggle-selection\");\n\nvar clipboardToIE11Formatting = {\n \"text/plain\": \"Text\",\n \"text/html\": \"Url\",\n \"default\": \"Text\"\n}\n\nvar defaultMessage = \"Copy to clipboard: #{key}, Enter\";\n\nfunction format(message) {\n var copyKey = (/mac os x/i.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\") + \"+C\";\n return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\nfunction copy(text, options) {\n var debug,\n message,\n reselectPrevious,\n range,\n selection,\n mark,\n success = false;\n if (!options) {\n options = {};\n }\n debug = options.debug || false;\n try {\n reselectPrevious = deselectCurrent();\n\n range = document.createRange();\n selection = document.getSelection();\n\n mark = document.createElement(\"span\");\n mark.textContent = text;\n // avoid screen readers from reading out loud the text\n mark.ariaHidden = \"true\"\n // reset user styles for span element\n mark.style.all = \"unset\";\n // prevents scrolling to the end of the page\n mark.style.position = \"fixed\";\n mark.style.top = 0;\n mark.style.clip = \"rect(0, 0, 0, 0)\";\n // used to preserve spaces and line breaks\n mark.style.whiteSpace = \"pre\";\n // do not inherit user-select (it may be `none`)\n mark.style.webkitUserSelect = \"text\";\n mark.style.MozUserSelect = \"text\";\n mark.style.msUserSelect = \"text\";\n mark.style.userSelect = \"text\";\n mark.addEventListener(\"copy\", function(e) {\n e.stopPropagation();\n if (options.format) {\n e.preventDefault();\n if (typeof e.clipboardData === \"undefined\") { // IE 11\n debug && console.warn(\"unable to use e.clipboardData\");\n debug && console.warn(\"trying IE specific stuff\");\n window.clipboardData.clearData();\n var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting[\"default\"]\n window.clipboardData.setData(format, text);\n } else { // all other browsers\n e.clipboardData.clearData();\n e.clipboardData.setData(options.format, text);\n }\n }\n if (options.onCopy) {\n e.preventDefault();\n options.onCopy(e.clipboardData);\n }\n });\n\n document.body.appendChild(mark);\n\n range.selectNodeContents(mark);\n selection.addRange(range);\n\n var successful = document.execCommand(\"copy\");\n if (!successful) {\n throw new Error(\"copy command was unsuccessful\");\n }\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using execCommand: \", err);\n debug && console.warn(\"trying IE specific stuff\");\n try {\n window.clipboardData.setData(options.format || \"text\", text);\n options.onCopy && options.onCopy(window.clipboardData);\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using clipboardData: \", err);\n debug && console.error(\"falling back to prompt\");\n message = format(\"message\" in options ? options.message : defaultMessage);\n window.prompt(message, text);\n }\n } finally {\n if (selection) {\n if (typeof selection.removeRange == \"function\") {\n selection.removeRange(range);\n } else {\n selection.removeAllRanges();\n }\n }\n\n if (mark) {\n document.body.removeChild(mark);\n }\n reselectPrevious();\n }\n\n return success;\n}\n\nmodule.exports = copy;\n","const TOKENS = /\\S+|./g;\nconst IS_MANUAL_CASE = /\\p{Ll}(?=[\\p{Lu}])|\\.\\p{L}/u; // iPhone, example.com, U.N., etc.\nconst ALPHANUMERIC_PATTERN = /[\\p{L}\\d]+/gu;\nconst WORD_SEPARATORS = new Set([\"—\", \"–\", \"-\", \"―\", \"/\"]);\nconst SMALL_WORDS = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"as\",\n \"at\",\n \"because\",\n \"but\",\n \"by\",\n \"en\",\n \"for\",\n \"if\",\n \"in\",\n \"neither\",\n \"nor\",\n \"of\",\n \"on\",\n \"only\",\n \"or\",\n \"over\",\n \"per\",\n \"so\",\n \"some\",\n \"than\",\n \"that\",\n \"the\",\n \"to\",\n \"up\",\n \"upon\",\n \"v\",\n \"versus\",\n \"via\",\n \"vs\",\n \"when\",\n \"with\",\n \"without\",\n \"yet\",\n]);\nexport function titleCase(input, options = {}) {\n let result = \"\";\n let m;\n const { smallWords = SMALL_WORDS, locale } = typeof options === \"string\" || Array.isArray(options)\n ? { locale: options }\n : options;\n // tslint:disable-next-line\n while ((m = TOKENS.exec(input)) !== null) {\n const { 0: token, index } = m;\n // Ignore already capitalized words.\n if (IS_MANUAL_CASE.test(token)) {\n result += token;\n }\n else {\n result += token.replace(ALPHANUMERIC_PATTERN, (m, i) => {\n // Ignore small words except at beginning or end.\n if (index > 0 &&\n index + token.length < input.length &&\n smallWords.has(m)) {\n return m;\n }\n // Only capitalize words after a valid word separator.\n if (i > 1 && !WORD_SEPARATORS.has(input.charAt(index + i - 1))) {\n return m;\n }\n return m.charAt(0).toLocaleUpperCase(locale) + m.slice(1);\n });\n }\n }\n return result;\n}\n//# sourceMappingURL=index.js.map","var nargs = /\\{([0-9a-zA-Z_]+)\\}/g\n\nmodule.exports = template\n\nfunction template(string) {\n var args\n\n if (arguments.length === 2 && typeof arguments[1] === \"object\") {\n args = arguments[1]\n } else {\n args = new Array(arguments.length - 1)\n for (var i = 1; i < arguments.length; ++i) {\n args[i - 1] = arguments[i]\n }\n }\n\n if (!args || !args.hasOwnProperty) {\n args = {}\n }\n\n return string.replace(nargs, function replaceArg(match, i, index) {\n var result\n\n if (string[index - 1] === \"{\" &&\n string[index + match.length] === \"}\") {\n return i\n } else {\n result = args.hasOwnProperty(i) ? args[i] : null\n if (result === null || result === undefined) {\n return \"\"\n }\n\n return result\n }\n })\n}\n","import formatString from 'string-template'\r\n\r\nlet filingDescriptions // dynamically import massive JSON document\r\nlet imported = false\r\nexport function formatFilingDescription(transaction){\r\n if(!filingDescriptions && !imported){\r\n imported = true\r\n import('../assets/filingDescriptions.json').then(f=>filingDescriptions = f.default)\r\n }\r\n //todo: format dates properly and add currency to end for statement-of-capital\r\n if(filingDescriptions && transaction.description in filingDescriptions)\r\n return formatString(filingDescriptions[transaction.description], transaction.description_values)\r\n else if(transaction.description === 'legacy') return transaction.description_values?.description ?? transaction.description\r\n else{\r\n if (filingDescriptions) console.warn({ transaction }, \"Filing description not found for \" + transaction.description)\r\n return transaction.description\r\n }\r\n}\r\n","export default \"__VITE_ASSET__12402e1b__\"","export default \"__VITE_ASSET__c7f0c76f__\"","\r\nexport let latency: number\r\nexport function setLatency(latencyMs: number){\r\n latency = latencyMs\r\n document.getElementById('latency').innerText = latency.toFixed(1) + 'ms'\r\n}\r\n\r\nexport let delay: number\r\nexport function setDelay(streamPath: string, delayMs: number){\r\n delay = delayMs\r\n document.getElementById(`delay-${streamPath}`).innerText = `${delay.toFixed(1)} min delay`\r\n}\r\n","import copy from \"copy-to-clipboard\"\r\nimport { sentenceCase } from \"change-case\"\r\nimport { titleCase } from \"title-case\"\r\nimport { formatFilingDescription } from \"./formatFilingDescription\"\r\nimport ClipboardCopy from \"../assets/icons/ClipboardCopy.svg\"\r\nimport ExternalLink from \"../assets/icons/ExternalLink.svg\"\r\nimport formatString from \"string-template\"\r\nimport { setDelay, setLatency } from \"./latencyIndicator\"\r\n\r\nexport function createEventComponent(event) {\r\n const eventCardContainer = document.createElement(\"div\")\r\n eventCardContainer.className = `event-card-container`\r\n const element = document.createElement(\"div\")\r\n element.className = `event-card ${event.streamPath}`\r\n eventCardContainer.appendChild(element)\r\n try {\r\n const { companyNumber, title, description } = getDescription(event)\r\n element.innerHTML = `\r\n

${title ?? (sentenceCase(event.streamPath) + \"event\")}

\r\n

${description ?? \"\"}

\r\n ${new Date(event.event.published_at).toLocaleTimeString()}\r\n ${companyNumber}\"External\r\n `\r\n // A button which copys the company number on click rather than a link to companies house\r\n // const companyNumberButton = document.createElement(\"code\")\r\n // companyNumberButton.onclick = () => copy(companyNumber)\r\n // companyNumberButton.innerText = companyNumber\r\n // element.appendChild(companyNumberButton)\r\n\r\n const { received, streamPath, ...originalEvent } = event\r\n const latencyMs = performance.timeOrigin + performance.now() - received\r\n // this has been disabled due to the difference in system clocks causing inaccurate latencies (including negative).\r\n // setLatency(latencyMs)\r\n const delay = (Date.now() - new Date(event.event.published_at).getTime()) / 60_000\r\n setDelay(streamPath, delay)\r\n const copyButton = document.createElement(\"button\")\r\n copyButton.onclick = () => copy(JSON.stringify(originalEvent))\r\n copyButton.innerHTML = `\"Copy JSON`\r\n element.appendChild(copyButton)\r\n } catch (e) {\r\n console.log(\"Error creating event card: \", e.message)\r\n element.innerHTML = e.message\r\n }\r\n return eventCardContainer\r\n}\r\n\r\n\r\nexport function getDescription(event) {\r\n switch (event.streamPath) {\r\n case \"companies\":\r\n return {\r\n companyNumber: event.data.company_number,\r\n description: \"\",\r\n title: `${titleCase(event.data.company_name.toLowerCase())}`\r\n }\r\n case \"filings\": {\r\n const [, companyNumber] = event.resource_uri.match(/^\\/company\\/([A-Z0-9]{8})\\/filing-history/)\r\n return {\r\n companyNumber,\r\n description: formatFilingDescription(event.data),\r\n title: sentenceCase(event.data.category ?? \"New\") + \" filing\"\r\n }\r\n }\r\n case \"officers\": {\r\n const [, companyNumber] = event.resource_uri.match(/^\\/company\\/([A-Z0-9]{8})\\/appointments/)\r\n const description = \"resigned_on\" in event.data ? `Resigned on ${event.data.resigned_on}` : `Appointed on ${event.data.appointed_on}`\r\n return { companyNumber, description, title: titleCase(event.data.name.toLowerCase()) }\r\n }\r\n case \"persons-with-significant-control\": {\r\n const [, companyNumber] = event.resource_uri.match(\r\n /^\\/company\\/([A-Z0-9]{6,8})\\/persons-with-significant-control/\r\n )\r\n const description = \"ceased_on\" in event.data ? `Ceased on ${event.data.ceased_on}` : `Notified on ${event.data.notified_on}`\r\n return { companyNumber, description, title: event.data.name }\r\n }\r\n case \"charges\": {\r\n const [, companyNumber] = event.resource_uri.match(/^\\/company\\/([A-Z0-9]{8})\\/charges/)\r\n return {\r\n companyNumber,\r\n description: event.data.particulars?.description,\r\n title: event.data.classification.description\r\n }\r\n }\r\n case \"insolvency-cases\":\r\n return {\r\n companyNumber: event.resource_id,\r\n description: event.data.cases.map(c => sentenceCase(c.type)).join(\", \"),\r\n title: \"Insolvency\"\r\n }\r\n case \"disqualified-officers\":\r\n const descriptionFormat = \"Disqualified from {companies}\"\r\n const description = formatString(descriptionFormat, { companies: event.data.disqualifications?.flatMap(d => d.company_names).join(\", \") })\r\n const titleFormat = \"{forename} {other_forenames} {surname}\"\r\n const title = formatString(titleFormat, event.data)\r\n return { companyNumber: \"\", description, title }\r\n case \"persons-with-significant-control-statements\": {\r\n //TODO: write actual description for PSC statement using pscDescriptions.json file\r\n const [, companyNumber] = event.resource_uri.match(/^\\/company\\/([A-Z0-9]{8})\\//)\r\n return {\r\n companyNumber,\r\n description: `PSC statement descriptions not yet developed`,\r\n title: titleCase(event.data.linked_psc_name)\r\n }\r\n }\r\n case \"company-exemptions\": {\r\n //TODO: write actual description for exemptions using https://github.com/companieshouse/api-enumerations/blob/master/exemption_descriptions.yml\r\n const [, companyNumber] = event.resource_uri.match(/company\\/([A-Z0-9]{8})\\/exemptions/)\r\n return {\r\n companyNumber,\r\n description: `Company exemptions descriptions not yet developed`,\r\n title: titleCase(event.data.linked_psc_name)\r\n }\r\n }\r\n default:\r\n return { companyNumber: \"\", description: `No description available`, title: titleCase(event.streamPath) }\r\n }\r\n}\r\n\r\n","import \"../styles/events.scss\"\r\nimport { createEventEmitter } from \"./workerWrapper\"\r\nimport { sentenceCase } from \"change-case\"\r\nimport { createEventComponent, getDescription } from \"./eventCardFactory\"\r\nimport { streamPaths } from \"./streamPaths\"\r\n\r\nlet filter = \"\"\r\nconst filterTextBox = document.getElementById(\"filter-text\") as HTMLInputElement\r\nfilterTextBox?.addEventListener(\"keyup\", e => {\r\n // if(filterTextBox?.value.length === 8) // must be 8 character company number\r\n filter = filterTextBox?.value ?? \"\"\r\n // else filter = ''\r\n})\r\n\r\n/* Create a column for each stream */\r\nconst eventsContainer = document.getElementById(\"events\")\r\nconst containers = {}\r\nfor (const streamPath of streamPaths) {\r\n //TODO: add an option for the user to combine some columns: [officers, disqualified officers] [psc, psc statements, exemptions]\r\n const container = document.createElement(\"div\")\r\n container.id = `${streamPath}-container`\r\n container.className = \"event-column\"\r\n container.innerHTML = `\r\n
\r\n

${sentenceCase(streamPath)} \r\n \r\n

\r\n \r\n /${streamPath}\r\n
\r\n
`\r\n eventsContainer.appendChild(container)\r\n containers[streamPath] = container.lastElementChild\r\n}\r\n\r\n\r\n/* Get events from web worker that listens to websocket */\r\nlet eventCount = 0\r\nconst eventsEmitter = createEventEmitter()\r\neventsEmitter.on(\"event\", event => {\r\n document.getElementById(\"notification-counter\").innerText = (++eventCount).toString()\r\n const { companyNumber } = getDescription(event)\r\n // add events if browser is not visible only if the filter is set to a company number\r\n if (document.visibilityState === \"visible\" || filter.length === 8) {\r\n if (companyNumber.includes(filter)) {\r\n const eventCard = createEventComponent(event)\r\n containers[event.streamPath].insertAdjacentElement(\"afterbegin\", eventCard)\r\n const timeout = (filter.length + 0.5) * 30_000\r\n setTimeout(() => {\r\n // remove after some time depending on how specific the filter is\r\n containers[event.streamPath].removeChild(eventCard)\r\n }, timeout)\r\n }\r\n }\r\n})\r\n\r\neventsEmitter.on(\"connected\", () => {\r\n document.getElementById(\"connection-indicator\").className = \"connected indicator\"\r\n document.getElementById(\"connection-button\").onclick = () => eventsEmitter.close()\r\n document.getElementById(\"connection-button\").innerText = \"Disconnect\"\r\n})\r\neventsEmitter.on(\"disconnected\", () => {\r\n document.getElementById(\"connection-indicator\").className = \"disconnected indicator\"\r\n document.getElementById(\"connection-button\").onclick = () => eventsEmitter.start()\r\n document.getElementById(\"connection-button\").innerText = \"Connect\"\r\n})\r\n\r\n// start the first connection\r\ndocument.getElementById(\"connection-button\").onclick = () => eventsEmitter.start()\r\neventsEmitter.start()\r\n","import { streamPaths } from \"./streamPaths.js\"\r\n\r\n/** returns cleanup function that kills the status manager */\r\nexport function startStatusManager() {\r\n updateHealthIndicators()\r\n const initialStatus = setTimeout(updateHealthIndicators, 500) // another status update after 500ms to update users online count\r\n const recurringUpdate = setInterval(updateHealthIndicators, 5000)\r\n return () => {\r\n clearTimeout(initialStatus)\r\n clearInterval(recurringUpdate)\r\n }\r\n}\r\n\r\n\r\nfunction updateHealthIndicators(){\r\n getHealth().then(health=>{\r\n for (const streamPath of streamPaths) {\r\n const indicator = document.getElementById(`${streamPath}-upstream`)\r\n if (!indicator) continue\r\n if (health[streamPath]) {\r\n indicator.classList.add(\"good\")\r\n indicator.classList.remove(\"bad\")\r\n } else {\r\n indicator.classList.remove(\"good\")\r\n indicator.classList.add(\"bad\")\r\n }\r\n }\r\n const {currentWsConnections} = health\r\n document.getElementById('open-websockets').innerText = currentWsConnections.toString()\r\n }).catch(e=>{\r\n console.log('Health indicators failed to update:', e.message)\r\n })\r\n}\r\n\r\nasync function getHealth(){\r\n const res = await fetch(\"/events/health\")\r\n if (res.ok) return await res.json()\r\n else return {\r\n currentWsConnections: 1\r\n }\r\n}\r\n","\r\nexport const registerServiceWorker = async () => {\r\n if ('serviceWorker' in navigator) {\r\n try {\r\n const registration = await navigator.serviceWorker.register(\r\n '/sw.js',\r\n {\r\n scope: '/',\r\n }\r\n );\r\n if (registration.installing) {\r\n console.log('Service worker installing');\r\n } else if (registration.waiting) {\r\n console.log('Service worker installed');\r\n } else if (registration.active) {\r\n console.log('Service worker active');\r\n }\r\n } catch (error) {\r\n console.error(`Registration failed with ${error}`);\r\n }\r\n }\r\n};\r\n","/* import global styles */\r\nimport '../styles/indicators.css'\r\nimport '../styles/layout.css'\r\nimport '../styles/header.scss'\r\nimport '../styles/main.css'\r\n\r\n/* import scripts */\r\nimport './eventManager'\r\nimport { startStatusManager } from \"./statusManager\"\r\nimport { registerServiceWorker } from \"./registerServiceWorker\"\r\n\r\nregisterServiceWorker()\r\nstartStatusManager()\r\n"],"file":"assets/index-c29d438c.js"}