@eyevinn/player-analytics-client-sdk-web 0.1.0 → 0.1.3

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/.eslintrc.yml CHANGED
@@ -1,7 +1,6 @@
1
1
  env:
2
2
  browser: true
3
3
  es6: true
4
- jest/globals: true
5
4
 
6
5
  extends:
7
6
  - eslint-config-prettier
@@ -11,7 +10,6 @@ extends:
11
10
 
12
11
  plugins:
13
12
  - prettier
14
- - jest
15
13
  - "@typescript-eslint"
16
14
 
17
15
  globals:
package/Readme.md CHANGED
@@ -14,20 +14,18 @@ npm install @eyevinn/player-analytics-client-sdk-web
14
14
  import { PlayerAnalyticsConnector } from "@eyevinn/player-analytics-client-sdk-web";
15
15
 
16
16
  // Create your instance and set the analytics eventsink endpoint
17
- const playerAnalytics = new PlayerAnalyticsConnector("https://your-eventsink-url.io");
17
+ const playerAnalytics = new PlayerAnalyticsConnector(
18
+ "https://your-eventsink-url.io"
19
+ );
18
20
 
19
21
  // Initiate the analytics with the base data needed
20
22
  // This will create you session in the backend
21
23
  try {
22
24
  await playerAnalytics.init({
23
25
  sessionId: "generated-unique-uuid-session-id",
24
- live: false,
25
- contentId: "big-buck-bunny-720",
26
- contentUrl:
27
- "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_1MB.mp4",
28
26
  });
29
27
 
30
- // Get you video element from the site, or your video player of choice
28
+ // Get your video element from the site, or your video player of choice
31
29
  const videoElement = document.querySelector("video");
32
30
  // Load the analytics library with the video element to fetch the events
33
31
  playerAnalytics.load(videoElement);
@@ -42,11 +40,11 @@ Due to bitrate changes not being reported, and errors not being reported in any
42
40
 
43
41
  ```js
44
42
  playerAnalytics.reportBitrateChange({
45
- bitrate: "", // bitrate in Kbps
46
- width: "", // optional, video width in pixels
47
- height: "", // optional, video height in pixels
48
- videoBitrate: "", // optional, if available provide the bitrate for the video track
49
- audioBitrate: "", // optional, if available provide the bitrate for the audio track
43
+ bitrate: 246.440, // bitrate in Kbps
44
+ width: 320, // optional, video width in pixels
45
+ height: 136, // optional, video height in pixels
46
+ videoBitrate: 0, // optional, if available provide the bitrate for the video track
47
+ audioBitrate: 0, // optional, if available provide the bitrate for the audio track
50
48
  });
51
49
  ```
52
50
 
@@ -96,10 +94,9 @@ videoElement.addEventListener("play", () => {
96
94
  timestamp: Date.now(),
97
95
  playhead: 0,
98
96
  duration: 3600,
99
- sessionId: "generated-unique-uuid-session-id"
97
+ sessionId: "generated-unique-uuid-session-id",
100
98
  });
101
99
  });
102
-
103
100
  ```
104
101
 
105
102
  ### Report Metadata
@@ -108,33 +105,41 @@ You can report your metadata at a later stage in your code and tailor ther callb
108
105
  In this example we're using hls.js
109
106
 
110
107
  ```js
111
- import Hls from "hls.js"
108
+ import Hls from "hls.js";
112
109
  import { PlayerAnalyticsConnector } from "@eyevinn/player-analytics-client-sdk-web";
113
110
 
114
111
  // Create your instance and set the analytics eventsink endpoint
115
112
  const playerAnalytics = new PlayerAnalytics("https://your-eventsink-url.io");
116
113
  await playerAnalytics.initiateAnalyticsReporter({
117
114
  sessionId: "generated-unique-uuid-session-id",
118
- contentId: "big-buck-bunny-720",
119
- contentUrl:
120
- "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_1MB.mp4",
121
115
  });
122
116
 
123
117
  const hls = new Hls();
124
118
  const videoElement = document.querySelector("video");
125
119
 
