@eyevinn/player-analytics-client-sdk-web 0.0.14 → 0.0.17

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/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ The MIT License (MIT)
2
+ Copyright (c) 2021 Eyevinn Technology
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
+
6
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/Readme.md CHANGED
@@ -18,18 +18,24 @@ const playerAnalytics = new PlayerAnalyticsConnector("https://your-eventsink-url
18
18
 
19
19
  // Initiate the analytics with the base data needed
20
20
  // This will create you session in the backend
21
- await playerAnalytics.init({
22
- sessionId: "generated-unique-uuid-session-id",
23
- live: false,
24
- contentId: "big-buck-bunny-720",
25
- contentUrl:
26
- "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_1MB.mp4",
27
- });
21
+ try {
22
+ await playerAnalytics.init({
23
+ 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
+ });
28
29
 
29
- // Get you video element from the site, or your video player of choice
30
- const videoElement = document.querySelector("video");
31
- // Load the analytics library with the video element to fetch the events
32
- playerAnalytics.load(videoElement);
30
+ // Get you video element from the site, or your video player of choice
31
+ const videoElement = document.querySelector("video");
32
+ // Load the analytics library with the video element to fetch the events
33
+ playerAnalytics.load(videoElement);
34
+ } catch (err) {
35
+ console.error(err);
36
+ // Remove event listeners and heartbeat timers if init fails.
37
+ playerAnalytics.deinit();
38
+ }
33
39
  ```
34
40
 
35
41
  Due to bitrate changes not being reported, and errors not being reported in any descriptive way, there is a possibility to do separate calls for these events - which you may trigger based on you video player of choice following these examples.
@@ -77,7 +83,6 @@ import { PlayerAnalytics } from "@eyevinn/player-analytics-client-sdk-web";
77
83
  const playerAnalytics = new PlayerAnalytics("https://your-eventsink-url.io");
78
84
  await playerAnalytics.initiateAnalyticsReporter({
79
85
  sessionId: "generated-unique-uuid-session-id",
80
- live: false,
81
86
  contentId: "big-buck-bunny-720",
82
87
  contentUrl:
83
88
  "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_1MB.mp4",
@@ -94,6 +99,42 @@ videoElement.addEventListener("play", () => {
94
99
  sessionId: "generated-unique-uuid-session-id"
95
100
  });
96
101
  });
102
+
103
+ ```
104
+
105
+ ### Report Metadata
106
+
107
+ You can report your metadata at a later stage in your code and tailor ther callbacks for your tech stach, for example when you have parsed your manifest.
108
+ In this example we're using hls.js
109
+
110
+ ```js
111
+ import Hls from "hls.js"
112
+ import { PlayerAnalyticsConnector } from "@eyevinn/player-analytics-client-sdk-web";
113
+
114
+ // Create your instance and set the analytics eventsink endpoint
115
+ const playerAnalytics = new PlayerAnalytics("https://your-eventsink-url.io");
116
+ await playerAnalytics.initiateAnalyticsReporter({
117
+ 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
+ });
122
+
123
+ const hls = new Hls();
124
+ const videoElement = document.querySelector("video");
125
+
126
+ hls.attachMedia(videoElement)
127
+ hls.load(src)
128
+ hls.on(Hls.Events.LEVEL_LOADED, (event, data) => {
129
+ playerAnalytics.metadata({
130
+ event: "metadata",
131
+ payload: {
132
+ isLive: data?.details?.level?.live
133
+ }
134
+ })
135
+ })
136
+
137
+
97
138
  ```
98
139
 
99
140
  ### Constructor parameters
@@ -108,7 +149,7 @@ These applies to both the `PlayerAnalyticsConnector` and `PlayerAnalytics`.
108
149
  ```ts
109
150
  export interface IPlayerAnalyticsInitOptions {
110
151
  sessionId?: string; // should be generated by the backend if not sent in
111
- live: boolean;
152
+ live?: boolean;
112
153
  contentId: string;
113
154
  contentUrl: string;
114
155
  drmType?: string;
@@ -122,3 +163,17 @@ export interface IPlayerAnalyticsInitOptions {
122
163
  ## Development
123
164
 
124
165
  Run the demo page by `npm start`
166
+
167
+ ## Release
168
+
169
+ - Pull latest master
170
+ - `npm version patch | minor | major`
171
+ - This triggers an update of the version in package.json + creates a tag with that version number
172
+ - This will automatically be pushed to Github upon success.
173
+ - At github.com go to releases (far right)
174
+ - click "Draft a new release"
175
+ - choose your tag
176
+ - give it a name (preferably your version number, e.g. `v0.0.1`)
177
+ - click "Auto-generate release notes"
178
+ - click "Publish release"
179
+ - A Github Action is triggered to do the releases towards the npmjs and github packages repositories.
package/dist/index.js CHANGED
@@ -26,10 +26,17 @@ var $e8f16a459684b36f$export$342d7dbd8323f55e;
26
26
  $e8f16a459684b36f$export$342d7dbd8323f55e["error"] = "error";
27
27
  $e8f16a459684b36f$export$342d7dbd8323f55e["warning"] = "warning";
28
28
  $e8f16a459684b36f$export$342d7dbd8323f55e["bitratechanged"] = "bitrate_changed";
29
- $e8f16a459684b36f$export$342d7dbd8323f55e["heartbeat"] = "hearbeat";
29
+ $e8f16a459684b36f$export$342d7dbd8323f55e["heartbeat"] = "heartbeat";
30
+ $e8f16a459684b36f$export$342d7dbd8323f55e["metadata"] = "metadata";
30
31
  })($e8f16a459684b36f$export$342d7dbd8323f55e || ($e8f16a459684b36f$export$342d7dbd8323f55e = {
31
32
  }));
32
33
  var $e8f16a459684b36f$export$31c453b5fe09788d = 30000;
34
+ var $5877957b28d0984a$exports = {};
35
+ $5877957b28d0984a$exports = JSON.parse("{\"name\":\"@eyevinn/player-analytics-specification\",\"version\":\"0.3.1\",\"description\":\"Eyevinn Player Analytics Specification\",\"main\":\"index.js\",\"types\":\"./specification/typescript/index.ts\",\"repository\":\"git@github.com:Eyevinn/player-analytics-specification.git\",\"author\":\"Eyevinn Technology <work@eyevinn.se>\",\"contributors\":[\"Martin <901824+martinstark@users.noreply.github.com>\"],\"license\":\"Apache License 2.0\",\"scripts\":{\"typedoc\":\"typedoc\",\"json\":\"typescript-json-schema specification/typescript/index.ts \\\"*\\\" --noExtraProps --required\"},\"dependencies\":{\"typedoc\":\"^0.22.8\",\"typescript\":\"^4.4.4\",\"typescript-json-schema\":\"^0.51.0\"}}");
36
+
37
+
38
+ var $e8f16a459684b36f$require$version = $5877957b28d0984a$exports.version;
39
+ var $e8f16a459684b36f$export$8a65ed80196068d4 = $e8f16a459684b36f$require$version;
33
40
 
34
41
 
35
42
  var $4cb1735bdc43624b$exports = {};
@@ -170,13 +177,14 @@ var $4cb1735bdc43624b$var$__generator = undefined && undefined.__generator || fu
170
177
  };
171
178
  var $4cb1735bdc43624b$export$957313a2f485e5ed = function() {
172
179
  function $4cb1735bdc43624b$export$957313a2f485e5ed(options) {
180
+ this.isInitiated = false;
173
181
  this.debug = options.debug;
174
182
  this.eventsinkUrl = options.eventsinkUrl;
175
183
  this.sessionId = options.sessionId;
176
184
  this.heartbeatInterval = options.heartbeatInterval || $e8f16a459684b36f$export$31c453b5fe09788d;
177
185
  if (this.debug) console.log("[AnalyticsReporter] Initiated AnalyticsReporter", options);
178
186
  }
179
- $4cb1735bdc43624b$export$957313a2f485e5ed.prototype.init = function(sessionId, payload) {
187
+ $4cb1735bdc43624b$export$957313a2f485e5ed.prototype.init = function(sessionId) {
180
188
  return $4cb1735bdc43624b$var$__awaiter(this, void 0, Promise, function() {
181
189
  var data, initResponse, initResponseJson;
182
190
  return $4cb1735bdc43624b$var$__generator(this, function(_a) {
@@ -188,19 +196,20 @@ var $4cb1735bdc43624b$export$957313a2f485e5ed = function() {
188
196
  sessionId: this.sessionId,
189
197
  timestamp: Date.now(),
190
198
  playhead: -1,
191
- duration: -1,
192
- payload: payload
199
+ duration: -1
193
200
  };
194
201
  if (!this.debug) return [
195
202
  3 /*break*/ ,
196
203
  1
197
204
  ];
198
205
  console.log("[AnalyticsReporter] Init session:", data);
206
+ this.isInitiated = true;
199
207
  return [
200
208
  2 /*return*/ ,
201
209
  {
202
210
  sessionId: this.sessionId,
203
- heartbeatInterval: this.heartbeatInterval
211
+ heartbeatInterval: this.heartbeatInterval,
212
+ isInitiated: this.isInitiated
204
213
  }
205
214
  ];
206
215
  case 1:
@@ -211,7 +220,9 @@ var $4cb1735bdc43624b$export$957313a2f485e5ed = function() {
211
220
  mode: "cors",
212
221
  cache: "no-cache",
213
222
  headers: {
214
- "Content-Type": "application/json; charset=utf-8"
223
+ "Content-Type": "application/json; charset=utf-8",
224
+ "X-EPAS-Event": data.event,
225
+ "X-EPAS-Version": $e8f16a459684b36f$export$8a65ed80196068d4
215
226
  },
216
227
  body: JSON.stringify(data)
217
228
  })
@@ -226,14 +237,14 @@ var $4cb1735bdc43624b$export$957313a2f485e5ed = function() {
226
237
  case 3:
227
238
  initResponseJson = _a.sent();
228
239
  if (!this.sessionId && !initResponseJson.sessionId) throw new Error("[AnalyticsReporter] init failed: no sessionId");
229
- if (!this.heartbeatInterval && !initResponseJson.heartbeatInterval) throw new Error("[AnalyticsReporter] init failed: heartbeatInterval not found in response");
230
- if (initResponseJson.heartbeatInterval) this.heartbeatInterval = initResponseJson.heartbeatInterval;
231
240
  if (initResponseJson.sessionId) this.sessionId = initResponseJson.sessionId;
241
+ this.isInitiated = true;
232
242
  return [
233
243
  2 /*return*/ ,
234
244
  {
235
245
  heartbeatInterval: this.heartbeatInterval,
236
- sessionId: this.sessionId
246
+ sessionId: this.sessionId,
247
+ isInitiated: this.isInitiated
237
248
  }
238
249
  ];
239
250
  }
@@ -241,6 +252,7 @@ var $4cb1735bdc43624b$export$957313a2f485e5ed = function() {
241
252
  });
242
253
  };
243
254
  $4cb1735bdc43624b$export$957313a2f485e5ed.prototype.send = function(data) {
255
+ if (!this.isInitiated) return console.warn("[AnalyticsReporter] Cannot report before initiation:", data);
244
256
  var payload = $4cb1735bdc43624b$var$__assign({
245
257
  sessionId: this.sessionId
246
258
  }, data);
@@ -250,7 +262,9 @@ var $4cb1735bdc43624b$export$957313a2f485e5ed = function() {
250
262
  mode: "cors",
251
263
  cache: "no-cache",
252
264
  headers: {
253
- "Content-Type": "application/json; charset=utf-8"
265
+ "Content-Type": "application/json; charset=utf-8",
266
+ "X-EPAS-Event": data.event,
267
+ "X-EPAS-Version": $e8f16a459684b36f$export$8a65ed80196068d4
254
268
  },
255
269
  body: JSON.stringify(payload)
256
270
  });
@@ -381,15 +395,6 @@ var $7d88e8cdd46a09a5$var$__generator = undefined && undefined.__generator || fu
381
395
  return this;
382
396
  }), g;
383
397
  };
384
- var $7d88e8cdd46a09a5$var$__rest = undefined && undefined.__rest || function(s, e) {
385
- var t = {
386
- };
387
- for(var p in s)if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
388
- if (s != null && typeof Object.getOwnPropertySymbols === "function") {
389
- for(var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++)if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
390
- }
391
- return t;
392
- };
393
398
  var $7d88e8cdd46a09a5$export$f76c463fe9cb9f15 = function() {
394
399
  function $7d88e8cdd46a09a5$export$f76c463fe9cb9f15(eventsinkUrl, debug) {
395
400
  this.debug = false;
@@ -397,32 +402,30 @@ var $7d88e8cdd46a09a5$export$f76c463fe9cb9f15 = function() {
397
402
  this.eventsinkUrl = eventsinkUrl;
398
403
  }
399
404
  $7d88e8cdd46a09a5$export$f76c463fe9cb9f15.prototype.initiateAnalyticsReporter = function(_a) {
400
- var sessionId = _a.sessionId, options = $7d88e8cdd46a09a5$var$__rest(_a, [
401
- "sessionId"
402
- ]);
405
+ var sessionId = _a.sessionId, _b = _a.heartbeatInterval, heartbeatInterval = _b === void 0 ? $e8f16a459684b36f$export$31c453b5fe09788d : _b;
403
406
  return $7d88e8cdd46a09a5$var$__awaiter(this, void 0, void 0, function() {
404
- var _b, generatedSessionId, heartbeatInterval;
405
- return $7d88e8cdd46a09a5$var$__generator(this, function(_c) {
406
- switch(_c.label){
407
+ var _c, generatedSessionId, isInitiated;
408
+ return $7d88e8cdd46a09a5$var$__generator(this, function(_d) {
409
+ switch(_d.label){
407
410
  case 0:
408
411
  this.analyticsReporter = new $4cb1735bdc43624b$exports.Reporter({
409
412
  sessionId: sessionId,
410
413
  eventsinkUrl: this.eventsinkUrl,
411
414
  debug: this.debug,
412
- heartbeatInterval: options.heartbeatInterval || $e8f16a459684b36f$export$31c453b5fe09788d
415
+ heartbeatInterval: heartbeatInterval
413
416
  });
414
- delete options.heartbeatInterval; // this should not be sent along as payload to the eventsink
415
417
  return [
416
418
  4 /*yield*/ ,
417
- this.analyticsReporter.init(sessionId, options)
419
+ this.analyticsReporter.init(sessionId)
418
420
  ];
419
421
  case 1:
420
- _b = _c.sent(), generatedSessionId = _b.sessionId, heartbeatInterval = _b.heartbeatInterval;
422
+ _c = _d.sent(), generatedSessionId = _c.sessionId, isInitiated = _c.isInitiated;
421
423
  return [
422
424
  2 /*return*/ ,
423
425
  {
424
426
  sessionId: generatedSessionId,
425
- heartbeatInterval: heartbeatInterval
427
+ heartbeatInterval: heartbeatInterval,
428
+ isInitiated: isInitiated
426
429
  }
427
430
  ];
428
431
  }
@@ -432,6 +435,9 @@ var $7d88e8cdd46a09a5$export$f76c463fe9cb9f15 = function() {
432
435
  $7d88e8cdd46a09a5$export$f76c463fe9cb9f15.prototype.init = function(data) {
433
436
  this.analyticsReporter.send(data);
434
437
  };
438
+ $7d88e8cdd46a09a5$export$f76c463fe9cb9f15.prototype.metadata = function(data) {
439
+ this.analyticsReporter.send(data);
440
+ };
435
441
  $7d88e8cdd46a09a5$export$f76c463fe9cb9f15.prototype.heartbeat = function(data) {
436
442
  this.analyticsReporter.send(data);
437
443
  };
@@ -621,14 +627,15 @@ var $c2e08ff125b5bcd1$var$__generator = undefined && undefined.__generator || fu
621
627
  };
622
628
  var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
623
629
  function $c2e08ff125b5bcd1$export$2daf9923c014a26e(eventsinkUrl, debug) {
630
+ this.analyticsInitiated = false;
624
631
  this.eventsinkUrl = eventsinkUrl;
625
632
  this.playerAnalytics = new $7d88e8cdd46a09a5$exports.PlayerAnalytics(this.eventsinkUrl, debug);
626
633
  }
627
634
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.init = function(options) {
628
635
  return $c2e08ff125b5bcd1$var$__awaiter(this, void 0, void 0, function() {
629
- var heartbeatInterval;
630
- return $c2e08ff125b5bcd1$var$__generator(this, function(_a) {
631
- switch(_a.label){
636
+ var _a, heartbeatInterval, isInitiated;
637
+ return $c2e08ff125b5bcd1$var$__generator(this, function(_b) {
638
+ switch(_b.label){
632
639
  case 0:
633
640
  this.sessionId = options.sessionId;
634
641
  return [
@@ -638,7 +645,8 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
638
645
  }, options))
639
646
  ];
640
647
  case 1:
641
- heartbeatInterval = _a.sent().heartbeatInterval;
648
+ _a = _b.sent(), heartbeatInterval = _a.heartbeatInterval, isInitiated = _a.isInitiated;
649
+ this.analyticsInitiated = isInitiated;
642
650
  this.heartbeatInterval = heartbeatInterval;
643
651
  return [
644
652
  2 /*return*/
@@ -716,7 +724,7 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
716
724
  if (this.heartbeatIntervalTimer) return;
717
725
  this.heartbeatIntervalTimer = setInterval(function() {
718
726
  _this.playerAnalytics.heartbeat($c2e08ff125b5bcd1$var$__assign({
719
- event: "heartbeat"
727
+ event: $e8f16a459684b36f$export$342d7dbd8323f55e.heartbeat
720
728
  }, _this.playbackState()));
721
729
  }, this.heartbeatInterval);
722
730
  };
@@ -755,6 +763,13 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
755
763
  }));
756
764
  this.stopInterval();
757
765
  };
766
+ $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.reportMetadata = function(payload) {
767
+ this.playerAnalytics.metadata($c2e08ff125b5bcd1$var$__assign($c2e08ff125b5bcd1$var$__assign({
768
+ event: $e8f16a459684b36f$export$342d7dbd8323f55e.metadata
769
+ }, this.playbackState()), {
770
+ payload: payload
771
+ }));
772
+ };
758
773
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.reportWarning = function(payload) {
759
774
  this.playerAnalytics.warning($c2e08ff125b5bcd1$var$__assign($c2e08ff125b5bcd1$var$__assign({
760
775
  event: $e8f16a459684b36f$export$342d7dbd8323f55e.warning
@@ -763,8 +778,9 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
763
778
  }));
764
779
  };
765
780
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.playbackState = function() {
766
- var playhead = !this.player.currentTime && this.player.currentTime !== 0 ? -1 : this.player.currentTime || 0;
767
- var duration = !this.player.duration && this.player.duration !== 0 ? -1 : this.player.duration || 0;
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;
768
784
  return {
769
785
  sessionId: this.sessionId,
770
786
  timestamp: Date.now(),
@@ -773,15 +789,17 @@ var $c2e08ff125b5bcd1$export$2daf9923c014a26e = function() {
773
789
  };
774
790
  };
775
791
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.deinit = function() {
792
+ if (!this.analyticsInitiated) return;
776
793
  this.stopInterval();
777
794
  this.heartbeatInterval = null;
778
- this.videoEventFilter.removeEventListener("*", this.videoEventListener);
795
+ this.videoEventFilter && this.videoEventFilter.removeEventListener("*", this.videoEventListener);
779
796
  this.videoEventFilter = null;
780
797
  };
781
798
  $c2e08ff125b5bcd1$export$2daf9923c014a26e.prototype.destroy = function() {
799
+ if (!this.analyticsInitiated) return;
782
800
  this.playerAnalytics.destroy();
783
801
  this.heartbeatInterval = null;
784
- this.videoEventFilter.removeEventListener("*", this.videoEventListener);
802
+ this.videoEventFilter && this.videoEventFilter.removeEventListener("*", this.videoEventListener);
785
803
  this.stopInterval();
786
804
  };
787
805
  return $c2e08ff125b5bcd1$export$2daf9923c014a26e;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":";;;;;;;;;;;;;AIAA,GAAA,CAAY,yCAeX;CAfD,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,CAAsB;AACxB,CAAC,EAfW,yCAAU,KAAV,yCAAU,GAAA,CAAA;AAAA,CAAA;AAiBf,GAAA,CAAM,yCAAkB,GAAG,KAAK;;;;;;;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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M,yCAAA,CAAA,SAAA,CAAA,IAAI,GAAX,QAAA,CAAY,IAA2B,EAAhC,CAAA;QACL,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;YAClD,CAAA;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;QAC7B,CAAA;IAEL,CAAC;IACH,MAAA,CAAA,yCAAC;AAAD,CA3FA;;;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;A,G,C,4B,0B,M,I,Q,C,C,E,C,E,C;I,G,C,C,G,C;I,C;I,G,C,G,C,C,I,C,C,E,E,M,C,S,C,c,C,I,C,C,E,C,K,C,C,O,C,C,I,C,E,C,C,C,I,C,C,C;I,E,E,C,I,I,I,M,C,M,C,qB,K,C,W,C;Q,G,C,G,C,C,G,C,E,C,G,M,C,qB,C,C,G,C,G,C,C,M,E,C,G,E,E,C,C,O,C,C,C,C,K,C,I,M,C,S,C,oB,C,I,C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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,CAzFA;;;;;;;;;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 { PlayerAnalyticsConnector, IPlayerAnalyticsConnectorInitOptions } from \"./src/PlayerAnalyticsConnector\";\n","import {\n PlayerAnalyticsClientModule,\n TBitrateChangedEvent,\n TBufferedEvent,\n TBufferingEvent,\n TErrorEvent,\n THeartbeatEvent,\n TInitEvent,\n TInitEventPayload,\n TLoadedEvent,\n TLoadingEvent,\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 live: boolean;\n contentId: string;\n contentUrl: string;\n drmType?: string;\n userId?: string;\n deviceId?: string;\n deviceModel?: string;\n deviceType?: string;\n}\n\nexport class PlayerAnalytics implements PlayerAnalyticsClientModule {\n private debug: boolean = false;\n private eventsinkUrl: string;\n private analyticsReporter: Reporter;\n\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.debug = debug;\n this.eventsinkUrl = eventsinkUrl;\n }\n\n public async initiateAnalyticsReporter({\n sessionId,\n ...options\n }: TInitEventPayload) {\n this.analyticsReporter = new Reporter({\n sessionId,\n eventsinkUrl: this.eventsinkUrl,\n debug: this.debug,\n heartbeatInterval: options.heartbeatInterval || HEARTBEAT_INTERVAL\n });\n delete options.heartbeatInterval; // this should not be sent along as payload to the eventsink\n const { sessionId: generatedSessionId, heartbeatInterval } =\n await this.analyticsReporter.init(sessionId, options);\n return { sessionId: generatedSessionId, heartbeatInterval };\n }\n\n public init(data: TInitEvent): 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 = \"hearbeat\",\n}\n\nexport const HEARTBEAT_INTERVAL = 30000;\n",null,"import { TPlayerAnalyticsEvent } from \"@eyevinn/player-analytics-specification\";\nimport { 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 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 payload?: any\n ): Promise<Record<string, any>> {\n this.sessionId = sessionId || this.sessionId;\n const data = {\n event: \"init\",\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead: -1,\n duration: -1,\n payload,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Init session:\", data);\n return {\n sessionId: this.sessionId,\n heartbeatInterval: this.heartbeatInterval,\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 },\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 if (!this.sessionId && !initResponseJson.sessionId) {\n throw new Error(`[AnalyticsReporter] init failed: no sessionId`);\n }\n if (!this.heartbeatInterval && !initResponseJson.heartbeatInterval) {\n throw new Error(\n `[AnalyticsReporter] init failed: heartbeatInterval not found in response`\n );\n }\n if (initResponseJson.heartbeatInterval) {\n this.heartbeatInterval = initResponseJson.heartbeatInterval;\n }\n if (initResponseJson.sessionId) {\n this.sessionId = initResponseJson.sessionId;\n }\n return {\n heartbeatInterval: this.heartbeatInterval,\n sessionId: this.sessionId,\n };\n }\n }\n\n public send(data: TPlayerAnalyticsEvent): void {\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 },\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 UUID,\n} from \"@eyevinn/player-analytics-specification\";\n\nexport interface IPlayerAnalyticsConnectorInitOptions {\n sessionId?: string;\n live: boolean;\n contentId: string;\n contentUrl: string;\n drmType?: string;\n userId?: string;\n deviceId?: string;\n deviceModel?: string;\n deviceType?: string;\n\n heartbeatInterval?: number;\n}\n\nexport interface IBitrateChangedPayload {\n bitrate: \"\"; // bitrate in Kbps\n width?: \"\"; // video width in pixels\n height?: \"\"; // video height in pixels\n videoBitrate?: \"\"; // if available provide the bitrate for the video track\n audioBitrate?: \"\"; // if available provide the bitrate for the audio track\n}\n\nexport interface IErrorPayload {\n category?: \"\"; // eg. NETWORK, DECODER, etc.\n code: \"\";\n message?: \"\";\n data?: {};\n}\n\nexport class PlayerAnalyticsConnector {\n private eventsinkUrl: string;\n private sessionId: UUID;\n private player: HTMLVideoElement;\n\n private playerAnalytics: PlayerAnalytics;\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\n this.playerAnalytics = new PlayerAnalytics(this.eventsinkUrl, debug);\n }\n\n public async init(options: IPlayerAnalyticsConnectorInitOptions) {\n this.sessionId = options.sessionId;\n const { heartbeatInterval } =\n await this.playerAnalytics.initiateAnalyticsReporter({\n sessionId: this.sessionId,\n ...options,\n });\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: \"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 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 this.stopInterval();\n this.heartbeatInterval = null;\n this.videoEventFilter.removeEventListener(\"*\", this.videoEventListener);\n this.videoEventFilter = null;\n }\n\n public destroy() {\n this.playerAnalytics.destroy();\n this.heartbeatInterval = null;\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;;AClBvC,yBAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAA6rB;;;wCDoBjtB,iCAAO;AACR,GAAA,CAAM,yCAAY;;;;;;;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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,CAAC,iBAAiB;gCACzC,SAAS,EAAE,IAAI,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,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,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AAA,MAAM,GAAb,QAAA,CAAc,IAAkB,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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","sources":["index.ts","src/PlayerAnalytics.ts","PlayerAnalytics.ts","src/utils/constants.ts","constants.ts","node_modules/@eyevinn/player-analytics-specification/package.json","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\nconst { version } = require(\"../../node_modules/@eyevinn/player-analytics-specification/package.json\");\nexport const EPAS_VERSION = version;",null,"{\n \"name\": \"@eyevinn/player-analytics-specification\",\n \"version\": \"0.3.1\",\n \"description\": \"Eyevinn Player Analytics Specification\",\n \"main\": \"index.js\",\n \"types\": \"./specification/typescript/index.ts\",\n \"repository\": \"git@github.com:Eyevinn/player-analytics-specification.git\",\n \"author\": \"Eyevinn Technology <work@eyevinn.se>\",\n \"contributors\": [\n \"Martin <901824+martinstark@users.noreply.github.com>\"\n ],\n \"license\": \"Apache License 2.0\",\n \"scripts\": {\n \"typedoc\": \"typedoc\",\n \"json\": \"typescript-json-schema specification/typescript/index.ts \\\"*\\\" --noExtraProps --required\"\n },\n \"dependencies\": {\n \"typedoc\": \"^0.22.8\",\n \"typescript\": \"^4.4.4\",\n \"typescript-json-schema\": \"^0.51.0\"\n }\n}\n","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"}
package/dist/module.js CHANGED
@@ -21,10 +21,17 @@ var $76abaee2435acae3$export$342d7dbd8323f55e;
21
21
  $76abaee2435acae3$export$342d7dbd8323f55e["error"] = "error";
22
22
  $76abaee2435acae3$export$342d7dbd8323f55e["warning"] = "warning";
23
23
  $76abaee2435acae3$export$342d7dbd8323f55e["bitratechanged"] = "bitrate_changed";
24
- $76abaee2435acae3$export$342d7dbd8323f55e["heartbeat"] = "hearbeat";
24
+ $76abaee2435acae3$export$342d7dbd8323f55e["heartbeat"] = "heartbeat";
25
+ $76abaee2435acae3$export$342d7dbd8323f55e["metadata"] = "metadata";
25
26
  })($76abaee2435acae3$export$342d7dbd8323f55e || ($76abaee2435acae3$export$342d7dbd8323f55e = {
26
27
  }));
27
28
  var $76abaee2435acae3$export$31c453b5fe09788d = 30000;
29
+ var $daea5b12267be516$exports = {};
30
+ $daea5b12267be516$exports = JSON.parse("{\"name\":\"@eyevinn/player-analytics-specification\",\"version\":\"0.3.1\",\"description\":\"Eyevinn Player Analytics Specification\",\"main\":\"index.js\",\"types\":\"./specification/typescript/index.ts\",\"repository\":\"git@github.com:Eyevinn/player-analytics-specification.git\",\"author\":\"Eyevinn Technology <work@eyevinn.se>\",\"contributors\":[\"Martin <901824+martinstark@users.noreply.github.com>\"],\"license\":\"Apache License 2.0\",\"scripts\":{\"typedoc\":\"typedoc\",\"json\":\"typescript-json-schema specification/typescript/index.ts \\\"*\\\" --noExtraProps --required\"},\"dependencies\":{\"typedoc\":\"^0.22.8\",\"typescript\":\"^4.4.4\",\"typescript-json-schema\":\"^0.51.0\"}}");
31
+
32
+
33
+ var $76abaee2435acae3$require$version = $daea5b12267be516$exports.version;
34
+ var $76abaee2435acae3$export$8a65ed80196068d4 = $76abaee2435acae3$require$version;
28
35
 
29
36
 
30
37
  var $1d47cc84225ea891$exports = {};
@@ -165,13 +172,14 @@ var $1d47cc84225ea891$var$__generator = undefined && undefined.__generator || fu
165
172
  };
166
173
  var $1d47cc84225ea891$export$957313a2f485e5ed = function() {
167
174
  function $1d47cc84225ea891$export$957313a2f485e5ed(options) {
175
+ this.isInitiated = false;
168
176
  this.debug = options.debug;
169
177
  this.eventsinkUrl = options.eventsinkUrl;
170
178
  this.sessionId = options.sessionId;
171
179
  this.heartbeatInterval = options.heartbeatInterval || $76abaee2435acae3$export$31c453b5fe09788d;
172
180
  if (this.debug) console.log("[AnalyticsReporter] Initiated AnalyticsReporter", options);
173
181
  }
174
- $1d47cc84225ea891$export$957313a2f485e5ed.prototype.init = function(sessionId, payload) {
182
+ $1d47cc84225ea891$export$957313a2f485e5ed.prototype.init = function(sessionId) {
175
183
  return $1d47cc84225ea891$var$__awaiter(this, void 0, Promise, function() {
176
184
  var data, initResponse, initResponseJson;
177
185
  return $1d47cc84225ea891$var$__generator(this, function(_a) {
@@ -183,19 +191,20 @@ var $1d47cc84225ea891$export$957313a2f485e5ed = function() {
183
191
  sessionId: this.sessionId,
184
192
  timestamp: Date.now(),
185
193
  playhead: -1,
186
- duration: -1,
187
- payload: payload
194
+ duration: -1
188
195
  };
189
196
  if (!this.debug) return [
190
197
  3 /*break*/ ,
191
198
  1
192
199
  ];
193
200
  console.log("[AnalyticsReporter] Init session:", data);
201
+ this.isInitiated = true;
194
202
  return [
195
203
  2 /*return*/ ,
196
204
  {
197
205
  sessionId: this.sessionId,
198
- heartbeatInterval: this.heartbeatInterval
206
+ heartbeatInterval: this.heartbeatInterval,
207
+ isInitiated: this.isInitiated
199
208
  }
200
209
  ];
201
210
  case 1:
@@ -206,7 +215,9 @@ var $1d47cc84225ea891$export$957313a2f485e5ed = function() {
206
215
  mode: "cors",
207
216
  cache: "no-cache",
208
217
  headers: {
209
- "Content-Type": "application/json; charset=utf-8"
218
+ "Content-Type": "application/json; charset=utf-8",
219
+ "X-EPAS-Event": data.event,
220
+ "X-EPAS-Version": $76abaee2435acae3$export$8a65ed80196068d4
210
221
  },
211
222
  body: JSON.stringify(data)
212
223
  })
@@ -221,14 +232,14 @@ var $1d47cc84225ea891$export$957313a2f485e5ed = function() {
221
232
  case 3:
222
233
  initResponseJson = _a.sent();
223
234
  if (!this.sessionId && !initResponseJson.sessionId) throw new Error("[AnalyticsReporter] init failed: no sessionId");
224
- if (!this.heartbeatInterval && !initResponseJson.heartbeatInterval) throw new Error("[AnalyticsReporter] init failed: heartbeatInterval not found in response");
225
- if (initResponseJson.heartbeatInterval) this.heartbeatInterval = initResponseJson.heartbeatInterval;
226
235
  if (initResponseJson.sessionId) this.sessionId = initResponseJson.sessionId;
236
+ this.isInitiated = true;
227
237
  return [
228
238
  2 /*return*/ ,
229
239
  {
230
240
  heartbeatInterval: this.heartbeatInterval,
231
- sessionId: this.sessionId
241
+ sessionId: this.sessionId,
242
+ isInitiated: this.isInitiated
232
243
  }
233
244
  ];
234
245
  }
@@ -236,6 +247,7 @@ var $1d47cc84225ea891$export$957313a2f485e5ed = function() {
236
247
  });
237
248
  };
238
249
  $1d47cc84225ea891$export$957313a2f485e5ed.prototype.send = function(data) {
250
+ if (!this.isInitiated) return console.warn("[AnalyticsReporter] Cannot report before initiation:", data);
239
251
  var payload = $1d47cc84225ea891$var$__assign({
240
252
  sessionId: this.sessionId
241
253
  }, data);
@@ -245,7 +257,9 @@ var $1d47cc84225ea891$export$957313a2f485e5ed = function() {
245
257
  mode: "cors",
246
258
  cache: "no-cache",
247
259
  headers: {
248
- "Content-Type": "application/json; charset=utf-8"
260
+ "Content-Type": "application/json; charset=utf-8",
261
+ "X-EPAS-Event": data.event,
262
+ "X-EPAS-Version": $76abaee2435acae3$export$8a65ed80196068d4
249
263
  },
250
264
  body: JSON.stringify(payload)
251
265
  });
@@ -376,15 +390,6 @@ var $03bb5e0d0325c534$var$__generator = undefined && undefined.__generator || fu
376
390
  return this;
377
391
  }), g;
378
392
  };
379
- var $03bb5e0d0325c534$var$__rest = undefined && undefined.__rest || function(s, e) {
380
- var t = {
381
- };
382
- for(var p in s)if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
383
- if (s != null && typeof Object.getOwnPropertySymbols === "function") {
384
- for(var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++)if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
385
- }
386
- return t;
387
- };
388
393
  var $03bb5e0d0325c534$export$f76c463fe9cb9f15 = function() {
389
394
  function $03bb5e0d0325c534$export$f76c463fe9cb9f15(eventsinkUrl, debug) {
390
395
  this.debug = false;
@@ -392,32 +397,30 @@ var $03bb5e0d0325c534$export$f76c463fe9cb9f15 = function() {
392
397
  this.eventsinkUrl = eventsinkUrl;
393
398
  }
394
399
  $03bb5e0d0325c534$export$f76c463fe9cb9f15.prototype.initiateAnalyticsReporter = function(_a) {
395
- var sessionId = _a.sessionId, options = $03bb5e0d0325c534$var$__rest(_a, [
396
- "sessionId"
397
- ]);
400
+ var sessionId = _a.sessionId, _b = _a.heartbeatInterval, heartbeatInterval = _b === void 0 ? $76abaee2435acae3$export$31c453b5fe09788d : _b;
398
401
  return $03bb5e0d0325c534$var$__awaiter(this, void 0, void 0, function() {
399
- var _b, generatedSessionId, heartbeatInterval;
400
- return $03bb5e0d0325c534$var$__generator(this, function(_c) {
401
- switch(_c.label){
402
+ var _c, generatedSessionId, isInitiated;
403
+ return $03bb5e0d0325c534$var$__generator(this, function(_d) {
404
+ switch(_d.label){
402
405
  case 0:
403
406
  this.analyticsReporter = new $1d47cc84225ea891$exports.Reporter({
404
407
  sessionId: sessionId,
405
408
  eventsinkUrl: this.eventsinkUrl,
406
409
  debug: this.debug,
407
- heartbeatInterval: options.heartbeatInterval || $76abaee2435acae3$export$31c453b5fe09788d
410
+ heartbeatInterval: heartbeatInterval
408
411
  });
409
- delete options.heartbeatInterval; // this should not be sent along as payload to the eventsink
410
412
  return [
411
413
  4 /*yield*/ ,
412
- this.analyticsReporter.init(sessionId, options)
414
+ this.analyticsReporter.init(sessionId)
413
415
  ];
414
416
  case 1:
415
- _b = _c.sent(), generatedSessionId = _b.sessionId, heartbeatInterval = _b.heartbeatInterval;
417
+ _c = _d.sent(), generatedSessionId = _c.sessionId, isInitiated = _c.isInitiated;
416
418
  return [
417
419
  2 /*return*/ ,
418
420
  {
419
421
  sessionId: generatedSessionId,
420
- heartbeatInterval: heartbeatInterval
422
+ heartbeatInterval: heartbeatInterval,
423
+ isInitiated: isInitiated
421
424
  }
422
425
  ];
423
426
  }
@@ -427,6 +430,9 @@ var $03bb5e0d0325c534$export$f76c463fe9cb9f15 = function() {
427
430
  $03bb5e0d0325c534$export$f76c463fe9cb9f15.prototype.init = function(data) {
428
431
  this.analyticsReporter.send(data);
429
432
  };
433
+ $03bb5e0d0325c534$export$f76c463fe9cb9f15.prototype.metadata = function(data) {
434
+ this.analyticsReporter.send(data);
435
+ };
430
436
  $03bb5e0d0325c534$export$f76c463fe9cb9f15.prototype.heartbeat = function(data) {
431
437
  this.analyticsReporter.send(data);
432
438
  };
@@ -616,14 +622,15 @@ var $85819f9bdebfd936$var$__generator = undefined && undefined.__generator || fu
616
622
  };
617
623
  var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
618
624
  function $85819f9bdebfd936$export$2daf9923c014a26e(eventsinkUrl, debug) {
625
+ this.analyticsInitiated = false;
619
626
  this.eventsinkUrl = eventsinkUrl;
620
627
  this.playerAnalytics = new $03bb5e0d0325c534$exports.PlayerAnalytics(this.eventsinkUrl, debug);
621
628
  }
622
629
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.init = function(options) {
623
630
  return $85819f9bdebfd936$var$__awaiter(this, void 0, void 0, function() {
624
- var heartbeatInterval;
625
- return $85819f9bdebfd936$var$__generator(this, function(_a) {
626
- switch(_a.label){
631
+ var _a, heartbeatInterval, isInitiated;
632
+ return $85819f9bdebfd936$var$__generator(this, function(_b) {
633
+ switch(_b.label){
627
634
  case 0:
628
635
  this.sessionId = options.sessionId;
629
636
  return [
@@ -633,7 +640,8 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
633
640
  }, options))
634
641
  ];
635
642
  case 1:
636
- heartbeatInterval = _a.sent().heartbeatInterval;
643
+ _a = _b.sent(), heartbeatInterval = _a.heartbeatInterval, isInitiated = _a.isInitiated;
644
+ this.analyticsInitiated = isInitiated;
637
645
  this.heartbeatInterval = heartbeatInterval;
638
646
  return [
639
647
  2 /*return*/
@@ -711,7 +719,7 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
711
719
  if (this.heartbeatIntervalTimer) return;
712
720
  this.heartbeatIntervalTimer = setInterval(function() {
713
721
  _this.playerAnalytics.heartbeat($85819f9bdebfd936$var$__assign({
714
- event: "heartbeat"
722
+ event: $76abaee2435acae3$export$342d7dbd8323f55e.heartbeat
715
723
  }, _this.playbackState()));
716
724
  }, this.heartbeatInterval);
717
725
  };
@@ -750,6 +758,13 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
750
758
  }));
751
759
  this.stopInterval();
752
760
  };
761
+ $85819f9bdebfd936$export$2daf9923c014a26e.prototype.reportMetadata = function(payload) {
762
+ this.playerAnalytics.metadata($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
763
+ event: $76abaee2435acae3$export$342d7dbd8323f55e.metadata
764
+ }, this.playbackState()), {
765
+ payload: payload
766
+ }));
767
+ };
753
768
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.reportWarning = function(payload) {
754
769
  this.playerAnalytics.warning($85819f9bdebfd936$var$__assign($85819f9bdebfd936$var$__assign({
755
770
  event: $76abaee2435acae3$export$342d7dbd8323f55e.warning
@@ -758,8 +773,9 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
758
773
  }));
759
774
  };
760
775
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.playbackState = function() {
761
- var playhead = !this.player.currentTime && this.player.currentTime !== 0 ? -1 : this.player.currentTime || 0;
762
- var duration = !this.player.duration && this.player.duration !== 0 ? -1 : this.player.duration || 0;
776
+ var _a, _b, _c, _d;
777
+ 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;
778
+ 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;
763
779
  return {
764
780
  sessionId: this.sessionId,
765
781
  timestamp: Date.now(),
@@ -768,15 +784,17 @@ var $85819f9bdebfd936$export$2daf9923c014a26e = function() {
768
784
  };
769
785
  };
770
786
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.deinit = function() {
787
+ if (!this.analyticsInitiated) return;
771
788
  this.stopInterval();
772
789
  this.heartbeatInterval = null;
773
- this.videoEventFilter.removeEventListener("*", this.videoEventListener);
790
+ this.videoEventFilter && this.videoEventFilter.removeEventListener("*", this.videoEventListener);
774
791
  this.videoEventFilter = null;
775
792
  };
776
793
  $85819f9bdebfd936$export$2daf9923c014a26e.prototype.destroy = function() {
794
+ if (!this.analyticsInitiated) return;
777
795
  this.playerAnalytics.destroy();
778
796
  this.heartbeatInterval = null;
779
- this.videoEventFilter.removeEventListener("*", this.videoEventListener);
797
+ this.videoEventFilter && this.videoEventFilter.removeEventListener("*", this.videoEventListener);
780
798
  this.stopInterval();
781
799
  };
782
800
  return $85819f9bdebfd936$export$2daf9923c014a26e;
@@ -1 +1 @@
1
- {"mappings":";;;;;;;;AIAA,GAAA,CAAY,yCAeX;CAfD,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,CAAsB;AACxB,CAAC,EAfW,yCAAU,KAAV,yCAAU,GAAA,CAAA;AAAA,CAAA;AAiBf,GAAA,CAAM,yCAAkB,GAAG,KAAK;;;;;;;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;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AA,CAAA,SAAA,CAAA,IAAI,GAAX,QAAA,CAAY,IAA2B,EAAhC,CAAA;QACL,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;YAClD,CAAA;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;QAC7B,CAAA;IAEL,CAAC;IACH,MAAA,CAAA,yCAAC;AAAD,CA3FA;;;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;A,G,C,4B,0B,M,I,Q,C,C,E,C,E,C;I,G,C,C,G,C;I,C;I,G,C,G,C,C,I,C,C,E,E,M,C,S,C,c,C,I,C,C,E,C,K,C,C,O,C,C,I,C,E,C,C,C,I,C,C,C;I,E,E,C,I,I,I,M,C,M,C,qB,K,C,W,C;Q,G,C,G,C,C,G,C,E,C,G,M,C,qB,C,C,G,C,G,C,C,M,E,C,G,E,E,C,C,O,C,C,C,C,K,C,I,M,C,S,C,oB,C,I,C,C,E,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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,CAzFA;;;;;;;;;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,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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 TInitEventPayload,\n TLoadedEvent,\n TLoadingEvent,\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 live: boolean;\n contentId: string;\n contentUrl: string;\n drmType?: string;\n userId?: string;\n deviceId?: string;\n deviceModel?: string;\n deviceType?: string;\n}\n\nexport class PlayerAnalytics implements PlayerAnalyticsClientModule {\n private debug: boolean = false;\n private eventsinkUrl: string;\n private analyticsReporter: Reporter;\n\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.debug = debug;\n this.eventsinkUrl = eventsinkUrl;\n }\n\n public async initiateAnalyticsReporter({\n sessionId,\n ...options\n }: TInitEventPayload) {\n this.analyticsReporter = new Reporter({\n sessionId,\n eventsinkUrl: this.eventsinkUrl,\n debug: this.debug,\n heartbeatInterval: options.heartbeatInterval || HEARTBEAT_INTERVAL\n });\n delete options.heartbeatInterval; // this should not be sent along as payload to the eventsink\n const { sessionId: generatedSessionId, heartbeatInterval } =\n await this.analyticsReporter.init(sessionId, options);\n return { sessionId: generatedSessionId, heartbeatInterval };\n }\n\n public init(data: TInitEvent): 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 = \"hearbeat\",\n}\n\nexport const HEARTBEAT_INTERVAL = 30000;\n",null,"import { TPlayerAnalyticsEvent } from \"@eyevinn/player-analytics-specification\";\nimport { 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 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 payload?: any\n ): Promise<Record<string, any>> {\n this.sessionId = sessionId || this.sessionId;\n const data = {\n event: \"init\",\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead: -1,\n duration: -1,\n payload,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Init session:\", data);\n return {\n sessionId: this.sessionId,\n heartbeatInterval: this.heartbeatInterval,\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 },\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 if (!this.sessionId && !initResponseJson.sessionId) {\n throw new Error(`[AnalyticsReporter] init failed: no sessionId`);\n }\n if (!this.heartbeatInterval && !initResponseJson.heartbeatInterval) {\n throw new Error(\n `[AnalyticsReporter] init failed: heartbeatInterval not found in response`\n );\n }\n if (initResponseJson.heartbeatInterval) {\n this.heartbeatInterval = initResponseJson.heartbeatInterval;\n }\n if (initResponseJson.sessionId) {\n this.sessionId = initResponseJson.sessionId;\n }\n return {\n heartbeatInterval: this.heartbeatInterval,\n sessionId: this.sessionId,\n };\n }\n }\n\n public send(data: TPlayerAnalyticsEvent): void {\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 },\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 UUID,\n} from \"@eyevinn/player-analytics-specification\";\n\nexport interface IPlayerAnalyticsConnectorInitOptions {\n sessionId?: string;\n live: boolean;\n contentId: string;\n contentUrl: string;\n drmType?: string;\n userId?: string;\n deviceId?: string;\n deviceModel?: string;\n deviceType?: string;\n\n heartbeatInterval?: number;\n}\n\nexport interface IBitrateChangedPayload {\n bitrate: \"\"; // bitrate in Kbps\n width?: \"\"; // video width in pixels\n height?: \"\"; // video height in pixels\n videoBitrate?: \"\"; // if available provide the bitrate for the video track\n audioBitrate?: \"\"; // if available provide the bitrate for the audio track\n}\n\nexport interface IErrorPayload {\n category?: \"\"; // eg. NETWORK, DECODER, etc.\n code: \"\";\n message?: \"\";\n data?: {};\n}\n\nexport class PlayerAnalyticsConnector {\n private eventsinkUrl: string;\n private sessionId: UUID;\n private player: HTMLVideoElement;\n\n private playerAnalytics: PlayerAnalytics;\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\n this.playerAnalytics = new PlayerAnalytics(this.eventsinkUrl, debug);\n }\n\n public async init(options: IPlayerAnalyticsConnectorInitOptions) {\n this.sessionId = options.sessionId;\n const { heartbeatInterval } =\n await this.playerAnalytics.initiateAnalyticsReporter({\n sessionId: this.sessionId,\n ...options,\n });\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: \"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 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 this.stopInterval();\n this.heartbeatInterval = null;\n this.videoEventFilter.removeEventListener(\"*\", this.videoEventListener);\n this.videoEventFilter = null;\n }\n\n public destroy() {\n this.playerAnalytics.destroy();\n this.heartbeatInterval = null;\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;;AClBvC,yBAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAA6rB;;;wCDoBjtB,iCAAO;AACR,GAAA,CAAM,yCAAY;;;;;;;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;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,iBAAiB;gCACzC,SAAS,EAAE,IAAI,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,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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AAM,GAAb,QAAA,CAAc,IAAkB,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;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","sources":["index.ts","src/PlayerAnalytics.ts","PlayerAnalytics.ts","src/utils/constants.ts","constants.ts","node_modules/@eyevinn/player-analytics-specification/package.json","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\nconst { version } = require(\"../../node_modules/@eyevinn/player-analytics-specification/package.json\");\nexport const EPAS_VERSION = version;",null,"{\n \"name\": \"@eyevinn/player-analytics-specification\",\n \"version\": \"0.3.1\",\n \"description\": \"Eyevinn Player Analytics Specification\",\n \"main\": \"index.js\",\n \"types\": \"./specification/typescript/index.ts\",\n \"repository\": \"git@github.com:Eyevinn/player-analytics-specification.git\",\n \"author\": \"Eyevinn Technology <work@eyevinn.se>\",\n \"contributors\": [\n \"Martin <901824+martinstark@users.noreply.github.com>\"\n ],\n \"license\": \"Apache License 2.0\",\n \"scripts\": {\n \"typedoc\": \"typedoc\",\n \"json\": \"typescript-json-schema specification/typescript/index.ts \\\"*\\\" --noExtraProps --required\"\n },\n \"dependencies\": {\n \"typedoc\": \"^0.22.8\",\n \"typescript\": \"^4.4.4\",\n \"typescript-json-schema\": \"^0.51.0\"\n }\n}\n","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,25 +1,20 @@
1
- import { PlayerAnalyticsClientModule, TBitrateChangedEvent, TBufferedEvent, TBufferingEvent, TErrorEvent, THeartbeatEvent, TInitEvent, TInitEventPayload, TLoadedEvent, TLoadingEvent, TPausedEvent, TPlayingEvent, TSeekedEvent, TSeekingEvent, TStoppedEvent, TWarningEvent } from "@eyevinn/player-analytics-specification";
1
+ import { PlayerAnalyticsClientModule, TBitrateChangedEvent, TBufferedEvent, TBufferingEvent, TErrorEvent, THeartbeatEvent, TInitEvent, TLoadedEvent, TLoadingEvent, TMetadataEvent, TPausedEvent, TPlayingEvent, TSeekedEvent, TSeekingEvent, TStoppedEvent, TWarningEvent } from "@eyevinn/player-analytics-specification";
2
2
  export interface IPlayerAnalyticsInitOptions {
3
3
  sessionId?: string;
4
- live: boolean;
5
- contentId: string;
6
- contentUrl: string;
7
- drmType?: string;
8
- userId?: string;
9
- deviceId?: string;
10
- deviceModel?: string;
11
- deviceType?: string;
4
+ heartbeatInterval?: number;
12
5
  }
13
6
  export declare class PlayerAnalytics implements PlayerAnalyticsClientModule {
14
7
  private debug;
15
8
  private eventsinkUrl;
16
9
  private analyticsReporter;
17
10
  constructor(eventsinkUrl: string, debug?: boolean);
18
- initiateAnalyticsReporter({ sessionId, ...options }: TInitEventPayload): Promise<{
11
+ initiateAnalyticsReporter({ sessionId, heartbeatInterval, }: IPlayerAnalyticsInitOptions): Promise<{
19
12
  sessionId: any;
20
- heartbeatInterval: any;
13
+ heartbeatInterval: number;
14
+ isInitiated: any;
21
15
  }>;
22
16
  init(data: TInitEvent): void;
17
+ metadata(data: TMetadataEvent): void;
23
18
  heartbeat(data: THeartbeatEvent): void;
24
19
  loading(data: TLoadingEvent): void;
25
20
  loaded(data: TLoadedEvent): void;
@@ -1,34 +1,14 @@
1
- import { TBitrateChangedEventPayload, TErrorEventPayload } from "@eyevinn/player-analytics-specification";
1
+ import { TBitrateChangedEventPayload, TErrorEventPayload, TMetadataEventPayload } from "@eyevinn/player-analytics-specification";
2
2
  export interface IPlayerAnalyticsConnectorInitOptions {
3
3
  sessionId?: string;
4
- live: boolean;
5
- contentId: string;
6
- contentUrl: string;
7
- drmType?: string;
8
- userId?: string;
9
- deviceId?: string;
10
- deviceModel?: string;
11
- deviceType?: string;
12
4
  heartbeatInterval?: number;
13
5
  }
14
- export interface IBitrateChangedPayload {
15
- bitrate: "";
16
- width?: "";
17
- height?: "";
18
- videoBitrate?: "";
19
- audioBitrate?: "";
20
- }
21
- export interface IErrorPayload {
22
- category?: "";
23
- code: "";
24
- message?: "";
25
- data?: {};
26
- }
27
6
  export declare class PlayerAnalyticsConnector {
28
7
  private eventsinkUrl;
29
8
  private sessionId;
30
9
  private player;
31
10
  private playerAnalytics;
11
+ private analyticsInitiated;
32
12
  private videoEventFilter;
33
13
  private videoEventListener;
34
14
  private heartbeatInterval;
@@ -42,6 +22,7 @@ export declare class PlayerAnalyticsConnector {
42
22
  reportBitrateChange(payload: TBitrateChangedEventPayload): void;
43
23
  reportStop(): void;
44
24
  reportError(error: TErrorEventPayload): void;
25
+ reportMetadata(payload: TMetadataEventPayload): void;
45
26
  reportWarning(payload: TErrorEventPayload): void;
46
27
  private playbackState;
47
28
  deinit(): void;
@@ -16,7 +16,8 @@ export declare class Reporter {
16
16
  private eventsinkUrl;
17
17
  private sessionId?;
18
18
  private heartbeatInterval?;
19
+ private isInitiated;
19
20
  constructor(options: IReporterOptions);
20
- init(sessionId?: string, payload?: any): Promise<Record<string, any>>;
21
+ init(sessionId?: string): Promise<Record<string, any>>;
21
22
  send(data: TPlayerAnalyticsEvent): void;
22
23
  }
@@ -12,6 +12,8 @@ export declare enum EPASEvents {
12
12
  error = "error",
13
13
  warning = "warning",
14
14
  bitratechanged = "bitrate_changed",
15
- heartbeat = "hearbeat"
15
+ heartbeat = "heartbeat",
16
+ metadata = "metadata"
16
17
  }
17
18
  export declare const HEARTBEAT_INTERVAL = 30000;
19
+ export declare const EPAS_VERSION: any;
package/dist/types.d.ts CHANGED
@@ -1,22 +1,17 @@
1
- import { PlayerAnalyticsClientModule, TBitrateChangedEvent, TBufferedEvent, TBufferingEvent, TErrorEvent, THeartbeatEvent, TInitEvent, TInitEventPayload, TLoadedEvent, TLoadingEvent, TPausedEvent, TPlayingEvent, TSeekedEvent, TSeekingEvent, TStoppedEvent, TWarningEvent, TBitrateChangedEventPayload, TErrorEventPayload } from "node_modules/@eyevinn/player-analytics-specification/specification/typescript/index";
1
+ import { PlayerAnalyticsClientModule, TBitrateChangedEvent, TBufferedEvent, TBufferingEvent, TErrorEvent, THeartbeatEvent, TInitEvent, TLoadedEvent, TLoadingEvent, TMetadataEvent, TPausedEvent, TPlayingEvent, TSeekedEvent, TSeekingEvent, TStoppedEvent, TWarningEvent, TBitrateChangedEventPayload, TErrorEventPayload, TMetadataEventPayload } from "node_modules/@eyevinn/player-analytics-specification/specification/typescript/index";
2
2
  export interface IPlayerAnalyticsInitOptions {
3
3
  sessionId?: string;
4
- live: boolean;
5
- contentId: string;
6
- contentUrl: string;
7
- drmType?: string;
8
- userId?: string;
9
- deviceId?: string;
10
- deviceModel?: string;
11
- deviceType?: string;
4
+ heartbeatInterval?: number;
12
5
  }
13
6
  export class PlayerAnalytics implements PlayerAnalyticsClientModule {
14
7
  constructor(eventsinkUrl: string, debug?: boolean);
15
- initiateAnalyticsReporter({ sessionId, ...options }: TInitEventPayload): Promise<{
8
+ initiateAnalyticsReporter({ sessionId, heartbeatInterval, }: IPlayerAnalyticsInitOptions): Promise<{
16
9
  sessionId: any;
17
- heartbeatInterval: any;
10
+ heartbeatInterval: number;
11
+ isInitiated: any;
18
12
  }>;
19
13
  init(data: TInitEvent): void;
14
+ metadata(data: TMetadataEvent): void;
20
15
  heartbeat(data: THeartbeatEvent): void;
21
16
  loading(data: TLoadingEvent): void;
22
17
  loaded(data: TLoadedEvent): void;
@@ -35,14 +30,6 @@ export class PlayerAnalytics implements PlayerAnalyticsClientModule {
35
30
  }
36
31
  export interface IPlayerAnalyticsConnectorInitOptions {
37
32
  sessionId?: string;
38
- live: boolean;
39
- contentId: string;
40
- contentUrl: string;
41
- drmType?: string;
42
- userId?: string;
43
- deviceId?: string;
44
- deviceModel?: string;
45
- deviceType?: string;
46
33
  heartbeatInterval?: number;
47
34
  }
48
35
  export class PlayerAnalyticsConnector {
@@ -52,6 +39,7 @@ export class PlayerAnalyticsConnector {
52
39
  reportBitrateChange(payload: TBitrateChangedEventPayload): void;
53
40
  reportStop(): void;
54
41
  reportError(error: TErrorEventPayload): void;
42
+ reportMetadata(payload: TMetadataEventPayload): void;
55
43
  reportWarning(payload: TErrorEventPayload): void;
56
44
  deinit(): void;
57
45
  destroy(): void;
@@ -1 +1 @@
1
- {"mappings":";AEqBA;IACE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,4BAA6B,YAAW,2BAA2B;gBAKrD,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAKpC,yBAAyB,CAAC,EACrC,SAAS,EACT,GAAG,OAAO,EACX,EAAE,iBAAiB;;;;IAab,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI5B,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;AChHD;IACE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAiBD;gBAac,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAMpC,IAAI,CAAC,OAAO,EAAE,oCAAoC;IAUxD,IAAI,CAAC,MAAM,EAAE,gBAAgB;IAkF7B,mBAAmB,CAAC,OAAO,EAAE,2BAA2B;IAQxD,UAAU;IASV,WAAW,CAAC,KAAK,EAAE,kBAAkB;IAcrC,aAAa,CAAC,OAAO,EAAE,kBAAkB;IAyBzC,MAAM;IAON,OAAO;CAMf","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 = \"hearbeat\",\n}\n\nexport const HEARTBEAT_INTERVAL = 30000;\n","import { TPlayerAnalyticsEvent } from \"@eyevinn/player-analytics-specification\";\nimport { 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 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 payload?: any\n ): Promise<Record<string, any>> {\n this.sessionId = sessionId || this.sessionId;\n const data = {\n event: \"init\",\n sessionId: this.sessionId,\n timestamp: Date.now(),\n playhead: -1,\n duration: -1,\n payload,\n };\n if (this.debug) {\n console.log(\"[AnalyticsReporter] Init session:\", data);\n return {\n sessionId: this.sessionId,\n heartbeatInterval: this.heartbeatInterval,\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 },\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 if (!this.sessionId && !initResponseJson.sessionId) {\n throw new Error(`[AnalyticsReporter] init failed: no sessionId`);\n }\n if (!this.heartbeatInterval && !initResponseJson.heartbeatInterval) {\n throw new Error(\n `[AnalyticsReporter] init failed: heartbeatInterval not found in response`\n );\n }\n if (initResponseJson.heartbeatInterval) {\n this.heartbeatInterval = initResponseJson.heartbeatInterval;\n }\n if (initResponseJson.sessionId) {\n this.sessionId = initResponseJson.sessionId;\n }\n return {\n heartbeatInterval: this.heartbeatInterval,\n sessionId: this.sessionId,\n };\n }\n }\n\n public send(data: TPlayerAnalyticsEvent): void {\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 },\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 TInitEventPayload,\n TLoadedEvent,\n TLoadingEvent,\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 live: boolean;\n contentId: string;\n contentUrl: string;\n drmType?: string;\n userId?: string;\n deviceId?: string;\n deviceModel?: string;\n deviceType?: string;\n}\n\nexport class PlayerAnalytics implements PlayerAnalyticsClientModule {\n private debug: boolean = false;\n private eventsinkUrl: string;\n private analyticsReporter: Reporter;\n\n constructor(eventsinkUrl: string, debug?: boolean) {\n this.debug = debug;\n this.eventsinkUrl = eventsinkUrl;\n }\n\n public async initiateAnalyticsReporter({\n sessionId,\n ...options\n }: TInitEventPayload) {\n this.analyticsReporter = new Reporter({\n sessionId,\n eventsinkUrl: this.eventsinkUrl,\n debug: this.debug,\n heartbeatInterval: options.heartbeatInterval || HEARTBEAT_INTERVAL\n });\n delete options.heartbeatInterval; // this should not be sent along as payload to the eventsink\n const { sessionId: generatedSessionId, heartbeatInterval } =\n await this.analyticsReporter.init(sessionId, options);\n return { sessionId: generatedSessionId, heartbeatInterval };\n }\n\n public init(data: TInitEvent): 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 UUID,\n} from \"@eyevinn/player-analytics-specification\";\n\nexport interface IPlayerAnalyticsConnectorInitOptions {\n sessionId?: string;\n live: boolean;\n contentId: string;\n contentUrl: string;\n drmType?: string;\n userId?: string;\n deviceId?: string;\n deviceModel?: string;\n deviceType?: string;\n\n heartbeatInterval?: number;\n}\n\nexport interface IBitrateChangedPayload {\n bitrate: \"\"; // bitrate in Kbps\n width?: \"\"; // video width in pixels\n height?: \"\"; // video height in pixels\n videoBitrate?: \"\"; // if available provide the bitrate for the video track\n audioBitrate?: \"\"; // if available provide the bitrate for the audio track\n}\n\nexport interface IErrorPayload {\n category?: \"\"; // eg. NETWORK, DECODER, etc.\n code: \"\";\n message?: \"\";\n data?: {};\n}\n\nexport class PlayerAnalyticsConnector {\n private eventsinkUrl: string;\n private sessionId: UUID;\n private player: HTMLVideoElement;\n\n private playerAnalytics: PlayerAnalytics;\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\n this.playerAnalytics = new PlayerAnalytics(this.eventsinkUrl, debug);\n }\n\n public async init(options: IPlayerAnalyticsConnectorInitOptions) {\n this.sessionId = options.sessionId;\n const { heartbeatInterval } =\n await this.playerAnalytics.initiateAnalyticsReporter({\n sessionId: this.sessionId,\n ...options,\n });\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: \"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 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 this.stopInterval();\n this.heartbeatInterval = null;\n this.videoEventFilter.removeEventListener(\"*\", this.videoEventListener);\n this.videoEventFilter = null;\n }\n\n public destroy() {\n this.playerAnalytics.destroy();\n this.heartbeatInterval = null;\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;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\nconst { version } = require(\"../../node_modules/@eyevinn/player-analytics-specification/package.json\");\nexport const EPAS_VERSION = 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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@eyevinn/player-analytics-client-sdk-web",
3
- "version": "0.0.14",
4
- "description": "",
3
+ "version": "0.0.17",
4
+ "description": "EPAS Client SDK for Web",
5
5
  "source": "index.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/module.js",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "keywords": [],
21
21
  "author": "erik.hoffman@eyevinn.se",
22
- "license": "ISC",
22
+ "license": "MIT",
23
23
  "bugs": {
24
24
  "url": "https://github.com/Eyevinn/player-analytics-client-sdk-web/issues"
25
25
  },
@@ -38,7 +38,7 @@
38
38
  "typescript": "^4.5.4"
39
39
  },
40
40
  "dependencies": {
41
- "@eyevinn/player-analytics-specification": "0.2.0",
41
+ "@eyevinn/player-analytics-specification": "0.3.1",
42
42
  "@eyevinn/video-event-filter": "^1.1.0"
43
43
  }
44
44
  }