stormcloud-video-player 0.3.53 → 0.3.55
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 +1 -1
- package/lib/index.cjs +1315 -1140
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +391 -221
- package/lib/index.d.ts +391 -221
- package/lib/index.js +1264 -1101
- package/lib/index.js.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +547 -148
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +13 -1
- package/lib/players/FilePlayer.cjs +99 -116
- package/lib/players/FilePlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.cjs +599 -200
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +678 -279
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs +17 -9
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/sdk/ima.cjs +43 -48
- package/lib/sdk/ima.cjs.map +1 -1
- package/lib/sdk/ima.d.cts +1 -1
- package/lib/{types-DYelrVG6.d.cts → types-C23mJ_hh.d.cts} +15 -1
- package/lib/ui/StormcloudVideoPlayer.cjs +1124 -961
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/browserCompat.cjs +11 -11
- package/lib/utils/browserCompat.cjs.map +1 -1
- package/lib/utils/polyfills.cjs +13 -13
- package/lib/utils/polyfills.cjs.map +1 -1
- package/lib/utils/tracking.cjs +283 -14
- package/lib/utils/tracking.cjs.map +1 -1
- package/lib/utils/tracking.d.cts +12 -2
- package/package.json +1 -1
package/lib/utils/tracking.cjs
CHANGED
|
@@ -56,6 +56,30 @@ function _object_spread(target) {
|
|
|
56
56
|
}
|
|
57
57
|
return target;
|
|
58
58
|
}
|
|
59
|
+
function ownKeys(object, enumerableOnly) {
|
|
60
|
+
var keys = Object.keys(object);
|
|
61
|
+
if (Object.getOwnPropertySymbols) {
|
|
62
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
63
|
+
if (enumerableOnly) {
|
|
64
|
+
symbols = symbols.filter(function(sym) {
|
|
65
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
keys.push.apply(keys, symbols);
|
|
69
|
+
}
|
|
70
|
+
return keys;
|
|
71
|
+
}
|
|
72
|
+
function _object_spread_props(target, source) {
|
|
73
|
+
source = source != null ? source : {};
|
|
74
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
75
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
76
|
+
} else {
|
|
77
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
78
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return target;
|
|
82
|
+
}
|
|
59
83
|
function _type_of(obj) {
|
|
60
84
|
"@swc/helpers - typeof";
|
|
61
85
|
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
@@ -69,9 +93,17 @@ function _ts_generator(thisArg, body) {
|
|
|
69
93
|
},
|
|
70
94
|
trys: [],
|
|
71
95
|
ops: []
|
|
72
|
-
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
73
|
-
return
|
|
74
|
-
|
|
96
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
97
|
+
return d(g, "next", {
|
|
98
|
+
value: verb(0)
|
|
99
|
+
}), d(g, "throw", {
|
|
100
|
+
value: verb(1)
|
|
101
|
+
}), d(g, "return", {
|
|
102
|
+
value: verb(2)
|
|
103
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
104
|
+
value: function() {
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
75
107
|
}), g;
|
|
76
108
|
function verb(n) {
|
|
77
109
|
return function(v) {
|
|
@@ -155,20 +187,20 @@ var __defProp = Object.defineProperty;
|
|
|
155
187
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
156
188
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
157
189
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
158
|
-
var __export = function(target, all) {
|
|
190
|
+
var __export = function __export(target, all) {
|
|
159
191
|
for(var name in all)__defProp(target, name, {
|
|
160
192
|
get: all[name],
|
|
161
193
|
enumerable: true
|
|
162
194
|
});
|
|
163
195
|
};
|
|
164
|
-
var __copyProps = function(to, from, except, desc) {
|
|
196
|
+
var __copyProps = function __copyProps(to, from, except, desc) {
|
|
165
197
|
if (from && (typeof from === "undefined" ? "undefined" : _type_of(from)) === "object" || typeof from === "function") {
|
|
166
198
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
167
199
|
try {
|
|
168
200
|
var _loop = function() {
|
|
169
201
|
var key = _step.value;
|
|
170
202
|
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
171
|
-
get: function() {
|
|
203
|
+
get: function get() {
|
|
172
204
|
return from[key];
|
|
173
205
|
},
|
|
174
206
|
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
@@ -192,7 +224,7 @@ var __copyProps = function(to, from, except, desc) {
|
|
|
192
224
|
}
|
|
193
225
|
return to;
|
|
194
226
|
};
|
|
195
|
-
var __toCommonJS = function(mod) {
|
|
227
|
+
var __toCommonJS = function __toCommonJS(mod) {
|
|
196
228
|
return __copyProps(__defProp({}, "__esModule", {
|
|
197
229
|
value: true
|
|
198
230
|
}), mod);
|
|
@@ -200,16 +232,25 @@ var __toCommonJS = function(mod) {
|
|
|
200
232
|
// src/utils/tracking.ts
|
|
201
233
|
var tracking_exports = {};
|
|
202
234
|
__export(tracking_exports, {
|
|
203
|
-
getBrowserID: function() {
|
|
235
|
+
getBrowserID: function getBrowserID1() {
|
|
204
236
|
return getBrowserID;
|
|
205
237
|
},
|
|
206
|
-
getClientInfo: function() {
|
|
238
|
+
getClientInfo: function getClientInfo1() {
|
|
207
239
|
return getClientInfo;
|
|
208
240
|
},
|
|
209
|
-
|
|
241
|
+
sendAdDetectTracking: function sendAdDetectTracking1() {
|
|
242
|
+
return sendAdDetectTracking;
|
|
243
|
+
},
|
|
244
|
+
sendAdImpressionTracking: function sendAdImpressionTracking1() {
|
|
245
|
+
return sendAdImpressionTracking;
|
|
246
|
+
},
|
|
247
|
+
sendAdLoadedTracking: function sendAdLoadedTracking1() {
|
|
248
|
+
return sendAdLoadedTracking;
|
|
249
|
+
},
|
|
250
|
+
sendHeartbeat: function sendHeartbeat1() {
|
|
210
251
|
return sendHeartbeat;
|
|
211
252
|
},
|
|
212
|
-
sendInitialTracking: function() {
|
|
253
|
+
sendInitialTracking: function sendInitialTracking1() {
|
|
213
254
|
return sendInitialTracking;
|
|
214
255
|
}
|
|
215
256
|
});
|
|
@@ -468,9 +509,6 @@ function sendInitialTracking(licenseKey) {
|
|
|
468
509
|
headers = {
|
|
469
510
|
"Content-Type": "application/json"
|
|
470
511
|
};
|
|
471
|
-
if (licenseKey) {
|
|
472
|
-
headers["Authorization"] = "Bearer ".concat(licenseKey);
|
|
473
|
-
}
|
|
474
512
|
return [
|
|
475
513
|
4,
|
|
476
514
|
fetch("https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track", {
|
|
@@ -576,10 +614,241 @@ function sendHeartbeat(licenseKey) {
|
|
|
576
614
|
});
|
|
577
615
|
})();
|
|
578
616
|
}
|
|
617
|
+
var TRACK_API_URL = "https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track";
|
|
618
|
+
function mapToAdTrackingSource(source, adPlayerType) {
|
|
619
|
+
if (source === "prebid" || source === "ima" || source === "hls") {
|
|
620
|
+
return source;
|
|
621
|
+
}
|
|
622
|
+
if (source === "preload" || source === "ssp") {
|
|
623
|
+
return source === "ssp" ? "prebid" : "ima";
|
|
624
|
+
}
|
|
625
|
+
return adPlayerType === "hls" ? "hls" : "ima";
|
|
626
|
+
}
|
|
627
|
+
function postAdTracking(licenseKey, body) {
|
|
628
|
+
return _async_to_generator(function() {
|
|
629
|
+
var headers, response;
|
|
630
|
+
return _ts_generator(this, function(_state) {
|
|
631
|
+
switch(_state.label){
|
|
632
|
+
case 0:
|
|
633
|
+
headers = {
|
|
634
|
+
"Content-Type": "application/json"
|
|
635
|
+
};
|
|
636
|
+
if (licenseKey) {
|
|
637
|
+
headers["Authorization"] = "Bearer ".concat(licenseKey);
|
|
638
|
+
}
|
|
639
|
+
return [
|
|
640
|
+
4,
|
|
641
|
+
fetch(TRACK_API_URL, {
|
|
642
|
+
method: "POST",
|
|
643
|
+
headers: headers,
|
|
644
|
+
body: JSON.stringify(body)
|
|
645
|
+
})
|
|
646
|
+
];
|
|
647
|
+
case 1:
|
|
648
|
+
response = _state.sent();
|
|
649
|
+
if (!response.ok) {
|
|
650
|
+
throw new Error("HTTP error! status: ".concat(response.status));
|
|
651
|
+
}
|
|
652
|
+
return [
|
|
653
|
+
4,
|
|
654
|
+
response.json()
|
|
655
|
+
];
|
|
656
|
+
case 2:
|
|
657
|
+
_state.sent();
|
|
658
|
+
return [
|
|
659
|
+
2
|
|
660
|
+
];
|
|
661
|
+
}
|
|
662
|
+
});
|
|
663
|
+
})();
|
|
664
|
+
}
|
|
665
|
+
function sendAdDetectTracking(licenseKey, payload) {
|
|
666
|
+
return _async_to_generator(function() {
|
|
667
|
+
var _payload_source, _payload_timestamp, clientInfo, browserId, adDetectInfo, body, error;
|
|
668
|
+
return _ts_generator(this, function(_state) {
|
|
669
|
+
switch(_state.label){
|
|
670
|
+
case 0:
|
|
671
|
+
_state.trys.push([
|
|
672
|
+
0,
|
|
673
|
+
3,
|
|
674
|
+
,
|
|
675
|
+
4
|
|
676
|
+
]);
|
|
677
|
+
clientInfo = getClientInfo();
|
|
678
|
+
return [
|
|
679
|
+
4,
|
|
680
|
+
getBrowserID(clientInfo)
|
|
681
|
+
];
|
|
682
|
+
case 1:
|
|
683
|
+
browserId = _state.sent();
|
|
684
|
+
adDetectInfo = _object_spread({
|
|
685
|
+
source: (_payload_source = payload.source) !== null && _payload_source !== void 0 ? _payload_source : "scte35",
|
|
686
|
+
timestamp: (_payload_timestamp = payload.timestamp) !== null && _payload_timestamp !== void 0 ? _payload_timestamp : /* @__PURE__ */ new Date().toISOString()
|
|
687
|
+
}, payload.durationSeconds != null && {
|
|
688
|
+
durationSeconds: payload.durationSeconds
|
|
689
|
+
}, payload.ptsSeconds != null && {
|
|
690
|
+
ptsSeconds: payload.ptsSeconds
|
|
691
|
+
}, payload.detectedAtFragmentSn != null && {
|
|
692
|
+
detectedAtFragmentSn: payload.detectedAtFragmentSn
|
|
693
|
+
});
|
|
694
|
+
body = _object_spread_props(_object_spread({
|
|
695
|
+
browserId: browserId
|
|
696
|
+
}, clientInfo, licenseKey && {
|
|
697
|
+
licenseKey: licenseKey
|
|
698
|
+
}), {
|
|
699
|
+
adDetectInfo: adDetectInfo
|
|
700
|
+
});
|
|
701
|
+
return [
|
|
702
|
+
4,
|
|
703
|
+
postAdTracking(licenseKey, body)
|
|
704
|
+
];
|
|
705
|
+
case 2:
|
|
706
|
+
_state.sent();
|
|
707
|
+
return [
|
|
708
|
+
3,
|
|
709
|
+
4
|
|
710
|
+
];
|
|
711
|
+
case 3:
|
|
712
|
+
error = _state.sent();
|
|
713
|
+
console.error("[StormcloudVideoPlayer] Error sending ad-detect tracking:", error);
|
|
714
|
+
return [
|
|
715
|
+
3,
|
|
716
|
+
4
|
|
717
|
+
];
|
|
718
|
+
case 4:
|
|
719
|
+
return [
|
|
720
|
+
2
|
|
721
|
+
];
|
|
722
|
+
}
|
|
723
|
+
});
|
|
724
|
+
})();
|
|
725
|
+
}
|
|
726
|
+
function sendAdLoadedTracking(licenseKey, payload, adPlayerType) {
|
|
727
|
+
return _async_to_generator(function() {
|
|
728
|
+
var clientInfo, browserId, source, adLoadedInfo, body, error;
|
|
729
|
+
return _ts_generator(this, function(_state) {
|
|
730
|
+
switch(_state.label){
|
|
731
|
+
case 0:
|
|
732
|
+
_state.trys.push([
|
|
733
|
+
0,
|
|
734
|
+
3,
|
|
735
|
+
,
|
|
736
|
+
4
|
|
737
|
+
]);
|
|
738
|
+
clientInfo = getClientInfo();
|
|
739
|
+
return [
|
|
740
|
+
4,
|
|
741
|
+
getBrowserID(clientInfo)
|
|
742
|
+
];
|
|
743
|
+
case 1:
|
|
744
|
+
browserId = _state.sent();
|
|
745
|
+
source = mapToAdTrackingSource(payload.source, adPlayerType);
|
|
746
|
+
adLoadedInfo = _object_spread({
|
|
747
|
+
source: source,
|
|
748
|
+
timestamp: /* @__PURE__ */ new Date().toISOString()
|
|
749
|
+
}, payload.vastUrl != null && {
|
|
750
|
+
vastUrl: payload.vastUrl
|
|
751
|
+
}, payload.durationSeconds != null && {
|
|
752
|
+
durationSeconds: payload.durationSeconds
|
|
753
|
+
});
|
|
754
|
+
body = _object_spread_props(_object_spread({
|
|
755
|
+
browserId: browserId
|
|
756
|
+
}, clientInfo, licenseKey && {
|
|
757
|
+
licenseKey: licenseKey
|
|
758
|
+
}), {
|
|
759
|
+
adLoadedInfo: adLoadedInfo
|
|
760
|
+
});
|
|
761
|
+
return [
|
|
762
|
+
4,
|
|
763
|
+
postAdTracking(licenseKey, body)
|
|
764
|
+
];
|
|
765
|
+
case 2:
|
|
766
|
+
_state.sent();
|
|
767
|
+
return [
|
|
768
|
+
3,
|
|
769
|
+
4
|
|
770
|
+
];
|
|
771
|
+
case 3:
|
|
772
|
+
error = _state.sent();
|
|
773
|
+
console.error("[StormcloudVideoPlayer] Error sending ad-loaded tracking:", error);
|
|
774
|
+
return [
|
|
775
|
+
3,
|
|
776
|
+
4
|
|
777
|
+
];
|
|
778
|
+
case 4:
|
|
779
|
+
return [
|
|
780
|
+
2
|
|
781
|
+
];
|
|
782
|
+
}
|
|
783
|
+
});
|
|
784
|
+
})();
|
|
785
|
+
}
|
|
786
|
+
function sendAdImpressionTracking(licenseKey, payload, adPlayerType) {
|
|
787
|
+
return _async_to_generator(function() {
|
|
788
|
+
var clientInfo, browserId, source, adImpressionInfo, body, error;
|
|
789
|
+
return _ts_generator(this, function(_state) {
|
|
790
|
+
switch(_state.label){
|
|
791
|
+
case 0:
|
|
792
|
+
_state.trys.push([
|
|
793
|
+
0,
|
|
794
|
+
3,
|
|
795
|
+
,
|
|
796
|
+
4
|
|
797
|
+
]);
|
|
798
|
+
clientInfo = getClientInfo();
|
|
799
|
+
return [
|
|
800
|
+
4,
|
|
801
|
+
getBrowserID(clientInfo)
|
|
802
|
+
];
|
|
803
|
+
case 1:
|
|
804
|
+
browserId = _state.sent();
|
|
805
|
+
source = mapToAdTrackingSource(payload.source, adPlayerType);
|
|
806
|
+
adImpressionInfo = _object_spread({
|
|
807
|
+
source: source,
|
|
808
|
+
adIndex: payload.adIndex,
|
|
809
|
+
timestamp: /* @__PURE__ */ new Date().toISOString()
|
|
810
|
+
}, payload.durationSeconds != null && {
|
|
811
|
+
durationSeconds: payload.durationSeconds
|
|
812
|
+
});
|
|
813
|
+
body = _object_spread_props(_object_spread({
|
|
814
|
+
browserId: browserId
|
|
815
|
+
}, clientInfo, licenseKey && {
|
|
816
|
+
licenseKey: licenseKey
|
|
817
|
+
}), {
|
|
818
|
+
adImpressionInfo: adImpressionInfo
|
|
819
|
+
});
|
|
820
|
+
return [
|
|
821
|
+
4,
|
|
822
|
+
postAdTracking(licenseKey, body)
|
|
823
|
+
];
|
|
824
|
+
case 2:
|
|
825
|
+
_state.sent();
|
|
826
|
+
return [
|
|
827
|
+
3,
|
|
828
|
+
4
|
|
829
|
+
];
|
|
830
|
+
case 3:
|
|
831
|
+
error = _state.sent();
|
|
832
|
+
console.error("[StormcloudVideoPlayer] Error sending ad-impression tracking:", error);
|
|
833
|
+
return [
|
|
834
|
+
3,
|
|
835
|
+
4
|
|
836
|
+
];
|
|
837
|
+
case 4:
|
|
838
|
+
return [
|
|
839
|
+
2
|
|
840
|
+
];
|
|
841
|
+
}
|
|
842
|
+
});
|
|
843
|
+
})();
|
|
844
|
+
}
|
|
579
845
|
// Annotate the CommonJS export names for ESM import in node:
|
|
580
846
|
0 && (module.exports = {
|
|
581
847
|
getBrowserID: getBrowserID,
|
|
582
848
|
getClientInfo: getClientInfo,
|
|
849
|
+
sendAdDetectTracking: sendAdDetectTracking,
|
|
850
|
+
sendAdImpressionTracking: sendAdImpressionTracking,
|
|
851
|
+
sendAdLoadedTracking: sendAdLoadedTracking,
|
|
583
852
|
sendHeartbeat: sendHeartbeat,
|
|
584
853
|
sendInitialTracking: sendInitialTracking
|
|
585
854
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/utils/tracking.cjs","../../src/utils/tracking.ts"],"names":["__copyProps","__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","to","from","except","desc","key","call","__toCommonJS","tracking_exports","getBrowserID","sendHeartbeat","mod","value","getClientInfo","sendInitialTracking","exports","cachedBrowserId","platform","width","screen","isAndroid","window","navigator","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","height","availWidth","availHeight","orientation","type","pixelDepth","brand","os","model","isSmartTV","isWebView","isWebApp","ua","includes","deviceType","webosMatch","tizenMatch","match","tvMatch","trim"],"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/tracking.ts\nvar tracking_exports = {};\n__export(tracking_exports, {\n getBrowserID: () => getBrowserID,\n getClientInfo: () => getClientInfo,\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}\nasync function sendInitialTracking(licenseKey) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData = {\n browserId,\n ...clientInfo\n };\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(trackingData)\n }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const heartbeatData = {\n browserId,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n };\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(heartbeatData)\n }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\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 sendHeartbeat,\n sendInitialTracking\n});\n","import type { ClientInfo, TrackingData, HeartbeatData } 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\nexport async function sendInitialTracking(licenseKey?: string): 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 const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(trackingData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(licenseKey?: string): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const heartbeatData: HeartbeatData = {\n browserId,\n timestamp: new Date().toISOString(),\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(heartbeatData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\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/tracking.ts"],"names":["__defProp","Object","__getOwnPropDesc","__getOwnPropNames","enumerable","defineProperty","getOwnPropertyDescriptor","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","__copyProps","to","from","except","desc","key","__toCommonJS","getClientInfo","mod","value","tracking_exports","getBrowserID","sendAdDetectTracking","sendAdImpressionTracking","sendHeartbeat","sendInitialTracking","screen","orientation","type","sendAdLoadedTracking","module","exports","cachedBrowserId","ua","navigator","userAgent","window","platform","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","width","height","availWidth","availHeight","pixelDepth","deviceType","brand","os","model","isSmartTV","isAndroid","isWebView","isWebApp","includes","webosMatch","match","tizenMatch","tvMatch","trim","test","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","substring"],"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/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}\nasync function sendInitialTracking(licenseKey) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData = {\n browserId,\n ...clientInfo\n };\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(trackingData)\n }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const heartbeatData = {\n browserId,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n };\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(heartbeatData)\n }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\nvar TRACK_API_URL = \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\";\nfunction mapToAdTrackingSource(source, adPlayerType) {\n if (source === \"prebid\" || source === \"ima\" || source === \"hls\") {\n return source;\n }\n if (source === \"preload\" || source === \"ssp\") {\n return source === \"ssp\" ? \"prebid\" : \"ima\";\n }\n return adPlayerType === \"hls\" ? \"hls\" : \"ima\";\n}\nasync function postAdTracking(licenseKey, body) {\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(TRACK_API_URL, {\n method: \"POST\",\n headers,\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 sendAdDetectTracking(licenseKey, payload) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const adDetectInfo = {\n source: payload.source ?? \"scte35\",\n timestamp: payload.timestamp ?? (/* @__PURE__ */ new Date()).toISOString(),\n ...payload.durationSeconds != null && { durationSeconds: payload.durationSeconds },\n ...payload.ptsSeconds != null && { ptsSeconds: payload.ptsSeconds },\n ...payload.detectedAtFragmentSn != null && { detectedAtFragmentSn: payload.detectedAtFragmentSn }\n };\n const body = {\n browserId,\n ...clientInfo,\n ...licenseKey && { licenseKey },\n adDetectInfo\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-detect tracking:\", error);\n }\n}\nasync function sendAdLoadedTracking(licenseKey, payload, adPlayerType) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const source = mapToAdTrackingSource(payload.source, adPlayerType);\n const adLoadedInfo = {\n source,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n ...payload.vastUrl != null && { vastUrl: payload.vastUrl },\n ...payload.durationSeconds != null && { durationSeconds: payload.durationSeconds }\n };\n const body = {\n browserId,\n ...clientInfo,\n ...licenseKey && { licenseKey },\n adLoadedInfo\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-loaded tracking:\", error);\n }\n}\nasync function sendAdImpressionTracking(licenseKey, payload, adPlayerType) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const source = mapToAdTrackingSource(payload.source, adPlayerType);\n const adImpressionInfo = {\n source,\n adIndex: payload.adIndex,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n ...payload.durationSeconds != null && { durationSeconds: payload.durationSeconds }\n };\n const body = {\n browserId,\n ...clientInfo,\n ...licenseKey && { licenseKey },\n adImpressionInfo\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-impression tracking:\", 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 HeartbeatData,\n AdDetectInfo,\n AdLoadedInfo,\n AdImpressionInfo,\n AdTrackingSource,\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\nexport async function sendInitialTracking(licenseKey?: string): 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 const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(trackingData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(licenseKey?: string): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const heartbeatData: HeartbeatData = {\n browserId,\n timestamp: new Date().toISOString(),\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(heartbeatData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n\nconst TRACK_API_URL =\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\";\n\nfunction mapToAdTrackingSource(\n source: string | undefined,\n adPlayerType?: \"ima\" | \"hls\"\n): AdTrackingSource {\n if (source === \"prebid\" || source === \"ima\" || source === \"hls\") {\n return source;\n }\n if (source === \"preload\" || source === \"ssp\") {\n return source === \"ssp\" ? \"prebid\" : \"ima\";\n }\n return adPlayerType === \"hls\" ? \"hls\" : \"ima\";\n}\n\nasync function postAdTracking(\n licenseKey: string | undefined,\n body: Record<string, unknown>\n): Promise<void> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(TRACK_API_URL, {\n method: \"POST\",\n headers,\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\nexport async function sendAdDetectTracking(\n licenseKey: string | undefined,\n payload: Omit<AdDetectInfo, \"source\" | \"timestamp\"> & Partial<Pick<AdDetectInfo, \"source\" | \"timestamp\">>\n): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const adDetectInfo: AdDetectInfo = {\n source: payload.source ?? \"scte35\",\n timestamp: payload.timestamp ?? new Date().toISOString(),\n ...(payload.durationSeconds != null && { durationSeconds: payload.durationSeconds }),\n ...(payload.ptsSeconds != null && { ptsSeconds: payload.ptsSeconds }),\n ...(payload.detectedAtFragmentSn != null && { detectedAtFragmentSn: payload.detectedAtFragmentSn }),\n };\n const body = {\n browserId,\n ...clientInfo,\n ...(licenseKey && { licenseKey }),\n adDetectInfo,\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-detect tracking:\", error);\n }\n}\n\nexport async function sendAdLoadedTracking(\n licenseKey: string | undefined,\n payload: Omit<AdLoadedInfo, \"timestamp\" | \"source\"> & { source?: AdTrackingSource | string },\n adPlayerType?: \"ima\" | \"hls\"\n): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const source = mapToAdTrackingSource(payload.source, adPlayerType);\n const adLoadedInfo: AdLoadedInfo = {\n source,\n timestamp: new Date().toISOString(),\n ...(payload.vastUrl != null && { vastUrl: payload.vastUrl }),\n ...(payload.durationSeconds != null && { durationSeconds: payload.durationSeconds }),\n };\n const body = {\n browserId,\n ...clientInfo,\n ...(licenseKey && { licenseKey }),\n adLoadedInfo,\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-loaded tracking:\", error);\n }\n}\n\nexport type AdImpressionTrackingPayload = {\n adIndex: number;\n source?: AdTrackingSource | string;\n durationSeconds?: number;\n};\n\nexport async function sendAdImpressionTracking(\n licenseKey: string | undefined,\n payload: AdImpressionTrackingPayload,\n adPlayerType?: \"ima\" | \"hls\"\n): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const source = mapToAdTrackingSource(payload.source, adPlayerType);\n const adImpressionInfo: AdImpressionInfo = {\n source,\n adIndex: payload.adIndex,\n timestamp: new Date().toISOString(),\n ...(payload.durationSeconds != null && { durationSeconds: payload.durationSeconds }),\n };\n const body = {\n browserId,\n ...clientInfo,\n ...(licenseKey && { licenseKey }),\n adImpressionInfo,\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-impression tracking:\", error);\n }\n}\n"]}
|
package/lib/utils/tracking.d.cts
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
import { C as ClientInfo } from '../types-
|
|
1
|
+
import { A as AdTrackingSource, C as ClientInfo, a as AdDetectInfo, b as AdLoadedInfo } from '../types-C23mJ_hh.cjs';
|
|
2
2
|
|
|
3
3
|
declare function getClientInfo(): ClientInfo;
|
|
4
4
|
declare function getBrowserID(clientInfo: ClientInfo): Promise<string>;
|
|
5
5
|
declare function sendInitialTracking(licenseKey?: string): Promise<void>;
|
|
6
6
|
declare function sendHeartbeat(licenseKey?: string): Promise<void>;
|
|
7
|
+
declare function sendAdDetectTracking(licenseKey: string | undefined, payload: Omit<AdDetectInfo, "source" | "timestamp"> & Partial<Pick<AdDetectInfo, "source" | "timestamp">>): Promise<void>;
|
|
8
|
+
declare function sendAdLoadedTracking(licenseKey: string | undefined, payload: Omit<AdLoadedInfo, "timestamp" | "source"> & {
|
|
9
|
+
source?: AdTrackingSource | string;
|
|
10
|
+
}, adPlayerType?: "ima" | "hls"): Promise<void>;
|
|
11
|
+
type AdImpressionTrackingPayload = {
|
|
12
|
+
adIndex: number;
|
|
13
|
+
source?: AdTrackingSource | string;
|
|
14
|
+
durationSeconds?: number;
|
|
15
|
+
};
|
|
16
|
+
declare function sendAdImpressionTracking(licenseKey: string | undefined, payload: AdImpressionTrackingPayload, adPlayerType?: "ima" | "hls"): Promise<void>;
|
|
7
17
|
|
|
8
|
-
export { getBrowserID, getClientInfo, sendHeartbeat, sendInitialTracking };
|
|
18
|
+
export { type AdImpressionTrackingPayload, getBrowserID, getClientInfo, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking };
|