126
- hls.attachMedia(videoElement)
127
- hls.load(src)
120
+ hls.attachMedia(videoElement);
121
+ hls.load(src);
128
122
  hls.on(Hls.Events.LEVEL_LOADED, (event, data) => {
129
123
  playerAnalytics.metadata({
130
- event: "metadata",
131
- payload: {
132
- isLive: data?.details?.level?.live
133
- }
134
- })
135
- })
124
+ live: data?.details?.level?.live,
125
+ });
126
+ });
127
+ ```
136
128
 
129
+ These are the available keys for metadata, which can be sent anytime between a `init` and a `stopped` call.
137
130
 
131
+ ```ts
132
+ export interface TMetadataEventPayload {
133
+ live?: boolean;
134
+ contentTitle?: string;
135
+ contentId?: string;
136
+ contentUrl?: string;
137
+ drmType?: string;
138
+ userId?: string;
139
+ deviceId?: string;
140
+ deviceModel?: string;
141
+ deviceType?: string;
142
+ }
138
143
  ```
139
144
 
140
145
  ### Constructor parameters
@@ -149,14 +154,7 @@ These applies to both the `PlayerAnalyticsConnector` and `PlayerAnalytics`.
149
154
  ```ts
150
155
  export interface IPlayerAnalyticsInitOptions {
151
156
  sessionId?: string; // should be generated by the backend if not sent in
152
- live?: boolean;
153
- contentId: string;
154
- contentUrl: string;
155
- drmType?: string;
156
- userId?: string;
157
- deviceId?: string;
158
- deviceModel?: string;
159
- deviceType?: string;
157
+ hearbeatInterval?: number; //Defaults to 30_000 (ms)
160
158
  }
