@adobe/alloy 2.20.0-alpha.0 → 2.20.0-alpha.1

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 (27) hide show
  1. package/libEs5/components/LegacyMediaAnalytics/createMediaAnalyticsTracker.js +42 -42
  2. package/libEs5/components/LegacyMediaAnalytics/createMediaHelper.js +163 -157
  3. package/libEs5/components/LegacyMediaAnalytics/media/constants.js +20 -20
  4. package/libEs5/components/MediaCollection/{createMediaRequestPayload.js → constants/eventTypes.js} +9 -13
  5. package/libEs5/components/MediaCollection/createHeartbeatEngine.js +12 -4
  6. package/libEs5/components/MediaCollection/createMediaEventManager.js +21 -31
  7. package/libEs5/components/MediaCollection/createMediaSessionCacheManager.js +10 -10
  8. package/libEs5/components/MediaCollection/createUpdateMediaSessionState.js +3 -7
  9. package/libEs5/components/MediaCollection/index.js +12 -6
  10. package/libEs5/constants/libraryVersion.js +1 -1
  11. package/libEs5/utils/validation/index.js +6 -1
  12. package/{libEs6/components/MediaCollection/createMediaRequestPayload.js → libEs5/utils/validation/matchesRegexpValidator.js} +10 -14
  13. package/libEs6/components/LegacyMediaAnalytics/createMediaAnalyticsTracker.js +22 -22
  14. package/libEs6/components/LegacyMediaAnalytics/createMediaHelper.js +163 -150
  15. package/libEs6/components/LegacyMediaAnalytics/media/constants.js +10 -10
  16. package/libEs6/components/MediaCollection/constants/eventTypes.js +21 -0
  17. package/libEs6/components/MediaCollection/createHeartbeatEngine.js +11 -4
  18. package/libEs6/components/MediaCollection/createMediaEventManager.js +23 -30
  19. package/libEs6/components/MediaCollection/createMediaSessionCacheManager.js +10 -10
  20. package/libEs6/components/MediaCollection/createUpdateMediaSessionState.js +2 -8
  21. package/libEs6/components/MediaCollection/index.js +12 -6
  22. package/libEs6/constants/libraryVersion.js +1 -1
  23. package/libEs6/utils/validation/index.js +6 -1
  24. package/libEs6/utils/validation/matchesRegexpValidator.js +17 -0
  25. package/package.json +2 -2
  26. package/libEs5/components/MediaCollection/mediaConstants/mediaEvents.js +0 -13
  27. package/libEs6/components/MediaCollection/mediaConstants/mediaEvents.js +0 -9
@@ -2,6 +2,7 @@
2
2
 
3
3
  exports.default = void 0;
4
4
  var _toInteger = require("../../utils/toInteger");
5
+ var _eventTypes = require("./constants/eventTypes");
5
6
  /*
6
7
  Copyright 2023 Adobe. All rights reserved.
7
8
  This file is licensed to you under the Apache License, Version 2.0 (the "License");
@@ -13,6 +14,12 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTA
13
14
  OF ANY KIND, either express or implied. See the License for the specific language
14
15
  governing permissions and limitations under the License.
15
16
  */
