@mux/mux-active-viewer-count 0.1.1-canary.0-b2794d3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
package/README.md ADDED
@@ -0,0 +1,63 @@
1
+ <p align="center">
2
+ <h1 align="center">&lt;mux-active-viewer-count/&gt;</h1>
3
+ <a href="https://npmcharts.com/compare/@mux/mux-active-viewer-count?interval=30"><img src="https://img.shields.io/npm/dm/@mux/mux-active-viewer-count.svg?sanitize=true" alt="Downloads"></a>
4
+ <a href="https://www.npmjs.com/package/@mux/mux-active-viewer-count"><img src="https://img.shields.io/npm/v/@mux/mux-active-viewer-count.svg?sanitize=true" alt="Version"></a>
5
+ <a href="https://www.npmjs.com/package/@mux/mux-active-viewer-count"><img src="https://img.shields.io/npm/l/@mux/mux-active-viewer-count.svg?sanitize=true" alt="License"></a>
6
+ </p>
7
+
8
+ # Introduction
9
+
10
+ `<mux-active-viewer-count></mux-active-viewer-count>` is a Mux-flavored HTML5 viewer count element.
11
+
12
+ This element shows the current number of viewers for the specified video.
13
+
14
+ # Installation
15
+
16
+ If you're using `npm` or `yarn`, install that way:
17
+
18
+ ## Package manager
19
+
20
+ ```
21
+ yarn add @mux/mux-active-viewer-count
22
+ ```
23
+
24
+ or
25
+
26
+ ```
27
+ npm i @mux/mux-active-viewer-count
28
+ ```
29
+
30
+ Then, import the library into your application with either `import` or `require`:
31
+
32
+ ```js
33
+ import '@mux/mux-active-viewer-count';
34
+ ```
35
+
36
+ or
37
+
38
+ ```js
39
+ require('@mux/mux-active-viewer-count');
40
+ ```
41
+
42
+ ## CDN option
43
+
44
+ Alternatively, use the CDN hosted version of this package:
45
+
46
+ ```html
47
+ <script src="https://cdn.jsdelivr.net/npm/@mux/mux-active-viewer-count@0"></script>
48
+ ```
49
+
50
+ If you are using ecmascript modules, you can also load the `mux-active-viewer-count.mjs` file with `type=module`:
51
+
52
+ ```html
53
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@mux/mux-active-viewer-count@0/dist/mux-active-viewer-count.mjs"></script>
54
+ ```
55
+
56
+ ## Usage
57
+
58
+ `<mux-active-viewer-count>` has two attributes. The first is called `token`, and it should be a signed JavaScript Web Token (JWT)
59
+ for which you want the viewer count. (For more information on creating a JWT for a particular video, see
60
+ https://docs.mux.com/guides/data/see-how-many-people-are-watching.
61
+
62
+ The second attribute is called `poll-interval`. It specifies the number of seconds that the component should wait between
63
+ requests to get the viewer count. It defaults to 20 seconds, and should be no lower than 15 seconds.
package/dist/cjs.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "inputs": {
3
+ "src/polyfills/index.ts": {
4
+ "bytes": 2117,
5
+ "imports": []
6
+ },
7
+ "src/index.ts": {
8
+ "bytes": 6670,
9
+ "imports": [
10
+ {
11
+ "path": "src/polyfills/index.ts",
12
+ "kind": "import-statement"
13
+ }
14
+ ]
15
+ }
16
+ },
17
+ "outputs": {
18
+ "dist/index.cjs.js.map": {
19
+ "imports": [],
20
+ "exports": [],
21
+ "inputs": {},
22
+ "bytes": 14488
23
+ },
24
+ "dist/index.cjs.js": {
25
+ "imports": [],
26
+ "exports": [],
27
+ "entryPoint": "src/index.ts",
28
+ "inputs": {
29
+ "src/index.ts": {
30
+ "bytesInOutput": 2855
31
+ },
32
+ "src/polyfills/index.ts": {
33
+ "bytesInOutput": 735
34
+ }
35
+ },
36
+ "bytes": 4443
37
+ }
38
+ }
39
+ }
package/dist/esm.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "inputs": {
3
+ "src/polyfills/index.ts": {
4
+ "bytes": 2117,
5
+ "imports": []
6
+ },
7
+ "src/index.ts": {
8
+ "bytes": 6670,
9
+ "imports": [
10
+ {
11
+ "path": "src/polyfills/index.ts",
12
+ "kind": "import-statement"
13
+ }
14
+ ]
15
+ }
16
+ },
17
+ "outputs": {
18
+ "dist/index.mjs.map": {
19
+ "imports": [],
20
+ "exports": [],
21
+ "inputs": {},
22
+ "bytes": 14337
23
+ },
24
+ "dist/index.mjs": {
25
+ "imports": [],
26
+ "exports": [
27
+ "default",
28
+ "subscribeViewerCount"
29
+ ],
30
+ "entryPoint": "src/index.ts",
31
+ "inputs": {
32
+ "src/polyfills/index.ts": {
33
+ "bytesInOutput": 734
34
+ },
35
+ "src/index.ts": {
36
+ "bytesInOutput": 2773
37
+ }
38
+ },
39
+ "bytes": 3979
40
+ }
41
+ }
42
+ }
package/dist/iife.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "inputs": {
3
+ "src/polyfills/index.ts": {
4
+ "bytes": 2117,
5
+ "imports": []
6
+ },
7
+ "src/index.ts": {
8
+ "bytes": 6670,
9
+ "imports": [
10
+ {
11
+ "path": "src/polyfills/index.ts",
12
+ "kind": "import-statement"
13
+ }
14
+ ]
15
+ }
16
+ },
17
+ "outputs": {
18
+ "dist/mux-active-viewer-counts.js.map": {
19
+ "imports": [],
20
+ "exports": [],
21
+ "inputs": {},
22
+ "bytes": 14337
23
+ },
24
+ "dist/mux-active-viewer-counts.js": {
25
+ "imports": [],
26
+ "exports": [],
27
+ "entryPoint": "src/index.ts",
28
+ "inputs": {
29
+ "src/polyfills/index.ts": {
30
+ "bytesInOutput": 734
31
+ },
32
+ "src/index.ts": {
33
+ "bytesInOutput": 2773
34
+ }
35
+ },
36
+ "bytes": 3974
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";var C=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var M=(e,n)=>{for(var t in n)C(e,t,{get:n[t],enumerable:!0})},W=(e,n,t,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of q(n))!z.call(e,o)&&o!==t&&C(e,o,{get:()=>n[o],enumerable:!(i=H(n,o))||i.enumerable});return e};var J=e=>W(C({},"__esModule",{value:!0}),e);var _=(e,n,t)=>{if(!n.has(e))throw TypeError("Cannot "+t)};var a=(e,n,t)=>(_(e,n,"read from private field"),t?t.call(e):n.get(e)),l=(e,n,t)=>{if(n.has(e))throw TypeError("Cannot add the same private member more than once");n instanceof WeakSet?n.add(e):n.set(e,t)},u=(e,n,t,i)=>(_(e,n,"write to private field"),i?i.call(e,t):n.set(e,t),t);var d=(e,n,t)=>(_(e,n,"access private method"),t);var et={};M(et,{default:()=>tt,subscribeViewerCount:()=>U});module.exports=J(et);var h=class{addEventListener(){}removeEventListener(){}dispatchEvent(n){return!0}};if(typeof DocumentFragment=="undefined"){class e extends h{}globalThis.DocumentFragment=e}var g=class extends h{},P=class extends h{},O={get(e){},define(e,n,t){},upgrade(e){},whenDefined(e){return Promise.resolve(g)}},f,N=class{constructor(n,t={}){l(this,f,void 0);u(this,f,t==null?void 0:t.detail)}get detail(){return a(this,f)}initCustomEvent(){}};f=new WeakMap;function Q(e,n){return new g}var S={document:{createElement:Q},DocumentFragment,customElements:O,CustomEvent:N,EventTarget:h,HTMLElement:g,HTMLVideoElement:P},F=typeof window=="undefined"||typeof globalThis.customElements=="undefined",w=F?S:globalThis,st=F?S.document:globalThis.document;var U=(e,n,t,i)=>{let o=`https://stats.mux.com/counts?token=${e}`,R=new AbortController,B=R.signal,v,k=!1,x=()=>k?Promise.resolve():fetch(o,{signal:B}).then(s=>s.json()).then(s=>{var V,y,D;let p=(y=(V=s==null?void 0:s.data)==null?void 0:V[0])==null?void 0:y.views;return!!(s!=null&&s.error)||p==null?Promise.reject((D=s==null?void 0:s.error)!=null?D:"no data in response"):(t(p),p)}).catch(i).then(()=>new Promise(s=>{v=setTimeout(()=>{s(void 0)},n*1e3)})).then(x);return x(),()=>{k=!0,R.abort(),typeof v=="number"&&(clearTimeout(v),v=void 0)}},r={TOKEN:"token",POLL_INTERVAL:"poll-interval",DISABLED:"disabled"},X=20,Y=Object.freeze(Object.values(r)),Z="Viewer Count",j="??",$=({viewerCount:e})=>{let n=typeof e=="number"?`${e}`:"Unknown";return`${Z} ${n}`},G=document.createElement("template");G.innerHTML=`
2
+ <span id="viewer-count">
3
+ ${j}
4
+ </span>
5
+ `;var c,T,K,m,E,I,b,A,L=class extends w.HTMLElement{constructor(){super();l(this,T);l(this,E);l(this,b);l(this,c,void 0);l(this,m,void 0);this.attachShadow({mode:"open"}).appendChild(G.content.cloneNode(!0))}static get observedAttributes(){return Y}get views(){var t;return(t=a(this,m))!=null?t:Number.NaN}get token(){var t;return(t=this.getAttribute(r.TOKEN))!=null?t:""}set token(t){this.token!==t&&(u(this,m,void 0),this.setAttribute(r.TOKEN,t))}get pollInterval(){let t=this.hasAttribute(r.POLL_INTERVAL)?+this.getAttribute(r.POLL_INTERVAL):X;return t<15&&(console.warn("Poll interval must be at least 15 seconds, setting to 15."),t=15),t}set pollInterval(t){this.pollInterval!==t&&this.setAttribute(r.POLL_INTERVAL,`${t}`)}enable(){this.setAttribute("tabindex","0")}disable(){this.removeAttribute("tabindex")}connectedCallback(){this.hasAttribute("disabled")||this.enable(),this.setAttribute("aria-label",$({})),this.setAttribute("role","presentation"),d(this,E,I).call(this)}disconnectedCallback(){d(this,b,A).call(this)}attributeChangedCallback(t,i,o){t===r.POLL_INTERVAL||t===r.TOKEN?(d(this,b,A).call(this),d(this,E,I).call(this)):t===r.DISABLED&&i!==o&&(o?this.disable():this.enable())}};c=new WeakMap,T=new WeakSet,K=function(){return this.shadowRoot.querySelector("#viewer-count")},m=new WeakMap,E=new WeakSet,I=function(){this.token&&this.pollInterval&&!a(this,c)&&u(this,c,U(this.token,this.pollInterval,t=>{u(this,m,t),this.dispatchEvent(new CustomEvent("change",{detail:t})),a(this,T,K).textContent=`${this.views}`,this.setAttribute("aria-label",$({viewerCount:t}))},t=>{this.dispatchEvent(new CustomEvent("error",{detail:t})),console.warn("Failed to retrieve viewer count: Error - ",t),d(this,b,A).call(this)}))},b=new WeakSet,A=function(){var t;(t=a(this,c))==null||t.call(this),u(this,c,void 0)};w.customElements.get("mux-active-viewer-count")||w.customElements.define("mux-active-viewer-count",L);var tt=L;
6
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/polyfills/index.ts"],
4
+ "sourcesContent": ["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", "/* eslint @typescript-eslint/no-empty-function: \"off\", @typescript-eslint/no-unused-vars: \"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 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"],
5
+ "mappings": "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",
6
+ "names": ["src_exports", "__export", "src_default", "subscribeViewerCount", "__toCommonJS", "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", "_viewerCountEl", "viewerCountEl_get", "_views", "_setupViewerCountPolling", "setupViewerCountPolling_fn", "_teardownViewerCountPolling", "teardownViewerCountPolling_fn", "MuxActiveViewerCountElement", "internalGlobalThis", "__privateAdd", "__privateGet", "value", "__privateSet", "temp", "__privateMethod", "attrName", "oldValue", "newValue", "errorMsg", "src_default"]
7
+ }
package/dist/index.mjs ADDED
@@ -0,0 +1,6 @@
1
+ var C=(e,n,t)=>{if(!n.has(e))throw TypeError("Cannot "+t)};var r=(e,n,t)=>(C(e,n,"read from private field"),t?t.call(e):n.get(e)),i=(e,n,t)=>{if(n.has(e))throw TypeError("Cannot add the same private member more than once");n instanceof WeakSet?n.add(e):n.set(e,t)},l=(e,n,t,u)=>(C(e,n,"write to private field"),u?u.call(e,t):n.set(e,t),t);var c=(e,n,t)=>(C(e,n,"access private method"),t);var d=class{addEventListener(){}removeEventListener(){}dispatchEvent(n){return!0}};if(typeof DocumentFragment=="undefined"){class e extends d{}globalThis.DocumentFragment=e}var b=class extends d{},_=class extends d{},K={get(e){},define(e,n,t){},upgrade(e){},whenDefined(e){return Promise.resolve(b)}},g,P=class{constructor(n,t={}){i(this,g,void 0);l(this,g,t==null?void 0:t.detail)}get detail(){return r(this,g)}initCustomEvent(){}};g=new WeakMap;function B(e,n){return new b}var D={document:{createElement:B},DocumentFragment,customElements:K,CustomEvent:P,EventTarget:d,HTMLElement:b,HTMLVideoElement:_},S=typeof window=="undefined"||typeof globalThis.customElements=="undefined",w=S?D:globalThis,O=S?D.document:globalThis.document;var H=(e,n,t,u)=>{let E=`https://stats.mux.com/counts?token=${e}`,I=new AbortController,G=I.signal,v,R=!1,k=()=>R?Promise.resolve():fetch(E,{signal:G}).then(s=>s.json()).then(s=>{var x,V,y;let p=(V=(x=s==null?void 0:s.data)==null?void 0:x[0])==null?void 0:V.views;return!!(s!=null&&s.error)||p==null?Promise.reject((y=s==null?void 0:s.error)!=null?y:"no data in response"):(t(p),p)}).catch(u).then(()=>new Promise(s=>{v=setTimeout(()=>{s(void 0)},n*1e3)})).then(k);return k(),()=>{R=!0,I.abort(),typeof v=="number"&&(clearTimeout(v),v=void 0)}},o={TOKEN:"token",POLL_INTERVAL:"poll-interval",DISABLED:"disabled"},q=20,z=Object.freeze(Object.values(o)),M="Viewer Count",W="??",F=({viewerCount:e})=>{let n=typeof e=="number"?`${e}`:"Unknown";return`${M} ${n}`},$=document.createElement("template");$.innerHTML=`
2
+ <span id="viewer-count">
3
+ ${W}
4
+ </span>
5
+ `;var a,T,U,h,f,N,m,A,L=class extends w.HTMLElement{constructor(){super();i(this,T);i(this,f);i(this,m);i(this,a,void 0);i(this,h,void 0);this.attachShadow({mode:"open"}).appendChild($.content.cloneNode(!0))}static get observedAttributes(){return z}get views(){var t;return(t=r(this,h))!=null?t:Number.NaN}get token(){var t;return(t=this.getAttribute(o.TOKEN))!=null?t:""}set token(t){this.token!==t&&(l(this,h,void 0),this.setAttribute(o.TOKEN,t))}get pollInterval(){let t=this.hasAttribute(o.POLL_INTERVAL)?+this.getAttribute(o.POLL_INTERVAL):q;return t<15&&(console.warn("Poll interval must be at least 15 seconds, setting to 15."),t=15),t}set pollInterval(t){this.pollInterval!==t&&this.setAttribute(o.POLL_INTERVAL,`${t}`)}enable(){this.setAttribute("tabindex","0")}disable(){this.removeAttribute("tabindex")}connectedCallback(){this.hasAttribute("disabled")||this.enable(),this.setAttribute("aria-label",F({})),this.setAttribute("role","presentation"),c(this,f,N).call(this)}disconnectedCallback(){c(this,m,A).call(this)}attributeChangedCallback(t,u,E){t===o.POLL_INTERVAL||t===o.TOKEN?(c(this,m,A).call(this),c(this,f,N).call(this)):t===o.DISABLED&&u!==E&&(E?this.disable():this.enable())}};a=new WeakMap,T=new WeakSet,U=function(){return this.shadowRoot.querySelector("#viewer-count")},h=new WeakMap,f=new WeakSet,N=function(){this.token&&this.pollInterval&&!r(this,a)&&l(this,a,H(this.token,this.pollInterval,t=>{l(this,h,t),this.dispatchEvent(new CustomEvent("change",{detail:t})),r(this,T,U).textContent=`${this.views}`,this.setAttribute("aria-label",F({viewerCount:t}))},t=>{this.dispatchEvent(new CustomEvent("error",{detail:t})),console.warn("Failed to retrieve viewer count: Error - ",t),c(this,m,A).call(this)}))},m=new WeakSet,A=function(){var t;(t=r(this,a))==null||t.call(this),l(this,a,void 0)};w.customElements.get("mux-active-viewer-count")||w.customElements.define("mux-active-viewer-count",L);var Z=L;export{Z as default,H as subscribeViewerCount};
6
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/polyfills/index.ts", "../src/index.ts"],
4
+ "sourcesContent": ["/* eslint @typescript-eslint/no-empty-function: \"off\", @typescript-eslint/no-unused-vars: \"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 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"],
5
+ "mappings": "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",
6
+ "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", "_viewerCountEl", "viewerCountEl_get", "_views", "_setupViewerCountPolling", "setupViewerCountPolling_fn", "_teardownViewerCountPolling", "teardownViewerCountPolling_fn", "MuxActiveViewerCountElement", "internalGlobalThis", "__privateAdd", "__privateGet", "value", "__privateSet", "temp", "__privateMethod", "attrName", "oldValue", "newValue", "errorMsg", "src_default"]
7
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "inputs": {
3
+ "src/polyfills/index.ts": {
4
+ "bytes": 2117,
5
+ "imports": []
6
+ },
7
+ "src/index.ts": {
8
+ "bytes": 6670,
9
+ "imports": [
10
+ {
11
+ "path": "src/polyfills/index.ts",
12
+ "kind": "import-statement"
13
+ }
14
+ ]
15
+ }
16
+ },
17
+ "outputs": {
18
+ "dist/mux-active-viewer-counts.mjs.map": {
19
+ "imports": [],
20
+ "exports": [],
21
+ "inputs": {},
22
+ "bytes": 14337
23
+ },
24
+ "dist/mux-active-viewer-counts.mjs": {
25
+ "imports": [],
26
+ "exports": [
27
+ "default",
28
+ "subscribeViewerCount"
29
+ ],
30
+ "entryPoint": "src/index.ts",
31
+ "inputs": {
32
+ "src/polyfills/index.ts": {
33
+ "bytesInOutput": 734
34
+ },
35
+ "src/index.ts": {
36
+ "bytesInOutput": 2773
37
+ }
38
+ },
39
+ "bytes": 3998
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";(()=>{var C=(e,n,t)=>{if(!n.has(e))throw TypeError("Cannot "+t)};var r=(e,n,t)=>(C(e,n,"read from private field"),t?t.call(e):n.get(e)),i=(e,n,t)=>{if(n.has(e))throw TypeError("Cannot add the same private member more than once");n instanceof WeakSet?n.add(e):n.set(e,t)},l=(e,n,t,u)=>(C(e,n,"write to private field"),u?u.call(e,t):n.set(e,t),t);var c=(e,n,t)=>(C(e,n,"access private method"),t);var d=class{addEventListener(){}removeEventListener(){}dispatchEvent(n){return!0}};if(typeof DocumentFragment=="undefined"){class e extends d{}globalThis.DocumentFragment=e}var b=class extends d{},_=class extends d{},K={get(e){},define(e,n,t){},upgrade(e){},whenDefined(e){return Promise.resolve(b)}},g,P=class{constructor(n,t={}){i(this,g,void 0);l(this,g,t==null?void 0:t.detail)}get detail(){return r(this,g)}initCustomEvent(){}};g=new WeakMap;function B(e,n){return new b}var D={document:{createElement:B},DocumentFragment,customElements:K,CustomEvent:P,EventTarget:d,HTMLElement:b,HTMLVideoElement:_},S=typeof window=="undefined"||typeof globalThis.customElements=="undefined",w=S?D:globalThis,O=S?D.document:globalThis.document;var H=(e,n,t,u)=>{let E=`https://stats.mux.com/counts?token=${e}`,I=new AbortController,G=I.signal,v,R=!1,k=()=>R?Promise.resolve():fetch(E,{signal:G}).then(s=>s.json()).then(s=>{var x,V,y;let p=(V=(x=s==null?void 0:s.data)==null?void 0:x[0])==null?void 0:V.views;return!!(s!=null&&s.error)||p==null?Promise.reject((y=s==null?void 0:s.error)!=null?y:"no data in response"):(t(p),p)}).catch(u).then(()=>new Promise(s=>{v=setTimeout(()=>{s(void 0)},n*1e3)})).then(k);return k(),()=>{R=!0,I.abort(),typeof v=="number"&&(clearTimeout(v),v=void 0)}},o={TOKEN:"token",POLL_INTERVAL:"poll-interval",DISABLED:"disabled"},q=20,z=Object.freeze(Object.values(o)),M="Viewer Count",W="??",F=({viewerCount:e})=>{let n=typeof e=="number"?`${e}`:"Unknown";return`${M} ${n}`},$=document.createElement("template");$.innerHTML=`
2
+ <span id="viewer-count">
3
+ ${W}
4
+ </span>
5
+ `;var a,T,U,h,f,N,m,A,L=class extends w.HTMLElement{constructor(){super();i(this,T);i(this,f);i(this,m);i(this,a,void 0);i(this,h,void 0);this.attachShadow({mode:"open"}).appendChild($.content.cloneNode(!0))}static get observedAttributes(){return z}get views(){var t;return(t=r(this,h))!=null?t:Number.NaN}get token(){var t;return(t=this.getAttribute(o.TOKEN))!=null?t:""}set token(t){this.token!==t&&(l(this,h,void 0),this.setAttribute(o.TOKEN,t))}get pollInterval(){let t=this.hasAttribute(o.POLL_INTERVAL)?+this.getAttribute(o.POLL_INTERVAL):q;return t<15&&(console.warn("Poll interval must be at least 15 seconds, setting to 15."),t=15),t}set pollInterval(t){this.pollInterval!==t&&this.setAttribute(o.POLL_INTERVAL,`${t}`)}enable(){this.setAttribute("tabindex","0")}disable(){this.removeAttribute("tabindex")}connectedCallback(){this.hasAttribute("disabled")||this.enable(),this.setAttribute("aria-label",F({})),this.setAttribute("role","presentation"),c(this,f,N).call(this)}disconnectedCallback(){c(this,m,A).call(this)}attributeChangedCallback(t,u,E){t===o.POLL_INTERVAL||t===o.TOKEN?(c(this,m,A).call(this),c(this,f,N).call(this)):t===o.DISABLED&&u!==E&&(E?this.disable():this.enable())}};a=new WeakMap,T=new WeakSet,U=function(){return this.shadowRoot.querySelector("#viewer-count")},h=new WeakMap,f=new WeakSet,N=function(){this.token&&this.pollInterval&&!r(this,a)&&l(this,a,H(this.token,this.pollInterval,t=>{l(this,h,t),this.dispatchEvent(new CustomEvent("change",{detail:t})),r(this,T,U).textContent=`${this.views}`,this.setAttribute("aria-label",F({viewerCount:t}))},t=>{this.dispatchEvent(new CustomEvent("error",{detail:t})),console.warn("Failed to retrieve viewer count: Error - ",t),c(this,m,A).call(this)}))},m=new WeakSet,A=function(){var t;(t=r(this,a))==null||t.call(this),l(this,a,void 0)};w.customElements.get("mux-active-viewer-count")||w.customElements.define("mux-active-viewer-count",L);var Z=L;})();
6
+ //# sourceMappingURL=mux-active-viewer-counts.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/polyfills/index.ts", "../src/index.ts"],
4
+ "sourcesContent": ["/* eslint @typescript-eslint/no-empty-function: \"off\", @typescript-eslint/no-unused-vars: \"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 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"],
5
+ "mappings": "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",
6
+ "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", "_viewerCountEl", "viewerCountEl_get", "_views", "_setupViewerCountPolling", "setupViewerCountPolling_fn", "_teardownViewerCountPolling", "teardownViewerCountPolling_fn", "MuxActiveViewerCountElement", "internalGlobalThis", "__privateAdd", "__privateGet", "value", "__privateSet", "temp", "__privateMethod", "attrName", "oldValue", "newValue", "errorMsg", "src_default"]
7
+ }
@@ -0,0 +1,6 @@
1
+ var C=(e,n,t)=>{if(!n.has(e))throw TypeError("Cannot "+t)};var r=(e,n,t)=>(C(e,n,"read from private field"),t?t.call(e):n.get(e)),i=(e,n,t)=>{if(n.has(e))throw TypeError("Cannot add the same private member more than once");n instanceof WeakSet?n.add(e):n.set(e,t)},l=(e,n,t,u)=>(C(e,n,"write to private field"),u?u.call(e,t):n.set(e,t),t);var c=(e,n,t)=>(C(e,n,"access private method"),t);var d=class{addEventListener(){}removeEventListener(){}dispatchEvent(n){return!0}};if(typeof DocumentFragment=="undefined"){class e extends d{}globalThis.DocumentFragment=e}var b=class extends d{},_=class extends d{},K={get(e){},define(e,n,t){},upgrade(e){},whenDefined(e){return Promise.resolve(b)}},g,P=class{constructor(n,t={}){i(this,g,void 0);l(this,g,t==null?void 0:t.detail)}get detail(){return r(this,g)}initCustomEvent(){}};g=new WeakMap;function B(e,n){return new b}var D={document:{createElement:B},DocumentFragment,customElements:K,CustomEvent:P,EventTarget:d,HTMLElement:b,HTMLVideoElement:_},S=typeof window=="undefined"||typeof globalThis.customElements=="undefined",w=S?D:globalThis,O=S?D.document:globalThis.document;var H=(e,n,t,u)=>{let E=`https://stats.mux.com/counts?token=${e}`,I=new AbortController,G=I.signal,v,R=!1,k=()=>R?Promise.resolve():fetch(E,{signal:G}).then(s=>s.json()).then(s=>{var x,V,y;let p=(V=(x=s==null?void 0:s.data)==null?void 0:x[0])==null?void 0:V.views;return!!(s!=null&&s.error)||p==null?Promise.reject((y=s==null?void 0:s.error)!=null?y:"no data in response"):(t(p),p)}).catch(u).then(()=>new Promise(s=>{v=setTimeout(()=>{s(void 0)},n*1e3)})).then(k);return k(),()=>{R=!0,I.abort(),typeof v=="number"&&(clearTimeout(v),v=void 0)}},o={TOKEN:"token",POLL_INTERVAL:"poll-interval",DISABLED:"disabled"},q=20,z=Object.freeze(Object.values(o)),M="Viewer Count",W="??",F=({viewerCount:e})=>{let n=typeof e=="number"?`${e}`:"Unknown";return`${M} ${n}`},$=document.createElement("template");$.innerHTML=`
2
+ <span id="viewer-count">
3
+ ${W}
4
+ </span>
5
+ `;var a,T,U,h,f,N,m,A,L=class extends w.HTMLElement{constructor(){super();i(this,T);i(this,f);i(this,m);i(this,a,void 0);i(this,h,void 0);this.attachShadow({mode:"open"}).appendChild($.content.cloneNode(!0))}static get observedAttributes(){return z}get views(){var t;return(t=r(this,h))!=null?t:Number.NaN}get token(){var t;return(t=this.getAttribute(o.TOKEN))!=null?t:""}set token(t){this.token!==t&&(l(this,h,void 0),this.setAttribute(o.TOKEN,t))}get pollInterval(){let t=this.hasAttribute(o.POLL_INTERVAL)?+this.getAttribute(o.POLL_INTERVAL):q;return t<15&&(console.warn("Poll interval must be at least 15 seconds, setting to 15."),t=15),t}set pollInterval(t){this.pollInterval!==t&&this.setAttribute(o.POLL_INTERVAL,`${t}`)}enable(){this.setAttribute("tabindex","0")}disable(){this.removeAttribute("tabindex")}connectedCallback(){this.hasAttribute("disabled")||this.enable(),this.setAttribute("aria-label",F({})),this.setAttribute("role","presentation"),c(this,f,N).call(this)}disconnectedCallback(){c(this,m,A).call(this)}attributeChangedCallback(t,u,E){t===o.POLL_INTERVAL||t===o.TOKEN?(c(this,m,A).call(this),c(this,f,N).call(this)):t===o.DISABLED&&u!==E&&(E?this.disable():this.enable())}};a=new WeakMap,T=new WeakSet,U=function(){return this.shadowRoot.querySelector("#viewer-count")},h=new WeakMap,f=new WeakSet,N=function(){this.token&&this.pollInterval&&!r(this,a)&&l(this,a,H(this.token,this.pollInterval,t=>{l(this,h,t),this.dispatchEvent(new CustomEvent("change",{detail:t})),r(this,T,U).textContent=`${this.views}`,this.setAttribute("aria-label",F({viewerCount:t}))},t=>{this.dispatchEvent(new CustomEvent("error",{detail:t})),console.warn("Failed to retrieve viewer count: Error - ",t),c(this,m,A).call(this)}))},m=new WeakSet,A=function(){var t;(t=r(this,a))==null||t.call(this),l(this,a,void 0)};w.customElements.get("mux-active-viewer-count")||w.customElements.define("mux-active-viewer-count",L);var Z=L;export{Z as default,H as subscribeViewerCount};
6
+ //# sourceMappingURL=mux-active-viewer-counts.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/polyfills/index.ts", "../src/index.ts"],
4
+ "sourcesContent": ["/* eslint @typescript-eslint/no-empty-function: \"off\", @typescript-eslint/no-unused-vars: \"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 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"],
5
+ "mappings": "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",
6
+ "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", "_viewerCountEl", "viewerCountEl_get", "_views", "_setupViewerCountPolling", "setupViewerCountPolling_fn", "_teardownViewerCountPolling", "teardownViewerCountPolling_fn", "MuxActiveViewerCountElement", "internalGlobalThis", "__privateAdd", "__privateGet", "value", "__privateSet", "temp", "__privateMethod", "attrName", "oldValue", "newValue", "errorMsg", "src_default"]
7
+ }
@@ -0,0 +1 @@
1
+ {"program":{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../node_modules/typescript/lib/lib.scripthost.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2019.full.d.ts","../src/polyfills/index.ts","../src/index.ts","../../../types/media-chrome.d.ts","../../../node_modules/hls.js/dist/hls.js.d.ts","../../../types/mux-embed.d.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"f3d4da15233e593eacb3965cde7960f3fddf5878528d882bcedd5cbaba0193c7","affectsGlobalScope":true},{"version":"7fac8cb5fc820bc2a59ae11ef1c5b38d3832c6d0dfaec5acdb5569137d09a481","affectsGlobalScope":true},{"version":"097a57355ded99c68e6df1b738990448e0bf170e606707df5a7c0481ff2427cd","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},"1f03b495671c3a1bd24510f38b8947f0991dfd6bf0278c68eca14af15b306e1f",{"version":"4f052f41a9c3ce4ef8a8bf182b4f50bb749a094ab64a844aec7fd27adbbadf0b","signature":"2f39ccc3f2cad7f2a1e0ad14a744877ed08dae4ae75510109ac981ceb783b566"},{"version":"f559ece2f436a53544cae205479cba596934de2fb54254b17ad3165dc9108dfd","signature":"7ad98c1bd272f1c6a67a6f9cf365eb43c9fdc4cc490eda9e9a54bd37deef4709"},"3cf4c7825a6c0ef1965e8906b85844aafdcdda9d95c8b4bcfcb3a20811cfd0b1","b20665fc587d1fe3f94b1e0775fc753146968f7bdb2f416648ab6e5410209c73",{"version":"6ff45ab1a5c3f32638dd1131cc94ecd68f11566363ea16dca3c8a7d556a81bbb","affectsGlobalScope":true}],"options":{"composite":true,"declaration":true,"emitDeclarationOnly":true,"esModuleInterop":true,"module":5,"noImplicitAny":true,"outDir":"./types","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":6},"fileIdsList":[[37],[40]],"referencedMap":[[38,1],[41,2]],"exportedModulesMap":[[38,1],[41,2]],"semanticDiagnosticsPerFile":[40,7,8,12,11,2,13,14,15,16,17,18,19,20,3,4,24,21,22,23,25,26,27,5,28,29,30,31,6,36,35,32,33,34,1,10,9,38,37,39,41],"latestChangedDtsFile":"./types/index.d.ts"},"version":"4.9.4"}
@@ -0,0 +1,18 @@
1
+ import { globalThis } from './polyfills';
2
+ export declare const subscribeViewerCount: (token: string, pollInterval: number, callback: (views: number) => void, errorCb: (errorMsg: string) => void) => () => void;
3
+ declare class MuxActiveViewerCountElement extends globalThis.HTMLElement {
4
+ #private;
5
+ static get observedAttributes(): readonly string[];
6
+ get views(): number;
7
+ constructor();
8
+ get token(): string;
9
+ set token(value: string);
10
+ get pollInterval(): number;
11
+ set pollInterval(value: number);
12
+ enable(): void;
13
+ disable(): void;
14
+ connectedCallback(): void;
15
+ disconnectedCallback(): void;
16
+ attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null): void;
17
+ }
18
+ export default MuxActiveViewerCountElement;
@@ -0,0 +1,4 @@
1
+ type GlobalThis = typeof globalThis;
2
+ declare const internalGlobalThis: GlobalThis;
3
+ declare const internalDocument: Document;
4
+ export { internalGlobalThis as globalThis, internalDocument as document };
@@ -0,0 +1,16 @@
1
+ import { globalThis } from './polyfills';
2
+ export declare const subscribeViewerCount: (token: string, pollInterval: number, callback: (views: number) => void, errorCb: (errorMsg: string) => void) => () => void;
3
+ declare class MuxActiveViewerCountElement extends globalThis.HTMLElement {
4
+ private "MuxActiveViewerCountElement.#private";
5
+ static readonly observedAttributes: readonly string[];
6
+ readonly views: number;
7
+ constructor();
8
+ token: string;
9
+ pollInterval: number;
10
+ enable(): void;
11
+ disable(): void;
12
+ connectedCallback(): void;
13
+ disconnectedCallback(): void;
14
+ attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null): void;
15
+ }
16
+ export default MuxActiveViewerCountElement;
@@ -0,0 +1,4 @@
1
+ type GlobalThis = typeof globalThis;
2
+ declare const internalGlobalThis: GlobalThis;
3
+ declare const internalDocument: Document;
4
+ export { internalGlobalThis as globalThis, internalDocument as document };
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@mux/mux-active-viewer-count",
3
+ "version": "0.1.1-canary.0-b2794d3",
4
+ "description": "A custom Mux element to show the current viewer count for the browser that Just Works™",
5
+ "main": "./dist/index.cjs.js",
6
+ "module": "./dist/index.mjs",
7
+ "browser": "./dist/index.mjs",
8
+ "unpkg": "./dist/mux-active-viewer-count.js",
9
+ "jsdelivr": "./dist/mux-active-viewer-counts.js",
10
+ "exports": {
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.cjs.js",
13
+ "default": "./dist/index.cjs.js"
14
+ },
15
+ "types": "dist/types-ts3.4/index.d.ts",
16
+ "typesVersions": {
17
+ ">=4.3.5": {
18
+ "*": [
19
+ "dist/types/index.d.ts"
20
+ ]
21
+ }
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/muxinc/elements",
26
+ "directory": "packages/mux-active-viewer-counts"
27
+ },
28
+ "author": "Mux, Inc.",
29
+ "license": "MIT",
30
+ "scripts": {
31
+ "clean": "shx rm -rf dist/",
32
+ "lint": "eslint src/ --ext .js,.jsx,.ts,.tsx",
33
+ "test": "web-test-runner **/*test.js --port 8003 --coverage --config test/web-test-runner.config.mjs --root-dir ../..",
34
+ "posttest": "replace 'SF:src/' 'SF:packages/mux-active-viewer-counts/src/' coverage/lcov.info --silent",
35
+ "dev:iife": "yarn build:iife --watch=forever",
36
+ "dev:cjs": "yarn build:cjs --watch=forever",
37
+ "dev:esm": "yarn build:esm --watch=forever",
38
+ "dev:esm-module": "yarn build:esm-module --watch=forever",
39
+ "dev:types": "yarn build:types -w",
40
+ "dev": "npm-run-all --parallel dev:types dev:cjs dev:esm dev:esm-module dev:iife",
41
+ "build:esm": "esbuild src/index.ts --target=es2019 --bundle --sourcemap --metafile=./dist/esm.json --format=esm --outdir=dist --out-extension:.js=.mjs --external:@mux/*",
42
+ "build:esm-module": "esbuild src/index.ts --target=es2019 --bundle --sourcemap --metafile=./dist/module.json --format=esm --outfile=./dist/mux-active-viewer-counts.mjs",
43
+ "build:cjs": "esbuild src/index.ts --target=es2019 --bundle --sourcemap --metafile=./dist/cjs.json --format=cjs --outdir=dist --out-extension:.js=.cjs.js --external:@mux/*",
44
+ "build:iife": "esbuild src/index.ts --target=es2019 --bundle --sourcemap --metafile=./dist/iife.json --format=iife --outfile=./dist/mux-active-viewer-counts.js",
45
+ "copypolyfills": "shx mkdir -p src/polyfills && shx cp ../../shared/polyfills/index.ts ./src/polyfills/index.ts",
46
+ "build:types": "tsc --declaration --emitDeclarationOnly --outDir './dist/types'",
47
+ "postbuild:types": "downlevel-dts ./dist/types ./dist/types-ts3.4",
48
+ "build": "npm-run-all --parallel 'build:esm --minify' 'build:iife --minify' 'build:cjs --minify' 'build:esm-module --minify'",
49
+ "create-release-notes": "create-release-notes ./CHANGELOG.md",
50
+ "publish-release": "../../scripts/publish.sh"
51
+ },
52
+ "dependencies": {},
53
+ "devDependencies": {
54
+ "@mux/test-esm-exports": "0.1.0",
55
+ "@open-wc/testing": "^3.0.3",
56
+ "@typescript-eslint/eslint-plugin": "^5.48.0",
57
+ "@typescript-eslint/parser": "^5.48.0",
58
+ "@web/dev-server-esbuild": "^0.3.2",
59
+ "@web/dev-server-import-maps": "^0.0.6",
60
+ "@web/test-runner": "^0.13.26",
61
+ "downlevel-dts": "^0.11.0",
62
+ "esbuild": "^0.15.7",
63
+ "eslint": "^8.24.0",
64
+ "npm-run-all": "^4.1.5",
65
+ "replace": "^1.2.1",
66
+ "shx": "^0.3.4",
67
+ "typescript": "^4.9.4"
68
+ }
69
+ }