@eyevinn/player-analytics-client-sdk-web 0.1.3 → 0.3.0
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/.github/workflows/deploy-demo.yml +29 -0
- package/.github/workflows/publish-gh-package.yml +1 -1
- package/.github/workflows/publish-npmjs.yml +1 -1
- package/Readme.md +32 -1
- package/dist/index.js +71 -93
- package/dist/index.js.map +1 -1
- package/dist/module.js +71 -93
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +3 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +15 -8
- package/pipeline.png +0 -0
- package/dist/src/PlayerAnalytics.d.ts +0 -33
- package/dist/src/PlayerAnalyticsConnector.d.ts +0 -30
- package/dist/src/utils/Reporter.d.ts +0 -23
- package/dist/src/utils/constants.d.ts +0 -19
package/dist/module.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import $hCgyA$eyevinnplayeranalyticsspecificationpackagejson from "@eyevinn/player-analytics-specification/package.json";
|
|
2
|
-
import {
|
|
2
|
+
import {getMediaEventFilter as $hCgyA$getMediaEventFilter, FilteredMediaEvent as $hCgyA$FilteredMediaEvent} from "@eyevinn/media-event-filter";
|
|
3
3
|
|
|
4
4
|
function $parcel$export(e, n, v, s) {
|
|
5
5
|
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
|
|
@@ -8,25 +8,6 @@ var $03bb5e0d0325c534$exports = {};
|
|
|
8
8
|
|
|
9
9
|
$parcel$export($03bb5e0d0325c534$exports, "PlayerAnalytics", () => $03bb5e0d0325c534$export$f76c463fe9cb9f15, (v) => $03bb5e0d0325c534$export$f76c463fe9cb9f15 = v);
|
|
10
10
|
|
|
11
|
-
var $76abaee2435acae3$export$342d7dbd8323f55e;
|
|
12
|
-
(function($76abaee2435acae3$export$342d7dbd8323f55e) {
|
|
13
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["loading"] = "loading";
|
|
14
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["loaded"] = "loaded";
|
|
15
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["play"] = "playing";
|
|
16
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["resume"] = "playing";
|
|
17
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["pause"] = "paused";
|
|
18
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["seeking"] = "seeking";
|
|
19
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["seeked"] = "seeked";
|
|
20
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["buffering"] = "buffering";
|
|
21
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["buffered"] = "buffered";
|
|
22
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["ended"] = "stopped";
|
|
23
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["error"] = "error";
|
|
24
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["warning"] = "warning";
|
|
25
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["bitratechanged"] = "bitrate_changed";
|
|
26
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["heartbeat"] = "heartbeat";
|
|
27
|
-
$76abaee2435acae3$export$342d7dbd8323f55e["metadata"] = "metadata";
|
|
28
|
-
})($76abaee2435acae3$export$342d7dbd8323f55e || ($76abaee2435acae3$export$342d7dbd8323f55e = {
|
|
29
|
-
}));
|
|
30
11
|
var $76abaee2435acae3$export$31c453b5fe09788d = 30000;
|
|
31
12
|
var $76abaee2435acae3$export$8a65ed80196068d4 = $hCgyA$eyevinnplayeranalyticsspecificationpackagejson.version;
|
|
32
13
|
|
|
@@ -171,6 +152,7 @@ var $1d47cc84225ea891$export$957313a2f485e5ed = function() {
|
|
|
171
152
|
function $1d47cc84225ea891$export$957313a2f485e5ed(options) {
|
|
172
153
|
this.isInitiated = false;
|
|
173
154
|
this.debug = options.debug;
|
|
155
|
+
this.shardId = options.shardId;
|
|
174
156
|
this.eventsinkUrl = options.eventsinkUrl;
|
|
175
157
|
this.sessionId = options.sessionId;
|
|
176
158
|
this.heartbeatInterval = options.heartbeatInterval || $76abaee2435acae3$export$31c453b5fe09788d;
|
|
@@ -186,6 +168,7 @@ var $1d47cc84225ea891$export$957313a2f485e5ed = function() {
|
|
|
186
168
|
data = {
|
|
187
169
|
event: "init",
|
|
188
170
|
sessionId: this.sessionId,
|
|
171
|
+
shardId: this.shardId,
|
|
189
172
|
timestamp: Date.now(),
|
|
190
173
|
playhead: -1,
|
|
191
174
|
duration: -1
|
|
@@ -246,7 +229,8 @@ var $1d47cc84225ea891$export$957313a2f485e5ed = function() {
|
|
|
246
229
|
$1d47cc84225ea891$export$957313a2f485e5ed.prototype.send = function(data) {
|
|
247
230
|
if (!this.isInitiated) return console.warn("[AnalyticsReporter] Cannot report before initiation:", data);
|
|
248
231
|
var payload = $1d47cc84225ea891$var$__assign({
|
|
249
|
-
sessionId: this.sessionId
|
|
232
|
+
sessionId: this.sessionId,
|
|
233
|
+
shardId: this.shardId
|
|
250
234
|
}, data);
|
|
251
235
|
if (this.debug) console.log("[AnalyticsReporter] Send payload:", payload);
|
|
252
236
|
else fetch("".concat(this.eventsinkUrl), {
|
|
@@ -394,7 +378,7 @@ var $03bb5e0d0325c534$export$f76c463fe9cb9f15 = function() {
|
|
|
394
378
|
this.eventsinkUrl = eventsinkUrl;
|
|
395
379
|
}
|
|
396
380
|
$03bb5e0d0325c534$export$f76c463fe9cb9f15.prototype.initiateAnalyticsReporter = function(_a) {
|
|
397
|
-
var sessionId = _a.sessionId, _b = _a.heartbeatInterval, heartbeatInterval = _b === void 0 ? $76abaee2435acae3$export$31c453b5fe09788d : _b;
|
|
381
|
+
var sessionId = _a.sessionId, shardId = _a.shardId, _b = _a.heartbeatInterval, heartbeatInterval = _b === void 0 ? $76abaee2435acae3$export$31c453b5fe09788d : _b;
|
|
398
382
|
return $03bb5e0d0325c534$var$__awaiter(this, void 0, void 0, function() {
|
|
399
383
|
var _c, generatedSessionId, isInitiated;
|
|
400
384
|
return $03bb5e0d0325c534$var$__generator(this, function(_d) {
|
|
@@ -404,7 +388,8 @@ var $03bb5e0d0325c534$export$f76c463fe9cb9f15 = function() {
|
|
|
404
388
|
sessionId: sessionId,
|
|
405
389
|
eventsinkUrl: this.eventsinkUrl,
|
|
406
390
|
debug: this.debug,
|
|
407
|
-
heartbeatInterval: heartbeatInterval
|
|
391
|
+
heartbeatInterval: heartbeatInterval,
|
|
392
|
+
shardId: shardId
|
|
408
393
|
});
|
|
409
394
|
return [
|
|
410
395
|
4 /*yield*/ ,
|
|
@@ -442,9 +427,6 @@ var $03bb5e0d0325c534$export$f76c463fe9cb9f15 = function() {
|
|
|
442
427
|
$03bb5e0d0325c534$export$f76c463fe9cb9f15.prototype.playing = function(data) {
|
|
443
428
|
this.analyticsReporter.send(data);
|
|
444
429
|
};
|
|
445
|
-
$03bb5e0d0325c534$export$f76c463fe9cb9f15.prototype.paused = function(data) {
|
|
446
|
-
this.pause(data);
|
|
447
|
-
};
|
|
448
430
|
$03bb5e0d0325c534$export$f76c463fe9cb9f15.prototype.pause = function(data) {
|
|
449
431
|
this.analyticsReporter.send(data);
|
|
450
432
|
};
|
|
@@ -484,7 +466,6 @@ var $85819f9bdebfd936$exports = {};
|
|
|
484
466
|
$parcel$export($85819f9bdebfd936$exports, "PlayerAnalyticsConnector", () => $85819f9bdebfd936$export$2daf9923c014a26e, (v) => $85819f9bdebfd936$export$2daf9923c014a26e = v);
|
|
485
467
|
|
|
486
468
|
|
|
487
|
-
|
|
488
469
|
var $85819f9bdebfd936$var$__assign = undefined && undefined.__assign || function() {
|
|
489
470
|
$85819f9bdebfd936$var$__assign = Object.assign || function(t) {
|
|
490
471
|
for(var s, i = 1, n = arguments.length; i < n; i++){
|
|
@@ -633,7 +614,8 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
|
|
|
633
614
|
return [
|
|
634
615
|
4 /*yield*/ ,
|
|
635
616
|
this.playerAnalytics.initiateAnalyticsReporter($85819f9bdebfd936$var$__assign({
|
|
636
|
-
sessionId: this.sessionId
|
|
617
|
+
sessionId: this.sessionId,
|
|
618
|
+
shardId: options.shardId
|
|
637
619
|
}, options))
|
|
638
620
|
];
|
|
639
621
|
case 1:
|
|
@@ -650,69 +632,65 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
|
|
|
650
632
|
$85819f9bdebfd936$export$2daf9923c014a26e.prototype.load = function(player) {
|
|
651
633
|
this.player = player;
|
|
652
634
|
this.playerAnalytics.loading($85819f9bdebfd936$var$__assign({
|
|
653
|
-
event:
|
|
635
|
+
event: "loading"
|
|
654
636
|
}, this.playbackState()));
|
|
655
637
|
this.initiateVideoEventFilter();
|
|
656
638
|
};
|
|
657
639
|
$85819f9bdebfd936$export$2daf9923c014a26e.prototype.initiateVideoEventFilter = function() {
|
|
658
640
|
var _this = this;
|
|
659
641
|
if (!this.player) return;
|
|
660
|
-
this.videoEventFilter =
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
642
|
+
this.videoEventFilter = $hCgyA$getMediaEventFilter({
|
|
643
|
+
mediaElement: this.player,
|
|
644
|
+
mp4Mode: false,
|
|
645
|
+
callback: function(event) {
|
|
646
|
+
var eventType;
|
|
647
|
+
var extraData = {
|
|
648
|
+
};
|
|
649
|
+
switch(event){
|
|
650
|
+
case $hCgyA$FilteredMediaEvent.LOADED:
|
|
651
|
+
eventType = "loaded";
|
|
652
|
+
break;
|
|
653
|
+
case $hCgyA$FilteredMediaEvent.PLAYING:
|
|
654
|
+
eventType = "playing";
|
|
655
|
+
_this.startInterval();
|
|
656
|
+
break;
|
|
657
|
+
case $hCgyA$FilteredMediaEvent.PAUSE:
|
|
658
|
+
eventType = "paused";
|
|
659
|
+
break;
|
|
660
|
+
case $hCgyA$FilteredMediaEvent.SEEKING:
|
|
661
|
+
eventType = "seeking";
|
|
662
|
+
break;
|
|
663
|
+
case $hCgyA$FilteredMediaEvent.SEEKED:
|
|
664
|
+
eventType = "seeked";
|
|
665
|
+
break;
|
|
666
|
+
case $hCgyA$FilteredMediaEvent.BUFFERING:
|
|
667
|
+
eventType = "buffering";
|
|
668
|
+
break;
|
|
669
|
+
case $hCgyA$FilteredMediaEvent.BUFFERED:
|
|
670
|
+
eventType = "buffered";
|
|
671
|
+
break;
|
|
672
|
+
case $hCgyA$FilteredMediaEvent.ENDED:
|
|
673
|
+
eventType = "stopped";
|
|
674
|
+
extraData["reason"] = "ended";
|
|
675
|
+
_this.stopInterval();
|
|
676
|
+
break;
|
|
677
|
+
default:
|
|
678
|
+
break;
|
|
679
|
+
}
|
|
680
|
+
try {
|
|
681
|
+
if (!_this.analyticsInitiated) {
|
|
682
|
+
console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
|
|
683
|
+
return;
|
|
684
|
+
}
|
|
685
|
+
if (eventType) _this.playerAnalytics[eventType == "paused" ? "pause" : eventType]($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
|
|
686
|
+
event: eventType
|
|
687
|
+
}, _this.playbackState()), Object.keys(extraData).length > 0 && {
|
|
688
|
+
payload: extraData
|
|
689
|
+
}));
|
|
690
|
+
} catch (err) {
|
|
691
|
+
console.error(err);
|
|
692
|
+
}
|
|
710
693
|
}
|
|
711
|
-
_this.playerAnalytics[eventType]($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
|
|
712
|
-
event: eventType
|
|
713
|
-
}, _this.playbackState()), Object.keys(extraData).length > 0 && {
|
|
714
|
-
payload: extraData
|
|
715
|
-
}));
|
|
716
694
|
});
|
|
717
695
|
};
|
|
718
696
|
$85819f9bdebfd936$export$2daf9923c014a26e.prototype.startInterval = function() {
|
|
@@ -720,7 +698,7 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
|
|
|
720
698
|
if (this.heartbeatIntervalTimer) return;
|
|
721
699
|
this.heartbeatIntervalTimer = setInterval(function() {
|
|
722
700
|
_this.playerAnalytics.heartbeat($85819f9bdebfd936$var$__assign({
|
|
723
|
-
event:
|
|
701
|
+
event: "heartbeat"
|
|
724
702
|
}, _this.playbackState()));
|
|
725
703
|
}, this.heartbeatInterval);
|
|
726
704
|
};
|
|
@@ -733,7 +711,7 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
|
|
|
733
711
|
return;
|
|
734
712
|
}
|
|
735
713
|
this.playerAnalytics.bitrateChanged($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
|
|
736
|
-
event:
|
|
714
|
+
event: "bitrate_changed"
|
|
737
715
|
}, this.playbackState()), {
|
|
738
716
|
payload: payload
|
|
739
717
|
}));
|
|
@@ -744,7 +722,7 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
|
|
|
744
722
|
return;
|
|
745
723
|
}
|
|
746
724
|
this.playerAnalytics.stopped($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
|
|
747
|
-
event:
|
|
725
|
+
event: "stopped"
|
|
748
726
|
}, this.playbackState()), {
|
|
749
727
|
payload: {
|
|
750
728
|
reason: "aborted"
|
|
@@ -758,12 +736,12 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
|
|
|
758
736
|
return;
|
|
759
737
|
}
|
|
760
738
|
this.playerAnalytics.error($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
|
|
761
|
-
event:
|
|
739
|
+
event: "error"
|
|
762
740
|
}, this.playbackState()), {
|
|
763
741
|
payload: error
|
|
764
742
|
}));
|
|
765
743
|
this.playerAnalytics.stopped($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
|
|
766
|
-
event:
|
|
744
|
+
event: "stopped"
|
|
767
745
|
}, this.playbackState()), {
|
|
768
746
|
payload: {
|
|
769
747
|
reason: "error"
|
|
@@ -777,7 +755,7 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
|
|
|
777
755
|
return;
|
|
778
756
|
}
|
|
779
757
|
this.playerAnalytics.metadata($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
|
|
780
|
-
event:
|
|
758
|
+
event: "metadata"
|
|
781
759
|
}, this.playbackState()), {
|
|
782
760
|
payload: payload
|
|
783
761
|
}));
|
|
@@ -788,7 +766,7 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
|
|
|
788
766
|
return;
|
|
789
767
|
}
|
|
790
768
|
this.playerAnalytics.warning($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
|
|
791
|
-
event:
|
|
769
|
+
event: "warning"
|
|
792
770
|
}, this.playbackState()), {
|
|
793
771
|
payload: payload
|
|
794
772
|
}));
|
|
@@ -811,7 +789,7 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
|
|
|
811
789
|
}
|
|
812
790
|
this.stopInterval();
|
|
813
791
|
this.heartbeatInterval = null;
|
|
814
|
-
this.videoEventFilter && this.videoEventFilter.
|
|
792
|
+
this.videoEventFilter && this.videoEventFilter.teardown();
|
|
815
793
|
this.videoEventFilter = null;
|
|
816
794
|
};
|
|
817
795
|
$85819f9bdebfd936$export$2daf9923c014a26e.prototype.destroy = function() {
|
|
@@ -821,7 +799,7 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
|
|
|
821
799
|
}
|
|
822
800
|
this.playerAnalytics.destroy();
|
|
823
801
|
this.heartbeatInterval = null;
|
|
824
|
-
this.videoEventFilter && this.videoEventFilter.
|
|
802
|
+
this.videoEventFilter && this.videoEventFilter.teardown();
|
|
825
803
|
this.stopInterval();
|
|
826
804
|
};
|
|
827
805
|
return $85819f9bdebfd936$export$2daf9923c014a26e;
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;;;;;;;;AIAA,GAAA,CAAY,yCAgBX;CAhBD,QAAA,CAAY,yCAAU,EAAtB,CAAA;IACE,yCAAA,CAAA,CAAA,YAAA,CAAmB;IACnB,yCAAA,CAAA,CAAA,WAAA,CAAiB;IACjB,yCAAA,CAAA,CAAA,SAAA,CAAgB;IAChB,yCAAA,CAAA,CAAA,WAAA,CAAkB;IAClB,yCAAA,CAAA,CAAA,UAAA,CAAgB;IAChB,yCAAA,CAAA,CAAA,YAAA,CAAmB;IACnB,yCAAA,CAAA,CAAA,WAAA,CAAiB;IACjB,yCAAA,CAAA,CAAA,cAAA,CAAuB;IACvB,yCAAA,CAAA,CAAA,aAAA,CAAqB;IACrB,yCAAA,CAAA,CAAA,UAAA,CAAiB;IACjB,yCAAA,CAAA,CAAA,UAAA,CAAe;IACf,yCAAA,CAAA,CAAA,YAAA,CAAmB;IACnB,yCAAA,CAAA,CAAA,mBAAA,CAAkC;IAClC,yCAAA,CAAA,CAAA,cAAA,CAAuB;IACvB,yCAAA,CAAA,CAAA,aAAA,CAAqB;AACvB,CAAC,EAhBW,yCAAU,KAAV,yCAAU,GAAA,CAAA;AAAA,CAAA;AAkBf,GAAA,CAAM,yCAAkB,GAAG,KAAK;AAGhC,GAAA,CAAM,yCAAY,GAAG,qDAAW,CAAC,OAAO;;;;;;;A,G,C,8B,0B,Q,I,Q,G,C;I,8B,G,M,C,M,I,Q,C,C,E,C;Q,G,C,G,C,C,E,C,G,C,E,C,G,S,C,M,E,C,G,C,E,C,G,C;Y,C,G,S,C,C;Y,G,C,G,C,C,I,C,C,E,E,M,C,S,C,c,C,I,C,C,E,C,G,C,C,C,I,C,C,C;Q,C;Q,M,C,C;I,C;I,M,C,8B,C,K,C,I,E,S;A,C;A,G,C,+B,0B,S,I,Q,C,O,E,U,E,C,E,S,E,C;a,K,C,K,E,C;Q,M,C,K,Y,C,G,K,G,G,C,C,C,Q,C,O,E,C;Y,O,C,K;Q,C;I,C;I,M,C,G,E,C,K,C,G,O,G,Q,C,O,E,M,E,C;iB,S,C,K,E,C;Y,G,C,C;gB,I,C,S,C,I,C,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,Q,C,K,E,C;Y,G,C,C;gB,I,C,S,C,C,Q,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,I,C,M,E,C;Y,M,C,I,G,O,C,M,C,K,I,K,C,M,C,K,E,I,C,S,E,Q;Q,C;Q,I,E,S,G,S,C,K,C,O,E,U,I,C,C,G,I;I,C;A,C;A,G,C,iC,0B,W,I,Q,C,O,E,I,E,C;I,G,C,C,G,C;Q,K,E,C;Q,I,E,Q,G,C;Y,E,E,C,C,C,I,C,E,K,C,C,C,C;Y,M,C,C,C,C;Q,C;Q,I,E,C,C;Q,G,E,C,C;I,C,E,C,E,C,E,C,E,C;a,I,C,C,E,C;Q,M,C,Q,C,C,E,C;Y,M,C,I,C,C;gB,C;gB,C;Y,C;Q,C;I,C;a,I,C,E,E,C;Q,E,E,C,E,K,C,G,C,S,C,C;c,C,C,G,C,C;Y,E,E,C,G,C,E,C,K,C,G,E,C,C,I,C,G,C,C,C,W,E,C,C,I,C,C,C,a,C,G,C,C,C,a,C,C,I,C,C,G,C,I,C,C,I,O,C,G,C,C,I,C,C,E,E,C,C,I,I,E,M,C,C;Y,E,E,C,G,C,E,C,E,E,G,C;gB,E,C,C,I,C;gB,C,C,K;Y,C;Y,M,C,E,C,C;gB,I,C,C;gB,I,C,C;oB,C,G,E;oB,K;gB,I,C,C;oB,C,C,K;oB,M,C,C;wB,K,E,E,C,C;wB,I,E,K;oB,C;gB,I,C,C;oB,C,C,K;oB,C,G,E,C,C;oB,E,G,C;A,yB;oB,C;oB,Q;gB,I,C,C;oB,E,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;oB,E,I,C,G,C,C,I,E,C,G,C,C,M,G,C,I,C,C,C,C,M,G,C,O,E,C,C,M,C,I,E,C,C,M,C,G,C;wB,C,G,C;wB,Q;oB,C;oB,E,E,E,C,C,M,C,M,C,I,E,C,C,I,C,C,C,K,E,C,C,I,C,C,C,I,C;wB,C,C,K,G,E,C,C;wB,K;oB,C;oB,E,E,E,C,C,M,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,G,E;wB,K;oB,C;oB,E,E,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,C,G,C,I,C,E;wB,K;oB,C;oB,E,E,C,C,C,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;Y,E,G,I,C,I,C,O,E,C;Q,C,C,K,E,C,E,C;Y,E,G,C;A,iB;gB,C;Y,C;Y,C,G,C;Q,C,Q,C;Y,C,G,C,G,C;Q,C;Q,E,E,E,C,C,I,C,E,K,C,E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SAAS;gCACzB,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC9B,CAAA;wBAAA,CAAA;;Y,C;Q,C;IAEJ,CAAA;IAEM,yCAAA,CAAA,SAAA,CAAA,IAAI,GAAX,QAAA,CAAY,IAA2B,EAAhC,CAAA;QACL,EAAA,GAAK,IAAI,CAAC,WAAW,EACnB,MAAA,CAAO,OAAO,CAAC,IAAI,CACjB,CAAsD,uDACtD,IAAI;QAER,GAAA,CAAM,OAAO,GAAA,8BAAA,CAAA,CAAA;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;QAAA,CAAA,EACtB,IAAI;QAET,EAAA,EAAI,IAAI,CAAC,KAAK,EACZ,OAAO,CAAC,GAAG,CAAC,CAAmC,oCAAE,OAAO;aAExD,KAAK,CAAC,CAAA,EAAA,MAAA,CAAG,IAAI,CAAC,YAAY,GAAI,CAA9B;YACE,MAAM,EAAE,CAAM;YACd,IAAI,EAAE,CAAM;YACZ,KAAK,EAAE,CAAU;YACjB,OAAO,EAAE,CAAT;gBACE,CAAc,eAAE,CAAiC;gBACjD,CAAc,eAAE,IAAI,CAAC,KAAK;gBAC1B,CAAgB,iBAAE,yCAAY;YAC/B,CAAA;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;QAC7B,CAAA;IAEL,CAAC;IACH,MAAA,CAAA,yCAAC;AAAD,CA/FA;;;A,G,C,+B,0B,S,I,Q,C,O,E,U,E,C,E,S,E,C;a,K,C,K,E,C;Q,M,C,K,Y,C,G,K,G,G,C,C,C,Q,C,O,E,C;Y,O,C,K;Q,C;I,C;I,M,C,G,E,C,K,C,G,O,G,Q,C,O,E,M,E,C;iB,S,C,K,E,C;Y,G,C,C;gB,I,C,S,C,I,C,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,Q,C,K,E,C;Y,G,C,C;gB,I,C,S,C,C,Q,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,I,C,M,E,C;Y,M,C,I,G,O,C,M,C,K,I,K,C,M,C,K,E,I,C,S,E,Q;Q,C;Q,I,E,S,G,S,C,K,C,O,E,U,I,C,C,G,I;I,C;A,C;A,G,C,iC,0B,W,I,Q,C,O,E,I,E,C;I,G,C,C,G,C;Q,K,E,C;Q,I,E,Q,G,C;Y,E,E,C,C,C,I,C,E,K,C,C,C,C;Y,M,C,C,C,C;Q,C;Q,I,E,C,C;Q,G,E,C,C;I,C,E,C,E,C,E,C,E,C;a,I,C,C,E,C;Q,M,C,Q,C,C,E,C;Y,M,C,I,C,C;gB,C;gB,C;Y,C;Q,C;I,C;a,I,C,E,E,C;Q,E,E,C,E,K,C,G,C,S,C,C;c,C,C,G,C,C;Y,E,E,C,G,C,E,C,K,C,G,E,C,C,I,C,G,C,C,C,W,E,C,C,I,C,C,C,a,C,G,C,C,C,a,C,C,I,C,C,G,C,I,C,C,I,O,C,G,C,C,I,C,C,E,E,C,C,I,I,E,M,C,C;Y,E,E,C,G,C,E,C,E,E,G,C;gB,E,C,C,I,C;gB,C,C,K;Y,C;Y,M,C,E,C,C;gB,I,C,C;gB,I,C,C;oB,C,G,E;oB,K;gB,I,C,C;oB,C,C,K;oB,M,C,C;wB,K,E,E,C,C;wB,I,E,K;oB,C;gB,I,C,C;oB,C,C,K;oB,C,G,E,C,C;oB,E,G,C;A,yB;oB,C;oB,Q;gB,I,C,C;oB,E,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;oB,E,I,C,G,C,C,I,E,C,G,C,C,M,G,C,I,C,C,C,C,M,G,C,O,E,C,C,M,C,I,E,C,C,M,C,G,C;wB,C,G,C;wB,Q;oB,C;oB,E,E,E,C,C,M,C,M,C,I,E,C,C,I,C,C,C,K,E,C,C,I,C,C,C,I,C;wB,C,C,K,G,E,C,C;wB,K;oB,C;oB,E,E,E,C,C,M,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,G,E;wB,K;oB,C;oB,E,E,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,C,G,C,I,C,E;wB,K;oB,C;oB,E,E,C,C,C,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;Y,E,G,I,C,I,C,O,E,C;Q,C,C,K,E,C,E,C;Y,E,G,C;A,iB;gB,C;Y,C;Y,C,G,C;Q,C,Q,C;Y,C,G,C,G,C;Q,C;Q,E,E,E,C,C,I,C,E,K,C,E,C,C;Q,M,C,C;Y,K,E,E,C,C,I,E,C,C,I,I,C,C;Y,I,E,I;Q,C;I,C;I,M,C,C,G,C;Q,I,E,I,C,C;Q,C,Q,I,C,C;Q,C,S,I,C,C;I,C,E,M,C,M,K,C,c,C,C,M,C,Q,I,Q,G,C;Q,M,C,I;I,C,G,C;A,C;AJMA,GAAA,CAAA,yCAAA,G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AA;QACL,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI;IAClC,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,cAAc,GAArB,QAAA,CAAsB,IAA0B,EAAzC,CAAA;QACL,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI;IAClC,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,KAAK,GAAZ,QAAA,CAAa,IAAiB,EAAvB,CAAA;QACL,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI;IAClC,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,OAAO,GAAd,QAAA,CAAe,IAAmB,EAA3B,CAAA;QACL,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI;IAClC,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,OAAO,GAAd,QAAA,CAAe,IAAmB,EAA3B,CAAA;QACL,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI;IAClC,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,OAAO,GAAd,QAAO,GAAA,CAAA;QACL,IAAI,CAAC,iBAAiB,GAAG,IAAI;IAC/B,CAAC;IACH,MAAA,CAAA,yCAAC;AAAD,CA7FA;;;;;;;;;A,G,C,8B,0B,Q,I,Q,G,C;I,8B,G,M,C,M,I,Q,C,C,E,C;Q,G,C,G,C,C,E,C,G,C,E,C,G,S,C,M,E,C,G,C,E,C,G,C;Y,C,G,S,C,C;Y,G,C,G,C,C,I,C,C,E,E,M,C,S,C,c,C,I,C,C,E,C,G,C,C,C,I,C,C,C;Q,C;Q,M,C,C;I,C;I,M,C,8B,C,K,C,I,E,S;A,C;A,G,C,+B,0B,S,I,Q,C,O,E,U,E,C,E,S,E,C;a,K,C,K,E,C;Q,M,C,K,Y,C,G,K,G,G,C,C,C,Q,C,O,E,C;Y,O,C,K;Q,C;I,C;I,M,C,G,E,C,K,C,G,O,G,Q,C,O,E,M,E,C;iB,S,C,K,E,C;Y,G,C,C;gB,I,C,S,C,I,C,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,Q,C,K,E,C;Y,G,C,C;gB,I,C,S,C,C,Q,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,I,C,M,E,C;Y,M,C,I,G,O,C,M,C,K,I,K,C,M,C,K,E,I,C,S,E,Q;Q,C;Q,I,E,S,G,S,C,K,C,O,E,U,I,C,C,G,I;I,C;A,C;A,G,C,iC,0B,W,I,Q,C,O,E,I,E,C;I,G,C,C,G,C;Q,K,E,C;Q,I,E,Q,G,C;Y,E,E,C,C,C,I,C,E,K,C,C,C,C;Y,M,C,C,C,C;Q,C;Q,I,E,C,C;Q,G,E,C,C;I,C,E,C,E,C,E,C,E,C;a,I,C,C,E,C;Q,M,C,Q,C,C,E,C;Y,M,C,I,C,C;gB,C;gB,C;Y,C;Q,C;I,C;a,I,C,E,E,C;Q,E,E,C,E,K,C,G,C,S,C,C;c,C,C,G,C,C;Y,E,E,C,G,C,E,C,K,C,G,E,C,C,I,C,G,C,C,C,W,E,C,C,I,C,C,C,a,C,G,C,C,C,a,C,C,I,C,C,G,C,I,C,C,I,O,C,G,C,C,I,C,C,E,E,C,C,I,I,E,M,C,C;Y,E,E,C,G,C,E,C,E,E,G,C;gB,E,C,C,I,C;gB,C,C,K;Y,C;Y,M,C,E,C,C;gB,I,C,C;gB,I,C,C;oB,C,G,E;oB,K;gB,I,C,C;oB,C,C,K;oB,M,C,C;wB,K,E,E,C,C;wB,I,E,K;oB,C;gB,I,C,C;oB,C,C,K;oB,C,G,E,C,C;oB,E,G,C;A,yB;oB,C;oB,Q;gB,I,C,C;oB,E,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;oB,E,I,C,G,C,C,I,E,C,G,C,C,M,G,C,I,C,C,C,C,M,G,C,O,E,C,C,M,C,I,E,C,C,M,C,G,C;wB,C,G,C;wB,Q;oB,C;oB,E,E,E,C,C,M,C,M,C,I,E,C,C,I,C,C,C,K,E,C,C,I,C,C,C,I,C;wB,C,C,K,G,E,C,C;wB,K;oB,C;oB,E,E,E,C,C,M,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,G,E;wB,K;oB,C;oB,E,E,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,C,G,C,I,C,E;wB,K;oB,C;oB,E,E,C,C,C,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;Y,E,G,I,C,I,C,O,E,C;Q,C,C,K,E,C,E,C;Y,E,G,C;A,iB;gB,C;Y,C;Y,C,G,C;Q,C,Q,C;Y,C,G,C,G,C;Q,C;Q,E,E,E,C,C,I,C,E,K,C,E,C,C;Q,M,C,C;Y,K,E,E,C,C,I,E,C,C,I,I,C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","sources":["index.ts","src/PlayerAnalytics.ts","PlayerAnalytics.ts","src/utils/constants.ts","constants.ts","src/utils/Reporter.ts","Reporter.ts","src/PlayerAnalyticsConnector.ts","PlayerAnalyticsConnector.ts"],"sourcesContent":["export {\n PlayerAnalytics,\n IPlayerAnalyticsInitOptions,\n} from \"./src/PlayerAnalytics\";\n\nexport {\n PlayerAnalyticsConnector,\n IPlayerAnalyticsConnectorInitOptions,\n} from \"./src/PlayerAnalyticsConnector\";\n","import {\n PlayerAnalyticsClientModule,\n TBitrateChangedEvent,\n TBufferedEvent,\n TBufferingEvent,\n TErrorEvent,\n THeartbeatEvent,\n TInitEvent,\n TLoadedEvent,\n TLoadingEvent,\n TMetadataEvent,\n TPausedEvent,\n TPlayingEvent,\n TSeekedEvent,\n TSeekingEvent,\n TStoppedEvent,\n TWarningEvent,\n} from \"@eyevinn/player-analytics-specification\";\nimport { HEARTBEAT_INTERVAL } from \"./utils/constants\";\nimport { Reporter } from \"./utils/Reporter\";\n\nexport interface IPlayerAnalyticsInitOptions {\n sessionId?: string;\n heartbeatInterval?: number;\n}\n\nexport class PlayerAnalytics implements PlayerAnalyticsClientModule {\n private debug = false;\n private eventsinkUrl: string;\n private analyticsReporter: Reporter;\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.debug = debug;\n this.eventsinkUrl = eventsinkUrl;\n }\n\n public async initiateAnalyticsReporter({\n sessionId,\n heartbeatInterval = HEARTBEAT_INTERVAL,\n }: IPlayerAnalyticsInitOptions) {\n this.analyticsReporter = new Reporter({\n sessionId,\n eventsinkUrl: this.eventsinkUrl,\n debug: this.debug,\n heartbeatInterval,\n });\n\n const { sessionId: generatedSessionId, isInitiated } =\n await this.analyticsReporter.init(sessionId);\n\n return { sessionId: generatedSessionId, heartbeatInterval, isInitiated };\n }\n\n public init(data: TInitEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public metadata(data: TMetadataEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public heartbeat(data: THeartbeatEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public loading(data: TLoadingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public loaded(data: TLoadedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public playing(data: TPlayingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public paused(data: TPausedEvent): void {\n this.pause(data);\n }\n\n public pause(data: TPausedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public buffering(data: TBufferingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public buffered(data: TBufferedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public seeking(data: TSeekingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public seeked(data: TSeekedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public bitrateChanged(data: TBitrateChangedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public error(data: TErrorEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public warning(data: TWarningEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public stopped(data: TStoppedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public destroy() {\n this.analyticsReporter = null;\n }\n}\n",null,"export enum EPASEvents {\n loading = \"loading\",\n loaded = \"loaded\",\n play = \"playing\",\n resume = \"playing\",\n pause = \"paused\",\n seeking = \"seeking\",\n seeked = \"seeked\",\n buffering = \"buffering\",\n buffered = \"buffered\",\n ended = \"stopped\",\n error = \"error\",\n warning = \"warning\",\n bitratechanged = \"bitrate_changed\",\n heartbeat = \"heartbeat\",\n metadata = \"metadata\",\n}\n\nexport const HEARTBEAT_INTERVAL = 30000;\n\nimport packageJson from \"@eyevinn/player-analytics-specification/package.json\";\nexport const EPAS_VERSION = packageJson.version;\n",null,"import {\n TInitEvent,\n TPlayerAnalyticsEvent,\n} from \"@eyevinn/player-analytics-specification\";\nimport { EPAS_VERSION, HEARTBEAT_INTERVAL } from \"./constants\";\n\nexport interface IReporterOptions {\n eventsinkUrl: string;\n heartbeatInterval?: number;\n sessionId?: string;\n debug?: boolean;\n}\n\nexport interface IReporterPostOptions {\n event: string;\n timestamp: number;\n playhead: number;\n duration: number;\n}\n\nexport class Reporter {\n private debug: boolean;\n private eventsinkUrl: string;\n private sessionId?: string;\n private heartbeatInterval?: number;\n private isInitiated = false;\n\n constructor(options: IReporterOptions) {\n this.debug = options.debug;\n this.eventsinkUrl = options.eventsinkUrl;\n this.sessionId = options.sessionId;\n this.heartbeatInterval = options.heartbeatInterval || HEARTBEAT_INTERVAL;\n\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Initiated AnalyticsReporter\", options);\n }\n }\n\n public async init(sessionId?: string): Promise<Record<string, any>> {\n this.sessionId = sessionId || this.sessionId;\n const data: TInitEvent = {\n event: \"init\",\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead: -1,\n duration: -1,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Init session:\", data);\n this.isInitiated = true;\n return {\n sessionId: this.sessionId,\n heartbeatInterval: this.heartbeatInterval,\n isInitiated: this.isInitiated,\n };\n } else {\n const initResponse = await fetch(`${this.eventsinkUrl}`, {\n method: \"POST\",\n mode: \"cors\",\n cache: \"no-cache\",\n headers: {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-EPAS-Event\": data.event,\n \"X-EPAS-Version\": EPAS_VERSION,\n },\n body: JSON.stringify(data),\n });\n if (!initResponse.ok) {\n throw new Error(\n `[AnalyticsReporter] init failed: ${initResponse.statusText}`\n );\n }\n const initResponseJson = await initResponse.json();\n\n if (!this.sessionId && !initResponseJson.sessionId) {\n throw new Error(`[AnalyticsReporter] init failed: no sessionId`);\n }\n if (initResponseJson.sessionId) {\n this.sessionId = initResponseJson.sessionId;\n }\n this.isInitiated = true;\n return {\n heartbeatInterval: this.heartbeatInterval,\n sessionId: this.sessionId,\n isInitiated: this.isInitiated,\n };\n }\n }\n\n public send(data: TPlayerAnalyticsEvent): void {\n if (!this.isInitiated)\n return console.warn(\n \"[AnalyticsReporter] Cannot report before initiation:\",\n data\n );\n const payload = {\n sessionId: this.sessionId,\n ...data,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Send payload:\", payload);\n } else {\n fetch(`${this.eventsinkUrl}`, {\n method: \"POST\",\n mode: \"cors\",\n cache: \"no-cache\",\n headers: {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-EPAS-Event\": data.event,\n \"X-EPAS-Version\": EPAS_VERSION,\n },\n body: JSON.stringify(payload),\n });\n }\n }\n}\n",null,"import { VideoEventFilter, PlayerEvents } from \"@eyevinn/video-event-filter\";\nimport { EPASEvents } from \"./utils/constants\";\nimport { PlayerAnalytics } from \"./PlayerAnalytics\";\nimport {\n TBaseEvent,\n TBitrateChangedEventPayload,\n TErrorEventPayload,\n TMetadataEventPayload,\n UUID,\n} from \"@eyevinn/player-analytics-specification\";\n\nexport interface IPlayerAnalyticsConnectorInitOptions {\n sessionId?: string;\n heartbeatInterval?: number;\n}\n\nexport class PlayerAnalyticsConnector {\n private eventsinkUrl: string;\n private sessionId: UUID;\n private player: HTMLVideoElement;\n\n private playerAnalytics: PlayerAnalytics;\n private analyticsInitiated = false;\n\n private videoEventFilter: VideoEventFilter;\n private videoEventListener: any;\n\n private heartbeatInterval: number;\n private heartbeatIntervalTimer: ReturnType<typeof setInterval>;\n\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.eventsinkUrl = eventsinkUrl;\n this.playerAnalytics = new PlayerAnalytics(this.eventsinkUrl, debug);\n }\n\n public async init(options: IPlayerAnalyticsConnectorInitOptions) {\n this.sessionId = options.sessionId;\n const { heartbeatInterval, isInitiated } =\n await this.playerAnalytics.initiateAnalyticsReporter({\n sessionId: this.sessionId,\n ...options,\n });\n\n this.analyticsInitiated = isInitiated;\n this.heartbeatInterval = heartbeatInterval;\n }\n\n public load(player: HTMLVideoElement) {\n this.player = player;\n this.playerAnalytics.loading({\n event: EPASEvents.loading,\n ...this.playbackState(),\n });\n this.initiateVideoEventFilter();\n }\n\n private initiateVideoEventFilter() {\n if (!this.player) return;\n this.videoEventFilter = new VideoEventFilter(this.player);\n this.videoEventFilter.addEventListener(\n \"*\",\n (this.videoEventListener = (event: PlayerEvents) => {\n if (!Object.keys(EPASEvents).includes(event)) return;\n let eventType;\n const extraData = {};\n if (!event) return;\n switch (event) {\n case PlayerEvents.Loaded:\n eventType = EPASEvents.loaded;\n break;\n case PlayerEvents.Loading:\n eventType = EPASEvents.loading;\n break;\n case PlayerEvents.Play:\n case PlayerEvents.Resume:\n eventType = EPASEvents.play;\n this.startInterval();\n break;\n case PlayerEvents.Pause:\n eventType = EPASEvents.pause;\n break;\n case PlayerEvents.Seeking:\n eventType = EPASEvents.seeking;\n break;\n case PlayerEvents.Seeked:\n eventType = EPASEvents.seeked;\n break;\n case PlayerEvents.Buffering:\n eventType = EPASEvents.buffering;\n break;\n case PlayerEvents.Buffered:\n eventType = EPASEvents.buffered;\n break;\n case PlayerEvents.Ended:\n eventType = EPASEvents.ended;\n (extraData as any).reason = \"ended\";\n this.stopInterval();\n break;\n case PlayerEvents.Error:\n eventType = EPASEvents.error;\n (extraData as any).reason = \"error\";\n this.stopInterval();\n break;\n default:\n break;\n }\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics[eventType]({\n event: eventType,\n ...this.playbackState(),\n ...(Object.keys(extraData).length > 0 && { payload: extraData }),\n });\n })\n );\n }\n\n private startInterval() {\n if (this.heartbeatIntervalTimer) return;\n this.heartbeatIntervalTimer = setInterval(() => {\n this.playerAnalytics.heartbeat({\n event: EPASEvents.heartbeat,\n ...this.playbackState(),\n });\n }, this.heartbeatInterval);\n }\n\n private stopInterval() {\n clearInterval(this.heartbeatIntervalTimer);\n }\n\n public reportBitrateChange(payload: TBitrateChangedEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.bitrateChanged({\n event: EPASEvents.bitratechanged,\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportStop() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.stopped({\n event: EPASEvents.ended,\n ...this.playbackState(),\n payload: { reason: \"aborted\" },\n });\n this.stopInterval();\n }\n\n public reportError(error: TErrorEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.error({\n event: EPASEvents.error,\n ...this.playbackState(),\n payload: error,\n });\n this.playerAnalytics.stopped({\n event: EPASEvents.ended,\n ...this.playbackState(),\n payload: { reason: \"error\" },\n });\n this.stopInterval();\n }\n\n public reportMetadata(payload: TMetadataEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.metadata({\n event: EPASEvents.metadata,\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportWarning(payload: TErrorEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.warning({\n event: EPASEvents.warning,\n ...this.playbackState(),\n payload,\n });\n }\n\n private playbackState(): TBaseEvent {\n const duration =\n this.player?.duration &&\n this.player?.duration !== Infinity &&\n this.player?.duration > 0\n ? this.player.duration\n : -1;\n const playhead =\n this.player?.currentTime && duration !== -1\n ? this.player?.currentTime\n : -1;\n return {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead,\n duration,\n };\n }\n\n public deinit() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.stopInterval();\n this.heartbeatInterval = null;\n this.videoEventFilter &&\n this.videoEventFilter.removeEventListener(\"*\", this.videoEventListener);\n this.videoEventFilter = null;\n }\n\n public destroy() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.destroy();\n this.heartbeatInterval = null;\n this.videoEventFilter &&\n this.videoEventFilter.removeEventListener(\"*\", this.videoEventListener);\n this.stopInterval();\n }\n}\n",null],"names":[],"version":3,"file":"module.js.map"}
|
|
1
|
+
{"mappings":";;;;;;;;;;AEAO,GAAA,CAAM,yCAAkB,GAAG,KAAK;AAGhC,GAAA,CAAM,yCAAY,GAAG,qDAAW,CAAC,OAAO;;;;;;;A,G,C,8B,0B,Q,I,Q,G,C;I,8B,G,M,C,M,I,Q,C,C,E,C;Q,G,C,G,C,C,E,C,G,C,E,C,G,S,C,M,E,C,G,C,E,C,G,C;Y,C,G,S,C,C;Y,G,C,G,C,C,I,C,C,E,E,M,C,S,C,c,C,I,C,C,E,C,G,C,C,C,I,C,C,C;Q,C;Q,M,C,C;I,C;I,M,C,8B,C,K,C,I,E,S;A,C;A,G,C,+B,0B,S,I,Q,C,O,E,U,E,C,E,S,E,C;a,K,C,K,E,C;Q,M,C,K,Y,C,G,K,G,G,C,C,C,Q,C,O,E,C;Y,O,C,K;Q,C;I,C;I,M,C,G,E,C,K,C,G,O,G,Q,C,O,E,M,E,C;iB,S,C,K,E,C;Y,G,C,C;gB,I,C,S,C,I,C,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,Q,C,K,E,C;Y,G,C,C;gB,I,C,S,C,C,Q,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,I,C,M,E,C;Y,M,C,I,G,O,C,M,C,K,I,K,C,M,C,K,E,I,C,S,E,Q;Q,C;Q,I,E,S,G,S,C,K,C,O,E,U,I,C,C,G,I;I,C;A,C;A,G,C,iC,0B,W,I,Q,C,O,E,I,E,C;I,G,C,C,G,C;Q,K,E,C;Q,I,E,Q,G,C;Y,E,E,C,C,C,I,C,E,K,C,C,C,C;Y,M,C,C,C,C;Q,C;Q,I,E,C,C;Q,G,E,C,C;I,C,E,C,E,C,E,C,E,C;a,I,C,C,E,C;Q,M,C,Q,C,C,E,C;Y,M,C,I,C,C;gB,C;gB,C;Y,C;Q,C;I,C;a,I,C,E,E,C;Q,E,E,C,E,K,C,G,C,S,C,C;c,C,C,G,C,C;Y,E,E,C,G,C,E,C,K,C,G,E,C,C,I,C,G,C,C,C,W,E,C,C,I,C,C,C,a,C,G,C,C,C,a,C,C,I,C,C,G,C,I,C,C,I,O,C,G,C,C,I,C,C,E,E,C,C,I,I,E,M,C,C;Y,E,E,C,G,C,E,C,E,E,G,C;gB,E,C,C,I,C;gB,C,C,K;Y,C;Y,M,C,E,C,C;gB,I,C,C;gB,I,C,C;oB,C,G,E;oB,K;gB,I,C,C;oB,C,C,K;oB,M,C,C;wB,K,E,E,C,C;wB,I,E,K;oB,C;gB,I,C,C;oB,C,C,K;oB,C,G,E,C,C;oB,E,G,C;A,yB;oB,C;oB,Q;gB,I,C,C;oB,E,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;oB,E,I,C,G,C,C,I,E,C,G,C,C,M,G,C,I,C,C,C,C,M,G,C,O,E,C,C,M,C,I,E,C,C,M,C,G,C;wB,C,G,C;wB,Q;oB,C;oB,E,E,E,C,C,M,C,M,C,I,E,C,C,I,C,C,C,K,E,C,C,I,C,C,C,I,C;wB,C,C,K,G,E,C,C;wB,K;oB,C;oB,E,E,E,C,C,M,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,G,E;wB,K;oB,C;oB,E,E,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,C,G,C,I,C,E;wB,K;oB,C;oB,E,E,C,C,C,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;Y,E,G,I,C,I,C,O,E,C;Q,C,C,K,E,C,E,C;Y,E,G,C;A,iB;gB,C;Y,C;Y,C,G,C;Q,C,Q,C;Y,C,G,C,G,C;Q,C;Q,E,E,E,C,C,I,C,E,K,C,E,C,C;Q,M,C,C;Y,K,E,E,C,C,I,E,C,C,I,I,C,C;Y,I,E,I;Q,C;I,C;I,M,C,C,G,C;Q,I,E,I,C,C;Q,C,Q,I,C,C;Q,C,S,I,C,C;I,C,E,M,C,M,K,C,c,C,C,M,C,Q,I,Q,G,C;Q,M,C,I;I,C,G,C;A,C;ACkB/C,GAAA,CAAA,yCAAA,GAAA,QAAA,GAAA,CAAA;aAQE,yCAAA,CAAY,OAAyB,EAArC,CAAA;QAFQ,IAAA,CAAA,WAAW,GAAG,KAAK;QAGzB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;QAC9B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY;QACxC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS;QAClC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,yCAAkB;QAExE,EAAA,EAAI,IAAI,CAAC,KAAK,EACZ,OAAO,CAAC,GAAG,CAAC,CAAiD,kDAAE,OAAO;IAE1E,CAAC;IAEY,yCAAA,CAAA,SAAA,CAAA,IAAI,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KAAK,EAAE,CAAU;YACjB,OAAO,EAAE,CAAT;gBACE,CAAc,eAAE,CAAiC;gBACjD,CAAc,eAAE,IAAI,CAAC,KAAK;gBAC1B,CAAgB,iBAAE,yCAAY;YAC/B,CAAA;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;QAC7B,CAAA;IAEL,CAAC;IACH,MAAA,CAAA,yCAAC;AAAD,CAnGA;;;A,G,C,+B,0B,S,I,Q,C,O,E,U,E,C,E,S,E,C;a,K,C,K,E,C;Q,M,C,K,Y,C,G,K,G,G,C,C,C,Q,C,O,E,C;Y,O,C,K;Q,C;I,C;I,M,C,G,E,C,K,C,G,O,G,Q,C,O,E,M,E,C;iB,S,C,K,E,C;Y,G,C,C;gB,I,C,S,C,I,C,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,Q,C,K,E,C;Y,G,C,C;gB,I,C,S,C,C,Q,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,I,C,M,E,C;Y,M,C,I,G,O,C,M,C,K,I,K,C,M,C,K,E,I,C,S,E,Q;Q,C;Q,I,E,S,G,S,C,K,C,O,E,U,I,C,C,G,I;I,C;A,C;A,G,C,iC,0B,W,I,Q,C,O,E,I,E,C;I,G,C,C,G,C;Q,K,E,C;Q,I,E,Q,G,C;Y,E,E,C,C,C,I,C,E,K,C,C,C,C;Y,M,C,C,C,C;Q,C;Q,I,E,C,C;Q,G,E,C,C;I,C,E,C,E,C,E,C,E,C;a,I,C,C,E,C;Q,M,C,Q,C,C,E,C;Y,M,C,I,C,C;gB,C;gB,C;Y,C;Q,C;I,C;a,I,C,E,E,C;Q,E,E,C,E,K,C,G,C,S,C,C;c,C,C,G,C,C;Y,E,E,C,G,C,E,C,K,C,G,E,C,C,I,C,G,C,C,C,W,E,C,C,I,C,C,C,a,C,G,C,C,C,a,C,C,I,C,C,G,C,I,C,C,I,O,C,G,C,C,I,C,C,E,E,C,C,I,I,E,M,C,C;Y,E,E,C,G,C,E,C,E,E,G,C;gB,E,C,C,I,C;gB,C,C,K;Y,C;Y,M,C,E,C,C;gB,I,C,C;gB,I,C,C;oB,C,G,E;oB,K;gB,I,C,C;oB,C,C,K;oB,M,C,C;wB,K,E,E,C,C;wB,I,E,K;oB,C;gB,I,C,C;oB,C,C,K;oB,C,G,E,C,C;oB,E,G,C;A,yB;oB,C;oB,Q;gB,I,C,C;oB,E,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;oB,E,I,C,G,C,C,I,E,C,G,C,C,M,G,C,I,C,C,C,C,M,G,C,O,E,C,C,M,C,I,E,C,C,M,C,G,C;wB,C,G,C;wB,Q;oB,C;oB,E,E,E,C,C,M,C,M,C,I,E,C,C,I,C,C,C,K,E,C,C,I,C,C,C,I,C;wB,C,C,K,G,E,C,C;wB,K;oB,C;oB,E,E,E,C,C,M,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,G,E;wB,K;oB,C;oB,E,E,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,C,G,C,I,C,E;wB,K;oB,C;oB,E,E,C,C,C,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;Y,E,G,I,C,I,C,O,E,C;Q,C,C,K,E,C,E,C;Y,E,G,C;A,iB;gB,C;Y,C;Y,C,G,C;Q,C,Q,C;Y,C,G,C,G,C;Q,C;Q,E,E,E,C,C,I,C,E,K,C,E,C,C;Q,M,C,C;Y,K,E,E,C,C,I,E,C,C,I,I,C,C;Y,I,E,I;Q,C;I,C;I,M,C,C,G,C;Q,I,E,I,C,C;Q,C,Q,I,C,C;Q,C,S,I,C,C;I,C,E,M,C,M,K,C,c,C,C,M,C,Q,I,Q,G,C;Q,M,C,I;I,C,G,C;A,C;AFMA,GAAA,CAAA,yCAAA,GAAA,QAAA,GAAA,CAAA;aAIE,yCAAA,CAAY,YAAoB,EAAE,KAAe,EAAjD,CAAA;QAHQ,IAAA,CAAA,KAAK,GAAG,KAAK;QAInB,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,YAAY,GAAG,YAAY;IAClC,CAAC;IAEY,yCAAA,CAAA,SAAA,CAAA,yBAAyB,GAAtC,QAAA,CAAuC,EAIT,EAJjB,CAAA;QACX,GAAA,CAAA,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,OAAO,GAAA,EAAA,CAAA,OAAA,EACP,EAAA,GAAA,EAAA,CAAA,iBAAsC,EAAtC,iBAAiB,GAAA,EAAA,KAAA,IAAA,CAAA,CAAA,GAAG,yCAAkB,GAAA,EAAA;Q,M,C,+B,C,I,E,I,C,C,E,I,C,C,E,Q,G,C;Y,G,C,E,E,kB,E,W;Y,M,C,iC,C,I,E,Q,C,E,E,C;gB,M,C,E,C,K;oB,I,C,C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O,GAAd,QAAO,GAAA,CAAA;QACL,IAAI,CAAC,iBAAiB,GAAG,IAAI;IAC/B,CAAC;IACH,MAAA,CAAA,yCAAC;AAAD,CA3FA;;;;;;;;A,G,C,8B,0B,Q,I,Q,G,C;I,8B,G,M,C,M,I,Q,C,C,E,C;Q,G,C,G,C,C,E,C,G,C,E,C,G,S,C,M,E,C,G,C,E,C,G,C;Y,C,G,S,C,C;Y,G,C,G,C,C,I,C,C,E,E,M,C,S,C,c,C,I,C,C,E,C,G,C,C,C,I,C,C,C;Q,C;Q,M,C,C;I,C;I,M,C,8B,C,K,C,I,E,S;A,C;A,G,C,+B,0B,S,I,Q,C,O,E,U,E,C,E,S,E,C;a,K,C,K,E,C;Q,M,C,K,Y,C,G,K,G,G,C,C,C,Q,C,O,E,C;Y,O,C,K;Q,C;I,C;I,M,C,G,E,C,K,C,G,O,G,Q,C,O,E,M,E,C;iB,S,C,K,E,C;Y,G,C,C;gB,I,C,S,C,I,C,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,Q,C,K,E,C;Y,G,C,C;gB,I,C,S,C,C,Q,K;Y,C,C,K,E,C,E,C;gB,M,C,C;Y,C;Q,C;iB,I,C,M,E,C;Y,M,C,I,G,O,C,M,C,K,I,K,C,M,C,K,E,I,C,S,E,Q;Q,C;Q,I,E,S,G,S,C,K,C,O,E,U,I,C,C,G,I;I,C;A,C;A,G,C,iC,0B,W,I,Q,C,O,E,I,E,C;I,G,C,C,G,C;Q,K,E,C;Q,I,E,Q,G,C;Y,E,E,C,C,C,I,C,E,K,C,C,C,C;Y,M,C,C,C,C;Q,C;Q,I,E,C,C;Q,G,E,C,C;I,C,E,C,E,C,E,C,E,C;a,I,C,C,E,C;Q,M,C,Q,C,C,E,C;Y,M,C,I,C,C;gB,C;gB,C;Y,C;Q,C;I,C;a,I,C,E,E,C;Q,E,E,C,E,K,C,G,C,S,C,C;c,C,C,G,C,C;Y,E,E,C,G,C,E,C,K,C,G,E,C,C,I,C,G,C,C,C,W,E,C,C,I,C,C,C,a,C,G,C,C,C,a,C,C,I,C,C,G,C,I,C,C,I,O,C,G,C,C,I,C,C,E,E,C,C,I,I,E,M,C,C;Y,E,E,C,G,C,E,C,E,E,G,C;gB,E,C,C,I,C;gB,C,C,K;Y,C;Y,M,C,E,C,C;gB,I,C,C;gB,I,C,C;oB,C,G,E;oB,K;gB,I,C,C;oB,C,C,K;oB,M,C,C;wB,K,E,E,C,C;wB,I,E,K;oB,C;gB,I,C,C;oB,C,C,K;oB,C,G,E,C,C;oB,E,G,C;A,yB;oB,C;oB,Q;gB,I,C,C;oB,E,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;oB,E,I,C,G,C,C,I,E,C,G,C,C,M,G,C,I,C,C,C,C,M,G,C,O,E,C,C,M,C,I,E,C,C,M,C,G,C;wB,C,G,C;wB,Q;oB,C;oB,E,E,E,C,C,M,C,M,C,I,E,C,C,I,C,C,C,K,E,C,C,I,C,C,C,I,C;wB,C,C,K,G,E,C,C;wB,K;oB,C;oB,E,E,E,C,C,M,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,G,E;wB,K;oB,C;oB,E,E,C,I,C,C,K,G,C,C,C,G,C;wB,C,C,K,G,C,C,C;wB,C,C,G,C,I,C,E;wB,K;oB,C;oB,E,E,C,C,C,G,C,C,G,C,G;oB,C,C,I,C,G;oB,Q;;Y,E,G,I,C,I,C,O,E,C;Q,C,C,K,E,C,E,C;Y,E,G,C;A,iB;gB,C;Y,C;Y,C,G,C;Q,C,Q,C;Y,C,G,C,G,C;Q,C;Q,E,E,E,C,C,I,C,E,K,C,E,C,C;Q,M,C,C;Y,K,E,E,C,C,I,E,C,C,I,I,C,C;Y,I,E,I;Q,C;I,C;I,M,C,C,G,C;Q,I,E,I,C,C;Q,C,Q,I,C,C;Q,C,S,I,C,C;I,C,E,M,C,M,K,C,c,C,C,M,C,Q,I,Q,G,C;Q,M,C,I;I,C,G,C;A,C;AGNA,GAAA,CAAA,yCAAA,GAAA,QAAA,GAAA,CAAA;aAcE,yCAAA,CAAY,YAAoB,EAAE,KAAe,EAAjD,CAAA;QARQ,IAAA,CAAA,kBAAkB,GAAG,KAAK;QAShC,IAAI,CAAC,YAAY,GAAG,YAAY;QAChC,IAAI,CAAC,eAAe,GAAG,GAAA,CAAI,yCAAe,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK;IACrE,CAAC;IAEY,yCAAA,CAAA,SAAA,CAAA,IAAI,GAAjB,QAAA,CAAkB,OAA6C,EAAlD,CAAA;Q,M,C,+B,C,I,E,I,C,C,E,I,C,C,E,Q,G,C;Y,G,C,E,E,iB,E,W;Y,M,C,iC,C,I,E,Q,C,E,E,C;gB,M,C,E,C,K;oB,I,C,C;wBACX,IAAI,CAAC,SAAS,GAAG,OAAO,CA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","sources":["index.ts","src/PlayerAnalytics.ts","src/utils/constants.ts","src/utils/Reporter.ts","src/PlayerAnalyticsConnector.ts"],"sourcesContent":["export {\n PlayerAnalytics,\n IPlayerAnalyticsInitOptions,\n} from \"./src/PlayerAnalytics\";\n\nexport {\n PlayerAnalyticsConnector,\n IPlayerAnalyticsConnectorInitOptions,\n} from \"./src/PlayerAnalyticsConnector\";\n","import {\n PlayerAnalyticsClientModule,\n TBitrateChangedEvent,\n TBufferedEvent,\n TBufferingEvent,\n TErrorEvent,\n THeartbeatEvent,\n TInitEvent,\n TLoadedEvent,\n TLoadingEvent,\n TMetadataEvent,\n TPausedEvent,\n TPlayingEvent,\n TSeekedEvent,\n TSeekingEvent,\n TStoppedEvent,\n TWarningEvent,\n} from \"@eyevinn/player-analytics-specification\";\nimport { HEARTBEAT_INTERVAL } from \"./utils/constants\";\nimport { Reporter } from \"./utils/Reporter\";\n\nexport interface IPlayerAnalyticsInitOptions {\n sessionId?: string;\n shardId?: string;\n heartbeatInterval?: number;\n}\n\nexport class PlayerAnalytics implements PlayerAnalyticsClientModule {\n private debug = false;\n private eventsinkUrl: string;\n private analyticsReporter: Reporter;\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.debug = debug;\n this.eventsinkUrl = eventsinkUrl;\n }\n\n public async initiateAnalyticsReporter({\n sessionId,\n shardId,\n heartbeatInterval = HEARTBEAT_INTERVAL,\n }: IPlayerAnalyticsInitOptions) {\n this.analyticsReporter = new Reporter({\n sessionId,\n eventsinkUrl: this.eventsinkUrl,\n debug: this.debug,\n heartbeatInterval,\n shardId,\n });\n\n const { sessionId: generatedSessionId, isInitiated } =\n await this.analyticsReporter.init(sessionId);\n\n return { sessionId: generatedSessionId, heartbeatInterval, isInitiated };\n }\n\n public init(data: TInitEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public metadata(data: TMetadataEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public heartbeat(data: THeartbeatEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public loading(data: TLoadingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public loaded(data: TLoadedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public playing(data: TPlayingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public pause(data: TPausedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public buffering(data: TBufferingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public buffered(data: TBufferedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public seeking(data: TSeekingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public seeked(data: TSeekedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public bitrateChanged(data: TBitrateChangedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public error(data: TErrorEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public warning(data: TWarningEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public stopped(data: TStoppedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public destroy() {\n this.analyticsReporter = null;\n }\n}\n","export const HEARTBEAT_INTERVAL = 30000;\n\nimport packageJson from \"@eyevinn/player-analytics-specification/package.json\";\nexport const EPAS_VERSION = packageJson.version;\n","import {\n TInitEvent,\n TPlayerAnalyticsEvent,\n} from \"@eyevinn/player-analytics-specification\";\nimport { EPAS_VERSION, HEARTBEAT_INTERVAL } from \"./constants\";\n\nexport interface IReporterOptions {\n eventsinkUrl: string;\n heartbeatInterval?: number;\n sessionId?: string;\n shardId?: string;\n debug?: boolean;\n}\n\nexport interface IReporterPostOptions {\n event: string;\n timestamp: number;\n playhead: number;\n duration: number;\n}\n\nexport class Reporter {\n private debug: boolean;\n private eventsinkUrl: string;\n private sessionId?: string;\n private shardId?: string;\n private heartbeatInterval?: number;\n private isInitiated = false;\n\n constructor(options: IReporterOptions) {\n this.debug = options.debug;\n this.shardId = options.shardId;\n this.eventsinkUrl = options.eventsinkUrl;\n this.sessionId = options.sessionId;\n this.heartbeatInterval = options.heartbeatInterval || HEARTBEAT_INTERVAL;\n\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Initiated AnalyticsReporter\", options);\n }\n }\n\n public async init(sessionId?: string): Promise<Record<string, any>> {\n this.sessionId = sessionId || this.sessionId;\n const data: TInitEvent = {\n event: \"init\",\n sessionId: this.sessionId,\n shardId: this.shardId,\n timestamp: Date.now(),\n playhead: -1,\n duration: -1,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Init session:\", data);\n this.isInitiated = true;\n return {\n sessionId: this.sessionId,\n heartbeatInterval: this.heartbeatInterval,\n isInitiated: this.isInitiated,\n };\n } else {\n const initResponse = await fetch(`${this.eventsinkUrl}`, {\n method: \"POST\",\n mode: \"cors\",\n cache: \"no-cache\",\n headers: {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-EPAS-Event\": data.event,\n \"X-EPAS-Version\": EPAS_VERSION,\n },\n body: JSON.stringify(data),\n });\n if (!initResponse.ok) {\n throw new Error(\n `[AnalyticsReporter] init failed: ${initResponse.statusText}`\n );\n }\n const initResponseJson = await initResponse.json();\n\n if (!this.sessionId && !initResponseJson.sessionId) {\n throw new Error(`[AnalyticsReporter] init failed: no sessionId`);\n }\n if (initResponseJson.sessionId) {\n this.sessionId = initResponseJson.sessionId;\n }\n this.isInitiated = true;\n return {\n heartbeatInterval: this.heartbeatInterval,\n sessionId: this.sessionId,\n isInitiated: this.isInitiated,\n };\n }\n }\n\n public send(data: TPlayerAnalyticsEvent): void {\n if (!this.isInitiated)\n return console.warn(\n \"[AnalyticsReporter] Cannot report before initiation:\",\n data\n );\n const payload = {\n sessionId: this.sessionId,\n shardId: this.shardId,\n ...data,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Send payload:\", payload);\n } else {\n fetch(`${this.eventsinkUrl}`, {\n method: \"POST\",\n mode: \"cors\",\n cache: \"no-cache\",\n headers: {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-EPAS-Event\": data.event,\n \"X-EPAS-Version\": EPAS_VERSION,\n },\n body: JSON.stringify(payload),\n });\n }\n }\n}\n","import {\n getMediaEventFilter,\n FilteredMediaEvent,\n TMediaEventFilter,\n} from \"@eyevinn/media-event-filter\";\nimport { PlayerAnalytics } from \"./PlayerAnalytics\";\nimport {\n TBaseEvent,\n TBitrateChangedEventPayload,\n TErrorEventPayload,\n TEventType,\n TMetadataEventPayload,\n UUID,\n} from \"@eyevinn/player-analytics-specification\";\n\nexport interface IPlayerAnalyticsConnectorInitOptions {\n sessionId?: string;\n heartbeatInterval?: number;\n shardId?: string;\n}\n\nexport class PlayerAnalyticsConnector {\n private eventsinkUrl: string;\n private sessionId: UUID;\n private player: HTMLVideoElement;\n\n private playerAnalytics: PlayerAnalytics;\n private analyticsInitiated = false;\n\n private videoEventFilter: TMediaEventFilter;\n private videoEventListener: any;\n\n private heartbeatInterval: number;\n private heartbeatIntervalTimer: ReturnType<typeof setInterval>;\n\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.eventsinkUrl = eventsinkUrl;\n this.playerAnalytics = new PlayerAnalytics(this.eventsinkUrl, debug);\n }\n\n public async init(options: IPlayerAnalyticsConnectorInitOptions) {\n this.sessionId = options.sessionId;\n const { heartbeatInterval, isInitiated } =\n await this.playerAnalytics.initiateAnalyticsReporter({\n sessionId: this.sessionId,\n shardId: options.shardId,\n ...options,\n });\n\n this.analyticsInitiated = isInitiated;\n this.heartbeatInterval = heartbeatInterval;\n }\n\n public load(player: HTMLVideoElement) {\n this.player = player;\n this.playerAnalytics.loading({\n event: \"loading\",\n ...this.playbackState(),\n });\n this.initiateVideoEventFilter();\n }\n\n private initiateVideoEventFilter() {\n if (!this.player) return;\n this.videoEventFilter = getMediaEventFilter({\n mediaElement: this.player,\n mp4Mode: false,\n callback: (event: FilteredMediaEvent) => {\n let eventType: TEventType;\n const extraData = {};\n switch (event) {\n case FilteredMediaEvent.LOADED:\n eventType = \"loaded\";\n break;\n case FilteredMediaEvent.PLAYING:\n eventType = \"playing\";\n this.startInterval();\n break;\n case FilteredMediaEvent.PAUSE:\n eventType = \"paused\";\n break;\n case FilteredMediaEvent.SEEKING:\n eventType = \"seeking\";\n break;\n case FilteredMediaEvent.SEEKED:\n eventType = \"seeked\";\n break;\n case FilteredMediaEvent.BUFFERING:\n eventType = \"buffering\";\n break;\n case FilteredMediaEvent.BUFFERED:\n eventType = \"buffered\";\n break;\n case FilteredMediaEvent.ENDED:\n eventType = \"stopped\";\n extraData[\"reason\"] = \"ended\";\n this.stopInterval();\n break;\n default:\n break;\n }\n try {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n if (eventType) {\n this.playerAnalytics[eventType == \"paused\" ? \"pause\" : eventType]({\n event: eventType,\n ...this.playbackState(),\n ...(Object.keys(extraData).length > 0 && { payload: extraData }),\n });\n }\n } catch (err) {\n console.error(err);\n }\n },\n });\n }\n\n private startInterval() {\n if (this.heartbeatIntervalTimer) return;\n this.heartbeatIntervalTimer = setInterval(() => {\n this.playerAnalytics.heartbeat({\n event: \"heartbeat\",\n ...this.playbackState(),\n });\n }, this.heartbeatInterval);\n }\n\n private stopInterval() {\n clearInterval(this.heartbeatIntervalTimer);\n }\n\n public reportBitrateChange(payload: TBitrateChangedEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.bitrateChanged({\n event: \"bitrate_changed\",\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportStop() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.stopped({\n event: \"stopped\",\n ...this.playbackState(),\n payload: { reason: \"aborted\" },\n });\n this.stopInterval();\n }\n\n public reportError(error: TErrorEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.error({\n event: \"error\",\n ...this.playbackState(),\n payload: error,\n });\n this.playerAnalytics.stopped({\n event: \"stopped\",\n ...this.playbackState(),\n payload: { reason: \"error\" },\n });\n this.stopInterval();\n }\n\n public reportMetadata(payload: TMetadataEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.metadata({\n event: \"metadata\",\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportWarning(payload: TErrorEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.warning({\n event: \"warning\",\n ...this.playbackState(),\n payload,\n });\n }\n\n private playbackState(): TBaseEvent {\n const duration =\n this.player?.duration &&\n this.player?.duration !== Infinity &&\n this.player?.duration > 0\n ? this.player.duration\n : -1;\n const playhead =\n this.player?.currentTime && duration !== -1\n ? this.player?.currentTime\n : -1;\n return {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead,\n duration,\n };\n }\n\n public deinit() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.stopInterval();\n this.heartbeatInterval = null;\n this.videoEventFilter && this.videoEventFilter.teardown();\n this.videoEventFilter = null;\n }\n\n public destroy() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.destroy();\n this.heartbeatInterval = null;\n this.videoEventFilter && this.videoEventFilter.teardown();\n this.stopInterval();\n }\n}\n"],"names":[],"version":3,"file":"module.js.map"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { PlayerAnalyticsClientModule, TBitrateChangedEvent, TBufferedEvent, TBufferingEvent, TErrorEvent, THeartbeatEvent, TInitEvent, TLoadedEvent, TLoadingEvent, TMetadataEvent, TPausedEvent, TPlayingEvent, TSeekedEvent, TSeekingEvent, TStoppedEvent, TWarningEvent, TBitrateChangedEventPayload, TErrorEventPayload, TMetadataEventPayload } from "node_modules/@eyevinn/player-analytics-specification/specification/typescript/index";
|
|
2
2
|
export interface IPlayerAnalyticsInitOptions {
|
|
3
3
|
sessionId?: string;
|
|
4
|
+
shardId?: string;
|
|
4
5
|
heartbeatInterval?: number;
|
|
5
6
|
}
|
|
6
7
|
export class PlayerAnalytics implements PlayerAnalyticsClientModule {
|
|
7
8
|
constructor(eventsinkUrl: string, debug?: boolean);
|
|
8
|
-
initiateAnalyticsReporter({ sessionId, heartbeatInterval, }: IPlayerAnalyticsInitOptions): Promise<{
|
|
9
|
+
initiateAnalyticsReporter({ sessionId, shardId, heartbeatInterval, }: IPlayerAnalyticsInitOptions): Promise<{
|
|
9
10
|
sessionId: any;
|
|
10
11
|
heartbeatInterval: number;
|
|
11
12
|
isInitiated: any;
|
|
@@ -16,7 +17,6 @@ export class PlayerAnalytics implements PlayerAnalyticsClientModule {
|
|
|
16
17
|
loading(data: TLoadingEvent): void;
|
|
17
18
|
loaded(data: TLoadedEvent): void;
|
|
18
19
|
playing(data: TPlayingEvent): void;
|
|
19
|
-
paused(data: TPausedEvent): void;
|
|
20
20
|
pause(data: TPausedEvent): void;
|
|
21
21
|
buffering(data: TBufferingEvent): void;
|
|
22
22
|
buffered(data: TBufferedEvent): void;
|
|
@@ -31,6 +31,7 @@ export class PlayerAnalytics implements PlayerAnalyticsClientModule {
|
|
|
31
31
|
export interface IPlayerAnalyticsConnectorInitOptions {
|
|
32
32
|
sessionId?: string;
|
|
33
33
|
heartbeatInterval?: number;
|
|
34
|
+
shardId?: string;
|
|
34
35
|
}
|
|
35
36
|
export class PlayerAnalyticsConnector {
|
|
36
37
|
constructor(eventsinkUrl: string, debug?: boolean);
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";AEqBA;IACE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,4BAA6B,YAAW,2BAA2B;gBAIrD,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAKpC,yBAAyB,CAAC,EACrC,SAAS,EACT,iBAAsC,GACvC,EAAE,2BAA2B;;;;;IAcvB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI5B,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpC,SAAS,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAItC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIhC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIhC,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI/B,SAAS,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAItC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIhC,cAAc,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAIhD,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAI9B,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC,OAAO;CAGf;AC5GD;IACE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;gBAcc,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAKpC,IAAI,CAAC,OAAO,EAAE,oCAAoC;IAYxD,IAAI,CAAC,MAAM,EAAE,gBAAgB;IAsF7B,mBAAmB,CAAC,OAAO,EAAE,2BAA2B;IAYxD,UAAU;IAaV,WAAW,CAAC,KAAK,EAAE,kBAAkB;IAkBrC,cAAc,CAAC,OAAO,EAAE,qBAAqB;IAY7C,aAAa,CAAC,OAAO,EAAE,kBAAkB;IA+BzC,MAAM;IAYN,OAAO;CAWf","sources":["src/utils/constants.ts","src/utils/Reporter.ts","src/PlayerAnalytics.ts","src/PlayerAnalyticsConnector.ts","index.ts"],"sourcesContent":["export enum EPASEvents {\n loading = \"loading\",\n loaded = \"loaded\",\n play = \"playing\",\n resume = \"playing\",\n pause = \"paused\",\n seeking = \"seeking\",\n seeked = \"seeked\",\n buffering = \"buffering\",\n buffered = \"buffered\",\n ended = \"stopped\",\n error = \"error\",\n warning = \"warning\",\n bitratechanged = \"bitrate_changed\",\n heartbeat = \"heartbeat\",\n metadata = \"metadata\",\n}\n\nexport const HEARTBEAT_INTERVAL = 30000;\n\nimport packageJson from \"@eyevinn/player-analytics-specification/package.json\";\nexport const EPAS_VERSION = packageJson.version;\n","import {\n TInitEvent,\n TPlayerAnalyticsEvent,\n} from \"@eyevinn/player-analytics-specification\";\nimport { EPAS_VERSION, HEARTBEAT_INTERVAL } from \"./constants\";\n\nexport interface IReporterOptions {\n eventsinkUrl: string;\n heartbeatInterval?: number;\n sessionId?: string;\n debug?: boolean;\n}\n\nexport interface IReporterPostOptions {\n event: string;\n timestamp: number;\n playhead: number;\n duration: number;\n}\n\nexport class Reporter {\n private debug: boolean;\n private eventsinkUrl: string;\n private sessionId?: string;\n private heartbeatInterval?: number;\n private isInitiated = false;\n\n constructor(options: IReporterOptions) {\n this.debug = options.debug;\n this.eventsinkUrl = options.eventsinkUrl;\n this.sessionId = options.sessionId;\n this.heartbeatInterval = options.heartbeatInterval || HEARTBEAT_INTERVAL;\n\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Initiated AnalyticsReporter\", options);\n }\n }\n\n public async init(sessionId?: string): Promise<Record<string, any>> {\n this.sessionId = sessionId || this.sessionId;\n const data: TInitEvent = {\n event: \"init\",\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead: -1,\n duration: -1,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Init session:\", data);\n this.isInitiated = true;\n return {\n sessionId: this.sessionId,\n heartbeatInterval: this.heartbeatInterval,\n isInitiated: this.isInitiated,\n };\n } else {\n const initResponse = await fetch(`${this.eventsinkUrl}`, {\n method: \"POST\",\n mode: \"cors\",\n cache: \"no-cache\",\n headers: {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-EPAS-Event\": data.event,\n \"X-EPAS-Version\": EPAS_VERSION,\n },\n body: JSON.stringify(data),\n });\n if (!initResponse.ok) {\n throw new Error(\n `[AnalyticsReporter] init failed: ${initResponse.statusText}`\n );\n }\n const initResponseJson = await initResponse.json();\n\n if (!this.sessionId && !initResponseJson.sessionId) {\n throw new Error(`[AnalyticsReporter] init failed: no sessionId`);\n }\n if (initResponseJson.sessionId) {\n this.sessionId = initResponseJson.sessionId;\n }\n this.isInitiated = true;\n return {\n heartbeatInterval: this.heartbeatInterval,\n sessionId: this.sessionId,\n isInitiated: this.isInitiated,\n };\n }\n }\n\n public send(data: TPlayerAnalyticsEvent): void {\n if (!this.isInitiated)\n return console.warn(\n \"[AnalyticsReporter] Cannot report before initiation:\",\n data\n );\n const payload = {\n sessionId: this.sessionId,\n ...data,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Send payload:\", payload);\n } else {\n fetch(`${this.eventsinkUrl}`, {\n method: \"POST\",\n mode: \"cors\",\n cache: \"no-cache\",\n headers: {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-EPAS-Event\": data.event,\n \"X-EPAS-Version\": EPAS_VERSION,\n },\n body: JSON.stringify(payload),\n });\n }\n }\n}\n","import {\n PlayerAnalyticsClientModule,\n TBitrateChangedEvent,\n TBufferedEvent,\n TBufferingEvent,\n TErrorEvent,\n THeartbeatEvent,\n TInitEvent,\n TLoadedEvent,\n TLoadingEvent,\n TMetadataEvent,\n TPausedEvent,\n TPlayingEvent,\n TSeekedEvent,\n TSeekingEvent,\n TStoppedEvent,\n TWarningEvent,\n} from \"@eyevinn/player-analytics-specification\";\nimport { HEARTBEAT_INTERVAL } from \"./utils/constants\";\nimport { Reporter } from \"./utils/Reporter\";\n\nexport interface IPlayerAnalyticsInitOptions {\n sessionId?: string;\n heartbeatInterval?: number;\n}\n\nexport class PlayerAnalytics implements PlayerAnalyticsClientModule {\n private debug = false;\n private eventsinkUrl: string;\n private analyticsReporter: Reporter;\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.debug = debug;\n this.eventsinkUrl = eventsinkUrl;\n }\n\n public async initiateAnalyticsReporter({\n sessionId,\n heartbeatInterval = HEARTBEAT_INTERVAL,\n }: IPlayerAnalyticsInitOptions) {\n this.analyticsReporter = new Reporter({\n sessionId,\n eventsinkUrl: this.eventsinkUrl,\n debug: this.debug,\n heartbeatInterval,\n });\n\n const { sessionId: generatedSessionId, isInitiated } =\n await this.analyticsReporter.init(sessionId);\n\n return { sessionId: generatedSessionId, heartbeatInterval, isInitiated };\n }\n\n public init(data: TInitEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public metadata(data: TMetadataEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public heartbeat(data: THeartbeatEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public loading(data: TLoadingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public loaded(data: TLoadedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public playing(data: TPlayingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public paused(data: TPausedEvent): void {\n this.pause(data);\n }\n\n public pause(data: TPausedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public buffering(data: TBufferingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public buffered(data: TBufferedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public seeking(data: TSeekingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public seeked(data: TSeekedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public bitrateChanged(data: TBitrateChangedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public error(data: TErrorEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public warning(data: TWarningEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public stopped(data: TStoppedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public destroy() {\n this.analyticsReporter = null;\n }\n}\n","import { VideoEventFilter, PlayerEvents } from \"@eyevinn/video-event-filter\";\nimport { EPASEvents } from \"./utils/constants\";\nimport { PlayerAnalytics } from \"./PlayerAnalytics\";\nimport {\n TBaseEvent,\n TBitrateChangedEventPayload,\n TErrorEventPayload,\n TMetadataEventPayload,\n UUID,\n} from \"@eyevinn/player-analytics-specification\";\n\nexport interface IPlayerAnalyticsConnectorInitOptions {\n sessionId?: string;\n heartbeatInterval?: number;\n}\n\nexport class PlayerAnalyticsConnector {\n private eventsinkUrl: string;\n private sessionId: UUID;\n private player: HTMLVideoElement;\n\n private playerAnalytics: PlayerAnalytics;\n private analyticsInitiated = false;\n\n private videoEventFilter: VideoEventFilter;\n private videoEventListener: any;\n\n private heartbeatInterval: number;\n private heartbeatIntervalTimer: ReturnType<typeof setInterval>;\n\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.eventsinkUrl = eventsinkUrl;\n this.playerAnalytics = new PlayerAnalytics(this.eventsinkUrl, debug);\n }\n\n public async init(options: IPlayerAnalyticsConnectorInitOptions) {\n this.sessionId = options.sessionId;\n const { heartbeatInterval, isInitiated } =\n await this.playerAnalytics.initiateAnalyticsReporter({\n sessionId: this.sessionId,\n ...options,\n });\n\n this.analyticsInitiated = isInitiated;\n this.heartbeatInterval = heartbeatInterval;\n }\n\n public load(player: HTMLVideoElement) {\n this.player = player;\n this.playerAnalytics.loading({\n event: EPASEvents.loading,\n ...this.playbackState(),\n });\n this.initiateVideoEventFilter();\n }\n\n private initiateVideoEventFilter() {\n if (!this.player) return;\n this.videoEventFilter = new VideoEventFilter(this.player);\n this.videoEventFilter.addEventListener(\n \"*\",\n (this.videoEventListener = (event: PlayerEvents) => {\n if (!Object.keys(EPASEvents).includes(event)) return;\n let eventType;\n const extraData = {};\n if (!event) return;\n switch (event) {\n case PlayerEvents.Loaded:\n eventType = EPASEvents.loaded;\n break;\n case PlayerEvents.Loading:\n eventType = EPASEvents.loading;\n break;\n case PlayerEvents.Play:\n case PlayerEvents.Resume:\n eventType = EPASEvents.play;\n this.startInterval();\n break;\n case PlayerEvents.Pause:\n eventType = EPASEvents.pause;\n break;\n case PlayerEvents.Seeking:\n eventType = EPASEvents.seeking;\n break;\n case PlayerEvents.Seeked:\n eventType = EPASEvents.seeked;\n break;\n case PlayerEvents.Buffering:\n eventType = EPASEvents.buffering;\n break;\n case PlayerEvents.Buffered:\n eventType = EPASEvents.buffered;\n break;\n case PlayerEvents.Ended:\n eventType = EPASEvents.ended;\n (extraData as any).reason = \"ended\";\n this.stopInterval();\n break;\n case PlayerEvents.Error:\n eventType = EPASEvents.error;\n (extraData as any).reason = \"error\";\n this.stopInterval();\n break;\n default:\n break;\n }\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics[eventType]({\n event: eventType,\n ...this.playbackState(),\n ...(Object.keys(extraData).length > 0 && { payload: extraData }),\n });\n })\n );\n }\n\n private startInterval() {\n if (this.heartbeatIntervalTimer) return;\n this.heartbeatIntervalTimer = setInterval(() => {\n this.playerAnalytics.heartbeat({\n event: EPASEvents.heartbeat,\n ...this.playbackState(),\n });\n }, this.heartbeatInterval);\n }\n\n private stopInterval() {\n clearInterval(this.heartbeatIntervalTimer);\n }\n\n public reportBitrateChange(payload: TBitrateChangedEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.bitrateChanged({\n event: EPASEvents.bitratechanged,\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportStop() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.stopped({\n event: EPASEvents.ended,\n ...this.playbackState(),\n payload: { reason: \"aborted\" },\n });\n this.stopInterval();\n }\n\n public reportError(error: TErrorEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.error({\n event: EPASEvents.error,\n ...this.playbackState(),\n payload: error,\n });\n this.playerAnalytics.stopped({\n event: EPASEvents.ended,\n ...this.playbackState(),\n payload: { reason: \"error\" },\n });\n this.stopInterval();\n }\n\n public reportMetadata(payload: TMetadataEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.metadata({\n event: EPASEvents.metadata,\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportWarning(payload: TErrorEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.warning({\n event: EPASEvents.warning,\n ...this.playbackState(),\n payload,\n });\n }\n\n private playbackState(): TBaseEvent {\n const duration =\n this.player?.duration &&\n this.player?.duration !== Infinity &&\n this.player?.duration > 0\n ? this.player.duration\n : -1;\n const playhead =\n this.player?.currentTime && duration !== -1\n ? this.player?.currentTime\n : -1;\n return {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead,\n duration,\n };\n }\n\n public deinit() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.stopInterval();\n this.heartbeatInterval = null;\n this.videoEventFilter &&\n this.videoEventFilter.removeEventListener(\"*\", this.videoEventListener);\n this.videoEventFilter = null;\n }\n\n public destroy() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.destroy();\n this.heartbeatInterval = null;\n this.videoEventFilter &&\n this.videoEventFilter.removeEventListener(\"*\", this.videoEventListener);\n this.stopInterval();\n }\n}\n","export {\n PlayerAnalytics,\n IPlayerAnalyticsInitOptions,\n} from \"./src/PlayerAnalytics\";\n\nexport {\n PlayerAnalyticsConnector,\n IPlayerAnalyticsConnectorInitOptions,\n} from \"./src/PlayerAnalyticsConnector\";\n"],"names":[],"version":3,"file":"types.d.ts.map"}
|
|
1
|
+
{"mappings":";AEqBA;IACE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,4BAA6B,YAAW,2BAA2B;gBAIrD,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAKpC,yBAAyB,CAAC,EACrC,SAAS,EACT,OAAO,EACP,iBAAsC,GACvC,EAAE,2BAA2B;;;;;IAevB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI5B,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpC,SAAS,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAItC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIhC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI/B,SAAS,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAItC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIhC,cAAc,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAIhD,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAI9B,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC,OAAO;CAGf;ACvGD;IACE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;gBAcc,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAKpC,IAAI,CAAC,OAAO,EAAE,oCAAoC;IAaxD,IAAI,CAAC,MAAM,EAAE,gBAAgB;IAiF7B,mBAAmB,CAAC,OAAO,EAAE,2BAA2B;IAYxD,UAAU;IAaV,WAAW,CAAC,KAAK,EAAE,kBAAkB;IAkBrC,cAAc,CAAC,OAAO,EAAE,qBAAqB;IAY7C,aAAa,CAAC,OAAO,EAAE,kBAAkB;IA+BzC,MAAM;IAWN,OAAO;CAUf","sources":["src/utils/constants.ts","src/utils/Reporter.ts","src/PlayerAnalytics.ts","src/PlayerAnalyticsConnector.ts","index.ts"],"sourcesContent":["export const HEARTBEAT_INTERVAL = 30000;\n\nimport packageJson from \"@eyevinn/player-analytics-specification/package.json\";\nexport const EPAS_VERSION = packageJson.version;\n","import {\n TInitEvent,\n TPlayerAnalyticsEvent,\n} from \"@eyevinn/player-analytics-specification\";\nimport { EPAS_VERSION, HEARTBEAT_INTERVAL } from \"./constants\";\n\nexport interface IReporterOptions {\n eventsinkUrl: string;\n heartbeatInterval?: number;\n sessionId?: string;\n shardId?: string;\n debug?: boolean;\n}\n\nexport interface IReporterPostOptions {\n event: string;\n timestamp: number;\n playhead: number;\n duration: number;\n}\n\nexport class Reporter {\n private debug: boolean;\n private eventsinkUrl: string;\n private sessionId?: string;\n private shardId?: string;\n private heartbeatInterval?: number;\n private isInitiated = false;\n\n constructor(options: IReporterOptions) {\n this.debug = options.debug;\n this.shardId = options.shardId;\n this.eventsinkUrl = options.eventsinkUrl;\n this.sessionId = options.sessionId;\n this.heartbeatInterval = options.heartbeatInterval || HEARTBEAT_INTERVAL;\n\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Initiated AnalyticsReporter\", options);\n }\n }\n\n public async init(sessionId?: string): Promise<Record<string, any>> {\n this.sessionId = sessionId || this.sessionId;\n const data: TInitEvent = {\n event: \"init\",\n sessionId: this.sessionId,\n shardId: this.shardId,\n timestamp: Date.now(),\n playhead: -1,\n duration: -1,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Init session:\", data);\n this.isInitiated = true;\n return {\n sessionId: this.sessionId,\n heartbeatInterval: this.heartbeatInterval,\n isInitiated: this.isInitiated,\n };\n } else {\n const initResponse = await fetch(`${this.eventsinkUrl}`, {\n method: \"POST\",\n mode: \"cors\",\n cache: \"no-cache\",\n headers: {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-EPAS-Event\": data.event,\n \"X-EPAS-Version\": EPAS_VERSION,\n },\n body: JSON.stringify(data),\n });\n if (!initResponse.ok) {\n throw new Error(\n `[AnalyticsReporter] init failed: ${initResponse.statusText}`\n );\n }\n const initResponseJson = await initResponse.json();\n\n if (!this.sessionId && !initResponseJson.sessionId) {\n throw new Error(`[AnalyticsReporter] init failed: no sessionId`);\n }\n if (initResponseJson.sessionId) {\n this.sessionId = initResponseJson.sessionId;\n }\n this.isInitiated = true;\n return {\n heartbeatInterval: this.heartbeatInterval,\n sessionId: this.sessionId,\n isInitiated: this.isInitiated,\n };\n }\n }\n\n public send(data: TPlayerAnalyticsEvent): void {\n if (!this.isInitiated)\n return console.warn(\n \"[AnalyticsReporter] Cannot report before initiation:\",\n data\n );\n const payload = {\n sessionId: this.sessionId,\n shardId: this.shardId,\n ...data,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Send payload:\", payload);\n } else {\n fetch(`${this.eventsinkUrl}`, {\n method: \"POST\",\n mode: \"cors\",\n cache: \"no-cache\",\n headers: {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-EPAS-Event\": data.event,\n \"X-EPAS-Version\": EPAS_VERSION,\n },\n body: JSON.stringify(payload),\n });\n }\n }\n}\n","import {\n PlayerAnalyticsClientModule,\n TBitrateChangedEvent,\n TBufferedEvent,\n TBufferingEvent,\n TErrorEvent,\n THeartbeatEvent,\n TInitEvent,\n TLoadedEvent,\n TLoadingEvent,\n TMetadataEvent,\n TPausedEvent,\n TPlayingEvent,\n TSeekedEvent,\n TSeekingEvent,\n TStoppedEvent,\n TWarningEvent,\n} from \"@eyevinn/player-analytics-specification\";\nimport { HEARTBEAT_INTERVAL } from \"./utils/constants\";\nimport { Reporter } from \"./utils/Reporter\";\n\nexport interface IPlayerAnalyticsInitOptions {\n sessionId?: string;\n shardId?: string;\n heartbeatInterval?: number;\n}\n\nexport class PlayerAnalytics implements PlayerAnalyticsClientModule {\n private debug = false;\n private eventsinkUrl: string;\n private analyticsReporter: Reporter;\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.debug = debug;\n this.eventsinkUrl = eventsinkUrl;\n }\n\n public async initiateAnalyticsReporter({\n sessionId,\n shardId,\n heartbeatInterval = HEARTBEAT_INTERVAL,\n }: IPlayerAnalyticsInitOptions) {\n this.analyticsReporter = new Reporter({\n sessionId,\n eventsinkUrl: this.eventsinkUrl,\n debug: this.debug,\n heartbeatInterval,\n shardId,\n });\n\n const { sessionId: generatedSessionId, isInitiated } =\n await this.analyticsReporter.init(sessionId);\n\n return { sessionId: generatedSessionId, heartbeatInterval, isInitiated };\n }\n\n public init(data: TInitEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public metadata(data: TMetadataEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public heartbeat(data: THeartbeatEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public loading(data: TLoadingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public loaded(data: TLoadedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public playing(data: TPlayingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public pause(data: TPausedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public buffering(data: TBufferingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public buffered(data: TBufferedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public seeking(data: TSeekingEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public seeked(data: TSeekedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public bitrateChanged(data: TBitrateChangedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public error(data: TErrorEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public warning(data: TWarningEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public stopped(data: TStoppedEvent): void {\n this.analyticsReporter.send(data);\n }\n\n public destroy() {\n this.analyticsReporter = null;\n }\n}\n","import {\n getMediaEventFilter,\n FilteredMediaEvent,\n TMediaEventFilter,\n} from \"@eyevinn/media-event-filter\";\nimport { PlayerAnalytics } from \"./PlayerAnalytics\";\nimport {\n TBaseEvent,\n TBitrateChangedEventPayload,\n TErrorEventPayload,\n TEventType,\n TMetadataEventPayload,\n UUID,\n} from \"@eyevinn/player-analytics-specification\";\n\nexport interface IPlayerAnalyticsConnectorInitOptions {\n sessionId?: string;\n heartbeatInterval?: number;\n shardId?: string;\n}\n\nexport class PlayerAnalyticsConnector {\n private eventsinkUrl: string;\n private sessionId: UUID;\n private player: HTMLVideoElement;\n\n private playerAnalytics: PlayerAnalytics;\n private analyticsInitiated = false;\n\n private videoEventFilter: TMediaEventFilter;\n private videoEventListener: any;\n\n private heartbeatInterval: number;\n private heartbeatIntervalTimer: ReturnType<typeof setInterval>;\n\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.eventsinkUrl = eventsinkUrl;\n this.playerAnalytics = new PlayerAnalytics(this.eventsinkUrl, debug);\n }\n\n public async init(options: IPlayerAnalyticsConnectorInitOptions) {\n this.sessionId = options.sessionId;\n const { heartbeatInterval, isInitiated } =\n await this.playerAnalytics.initiateAnalyticsReporter({\n sessionId: this.sessionId,\n shardId: options.shardId,\n ...options,\n });\n\n this.analyticsInitiated = isInitiated;\n this.heartbeatInterval = heartbeatInterval;\n }\n\n public load(player: HTMLVideoElement) {\n this.player = player;\n this.playerAnalytics.loading({\n event: \"loading\",\n ...this.playbackState(),\n });\n this.initiateVideoEventFilter();\n }\n\n private initiateVideoEventFilter() {\n if (!this.player) return;\n this.videoEventFilter = getMediaEventFilter({\n mediaElement: this.player,\n mp4Mode: false,\n callback: (event: FilteredMediaEvent) => {\n let eventType: TEventType;\n const extraData = {};\n switch (event) {\n case FilteredMediaEvent.LOADED:\n eventType = \"loaded\";\n break;\n case FilteredMediaEvent.PLAYING:\n eventType = \"playing\";\n this.startInterval();\n break;\n case FilteredMediaEvent.PAUSE:\n eventType = \"paused\";\n break;\n case FilteredMediaEvent.SEEKING:\n eventType = \"seeking\";\n break;\n case FilteredMediaEvent.SEEKED:\n eventType = \"seeked\";\n break;\n case FilteredMediaEvent.BUFFERING:\n eventType = \"buffering\";\n break;\n case FilteredMediaEvent.BUFFERED:\n eventType = \"buffered\";\n break;\n case FilteredMediaEvent.ENDED:\n eventType = \"stopped\";\n extraData[\"reason\"] = \"ended\";\n this.stopInterval();\n break;\n default:\n break;\n }\n try {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n if (eventType) {\n this.playerAnalytics[eventType == \"paused\" ? \"pause\" : eventType]({\n event: eventType,\n ...this.playbackState(),\n ...(Object.keys(extraData).length > 0 && { payload: extraData }),\n });\n }\n } catch (err) {\n console.error(err);\n }\n },\n });\n }\n\n private startInterval() {\n if (this.heartbeatIntervalTimer) return;\n this.heartbeatIntervalTimer = setInterval(() => {\n this.playerAnalytics.heartbeat({\n event: \"heartbeat\",\n ...this.playbackState(),\n });\n }, this.heartbeatInterval);\n }\n\n private stopInterval() {\n clearInterval(this.heartbeatIntervalTimer);\n }\n\n public reportBitrateChange(payload: TBitrateChangedEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.bitrateChanged({\n event: \"bitrate_changed\",\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportStop() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.stopped({\n event: \"stopped\",\n ...this.playbackState(),\n payload: { reason: \"aborted\" },\n });\n this.stopInterval();\n }\n\n public reportError(error: TErrorEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.error({\n event: \"error\",\n ...this.playbackState(),\n payload: error,\n });\n this.playerAnalytics.stopped({\n event: \"stopped\",\n ...this.playbackState(),\n payload: { reason: \"error\" },\n });\n this.stopInterval();\n }\n\n public reportMetadata(payload: TMetadataEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.metadata({\n event: \"metadata\",\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportWarning(payload: TErrorEventPayload) {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.warning({\n event: \"warning\",\n ...this.playbackState(),\n payload,\n });\n }\n\n private playbackState(): TBaseEvent {\n const duration =\n this.player?.duration &&\n this.player?.duration !== Infinity &&\n this.player?.duration > 0\n ? this.player.duration\n : -1;\n const playhead =\n this.player?.currentTime && duration !== -1\n ? this.player?.currentTime\n : -1;\n return {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead,\n duration,\n };\n }\n\n public deinit() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.stopInterval();\n this.heartbeatInterval = null;\n this.videoEventFilter && this.videoEventFilter.teardown();\n this.videoEventFilter = null;\n }\n\n public destroy() {\n if (!this.analyticsInitiated) {\n console.warn(\"[PlayerAnalyticsConnector] Analytics not initiated\");\n return;\n }\n this.playerAnalytics.destroy();\n this.heartbeatInterval = null;\n this.videoEventFilter && this.videoEventFilter.teardown();\n this.stopInterval();\n }\n}\n","export {\n PlayerAnalytics,\n IPlayerAnalyticsInitOptions,\n} from \"./src/PlayerAnalytics\";\n\nexport {\n PlayerAnalyticsConnector,\n IPlayerAnalyticsConnectorInitOptions,\n} from \"./src/PlayerAnalyticsConnector\";\n"],"names":[],"version":3,"file":"types.d.ts.map"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eyevinn/player-analytics-client-sdk-web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "EPAS Client SDK for Web",
|
|
5
5
|
"source": "index.ts",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"module": "dist/module.js",
|
|
8
8
|
"types": "dist/types.d.ts",
|
|
9
|
+
"targets": {
|
|
10
|
+
"demo": {
|
|
11
|
+
"distDir": "./site",
|
|
12
|
+
"source": "./demo/index.html",
|
|
13
|
+
"publicUrl": "/"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
9
16
|
"scripts": {
|
|
10
|
-
"start": "parcel demo
|
|
17
|
+
"start": "parcel --target demo",
|
|
11
18
|
"build": "rm -rf ./dist && parcel build index.ts && tsc",
|
|
12
|
-
"
|
|
19
|
+
"build:demo": "NODE_OPTIONS='--no-experimental-fetch' parcel build --target demo",
|
|
13
20
|
"prettier": "prettier --write './src/**/*.{ts,js,json,html}'",
|
|
14
21
|
"postversion": "git push --no-verify && git push --tags --no-verify"
|
|
15
22
|
},
|
|
@@ -25,9 +32,9 @@
|
|
|
25
32
|
},
|
|
26
33
|
"homepage": "https://github.com/Eyevinn/player-analytics-client-sdk-web#readme",
|
|
27
34
|
"devDependencies": {
|
|
28
|
-
"@parcel/packager-ts": "^2.
|
|
29
|
-
"@parcel/transformer-typescript-tsc": "^2.
|
|
30
|
-
"@parcel/transformer-typescript-types": "^2.
|
|
35
|
+
"@parcel/packager-ts": "^2.13.3",
|
|
36
|
+
"@parcel/transformer-typescript-tsc": "^2.13.3",
|
|
37
|
+
"@parcel/transformer-typescript-types": "^2.13.3",
|
|
31
38
|
"@typescript-eslint/eslint-plugin": "^5.10.2",
|
|
32
39
|
"@typescript-eslint/parser": "^5.10.2",
|
|
33
40
|
"eslint": "^8.5.0",
|
|
@@ -38,7 +45,7 @@
|
|
|
38
45
|
"typescript": "^4.5.4"
|
|
39
46
|
},
|
|
40
47
|
"dependencies": {
|
|
41
|
-
"@eyevinn/
|
|
42
|
-
"@eyevinn/
|
|
48
|
+
"@eyevinn/media-event-filter": "^3.4.1",
|
|
49
|
+
"@eyevinn/player-analytics-specification": "0.5.0"
|
|
43
50
|
}
|
|
44
51
|
}
|
package/pipeline.png
ADDED
|
Binary file
|