{
  "version": 3,
  "sources": ["../src/polyfills/index.ts", "../src/index.ts"],
  "sourcesContent": ["/* eslint @typescript-eslint/no-empty-function: \"off\" */\n\nclass EventTarget {\n  addEventListener() {}\n  removeEventListener() {}\n  dispatchEvent(_event: Event) {\n    return true;\n  }\n}\n\n// @github/template-parts requires DocumentFragment to be available on globalThis for SSR\nif (typeof DocumentFragment === 'undefined') {\n  class DocumentFragment extends EventTarget {}\n  // @ts-ignore\n  globalThis.DocumentFragment = DocumentFragment;\n}\n\nclass HTMLElement extends EventTarget {}\nclass HTMLVideoElement extends EventTarget {}\n\nconst customElements: CustomElementRegistry = {\n  get(_name: string) {\n    return undefined;\n  },\n  define(_name, _constructor, _options) {},\n  getName(_constructor) {\n    return null;\n  },\n  upgrade(_root) {},\n  whenDefined(_name) {\n    return Promise.resolve(HTMLElement as unknown as CustomElementConstructor);\n  },\n};\n\nclass CustomEvent {\n  #detail;\n  get detail() {\n    return this.#detail;\n  }\n  constructor(_typeArg: string, eventInitDict: CustomEventInit = {}) {\n    // super(typeArg, eventInitDict);\n    this.#detail = eventInitDict?.detail;\n  }\n  initCustomEvent() {}\n}\n\nfunction createElement(_tagName: string, _options?: ElementCreationOptions): HTMLElement {\n  return new HTMLElement();\n}\n\nconst globalThisShim = {\n  document: {\n    createElement,\n  },\n  DocumentFragment,\n  customElements,\n  CustomEvent,\n  EventTarget,\n  HTMLElement,\n  HTMLVideoElement,\n};\n\n// const isServer = typeof window === 'undefined' || typeof globalThis.customElements === 'undefined';\n// const GlobalThis = isServer ? globalThisShim : globalThis;\n// const Document = isServer ? globalThisShim.document : globalThis.document;\n//\n// export { GlobalThis as globalThis, Document as document };\nconst isServer = typeof window === 'undefined' || typeof globalThis.customElements === 'undefined';\ntype GlobalThis = typeof globalThis;\nconst internalGlobalThis: GlobalThis = (isServer ? globalThisShim : globalThis) as GlobalThis;\nconst internalDocument: Document = (isServer ? globalThisShim.document : globalThis.document) as Document;\n\nexport { internalGlobalThis as globalThis, internalDocument as document };\n", "import { globalThis } from './polyfills';\n\nexport const subscribeViewerCount = (\n  token: string,\n  pollInterval: number,\n  callback: (views: number) => void,\n  errorCb: (errorMsg: string) => void\n) => {\n  const url = `https://stats.mux.com/counts?token=${token}`;\n  const controller = new AbortController();\n  const signal = controller.signal;\n  let timeoutId: number | undefined;\n  let aborted = false;\n  const fetchViewerCountPoll: () => Promise<any> = () => {\n    // If the polling has been aborted (via an \"unsubscribe()\"),\n    // we can simply bail on the recursion.\n    if (aborted) return Promise.resolve();\n    // GET the latest view count, providing an abort signal\n    // for unsubscription.\n    return (\n      fetch(url, { signal })\n        // Grab the JSON value of the response\n        .then((resp) => resp.json())\n        // Confirm that response wasn't an error and the JSON\n        // has the expected data\n        .then((respObj) => {\n          const views = respObj?.data?.[0]?.views;\n          if (!!respObj?.error || views == null) {\n            // If not, treat as an error.\n            return Promise.reject(respObj?.error ?? 'no data in response');\n          }\n          // Otherwise, we successfully retrieved the latest views, so\n          // provide that info out via `callback()`.\n          callback(views);\n          return views;\n        })\n        // Catch and invoke errorCb before timeout + re-fetch. This allows\n        // for re-fetching by default, but provides the opportunity\n        // to unsubscribe externally via `errorCb` if desired (CJP)\n        .catch(errorCb)\n        // Wait the duration of the polling interval before restarting\n        // the next fetch\n        .then(() => {\n          return new Promise((resolve) => {\n            timeoutId = setTimeout(() => {\n              resolve(undefined);\n            }, pollInterval * 1000);\n          });\n        })\n        // Restart process of re-fetching by invoking this method again\n        // (async recursion)\n        .then(fetchViewerCountPoll)\n    );\n  };\n\n  // Kick off the polling functionality.\n  fetchViewerCountPoll();\n\n  // Return an \"unsubscribe()\" function. Invoking this will abort\n  // any mid-flight fetches, clear any pending timeouts for\n  // a re-fetch, and mark this process as \"aborted\".\n  return () => {\n    aborted = true;\n    controller.abort();\n    if (typeof timeoutId === 'number') {\n      clearTimeout(timeoutId);\n      timeoutId = undefined;\n    }\n  };\n};\n\nconst Attributes = {\n  TOKEN: 'token',\n  POLL_INTERVAL: 'poll-interval',\n  DISABLED: 'disabled',\n};\n\nconst DEFAULT_POLL_INTERVAL = 20;\n\nconst AttributeValues = Object.freeze(Object.values(Attributes));\n\nconst ARIA_LABEL = 'Viewer Count';\nconst DEFAULT_VIEWER_COUNT_VALUE = '??';\nconst toAriaLabel = ({ viewerCount }: { viewerCount?: number }) => {\n  const viewerCountStr = typeof viewerCount === 'number' ? `${viewerCount}` : 'Unknown';\n  return `${ARIA_LABEL} ${viewerCountStr}`;\n};\n\nconst template = document.createElement('template');\ntemplate.innerHTML = `\n<span id=\"viewer-count\">\n${DEFAULT_VIEWER_COUNT_VALUE}\n</span>\n`;\n\nclass MuxActiveViewerCountElement extends globalThis.HTMLElement {\n  static get observedAttributes() {\n    return AttributeValues;\n  }\n\n  #unsubscribeViewerCount: (() => void) | undefined;\n\n  get #viewerCountEl() {\n    return (this.shadowRoot as ShadowRoot).querySelector('#viewer-count') as HTMLElement;\n  }\n\n  #views?: number;\n\n  get views(): number {\n    return this.#views ?? Number.NaN;\n  }\n\n  constructor() {\n    super();\n    const shadowRoot = this.attachShadow({ mode: 'open' });\n    shadowRoot.appendChild(template.content.cloneNode(true));\n  }\n\n  get token() {\n    return this.getAttribute(Attributes.TOKEN) ?? '';\n  }\n\n  set token(value: string) {\n    if (this.token === value) return;\n    this.#views = undefined;\n    this.setAttribute(Attributes.TOKEN, value);\n  }\n\n  get pollInterval() {\n    let temp = this.hasAttribute(Attributes.POLL_INTERVAL)\n      ? +(this.getAttribute(Attributes.POLL_INTERVAL) as string)\n      : DEFAULT_POLL_INTERVAL;\n    if (temp < 15) {\n      console.warn('Poll interval must be at least 15 seconds, setting to 15.');\n      temp = 15;\n    }\n    return temp;\n  }\n\n  set pollInterval(value: number) {\n    if (this.pollInterval === value) return;\n    this.setAttribute(Attributes.POLL_INTERVAL, `${value}`);\n  }\n\n  enable() {\n    this.setAttribute('tabindex', '0');\n  }\n\n  disable() {\n    this.removeAttribute('tabindex');\n  }\n\n  connectedCallback() {\n    if (!this.hasAttribute('disabled')) {\n      this.enable();\n    }\n\n    /** @TODO Update to use `viewerCount` prop when available (CJP) */\n    this.setAttribute('aria-label', toAriaLabel({}));\n    this.setAttribute('role', 'presentation');\n    this.#setupViewerCountPolling();\n  }\n\n  disconnectedCallback() {\n    this.#teardownViewerCountPolling();\n  }\n\n  attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null) {\n    if (attrName === Attributes.POLL_INTERVAL || attrName === Attributes.TOKEN) {\n      this.#teardownViewerCountPolling();\n      this.#setupViewerCountPolling();\n    } else if (attrName === Attributes.DISABLED && oldValue !== newValue) {\n      if (newValue) {\n        this.disable();\n      } else {\n        this.enable();\n      }\n    }\n  }\n\n  #setupViewerCountPolling() {\n    if (this.token && this.pollInterval && !this.#unsubscribeViewerCount) {\n      this.#unsubscribeViewerCount = subscribeViewerCount(\n        this.token,\n        this.pollInterval,\n        // Success callback\n        (views) => {\n          this.#views = views;\n          this.dispatchEvent(\n            new CustomEvent('change', {\n              detail: views,\n            })\n          );\n          this.#viewerCountEl.textContent = `${this.views}`;\n          /** @TODO Update to use `viewerCount` prop when available (CJP) */\n          this.setAttribute('aria-label', toAriaLabel({ viewerCount: views }));\n        },\n        // Error callback\n        (errorMsg) => {\n          this.dispatchEvent(\n            new CustomEvent('error', {\n              detail: errorMsg,\n            })\n          );\n          /** @TODO Consider adding retry count/logic (CJP) */\n          console.warn('Failed to retrieve viewer count: Error - ', errorMsg);\n          this.#teardownViewerCountPolling();\n        }\n      );\n    }\n  }\n\n  #teardownViewerCountPolling() {\n    this.#unsubscribeViewerCount?.();\n    this.#unsubscribeViewerCount = undefined;\n  }\n}\n\nif (!globalThis.customElements.get('mux-active-viewer-count')) {\n  globalThis.customElements.define('mux-active-viewer-count', MuxActiveViewerCountElement);\n}\n\nexport default MuxActiveViewerCountElement;\n"],
  "mappings": "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",
  "names": ["EventTarget", "_event", "DocumentFragment", "HTMLElement", "HTMLVideoElement", "customElements", "_name", "_constructor", "_options", "_root", "_detail", "CustomEvent", "_typeArg", "eventInitDict", "__privateAdd", "__privateSet", "__privateGet", "createElement", "_tagName", "globalThisShim", "isServer", "internalGlobalThis", "internalDocument", "subscribeViewerCount", "token", "pollInterval", "callback", "errorCb", "url", "controller", "signal", "timeoutId", "aborted", "fetchViewerCountPoll", "resp", "respObj", "_a", "_b", "_c", "views", "resolve", "Attributes", "DEFAULT_POLL_INTERVAL", "AttributeValues", "ARIA_LABEL", "DEFAULT_VIEWER_COUNT_VALUE", "toAriaLabel", "viewerCount", "viewerCountStr", "template", "_unsubscribeViewerCount", "_MuxActiveViewerCountElement_instances", "viewerCountEl_get", "_views", "setupViewerCountPolling_fn", "teardownViewerCountPolling_fn", "MuxActiveViewerCountElement", "internalGlobalThis", "__privateAdd", "__privateGet", "value", "__privateSet", "temp", "__privateMethod", "attrName", "oldValue", "newValue", "errorMsg", "index_default"]
}
