@amplitude/analytics-core 2.44.2-SR-3115-rc2.0 → 2.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/lib/cjs/index.d.ts +4 -1
  2. package/lib/cjs/index.d.ts.map +1 -1
  3. package/lib/cjs/index.js +6 -2
  4. package/lib/cjs/index.js.map +1 -1
  5. package/lib/cjs/observers/video.d.ts +13 -7
  6. package/lib/cjs/observers/video.d.ts.map +1 -1
  7. package/lib/cjs/observers/video.js +50 -14
  8. package/lib/cjs/observers/video.js.map +1 -1
  9. package/lib/cjs/types/config/browser-config.d.ts +28 -1
  10. package/lib/cjs/types/config/browser-config.d.ts.map +1 -1
  11. package/lib/cjs/types/config/browser-config.js.map +1 -1
  12. package/lib/cjs/types/frustration-interactions.d.ts +0 -2
  13. package/lib/cjs/types/frustration-interactions.d.ts.map +1 -1
  14. package/lib/cjs/types/frustration-interactions.js.map +1 -1
  15. package/lib/cjs/utils/omit-undefined.d.ts +2 -0
  16. package/lib/cjs/utils/omit-undefined.d.ts.map +1 -0
  17. package/lib/cjs/utils/omit-undefined.js +15 -0
  18. package/lib/cjs/utils/omit-undefined.js.map +1 -0
  19. package/lib/cjs/video-analytics/track-video.d.ts +3 -13
  20. package/lib/cjs/video-analytics/track-video.d.ts.map +1 -1
  21. package/lib/cjs/video-analytics/track-video.js +108 -67
  22. package/lib/cjs/video-analytics/track-video.js.map +1 -1
  23. package/lib/cjs/video-analytics/types.d.ts +16 -4
  24. package/lib/cjs/video-analytics/types.d.ts.map +1 -1
  25. package/lib/cjs/video-analytics/types.js.map +1 -1
  26. package/lib/esm/index.d.ts +4 -1
  27. package/lib/esm/index.d.ts.map +1 -1
  28. package/lib/esm/index.js +2 -0
  29. package/lib/esm/index.js.map +1 -1
  30. package/lib/esm/observers/video.d.ts +13 -7
  31. package/lib/esm/observers/video.d.ts.map +1 -1
  32. package/lib/esm/observers/video.js +51 -15
  33. package/lib/esm/observers/video.js.map +1 -1
  34. package/lib/esm/types/config/browser-config.d.ts +28 -1
  35. package/lib/esm/types/config/browser-config.d.ts.map +1 -1
  36. package/lib/esm/types/config/browser-config.js.map +1 -1
  37. package/lib/esm/types/frustration-interactions.d.ts +0 -2
  38. package/lib/esm/types/frustration-interactions.d.ts.map +1 -1
  39. package/lib/esm/types/frustration-interactions.js.map +1 -1
  40. package/lib/esm/utils/omit-undefined.d.ts +2 -0
  41. package/lib/esm/utils/omit-undefined.d.ts.map +1 -0
  42. package/lib/esm/utils/omit-undefined.js +11 -0
  43. package/lib/esm/utils/omit-undefined.js.map +1 -0
  44. package/lib/esm/video-analytics/track-video.d.ts +3 -13
  45. package/lib/esm/video-analytics/track-video.d.ts.map +1 -1
  46. package/lib/esm/video-analytics/track-video.js +106 -62
  47. package/lib/esm/video-analytics/track-video.js.map +1 -1
  48. package/lib/esm/video-analytics/types.d.ts +16 -4
  49. package/lib/esm/video-analytics/types.d.ts.map +1 -1
  50. package/lib/esm/video-analytics/types.js.map +1 -1
  51. package/package.json +1 -1
@@ -1,32 +1,22 @@
1
1
  import { __assign, __awaiter, __generator, __read } from "tslib";
2
- function getPlayData(videoEl) {
3
- return {
4
- program_duration: videoEl.duration,
5
- };
6
- }
7
2
  function calculatePercentCompleted(currentTime, duration) {
8
3
  var percentCompleted = 0;
9
4
  if (Number.isFinite(currentTime) && Number.isFinite(duration) && duration > 0) {
10
5
  var rawPercent = (currentTime / duration) * 100;
11
- // Clamp to [0, 100] to avoid invalid analytics values.
12
6
  percentCompleted = Math.min(100, Math.max(0, rawPercent));
13
7
  }
14
8
  return percentCompleted;
15
9
  }