161
159
  ```
162
160
 
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { PlayerAnalytics, IPlayerAnalyticsInitOptions, } from "./src/PlayerAnalytics";
2
- export { PlayerAnalyticsConnector, IPlayerAnalyticsConnectorInitOptions } from "./src/PlayerAnalyticsConnector";
2
+ export { PlayerAnalyticsConnector, IPlayerAnalyticsConnectorInitOptions, } from "./src/PlayerAnalyticsConnector";
package/dist/index.js CHANGED
@@ -712,6 +712,10 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
712
712
  default:
713
713
  break;
714
714
  }
715
+ if (!_this.analyticsInitiated) {
716
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
717
+ return;
718
+ }
715
719
  _this.playerAnalytics[eventType]($c2e08ff125b5bcd1$var$__assign($c2e08ff125b5bcd1$var$__assign({
716
720
  event: eventType
717
721
  }, _this.playbackState()), Object.keys(extraData).length > 0 && {
@@ -732,6 +736,10 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
732
736
  clearInterval(this.heartbeatIntervalTimer);
733
737
  };
734
738
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.reportBitrateChange = function(payload) {
739
+ if (!this.analyticsInitiated) {
740
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
741
+ return;
742
+ }
735
743
  this.playerAnalytics.bitrateChanged($c2e08ff125b5bcd1$var$__assign($c2e08ff125b5bcd1$var$__assign({
736
744
  event: $e8f16a459684b36f$export$342d7dbd8323f55e.bitratechanged
737
745
  }, this.playbackState()), {
@@ -739,6 +747,10 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
739
747
  }));
740
748
  };
741
749
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.reportStop = function() {
750
+ if (!this.analyticsInitiated) {
751
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
752
+ return;
753
+ }
742
754
  this.playerAnalytics.stopped($c2e08ff125b5bcd1$var$__assign($c2e08ff125b5bcd1$var$__assign({
743
755
  event: $e8f16a459684b36f$export$342d7dbd8323f55e.ended
744
756
  }, this.playbackState()), {
@@ -749,6 +761,10 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
749
761
  this.stopInterval();
750
762
  };
751
763
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.reportError = function(error) {
764
+ if (!this.analyticsInitiated) {
765
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
766
+ return;
767
+ }
752
768
  this.playerAnalytics.error($c2e08ff125b5bcd1$var$__assign($c2e08ff125b5bcd1$var$__assign({
753
769
  event: $e8f16a459684b36f$export$342d7dbd8323f55e.error
754
770
  }, this.playbackState()), {
@@ -764,6 +780,10 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
764
780
  this.stopInterval();
765
781
  };
766
782
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.reportMetadata = function(payload) {
783
+ if (!this.analyticsInitiated) {
784
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
785
+ return;
786
+ }
767
787
  this.playerAnalytics.metadata($c2e08ff125b5bcd1$var$__assign($c2e08ff125b5bcd1$var$__assign({
768
788
  event: $e8f16a459684b36f$export$342d7dbd8323f55e.metadata
769
789
  }, this.playbackState()), {
@@ -771,6 +791,10 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
771
791
  }));
772
792
  };
773
793
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.reportWarning = function(payload) {
794
+ if (!this.analyticsInitiated) {
795
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
796
+ return;
797
+ }
774
798
  this.playerAnalytics.warning($c2e08ff125b5bcd1$var$__assign($c2e08ff125b5bcd1$var$__assign({
775
799
  event: $e8f16a459684b36f$export$342d7dbd8323f55e.warning
776
800
  }, this.playbackState()), {
@@ -778,9 +802,9 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
778
802
  }));
779
803
  };
780
804
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.playbackState = function() {
781
- var _a, _b, _c, _d;
782
- var playhead = !((_a = this.player) === null || _a === void 0 ? void 0 : _a.currentTime) && ((_b = this.player) === null || _b === void 0 ? void 0 : _b.currentTime) !== 0 ? -1 : this.player.currentTime || 0;
783
- var duration = !((_c = this.player) === null || _c === void 0 ? void 0 : _c.duration) && ((_d = this.player) === null || _d === void 0 ? void 0 : _d.duration) !== 0 ? -1 : this.player.duration || 0;
805
+ var _a, _b, _c, _d, _e;
806
+ var duration = ((_a = this.player) === null || _a === void 0 ? void 0 : _a.duration) && ((_b = this.player) === null || _b === void 0 ? void 0 : _b.duration) !== Infinity && ((_c = this.player) === null || _c === void 0 ? void 0 : _c.duration) > 0 ? this.player.duration : -1;
807
+ var playhead = ((_d = this.player) === null || _d === void 0 ? void 0 : _d.currentTime) && duration !== -1 ? (_e = this.player) === null || _e === void 0 ? void 0 : _e.currentTime : -1;
784
808
  return {
785
809
  sessionId: this.sessionId,
786
810
  timestamp: Date.now(),
@@ -789,14 +813,20 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
789
813
  };
790
814
  };
791
815
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.deinit = function() {
792
- if (!this.analyticsInitiated) return;
816
+ if (!this.analyticsInitiated) {
817
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
818
+ return;
819
+ }
793
820
  this.stopInterval();
794
821
  this.heartbeatInterval = null;
795
822
  this.videoEventFilter && this.videoEventFilter.removeEventListener("*", this.videoEventListener);
796
823
  this.videoEventFilter = null;
797
824
  };
798
825
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.destroy = function() {
799
- if (!this.analyticsInitiated) return;
826
+ if (!this.analyticsInitiated) {
827
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
828
+ return;
829
+ }
800
830
  this.playerAnalytics.destroy();
801
831
  this.heartbeatInterval = null;
802
832
  this.videoEventFilter && this.videoEventFilter.removeEventListener("*", this.videoEventListener);
package/dist/index.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,+EAAW,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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AAC,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,EAAE,MAAA,CAAO,OAAO,CAAC,IAAI,CAAC,CAAsD,uDAAE,IAAI;QACvG,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,CA7FA;;;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;AJSA,GAAA,CAAA,yCAAA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CAAA;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,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;AMVA,GAAA,CAAA,yCAAA,GAAA,QAAA,GAAA,CAAA;aAcE,yCAAA,CAAY,YAAoB,EAAE,KAAe,EAAjD,CAAA;QARQ,IAAA,CAAA,kBAAkB,GAAY,KAAK;QASzC,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,CAAC,SAAS;wBAEhC,MAAA,CAAA,CAAA;AAAA,6BAAA,AAAA,CAAA,AAAA,EAAA,AAAA,KAAA,AAAA,EAAA;4BAAM,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAA,8BAAA,CAAA,CAAA;gCAClD,SAAS,EAAE,IAAI,CAAC,SAAS;4BAAA,CAAA,EACtB,OAAO;wBACV,CAAA;oB,I,C,C;wBAJE,EAAA,GACJ,EAAA,CAAA,IAAA,IADM,iBAAiB,GAAA,EAAA,CAAA,iBAAA,EAAE,WAAW,GAAA,EAAA,CAAA,WAAA;wBAMtC,IAAI,CAAC,kBAAkB,GAAG,WAAW;wBACrC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB;wB,M,C,C;A,6B,A,C,A,E,A,M,A,E;wB,C;;Y,C;Q,C;IAC3C,CAAA;IAEM,yCAAA,CAAA,SAAA,CAAA,IAAI,GAAX,QAAA,CAAY,MAAwB,EAA7B,CAAA;QACL,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAA,8BAAA,CAAA,CAAA;YAC1B,KAAK,EAAE,yCAAU,CAAC,OAAO;QAAA,CAAA,EACtB,IAAI,CAAC,aAAa;QAEvB,IAAI,CAAC,wBAAwB;IAC/B,CAAC;IAEO,yCAAA,CAAA,SAAA,CAAA,wBAAwB,GAAhC,QAAQ,GAAA,CAAA;QAAR,GAAA,CAAA,KAAA,GAAA,IAAA;QACE,EAAA,GAAK,IAAI,CAAC,MAAM,EAAE,MAAA;QAClB,IAAI,CAAC,gBAAgB,GAAG,GAAA,CAAI,+CAAgB,CAAC,IAAI,CAAC,MAAM;QACxD,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CACpC,CAAG,IACF,IAAI,CAAC,kBAAkB,GAAG,QAAA,CAAC,KAAmB,EAFjD,CAAA;YAGI,EAAA,GAAK,MAAM,CAAC,IAAI,CAAC,yCAAU,EAAE,QAAQ,CAAC,KAAK,GAAG,MAAA;YAC9C,GAAA,CAAI,SAAS;YACb,GAAA,CAAM,SAAS,GAAG,CAAA;YAAA,CAAE;YACpB,EAAA,GAAK,KAAK,EAAE,MAAA;YACZ,MAAA,CAAQ,KAAK;gBACX,IAAA,CAAK,2CAAY,CAAC,MAAM;oBACtB,SAAS,GAAG,yCAAU,CAAC,MAAM;oBAC7B,KAAA;gBACF,IAAA,CAAK,2CAAY,CAAC,OAAO;oBACvB,SAAS,GAAG,yCAAU,CAAC,OAAO;oBAC9B,KAAA;gBACF,IAAA,CAAK,2CAAY,CAAC,IAAI;gBACtB,IAAA,CAAK,2CAAY,CAAC,MAAM;oBACtB,SAAS,GAAG,yCAAU,CAAC,IAAI;oBAC3B,KAAI,CAAC,aAAa;oBAClB,KAAA;gBACF,IAAA,CAAK,2CAAY,CAAC,KAAK;oBACrB,SAAS,GAAG,yCAAU,CAAC,KAAK;oBAC5B,KAAA;gBACF,IAAA,CAAK,2CAAY,CAAC,OAAO;oBACvB,SAAS,GAAG,yCAAU,CAAC,OAAO;oBAC9B,KAAA;gBACF,IAAA,CAAK,2CAAY,CAAC,MAAM;oBACtB,SAAS,GAAG,yCAAU,CAAC,MAAM;oBAC7B,KAAA;gBACF,IAAA,CAAK,2CAAY,CAAC,SAAS;oBACzB,SAAS,GAAG,yCAAU,CAAC,SAAS;oBAChC,KAAA;gBACF,IAAA,CAAK,2CAAY,CAAC,QAAQ;oBACxB,SAAS,GAAG,yCAAU,CAAC,QAAQ;oBAC/B,KAAA;gBACF,IAAA,CAAK,2CAAY,CAAC,KAAK;oBACrB,SAAS,GAAG,yCAAU,CAAC,KAAK;oBAC3B,SAAiB,CAAC,MAAM,GAAG,CAAO;oBACnC,KAAI,CAAC,YAAY;oBACjB,KAAA;gBACF,IAAA,CAAK,2CAAY,CAAC,KAAK;oBACrB,SAAS,GAAG,yCAAU,CAAC,KAAK;oBAC3B,SAAiB,CAAC,MAAM,GAAG,CAAO;oBACnC,KAAI,CAAC,YAAY;oBACjB,KAAA;;oBAEA,KAAA;;YAEJ,KAAI,CAAC,eAAe,CAAC,SAAS,EAAC,8BAAA,CAAA,8BAAA,CAAA,CAAA;gBAC7B,KAAK,EAAE,SAAS;YAAA,CAAA,EACb,KAAI,CAAC,aAAa,KACjB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,IAAI,CAAA;gBAAE,OAAO,EAAE,SAAS;YAAA,CAAE;QAEnE,CAAC;IAEL,CAAC;IAEO,yCAAA,CAAA,SAAA,CAAA,aAAa,GAArB,QAAQ,GAAA,CAAA;QAAR,GAAA,CAAA,KAAA,GAAA,IAAA;QACE,EAAA,EAAI,IAAI,CAAC,sBAAsB,EAAE,MAAA;QACjC,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC,QAA1C,GAAA,CAAA;YACE,KAAI,CAAC,eAAe,CAAC,SAAS,CAAA,8BAAA,CAAA,CAAA;gBAC5B,KAAK,EAAE,yCAAU,CAAC,SAAS;YAAA,CAAA,EACxB,KAAI,CAAC,aAAa;QAEzB,CAAC,EAAE,IAAI,CAAC,iBAAiB;IAC3B,CAAC;IAEO,yCAAA,CAAA,SAAA,CAAA,YAAY,GAApB,QAAQ,GAAA,CAAA;QACN,aAAa,CAAC,IAAI,CAAC,sBAAsB;IAC3C,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,mBAAmB,GAA1B,QAAA,CAA2B,OAAoC,EAAxD,CAAA;QACL,IAAI,CAAC,eAAe,CAAC,cAAc,CAAA,8BAAA,CAAA,8BAAA,CAAA,CAAA;YACjC,KAAK,EAAE,yCAAU,CAAC,cAAc;QAAA,CAAA,EAC7B,IAAI,CAAC,aAAa,KAAE,CAAA;YACvB,OAAO,EAAA,OAAA;QAAA,CAAA;IAEX,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,UAAU,GAAjB,QAAO,GAAA,CAAA;QACL,IAAI,CAAC,eAAe,CAAC,OAAO,CAAA,8BAAA,CAAA,8BAAA,CAAA,CAAA;YAC1B,KAAK,EAAE,yCAAU,CAAC,KAAK;QAAA,CAAA,EACpB,IAAI,CAAC,aAAa,KAAE,CAAA;YACvB,OAAO,EAAE,CAAA;gBAAE,MAAM,EAAE,CAAS;YAAA,CAAE;QAAA,CAAA;QAEhC,IAAI,CAAC,YAAY;IACnB,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,WAAW,GAAlB,QAAA,CAAmB,KAAyB,EAArC,CAAA;QACL,IAAI,CAAC,eAAe,CAAC,KAAK,CAAA,8BAAA,CAAA,8BAAA,CAAA,CAAA;YACxB,KAAK,EAAE,yCAAU,CAAC,KAAK;QAAA,CAAA,EACpB,IAAI,CAAC,aAAa,KAAE,CAAA;YACvB,OAAO,EAAE,KAAK;QAAA,CAAA;QAEhB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAA,8BAAA,CAAA,8BAAA,CAAA,CAAA;YAC1B,KAAK,EAAE,yCAAU,CAAC,KAAK;QAAA,CAAA,EACpB,IAAI,CAAC,aAAa,KAAE,CAAA;YACvB,OAAO,EAAE,CAAA;gBAAE,MAAM,EAAE,CAAO;YAAA,CAAE;QAAA,CAAA;QAE9B,IAAI,CAAC,YAAY;IACnB,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,cAAc,GAArB,QAAA,CAAsB,OAA8B,EAA7C,CAAA;QACL,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAA,8BAAA,CAAA,8BAAA,CAAA,CAAA;YAC3B,KAAK,EAAE,yCAAU,CAAC,QAAQ;QAAA,CAAA,EACvB,IAAI,CAAC,aAAa,KAAE,CAAA;YACvB,OAAO,EAAA,OAAA;QAAA,CAAA;IAEX,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,aAAa,GAApB,QAAA,CAAqB,OAA2B,EAAzC,CAAA;QACL,IAAI,CAAC,eAAe,CAAC,OAAO,CAAA,8BAAA,CAAA,8BAAA,CAAA,CAAA;YAC1B,KAAK,EAAE,yCAAU,CAAC,OAAO;QAAA,CAAA,EACtB,IAAI,CAAC,aAAa,KAAE,CAAA;YACvB,OAAO,EAAA,OAAA;QAAA,CAAA;IAEX,CAAC;IAEO,yCAAA,CAAA,SAAA,CAAA,aAAa,GAArB,QAAQ,GAAA,CAAA;Q,G,C,E,E,E,E,E,E,E;QACN,GAAA,CAAM,QAAQ,MACX,EAAA,GAAA,IAAI,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,IAAA,CAAA,CAAA,GAAA,IAAA,CAAA,CAAA,GAAA,EAAA,CAAE,WAAW,OAAI,EAAA,GAAA,IAAI,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,IAAA,CAAA,CAAA,GAAA,IAAA,CAAA,CAAA,GAAA,EAAA,CAAE,WAAW,MAAK,CAAC,GACvD,EAAE,GACF,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC;QAClC,GAAA,CAAM,QAAQ,MACX,EAAA,GAAA,IAAI,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,IAAA,CAAA,CAAA,GAAA,IAAA,CAAA,CAAA,GAAA,EAAA,CAAE,QAAQ,OAAI,EAAA,GAAA,IAAI,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,IAAA,CAAA,CAAA,GAAA,IAAA,CAAA,CAAA,GAAA,EAAA,CAAE,QAAQ,MAAK,CAAC,GACjD,EAAE,GACF,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC;QAC/B,MAAA,CAAO,CAAP;YACE,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,GAAG;YACnB,QAAQ,EAAA,QAAA;YACR,QAAQ,EAAA,QAAA;QACT,CAAA;IACH,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,MAAM,GAAb,QAAO,GAAA,CAAA;QACL,EAAA,GAAK,IAAI,CAAC,kBAAkB,EAAE,MAAA;QAC9B,IAAI,CAAC,YAAY;QACjB,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC7B,IAAI,CAAC,gBAAgB,IACrB,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAG,IAAE,IAAI,CAAC,kBAAkB;QACtE,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B,CAAC;IAEM,yCAAA,CAAA,SAAA,CAAA,OAAO,GAAd,QAAO,GAAA,CAAA;QACL,EAAA,GAAK,IAAI,CAAC,kBAAkB,EAAE,MAAA;QAC9B,IAAI,CAAC,eAAe,CAAC,OAAO;QAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC7B,IAAI,CAAC,gBAAgB,IACnB,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAG,IAAE,IAAI,CAAC,kBAAkB;QACxE,IAAI,CAAC,YAAY;IACnB,CAAC;IACH,MAAA,CAAA,yCAAC;AAAD,CAlMA;;","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 { PlayerAnalyticsConnector, IPlayerAnalyticsConnectorInitOptions } 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: boolean = 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;",null,"import { TInitEvent, TPlayerAnalyticsEvent } 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: boolean = 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(\n sessionId?: string,\n ): 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) return console.warn(\"[AnalyticsReporter] Cannot report before initiation:\", data);\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: boolean = 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 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 this.playerAnalytics.bitrateChanged({\n event: EPASEvents.bitratechanged,\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportStop() {\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 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 this.playerAnalytics.metadata({\n event: EPASEvents.metadata,\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportWarning(payload: TErrorEventPayload) {\n this.playerAnalytics.warning({\n event: EPASEvents.warning,\n ...this.playbackState(),\n payload,\n });\n }\n\n private playbackState(): TBaseEvent {\n const playhead =\n !this.player?.currentTime && this.player?.currentTime !== 0\n ? -1\n : this.player.currentTime || 0;\n const duration =\n !this.player?.duration && this.player?.duration !== 0\n ? -1\n : this.player.duration || 0;\n return {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead,\n duration,\n };\n }\n\n public deinit() {\n if (!this.analyticsInitiated) return;\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) return;\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":"index.js.map"}
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,+EAAW,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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AI,CAAC,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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EAAzB,CAAA;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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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":"index.js.map"}
package/dist/module.js CHANGED
@@ -704,6 +704,10 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
704
704
  default:
705
705
  break;
706
706
  }
707
+ if (!_this.analyticsInitiated) {
708
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
709
+ return;
710
+ }
707
711
  _this.playerAnalytics[eventType]($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
708
712
  event: eventType
709
713
  }, _this.playbackState()), Object.keys(extraData).length > 0 && {
@@ -724,6 +728,10 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
724
728
  clearInterval(this.heartbeatIntervalTimer);
725
729
  };
726
730
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.reportBitrateChange = function(payload) {
731
+ if (!this.analyticsInitiated) {
732
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
733
+ return;
734
+ }
727
735
  this.playerAnalytics.bitrateChanged($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
728
736
  event: $76abaee2435acae3$export$342d7dbd8323f55e.bitratechanged
729
737
  }, this.playbackState()), {
@@ -731,6 +739,10 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
731
739
  }));
732
740
  };
733
741
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.reportStop = function() {
742
+ if (!this.analyticsInitiated) {
743
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
744
+ return;
745
+ }
734
746
  this.playerAnalytics.stopped($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
735
747
  event: $76abaee2435acae3$export$342d7dbd8323f55e.ended
736
748
  }, this.playbackState()), {
@@ -741,6 +753,10 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
741
753
  this.stopInterval();
742
754
  };
743
755
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.reportError = function(error) {
756
+ if (!this.analyticsInitiated) {
757
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
758
+ return;
759
+ }
744
760
  this.playerAnalytics.error($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
745
761
  event: $76abaee2435acae3$export$342d7dbd8323f55e.error
746
762
  }, this.playbackState()), {
@@ -756,6 +772,10 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
756
772
  this.stopInterval();
757
773
  };
758
774
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.reportMetadata = function(payload) {
775
+ if (!this.analyticsInitiated) {
776
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
777
+ return;
778
+ }
759
779
  this.playerAnalytics.metadata($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
760
780
  event: $76abaee2435acae3$export$342d7dbd8323f55e.metadata
761
781
  }, this.playbackState()), {
@@ -763,6 +783,10 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
763
783
  }));
764
784
  };
765
785
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.reportWarning = function(payload) {
786
+ if (!this.analyticsInitiated) {
787
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
788
+ return;
789
+ }
766
790
  this.playerAnalytics.warning($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
767
791
  event: $76abaee2435acae3$export$342d7dbd8323f55e.warning
768
792
  }, this.playbackState()), {
@@ -770,9 +794,9 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
770
794
  }));
771
795
  };
772
796
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.playbackState = function() {
773
- var _a, _b, _c, _d;
774
- var playhead = !((_a = this.player) === null || _a === void 0 ? void 0 : _a.currentTime) && ((_b = this.player) === null || _b === void 0 ? void 0 : _b.currentTime) !== 0 ? -1 : this.player.currentTime || 0;
775
- var duration = !((_c = this.player) === null || _c === void 0 ? void 0 : _c.duration) && ((_d = this.player) === null || _d === void 0 ? void 0 : _d.duration) !== 0 ? -1 : this.player.duration || 0;
797
+ var _a, _b, _c, _d, _e;
798
+ var duration = ((_a = this.player) === null || _a === void 0 ? void 0 : _a.duration) && ((_b = this.player) === null || _b === void 0 ? void 0 : _b.duration) !== Infinity && ((_c = this.player) === null || _c === void 0 ? void 0 : _c.duration) > 0 ? this.player.duration : -1;
799
+ var playhead = ((_d = this.player) === null || _d === void 0 ? void 0 : _d.currentTime) && duration !== -1 ? (_e = this.player) === null || _e === void 0 ? void 0 : _e.currentTime : -1;
776
800
  return {
777
801
  sessionId: this.sessionId,
778
802
  timestamp: Date.now(),
@@ -781,14 +805,20 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
781
805
  };
782
806
  };
783
807
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.deinit = function() {
784
- if (!this.analyticsInitiated) return;
808
+ if (!this.analyticsInitiated) {
809
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
810
+ return;
811
+ }
785
812
  this.stopInterval();
786
813
  this.heartbeatInterval = null;
787
814
  this.videoEventFilter && this.videoEventFilter.removeEventListener("*", this.videoEventListener);
788
815
  this.videoEventFilter = null;
789
816
  };
790
817
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.destroy = function() {
791
- if (!this.analyticsInitiated) return;
818
+ if (!this.analyticsInitiated) {
819
+ console.warn("[PlayerAnalyticsConnector] Analytics not initiated");
820
+ return;
821
+ }
792
822
  this.playerAnalytics.destroy();
793
823
  this.heartbeatInterval = null;
794
824
  this.videoEventFilter && this.videoEventFilter.removeEventListener("*", this.videoEventListener);
@@ -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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;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,EAAE,MAAA,CAAO,OAAO,CAAC,IAAI,CAAC,CAAsD,uDAAE,IAAI;QACvG,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,CA7FA;;;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;AJSA,GAAA,CAAA,yCAAA,GAAA,QA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L,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,C;Y,I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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 { PlayerAnalyticsConnector, IPlayerAnalyticsConnectorInitOptions } 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: boolean = 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;",null,"import { TInitEvent, TPlayerAnalyticsEvent } 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: boolean = 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(\n sessionId?: string,\n ): 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) return console.warn(\"[AnalyticsReporter] Cannot report before initiation:\", data);\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: boolean = 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 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 this.playerAnalytics.bitrateChanged({\n event: EPASEvents.bitratechanged,\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportStop() {\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 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 this.playerAnalytics.metadata({\n event: EPASEvents.metadata,\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportWarning(payload: TErrorEventPayload) {\n this.playerAnalytics.warning({\n event: EPASEvents.warning,\n ...this.playbackState(),\n payload,\n });\n }\n\n private playbackState(): TBaseEvent {\n const playhead =\n !this.player?.currentTime && this.player?.currentTime !== 0\n ? -1\n : this.player.currentTime || 0;\n const duration =\n !this.player?.duration && this.player?.duration !== 0\n ? -1\n : this.player.duration || 0;\n return {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead,\n duration,\n };\n }\n\n public deinit() {\n if (!this.analyticsInitiated) return;\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) return;\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":";;;;;;;;;;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 +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;IAkF7B,mBAAmB,CAAC,OAAO,EAAE,2BAA2B;IAQxD,UAAU;IASV,WAAW,CAAC,KAAK,EAAE,kBAAkB;IAcrC,cAAc,CAAC,OAAO,EAAE,qBAAqB;IAQ7C,aAAa,CAAC,OAAO,EAAE,kBAAkB;IAyBzC,MAAM;IASN,OAAO;CAQf","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;","import { TInitEvent, TPlayerAnalyticsEvent } 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: boolean = 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(\n sessionId?: string,\n ): 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) return console.warn(\"[AnalyticsReporter] Cannot report before initiation:\", data);\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: boolean = 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: boolean = 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 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 this.playerAnalytics.bitrateChanged({\n event: EPASEvents.bitratechanged,\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportStop() {\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 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 this.playerAnalytics.metadata({\n event: EPASEvents.metadata,\n ...this.playbackState(),\n payload,\n });\n }\n\n public reportWarning(payload: TErrorEventPayload) {\n this.playerAnalytics.warning({\n event: EPASEvents.warning,\n ...this.playbackState(),\n payload,\n });\n }\n\n private playbackState(): TBaseEvent {\n const playhead =\n !this.player?.currentTime && this.player?.currentTime !== 0\n ? -1\n : this.player.currentTime || 0;\n const duration =\n !this.player?.duration && this.player?.duration !== 0\n ? -1\n : this.player.duration || 0;\n return {\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead,\n duration,\n };\n }\n\n public deinit() {\n if (!this.analyticsInitiated) return;\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) return;\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 { PlayerAnalyticsConnector, IPlayerAnalyticsConnectorInitOptions } from \"./src/PlayerAnalyticsConnector\";\n"],"names":[],"version":3,"file":"types.d.ts.map"}
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"}
package/index.ts CHANGED
@@ -3,4 +3,7 @@ export {
3
3
  IPlayerAnalyticsInitOptions,
4
4
  } from "./src/PlayerAnalytics";
5
5
 
6
- export { PlayerAnalyticsConnector, IPlayerAnalyticsConnectorInitOptions } from "./src/PlayerAnalyticsConnector";
6
+ export {
7
+ PlayerAnalyticsConnector,
8
+ IPlayerAnalyticsConnectorInitOptions,
9
+ } from "./src/PlayerAnalyticsConnector";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eyevinn/player-analytics-client-sdk-web",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "EPAS Client SDK for Web",
5
5
  "source": "index.ts",
6
6
  "main": "dist/index.js",
@@ -39,6 +39,6 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@eyevinn/player-analytics-specification": "0.3.1",
42
- "@eyevinn/video-event-filter": "^1.1.0"
42
+ "@eyevinn/video-event-filter": "^1.1.5"
43
43
  }
44
44
  }