stormcloud-video-player 0.8.3 → 0.8.5
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/dist/stormcloud-vp.min.js +3 -1
- package/lib/index.cjs +553 -217
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +46 -2
- package/lib/index.d.ts +46 -2
- package/lib/index.js +494 -218
- package/lib/index.js.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +462 -216
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +11 -2
- package/lib/players/HlsPlayer.cjs +462 -216
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +462 -216
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/{types-DWVgdqF-.d.cts → types-CUKMIqHL.d.cts} +5 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +467 -217
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/mqttClient.cjs +245 -0
- package/lib/utils/mqttClient.cjs.map +1 -0
- package/lib/utils/mqttClient.d.cts +13 -0
- package/lib/utils/mqttConfig.cjs +141 -0
- package/lib/utils/mqttConfig.cjs.map +1 -0
- package/lib/utils/mqttConfig.d.cts +20 -0
- package/lib/utils/tracking.cjs +182 -170
- package/lib/utils/tracking.cjs.map +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/lib/utils/vastMacros.cjs +231 -0
- package/lib/utils/vastMacros.cjs.map +1 -0
- package/lib/utils/vastMacros.d.cts +24 -0
- package/package.json +3 -1
- package/src/certs/emqxsl-ca.crt +22 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/tracking.cjs","../../src/utils/tracking.ts"],"names":["name","all","__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","get","enumerable","__copyProps","to","from","except","desc","key","value","mod","tracking_exports","getBrowserID","call","getClientInfo","sendAdDetectTracking","sendAdImpressionTracking","sendAdLoadedTracking","sendHeartbeat","sendInitialTracking","module","exports","__toCommonJS","cachedBrowserId","screen","window","navigator","ua","userAgent","platform","vendor","maxTouchPoints","deviceMemory","hardwareConcurrency","screenInfo","width","height","memory","availWidth","availHeight","orientation","type","pixelDepth","deviceType","brand","os","model","isSmartTV","isAndroid","isWebView","isWebApp","includes","webosMatch","match","tvMatch","tizenMatch","trim","test","androidModelMatch","outerHeight","outerWidth","domain","substring","location","hostname","origin","language","languages","join","cookieEnabled","doNotTrack"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uJAMWA,KAAQC,IACfC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QANAA,QAAAA,IAAYC,OAAOC,cAAc;6BACjCC,mBAAmBF,OAAOG,wBAAwB;QAClDC,cAAAA,MAAoBJ,OAAOK,mBAAmB;wBAC9CC,eAAeN,OAAOO,SAAS,CAACC,cAAc;QAC9CC,UAAAA,CAAW,SAAA,QAAA,CAACC,QAAQZ;QACtB,IAAK,IAAID,GAAAA,EAAAA,uBAAAA,UACPE,SAAUW,cADHb,2CAAAA,qBACGa,IAAAA,CAAAA,CAAQb,MAAM,EAAA;YAAEc,KAAKb,GAAG,CAACD,EAAAA,GAAK,OAAA,aAAA;YAAEe,QAAAA,IAAY,MAAA,UAAA,IAAA;QAAK,UAAA,SAAA,QAAA;QAC/D,iBAAA,SAAA,eAAA;IACA,EAAIC,cAAc,qBAACC,IAAIC,MAAMC,QAAQC;IACnC,IAAIF,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,OAAOA,SAAS,YAAY;SAC7D,GAAA,UAAA,UAAA,QAAA,2BAAA;;oBACH,IAAI,CAACT,gBACwCM,SAF1C,GAEsD,CAAEK,CAAAA,GAFxD,IAE+Df,iBAAiBa,MAAMG,IAAG,KAAMD,KAAKL,MAIjFC,CAA0CM,GAJiD,CAIjCC,MCjBtFX,CAAAY,aAAAC,UAAA,QAAAA;;;;;;;;;kCDWS,IAAIJ,MAAJ;wCACEZ,KAAAA,CAAaiB,IAAI,CAACT,GAAAA,CAAII,QAAQA,QAAQF,QACzCjB,UAAUe,IAAII,KAAK;wCAAEP,IAAAA,CAAK,SAALA,KAAAA,OAAAA,MAAAA,IAAAA,OAAAA,MAAAA,CAAAA,MAAAA;;;;;;;;;;;;;;;;;;;;;;8BAA2F,CAAA,gBAAA,aAAA;;0BAFpH,CAAA,OAAK,YAAWP,kBAAkBW,0BAA7B,SAAA,6BAAA,QAAA,yBAAA;;wBAAA,SAAA,IAAA,WAAA,KAAA,MAAA;4BAAA,IAAA,GAAA,IAAA,KAAA,MAAA,EAAA,IAAA;;;qCAAA,CAAA,4BAAA;kCAAA;;;;;;;;4BAAA,EAAA,UAAA,GAAA,CAAA,SAAA;+BAAA,EAAA,QAAA,CAAA,IAAA,QAAA,CAAA,GAAA;uBAAA,IAAA,CAAA;wCAAA;;;;;;;iCAGP;;;;;;2BAG0BF,UAAYd,UAAU,CAAC,GAAG,cAAc;wBAAEoB,EAAAA,GAAO,GAAA,KAAA,kBAAA,MAAA,EAAA,KAAA;wBAASC,OAAAA,kBAAAA,UAAAA,CAAAA;;wBAEtF,OAAA,OAAA,MAAwB;oBCnBxB,EAAAC,mBAAA,CAAA;oBAAAZ,eAAAY,IAAA,CAAA,GAAA,CAAA,MAAA,QAAA,CAAA,IAAA,QAAA,CAAA,GAAA;oBAAAC,YAAA,KAAA,EAAAA,CAAAA,GAAAA,QAAAA,CAAAA,IAAAA,QAAAA,CAAAA,IAAAA;6BAAAA,KAAAA,MAAAA,GAAAA,QAAAA,CAAAA,IAAAA,SAAAA,CAAAA,GAAAA,IAAAA,QAAAA,CAAAA,IAAAA;;sBAAAE;;wBAAAA,UAAA,SAAAA;;;;mBAAAA;;;IAAAC,YAAAA,GAAAA,OAAAA,OAAA,SAAAA,UAAAA;eAAAA,KAAAA,GAAAA,OAAAA,0BAAAA;;IAAAC,KAAAA,aAAAA,QAAA,EAAA,OAAAA;eAAAA,GAAAA;;MAAAC,sBAAA,SAAAA;iBAAAA,GAAAA;;MAAAC,eAAA,SAAAA;iBAAAA;;IAAAC,KAAAA,UAAA,OAAA,EAAAA,QAAAA,EAAAA,IAAAA;;;;;;oBAAAA;;wBAAAA,MAAAA,WAAAA;;4BAAA,SAAA,aAAA;4BAAAC,GAAAC,GAAAA,IAAA,CAAA,EAAAC,OAAAA,CAAAA,KAAAX;wBASA,EAAIY,kBAAiC;;;2BATrCJ,IAAAA;oBAWO,IAAA,CAAA,EAASL,OAAAA,EAAAA,EAAAA;4BASLU,EAAAA,IAAAA,GACCA,GAAAA,MACIA,UACCA,OACCA,OADDA,EACCA,EAAAA,KAAAA,GACFA,GADEA,OAyHZC,SAA6BA,UAO/BA,4BAAAA,gBAsBWC;sBAlKb,IAAMC,KAAKD,UAAUE,SAAA;;;wBACfC,SAAAA,EAAWH,EAAAA,QAAUG,QAAA;;;sBAA3B;;;;;;QACA,IAAMC,SAASJ,UAAUI,MAAA,IAAU;;IACnC,IAAMC,CAAAA,SAAAA,CAAiBL,EAAAA,EAAAA,MAAUK,IAAAA,EAAAA,IAAAA,IAAA,IAAkB;;;;;;oBACnCL;;wBAAAA,EAAkBM,IAAAA,KAAAA,GAAA,IAAgB;4BAClD,IAAMC,IAAAA,kBAAsBP,UAAUO,mBAAA,IAAuB;4BAE7D,IAAMC,KAAAA,QAAa,KAAA;gCACjBC,EAAAA,GAAA,EAAA,CAAOX,QAAAA,CAAAA,CAAAA,oBAAAA,8BAAAA,QAAQW,KAAA;8BACfC,MAAA,GAAQZ,WAAAA,oBAAAA,+BAAAA,SAAQY,MAAA;;;oBALZC,SAAUX,EAAAA;0BAMdY,QAAAA,EAAA,EAAA,CAAYd,WAAAA,oBAAAA,+BAAAA,SAAQc,UAAA;4BACpBC,EAAAA,IAAAA,KAAA,CAAA,CAAaf,WAAAA,WAAAA,OAAAA,SAAAA,CAAAA,KAAAA,GAAAA,SAAQe,WAAA;0BACrBC,aAAchB,EAAAA,WAAAA,oBAAAA,gCAAAA,sBAAAA,SAAQgB,WAAA,cAARhB,0CAAAA,oBAA6BiB,IAAA,KAAQ;;;wBACnDC,SAAAA,CAAA,GAAYlB,WAAAA,oBAAAA,+BAAAA,SAAQkB,UAAA;;;;;;;;;QACtB;;IAEA,IAAIC,CAAAA,MAAqD;wCAAA,UAAA;YAAA,SAAA,OAG7C;;;;;oBAH6C,UAAA,oEAAA,CAAA,GAAA,QAAA,oEAAA,CAAA;oBACrDC,QAAQ,KAAA;oBACH;;wBAAA,aAAA;;;oBAALC,KAAK,OAAA;oBACLC,QAAQ,KAAA,mBAAA,MAAA,SAAA,cAAA,8BAAA,mBAAA,aAAA,GAAA,IAAA,OAAA,WAAA;sBACZ,IAAIC;;wBAAAA,WAAY;4BAChB,IAAIC,OAAAA,KAAY;4BAChB,IAAIC,YAAY;4BAChB,IAAIC,SAAAA,EAAW,SAAA,UAAA;4BAEf,IAAIvB,GAAGwB,KAAAA,GAAA,CAAS,OAAA,GAAU,OAAA;gCACxBP,QAAQ,OAAA,QAAA,eAAA;gCACRC,KAAK,MAAA,EAAA;gCACLE,OAAAA,KAAY,CAAA,QAAA;gCACZJ,OAAAA,MAAa,QAAA;gCACb,IAAMS,KAAAA,QAAazB,GAAG0B,KAAA,CAAM;gCAC5BP,QAAQM,aAAa,SAAsB,OAAbA,UAAA,CAAW,EAAE,IAAK;4BAClD,OAAA,IAAWzB,GAAGwB,QAAA,CAAS,UAAU;8BAC/BP,QAAQ;;;;YACRC,KAAK;;QACLE,CAAAA,KAAY;wCAAA,UAAA;YAAA,SAEZ,YACA,EAAMO,SACNR,MAAQS,QA2BRR;;;;;oBA/BY,UAAA,oEAAA,CAAA;;;;;;;;;oBAEZ,EAAMQ,WAAAA,EAAa5B,GAAG0B,KAAA,CAAM;oBACZ1B,GAAG0B;;wBAAAA,EAAA,CAAM,UAAA,qBAA+B,aAAa;;;oBAArE;oBACAP,eAAQS,IACJ,SAA0BD,OAAjBC,UAAA,CAAW,EAAE,EAAA,KAAW,OAAPD,SAAUE,IAAA,KACpC;wBACN,WAAA,KAAA,IAAW7B,GAAGwB,QAAA,CAAS,YAAY;uBACjCP,OAAQ;;;wBAERG,UAAY,OAAA,YAAA;8BACZJ,IAAAA,SAAa;gCACf,GAAA,IAAWhB,GAAGwB,QAAA,CAAS,YAAYxB,GAAGwB,QAAA,CAAS,UAAU;oCACvDP,MAAQ,KAAA;oCACRC,GAAK,UAAA,WAAA,UAAA;oCACLE,UAAY,SAAA,QAAA,eAAA;oCACZJ,IAAAA,OAAa,IAAA,EAAA;oCACf,CAAA,IACEhB,GAAGwB,GAAAA,KAAA,CAAS,cACXxB,CAAAA,GAAGwB,QAAA,CAAS,WAAWrB,OAAOqB,QAAA,CAAS,OAAM,GAC9C;oCACAP,MAAQ,KAAA;oCACRC,GAAK,UAAA;oCACLE,UAAY,EAAA,aAAA,GAAA,IAAA,OAAA,WAAA;gCACZJ,aAAa;;4CAKbC,QAAQ;4BACRC,KAAK;;;wBApBLE;;;;;;oBAqBAA,SAAY;wBACZJ,IAAAA,KAAAA,CACF,GADe,EACf,IAAWhB,GAAGwB,QAAA,CAAS,YAAYxB,GAAGwB,QAAA,CAAS,UAAU,WACvDP,QAAQ;;;;;;;;;;;YAGRD,aAAa;;IACf,KAAWhB,EAAX,CAAcwB,QAAA,CAAS;wCAAA,GAAY,OAAA,EAAA,YAAA;YAAA,SAO5BA,QAAA,CAAS,YAAY;;;;;oBAPO,UAAA,oEAAA,CAAA;;;;;;;;;;;wBAEjCN,GAAK,WAAA,YAAA,SAAA;8BACLE,QAAAA,IAAY;8BACZJ,SAAAA,IAAa,SAAA,SAAA;wBACf;;;wBAHEE;;;;;;;wBAMAG,IAAAA,KAAAA,GAAY,AACZH,KAAK,wDACLF,aAAa,SAASc,IAAA,CAAK9B,MAAM,WAAW;;;;;;;;;;;gBAS1CoB,YAAY;;SACZH,GAAAA,EAAQA,UAAU;wCAAA,MAAY,IAAA,EAAA,SAAeA,GAAAA;YAAAA,SAOjD;;;;;oBAPiDA,UAAAA,oEAAAA,CAAAA;;;;;;;;;;;wBAG/C,EAAMc,YAAAA,QAAoB/B,GAAG0B,CAAAA,IAAA,CAAM,IAAA;8BACnC,IAAIK,IAAAA,iBAAqBA,iBAAA,CAAkB,EAAC,EAAG;kCAC7CZ,KAAAA,GAAQY,UAAAA,OAAA,CAAkB,CAAA,CAAC;4BAC7B;;;wBAHA;;;;;;oBAIF;oBAEA,IAAI,IAAA,KAAA,GACFb,KAAK,EADgBY,IAAA,CAAK9B,KAAK,4CAE/BgB,aAAa;;;;;;;;;;;gBAGXA,aAAa;;QACf,CAAA;wCAAA,UAAA,EAAA,gBAAA;YAAA,SAGGK,aAkBL;;;;;oBArBE,UAAA,oEAAA,CAAA;;;;;;;;;oBAGiBD;;wBAAAA,MAAa,CAAC,SAASU,IAAA,CAAK9B,EAAAA,GAAK,SAAA,SAAA;8BAClD,IAAIA,GAAGwB,EAAAA,MAAA,CAAS,UAAA,EAAY,OAAA;gCAC1BN,KAAK;;;oBAFJG,YAAa,CAACD,CAAAA;;;0BAGfJ,MAAAA,GAAAA,IAAa;8BACf,OAAA,IAAWhB,GAAGwB,QAAA,CAAS,UAAU,CAAC,SAASM,IAAA,CAAK9B,KAAK;kCACnDkB,GAAAA,EAAK,eAAA,YAAA;oCACLF,EAAAA,WAAa;sCACb,IAAIZ,iBAAiB,GAAGY,aAAa;wCACvC,GAAA,IAAWhB,GAAGwB,CAAAA,OAAA,CAAS,IAAA,MAAU,GAAA;wCAC/BN,KAAK,YAAA;wCACLF,QAAAA,KAAa,YAAA,KAAA;wCACf,aAAA;wCACF,YAAA,iBAAA,SAAA;oCAEIC,QAAU,WAAW;;8BAEvB,IAAId,OAAOqB,QAAA,CAAS,UAAUP,QAAQ;;;;;;;;;;oBAExC;oBAEAK,QAAAA,IAAY,CAAA,CAEZ,EAAIxB,EAAAA,UAAAA,OAF+BgC,IAAA,CAAK9B,QAEpCF,8BAAAA,GACFwB,KADUU,OACE,IADF,MAAgB,KAAKlC,EAAAA,WAAAA,oBAAAA,+BAAAA,SAAQmC,UAAA,MAAe,GAAG;;;;;;;;;;;QAS3D,OAAO;;QACLhB,CAAAA;wCAAAA,UAAAA;YAAAA,SAAAA,OAEAE,eAMAe;;;;;oBARAjB,UAAAA,oEAAAA,CAAAA,GAAAA,QAAAA,oEAAAA,CAAAA;;;;;;;;;oBAEgBjB;;wBAAGmC,IAAA,CAAU,GAAG,MAAM,WACtCnB,YAAAA,AACAI,SACAC,EADAD,SACAC;;;oBAHAF,KAAOA,SAASnB,EAAAA,CAAGmC;wBAKnBZ;;wBAAAA,QAAAA,CAAAA,eAAAA,YAAAA;;;;;;;;;oBACAW,KAAQpC,OAAOsC,QAAA,CAASC,QAAA;wBACxBC,IAAAA,IAAQxC,CAAAA,CAAAA,KAAOsC,QAAA,CAASE,MAAA,gCAAA;;;;;;;;;;;YAExBrC,WAAWD;;QACXG,QAAAA,6CAAAA;QACAD,KAAAA,KAAAA,EAAAA,GAAAA;wBACAL,QAAQU;yBACRD,qBAAAA;gCACAD,cAAcK;oCACdN,gBAAAA;gCACAmC,UAAUxC,UAAUwC,QAAA;yBACpBC,WAAWzC,EAAAA,uBAAAA,UAAUyC,SAAA,cAAVzC,2CAAAA,qBAAqB0C,IAAA,CAAK,SAAQ;+BAC7CC,eAAe3C,UAAU2C,aAAA;SACzBC,YAAY5C,UAAU4C,UAAA,IAAc","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/utils/tracking.ts\nvar tracking_exports = {};\n__export(tracking_exports, {\n getBrowserID: () => getBrowserID,\n getClientInfo: () => getClientInfo,\n sendAdDetectTracking: () => sendAdDetectTracking,\n sendAdImpressionTracking: () => sendAdImpressionTracking,\n sendAdLoadedTracking: () => sendAdLoadedTracking,\n sendHeartbeat: () => sendHeartbeat,\n sendInitialTracking: () => sendInitialTracking\n});\nmodule.exports = __toCommonJS(tracking_exports);\nvar cachedBrowserId = null;\nfunction getClientInfo() {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = navigator.deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: screen?.orientation?.type || \"\",\n pixelDepth: screen?.pixelDepth\n };\n let deviceType = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState\n };\n}\nasync function getBrowserID(clientInfo) {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n const fingerprintString = JSON.stringify(clientInfo);\n if (typeof crypto !== \"undefined\" && crypto.subtle && crypto.subtle.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n let encodedData;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(fingerprintString);\n } else {\n const utf8 = unescape(encodeURIComponent(fingerprintString));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n cachedBrowserId = hashHex;\n return hashHex;\n } catch (error) {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle.digest not supported, using fallback hash\"\n );\n }\n }\n let hash = 0;\n for (let i = 0; i < fingerprintString.length; i++) {\n const char = fingerprintString.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n cachedBrowserId = (fallbackHash + timestamp + random).padEnd(64, \"0\");\n return cachedBrowserId;\n}\nvar PLAYER_TRACKING_BASE_URL = \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking\";\nvar TRACK_URL = `${PLAYER_TRACKING_BASE_URL}/metrics/ingest`;\nvar HEARTBEAT_URL = `${PLAYER_TRACKING_BASE_URL}/heartbeat`;\nvar IMPRESSIONS_URL = `${PLAYER_TRACKING_BASE_URL}/impressions/ingest`;\nfunction buildHeaders(licenseKey) {\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n return headers;\n}\nasync function sendTrackRequest(licenseKey, body) {\n const response = await fetch(TRACK_URL, {\n method: \"POST\",\n headers: buildHeaders(licenseKey),\n body: JSON.stringify(body)\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n}\nasync function postJson(url, licenseKey, body) {\n const response = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(licenseKey),\n body: JSON.stringify(body)\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n}\nasync function buildPlayerMetricEvent(licenseKey, context = {}, flags = {}) {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n return {\n player_id: browserId,\n browserId,\n device_type: clientInfo.deviceType,\n deviceType: clientInfo.deviceType,\n input_stream_type: context.inputStreamType,\n os: clientInfo.os,\n ad_loaded: flags.adLoaded,\n ad_detect: flags.adDetect,\n license_key: licenseKey,\n capture_at: captureAt,\n timestamp: captureAt\n };\n}\nasync function sendInitialTracking(licenseKey, context = {}) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData = {\n browserId,\n ...clientInfo\n };\n await sendTrackRequest(licenseKey, {\n events: [\n {\n player_id: browserId,\n device_type: clientInfo.deviceType,\n input_stream_type: context.inputStreamType,\n os: clientInfo.os,\n ad_loaded: false,\n ad_detect: false,\n license_key: licenseKey,\n capture_at: (/* @__PURE__ */ new Date()).toISOString()\n }\n ],\n trackingData\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n try {\n const metricEvent = await buildPlayerMetricEvent(licenseKey, context, {\n captureAt: adImpressionInfo.timestamp\n });\n await Promise.all([\n postJson(HEARTBEAT_URL, licenseKey, metricEvent),\n postJson(IMPRESSIONS_URL, licenseKey, {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n license_key: licenseKey,\n capture_at: adImpressionInfo.timestamp\n }\n ]\n })\n ]);\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n try {\n const heartbeatData = await buildPlayerMetricEvent(\n licenseKey,\n context,\n flags\n );\n await postJson(HEARTBEAT_URL, licenseKey, heartbeatData);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n getBrowserID,\n getClientInfo,\n sendAdDetectTracking,\n sendAdImpressionTracking,\n sendAdLoadedTracking,\n sendHeartbeat,\n sendInitialTracking\n});\n","import type {\n ClientInfo,\n TrackingData,\n AdDetectInfo,\n AdLoadedInfo,\n AdImpressionInfo,\n PlayerAnalyticsContext,\n} from \"../types\";\n\nlet cachedBrowserId: string | null = null;\n\nexport function getClientInfo(): ClientInfo {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = (navigator as any).deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: (screen?.orientation as any)?.type || \"\",\n pixelDepth: screen?.pixelDepth,\n };\n\n let deviceType: \"tv\" | \"mobile\" | \"tablet\" | \"desktop\" = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch\n ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim()\n : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (\n ua.includes(\"Android\") &&\n (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))\n ) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (\n ua.includes(\"Android\") &&\n (ua.includes(\"NetCast\") || ua.includes(\"LG\"))\n ) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n\n if (\n ua.includes(\"Android\") &&\n (maxTouchPoints === 0 ||\n ua.includes(\"Google TV\") ||\n ua.includes(\"XiaoMi\"))\n ) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n\n isWebApp =\n window.matchMedia(\"(display-mode: standalone)\").matches ||\n (window.navigator as any).standalone === true ||\n window.screen?.orientation?.angle !== undefined;\n\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState,\n };\n}\n\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n\n const fingerprintString = JSON.stringify(clientInfo);\n\n if (typeof crypto !== \"undefined\" && crypto.subtle && crypto.subtle.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n\n let encodedData: BufferSource;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(fingerprintString);\n } else {\n const utf8 = unescape(encodeURIComponent(fingerprintString));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n cachedBrowserId = hashHex;\n return hashHex;\n } catch (error) {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle.digest not supported, using fallback hash\"\n );\n }\n }\n\n let hash = 0;\n for (let i = 0; i < fingerprintString.length; i++) {\n const char = fingerprintString.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n\n cachedBrowserId = (fallbackHash + timestamp + random).padEnd(64, \"0\");\n return cachedBrowserId;\n}\n\nconst PLAYER_TRACKING_BASE_URL =\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking\";\nconst TRACK_URL = `${PLAYER_TRACKING_BASE_URL}/metrics/ingest`;\nconst HEARTBEAT_URL = `${PLAYER_TRACKING_BASE_URL}/heartbeat`;\nconst IMPRESSIONS_URL = `${PLAYER_TRACKING_BASE_URL}/impressions/ingest`;\n\ntype PlayerMetricFlags = {\n adLoaded?: boolean;\n adDetect?: boolean;\n captureAt?: string;\n};\n\nfunction buildHeaders(licenseKey: string | undefined): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n return headers;\n}\n\nasync function sendTrackRequest(\n licenseKey: string | undefined,\n body: Record<string, unknown>\n): Promise<void> {\n const response = await fetch(TRACK_URL, {\n method: \"POST\",\n headers: buildHeaders(licenseKey),\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n}\n\nasync function postJson(\n url: string,\n licenseKey: string | undefined,\n body: Record<string, unknown>\n): Promise<void> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(licenseKey),\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n}\n\nasync function buildPlayerMetricEvent(\n licenseKey: string | undefined,\n context: PlayerAnalyticsContext = {},\n flags: PlayerMetricFlags = {}\n): Promise<Record<string, unknown>> {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const captureAt = flags.captureAt ?? new Date().toISOString();\n\n return {\n player_id: browserId,\n browserId,\n device_type: clientInfo.deviceType,\n deviceType: clientInfo.deviceType,\n input_stream_type: context.inputStreamType,\n os: clientInfo.os,\n ad_loaded: flags.adLoaded,\n ad_detect: flags.adDetect,\n license_key: licenseKey,\n capture_at: captureAt,\n timestamp: captureAt,\n };\n}\n\nexport async function sendInitialTracking(\n licenseKey?: string,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const trackingData: TrackingData = {\n browserId,\n ...clientInfo,\n };\n\n await sendTrackRequest(licenseKey, {\n events: [\n {\n player_id: browserId,\n device_type: clientInfo.deviceType,\n input_stream_type: context.inputStreamType,\n os: clientInfo.os,\n ad_loaded: false,\n ad_detect: false,\n license_key: licenseKey,\n capture_at: new Date().toISOString(),\n },\n ],\n trackingData,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\n\nexport async function sendAdDetectTracking(\n licenseKey: string | undefined,\n adDetectInfo: AdDetectInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdLoadedTracking(\n licenseKey: string | undefined,\n adLoadedInfo: AdLoadedInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdImpressionTracking(\n licenseKey: string | undefined,\n adImpressionInfo: AdImpressionInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n const metricEvent = await buildPlayerMetricEvent(licenseKey, context, {\n captureAt: adImpressionInfo.timestamp,\n });\n await Promise.all([\n postJson(HEARTBEAT_URL, licenseKey, metricEvent),\n postJson(IMPRESSIONS_URL, licenseKey, {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n license_key: licenseKey,\n capture_at: adImpressionInfo.timestamp,\n },\n ],\n }),\n ]);\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(\n licenseKey?: string,\n context: PlayerAnalyticsContext = {},\n flags: PlayerMetricFlags = {}\n): Promise<void> {\n try {\n const heartbeatData = await buildPlayerMetricEvent(\n licenseKey,\n context,\n flags\n );\n await postJson(HEARTBEAT_URL, licenseKey, heartbeatData);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/tracking.cjs","../../src/utils/mqttConfig.ts","../../src/utils/mqttClient.ts","../../src/utils/tracking.ts"],"names":["enabled","__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","tracking_exports","getBrowserID","getClientInfo","sendAdDetectTracking","sendAdImpressionTracking","sendAdLoadedTracking","sendHeartbeat","sendInitialTracking","module","exports","DEFAULT_MQTT_CONFIG","brokerAddress","brokerPort","wsPort","username","password","topicPrefix","qos","mqttConfig","isMQTTEnabled","buildMQTTBrokerUrl","brokerUrl","buildPlayerTopic","licenseKey","channel","import_mqtt","require","LOG","client","status","initMQTTClient","url","clientId","Math","random","toString","slice","mqtt","connect","keepalive","queueQoSZero","console","on","ensureMQTTClient","clean","connectTimeout","err","warn","info","message","publishMQTT","topic","payload","publish","JSON","stringify","cachedBrowserId","platform","navigator","height","screen","window","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","width","availWidth","availHeight","orientation","type","deviceType","brand","isWebApp","model","isSmartTV","isAndroid","isWebView","ua","includes","os","webosMatch","match","tizenMatch","tvMatch","trim","test","androidModelMatch"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/utils/tracking.ts\nvar tracking_exports = {};\n__export(tracking_exports, {\n getBrowserID: () => getBrowserID,\n getClientInfo: () => getClientInfo,\n sendAdDetectTracking: () => sendAdDetectTracking,\n sendAdImpressionTracking: () => sendAdImpressionTracking,\n sendAdLoadedTracking: () => sendAdLoadedTracking,\n sendHeartbeat: () => sendHeartbeat,\n sendInitialTracking: () => sendInitialTracking\n});\nmodule.exports = __toCommonJS(tracking_exports);\n\n// src/utils/mqttConfig.ts\nvar DEFAULT_MQTT_CONFIG = {\n enabled: true,\n brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n brokerPort: 8883,\n wsPort: 8084,\n username: \"for-sonifi\",\n password: \"sonifi-mqtt\",\n topicPrefix: \"adstorm/players\",\n qos: 1\n};\nvar mqttConfig = { ...DEFAULT_MQTT_CONFIG };\nfunction isMQTTEnabled() {\n return mqttConfig.enabled;\n}\nfunction buildMQTTBrokerUrl() {\n if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\nfunction buildPlayerTopic(licenseKey, channel) {\n return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n\n// src/utils/mqttClient.ts\nvar import_mqtt = __toESM(require(\"mqtt\"), 1);\nvar LOG = \"[StormcloudVideoPlayer][MQTT]\";\nvar client = null;\nvar status = \"disconnected\";\nfunction initMQTTClient() {\n if (client || !isMQTTEnabled()) return;\n const url = buildMQTTBrokerUrl();\n status = \"connecting\";\n const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n try {\n client = import_mqtt.default.connect(url, {\n clientId,\n username: mqttConfig.username,\n password: mqttConfig.password,\n keepalive: 60,\n clean: true,\n reconnectPeriod: 5e3,\n connectTimeout: 1e4,\n queueQoSZero: false\n });\n } catch (err) {\n status = \"error\";\n console.warn(`${LOG} connect() threw:`, err);\n return;\n }\n client.on(\"connect\", () => {\n status = \"connected\";\n console.info(`${LOG} connected to ${url}`);\n });\n client.on(\"reconnect\", () => {\n status = \"connecting\";\n console.info(`${LOG} reconnecting\\u2026`);\n });\n client.on(\"offline\", () => {\n status = \"disconnected\";\n console.warn(`${LOG} offline`);\n });\n client.on(\"error\", (err) => {\n status = \"error\";\n console.warn(`${LOG} error:`, err.message);\n });\n client.on(\"close\", () => {\n if (status === \"connected\") {\n status = \"disconnected\";\n }\n });\n}\nfunction ensureMQTTClient() {\n if (isMQTTEnabled() && !client) {\n initMQTTClient();\n }\n}\nfunction publishMQTT(topic, payload) {\n if (!isMQTTEnabled()) {\n return false;\n }\n ensureMQTTClient();\n if (!client) {\n return false;\n }\n try {\n client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n return true;\n } catch (err) {\n console.warn(`${LOG} publish failed on ${topic}:`, err);\n return false;\n }\n}\n\n// src/utils/tracking.ts\nvar cachedBrowserId = null;\nfunction getClientInfo() {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = navigator.deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: screen?.orientation?.type || \"\",\n pixelDepth: screen?.pixelDepth\n };\n let deviceType = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState\n };\n}\nasync function getBrowserID(clientInfo) {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n const fingerprintString = JSON.stringify(clientInfo);\n if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n let encodedData;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(fingerprintString);\n } else {\n const utf8 = unescape(encodeURIComponent(fingerprintString));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n const hashHex = Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n cachedBrowserId = hashHex;\n return hashHex;\n } catch {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n );\n }\n }\n let hash = 0;\n for (let i = 0; i < fingerprintString.length; i++) {\n const char = fingerprintString.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n cachedBrowserId = (fallbackHash + timestamp + random).padEnd(64, \"0\");\n return cachedBrowserId;\n}\nfunction canPublish(licenseKey) {\n return Boolean(isMQTTEnabled() && licenseKey);\n}\nasync function buildPlayerMetricEvent(context = {}, flags = {}) {\n const clientInfo = getClientInfo();\n const playerId = await getBrowserID(clientInfo);\n const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n return {\n player_id: playerId,\n device_type: clientInfo.deviceType,\n os: clientInfo.os.toLowerCase(),\n ad_loaded: flags.adLoaded ?? false,\n ad_detect: flags.adDetect ?? false,\n capture_at: captureAt,\n ...context.inputStreamType ? { input_stream_type: context.inputStreamType } : {}\n };\n}\nfunction publishTracking(licenseKey, channel, body) {\n ensureMQTTClient();\n publishMQTT(buildPlayerTopic(licenseKey, channel), body);\n}\nasync function sendInitialTracking(licenseKey, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n adLoaded: false,\n adDetect: false\n });\n publishTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n captureAt: adImpressionInfo.timestamp\n });\n publishTracking(licenseKey, \"heartbeat\", metricEvent);\n publishTracking(licenseKey, \"impressions\", {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n capture_at: adImpressionInfo.timestamp\n }\n ]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const heartbeatData = await buildPlayerMetricEvent(context, flags);\n publishTracking(licenseKey, \"heartbeat\", heartbeatData);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n getBrowserID,\n getClientInfo,\n sendAdDetectTracking,\n sendAdImpressionTracking,\n sendAdLoadedTracking,\n sendHeartbeat,\n sendInitialTracking\n});\n","export const MQTT_CA_CERT_FILE = \"src/certs/emqxsl-ca.crt\";\n\nexport type MQTTConfig = {\n enabled: boolean;\n brokerAddress: string;\n brokerPort: number;\n wsPort: number;\n username: string;\n password: string;\n topicPrefix: string;\n qos: 0 | 1 | 2;\n brokerUrl?: string;\n};\n\nexport const DEFAULT_MQTT_CONFIG: MQTTConfig = {\n enabled: true,\n brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n brokerPort: 8883,\n wsPort: 8084,\n username: \"for-sonifi\",\n password: \"sonifi-mqtt\",\n topicPrefix: \"adstorm/players\",\n qos: 1,\n};\n\nexport const mqttConfig: MQTTConfig = { ...DEFAULT_MQTT_CONFIG };\n\nexport function applyMQTTConfig(overrides: Partial<MQTTConfig>): void {\n Object.assign(mqttConfig, overrides);\n}\n\nexport function isMQTTEnabled(): boolean {\n return mqttConfig.enabled;\n}\n\nexport function buildMQTTBrokerUrl(): string {\n if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\n\nexport function buildPlayerTopic(\n licenseKey: string,\n channel: \"metrics\" | \"impressions\" | \"heartbeat\"\n): string {\n return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n","import mqtt from \"mqtt\";\nimport type { MqttClient } from \"mqtt\";\nimport {\n applyMQTTConfig,\n buildMQTTBrokerUrl,\n isMQTTEnabled,\n mqttConfig,\n} from \"./mqttConfig\";\nimport type { MQTTConfig } from \"./mqttConfig\";\n\nconst LOG = \"[StormcloudVideoPlayer][MQTT]\";\n\nexport type MQTTStatus = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nlet client: MqttClient | null = null;\nlet status: MQTTStatus = \"disconnected\";\n\nexport function getMQTTStatus(): MQTTStatus {\n return status;\n}\n\nexport function isMQTTConnected(): boolean {\n return status === \"connected\" && client !== null && client.connected;\n}\n\nexport function isMQTTConfigured(): boolean {\n return isMQTTEnabled();\n}\n\nexport function configureMQTT(overrides: Partial<MQTTConfig>): void {\n applyMQTTConfig(overrides);\n disconnectMQTT();\n}\n\nexport function initMQTTClient(): void {\n if (client || !isMQTTEnabled()) return;\n\n const url = buildMQTTBrokerUrl();\n status = \"connecting\";\n\n const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n\n try {\n client = mqtt.connect(url, {\n clientId,\n username: mqttConfig.username,\n password: mqttConfig.password,\n keepalive: 60,\n clean: true,\n reconnectPeriod: 5000,\n connectTimeout: 10_000,\n queueQoSZero: false,\n });\n } catch (err) {\n status = \"error\";\n console.warn(`${LOG} connect() threw:`, err);\n return;\n }\n\n client.on(\"connect\", () => {\n status = \"connected\";\n console.info(`${LOG} connected to ${url}`);\n });\n\n client.on(\"reconnect\", () => {\n status = \"connecting\";\n console.info(`${LOG} reconnecting…`);\n });\n\n client.on(\"offline\", () => {\n status = \"disconnected\";\n console.warn(`${LOG} offline`);\n });\n\n client.on(\"error\", (err) => {\n status = \"error\";\n console.warn(`${LOG} error:`, err.message);\n });\n\n client.on(\"close\", () => {\n if (status === \"connected\") {\n status = \"disconnected\";\n }\n });\n}\n\nexport function ensureMQTTClient(): void {\n if (isMQTTEnabled() && !client) {\n initMQTTClient();\n }\n}\n\nexport function publishMQTT(\n topic: string,\n payload: Record<string, unknown>\n): boolean {\n if (!isMQTTEnabled()) {\n return false;\n }\n\n ensureMQTTClient();\n\n if (!client) {\n return false;\n }\n\n try {\n client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n return true;\n } catch (err) {\n console.warn(`${LOG} publish failed on ${topic}:`, err);\n return false;\n }\n}\n\nexport function disconnectMQTT(): void {\n if (client) {\n client.end(true);\n client = null;\n status = \"disconnected\";\n }\n}\n","import type {\n ClientInfo,\n AdDetectInfo,\n AdLoadedInfo,\n AdImpressionInfo,\n PlayerAnalyticsContext,\n} from \"../types\";\nimport { buildPlayerTopic, isMQTTEnabled } from \"./mqttConfig\";\nimport { ensureMQTTClient, publishMQTT } from \"./mqttClient\";\n\nlet cachedBrowserId: string | null = null;\n\nexport function getClientInfo(): ClientInfo {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = (navigator as any).deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: (screen?.orientation as any)?.type || \"\",\n pixelDepth: screen?.pixelDepth,\n };\n\n let deviceType: \"tv\" | \"mobile\" | \"tablet\" | \"desktop\" = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch\n ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim()\n : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (\n ua.includes(\"Android\") &&\n (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))\n ) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (\n ua.includes(\"Android\") &&\n (ua.includes(\"NetCast\") || ua.includes(\"LG\"))\n ) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n\n if (\n ua.includes(\"Android\") &&\n (maxTouchPoints === 0 ||\n ua.includes(\"Google TV\") ||\n ua.includes(\"XiaoMi\"))\n ) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n\n isWebApp =\n window.matchMedia(\"(display-mode: standalone)\").matches ||\n (window.navigator as any).standalone === true ||\n window.screen?.orientation?.angle !== undefined;\n\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState,\n };\n}\n\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n\n const fingerprintString = JSON.stringify(clientInfo);\n\n if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n\n let encodedData: BufferSource;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(fingerprintString);\n } else {\n const utf8 = unescape(encodeURIComponent(fingerprintString));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n const hashHex = Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n cachedBrowserId = hashHex;\n return hashHex;\n } catch {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n );\n }\n }\n\n let hash = 0;\n for (let i = 0; i < fingerprintString.length; i++) {\n const char = fingerprintString.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n\n cachedBrowserId = (fallbackHash + timestamp + random).padEnd(64, \"0\");\n return cachedBrowserId;\n}\n\ntype PlayerMetricFlags = {\n adLoaded?: boolean;\n adDetect?: boolean;\n captureAt?: string;\n};\n\nfunction canPublish(licenseKey: string | undefined): licenseKey is string {\n return Boolean(isMQTTEnabled() && licenseKey);\n}\n\nasync function buildPlayerMetricEvent(\n context: PlayerAnalyticsContext = {},\n flags: PlayerMetricFlags = {}\n): Promise<Record<string, unknown>> {\n const clientInfo = getClientInfo();\n const playerId = await getBrowserID(clientInfo);\n const captureAt = flags.captureAt ?? new Date().toISOString();\n\n return {\n player_id: playerId,\n device_type: clientInfo.deviceType,\n os: clientInfo.os.toLowerCase(),\n ad_loaded: flags.adLoaded ?? false,\n ad_detect: flags.adDetect ?? false,\n capture_at: captureAt,\n ...(context.inputStreamType\n ? { input_stream_type: context.inputStreamType }\n : {}),\n };\n}\n\nfunction publishTracking(\n licenseKey: string,\n channel: \"metrics\" | \"impressions\" | \"heartbeat\",\n body: Record<string, unknown>\n): void {\n ensureMQTTClient();\n publishMQTT(buildPlayerTopic(licenseKey, channel), body);\n}\n\nexport async function sendInitialTracking(\n licenseKey?: string,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n if (!canPublish(licenseKey)) return;\n\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n adLoaded: false,\n adDetect: false,\n });\n\n publishTracking(licenseKey, \"metrics\", {\n events: [metricEvent],\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\n\nexport async function sendAdDetectTracking(\n licenseKey: string | undefined,\n adDetectInfo: AdDetectInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdLoadedTracking(\n licenseKey: string | undefined,\n adLoadedInfo: AdLoadedInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdImpressionTracking(\n licenseKey: string | undefined,\n adImpressionInfo: AdImpressionInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n if (!canPublish(licenseKey)) return;\n\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n captureAt: adImpressionInfo.timestamp,\n });\n\n publishTracking(licenseKey, \"heartbeat\", metricEvent);\n publishTracking(licenseKey, \"impressions\", {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n capture_at: adImpressionInfo.timestamp,\n },\n ],\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(\n licenseKey?: string,\n context: PlayerAnalyticsContext = {},\n flags: PlayerMetricFlags = {}\n): Promise<void> {\n if (!canPublish(licenseKey)) return;\n\n try {\n const heartbeatData = await buildPlayerMetricEvent(context, flags);\n publishTracking(licenseKey, \"heartbeat\", heartbeatData);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n"]}
|
package/lib/utils/tracking.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as ClientInfo, a as AdDetectInfo, P as PlayerAnalyticsContext, b as AdImpressionInfo, c as AdLoadedInfo } from '../types-
|
|
1
|
+
import { C as ClientInfo, a as AdDetectInfo, P as PlayerAnalyticsContext, b as AdImpressionInfo, c as AdLoadedInfo } from '../types-CUKMIqHL.cjs';
|
|
2
2
|
|
|
3
3
|
declare function getClientInfo(): ClientInfo;
|
|
4
4
|
declare function getBrowserID(clientInfo: ClientInfo): Promise<string>;
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
function _type_of(obj) {
|
|
3
|
+
"@swc/helpers - typeof";
|
|
4
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
5
|
+
}
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
8
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
+
var __export = function __export(target, all) {
|
|
11
|
+
for(var name in all)__defProp(target, name, {
|
|
12
|
+
get: all[name],
|
|
13
|
+
enumerable: true
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
var __copyProps = function __copyProps(to, from, except, desc) {
|
|
17
|
+
if (from && (typeof from === "undefined" ? "undefined" : _type_of(from)) === "object" || typeof from === "function") {
|
|
18
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
19
|
+
try {
|
|
20
|
+
var _loop = function() {
|
|
21
|
+
var key = _step.value;
|
|
22
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
23
|
+
get: function get() {
|
|
24
|
+
return from[key];
|
|
25
|
+
},
|
|
26
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
for(var _iterator = __getOwnPropNames(from)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
|
|
30
|
+
} catch (err) {
|
|
31
|
+
_didIteratorError = true;
|
|
32
|
+
_iteratorError = err;
|
|
33
|
+
} finally{
|
|
34
|
+
try {
|
|
35
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
36
|
+
_iterator.return();
|
|
37
|
+
}
|
|
38
|
+
} finally{
|
|
39
|
+
if (_didIteratorError) {
|
|
40
|
+
throw _iteratorError;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return to;
|
|
46
|
+
};
|
|
47
|
+
var __toCommonJS = function __toCommonJS(mod) {
|
|
48
|
+
return __copyProps(__defProp({}, "__esModule", {
|
|
49
|
+
value: true
|
|
50
|
+
}), mod);
|
|
51
|
+
};
|
|
52
|
+
// src/utils/vastMacros.ts
|
|
53
|
+
var vastMacros_exports = {};
|
|
54
|
+
__export(vastMacros_exports, {
|
|
55
|
+
applyVastMacros: function applyVastMacros1() {
|
|
56
|
+
return applyVastMacros;
|
|
57
|
+
},
|
|
58
|
+
fetchConsentSignals: function fetchConsentSignals1() {
|
|
59
|
+
return fetchConsentSignals;
|
|
60
|
+
},
|
|
61
|
+
generateCorrelator: function generateCorrelator1() {
|
|
62
|
+
return generateCorrelator;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
module.exports = __toCommonJS(vastMacros_exports);
|
|
66
|
+
function generateCorrelator() {
|
|
67
|
+
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
68
|
+
try {
|
|
69
|
+
var _buf_, _buf_1;
|
|
70
|
+
var buf = new Uint32Array(2);
|
|
71
|
+
crypto.getRandomValues(buf);
|
|
72
|
+
var value = ((_buf_ = buf[0]) !== null && _buf_ !== void 0 ? _buf_ : 0) * 2097152 + (((_buf_1 = buf[1]) !== null && _buf_1 !== void 0 ? _buf_1 : 0) & 2097151);
|
|
73
|
+
if (value > 0) {
|
|
74
|
+
return String(value);
|
|
75
|
+
}
|
|
76
|
+
} catch (unused) {}
|
|
77
|
+
}
|
|
78
|
+
return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
|
|
79
|
+
}
|
|
80
|
+
var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
|
|
81
|
+
function applyVastMacros(baseUrl, ctx) {
|
|
82
|
+
var url;
|
|
83
|
+
try {
|
|
84
|
+
url = new URL(baseUrl);
|
|
85
|
+
} catch (unused) {
|
|
86
|
+
return replaceCorrelatorFallback(baseUrl, ctx.correlator);
|
|
87
|
+
}
|
|
88
|
+
var params = url.searchParams;
|
|
89
|
+
params.set("correlator", ctx.correlator);
|
|
90
|
+
params.set("scor", ctx.streamCorrelator);
|
|
91
|
+
if (ctx.pod != null) {
|
|
92
|
+
params.set("pod", String(ctx.pod));
|
|
93
|
+
}
|
|
94
|
+
if (ctx.adPosition != null) {
|
|
95
|
+
params.set("ppos", String(ctx.adPosition));
|
|
96
|
+
}
|
|
97
|
+
if (ctx.pageUrl) {
|
|
98
|
+
params.set("url", ctx.pageUrl);
|
|
99
|
+
params.set("description_url", ctx.pageUrl);
|
|
100
|
+
}
|
|
101
|
+
if (ctx.adWillPlayMuted != null) {
|
|
102
|
+
params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
|
|
103
|
+
}
|
|
104
|
+
if (ctx.adWillAutoPlay != null) {
|
|
105
|
+
params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
|
|
106
|
+
}
|
|
107
|
+
if (ctx.deviceId && ctx.deviceIdType) {
|
|
108
|
+
params.set("rdid", ctx.deviceId);
|
|
109
|
+
params.set("idtype", ctx.deviceIdType);
|
|
110
|
+
params.set("is_lat", ctx.limitAdTracking ? "1" : "0");
|
|
111
|
+
} else {
|
|
112
|
+
params.delete("rdid");
|
|
113
|
+
params.delete("idtype");
|
|
114
|
+
params.delete("is_lat");
|
|
115
|
+
}
|
|
116
|
+
var consent = ctx.consent;
|
|
117
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
|
|
118
|
+
params.set("gdpr", consent.gdpr);
|
|
119
|
+
}
|
|
120
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
|
|
121
|
+
params.set("gdpr_consent", consent.gdprConsent);
|
|
122
|
+
}
|
|
123
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
|
|
124
|
+
params.set("us_privacy", consent.usPrivacy);
|
|
125
|
+
}
|
|
126
|
+
if (ctx.adTest) {
|
|
127
|
+
params.set("adtest", "on");
|
|
128
|
+
}
|
|
129
|
+
var staleKeys = [];
|
|
130
|
+
params.forEach(function(value, key) {
|
|
131
|
+
if (UNEXPANDED_MACRO_PATTERN.test(value)) {
|
|
132
|
+
staleKeys.push(key);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
136
|
+
try {
|
|
137
|
+
for(var _iterator = staleKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
138
|
+
var key = _step.value;
|
|
139
|
+
params.delete(key);
|
|
140
|
+
}
|
|
141
|
+
} catch (err) {
|
|
142
|
+
_didIteratorError = true;
|
|
143
|
+
_iteratorError = err;
|
|
144
|
+
} finally{
|
|
145
|
+
try {
|
|
146
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
147
|
+
_iterator.return();
|
|
148
|
+
}
|
|
149
|
+
} finally{
|
|
150
|
+
if (_didIteratorError) {
|
|
151
|
+
throw _iteratorError;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return url.toString();
|
|
156
|
+
}
|
|
157
|
+
function replaceCorrelatorFallback(baseUrl, correlator) {
|
|
158
|
+
var correlatorRegex = /([?&])correlator=([^&]*)/;
|
|
159
|
+
if (correlatorRegex.test(baseUrl)) {
|
|
160
|
+
return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
|
|
161
|
+
}
|
|
162
|
+
var sep = baseUrl.includes("?") ? "&" : "?";
|
|
163
|
+
return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
|
|
164
|
+
}
|
|
165
|
+
function fetchConsentSignals() {
|
|
166
|
+
var timeoutMs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1500;
|
|
167
|
+
var signals = {};
|
|
168
|
+
if (typeof window === "undefined") {
|
|
169
|
+
return Promise.resolve(signals);
|
|
170
|
+
}
|
|
171
|
+
var tasks = [];
|
|
172
|
+
var tcfApi = window.__tcfapi;
|
|
173
|
+
if (typeof tcfApi === "function") {
|
|
174
|
+
tasks.push(new Promise(function(resolve) {
|
|
175
|
+
var settled = false;
|
|
176
|
+
try {
|
|
177
|
+
tcfApi("addEventListener", 2, function(tcData, success) {
|
|
178
|
+
if (settled) return;
|
|
179
|
+
if (success && tcData && (tcData.eventStatus === "tcloaded" || tcData.eventStatus === "useractioncomplete")) {
|
|
180
|
+
settled = true;
|
|
181
|
+
signals.gdpr = tcData.gdprApplies ? "1" : "0";
|
|
182
|
+
if (typeof tcData.tcString === "string" && tcData.tcString) {
|
|
183
|
+
signals.gdprConsent = tcData.tcString;
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
tcfApi("removeEventListener", 2, function() {}, tcData.listenerId);
|
|
187
|
+
} catch (unused) {}
|
|
188
|
+
resolve();
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
} catch (unused) {
|
|
192
|
+
resolve();
|
|
193
|
+
}
|
|
194
|
+
setTimeout(function() {
|
|
195
|
+
if (!settled) {
|
|
196
|
+
settled = true;
|
|
197
|
+
resolve();
|
|
198
|
+
}
|
|
199
|
+
}, timeoutMs);
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
var uspApi = window.__uspapi;
|
|
203
|
+
if (typeof uspApi === "function") {
|
|
204
|
+
tasks.push(new Promise(function(resolve) {
|
|
205
|
+
try {
|
|
206
|
+
uspApi("getUSPData", 1, function(data, success) {
|
|
207
|
+
if (success && typeof (data === null || data === void 0 ? void 0 : data.uspString) === "string" && data.uspString) {
|
|
208
|
+
signals.usPrivacy = data.uspString;
|
|
209
|
+
}
|
|
210
|
+
resolve();
|
|
211
|
+
});
|
|
212
|
+
} catch (unused) {
|
|
213
|
+
resolve();
|
|
214
|
+
}
|
|
215
|
+
setTimeout(resolve, timeoutMs);
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
if (tasks.length === 0) {
|
|
219
|
+
return Promise.resolve(signals);
|
|
220
|
+
}
|
|
221
|
+
return Promise.all(tasks).then(function() {
|
|
222
|
+
return signals;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
226
|
+
0 && (module.exports = {
|
|
227
|
+
applyVastMacros: applyVastMacros,
|
|
228
|
+
fetchConsentSignals: fetchConsentSignals,
|
|
229
|
+
generateCorrelator: generateCorrelator
|
|
230
|
+
});
|
|
231
|
+
//# sourceMappingURL=vastMacros.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/vastMacros.cjs","../../src/utils/vastMacros.ts"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","__getOwnPropNames","getOwnPropertyDescriptor","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","vastMacros_exports","applyVastMacros","fetchConsentSignals","generateCorrelator","module","exports","crypto","getRandomValues","buf","Uint32Array","String","Math","floor","random","Number","MAX_SAFE_INTEGER","UNEXPANDED_MACRO_PATTERN","baseUrl","ctx","url","URL","replaceCorrelatorFallback","correlator","params","searchParams","set","streamCorrelator","pod","adPosition","pageUrl","adWillPlayMuted","adWillAutoPlay","deviceId","deviceIdType","limitAdTracking","delete","consent","gdpr","gdprConsent","usPrivacy","adTest","staleKeys","forEach","test","push","toString","correlatorRegex","replace","sep","includes","signals","window","Promise","resolve","tasks","tcfApi","__tcfapi","settled","tcData","success"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/utils/vastMacros.ts\nvar vastMacros_exports = {};\n__export(vastMacros_exports, {\n applyVastMacros: () => applyVastMacros,\n fetchConsentSignals: () => fetchConsentSignals,\n generateCorrelator: () => generateCorrelator\n});\nmodule.exports = __toCommonJS(vastMacros_exports);\nfunction generateCorrelator() {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 2097152 + ((buf[1] ?? 0) & 2097151);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\nvar UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nfunction applyVastMacros(baseUrl, ctx) {\n let url;\n try {\n url = new URL(baseUrl);\n } catch {\n return replaceCorrelatorFallback(baseUrl, ctx.correlator);\n }\n const params = url.searchParams;\n params.set(\"correlator\", ctx.correlator);\n params.set(\"scor\", ctx.streamCorrelator);\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n if (ctx.adPosition != null) {\n params.set(\"ppos\", String(ctx.adPosition));\n }\n if (ctx.pageUrl) {\n params.set(\"url\", ctx.pageUrl);\n params.set(\"description_url\", ctx.pageUrl);\n }\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n if (ctx.deviceId && ctx.deviceIdType) {\n params.set(\"rdid\", ctx.deviceId);\n params.set(\"idtype\", ctx.deviceIdType);\n params.set(\"is_lat\", ctx.limitAdTracking ? \"1\" : \"0\");\n } else {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n }\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n const staleKeys = [];\n params.forEach((value, key) => {\n if (UNEXPANDED_MACRO_PATTERN.test(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n return url.toString();\n}\nfunction replaceCorrelatorFallback(baseUrl, correlator) {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\nfunction fetchConsentSignals(timeoutMs = 1500) {\n const signals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n const tasks = [];\n const tcfApi = window.__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData, success) => {\n if (settled) return;\n if (success && tcData && (tcData.eventStatus === \"tcloaded\" || tcData.eventStatus === \"useractioncomplete\")) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {\n }, tcData.listenerId);\n } catch {\n }\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n const uspApi = window.__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data, success) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n return Promise.all(tasks).then(() => signals);\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n applyVastMacros,\n fetchConsentSignals,\n generateCorrelator\n});\n","export interface VastConsentSignals {\n gdpr?: string | undefined;\n gdprConsent?: string | undefined;\n usPrivacy?: string | undefined;\n}\n\nexport interface VastMacroContext {\n correlator: string;\n streamCorrelator: string;\n pod?: number | undefined;\n adPosition?: number | undefined;\n pageUrl?: string | undefined;\n adWillPlayMuted?: boolean | undefined;\n adWillAutoPlay?: boolean | undefined;\n deviceId?: string | undefined;\n deviceIdType?: string | undefined;\n limitAdTracking?: boolean | undefined;\n adTest?: boolean | undefined;\n consent?: VastConsentSignals | undefined;\n}\n\nexport function generateCorrelator(): string {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 0x200000 + ((buf[1] ?? 0) & 0x1fffff);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\n\nconst UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\n\nexport function applyVastMacros(\n baseUrl: string,\n ctx: VastMacroContext\n): string {\n let url: URL;\n try {\n url = new URL(baseUrl);\n } catch {\n return replaceCorrelatorFallback(baseUrl, ctx.correlator);\n }\n\n const params = url.searchParams;\n\n params.set(\"correlator\", ctx.correlator);\n params.set(\"scor\", ctx.streamCorrelator);\n\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n if (ctx.adPosition != null) {\n params.set(\"ppos\", String(ctx.adPosition));\n }\n\n if (ctx.pageUrl) {\n params.set(\"url\", ctx.pageUrl);\n params.set(\"description_url\", ctx.pageUrl);\n }\n\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n\n if (ctx.deviceId && ctx.deviceIdType) {\n params.set(\"rdid\", ctx.deviceId);\n params.set(\"idtype\", ctx.deviceIdType);\n params.set(\"is_lat\", ctx.limitAdTracking ? \"1\" : \"0\");\n } else {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n }\n\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n\n const staleKeys: string[] = [];\n params.forEach((value, key) => {\n if (UNEXPANDED_MACRO_PATTERN.test(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n\n return url.toString();\n}\n\nfunction replaceCorrelatorFallback(baseUrl: string, correlator: string): string {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\n\nexport function fetchConsentSignals(\n timeoutMs: number = 1500\n): Promise<VastConsentSignals> {\n const signals: VastConsentSignals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n\n const tasks: Promise<void>[] = [];\n\n const tcfApi = (window as any).__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise<void>((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData: any, success: boolean) => {\n if (settled) return;\n if (\n success &&\n tcData &&\n (tcData.eventStatus === \"tcloaded\" ||\n tcData.eventStatus === \"useractioncomplete\")\n ) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {}, tcData.listenerId);\n } catch {}\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n\n const uspApi = (window as any).__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise<void>((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data: any, success: boolean) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n\n return Promise.all(tasks).then(() => signals);\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
interface VastConsentSignals {
|
|
2
|
+
gdpr?: string | undefined;
|
|
3
|
+
gdprConsent?: string | undefined;
|
|
4
|
+
usPrivacy?: string | undefined;
|
|
5
|
+
}
|
|
6
|
+
interface VastMacroContext {
|
|
7
|
+
correlator: string;
|
|
8
|
+
streamCorrelator: string;
|
|
9
|
+
pod?: number | undefined;
|
|
10
|
+
adPosition?: number | undefined;
|
|
11
|
+
pageUrl?: string | undefined;
|
|
12
|
+
adWillPlayMuted?: boolean | undefined;
|
|
13
|
+
adWillAutoPlay?: boolean | undefined;
|
|
14
|
+
deviceId?: string | undefined;
|
|
15
|
+
deviceIdType?: string | undefined;
|
|
16
|
+
limitAdTracking?: boolean | undefined;
|
|
17
|
+
adTest?: boolean | undefined;
|
|
18
|
+
consent?: VastConsentSignals | undefined;
|
|
19
|
+
}
|
|
20
|
+
declare function generateCorrelator(): string;
|
|
21
|
+
declare function applyVastMacros(baseUrl: string, ctx: VastMacroContext): string;
|
|
22
|
+
declare function fetchConsentSignals(timeoutMs?: number): Promise<VastConsentSignals>;
|
|
23
|
+
|
|
24
|
+
export { type VastConsentSignals, type VastMacroContext, applyVastMacros, fetchConsentSignals, generateCorrelator };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stormcloud-video-player",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"typings": "lib/index.d.ts",
|
|
6
6
|
"scripts": {
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"license": "MIT",
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"hls.js": "^1.6.11",
|
|
44
|
+
"mqtt": "^5.15.1",
|
|
44
45
|
"react-icons": "^5.5.0"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
@@ -80,6 +81,7 @@
|
|
|
80
81
|
"files": [
|
|
81
82
|
"lib/**/*",
|
|
82
83
|
"dist/**/*",
|
|
84
|
+
"src/certs/**/*",
|
|
83
85
|
"*.js",
|
|
84
86
|
"*.d.ts",
|
|
85
87
|
"README.md",
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
|
|
3
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
|
4
|
+
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
|
|
5
|
+
MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
|
|
6
|
+
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
|
7
|
+
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
|
|
8
|
+
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
|
|
9
|
+
2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
|
|
10
|
+
1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
|
|
11
|
+
q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
|
|
12
|
+
tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
|
|
13
|
+
vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
|
|
14
|
+
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
|
|
15
|
+
5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
|
|
16
|
+
1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
|
|
17
|
+
NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
|
|
18
|
+
Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
|
|
19
|
+
8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
|
|
20
|
+
pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
|
|
21
|
+
MrY=
|
|
22
|
+
-----END CERTIFICATE-----
|