17
+
18
+ var ACTION = "ping";
19
+ var getCurrentInterval = function getCurrentInterval(playerSession) {
20
+ var currentTime = Date.now();
21
+ return Math.abs(currentTime - playerSession.latestTriggeredEvent) / 1000;
22
+ };
16
23
  var _default = function _default(_ref) {
17
24
  var config = _ref.config,
18
25
  mediaEventManager = _ref.mediaEventManager,
@@ -21,15 +28,15 @@ var _default = function _default(_ref) {
21
28
  var playerId = _ref2.playerId,
22
29
  sessionId = _ref2.sessionId,
23
30
  onBeforeMediaEvent = _ref2.onBeforeMediaEvent;
24
- var currentTime = Date.now();
25
31
  var mainPingInterval = config.mediaCollection.mainPingInterval;
26
32
  var playerSession = mediaSessionCacheManager.getSession(playerId);
27
- if (Math.abs(currentTime - playerSession.latestTriggeredEvent) / 1000 > mainPingInterval) {
33
+ var currentInterval = getCurrentInterval(playerSession);
34
+ if (currentInterval > mainPingInterval) {
28
35
  var _onBeforeMediaEvent = onBeforeMediaEvent(playerId),
29
36
  playhead = _onBeforeMediaEvent.playhead,
30
37
  qoeDataDetails = _onBeforeMediaEvent.qoeDataDetails;
31
38
  var xdm = {
32
- eventType: "media.ping",
39
+ eventType: _eventTypes.default.PING,
33
40
  mediaCollection: {
34
41
  playhead: (0, _toInteger.default)(playhead),
35
42
  sessionID: sessionId,
@@ -42,7 +49,8 @@ var _default = function _default(_ref) {
42
49
  }
43
50
  });
44
51
  return mediaEventManager.trackMediaEvent({
45
- event: event
52
+ event: event,
53
+ action: ACTION
46
54
  }).then(function () {
47
55
  mediaSessionCacheManager.updateLastTriggeredEventTS({
48
56
  playerId: playerId
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  exports.default = void 0;
4
- var _mediaEvents = require("./mediaConstants/mediaEvents");
5
- var _createMediaRequestPayload = require("./createMediaRequestPayload");
4
+ var _eventTypes = require("./constants/eventTypes");
6
5
  var _createMediaRequest = require("./createMediaRequest");
7
6
  var _injectTimestamp = require("../Context/injectTimestamp");
8
7
  var _utils = require("../../utils");
8
+ var _request = require("../../utils/request");
9
9
  /*
10
10
  Copyright 2023 Adobe. All rights reserved.
11
11
  This file is licensed to you under the Apache License, Version 2.0 (the "License");
@@ -26,15 +26,13 @@ var _default = function _default(_ref) {
26
26
  return {
27
27
  createMediaEvent: function createMediaEvent(_ref2) {
28
28
  var options = _ref2.options;
29
- var _options$xdm = options.xdm,
30
- xdm = _options$xdm === void 0 ? {} : _options$xdm;
31
- var event = {
32
- xdm: xdm
33
- };
29
+ var event = eventManager.createEvent();
30
+ var xdm = options.xdm;
34
31
  var timestamp = (0, _injectTimestamp.default)(function () {
35
32
  return new Date();
36
33
  });
37
- timestamp(event.xdm);
34
+ timestamp(xdm);
35
+ event.setUserXdm(xdm);
38
36
  return event;
39
37
  },
40
38
  createMediaSession: function createMediaSession(options) {
@@ -43,14 +41,15 @@ var _default = function _default(_ref) {
43
41
  channel = _config$mediaCollecti.channel,
44
42
  version = _config$mediaCollecti.version;
45
43
  var event = eventManager.createEvent();
44
+ var sessionDetails = options.xdm.mediaCollection.sessionDetails;
46
45
  event.setUserXdm(options.xdm);
47
46
  event.mergeXdm({
48
- eventType: _mediaEvents.default.SESSION_START,
47
+ eventType: _eventTypes.default.SESSION_START,
49
48
  mediaCollection: {
50
49
  sessionDetails: {
51
- playerName: options.xdm.mediaCollection.sessionDetails.playerName || playerName,
52
- channel: options.xdm.mediaCollection.sessionDetails.channel || channel,
53
- appVersion: options.xdm.mediaCollection.sessionDetails.appVersion || version
50
+ playerName: sessionDetails.playerName || playerName,
51
+ channel: sessionDetails.channel || channel,
52
+ appVersion: sessionDetails.appVersion || version
54
53
  }
55
54
  }
56
55
  });
@@ -69,24 +68,14 @@ var _default = function _default(_ref) {
69
68
  }),
70
69
  playhead = _onBeforeMediaEvent.playhead,
71
70
  qoeDataDetails = _onBeforeMediaEvent.qoeDataDetails;
72
- if (event.mergeXdm) {
73
- event.mergeXdm({
74
- mediaCollection: {
75
- playhead: (0, _utils.toInteger)(playhead),
76
- qoeDataDetails: qoeDataDetails
77
- }
78
- });
79
- return event;
80
- }
81
- return (0, _utils.deepAssign)(event, {
82
- xdm: {
83
- mediaCollection: {
84
- playhead: (0, _utils.toInteger)(playhead),
85
- qoeDataDetails: qoeDataDetails,
86
- sessionID: sessionID
87
- }
71
+ event.mergeXdm({
72
+ mediaCollection: {
73
+ playhead: (0, _utils.toInteger)(playhead),
74
+ qoeDataDetails: qoeDataDetails,
75
+ sessionID: sessionID
88
76
  }
89
77
  });
78
+ return event;
90
79
  },
91
80
  trackMediaSession: function trackMediaSession(_ref4) {
92
81
  var event = _ref4.event,
@@ -98,14 +87,15 @@ var _default = function _default(_ref) {
98
87
  });
99
88
  },
100
89
  trackMediaEvent: function trackMediaEvent(_ref5) {
101
- var event = _ref5.event;
102
- var action = event.xdm.eventType.split(".")[1];
103
- var mediaRequestPayload = (0, _createMediaRequestPayload.default)();
90
+ var event = _ref5.event,
91
+ action = _ref5.action;
92
+ var mediaRequestPayload = (0, _request.createDataCollectionRequestPayload)();
104
93
  var request = (0, _createMediaRequest.default)({
105
94
  mediaRequestPayload: mediaRequestPayload,
106
95
  action: action
107
96
  });
108
97
  mediaRequestPayload.addEvent(event);
98
+ event.finalize();
109
99
  return consent.awaitConsent().then(function () {
110
100
  return sendEdgeNetworkRequest({
111
101
  request: request
@@ -20,28 +20,28 @@ var _default = function _default() {
20
20
  var saveHeartbeat = function saveHeartbeat(_ref) {
21
21
  var playerId = _ref.playerId,
22
22
  heartbeatId = _ref.heartbeatId;
23
- var mediaSession = mediaSessionCache[playerId];
24
- if (!mediaSession) {
23
+ var sessionDetails = mediaSessionCache[playerId];
24
+ if (!sessionDetails) {
25
25
  return;
26
26
  }
27
- mediaSession.heartbeatId = heartbeatId;
27
+ sessionDetails.heartbeatId = heartbeatId;
28
28
  };
29
29
  var stopHeartbeat = function stopHeartbeat(_ref2) {
30
30
  var playerId = _ref2.playerId;
31
- var mediaSession = mediaSessionCache[playerId];
32
- if (!mediaSession) {
31
+ var sessionDetails = mediaSessionCache[playerId];
32
+ if (!sessionDetails) {
33
33
  return;
34
34
  }
35
- clearInterval(mediaSession.heartbeatId);
36
- mediaSession.heartbeatId = null;
35
+ clearInterval(sessionDetails.heartbeatId);
36
+ sessionDetails.heartbeatId = null;
37
37
  };
38
38
  var updateLastTriggeredEventTS = function updateLastTriggeredEventTS(_ref3) {
39
39
  var playerId = _ref3.playerId;
40
- var player = mediaSessionCache[playerId];
41
- if (!player) {
40
+ var sessionDetails = mediaSessionCache[playerId];
41
+ if (!sessionDetails) {
42
42
  return;
43
43
  }
44
- player.latestTriggeredEvent = Date.now();
44
+ sessionDetails.latestTriggeredEvent = Date.now();
45
45
  };
46
46
  var storeSession = function storeSession(_ref4) {
47
47
  var playerId = _ref4.playerId,
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  exports.default = void 0;
4
- var _mediaEvents = require("./mediaConstants/mediaEvents");
4
+ var _eventTypes = require("./constants/eventTypes");
5
5
  /*
6
6
  Copyright 2023 Adobe. All rights reserved.
7
7
  This file is licensed to you under the Apache License, Version 2.0 (the "License");
@@ -17,12 +17,8 @@ var _default = function _default(_ref) {
17
17
  var mediaSessionCacheManager = _ref.mediaSessionCacheManager;
18
18
  return function (_ref2) {
19
19
  var playerId = _ref2.playerId,
20
- xdm = _ref2.xdm;
21
- if (!playerId) {
22
- return;
23
- }
24
- var eventType = xdm.eventType;
25
- if (eventType === _mediaEvents.default.SESSION_COMPLETE || eventType === _mediaEvents.default.SESSION_END) {
20
+ eventType = _ref2.eventType;
21
+ if (eventType === _eventTypes.default.SESSION_COMPLETE || eventType === _eventTypes.default.SESSION_END) {
26
22
  mediaSessionCacheManager.stopHeartbeat({
27
23
  playerId: playerId
28
24
  });
@@ -120,24 +120,30 @@ var createMediaCollection = function createMediaCollection(_ref) {
120
120
  var event = mediaEventManager.createMediaEvent({
121
121
  options: options
122
122
  });
123
- var playerId = options.playerId;
123
+ var playerId = options.playerId,
124
+ xdm = options.xdm;
125
+ var eventType = xdm.eventType;
126
+ var action = eventType.split(".")[1];
124
127
  var _mediaSessionCacheMan = mediaSessionCacheManager.getSession(playerId),
125
128
  onBeforeMediaEvent = _mediaSessionCacheMan.onBeforeMediaEvent,
126
129
  sessionPromise = _mediaSessionCacheMan.sessionPromise;
127
130
  sessionPromise.then(function (result) {
128
- var finalEvent = mediaEventManager.augmentMediaEvent({
131
+ mediaEventManager.augmentMediaEvent({
129
132
  event: event,
130
133
  playerId: playerId,
131
134
  onBeforeMediaEvent: onBeforeMediaEvent,
132
135
  sessionID: result.sessionId
133
136
  });
134
137
  return mediaEventManager.trackMediaEvent({
135
- event: finalEvent
138
+ event: event,
139
+ action: action
136
140
  }).then(function () {
137
141
  updateMediaSessionState({
138
142
  playerId: playerId,
139
- xdm: finalEvent.xdm
143
+ eventType: eventType
140
144
  });
145
+ }).catch(function (error) {
146
+ logger.warn("The Media Event of type " + action + " failed.", error);
141
147
  });
142
148
  });
143
149
  }
@@ -151,8 +157,8 @@ createMediaCollection.configValidators = (0, _validation.objectOf)({
151
157
  channel: (0, _validation.string)().nonEmpty().required(),
152
158
  playerName: (0, _validation.string)().nonEmpty().required(),
153
159
  version: (0, _validation.string)(),
154
- mainPingInterval: (0, _validation.number)().minimum(10).maximum(60).default(10),
155
- adPingInterval: (0, _validation.number)().minimum(10).maximum(60).default(10)
160
+ mainPingInterval: (0, _validation.number)().minimum(10).maximum(50).default(10),
161
+ adPingInterval: (0, _validation.number)().minimum(10).maximum(50).default(10)
156
162
  }).noUnknownFields()
157
163
  });
158
164
  var _default = createMediaCollection;
@@ -14,5 +14,5 @@ governing permissions and limitations under the License.
14
14
  */
15
15
  // The __VERSION__ keyword will be replace at alloy build time with the package.json version.
16
16
  // see babel-plugin-version
17
- var _default = "2.20.0-alpha.0";
17
+ var _default = "2.20.0-alpha.1";
18
18
  exports.default = _default;
@@ -23,6 +23,7 @@ var _numberValidator = require("./numberValidator");
23
23
  var _regexpValidator = require("./regexpValidator");
24
24
  var _requiredValidator = require("./requiredValidator");
25
25
  var _stringValidator = require("./stringValidator");
26
+ var _matchesRegexpValidator = require("./matchesRegexpValidator");
26
27
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
27
28
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
28
29
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /*
@@ -137,6 +138,9 @@ var nonEmptyObject = function nonEmptyObject() {
137
138
  var regexp = function regexp() {
138
139
  return (0, _utils.nullSafeChain)(this, _regexpValidator.default);
139
140
  };
141
+ var matches = function matches(regexpPattern) {
142
+ return (0, _utils.nullSafeChain)(this, (0, _matchesRegexpValidator.default)(regexpPattern));
143
+ };
140
144
  var unique = function createUnique() {
141
145
  return (0, _utils.nullSafeChain)(this, (0, _createUniqueValidator.default)());
142
146
  };
@@ -208,7 +212,8 @@ var string = function string() {
208
212
  regexp: regexp,
209
213
  domain: domain,
210
214
  nonEmpty: nonEmptyString,
211
- unique: unique
215
+ unique: unique,
216
+ matches: matches
212
217
  });
213
218
  };
214
219
  var boundAnyOf = anyOf.bind(base);
@@ -1,3 +1,7 @@
1
+ "use strict";
2
+
3
+ exports.default = void 0;
4
+ var _utils = require("./utils");
1
5
  /*
2
6
  Copyright 2023 Adobe. All rights reserved.
3
7
  This file is licensed to you under the Apache License, Version 2.0 (the "License");
@@ -9,18 +13,10 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTA
9
13
  OF ANY KIND, either express or implied. See the License for the specific language
10
14
  governing permissions and limitations under the License.
11
15
  */
12
-
13
- import { createAddIdentity, createHasIdentity, createRequestPayload } from "../../utils/request";
14
- export default (() => {
15
- const content = {};
16
- const payload = createRequestPayload({
17
- content,
18
- addIdentity: createAddIdentity(content),
19
- hasIdentity: createHasIdentity(content)
20
- });
21
- payload.addEvent = event => {
22
- content.events = content.events || [];
23
- content.events.push(event);
16
+ var _default = function _default(regexp) {
17
+ return function (value, path) {
18
+ (0, _utils.assertValid)(regexp.test(value), value, path, "does not match the " + regexp.toString());
19
+ return value;
24
20
  };
25
- return payload;
26
- });
21
+ };
22
+ exports.default = _default;
@@ -11,10 +11,10 @@ governing permissions and limitations under the License.
11
11
  */
12
12
 
13
13
  import defer from "../../utils/defer";
14
- import { AdMetadataKeys, AudioMetadataKeys, mediaEvent as Event, MediaObjectKey, MediaType, PlayerState, StreamType, VideoMetadataKeys } from "./media/constants";
14
+ import { AD_METADATA_KEYS as AdMetadataKeys, AUDIO_METADATA_KEYS as AudioMetadataKeys, EVENT as Event, PLAYER_STATE as PlayerState, STREAM_TYPE as StreamType, MEDIA_OBJECT_KEYS as MediaObjectKey, VIDEO_METADATA_KEYS as VideoMetadataKeys, MEDIA_TYPE as MediaType, MEDIA_EVENTS } from "./media/constants";
15
15
  import { deepAssign, isEmptyObject, isNumber } from "../../utils";
16
16
  import { adsToXdmKeys, mediaToXdmKeys } from "./media/mediaKeysToXdmConverter";
17
- import { createMediaObject, createAdBreakObject, createAdObject, createChapterObject, createStateObject, createQoEObject } from "./createMediaHelper";
17
+ import createMediaHelper from "./createMediaHelper";
18
18
  const convertSessionDetailsMetadataToXDM = contextData => {
19
19
  const customMetadata = [];
20
20
  const sessionDetails = {};
@@ -41,7 +41,7 @@ const createMediaDetailsObject = ({
41
41
  const mediaDetails = info;
42
42
  const customMetadata = [];
43
43
  if (context && !isEmptyObject(context)) {
44
- if (eventType === Event.AdStart) {
44
+ if (eventType === MEDIA_EVENTS.AdStart) {
45
45
  Object.keys(context).forEach(key => {
46
46
  if (adsToXdmKeys[key]) {
47
47
  mediaDetails.advertisingDetails[mediaToXdmKeys[key]] = context[key];
@@ -100,20 +100,21 @@ const createGetInstance = ({
100
100
  const getEventType = ({
101
101
  eventType
102
102
  }) => {
103
- if (eventType === Event.BufferComplete) {
104
- return `media.${Event.Play}`;
103
+ if (eventType === MEDIA_EVENTS.BufferComplete) {
104
+ return MEDIA_EVENTS.Play;
105
105
  }
106
- return `media.${eventType}`;
106
+ return eventType;
107
107
  };
108
108
  const trackEvent = ({
109
109
  eventType,
110
110
  mediaDetails
111
111
  }) => {
112
112
  return deferSession.promise.then(sessionID => {
113
+ const action = getEventType({
114
+ eventType
115
+ });
113
116
  const xdm = {
114
- eventType: getEventType({
115
- eventType
116
- }),
117
+ eventType: `media.${action}`,
117
118
  mediaCollection: {
118
119
  sessionID,
119
120
  playhead: trackerState.lastPlayhead
@@ -126,12 +127,13 @@ const createGetInstance = ({
126
127
  }
127
128
  });
128
129
  return mediaEventManager.trackMediaEvent({
129
- event
130
+ event,
131
+ action
130
132
  }).then(() => {
131
133
  updateLastTimeEventTriggered();
132
134
  });
133
135
  }).catch(error => {
134
- logger.info(error);
136
+ logger.warn(`An error occurred while sending ${eventType} Media Event.`, error);
135
137
  });
136
138
  };
137
139
  const heartbeatEngine = createHeartbeat({
@@ -175,18 +177,18 @@ const createGetInstance = ({
175
177
  },
176
178
  trackPlay: () => {
177
179
  return trackEvent({
178
- eventType: Event.Play
180
+ eventType: MEDIA_EVENTS.Play
179
181
  });
180
182
  },
181
183
  trackPause: () => {
182
184
  return trackEvent({
183
- eventType: Event.Pause
185
+ eventType: MEDIA_EVENTS.Pause
184
186
  });
185
187
  },
186
188
  trackSessionEnd: () => {
187
189
  clearInterval(ticker);
188
190
  return trackEvent({
189
- eventType: Event.SessionEnd
191
+ eventType: MEDIA_EVENTS.SessionEnd
190
192
  }).then(() => {
191
193
  deferSession = null;
192
194
  });
@@ -194,7 +196,7 @@ const createGetInstance = ({
194
196
  trackComplete: () => {
195
197
  clearInterval(ticker);
196
198
  return trackEvent({
197
- eventType: Event.SessionComplete
199
+ eventType: MEDIA_EVENTS.SessionComplete
198
200
  });
199
201
  },
200
202
  trackError: errorId => {
@@ -207,7 +209,7 @@ const createGetInstance = ({
207
209
  errorDetails
208
210
  };
209
211
  return trackEvent({
210
- eventType: Event.SessionEnd,
212
+ eventType: MEDIA_EVENTS.SessionEnd,
211
213
  mediaDetails
212
214
  });
213
215
  },
@@ -250,6 +252,9 @@ export const createMediaAnalyticsTracker = ({
250
252
  mediaEventManager
251
253
  }) => {
252
254
  logger.info("Media Analytics Component was configured");
255
+ const mediaAnalyticsHelper = createMediaHelper({
256
+ logger
257
+ });
253
258
  return {
254
259
  getInstance: () => {
255
260
  return createGetInstance({
@@ -266,11 +271,6 @@ export const createMediaAnalyticsTracker = ({
266
271
  VideoMetadataKeys,
267
272
  AudioMetadataKeys,
268
273
  AdMetadataKeys,
269
- createMediaObject,
270
- createAdBreakObject,
271
- createAdObject,
272
- createChapterObject,
273
- createStateObject,
274
- createQoEObject
274
+ ...mediaAnalyticsHelper
275
275
  };
276
276
  };