{"version":3,"file":"Omniture.js","sources":["../../../../src/Omniture.js","../../../../src/AmpMediaHeartbeatDelegate.js","../../../../src/Heartbeat.js","../../../../src/main.js"],"sourcesContent":["export default class Omniture extends akamai.amp.Plugin {\n /**\n * The Omniture class.\n */\n constructor(player, config) {\n super(player, config)\n this.adStarted = false\n }\n\n get mediaName() {\n return this.data.mediaName || this.player.media.title\n }\n\n get playerName() {\n return this.data.playerName || this.player.config.name || \"amp\"\n }\n\n /** */\n onready() {\n this.plugin = window[this.data.main]\n if (this.plugin == null) {\n return\n }\n\n try {\n if (this.plugin.Media == null) {\n this.plugin.loadModule(\"Media\")\n }\n else {\n if (this.plugin.Media.openAd != null && this.player.ads) {\n this.bindHandlers([\"onadloaded\", \"onadstarted\", \"onadplay\", \"onadpause\", \"onadtimeupdate\", \"onadended\"])\n this.player.ads.addEventListener(akamai.amp.AdEvents.LOADED, this.onadloaded)\n this.player.ads.addEventListener(akamai.amp.AdEvents.STARTED, this.onadstarted)\n this.player.ads.addEventListener(akamai.amp.AdEvents.PLAY, this.onadplay)\n this.player.ads.addEventListener(akamai.amp.AdEvents.PAUSE, this.onadpause)\n this.player.ads.addEventListener(akamai.amp.AdEvents.TIME_UPDATE, this.onadtimeupdate)\n this.player.ads.addEventListener(akamai.amp.AdEvents.ENDED, this.onadended)\n }\n }\n } catch (error) {\n this.error(\"initialize\", error)\n }\n }\n\n /** */\n onmediachange() {\n this.started = false\n }\n\n /** */\n onstarted() {\n if (this.started === true) {\n return\n }\n try {\n this.started = true\n this.plugin.Media.open(this.mediaName, this.player.media.duration, this.playerName)\n } catch (error) {\n this.error(error)\n }\n if (this.player.ads.enabled !== true) {\n this.onplay()\n }\n }\n\n /** */\n onplay() {\n if (this.started !== true) {\n this.onstarted()\n return\n }\n if (this.adStarted === true) {\n return\n }\n try {\n this.plugin.Media.play(this.mediaName, this.player.currentTime || 0)\n } catch (error) {\n this.error(error)\n }\n }\n\n /** */\n onpause() {\n if (this.adStarted === true) {\n return\n }\n try {\n this.plugin.Media.stop(this.mediaName, this.player.currentTime || 0)\n } catch (error) {\n this.error(error)\n }\n }\n\n /** */\n onseeking() {\n try {\n this.plugin.Media.stop(this.mediaName, this.player.currentTime || 0)\n } catch (error) {\n this.error(error)\n }\n }\n\n /** */\n onseeked() {\n try {\n this.plugin.Media.play(this.mediaName, this.player.currentTime || 0)\n } catch (error) {\n this.error(error)\n }\n }\n\n /** */\n onmediasequenceended() {\n try {\n this.plugin.Media.stop(this.mediaName, this.player.duration)\n this.plugin.Media.close(this.mediaName)\n this.started = false\n } catch (error) {\n this.error(error)\n }\n }\n\n /** Pluging. */\n getAd() {\n return this.ad\n }\n\n onadloaded(event) {\n this.adStarted = false\n this.adCurrentTime = 0\n this.ad = event.detail\n }\n\n /** */\n onadstarted() {\n try {\n this.adStarted = true\n this.plugin.Media.openAd(this.ad.title, this.ad.duration, this.playerName, this.mediaName, this.ad.type, this.ad.position, this.ad.cpm)\n this.onadplay()\n } catch (error) {\n this.error(\"ad start\", error)\n }\n }\n\n /** */\n onadplay() {\n if (this.adStarted !== true) {\n this.onadstarted()\n }\n try {\n this.plugin.Media.play(this.ad.title, this.adCurrentTime || 0)\n } catch (error) {\n this.error(\"ad play\", error)\n }\n }\n\n /** */\n onadpause() {\n try {\n this.plugin.Media.stop(this.ad.title, this.adCurrentTime || 0)\n } catch (error) {\n this.error(\"ad pause\", error)\n }\n }\n\n /** */\n onadtimeupdate(event) {\n this.adCurrentTime = event.detail\n }\n\n /** */\n onadended() {\n if (this.adStarted === false) {\n return\n }\n try {\n this.adStarted = false\n this.plugin.Media.stop(this.ad.title, this.ad.duration)\n this.plugin.Media.close(this.ad.title)\n } catch (error) {\n this.error(\"ad end\", error)\n }\n this.onplay()\n }\n\n /** */\n error(err) {\n this.logger.error(`[AMP Omniture Error]`, err)\n }\n\n}\n","export default class AmpMediaHeartbeatDelegate extends ADB.va.MediaHeartbeatDelegate {\n constructor(player, config, _this) {\n super(player, config)\n this.player = player;\n this.config = config\n this.heartbeat = _this\n\n if (config.liveLinear != null) {\n this.calculateLiveLinear()\n }\n }\n\n getCurrentPlaybackTime() {\n const config = this.heartbeat.data\n const media = this.player.media\n\n let currentTime;\n if (config.liveLinear && config.liveLinear.enabled === true) {\n const time = this.calculateLiveLinearTime()\n currentTime = (time == null) || isNaN(time) ? 0 : time\n } else if (media.temporalType === \"live\") {\n currentTime = 0\n } else {\n const time = this.player.currentTime\n currentTime = (time == null) || isNaN(time) ? 0 : time\n }\n\n return currentTime\n }\n\n getQoSObject() {\n return null\n }\n\n /** */\n calculateLiveLinear() {\n if (this.liveLinear == null) {\n this.liveLinear = {}\n }\n if (this.liveLinear.updating === true) {\n return\n }\n this.liveLinear.updating = true\n const liveLinear = {\n updating: false\n }\n const start = Date.now()\n akamai.amp.Utils.getUTC().then((utc) => {\n const end = Date.now()\n let date = new Date(utc)\n const day = date.toJSON().replace(/([^T]+T).+/, \"$1\")\n const timezone = this.config.liveLinear.timezone || \"Z\"\n liveLinear.utc = utc\n date = new Date(start + ((end - start) / 2))\n liveLinear.client = date.getTime()\n liveLinear.offset = liveLinear.client - utc\n date = new Date(day + \"00:00:00.000\" + timezone)\n liveLinear.start = date.getTime()\n date = new Date(day + \"23:59:59.999\" + timezone)\n liveLinear.end = date.getTime()\n liveLinear.duration = Math.round((liveLinear.end - liveLinear.start) / 1000)\n this.liveLinear = liveLinear\n })\n }\n\n /** */\n calculateLiveLinearTime() {\n const now = Date.now() - this.liveLinear.offset\n let time = Math.round((now - this.liveLinear.start) / 1000)\n // check for rollover\n if (time > this.liveLinear.duration) {\n time = time - this.liveLinear.duration\n this.calculateLiveLinear()\n }\n return time\n }\n}","import Omniture from \"./Omniture\"\nimport AmpMediaHeartbeatDelegate from './AmpMediaHeartbeatDelegate'\n\nconst MediaHeartbeat = ADB.va.MediaHeartbeat\nconst MediaHeartbeatConfig = ADB.va.MediaHeartbeatConfig\n\nexport default class Heartbeat extends Omniture {\n /**\n * The Heartbeat class.\n */\n constructor(player, config) {\n super(player, config)\n }\n\n /** */\n onready() {\n super.onready()\n\n try {\n if (this.player.ads) {\n this.bindHandlers([\"onadloaded\", \"onadstarted\", \"onadended\", \"onadbreakstart\", \"onadbreakend\", \"onadskipped\"])\n this.player.ads.addEventListener(akamai.amp.AdEvents.LOADED, this.onadloaded)\n this.player.ads.addEventListener(akamai.amp.AdEvents.STARTED, this.onadstarted)\n this.player.ads.addEventListener(akamai.amp.AdEvents.ENDED, this.onadended)\n this.player.ads.addEventListener(akamai.amp.AdEvents.BREAK_START, this.onadbreakstart)\n this.player.ads.addEventListener(akamai.amp.AdEvents.BREAK_END, this.onadbreakend)\n this.player.ads.addEventListener(akamai.amp.AdEvents.SKIPPED, this.onadskipped)\n }\n }\n catch (error) {\n this.error(\"initialize\", error)\n }\n\n // Set-up the AppMeasurement component.\n const config = this.data\n const appMeasurement = new AppMeasurement()\n\n if (config.appMeasurement == null)\n this.error(\"Cannot initialize plugin. Reason missing appMeasurement configuration object\")\n\n appMeasurement.account = config.appMeasurement.account\n appMeasurement.trackingServer = config.appMeasurement.trackingServer\n appMeasurement.trackingServerSecure = config.appMeasurement.trackingServerSecure\n appMeasurement.pageName = config.appMeasurement.pageName\n appMeasurement.charSet = \"UTF-8\"\n appMeasurement.ssl = config.ssl == true\n\n if (Visitor !== \"undefined\" && Visitor !== null) {\n const visitorConfig = {\n trackingServer: config.visitor.trackingServer,\n trackingServerSecure: config.visitor.trackingServerSecure\n }\n\n if (config.visitor.marketingCloudServer !== null)\n visitorConfig.marketingCloudServer = config.visitor.marketingCloudServer;\n\n if (config.visitor.marketingCloudServerSecure !== null)\n visitorConfig.marketingCloudServerSecure = config.visitor.marketingCloudServerSecure;\n\n const visitor = Visitor.getInstance(config.visitor.marketingCloudOrgId, visitorConfig)\n appMeasurement.visitor = visitor\n }\n\n let mediaConfig = new MediaHeartbeatConfig();\n\n mediaConfig.trackingServer = config.trackingServer;\n mediaConfig.playerName = config.playerName;\n mediaConfig.debugLogging = this.debug;\n mediaConfig.channel = config.channel;\n mediaConfig.ssl = config.ssl == true;\n mediaConfig.ovp = config.ovp;\n mediaConfig.appVersion = akamai.amp.AMP.VERSION;\n\n const delegate = new AmpMediaHeartbeatDelegate(this.player, this.config, this);\n this.mediaHeartbeat = new MediaHeartbeat(delegate, mediaConfig, appMeasurement);\n }\n\n /** \n * @name terminateSession \n * @description Method to track the end of a viewing session. This method must be called even if the user does not watch the media to completion.\n * @example this method can be called from page level actions such as user leaving the page for example.\n */\n terminateSession() {\n if (this.mediaHeartbeat == null)\n return;\n\n try {\n this.mediaHeartbeat.trackSessionEnd()\n this.started = false\n } catch (error) {\n this.error(error)\n }\n }\n\n /*Mandatory event tracking */\n\n onmediasequencestarted() {\n try {\n const mediaInfo = this.getMediaInfo();\n const contextData = this.data.contextData || {}\n\n this.mediaHeartbeat.trackSessionStart(mediaInfo, contextData)\n } catch (error) {\n this.error(error)\n }\n }\n\n onended() {\n try {\n this.mediaHeartbeat.trackComplete()\n } catch (error) {\n this.error(error)\n }\n }\n\n onmediasequenceended() {\n this.terminateSession()\n }\n\n onmediachange() {\n if (this.started === true)\n this.terminateSession()\n\n this.started = true\n }\n onplay() {\n if (this.started !== true)\n return;\n\n try {\n this.mediaHeartbeat.trackPlay()\n } catch (error) {\n this.error(error)\n }\n }\n\n onpause() {\n try {\n this.mediaHeartbeat.trackPause()\n } catch (error) {\n this.error(error)\n }\n }\n\n /* Optional event tracking */\n\n onseeking() {\n this.trackEvent(MediaHeartbeat.Event.SeekStart);\n }\n\n onseeked() {\n this.trackEvent(MediaHeartbeat.Event.SeekComplete);\n }\n\n onbufferingchange(event) {\n try {\n const bufferState = event.data ? MediaHeartbeat.Event.BufferStart : MediaHeartbeat.Event.BufferComplete\n\n this.trackEvent(bufferState);\n } catch (error) {\n this.error(error)\n }\n }\n\n onqualityswitched() {\n this.trackEvent(MediaHeartbeat.Event.BitrateChange)\n }\n\n onadbreakstart(event) {\n const data = event.data\n const overrides = this.data.info ? this.data.info.adBreak || {} : {}\n\n const defaults = {\n name: data.type,\n position: data.position,\n startTime: this.player.currentTime\n }\n\n const adBreakInfo = Object.assign({}, defaults, overrides)\n const adBreakObject = MediaHeartbeat.createAdBreakObject(adBreakInfo.name, adBreakInfo.position, adBreakInfo.startTime)\n\n if (data.type == null && data.partner === \"ima\") {\n this.player.ads.once(akamai.amp.AdEvents.LOADED, (event) => this.onadbreakstart(event))\n return;\n }\n\n this.trackEvent(MediaHeartbeat.Event.AdBreakStart, adBreakObject)\n }\n\n onadbreakend() {\n this.trackEvent(MediaHeartbeat.Event.AdBreakComplete)\n }\n\n onadstarted(event) {\n const data = event.data\n const overrides = this.data.info ? this.data.info.ad || {} : {}\n const defaults = {\n name: data.title,\n adId: data.id,\n position: data.position,\n length: data.duration\n }\n\n const adInfo = Object.assign({}, defaults, overrides)\n const adObject = MediaHeartbeat.createAdObject(adInfo.name, adInfo.adId, adInfo.position, adInfo.length);\n const metadata = this.data.metadata\n\n if (metadata != null && metadata.ad != null)\n adObject.setValue(MediaHeartbeat.MediaObjectKey.StandardAdMetadata, metadata.ad);\n\n this.trackEvent(MediaHeartbeat.Event.AdStart, adObject)\n }\n\n onadended() {\n this.trackEvent(MediaHeartbeat.Event.AdComplete)\n }\n\n onadskipped() {\n this.trackEvent(MediaHeartbeat.Event.AdSkip)\n }\n\n destroy() {\n this.terminateSession()\n super.destroy()\n }\n\n trackEvent(event, data = null, metadata = null) {\n try {\n this.mediaHeartbeat.trackEvent(event, data, metadata);\n } catch (error) {\n this.error(error)\n }\n }\n\n getMediaInfo() {\n const media = this.player.media\n const metadata = this.data.metadata\n const resumed = this.data.resumed\n const overrides = this.data.info ? this.data.info.media || {} : {}\n\n const mediaStreamType = media.temporalType !== \"vod\" || media.isLive === true ? MediaHeartbeat.StreamType.LIVE : MediaHeartbeat.StreamType.VOD\n const mediaType = media.medium === 'video' ? MediaHeartbeat.MediaType.Video : MediaHeartbeat.MediaType.Audio\n\n const defaults = {\n name: media.title,\n mediaId: media.guid,\n length: media.temporalType === \"live\" ? 86400 : media.duration,\n mediaStreamType: mediaStreamType,\n mediaType: mediaType\n }\n const mediaObject = Object.assign({}, defaults, overrides)\n\n const mediaInfo = MediaHeartbeat.createMediaObject(\n mediaObject.name,\n mediaObject.mediaId,\n mediaObject.length,\n mediaObject.mediaStreamType,\n mediaObject.mediaType\n )\n\n if (metadata != null && metadata.video != null)\n mediaInfo.setValue(MediaHeartbeat.MediaObjectKey.StandardVideoMetadata, metadata.video);\n\n if (resumed === true)\n mediaInfo.setValue(MediaHeartbeat.MediaObjectKey.MediaResumed, true);\n\n return mediaInfo\n }\n}\n","import Omniture from \"./Omniture\"\nimport Heartbeat from \"./Heartbeat\"\n\nakamai.amp.AMP.registerPlugin(\"omniture\", akamai.amp.Plugin.createFactory(Omniture))\nakamai.amp.AMP.registerPlugin(\"heartbeat\", akamai.amp.Plugin.createFactory(Heartbeat))\n\nexport {Omniture}\nexport {Heartbeat}\n"],"names":["Omniture","player","config","adStarted","plugin","window","data","main","Media","loadModule","openAd","ads","bindHandlers","addEventListener","akamai","amp","AdEvents","LOADED","onadloaded","STARTED","onadstarted","PLAY","onadplay","PAUSE","onadpause","TIME_UPDATE","onadtimeupdate","ENDED","onadended","error","started","open","mediaName","media","duration","playerName","enabled","onplay","onstarted","play","currentTime","stop","close","ad","event","adCurrentTime","detail","title","type","position","cpm","err","logger","name","Plugin","AmpMediaHeartbeatDelegate","_this","heartbeat","liveLinear","calculateLiveLinear","time","calculateLiveLinearTime","isNaN","temporalType","updating","start","Date","now","Utils","getUTC","then","utc","end","date","day","toJSON","replace","timezone","client","getTime","offset","Math","round","ADB","va","MediaHeartbeatDelegate","MediaHeartbeat","MediaHeartbeatConfig","Heartbeat","BREAK_START","onadbreakstart","BREAK_END","onadbreakend","SKIPPED","onadskipped","appMeasurement","AppMeasurement","account","trackingServer","trackingServerSecure","pageName","charSet","ssl","Visitor","visitorConfig","visitor","marketingCloudServer","marketingCloudServerSecure","getInstance","marketingCloudOrgId","mediaConfig","debugLogging","debug","channel","ovp","appVersion","AMP","VERSION","delegate","mediaHeartbeat","trackSessionEnd","mediaInfo","getMediaInfo","contextData","trackSessionStart","trackComplete","terminateSession","trackPlay","trackPause","trackEvent","Event","SeekStart","SeekComplete","bufferState","BufferStart","BufferComplete","BitrateChange","overrides","info","adBreak","defaults","adBreakInfo","Object","assign","adBreakObject","createAdBreakObject","startTime","partner","once","AdBreakStart","AdBreakComplete","id","adInfo","adObject","createAdObject","adId","length","metadata","setValue","MediaObjectKey","StandardAdMetadata","AdStart","AdComplete","AdSkip","resumed","mediaStreamType","isLive","StreamType","LIVE","VOD","mediaType","medium","MediaType","Video","Audio","guid","mediaObject","createMediaObject","mediaId","video","StandardVideoMetadata","MediaResumed","registerPlugin","createFactory"],"mappings":"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"}