16
- function getPauseData(videoEl) {
10
+ function getVideoData(videoEl, stopReason) {
17
11
  var currentTime = videoEl.currentTime;
18
12
  var duration = videoEl.duration;
19
- return __assign(__assign({}, getPlayData(videoEl)), { last_position: currentTime, percent_completed: calculatePercentCompleted(currentTime, duration) });
20
- }
21
- function getEndData(videoEl) {
22
- return __assign({}, getPauseData(videoEl));
13
+ return __assign({ duration: duration, start_time: currentTime, last_position: currentTime, percent_completed: calculatePercentCompleted(currentTime, duration) }, (stopReason !== undefined ? { stop_reason: stopReason } : {}));
23
14
  }
24
15
  function getMuxMetadata(videoEl) {
25
16
  return {
26
17
  mux_playback_id: videoEl.getAttribute('playback-id'),
27
18
  mux_video_id: videoEl.getAttribute('metadata-video-id'),
28
19
  mux_video_title: videoEl.getAttribute('metadata-video-title'),
29
- mux_session_id: videoEl.getAttribute('session-id'),
30
20
  };
31
21
  }
32
22
  /**
@@ -38,39 +28,64 @@ function getMuxMetadata(videoEl) {
38
28
  */
39
29
  export function trackHtmlVideo(videoEl, handlers, vendor) {
40
30
  var playHandler = function () {
41
- var startEvent = __assign(__assign({}, getPlayData(videoEl)), (vendor === 'mux' ? getMuxMetadata(videoEl) : {}));
31
+ var startEvent = __assign(__assign({}, getVideoData(videoEl)), (vendor === 'mux' ? getMuxMetadata(videoEl) : {}));
42
32
  handlers.onPlay(startEvent);
43
33
  };
44
34
  videoEl.addEventListener('play', playHandler);
45
35
  var pauseHandler = function () {
46
- var pauseEvent = __assign(__assign({}, getPauseData(videoEl)), (vendor === 'mux' ? getMuxMetadata(videoEl) : {}));
36
+ var pauseEvent = __assign(__assign({}, getVideoData(videoEl, 'paused')), (vendor === 'mux' ? getMuxMetadata(videoEl) : {}));
47
37
  handlers.onPause(pauseEvent);
48
38
  };
49
39
  videoEl.addEventListener('pause', pauseHandler);
50
40
  var endedHandler = function () {
51
- var endedEvent = __assign(__assign({}, getEndData(videoEl)), (vendor === 'mux' ? getMuxMetadata(videoEl) : {}));
41
+ var endedEvent = __assign(__assign({}, getVideoData(videoEl, 'ended')), (vendor === 'mux' ? getMuxMetadata(videoEl) : {}));
52
42
  handlers.onEnded(endedEvent);
53
43
  };
54
44
  videoEl.addEventListener('ended', endedHandler);
45
+ var seekingHandler = function () {
46
+ var seekingEvent = __assign(__assign({}, getVideoData(videoEl, 'seeking')), (vendor === 'mux' ? getMuxMetadata(videoEl) : {}));
47
+ handlers.onSeeking(seekingEvent);
48
+ };
49
+ videoEl.addEventListener('seeking', seekingHandler);
50
+ var seekedHandler = function () {
51
+ var seekedEvent = __assign(__assign({}, getVideoData(videoEl)), (vendor === 'mux' ? getMuxMetadata(videoEl) : {}));
52
+ handlers.onSeeked(seekedEvent);
53
+ };
54
+ videoEl.addEventListener('seeked', seekedHandler);
55
+ var timeupdateHandler = function () {
56
+ var media = videoEl;
57
+ var timeupdateEvent = {
58
+ position: videoEl.currentTime,
59
+ isSeeking: !!media.seeking,
60
+ };
61
+ handlers.onTimeUpdate(timeupdateEvent);
62
+ };
63
+ videoEl.addEventListener('timeupdate', timeupdateHandler);
55
64
  return function () {
56
65
  videoEl.removeEventListener('play', playHandler);
57
66
  videoEl.removeEventListener('pause', pauseHandler);
58
67
  videoEl.removeEventListener('ended', endedHandler);
68
+ videoEl.removeEventListener('seeking', seekingHandler);
69
+ videoEl.removeEventListener('seeked', seekedHandler);
70
+ videoEl.removeEventListener('timeupdate', timeupdateHandler);
59
71
  };
60
72
  }
61
- /**
62
- * Track a Mux HTML video element.
63
- *
64
- * @param videoEl - The HTML Mux video element to track.
65
- * @param handlers - The video handlers to call when on video lifecycle events.
66
- * @returns A function to untrack the video.
67
- */
68
- export function trackMuxHtmlVideo(videoEl, handlers) {
69
- return trackHtmlVideo(videoEl, handlers, 'mux');
73
+ function getTimeUpdateInfo(player) {
74
+ return __awaiter(this, void 0, void 0, function () {
75
+ var currentTime;
76
+ return __generator(this, function (_a) {
77
+ switch (_a.label) {
78
+ case 0: return [4 /*yield*/, new Promise(function (resolve) { return player.getCurrentTime(resolve); })];
79
+ case 1:
80
+ currentTime = _a.sent();
81
+ return [2 /*return*/, { currentTime: currentTime }];
82
+ }
83
+ });
84
+ });
70
85
  }
71
- function getMuxIframeMetadata(player, elem) {
86
+ function getIframeMetadata(player, elem, vendor, stopReason) {
72
87
  return __awaiter(this, void 0, void 0, function () {
73
- var _a, duration, currentTime, url, metadataVideoTitle, metadataVideoId, playerId;
88
+ var _a, duration, currentTime, vendorMetadata, url;
74
89
  return __generator(this, function (_b) {
75
90
  switch (_b.label) {
76
91
  case 0: return [4 /*yield*/, Promise.all([
@@ -79,68 +94,103 @@ function getMuxIframeMetadata(player, elem) {
79
94
  ])];
80
95
  case 1:
81
96
  _a = __read.apply(void 0, [_b.sent(), 2]), duration = _a[0], currentTime = _a[1];
82
- metadataVideoTitle = null, metadataVideoId = null, playerId = null;
83
- try {
84
- url = new URL(elem.getAttribute('src'));
85
- metadataVideoTitle = url.searchParams.get('metadata-video-title');
86
- metadataVideoId = url.searchParams.get('metadata-video-id');
87
- playerId = url.pathname.split('/').pop();
97
+ vendorMetadata = {};
98
+ if (vendor === 'mux') {
99
+ url = void 0;
100
+ try {
101
+ url = new URL(elem.getAttribute('src'));
102
+ vendorMetadata.mux_video_title = url.searchParams.get('metadata-video-title');
103
+ vendorMetadata.mux_video_id = url.searchParams.get('metadata-video-id');
104
+ vendorMetadata.mux_playback_id = url.pathname.split('/').pop();
105
+ }
106
+ catch (error) {
107
+ // invalid or no src url, skip the header metadata
108
+ }
88
109
  }
89
- catch (error) {
90
- // invalid or no src url, skip the header metadata
91
- }
92
- return [2 /*return*/, {
93
- percent_completed: calculatePercentCompleted(currentTime, duration),
94
- program_duration: duration,
95
- last_position: currentTime,
96
- mux_video_title: metadataVideoTitle,
97
- mux_video_id: metadataVideoId,
98
- mux_playback_id: playerId,
99
- }];
110
+ return [2 /*return*/, __assign(__assign({ duration: duration, start_time: currentTime, last_position: currentTime, percent_completed: calculatePercentCompleted(currentTime, duration) }, (stopReason !== undefined ? { stop_reason: stopReason } : {})), vendorMetadata)];
100
111
  }
101
112
  });
102
113
  });
103
114
  }
104
- export function trackMuxEmbeddedVideo(player, handlers) {
115
+ export function trackEmbeddedVideo(player, handlers, vendor) {
116
+ if (vendor === void 0) { vendor = null; }
105
117
  var onUnsubscribe = [];
106
118
  var readyHandler = function () {
107
119
  var elem = player.elem;
120
+ var isSeeking = false;
108
121
  var playHandler = function () {
109
- getMuxIframeMetadata(player, elem)
122
+ getIframeMetadata(player, elem, vendor)
110
123
  .then(function (playerState) {
111
- var startEvent = __assign({}, playerState);
112
- handlers.onPlay(startEvent);
124
+ handlers.onPlay(playerState);
113
125
  })
114
126
  .catch(function (error) {
115
- handlers.onError("Error getting Mux iframe metadata from 'play' handler: ".concat(error));
127
+ handlers.onError("Error getting iframe metadata from 'play' handler: ".concat(error));
116
128
  });
117
129
  };
118
130
  player.on('play', playHandler);
119
131
  onUnsubscribe.push(function () { return player.off('play', playHandler); });
120
132
  var pauseHandler = function () {
121
- getMuxIframeMetadata(player, elem)
133
+ getIframeMetadata(player, elem, vendor, 'paused')
122
134
  .then(function (playerState) {
123
- var pauseEvent = __assign({}, playerState);
124
- handlers.onPause(pauseEvent);
135
+ handlers.onPause(playerState);
125
136
  })
126
137
  .catch(function (error) {
127
- handlers.onError("Error getting Mux iframe metadata from 'pause' handler: ".concat(error));
138
+ handlers.onError("Error getting iframe metadata from 'pause' handler: ".concat(error));
128
139
  });
129
140
  };
130
141
  player.on('pause', pauseHandler);
131
142
  onUnsubscribe.push(function () { return player.off('pause', pauseHandler); });
132
143
  var endedHandler = function () {
133
- getMuxIframeMetadata(player, elem)
144
+ getIframeMetadata(player, elem, vendor, 'ended')
134
145
  .then(function (playerState) {
135
- var endedEvent = __assign({}, playerState);
136
- handlers.onEnded(endedEvent);
146
+ handlers.onEnded(playerState);
137
147
  })
138
148
  .catch(function (error) {
139
- handlers.onError("Error getting Mux iframe metadata from 'ended' handler: ".concat(error));
149
+ handlers.onError("Error getting iframe metadata from 'ended' handler: ".concat(error));
140
150
  });
141
151
  };
142
152
  player.on('ended', endedHandler);
143
153
  onUnsubscribe.push(function () { return player.off('ended', endedHandler); });
154
+ var seekingHandler = function () {
155
+ isSeeking = true;
156
+ getIframeMetadata(player, elem, vendor, 'seeking')
157
+ .then(function (playerState) {
158
+ handlers.onSeeking(playerState);
159
+ })
160
+ .catch(function (error) {
161
+ handlers.onError("Error getting iframe metadata from 'seeking' handler: ".concat(error));
162
+ });
163
+ };
164
+ player.on('seeking', seekingHandler);
165
+ onUnsubscribe.push(function () { return player.off('seeking', seekingHandler); });
166
+ var seekedHandler = function () {
167
+ isSeeking = false;
168
+ getIframeMetadata(player, elem, vendor)
169
+ .then(function (playerState) {
170
+ handlers.onSeeked(playerState);
171
+ })
172
+ .catch(function (error) {
173
+ handlers.onError("Error getting iframe metadata from 'seeked' handler: ".concat(error));
174
+ });
175
+ };
176
+ player.on('seeked', seekedHandler);
177
+ onUnsubscribe.push(function () { return player.off('seeked', seekedHandler); });
178
+ var timeupdateHandler = function () {
179
+ getTimeUpdateInfo(player)
180
+ .then(function (_a) {
181
+ var currentTime = _a.currentTime;
182
+ var timeupdateEvent = {
183
+ position: currentTime,
184
+ isSeeking: isSeeking,
185
+ };
186
+ handlers.onTimeUpdate(timeupdateEvent);
187
+ })
188
+ .catch(function (error) {
189
+ handlers.onError("Error getting iframe metadata from 'timeupdate' handler: ".concat(error));
190
+ });
191
+ };
192
+ player.on('timeupdate', timeupdateHandler);
193
+ onUnsubscribe.push(function () { return player.off('timeupdate', timeupdateHandler); });
144
194
  };
145
195
  player.on('ready', readyHandler);
146
196
  return function () {
@@ -148,10 +198,4 @@ export function trackMuxEmbeddedVideo(player, handlers) {
148
198
  onUnsubscribe.forEach(function (unsubscribe) { return unsubscribe(); });
149
199
  };
150
200
  }
151
- export function trackYoutubeEmbeddedVideo() {
152
- throw new Error('Not implemented');
153
- }
154
- export function trackVimeoEmbeddedVideo() {
155
- throw new Error('Not implemented');
156
- }
157
201
  //# sourceMappingURL=track-video.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-video.js","sourceRoot":"","sources":["../../../src/video-analytics/track-video.ts"],"names":[],"mappings":"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","sourcesContent":["import { VideoHandler, VideoEvent, MuxEmbeddedPlayer, MuxElement } from './types';\n\nfunction getPlayData(videoEl: HTMLVideoElement | MuxElement) {\n return {\n program_duration: videoEl.duration,\n };\n}\n\nfunction calculatePercentCompleted(currentTime: number, duration: number) {\n let percentCompleted = 0;\n if (Number.isFinite(currentTime) && Number.isFinite(duration) && duration > 0) {\n const rawPercent = (currentTime / duration) * 100;\n // Clamp to [0, 100] to avoid invalid analytics values.\n percentCompleted = Math.min(100, Math.max(0, rawPercent));\n }\n return percentCompleted;\n}\n\nfunction getPauseData(videoEl: HTMLVideoElement | MuxElement) {\n const currentTime = videoEl.currentTime;\n const duration = videoEl.duration;\n\n return {\n ...getPlayData(videoEl),\n last_position: currentTime,\n percent_completed: calculatePercentCompleted(currentTime, duration),\n };\n}\n\nfunction getEndData(videoEl: HTMLVideoElement | MuxElement) {\n return {\n ...getPauseData(videoEl),\n };\n}\n\nfunction getMuxMetadata(videoEl: MuxElement) {\n return {\n mux_playback_id: videoEl.getAttribute('playback-id'),\n mux_video_id: videoEl.getAttribute('metadata-video-id'),\n mux_video_title: videoEl.getAttribute('metadata-video-title'),\n mux_session_id: videoEl.getAttribute('session-id'),\n };\n}\n\n/**\n * Track a standard HTML video element.\n *\n * @param videoEl - The HTML video element to track.\n * @param handlers - The video handlers to call when on video lifecycle events.\n * @returns A function to untrack the video.\n */\nexport function trackHtmlVideo(\n videoEl: HTMLVideoElement | MuxElement,\n handlers: VideoHandler,\n vendor?: 'mux', // if new vendors add them to this as enum\n) {\n const playHandler = () => {\n const startEvent: VideoEvent = {\n ...getPlayData(videoEl),\n ...(vendor === 'mux' ? getMuxMetadata(videoEl) : {}),\n };\n handlers.onPlay(startEvent);\n };\n videoEl.addEventListener('play', playHandler);\n\n const pauseHandler = () => {\n const pauseEvent: VideoEvent = {\n ...getPauseData(videoEl),\n ...(vendor === 'mux' ? getMuxMetadata(videoEl) : {}),\n };\n handlers.onPause(pauseEvent);\n };\n videoEl.addEventListener('pause', pauseHandler);\n\n const endedHandler = () => {\n const endedEvent: VideoEvent = {\n ...getEndData(videoEl),\n ...(vendor === 'mux' ? getMuxMetadata(videoEl) : {}),\n };\n handlers.onEnded(endedEvent);\n };\n videoEl.addEventListener('ended', endedHandler);\n\n return () => {\n videoEl.removeEventListener('play', playHandler);\n videoEl.removeEventListener('pause', pauseHandler);\n videoEl.removeEventListener('ended', endedHandler);\n };\n}\n\n/**\n * Track a Mux HTML video element.\n *\n * @param videoEl - The HTML Mux video element to track.\n * @param handlers - The video handlers to call when on video lifecycle events.\n * @returns A function to untrack the video.\n */\nexport function trackMuxHtmlVideo(videoEl: MuxElement, handlers: VideoHandler) {\n return trackHtmlVideo(videoEl, handlers, 'mux');\n}\n\nasync function getMuxIframeMetadata(player: MuxEmbeddedPlayer, elem: HTMLIFrameElement) {\n const [duration, currentTime] = await Promise.all([\n new Promise<number>((resolve) => player.getDuration(resolve)),\n new Promise<number>((resolve) => player.getCurrentTime(resolve)),\n ]);\n\n let url,\n metadataVideoTitle = null,\n metadataVideoId = null,\n playerId = null;\n try {\n url = new URL(elem.getAttribute('src') as string);\n metadataVideoTitle = url.searchParams.get('metadata-video-title');\n metadataVideoId = url.searchParams.get('metadata-video-id');\n playerId = url.pathname.split('/').pop();\n } catch (error) {\n // invalid or no src url, skip the header metadata\n }\n return {\n percent_completed: calculatePercentCompleted(currentTime, duration),\n program_duration: duration,\n last_position: currentTime,\n mux_video_title: metadataVideoTitle,\n mux_video_id: metadataVideoId,\n mux_playback_id: playerId,\n };\n}\n\nexport function trackMuxEmbeddedVideo(player: MuxEmbeddedPlayer, handlers: VideoHandler) {\n const onUnsubscribe: (() => void)[] = [];\n const readyHandler = () => {\n const { elem } = player;\n const playHandler = () => {\n getMuxIframeMetadata(player, elem)\n .then((playerState) => {\n const startEvent: VideoEvent = {\n ...playerState,\n };\n handlers.onPlay(startEvent);\n })\n .catch((error) => {\n handlers.onError(`Error getting Mux iframe metadata from 'play' handler: ${error as string}`);\n });\n };\n player.on('play', playHandler);\n onUnsubscribe.push(() => player.off('play', playHandler));\n\n const pauseHandler = () => {\n getMuxIframeMetadata(player, elem)\n .then((playerState) => {\n const pauseEvent: VideoEvent = {\n ...playerState,\n };\n handlers.onPause(pauseEvent);\n })\n .catch((error) => {\n handlers.onError(`Error getting Mux iframe metadata from 'pause' handler: ${error as string}`);\n });\n };\n player.on('pause', pauseHandler);\n onUnsubscribe.push(() => player.off('pause', pauseHandler));\n\n const endedHandler = () => {\n getMuxIframeMetadata(player, elem)\n .then((playerState) => {\n const endedEvent: VideoEvent = {\n ...playerState,\n };\n handlers.onEnded(endedEvent);\n })\n .catch((error) => {\n handlers.onError(`Error getting Mux iframe metadata from 'ended' handler: ${error as string}`);\n });\n };\n player.on('ended', endedHandler);\n onUnsubscribe.push(() => player.off('ended', endedHandler));\n };\n player.on('ready', readyHandler);\n\n return () => {\n player.off('ready', readyHandler);\n onUnsubscribe.forEach((unsubscribe) => unsubscribe());\n };\n}\n\nexport function trackYoutubeEmbeddedVideo() {\n throw new Error('Not implemented');\n}\n\nexport function trackVimeoEmbeddedVideo() {\n throw new Error('Not implemented');\n}\n"]}
1
+ {"version":3,"file":"track-video.js","sourceRoot":"","sources":["../../../src/video-analytics/track-video.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n VideoHandler,\n VideoEvent,\n EmbeddedVideoPlayer,\n MuxElement,\n Vendor,\n VideoStopReason,\n TimeUpdateEvent,\n} from './types';\n\nfunction calculatePercentCompleted(currentTime: number, duration: number) {\n let percentCompleted = 0;\n if (Number.isFinite(currentTime) && Number.isFinite(duration) && duration > 0) {\n const rawPercent = (currentTime / duration) * 100;\n percentCompleted = Math.min(100, Math.max(0, rawPercent));\n }\n return percentCompleted;\n}\n\nfunction getVideoData(videoEl: HTMLVideoElement | MuxElement, stopReason?: VideoStopReason) {\n const currentTime = videoEl.currentTime;\n const duration = videoEl.duration;\n return {\n duration,\n start_time: currentTime,\n last_position: currentTime,\n percent_completed: calculatePercentCompleted(currentTime, duration),\n ...(stopReason !== undefined ? { stop_reason: stopReason } : {}),\n };\n}\n\nfunction getMuxMetadata(videoEl: MuxElement) {\n return {\n mux_playback_id: videoEl.getAttribute('playback-id'),\n mux_video_id: videoEl.getAttribute('metadata-video-id'),\n mux_video_title: videoEl.getAttribute('metadata-video-title'),\n };\n}\n\n/**\n * Track a standard HTML video element.\n *\n * @param videoEl - The HTML video element to track.\n * @param handlers - The video handlers to call when on video lifecycle events.\n * @returns A function to untrack the video.\n */\nexport function trackHtmlVideo(videoEl: HTMLVideoElement | MuxElement, handlers: VideoHandler, vendor?: Vendor) {\n const playHandler = () => {\n const startEvent: VideoEvent = {\n ...getVideoData(videoEl),\n ...(vendor === 'mux' ? getMuxMetadata(videoEl) : {}),\n };\n handlers.onPlay(startEvent);\n };\n videoEl.addEventListener('play', playHandler);\n\n const pauseHandler = () => {\n const pauseEvent: VideoEvent = {\n ...getVideoData(videoEl, 'paused'),\n ...(vendor === 'mux' ? getMuxMetadata(videoEl) : {}),\n };\n handlers.onPause(pauseEvent);\n };\n videoEl.addEventListener('pause', pauseHandler);\n\n const endedHandler = () => {\n const endedEvent: VideoEvent = {\n ...getVideoData(videoEl, 'ended'),\n ...(vendor === 'mux' ? getMuxMetadata(videoEl) : {}),\n };\n handlers.onEnded(endedEvent);\n };\n videoEl.addEventListener('ended', endedHandler);\n\n const seekingHandler = () => {\n const seekingEvent: VideoEvent = {\n ...getVideoData(videoEl, 'seeking'),\n ...(vendor === 'mux' ? getMuxMetadata(videoEl) : {}),\n };\n handlers.onSeeking(seekingEvent);\n };\n videoEl.addEventListener('seeking', seekingHandler);\n\n const seekedHandler = () => {\n const seekedEvent: VideoEvent = {\n ...getVideoData(videoEl),\n ...(vendor === 'mux' ? getMuxMetadata(videoEl) : {}),\n };\n handlers.onSeeked(seekedEvent);\n };\n videoEl.addEventListener('seeked', seekedHandler);\n\n const timeupdateHandler = () => {\n const media = videoEl as HTMLVideoElement;\n const timeupdateEvent: TimeUpdateEvent = {\n position: videoEl.currentTime,\n isSeeking: !!media.seeking,\n };\n handlers.onTimeUpdate(timeupdateEvent);\n };\n videoEl.addEventListener('timeupdate', timeupdateHandler);\n\n return () => {\n videoEl.removeEventListener('play', playHandler);\n videoEl.removeEventListener('pause', pauseHandler);\n videoEl.removeEventListener('ended', endedHandler);\n videoEl.removeEventListener('seeking', seekingHandler);\n videoEl.removeEventListener('seeked', seekedHandler);\n videoEl.removeEventListener('timeupdate', timeupdateHandler);\n };\n}\n\nasync function getTimeUpdateInfo(player: EmbeddedVideoPlayer) {\n const currentTime = await new Promise<number>((resolve) => player.getCurrentTime(resolve));\n return { currentTime };\n}\n\nasync function getIframeMetadata(\n player: EmbeddedVideoPlayer,\n elem: HTMLIFrameElement,\n vendor: Vendor | null,\n stopReason?: VideoStopReason,\n) {\n const [duration, currentTime] = await Promise.all([\n new Promise<number>((resolve) => player.getDuration(resolve)),\n new Promise<number>((resolve) => player.getCurrentTime(resolve)),\n ]);\n\n const vendorMetadata: Record<string, string | null | undefined> = {};\n if (vendor === 'mux') {\n let url;\n try {\n url = new URL(elem.getAttribute('src') as string);\n vendorMetadata.mux_video_title = url.searchParams.get('metadata-video-title');\n vendorMetadata.mux_video_id = url.searchParams.get('metadata-video-id');\n vendorMetadata.mux_playback_id = url.pathname.split('/').pop();\n } catch (error) {\n // invalid or no src url, skip the header metadata\n }\n }\n return {\n duration,\n start_time: currentTime,\n last_position: currentTime,\n percent_completed: calculatePercentCompleted(currentTime, duration),\n ...(stopReason !== undefined ? { stop_reason: stopReason } : {}),\n ...vendorMetadata,\n };\n}\n\nexport function trackEmbeddedVideo(player: EmbeddedVideoPlayer, handlers: VideoHandler, vendor: Vendor | null = null) {\n const onUnsubscribe: (() => void)[] = [];\n const readyHandler = () => {\n const { elem } = player;\n let isSeeking = false;\n\n const playHandler = () => {\n getIframeMetadata(player, elem, vendor)\n .then((playerState) => {\n handlers.onPlay(playerState);\n })\n .catch((error) => {\n handlers.onError(`Error getting iframe metadata from 'play' handler: ${error as string}`);\n });\n };\n player.on('play', playHandler);\n onUnsubscribe.push(() => player.off('play', playHandler));\n\n const pauseHandler = () => {\n getIframeMetadata(player, elem, vendor, 'paused')\n .then((playerState) => {\n handlers.onPause(playerState);\n })\n .catch((error) => {\n handlers.onError(`Error getting iframe metadata from 'pause' handler: ${error as string}`);\n });\n };\n player.on('pause', pauseHandler);\n onUnsubscribe.push(() => player.off('pause', pauseHandler));\n\n const endedHandler = () => {\n getIframeMetadata(player, elem, vendor, 'ended')\n .then((playerState) => {\n handlers.onEnded(playerState);\n })\n .catch((error) => {\n handlers.onError(`Error getting iframe metadata from 'ended' handler: ${error as string}`);\n });\n };\n player.on('ended', endedHandler);\n onUnsubscribe.push(() => player.off('ended', endedHandler));\n\n const seekingHandler = () => {\n isSeeking = true;\n getIframeMetadata(player, elem, vendor, 'seeking')\n .then((playerState) => {\n handlers.onSeeking(playerState);\n })\n .catch((error) => {\n handlers.onError(`Error getting iframe metadata from 'seeking' handler: ${error as string}`);\n });\n };\n player.on('seeking', seekingHandler);\n onUnsubscribe.push(() => player.off('seeking', seekingHandler));\n\n const seekedHandler = () => {\n isSeeking = false;\n getIframeMetadata(player, elem, vendor)\n .then((playerState) => {\n handlers.onSeeked(playerState);\n })\n .catch((error) => {\n handlers.onError(`Error getting iframe metadata from 'seeked' handler: ${error as string}`);\n });\n };\n player.on('seeked', seekedHandler);\n onUnsubscribe.push(() => player.off('seeked', seekedHandler));\n\n const timeupdateHandler = () => {\n getTimeUpdateInfo(player)\n .then(({ currentTime }) => {\n const timeupdateEvent: TimeUpdateEvent = {\n position: currentTime,\n isSeeking: isSeeking,\n };\n handlers.onTimeUpdate(timeupdateEvent);\n })\n .catch((error) => {\n handlers.onError(`Error getting iframe metadata from 'timeupdate' handler: ${error as string}`);\n });\n };\n player.on('timeupdate', timeupdateHandler);\n onUnsubscribe.push(() => player.off('timeupdate', timeupdateHandler));\n };\n player.on('ready', readyHandler);\n\n return () => {\n player.off('ready', readyHandler);\n onUnsubscribe.forEach((unsubscribe) => unsubscribe());\n };\n}\n"]}
@@ -1,11 +1,17 @@
1
+ export type Vendor = 'mux';
2
+ export type VideoStopReason = 'paused' | 'ended' | 'seeking';
1
3
  export type VideoHandler = {
2
4
  onPlay: (startEvent: VideoEvent) => void;
3
5
  onPause: (pauseEvent: VideoEvent) => void;
4
6
  onEnded: (endedEvent: VideoEvent) => void;
7
+ onSeeking: (seekingEvent: VideoEvent) => void;
8
+ onSeeked: (seekedEvent: VideoEvent) => void;
5
9
  onError: (error: string) => void;
10
+ onTimeUpdate: (timeUpdateEvent: TimeUpdateEvent) => void;
6
11
  };
7
12
  export type VideoEvent = {
8
- program_duration: number;
13
+ duration: number;
14
+ start_time?: number;
9
15
  playback_id?: string | undefined;
10
16
  video_id?: string | undefined;
11
17
  video_title?: string | undefined;
@@ -16,10 +22,15 @@ export type VideoEvent = {
16
22
  mux_video_id?: string | undefined | null;
17
23
  mux_video_title?: string | undefined | null;
18
24
  mux_session_id?: string | undefined | null;
19
- last_position?: number | undefined | null;
25
+ last_position: number | undefined | null;
20
26
  percent_completed?: number;
27
+ stop_reason?: VideoStopReason;
28
+ };
29
+ export type TimeUpdateEvent = {
30
+ position: number;
31
+ isSeeking: boolean;
21
32
  };
22
- type MuxEmbeddedPlayer = {
33
+ type EmbeddedVideoPlayer = {
23
34
  getCurrentTime: (cb: (time: number) => void) => void;
24
35
  getDuration: (cb: (duration: number) => void) => void;
25
36
  on: (event: string, callback: () => void) => void;
@@ -27,10 +38,11 @@ type MuxEmbeddedPlayer = {
27
38
  elem: HTMLIFrameElement;
28
39
  };
29
40
  type MuxElement = EventTarget & Element & {
41
+ seeking: boolean;
30
42
  duration: number;
31
43
  currentTime: number;
32
44
  play?: () => Promise<unknown>;
33
45
  pause?: () => void;
34
46
  };
35
- export { MuxElement, MuxEmbeddedPlayer };
47
+ export { MuxElement, EmbeddedVideoPlayer };
36
48
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/video-analytics/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;IACrD,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;IACtD,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAClD,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACnD,IAAI,EAAE,iBAAiB,CAAC;CACzB,CAAC;AAEF,KAAK,UAAU,GAAG,WAAW,GAC3B,OAAO,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;AAEzG,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/video-analytics/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC;AAE3B,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7D,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,SAAS,EAAE,CAAC,YAAY,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,CAAC,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5C,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,YAAY,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,CAAC;CAC1D,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC3C,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;IACrD,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;IACtD,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAClD,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACnD,IAAI,EAAE,iBAAiB,CAAC;CACzB,CAAC;AAEF,KAAK,UAAU,GAAG,WAAW,GAC3B,OAAO,GAAG;IACR,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEJ,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/video-analytics/types.ts"],"names":[],"mappings":"","sourcesContent":["export type VideoHandler = {\n onPlay: (startEvent: VideoEvent) => void;\n onPause: (pauseEvent: VideoEvent) => void;\n onEnded: (endedEvent: VideoEvent) => void;\n onError: (error: string) => void;\n};\n\nexport type VideoEvent = {\n program_duration: number;\n playback_id?: string | undefined;\n video_id?: string | undefined;\n video_title?: string | undefined;\n content_id?: string | undefined;\n content_type?: string | undefined;\n session_id?: string | undefined;\n mux_playback_id?: string | undefined | null;\n mux_video_id?: string | undefined | null;\n mux_video_title?: string | undefined | null;\n mux_session_id?: string | undefined | null;\n last_position?: number | undefined | null;\n percent_completed?: number;\n};\n\ntype MuxEmbeddedPlayer = {\n getCurrentTime: (cb: (time: number) => void) => void;\n getDuration: (cb: (duration: number) => void) => void;\n on: (event: string, callback: () => void) => void;\n off: (event: string, callback: () => void) => void;\n elem: HTMLIFrameElement;\n};\n\ntype MuxElement = EventTarget &\n Element & { duration: number; currentTime: number; play?: () => Promise<unknown>; pause?: () => void };\n\nexport { MuxElement, MuxEmbeddedPlayer };\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/video-analytics/types.ts"],"names":[],"mappings":"","sourcesContent":["export type Vendor = 'mux'; // | 'vimeo' | 'youtube' | 'other'\n\nexport type VideoStopReason = 'paused' | 'ended' | 'seeking';\n\nexport type VideoHandler = {\n onPlay: (startEvent: VideoEvent) => void;\n onPause: (pauseEvent: VideoEvent) => void;\n onEnded: (endedEvent: VideoEvent) => void;\n onSeeking: (seekingEvent: VideoEvent) => void;\n onSeeked: (seekedEvent: VideoEvent) => void;\n onError: (error: string) => void;\n onTimeUpdate: (timeUpdateEvent: TimeUpdateEvent) => void;\n};\n\nexport type VideoEvent = {\n duration: number;\n start_time?: number;\n playback_id?: string | undefined;\n video_id?: string | undefined;\n video_title?: string | undefined;\n content_id?: string | undefined;\n content_type?: string | undefined;\n session_id?: string | undefined;\n mux_playback_id?: string | undefined | null;\n mux_video_id?: string | undefined | null;\n mux_video_title?: string | undefined | null;\n mux_session_id?: string | undefined | null;\n last_position: number | undefined | null;\n percent_completed?: number;\n stop_reason?: VideoStopReason;\n};\n\nexport type TimeUpdateEvent = {\n position: number;\n isSeeking: boolean;\n};\n\ntype EmbeddedVideoPlayer = {\n getCurrentTime: (cb: (time: number) => void) => void;\n getDuration: (cb: (duration: number) => void) => void;\n on: (event: string, callback: () => void) => void;\n off: (event: string, callback: () => void) => void;\n elem: HTMLIFrameElement;\n};\n\ntype MuxElement = EventTarget &\n Element & {\n seeking: boolean;\n duration: number;\n currentTime: number;\n play?: () => Promise<unknown>;\n pause?: () => void;\n };\n\nexport { MuxElement, EmbeddedVideoPlayer };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amplitude/analytics-core",
3
- "version": "2.44.2-SR-3115-rc2.0",
3
+ "version": "2.46.0",
4
4
  "description": "",
5
5
  "author": "Amplitude Inc",
6
6
  "homepage": "https://github.com/amplitude/Amplitude-TypeScript",